1import { Type, type Static } from "@sinclair/typebox";
2
3const CustomModelSchema = Type.Object({
4 provider: Type.String(),
5 api: Type.String(),
6 base_url: Type.String(),
7 id: Type.String(),
8 name: Type.String(),
9 reasoning: Type.Boolean(),
10 input: Type.Array(Type.Union([Type.Literal("text"), Type.Literal("image")])),
11 cost: Type.Object({
12 input: Type.Number(),
13 output: Type.Number(),
14 cache_read: Type.Optional(Type.Number()),
15 cache_write: Type.Optional(Type.Number()),
16 }),
17 context_window: Type.Number(),
18 max_tokens: Type.Number(),
19 headers: Type.Optional(Type.Record(Type.String(), Type.String())),
20 compat: Type.Optional(
21 Type.Object({
22 supports_store: Type.Optional(Type.Boolean()),
23 supports_developer_role: Type.Optional(Type.Boolean()),
24 supports_reasoning_effort: Type.Optional(Type.Boolean()),
25 supports_usage_in_streaming: Type.Optional(Type.Boolean()),
26 max_tokens_field: Type.Optional(Type.Union([Type.Literal("max_tokens"), Type.Literal("max_completion_tokens")])),
27 requires_tool_result_name: Type.Optional(Type.Boolean()),
28 requires_assistant_after_tool_result: Type.Optional(Type.Boolean()),
29 requires_thinking_as_text: Type.Optional(Type.Boolean()),
30 requires_mistral_tool_ids: Type.Optional(Type.Boolean()),
31 thinking_format: Type.Optional(Type.Union([Type.Literal("openai"), Type.Literal("zai")])),
32 })
33 ),
34});
35
36const ConfigSchema = Type.Object({
37 defaults: Type.Object({
38 model: Type.String(),
39 cleanup: Type.Boolean(),
40 kagi_session_token: Type.Optional(Type.String()),
41 tabstack_api_key: Type.Optional(Type.String()),
42 }),
43 web: Type.Object({
44 model: Type.Optional(Type.String()),
45 system_prompt_path: Type.Optional(Type.String()),
46 kagi_session_token: Type.Optional(Type.String()),
47 tabstack_api_key: Type.Optional(Type.String()),
48 }),
49 repo: Type.Object({
50 model: Type.Optional(Type.String()),
51 system_prompt_path: Type.Optional(Type.String()),
52 default_depth: Type.Optional(Type.Number({ minimum: 1 })),
53 blob_limit: Type.Optional(Type.String()),
54 }),
55 custom_models: Type.Optional(Type.Record(Type.String(), CustomModelSchema)),
56});
57
58export type RumiloConfig = Static<typeof ConfigSchema>;
59export type CustomModelConfig = Static<typeof CustomModelSchema>;