@bubblebrain-ai/bubble 0.0.46 → 0.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/agent/child-runner.js +11 -0
  2. package/dist/agent/internal-reminder-sanitizer.d.ts +7 -0
  3. package/dist/agent/internal-reminder-sanitizer.js +13 -0
  4. package/dist/agent/subagent/router.d.ts +65 -0
  5. package/dist/agent/subagent/router.js +198 -0
  6. package/dist/agent/subagent/runtime.d.ts +203 -0
  7. package/dist/agent/subagent/runtime.js +789 -0
  8. package/dist/agent/subagent-control.d.ts +5 -0
  9. package/dist/agent/subagent-store.d.ts +18 -2
  10. package/dist/agent/subagent-store.js +32 -1
  11. package/dist/agent/tool-intent.d.ts +10 -0
  12. package/dist/agent/tool-intent.js +18 -0
  13. package/dist/agent/tool-visibility.d.ts +10 -0
  14. package/dist/agent/tool-visibility.js +6 -0
  15. package/dist/agent/workflow/runs.d.ts +72 -0
  16. package/dist/agent/workflow/runs.js +157 -0
  17. package/dist/agent.d.ts +78 -96
  18. package/dist/agent.js +266 -1072
  19. package/dist/context/compact-llm.js +14 -5
  20. package/dist/context/compact.d.ts +9 -0
  21. package/dist/context/compact.js +36 -10
  22. package/dist/context/compaction-files.d.ts +44 -0
  23. package/dist/context/compaction-files.js +148 -0
  24. package/dist/context/llm-compactor.js +24 -5
  25. package/dist/feishu/agent-host/run-driver.js +3 -0
  26. package/dist/feishu/serve.js +13 -9
  27. package/dist/goal/tools.js +12 -3
  28. package/dist/main.js +24 -19
  29. package/dist/model-catalog.js +36 -2
  30. package/dist/model-config.d.ts +2 -0
  31. package/dist/model-data.generated.d.ts +16 -0
  32. package/dist/model-data.generated.js +275 -0
  33. package/dist/model-pricing.d.ts +11 -7
  34. package/dist/model-pricing.js +0 -0
  35. package/dist/oauth/grok.d.ts +1 -1
  36. package/dist/oauth/grok.js +5 -2
  37. package/dist/oauth/storage.d.ts +9 -2
  38. package/dist/oauth/storage.js +16 -9
  39. package/dist/orchestrator/default-hooks.d.ts +20 -0
  40. package/dist/orchestrator/default-hooks.js +47 -295
  41. package/dist/orchestrator/hooks.d.ts +6 -39
  42. package/dist/permission/mode.js +1 -1
  43. package/dist/prompt/reminders.d.ts +9 -35
  44. package/dist/prompt/reminders.js +30 -136
  45. package/dist/prompt/task-reminders.d.ts +0 -31
  46. package/dist/prompt/task-reminders.js +0 -87
  47. package/dist/provider-ai-sdk.d.ts +2 -0
  48. package/dist/provider-ai-sdk.js +1 -0
  49. package/dist/provider-anthropic.d.ts +2 -0
  50. package/dist/provider-anthropic.js +3 -1
  51. package/dist/provider-ark-responses.d.ts +2 -0
  52. package/dist/provider-ark-responses.js +1 -0
  53. package/dist/provider-registry.d.ts +13 -0
  54. package/dist/provider-registry.js +83 -0
  55. package/dist/provider-transform.js +37 -1
  56. package/dist/provider.d.ts +7 -0
  57. package/dist/provider.js +13 -1
  58. package/dist/sdk/index.d.ts +152 -0
  59. package/dist/sdk/index.js +400 -0
  60. package/dist/session.js +9 -1
  61. package/dist/slash-commands/commands.js +33 -19
  62. package/dist/tools/exit-plan-mode.js +8 -0
  63. package/dist/tui/detect-theme.d.ts +1 -0
  64. package/dist/tui/detect-theme.js +11 -5
  65. package/dist/tui-ink/app.d.ts +2 -6
  66. package/dist/tui-ink/app.js +11 -18
  67. package/dist/tui-ink/display-history.d.ts +0 -2
  68. package/dist/tui-ink/display-history.js +0 -52
  69. package/dist/tui-ink/footer.js +2 -2
  70. package/dist/tui-ink/message-list.js +62 -23
  71. package/dist/tui-ink/run.js +10 -5
  72. package/dist/tui-ink/sync-output.d.ts +17 -0
  73. package/dist/tui-ink/sync-output.js +35 -0
  74. package/dist/tui-ink/theme.d.ts +0 -1
  75. package/dist/tui-ink/theme.js +0 -2
  76. package/dist/tui-ink/trace-groups.js +1 -1
  77. package/dist/types.d.ts +21 -1
  78. package/package.json +16 -2
  79. package/dist/agent/discovery-barrier.d.ts +0 -21
  80. package/dist/agent/discovery-barrier.js +0 -173
  81. package/dist/agent/evidence-tracker.d.ts +0 -15
  82. package/dist/agent/evidence-tracker.js +0 -93
  83. package/dist/agent/execution-governor.d.ts +0 -36
  84. package/dist/agent/execution-governor.js +0 -218
  85. package/dist/agent/task-classifier.d.ts +0 -3
  86. package/dist/agent/task-classifier.js +0 -114
  87. package/dist/agent/task-size.d.ts +0 -9
  88. package/dist/agent/task-size.js +0 -33
  89. package/dist/agent/tool-arbiter.d.ts +0 -7
  90. package/dist/agent/tool-arbiter.js +0 -33
  91. package/dist/orchestrator/workflow.d.ts +0 -10
  92. package/dist/orchestrator/workflow.js +0 -22
@@ -16,6 +16,9 @@ export const BUILTIN_PROVIDERS = [
16
16
  { id: "zai", name: "Z.AI", baseURL: "https://api.z.ai/api/paas/v4" },
17
17
  { id: "zai-coding-plan", name: "Z.AI Coding Plan", baseURL: "https://api.z.ai/api/coding/paas/v4" },
18
18
  { id: "alibaba", name: "Alibaba DashScope", baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1" },
19
+ // Bailian token plan: its own endpoint and quota, separate from the
20
+ // pay-per-token DashScope provider above. Hosts several vendors' models.
21
+ { id: "bailian-token-plan", name: "阿里云百炼 Token Plan", baseURL: "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1" },
19
22
  { id: "doubao", name: "Doubao (Volcengine Ark)", baseURL: "https://ark.cn-beijing.volces.com/api/v3", protocol: "ark-responses" },
20
23
  { id: "minimax", name: "MiniMax Token Plan", baseURL: "https://api.minimaxi.com/anthropic", protocol: "anthropic-messages" },
21
24
  { id: "minimax-anthropic", name: "MiniMax API", baseURL: "https://api.minimaxi.com/anthropic", protocol: "anthropic-messages" },
@@ -48,7 +51,20 @@ const GLM_5_2_LEVELS = ["high", "max", "off"];
48
51
  // Kimi K2.7 Code variants only support thinking mode (disabling it errors), so
49
52
  // "off" is not offered — the model is always in its thinking variant.
50
53
  const KIMI_THINKING_ONLY_LEVELS = ["medium"];
54
+ // Kimi K3 takes OpenAI-style reasoning_effort (low/high/max — no "medium"),
55
+ // verified against the live endpoint: low spent 92 reasoning tokens on a task
56
+ // where high spent 1310. Thinking is disableable on k3 (thinking.type
57
+ // "disabled"); the 256k variant exposes effort only, so it has no "off".
58
+ const KIMI_K3_LEVELS = ["off", "low", "high", "max"];
59
+ const KIMI_K3_EFFORT_ONLY_LEVELS = ["low", "high", "max"];
51
60
  const DEEPSEEK_V4_LEVELS = ["high", "max"];
61
+ // Bailian token plan grades, read off the endpoint's own 400 responses
62
+ // ("'reasoning_effort' must be one of: ..."), which differ per model. "none"
63
+ // maps to our "off". qwen3.6-flash / qwen3.7-* stop at xhigh; deepseek-v4-pro
64
+ // there has no off switch.
65
+ const BAILIAN_FULL_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
66
+ const BAILIAN_NO_MAX_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
67
+ const BAILIAN_DEEPSEEK_LEVELS = ["low", "medium", "high", "xhigh", "max"];
52
68
  const STEPFUN_REASONING_LEVELS = ["off", "low", "medium", "high"];
53
69
  const DOUBAO_SEED_REASONING_LEVELS = ["minimal", "low", "medium", "high"];
54
70
  const MINIMAX_M3_REASONING_LEVELS = ["off", "medium"];
@@ -122,6 +138,16 @@ export const BUILTIN_MODELS = [
122
138
  { id: "glm-4.6", name: "GLM-4.6", providerId: "zai-coding-plan", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 200000 },
123
139
  { id: "qwen3.6-plus", name: "Qwen3.6 Plus", providerId: "alibaba", tier: "balanced", reasoningLevels: ["off"], contextWindow: 1048576 },
124
140
  { id: "qwen3.7-max", name: "Qwen3.7 Max", providerId: "alibaba", tier: "strong", reasoningLevels: ["off"], contextWindow: 1048576 },
141
+ // Bailian token plan (GET /models on the plan endpoint, probed 2026-08-04).
142
+ // Image/TTS entries from that list are omitted — this is a text agent.
143
+ { id: "qwen3.8-max", name: "Qwen3.8 Max", providerId: "bailian-token-plan", tier: "strong", reasoningLevels: BAILIAN_FULL_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
144
+ { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", providerId: "bailian-token-plan", tier: "strong", reasoningLevels: BAILIAN_FULL_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
145
+ { id: "qwen3.7-max", name: "Qwen3.7 Max", providerId: "bailian-token-plan", tier: "strong", reasoningLevels: BAILIAN_NO_MAX_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
146
+ { id: "qwen3.7-plus", name: "Qwen3.7 Plus", providerId: "bailian-token-plan", tier: "balanced", reasoningLevels: BAILIAN_NO_MAX_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
147
+ { id: "qwen3.6-flash", name: "Qwen3.6 Flash", providerId: "bailian-token-plan", tier: "fast", reasoningLevels: BAILIAN_NO_MAX_LEVELS, defaultReasoningLevel: "medium", contextWindow: 1048576 },
148
+ { id: "glm-5.2", name: "GLM-5.2", providerId: "bailian-token-plan", tier: "strong", reasoningLevels: BAILIAN_FULL_LEVELS, defaultReasoningLevel: "high", contextWindow: 1000000 },
149
+ { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", providerId: "bailian-token-plan", tier: "strong", reasoningLevels: BAILIAN_DEEPSEEK_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
150
+ { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", providerId: "bailian-token-plan", tier: "fast", reasoningLevels: BAILIAN_DEEPSEEK_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
125
151
  { id: "doubao-seed-2-1-pro-260628", name: "Doubao Seed 2.1 Pro", providerId: "doubao", reasoningLevels: DOUBAO_SEED_REASONING_LEVELS, defaultReasoningLevel: "high" },
126
152
  { id: "MiniMax-M3", name: "MiniMax M3", providerId: "minimax", tier: "strong", reasoningLevels: MINIMAX_M3_REASONING_LEVELS, contextWindow: 1000000 },
127
153
  { id: "MiniMax-M2.7", name: "MiniMax M2.7", providerId: "minimax", tier: "balanced", reasoningLevels: MINIMAX_REASONING_LEVELS, contextWindow: 204800 },
@@ -135,20 +161,28 @@ export const BUILTIN_MODELS = [
135
161
  { id: "step-router-v1", name: "Step Router V1", providerId: "stepfun", reasoningLevels: STEPFUN_REASONING_LEVELS },
136
162
  { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", providerId: "moonshot-cn", tier: "strong", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
137
163
  { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", providerId: "moonshot-cn", tier: "fast", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
164
+ { id: "kimi-k3", name: "Kimi K3", providerId: "moonshot-cn", tier: "strong", reasoningLevels: KIMI_K3_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
138
165
  { id: "kimi-k2.6", name: "Kimi K2.6", providerId: "moonshot-cn", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 256000 },
139
166
  { id: "kimi-k2.5", name: "Kimi K2.5", providerId: "moonshot-cn", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 256000 },
140
167
  { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", providerId: "moonshot-intl", tier: "strong", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
141
168
  { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", providerId: "moonshot-intl", tier: "fast", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
169
+ { id: "kimi-k3", name: "Kimi K3", providerId: "moonshot-intl", tier: "strong", reasoningLevels: KIMI_K3_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
142
170
  { id: "kimi-k2.6", name: "Kimi K2.6", providerId: "moonshot-intl", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 256000 },
143
171
  { id: "kimi-k2.5", name: "Kimi K2.5", providerId: "moonshot-intl", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 256000 },
172
+ // Kimi for Coding serves plan-slot ids (verified via GET /coding/v1/models):
173
+ // k3, k3-256k, kimi-for-coding, kimi-for-coding-highspeed.
174
+ { id: "k3", name: "Kimi K3", providerId: "kimi-for-coding", tier: "strong", reasoningLevels: KIMI_K3_LEVELS, defaultReasoningLevel: "high", contextWindow: 1048576 },
175
+ { id: "k3-256k", name: "Kimi K3 256K", providerId: "kimi-for-coding", tier: "strong", reasoningLevels: KIMI_K3_EFFORT_ONLY_LEVELS, defaultReasoningLevel: "high", contextWindow: 262144 },
176
+ { id: "kimi-for-coding", name: "Kimi for Coding", providerId: "kimi-for-coding", tier: "strong", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
177
+ { id: "kimi-for-coding-highspeed", name: "Kimi for Coding Highspeed", providerId: "kimi-for-coding", tier: "fast", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
144
178
  { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", providerId: "kimi-for-coding", tier: "strong", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
145
179
  { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", providerId: "kimi-for-coding", tier: "fast", reasoningLevels: KIMI_THINKING_ONLY_LEVELS, contextWindow: 262144 },
146
180
  { id: "kimi-k2.6", name: "Kimi K2.6", providerId: "kimi-for-coding", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 256000 },
147
181
  { id: "kimi-k2.5", name: "Kimi K2.5", providerId: "kimi-for-coding", reasoningLevels: TOGGLE_THINKING_LEVELS, contextWindow: 256000 },
148
- { id: "llama-3.3-70b-versatile", name: "llama-3.3-70b-versatile", providerId: "groq", reasoningLevels: ["off"], contextWindow: 32768 },
182
+ { id: "llama-3.3-70b-versatile", name: "llama-3.3-70b-versatile", providerId: "groq", reasoningLevels: ["off"], contextWindow: 131072 },
149
183
  { id: "mixtral-8x7b-32768", name: "mixtral-8x7b-32768", providerId: "groq", reasoningLevels: ["off"], contextWindow: 32768 },
150
184
  { id: "gemma-2-9b-it", name: "gemma-2-9b-it", providerId: "groq", reasoningLevels: ["off"], contextWindow: 32768 },
151
- { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "meta-llama/Llama-3.3-70B-Instruct-Turbo", providerId: "together", reasoningLevels: ["off"], contextWindow: 32768 },
185
+ { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "meta-llama/Llama-3.3-70B-Instruct-Turbo", providerId: "together", reasoningLevels: ["off"], contextWindow: 131072 },
152
186
  { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen/Qwen2.5-72B-Instruct", providerId: "together", reasoningLevels: ["off"], contextWindow: 32768 },
153
187
  { id: "accounts/fireworks/models/kimi-k2p6", name: "Kimi-K2.6", providerId: "fireworks", reasoningLevels: ["off"], contextWindow: 256000 },
154
188
  { id: "llama3.1", name: "llama3.1", providerId: "local", reasoningLevels: ["off"], contextWindow: 32768 },
@@ -10,6 +10,8 @@ export interface ProviderModelConfig {
10
10
  baseURL?: string;
11
11
  apiKey?: string;
12
12
  protocol?: ProviderProtocol;
13
+ /** Extra request headers (e.g. a User-Agent a coding-plan endpoint gates on). */
14
+ headers?: Record<string, string>;
13
15
  models?: Array<{
14
16
  id: string;
15
17
  name?: string;
@@ -0,0 +1,16 @@
1
+ export interface GeneratedModelData {
2
+ providerId: string;
3
+ modelId: string;
4
+ name: string;
5
+ /** USD per million tokens. */
6
+ inputPerMillion: number;
7
+ /** USD per million tokens. */
8
+ outputPerMillion: number;
9
+ /** USD per million tokens; absent when the provider has no cache discount. */
10
+ cacheReadPerMillion?: number;
11
+ /** USD per million tokens; absent when cache writes bill at the input rate. */
12
+ cacheWritePerMillion?: number;
13
+ contextWindow?: number;
14
+ maxOutputTokens?: number;
15
+ }
16
+ export declare const GENERATED_MODEL_DATA: GeneratedModelData[];
@@ -0,0 +1,275 @@
1
+ // AUTO-GENERATED by scripts/generate-model-data.mjs — DO NOT EDIT.
2
+ // Source: https://models.dev/api.json (community model/pricing catalog).
3
+ // Refresh with `npm run refresh-models` and review the diff before committing;
4
+ // hand corrections belong in MODEL_PRICING_OVERRIDES (src/model-pricing.ts).
5
+ export const GENERATED_MODEL_DATA = [
6
+ { "providerId": "alibaba", "modelId": "qvq-max", "name": "QVQ Max", "inputPerMillion": 1.2, "outputPerMillion": 4.8, "contextWindow": 131072, "maxOutputTokens": 8192 },
7
+ { "providerId": "alibaba", "modelId": "qwen-flash", "name": "Qwen Flash", "inputPerMillion": 0.05, "outputPerMillion": 0.4, "contextWindow": 1000000, "maxOutputTokens": 32768 },
8
+ { "providerId": "alibaba", "modelId": "qwen-max", "name": "Qwen Max", "inputPerMillion": 1.6, "outputPerMillion": 6.4, "contextWindow": 32768, "maxOutputTokens": 8192 },
9
+ { "providerId": "alibaba", "modelId": "qwen-mt-plus", "name": "Qwen-MT Plus", "inputPerMillion": 2.46, "outputPerMillion": 7.37, "contextWindow": 16384, "maxOutputTokens": 8192 },
10
+ { "providerId": "alibaba", "modelId": "qwen-mt-turbo", "name": "Qwen-MT Turbo", "inputPerMillion": 0.16, "outputPerMillion": 0.49, "contextWindow": 16384, "maxOutputTokens": 8192 },
11
+ { "providerId": "alibaba", "modelId": "qwen-omni-turbo", "name": "Qwen-Omni Turbo", "inputPerMillion": 0.07, "outputPerMillion": 0.27, "contextWindow": 32768, "maxOutputTokens": 2048 },
12
+ { "providerId": "alibaba", "modelId": "qwen-omni-turbo-realtime", "name": "Qwen-Omni Turbo Realtime", "inputPerMillion": 0.27, "outputPerMillion": 1.07, "contextWindow": 32768, "maxOutputTokens": 2048 },
13
+ { "providerId": "alibaba", "modelId": "qwen-plus", "name": "Qwen Plus", "inputPerMillion": 0.4, "outputPerMillion": 1.2, "contextWindow": 1000000, "maxOutputTokens": 32768 },
14
+ { "providerId": "alibaba", "modelId": "qwen-plus-character-ja", "name": "Qwen Plus Character (Japanese)", "inputPerMillion": 0.5, "outputPerMillion": 1.4, "contextWindow": 8192, "maxOutputTokens": 512 },
15
+ { "providerId": "alibaba", "modelId": "qwen-turbo", "name": "Qwen Turbo", "inputPerMillion": 0.05, "outputPerMillion": 0.2, "contextWindow": 1000000, "maxOutputTokens": 16384 },
16
+ { "providerId": "alibaba", "modelId": "qwen-vl-max", "name": "Qwen-VL Max", "inputPerMillion": 0.8, "outputPerMillion": 3.2, "contextWindow": 131072, "maxOutputTokens": 8192 },
17
+ { "providerId": "alibaba", "modelId": "qwen-vl-ocr", "name": "Qwen-VL OCR", "inputPerMillion": 0.72, "outputPerMillion": 0.72, "contextWindow": 34096, "maxOutputTokens": 4096 },
18
+ { "providerId": "alibaba", "modelId": "qwen-vl-plus", "name": "Qwen-VL Plus", "inputPerMillion": 0.21, "outputPerMillion": 0.63, "contextWindow": 131072, "maxOutputTokens": 8192 },
19
+ { "providerId": "alibaba", "modelId": "qwen2-5-14b-instruct", "name": "Qwen2.5 14B Instruct", "inputPerMillion": 0.35, "outputPerMillion": 1.4, "contextWindow": 131072, "maxOutputTokens": 8192 },
20
+ { "providerId": "alibaba", "modelId": "qwen2-5-32b-instruct", "name": "Qwen2.5 32B Instruct", "inputPerMillion": 0.7, "outputPerMillion": 2.8, "contextWindow": 131072, "maxOutputTokens": 8192 },
21
+ { "providerId": "alibaba", "modelId": "qwen2-5-72b-instruct", "name": "Qwen2.5 72B Instruct", "inputPerMillion": 1.4, "outputPerMillion": 5.6, "contextWindow": 131072, "maxOutputTokens": 8192 },
22
+ { "providerId": "alibaba", "modelId": "qwen2-5-7b-instruct", "name": "Qwen2.5 7B Instruct", "inputPerMillion": 0.175, "outputPerMillion": 0.7, "contextWindow": 131072, "maxOutputTokens": 8192 },
23
+ { "providerId": "alibaba", "modelId": "qwen2-5-omni-7b", "name": "Qwen2.5-Omni 7B", "inputPerMillion": 0.1, "outputPerMillion": 0.4, "contextWindow": 32768, "maxOutputTokens": 2048 },
24
+ { "providerId": "alibaba", "modelId": "qwen2-5-vl-72b-instruct", "name": "Qwen2.5-VL 72B Instruct", "inputPerMillion": 2.8, "outputPerMillion": 8.4, "contextWindow": 131072, "maxOutputTokens": 8192 },
25
+ { "providerId": "alibaba", "modelId": "qwen2-5-vl-7b-instruct", "name": "Qwen2.5-VL 7B Instruct", "inputPerMillion": 0.35, "outputPerMillion": 1.05, "contextWindow": 131072, "maxOutputTokens": 8192 },
26
+ { "providerId": "alibaba", "modelId": "qwen3-14b", "name": "Qwen3 14B", "inputPerMillion": 0.35, "outputPerMillion": 1.4, "contextWindow": 131072, "maxOutputTokens": 8192 },
27
+ { "providerId": "alibaba", "modelId": "qwen3-235b-a22b", "name": "Qwen3 235B-A22B", "inputPerMillion": 0.7, "outputPerMillion": 2.8, "contextWindow": 131072, "maxOutputTokens": 16384 },
28
+ { "providerId": "alibaba", "modelId": "qwen3-32b", "name": "Qwen3 32B", "inputPerMillion": 0.7, "outputPerMillion": 2.8, "contextWindow": 131072, "maxOutputTokens": 16384 },
29
+ { "providerId": "alibaba", "modelId": "qwen3-8b", "name": "Qwen3 8B", "inputPerMillion": 0.18, "outputPerMillion": 0.7, "contextWindow": 131072, "maxOutputTokens": 8192 },
30
+ { "providerId": "alibaba", "modelId": "qwen3-asr-flash", "name": "Qwen3-ASR Flash", "inputPerMillion": 0.035, "outputPerMillion": 0.035, "contextWindow": 53248, "maxOutputTokens": 4096 },
31
+ { "providerId": "alibaba", "modelId": "qwen3-coder-30b-a3b-instruct", "name": "Qwen3-Coder 30B-A3B Instruct", "inputPerMillion": 0.45, "outputPerMillion": 2.25, "contextWindow": 262144, "maxOutputTokens": 65536 },
32
+ { "providerId": "alibaba", "modelId": "qwen3-coder-480b-a35b-instruct", "name": "Qwen3-Coder 480B-A35B Instruct", "inputPerMillion": 1.5, "outputPerMillion": 7.5, "contextWindow": 262144, "maxOutputTokens": 65536 },
33
+ { "providerId": "alibaba", "modelId": "qwen3-coder-flash", "name": "Qwen3 Coder Flash", "inputPerMillion": 0.3, "outputPerMillion": 1.5, "contextWindow": 1000000, "maxOutputTokens": 65536 },
34
+ { "providerId": "alibaba", "modelId": "qwen3-coder-plus", "name": "Qwen3 Coder Plus", "inputPerMillion": 1, "outputPerMillion": 5, "contextWindow": 1048576, "maxOutputTokens": 65536 },
35
+ { "providerId": "alibaba", "modelId": "qwen3-livetranslate-flash-realtime", "name": "Qwen3-LiveTranslate Flash Realtime", "inputPerMillion": 10, "outputPerMillion": 10, "contextWindow": 53248, "maxOutputTokens": 4096 },
36
+ { "providerId": "alibaba", "modelId": "qwen3-max", "name": "Qwen3 Max", "inputPerMillion": 1.2, "outputPerMillion": 6, "contextWindow": 262144, "maxOutputTokens": 65536 },
37
+ { "providerId": "alibaba", "modelId": "qwen3-next-80b-a3b-instruct", "name": "Qwen3-Next 80B-A3B Instruct", "inputPerMillion": 0.5, "outputPerMillion": 2, "contextWindow": 131072, "maxOutputTokens": 32768 },
38
+ { "providerId": "alibaba", "modelId": "qwen3-next-80b-a3b-thinking", "name": "Qwen3-Next 80B-A3B (Thinking)", "inputPerMillion": 0.5, "outputPerMillion": 6, "contextWindow": 131072, "maxOutputTokens": 32768 },
39
+ { "providerId": "alibaba", "modelId": "qwen3-omni-flash", "name": "Qwen3-Omni Flash", "inputPerMillion": 0.43, "outputPerMillion": 1.66, "contextWindow": 65536, "maxOutputTokens": 16384 },
40
+ { "providerId": "alibaba", "modelId": "qwen3-omni-flash-realtime", "name": "Qwen3-Omni Flash Realtime", "inputPerMillion": 0.52, "outputPerMillion": 1.99, "contextWindow": 65536, "maxOutputTokens": 16384 },
41
+ { "providerId": "alibaba", "modelId": "qwen3-vl-235b-a22b", "name": "Qwen3-VL 235B-A22B", "inputPerMillion": 0.7, "outputPerMillion": 2.8, "contextWindow": 131072, "maxOutputTokens": 32768 },
42
+ { "providerId": "alibaba", "modelId": "qwen3-vl-30b-a3b", "name": "Qwen3-VL 30B-A3B", "inputPerMillion": 0.2, "outputPerMillion": 0.8, "contextWindow": 131072, "maxOutputTokens": 32768 },
43
+ { "providerId": "alibaba", "modelId": "qwen3-vl-plus", "name": "Qwen3-VL Plus", "inputPerMillion": 0.2, "outputPerMillion": 1.6, "contextWindow": 262144, "maxOutputTokens": 32768 },
44
+ { "providerId": "alibaba", "modelId": "qwen3.5-122b-a10b", "name": "Qwen3.5 122B-A10B", "inputPerMillion": 0.4, "outputPerMillion": 3.2, "contextWindow": 262144, "maxOutputTokens": 65536 },
45
+ { "providerId": "alibaba", "modelId": "qwen3.5-27b", "name": "Qwen3.5 27B", "inputPerMillion": 0.3, "outputPerMillion": 2.4, "contextWindow": 262144, "maxOutputTokens": 65536 },
46
+ { "providerId": "alibaba", "modelId": "qwen3.5-35b-a3b", "name": "Qwen3.5 35B-A3B", "inputPerMillion": 0.25, "outputPerMillion": 2, "contextWindow": 262144, "maxOutputTokens": 65536 },
47
+ { "providerId": "alibaba", "modelId": "qwen3.5-397b-a17b", "name": "Qwen3.5 397B-A17B", "inputPerMillion": 0.6, "outputPerMillion": 3.6, "contextWindow": 262144, "maxOutputTokens": 65536 },
48
+ { "providerId": "alibaba", "modelId": "qwen3.5-plus", "name": "Qwen3.5 Plus", "inputPerMillion": 0.4, "outputPerMillion": 2.4, "contextWindow": 1000000, "maxOutputTokens": 65536 },
49
+ { "providerId": "alibaba", "modelId": "qwen3.6-27b", "name": "Qwen3.6 27B", "inputPerMillion": 0.6, "outputPerMillion": 3.6, "contextWindow": 262144, "maxOutputTokens": 65536 },
50
+ { "providerId": "alibaba", "modelId": "qwen3.6-35b-a3b", "name": "Qwen3.6 35B-A3B", "inputPerMillion": 0.248, "outputPerMillion": 1.485, "contextWindow": 262144, "maxOutputTokens": 65536 },
51
+ { "providerId": "alibaba", "modelId": "qwen3.6-flash", "name": "Qwen3.6 Flash", "inputPerMillion": 0.1875, "outputPerMillion": 1.125, "cacheWritePerMillion": 0.234375, "contextWindow": 1000000, "maxOutputTokens": 65536 },
52
+ { "providerId": "alibaba", "modelId": "qwen3.6-max-preview", "name": "Qwen3.6 Max Preview", "inputPerMillion": 1.3, "outputPerMillion": 7.8, "cacheReadPerMillion": 0.13, "cacheWritePerMillion": 1.625, "contextWindow": 262144, "maxOutputTokens": 65536 },
53
+ { "providerId": "alibaba", "modelId": "qwen3.6-plus", "name": "Qwen3.6 Plus", "inputPerMillion": 0.5, "outputPerMillion": 3, "cacheReadPerMillion": 0.05, "cacheWritePerMillion": 0.625, "contextWindow": 1000000, "maxOutputTokens": 65536 },
54
+ { "providerId": "alibaba", "modelId": "qwen3.7-max", "name": "Qwen3.7 Max", "inputPerMillion": 2.5, "outputPerMillion": 7.5, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 3.125, "contextWindow": 1000000, "maxOutputTokens": 65536 },
55
+ { "providerId": "alibaba", "modelId": "qwen3.7-plus", "name": "Qwen3.7 Plus", "inputPerMillion": 0.5, "outputPerMillion": 3, "cacheReadPerMillion": 0.05, "cacheWritePerMillion": 0.625, "contextWindow": 1000000, "maxOutputTokens": 65536 },
56
+ { "providerId": "alibaba", "modelId": "qwq-plus", "name": "QwQ Plus", "inputPerMillion": 0.8, "outputPerMillion": 2.4, "contextWindow": 131072, "maxOutputTokens": 8192 },
57
+ { "providerId": "anthropic", "modelId": "claude-fable-5", "name": "Claude Fable 5", "inputPerMillion": 10, "outputPerMillion": 50, "cacheReadPerMillion": 1, "cacheWritePerMillion": 12.5, "contextWindow": 1000000, "maxOutputTokens": 128000 },
58
+ { "providerId": "anthropic", "modelId": "claude-haiku-4-5", "name": "Claude Haiku 4.5 (latest)", "inputPerMillion": 1, "outputPerMillion": 5, "cacheReadPerMillion": 0.1, "cacheWritePerMillion": 1.25, "contextWindow": 200000, "maxOutputTokens": 64000 },
59
+ { "providerId": "anthropic", "modelId": "claude-haiku-4-5-20251001", "name": "Claude Haiku 4.5", "inputPerMillion": 1, "outputPerMillion": 5, "cacheReadPerMillion": 0.1, "cacheWritePerMillion": 1.25, "contextWindow": 200000, "maxOutputTokens": 64000 },
60
+ { "providerId": "anthropic", "modelId": "claude-opus-4-1", "name": "Claude Opus 4.1 (latest)", "inputPerMillion": 15, "outputPerMillion": 75, "cacheReadPerMillion": 1.5, "cacheWritePerMillion": 18.75, "contextWindow": 200000, "maxOutputTokens": 32000 },
61
+ { "providerId": "anthropic", "modelId": "claude-opus-4-1-20250805", "name": "Claude Opus 4.1", "inputPerMillion": 15, "outputPerMillion": 75, "cacheReadPerMillion": 1.5, "cacheWritePerMillion": 18.75, "contextWindow": 200000, "maxOutputTokens": 32000 },
62
+ { "providerId": "anthropic", "modelId": "claude-opus-4-5", "name": "Claude Opus 4.5 (latest)", "inputPerMillion": 5, "outputPerMillion": 25, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 200000, "maxOutputTokens": 64000 },
63
+ { "providerId": "anthropic", "modelId": "claude-opus-4-5-20251101", "name": "Claude Opus 4.5", "inputPerMillion": 5, "outputPerMillion": 25, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 200000, "maxOutputTokens": 64000 },
64
+ { "providerId": "anthropic", "modelId": "claude-opus-4-6", "name": "Claude Opus 4.6", "inputPerMillion": 5, "outputPerMillion": 25, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 1000000, "maxOutputTokens": 128000 },
65
+ { "providerId": "anthropic", "modelId": "claude-opus-4-7", "name": "Claude Opus 4.7", "inputPerMillion": 5, "outputPerMillion": 25, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 1000000, "maxOutputTokens": 128000 },
66
+ { "providerId": "anthropic", "modelId": "claude-opus-4-8", "name": "Claude Opus 4.8", "inputPerMillion": 5, "outputPerMillion": 25, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 1000000, "maxOutputTokens": 128000 },
67
+ { "providerId": "anthropic", "modelId": "claude-opus-5", "name": "Claude Opus 5", "inputPerMillion": 5, "outputPerMillion": 25, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 1000000, "maxOutputTokens": 128000 },
68
+ { "providerId": "anthropic", "modelId": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5 (latest)", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "cacheWritePerMillion": 3.75, "contextWindow": 1000000, "maxOutputTokens": 64000 },
69
+ { "providerId": "anthropic", "modelId": "claude-sonnet-4-5-20250929", "name": "Claude Sonnet 4.5", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "cacheWritePerMillion": 3.75, "contextWindow": 1000000, "maxOutputTokens": 64000 },
70
+ { "providerId": "anthropic", "modelId": "claude-sonnet-4-6", "name": "Claude Sonnet 4.6", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "cacheWritePerMillion": 3.75, "contextWindow": 1000000, "maxOutputTokens": 128000 },
71
+ { "providerId": "anthropic", "modelId": "claude-sonnet-5", "name": "Claude Sonnet 5", "inputPerMillion": 2, "outputPerMillion": 10, "cacheReadPerMillion": 0.2, "cacheWritePerMillion": 2.5, "contextWindow": 1000000, "maxOutputTokens": 128000 },
72
+ { "providerId": "deepseek", "modelId": "deepseek-chat", "name": "DeepSeek Chat", "inputPerMillion": 0.14, "outputPerMillion": 0.28, "cacheReadPerMillion": 0.0028, "contextWindow": 1000000, "maxOutputTokens": 384000 },
73
+ { "providerId": "deepseek", "modelId": "deepseek-reasoner", "name": "DeepSeek Reasoner", "inputPerMillion": 0.14, "outputPerMillion": 0.28, "cacheReadPerMillion": 0.0028, "contextWindow": 1000000, "maxOutputTokens": 384000 },
74
+ { "providerId": "deepseek", "modelId": "deepseek-v4-flash", "name": "DeepSeek V4 Flash", "inputPerMillion": 0.14, "outputPerMillion": 0.28, "cacheReadPerMillion": 0.0028, "contextWindow": 1000000, "maxOutputTokens": 384000 },
75
+ { "providerId": "deepseek", "modelId": "deepseek-v4-pro", "name": "DeepSeek V4 Pro", "inputPerMillion": 0.435, "outputPerMillion": 0.87, "cacheReadPerMillion": 0.003625, "contextWindow": 1000000, "maxOutputTokens": 384000 },
76
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/deepseek-v4-flash", "name": "DeepSeek V4 Flash", "inputPerMillion": 0.14, "outputPerMillion": 0.28, "cacheReadPerMillion": 0.028, "contextWindow": 1000000, "maxOutputTokens": 384000 },
77
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/deepseek-v4-flash-0731", "name": "DeepSeek V4 Flash 0731", "inputPerMillion": 0.14, "outputPerMillion": 0.28, "cacheReadPerMillion": 0.028, "contextWindow": 1000000, "maxOutputTokens": 384000 },
78
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/deepseek-v4-pro", "name": "DeepSeek V4 Pro", "inputPerMillion": 1.74, "outputPerMillion": 3.48, "cacheReadPerMillion": 0.145, "contextWindow": 1000000, "maxOutputTokens": 384000 },
79
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/glm-5p2", "name": "GLM 5.2", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.14, "contextWindow": 1048575, "maxOutputTokens": 131072 },
80
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/gpt-oss-120b", "name": "GPT OSS 120B", "inputPerMillion": 0.15, "outputPerMillion": 0.6, "cacheReadPerMillion": 0.015, "contextWindow": 131072, "maxOutputTokens": 32768 },
81
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/gpt-oss-20b", "name": "GPT OSS 20B", "inputPerMillion": 0.07, "outputPerMillion": 0.3, "cacheReadPerMillion": 0.035, "contextWindow": 131072, "maxOutputTokens": 32768 },
82
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/kimi-k2p6", "name": "Kimi K2.6", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.16, "contextWindow": 262000, "maxOutputTokens": 262000 },
83
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/kimi-k2p7-code", "name": "Kimi K2.7 Code", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.19, "contextWindow": 262000, "maxOutputTokens": 262000 },
84
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/kimi-k3", "name": "Kimi K3", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "contextWindow": 1048576, "maxOutputTokens": 131072 },
85
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/minimax-m2p7", "name": "MiniMax-M2.7", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 196608, "maxOutputTokens": 196608 },
86
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/minimax-m3", "name": "MiniMax-M3", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 512000, "maxOutputTokens": 512000 },
87
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/models/qwen3p7-plus", "name": "Qwen 3.7 Plus", "inputPerMillion": 0.4, "outputPerMillion": 1.6, "cacheReadPerMillion": 0.08, "contextWindow": 262144, "maxOutputTokens": 65536 },
88
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/routers/glm-5p2-fast", "name": "GLM 5.2 Fast", "inputPerMillion": 2.1, "outputPerMillion": 6.6, "cacheReadPerMillion": 0.21, "contextWindow": 1048575, "maxOutputTokens": 131072 },
89
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/routers/kimi-k2p6-fast", "name": "Kimi K2.6 Fast", "inputPerMillion": 2, "outputPerMillion": 8, "cacheReadPerMillion": 0.3, "contextWindow": 262000, "maxOutputTokens": 262000 },
90
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/routers/kimi-k2p6-turbo", "name": "Kimi K2.6 Turbo", "inputPerMillion": 2, "outputPerMillion": 8, "cacheReadPerMillion": 0.3, "contextWindow": 262000, "maxOutputTokens": 262000 },
91
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/routers/kimi-k2p7-code-fast", "name": "Kimi K2.7 Code Fast", "inputPerMillion": 1.9, "outputPerMillion": 8, "cacheReadPerMillion": 0.38, "contextWindow": 262000, "maxOutputTokens": 262000 },
92
+ { "providerId": "fireworks", "modelId": "accounts/fireworks/routers/kimi-k3-fast", "name": "Kimi K3 Fast", "inputPerMillion": 4.5, "outputPerMillion": 22.5, "cacheReadPerMillion": 0.45, "contextWindow": 1048576, "maxOutputTokens": 131072 },
93
+ { "providerId": "google", "modelId": "deep-research-max-preview-04-2026", "name": "Deep Research Max Preview (Apr-21-2026)", "inputPerMillion": 2, "outputPerMillion": 12, "cacheReadPerMillion": 0.2, "contextWindow": 131072, "maxOutputTokens": 65536 },
94
+ { "providerId": "google", "modelId": "deep-research-preview-04-2026", "name": "Deep Research Preview (Apr-21-2026)", "inputPerMillion": 2, "outputPerMillion": 12, "cacheReadPerMillion": 0.2, "contextWindow": 131072, "maxOutputTokens": 65536 },
95
+ { "providerId": "google", "modelId": "gemini-2.0-flash", "name": "Gemini 2.0 Flash", "inputPerMillion": 0.1, "outputPerMillion": 0.4, "cacheReadPerMillion": 0.025, "contextWindow": 1048576, "maxOutputTokens": 8192 },
96
+ { "providerId": "google", "modelId": "gemini-2.0-flash-lite", "name": "Gemini 2.0 Flash-Lite", "inputPerMillion": 0.075, "outputPerMillion": 0.3, "contextWindow": 1048576, "maxOutputTokens": 8192 },
97
+ { "providerId": "google", "modelId": "gemini-2.5-computer-use-preview-10-2025", "name": "Gemini 2.5 Computer Use Preview 10-2025", "inputPerMillion": 1.25, "outputPerMillion": 10, "contextWindow": 131072, "maxOutputTokens": 65536 },
98
+ { "providerId": "google", "modelId": "gemini-2.5-flash", "name": "Gemini 2.5 Flash", "inputPerMillion": 0.3, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.03, "contextWindow": 1048576, "maxOutputTokens": 65536 },
99
+ { "providerId": "google", "modelId": "gemini-2.5-flash-image", "name": "Nano Banana", "inputPerMillion": 0.3, "outputPerMillion": 30, "cacheReadPerMillion": 0.075, "contextWindow": 32768, "maxOutputTokens": 32768 },
100
+ { "providerId": "google", "modelId": "gemini-2.5-flash-lite", "name": "Gemini 2.5 Flash-Lite", "inputPerMillion": 0.1, "outputPerMillion": 0.4, "cacheReadPerMillion": 0.01, "contextWindow": 1048576, "maxOutputTokens": 65536 },
101
+ { "providerId": "google", "modelId": "gemini-2.5-flash-preview-tts", "name": "Gemini 2.5 Flash Preview TTS", "inputPerMillion": 0.5, "outputPerMillion": 10, "contextWindow": 8192, "maxOutputTokens": 16384 },
102
+ { "providerId": "google", "modelId": "gemini-2.5-pro", "name": "Gemini 2.5 Pro", "inputPerMillion": 1.25, "outputPerMillion": 10, "cacheReadPerMillion": 0.125, "contextWindow": 1048576, "maxOutputTokens": 65536 },
103
+ { "providerId": "google", "modelId": "gemini-2.5-pro-preview-tts", "name": "Gemini 2.5 Pro Preview TTS", "inputPerMillion": 1, "outputPerMillion": 20, "contextWindow": 8192, "maxOutputTokens": 16384 },
104
+ { "providerId": "google", "modelId": "gemini-3-flash-preview", "name": "Gemini 3 Flash Preview", "inputPerMillion": 0.5, "outputPerMillion": 3, "cacheReadPerMillion": 0.05, "contextWindow": 1048576, "maxOutputTokens": 65536 },
105
+ { "providerId": "google", "modelId": "gemini-3-pro-image", "name": "Nano Banana Pro", "inputPerMillion": 2, "outputPerMillion": 120, "contextWindow": 131072, "maxOutputTokens": 32768 },
106
+ { "providerId": "google", "modelId": "gemini-3-pro-image-preview", "name": "Nano Banana Pro", "inputPerMillion": 2, "outputPerMillion": 120, "contextWindow": 131072, "maxOutputTokens": 32768 },
107
+ { "providerId": "google", "modelId": "gemini-3-pro-preview", "name": "Gemini 3 Pro Preview", "inputPerMillion": 2, "outputPerMillion": 12, "cacheReadPerMillion": 0.2, "contextWindow": 1048576, "maxOutputTokens": 65536 },
108
+ { "providerId": "google", "modelId": "gemini-3.1-flash-image", "name": "Nano Banana 2", "inputPerMillion": 0.5, "outputPerMillion": 60, "contextWindow": 65536, "maxOutputTokens": 65536 },
109
+ { "providerId": "google", "modelId": "gemini-3.1-flash-image-preview", "name": "Nano Banana 2", "inputPerMillion": 0.5, "outputPerMillion": 60, "contextWindow": 65536, "maxOutputTokens": 65536 },
110
+ { "providerId": "google", "modelId": "gemini-3.1-flash-lite", "name": "Gemini 3.1 Flash Lite", "inputPerMillion": 0.25, "outputPerMillion": 1.5, "cacheReadPerMillion": 0.025, "contextWindow": 1048576, "maxOutputTokens": 65536 },
111
+ { "providerId": "google", "modelId": "gemini-3.1-flash-lite-image", "name": "Nano Banana 2 Lite", "inputPerMillion": 0.25, "outputPerMillion": 30, "contextWindow": 65536, "maxOutputTokens": 65536 },
112
+ { "providerId": "google", "modelId": "gemini-3.1-flash-lite-preview", "name": "Gemini 3.1 Flash Lite Preview", "inputPerMillion": 0.25, "outputPerMillion": 1.5, "cacheReadPerMillion": 0.025, "contextWindow": 1048576, "maxOutputTokens": 65536 },
113
+ { "providerId": "google", "modelId": "gemini-3.1-flash-live-preview", "name": "Gemini 3.1 Flash Live Preview", "inputPerMillion": 0.75, "outputPerMillion": 4.5, "contextWindow": 131072, "maxOutputTokens": 65536 },
114
+ { "providerId": "google", "modelId": "gemini-3.1-flash-tts-preview", "name": "Gemini 3.1 Flash TTS Preview", "inputPerMillion": 1, "outputPerMillion": 20, "contextWindow": 8192, "maxOutputTokens": 16384 },
115
+ { "providerId": "google", "modelId": "gemini-3.1-pro-preview", "name": "Gemini 3.1 Pro Preview", "inputPerMillion": 2, "outputPerMillion": 12, "cacheReadPerMillion": 0.2, "contextWindow": 1048576, "maxOutputTokens": 65536 },
116
+ { "providerId": "google", "modelId": "gemini-3.1-pro-preview-customtools", "name": "Gemini 3.1 Pro Preview Custom Tools", "inputPerMillion": 2, "outputPerMillion": 12, "cacheReadPerMillion": 0.2, "contextWindow": 1048576, "maxOutputTokens": 65536 },
117
+ { "providerId": "google", "modelId": "gemini-3.5-flash", "name": "Gemini 3.5 Flash", "inputPerMillion": 1.5, "outputPerMillion": 9, "cacheReadPerMillion": 0.15, "contextWindow": 1048576, "maxOutputTokens": 65536 },
118
+ { "providerId": "google", "modelId": "gemini-3.5-flash-lite", "name": "Gemini 3.5 Flash Lite", "inputPerMillion": 0.3, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.03, "contextWindow": 1048576, "maxOutputTokens": 65536 },
119
+ { "providerId": "google", "modelId": "gemini-3.5-live-translate-preview", "name": "Gemini 3.5 Live Translate Preview", "inputPerMillion": 3.5, "outputPerMillion": 21, "contextWindow": 16384, "maxOutputTokens": 32768 },
120
+ { "providerId": "google", "modelId": "gemini-3.6-flash", "name": "Gemini 3.6 Flash", "inputPerMillion": 1.5, "outputPerMillion": 7.5, "cacheReadPerMillion": 0.15, "contextWindow": 1048576, "maxOutputTokens": 65536 },
121
+ { "providerId": "google", "modelId": "gemini-embedding-001", "name": "Gemini Embedding 001", "inputPerMillion": 0.15, "outputPerMillion": 0, "contextWindow": 2048, "maxOutputTokens": 1 },
122
+ { "providerId": "google", "modelId": "gemini-embedding-2", "name": "Gemini Embedding 2", "inputPerMillion": 0.2, "outputPerMillion": 0, "contextWindow": 8192, "maxOutputTokens": 1 },
123
+ { "providerId": "google", "modelId": "gemini-flash-latest", "name": "Gemini Flash Latest", "inputPerMillion": 1.5, "outputPerMillion": 9, "cacheReadPerMillion": 0.15, "contextWindow": 1048576, "maxOutputTokens": 65536 },
124
+ { "providerId": "google", "modelId": "gemini-flash-lite-latest", "name": "Gemini Flash-Lite Latest", "inputPerMillion": 0.25, "outputPerMillion": 1.5, "cacheReadPerMillion": 0.025, "contextWindow": 1048576, "maxOutputTokens": 65536 },
125
+ { "providerId": "google", "modelId": "gemini-omni-flash-preview", "name": "Gemini Omni Flash Preview", "inputPerMillion": 1.5, "outputPerMillion": 17.5, "contextWindow": 131072, "maxOutputTokens": 65536 },
126
+ { "providerId": "google", "modelId": "gemini-robotics-er-1.6-preview", "name": "Gemini Robotics-ER 1.6 Preview", "inputPerMillion": 1, "outputPerMillion": 5, "contextWindow": 131072, "maxOutputTokens": 65536 },
127
+ { "providerId": "groq", "modelId": "llama-3.1-8b-instant", "name": "Llama 3.1 8B", "inputPerMillion": 0.05, "outputPerMillion": 0.08, "contextWindow": 131072, "maxOutputTokens": 131072 },
128
+ { "providerId": "groq", "modelId": "llama-3.3-70b-versatile", "name": "Llama 3.3 70B", "inputPerMillion": 0.59, "outputPerMillion": 0.79, "contextWindow": 131072, "maxOutputTokens": 32768 },
129
+ { "providerId": "groq", "modelId": "meta-llama/llama-4-scout-17b-16e-instruct", "name": "Llama 4 Scout 17B 16E", "inputPerMillion": 0.11, "outputPerMillion": 0.34, "contextWindow": 131072, "maxOutputTokens": 8192 },
130
+ { "providerId": "groq", "modelId": "meta-llama/llama-prompt-guard-2-22m", "name": "Llama Prompt Guard 2 22M", "inputPerMillion": 0.03, "outputPerMillion": 0.03, "contextWindow": 512, "maxOutputTokens": 512 },
131
+ { "providerId": "groq", "modelId": "meta-llama/llama-prompt-guard-2-86m", "name": "Prompt Guard 2 86M", "inputPerMillion": 0.04, "outputPerMillion": 0.04, "contextWindow": 512, "maxOutputTokens": 512 },
132
+ { "providerId": "groq", "modelId": "openai/gpt-oss-120b", "name": "GPT OSS 120B", "inputPerMillion": 0.15, "outputPerMillion": 0.6, "cacheReadPerMillion": 0.075, "contextWindow": 131072, "maxOutputTokens": 65536 },
133
+ { "providerId": "groq", "modelId": "openai/gpt-oss-20b", "name": "GPT OSS 20B", "inputPerMillion": 0.075, "outputPerMillion": 0.3, "cacheReadPerMillion": 0.0375, "contextWindow": 131072, "maxOutputTokens": 65536 },
134
+ { "providerId": "groq", "modelId": "openai/gpt-oss-safeguard-20b", "name": "Safety GPT OSS 20B", "inputPerMillion": 0.075, "outputPerMillion": 0.3, "contextWindow": 131072, "maxOutputTokens": 65536 },
135
+ { "providerId": "groq", "modelId": "qwen/qwen3-32b", "name": "Qwen3-32B", "inputPerMillion": 0.29, "outputPerMillion": 0.59, "contextWindow": 131072, "maxOutputTokens": 40960 },
136
+ { "providerId": "minimax", "modelId": "MiniMax-M2", "name": "MiniMax-M2", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "contextWindow": 196608, "maxOutputTokens": 128000 },
137
+ { "providerId": "minimax", "modelId": "MiniMax-M2.1", "name": "MiniMax-M2.1", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.03, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
138
+ { "providerId": "minimax", "modelId": "MiniMax-M2.5", "name": "MiniMax-M2.5", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.03, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
139
+ { "providerId": "minimax", "modelId": "MiniMax-M2.5-highspeed", "name": "MiniMax-M2.5-highspeed", "inputPerMillion": 0.6, "outputPerMillion": 2.4, "cacheReadPerMillion": 0.06, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
140
+ { "providerId": "minimax", "modelId": "MiniMax-M2.7", "name": "MiniMax-M2.7", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
141
+ { "providerId": "minimax", "modelId": "MiniMax-M2.7-highspeed", "name": "MiniMax-M2.7-highspeed", "inputPerMillion": 0.6, "outputPerMillion": 2.4, "cacheReadPerMillion": 0.06, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
142
+ { "providerId": "minimax", "modelId": "MiniMax-M3", "name": "MiniMax-M3", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 1000000, "maxOutputTokens": 128000 },
143
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M2", "name": "MiniMax-M2", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "contextWindow": 196608, "maxOutputTokens": 128000 },
144
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M2.1", "name": "MiniMax-M2.1", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.03, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
145
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M2.5", "name": "MiniMax-M2.5", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.03, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
146
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M2.5-highspeed", "name": "MiniMax-M2.5-highspeed", "inputPerMillion": 0.6, "outputPerMillion": 2.4, "cacheReadPerMillion": 0.06, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
147
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M2.7", "name": "MiniMax-M2.7", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
148
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M2.7-highspeed", "name": "MiniMax-M2.7-highspeed", "inputPerMillion": 0.6, "outputPerMillion": 2.4, "cacheReadPerMillion": 0.06, "cacheWritePerMillion": 0.375, "contextWindow": 204800, "maxOutputTokens": 131072 },
149
+ { "providerId": "minimax-anthropic", "modelId": "MiniMax-M3", "name": "MiniMax-M3", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 1000000, "maxOutputTokens": 128000 },
150
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2-0711-preview", "name": "Kimi K2 0711", "inputPerMillion": 0.6, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.15, "contextWindow": 131072, "maxOutputTokens": 16384 },
151
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2-0905-preview", "name": "Kimi K2 0905", "inputPerMillion": 0.6, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.15, "contextWindow": 262144, "maxOutputTokens": 262144 },
152
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2-thinking", "name": "Kimi K2 Thinking", "inputPerMillion": 0.6, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.15, "contextWindow": 262144, "maxOutputTokens": 262144 },
153
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2-thinking-turbo", "name": "Kimi K2 Thinking Turbo", "inputPerMillion": 1.15, "outputPerMillion": 8, "cacheReadPerMillion": 0.15, "contextWindow": 262144, "maxOutputTokens": 262144 },
154
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2-turbo-preview", "name": "Kimi K2 Turbo", "inputPerMillion": 2.4, "outputPerMillion": 10, "cacheReadPerMillion": 0.6, "contextWindow": 262144, "maxOutputTokens": 262144 },
155
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2.5", "name": "Kimi K2.5", "inputPerMillion": 0.6, "outputPerMillion": 3, "cacheReadPerMillion": 0.1, "contextWindow": 262144, "maxOutputTokens": 262144 },
156
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2.6", "name": "Kimi K2.6", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.16, "contextWindow": 262144, "maxOutputTokens": 262144 },
157
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2.7-code", "name": "Kimi K2.7 Code", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.19, "contextWindow": 262144, "maxOutputTokens": 262144 },
158
+ { "providerId": "moonshot-cn", "modelId": "kimi-k2.7-code-highspeed", "name": "Kimi K2.7 Code HighSpeed", "inputPerMillion": 1.9, "outputPerMillion": 8, "cacheReadPerMillion": 0.38, "contextWindow": 262144, "maxOutputTokens": 262144 },
159
+ { "providerId": "moonshot-cn", "modelId": "kimi-k3", "name": "Kimi K3", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "contextWindow": 1048576, "maxOutputTokens": 131072 },
160
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2-0711-preview", "name": "Kimi K2 0711", "inputPerMillion": 0.6, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.15, "contextWindow": 131072, "maxOutputTokens": 16384 },
161
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2-0905-preview", "name": "Kimi K2 0905", "inputPerMillion": 0.6, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.15, "contextWindow": 262144, "maxOutputTokens": 262144 },
162
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2-thinking", "name": "Kimi K2 Thinking", "inputPerMillion": 0.6, "outputPerMillion": 2.5, "cacheReadPerMillion": 0.15, "contextWindow": 262144, "maxOutputTokens": 262144 },
163
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2-thinking-turbo", "name": "Kimi K2 Thinking Turbo", "inputPerMillion": 1.15, "outputPerMillion": 8, "cacheReadPerMillion": 0.15, "contextWindow": 262144, "maxOutputTokens": 262144 },
164
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2-turbo-preview", "name": "Kimi K2 Turbo", "inputPerMillion": 2.4, "outputPerMillion": 10, "cacheReadPerMillion": 0.6, "contextWindow": 262144, "maxOutputTokens": 262144 },
165
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2.5", "name": "Kimi K2.5", "inputPerMillion": 0.6, "outputPerMillion": 3, "cacheReadPerMillion": 0.1, "contextWindow": 262144, "maxOutputTokens": 262144 },
166
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2.6", "name": "Kimi K2.6", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.16, "contextWindow": 262144, "maxOutputTokens": 262144 },
167
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2.7-code", "name": "Kimi K2.7 Code", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.19, "contextWindow": 262144, "maxOutputTokens": 262144 },
168
+ { "providerId": "moonshot-intl", "modelId": "kimi-k2.7-code-highspeed", "name": "Kimi K2.7 Code HighSpeed", "inputPerMillion": 1.9, "outputPerMillion": 8, "cacheReadPerMillion": 0.38, "contextWindow": 262144, "maxOutputTokens": 262144 },
169
+ { "providerId": "moonshot-intl", "modelId": "kimi-k3", "name": "Kimi K3", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "contextWindow": 1048576, "maxOutputTokens": 131072 },
170
+ { "providerId": "openai", "modelId": "gpt-3.5-turbo", "name": "GPT-3.5-turbo", "inputPerMillion": 0.5, "outputPerMillion": 1.5, "contextWindow": 16385, "maxOutputTokens": 4096 },
171
+ { "providerId": "openai", "modelId": "gpt-4", "name": "GPT-4", "inputPerMillion": 30, "outputPerMillion": 60, "contextWindow": 8192, "maxOutputTokens": 8192 },
172
+ { "providerId": "openai", "modelId": "gpt-4-turbo", "name": "GPT-4 Turbo", "inputPerMillion": 10, "outputPerMillion": 30, "contextWindow": 128000, "maxOutputTokens": 4096 },
173
+ { "providerId": "openai", "modelId": "gpt-4.1", "name": "GPT-4.1", "inputPerMillion": 2, "outputPerMillion": 8, "cacheReadPerMillion": 0.5, "contextWindow": 1047576, "maxOutputTokens": 32768 },
174
+ { "providerId": "openai", "modelId": "gpt-4.1-mini", "name": "GPT-4.1 mini", "inputPerMillion": 0.4, "outputPerMillion": 1.6, "cacheReadPerMillion": 0.1, "contextWindow": 1047576, "maxOutputTokens": 32768 },
175
+ { "providerId": "openai", "modelId": "gpt-4.1-nano", "name": "GPT-4.1 nano", "inputPerMillion": 0.1, "outputPerMillion": 0.4, "cacheReadPerMillion": 0.025, "contextWindow": 1047576, "maxOutputTokens": 32768 },
176
+ { "providerId": "openai", "modelId": "gpt-4o", "name": "GPT-4o", "inputPerMillion": 2.5, "outputPerMillion": 10, "cacheReadPerMillion": 1.25, "contextWindow": 128000, "maxOutputTokens": 16384 },
177
+ { "providerId": "openai", "modelId": "gpt-4o-2024-05-13", "name": "GPT-4o (2024-05-13)", "inputPerMillion": 5, "outputPerMillion": 15, "contextWindow": 128000, "maxOutputTokens": 4096 },
178
+ { "providerId": "openai", "modelId": "gpt-4o-2024-08-06", "name": "GPT-4o (2024-08-06)", "inputPerMillion": 2.5, "outputPerMillion": 10, "cacheReadPerMillion": 1.25, "contextWindow": 128000, "maxOutputTokens": 16384 },
179
+ { "providerId": "openai", "modelId": "gpt-4o-2024-11-20", "name": "GPT-4o (2024-11-20)", "inputPerMillion": 2.5, "outputPerMillion": 10, "cacheReadPerMillion": 1.25, "contextWindow": 128000, "maxOutputTokens": 16384 },
180
+ { "providerId": "openai", "modelId": "gpt-4o-mini", "name": "GPT-4o mini", "inputPerMillion": 0.15, "outputPerMillion": 0.6, "cacheReadPerMillion": 0.075, "contextWindow": 128000, "maxOutputTokens": 16384 },
181
+ { "providerId": "openai", "modelId": "gpt-5", "name": "GPT-5", "inputPerMillion": 1.25, "outputPerMillion": 10, "cacheReadPerMillion": 0.125, "contextWindow": 400000, "maxOutputTokens": 128000 },
182
+ { "providerId": "openai", "modelId": "gpt-5-mini", "name": "GPT-5 Mini", "inputPerMillion": 0.25, "outputPerMillion": 2, "cacheReadPerMillion": 0.025, "contextWindow": 400000, "maxOutputTokens": 128000 },
183
+ { "providerId": "openai", "modelId": "gpt-5-nano", "name": "GPT-5 Nano", "inputPerMillion": 0.05, "outputPerMillion": 0.4, "cacheReadPerMillion": 0.005, "contextWindow": 400000, "maxOutputTokens": 128000 },
184
+ { "providerId": "openai", "modelId": "gpt-5-pro", "name": "GPT-5 Pro", "inputPerMillion": 15, "outputPerMillion": 120, "contextWindow": 400000, "maxOutputTokens": 272000 },
185
+ { "providerId": "openai", "modelId": "gpt-5.1", "name": "GPT-5.1", "inputPerMillion": 1.25, "outputPerMillion": 10, "cacheReadPerMillion": 0.125, "contextWindow": 400000, "maxOutputTokens": 128000 },
186
+ { "providerId": "openai", "modelId": "gpt-5.2", "name": "GPT-5.2", "inputPerMillion": 1.75, "outputPerMillion": 14, "cacheReadPerMillion": 0.175, "contextWindow": 400000, "maxOutputTokens": 128000 },
187
+ { "providerId": "openai", "modelId": "gpt-5.2-chat-latest", "name": "GPT-5.2 Chat", "inputPerMillion": 1.75, "outputPerMillion": 14, "cacheReadPerMillion": 0.175, "contextWindow": 128000, "maxOutputTokens": 16384 },
188
+ { "providerId": "openai", "modelId": "gpt-5.2-pro", "name": "GPT-5.2 Pro", "inputPerMillion": 21, "outputPerMillion": 168, "contextWindow": 400000, "maxOutputTokens": 128000 },
189
+ { "providerId": "openai", "modelId": "gpt-5.3-chat-latest", "name": "GPT-5.3 Chat (latest)", "inputPerMillion": 1.75, "outputPerMillion": 14, "cacheReadPerMillion": 0.175, "contextWindow": 128000, "maxOutputTokens": 16384 },
190
+ { "providerId": "openai", "modelId": "gpt-5.3-codex", "name": "GPT-5.3 Codex", "inputPerMillion": 1.75, "outputPerMillion": 14, "cacheReadPerMillion": 0.175, "contextWindow": 400000, "maxOutputTokens": 128000 },
191
+ { "providerId": "openai", "modelId": "gpt-5.3-codex-spark", "name": "GPT-5.3 Codex Spark", "inputPerMillion": 1.75, "outputPerMillion": 14, "cacheReadPerMillion": 0.175, "contextWindow": 128000, "maxOutputTokens": 32000 },
192
+ { "providerId": "openai", "modelId": "gpt-5.4", "name": "GPT-5.4", "inputPerMillion": 2.5, "outputPerMillion": 15, "cacheReadPerMillion": 0.25, "contextWindow": 1050000, "maxOutputTokens": 128000 },
193
+ { "providerId": "openai", "modelId": "gpt-5.4-mini", "name": "GPT-5.4 mini", "inputPerMillion": 0.75, "outputPerMillion": 4.5, "cacheReadPerMillion": 0.075, "contextWindow": 400000, "maxOutputTokens": 128000 },
194
+ { "providerId": "openai", "modelId": "gpt-5.4-nano", "name": "GPT-5.4 nano", "inputPerMillion": 0.2, "outputPerMillion": 1.25, "cacheReadPerMillion": 0.02, "contextWindow": 400000, "maxOutputTokens": 128000 },
195
+ { "providerId": "openai", "modelId": "gpt-5.4-pro", "name": "GPT-5.4 Pro", "inputPerMillion": 30, "outputPerMillion": 180, "contextWindow": 1050000, "maxOutputTokens": 128000 },
196
+ { "providerId": "openai", "modelId": "gpt-5.5", "name": "GPT-5.5", "inputPerMillion": 5, "outputPerMillion": 30, "cacheReadPerMillion": 0.5, "contextWindow": 1050000, "maxOutputTokens": 128000 },
197
+ { "providerId": "openai", "modelId": "gpt-5.5-pro", "name": "GPT-5.5 Pro", "inputPerMillion": 30, "outputPerMillion": 180, "contextWindow": 1050000, "maxOutputTokens": 128000 },
198
+ { "providerId": "openai", "modelId": "gpt-5.6", "name": "GPT-5.6", "inputPerMillion": 5, "outputPerMillion": 30, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 1050000, "maxOutputTokens": 128000 },
199
+ { "providerId": "openai", "modelId": "gpt-5.6-luna", "name": "GPT-5.6 Luna", "inputPerMillion": 0.2, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.02, "cacheWritePerMillion": 0.25, "contextWindow": 1050000, "maxOutputTokens": 128000 },
200
+ { "providerId": "openai", "modelId": "gpt-5.6-sol", "name": "GPT-5.6 Sol", "inputPerMillion": 5, "outputPerMillion": 30, "cacheReadPerMillion": 0.5, "cacheWritePerMillion": 6.25, "contextWindow": 1050000, "maxOutputTokens": 128000 },
201
+ { "providerId": "openai", "modelId": "gpt-5.6-terra", "name": "GPT-5.6 Terra", "inputPerMillion": 2, "outputPerMillion": 12, "cacheReadPerMillion": 0.2, "cacheWritePerMillion": 2.5, "contextWindow": 1050000, "maxOutputTokens": 128000 },
202
+ { "providerId": "openai", "modelId": "gpt-image-2", "name": "gpt-image-2", "inputPerMillion": 5, "outputPerMillion": 30, "cacheReadPerMillion": 1.25, "contextWindow": 0, "maxOutputTokens": 0 },
203
+ { "providerId": "openai", "modelId": "gpt-realtime-2.1", "name": "GPT-Realtime-2.1", "inputPerMillion": 4, "outputPerMillion": 24, "cacheReadPerMillion": 0.4, "contextWindow": 128000, "maxOutputTokens": 32000 },
204
+ { "providerId": "openai", "modelId": "o1", "name": "o1", "inputPerMillion": 15, "outputPerMillion": 60, "cacheReadPerMillion": 7.5, "contextWindow": 200000, "maxOutputTokens": 100000 },
205
+ { "providerId": "openai", "modelId": "o1-pro", "name": "o1-pro", "inputPerMillion": 150, "outputPerMillion": 600, "contextWindow": 200000, "maxOutputTokens": 100000 },
206
+ { "providerId": "openai", "modelId": "o3", "name": "o3", "inputPerMillion": 2, "outputPerMillion": 8, "cacheReadPerMillion": 0.5, "contextWindow": 200000, "maxOutputTokens": 100000 },
207
+ { "providerId": "openai", "modelId": "o3-mini", "name": "o3-mini", "inputPerMillion": 1.1, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.55, "contextWindow": 200000, "maxOutputTokens": 100000 },
208
+ { "providerId": "openai", "modelId": "o3-pro", "name": "o3-pro", "inputPerMillion": 20, "outputPerMillion": 80, "contextWindow": 200000, "maxOutputTokens": 100000 },
209
+ { "providerId": "openai", "modelId": "o4-mini", "name": "o4-mini", "inputPerMillion": 1.1, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.275, "contextWindow": 200000, "maxOutputTokens": 100000 },
210
+ { "providerId": "openai", "modelId": "text-embedding-3-large", "name": "text-embedding-3-large", "inputPerMillion": 0.13, "outputPerMillion": 0, "contextWindow": 8191, "maxOutputTokens": 3072 },
211
+ { "providerId": "openai", "modelId": "text-embedding-3-small", "name": "text-embedding-3-small", "inputPerMillion": 0.02, "outputPerMillion": 0, "contextWindow": 8191, "maxOutputTokens": 1536 },
212
+ { "providerId": "openai", "modelId": "text-embedding-ada-002", "name": "text-embedding-ada-002", "inputPerMillion": 0.1, "outputPerMillion": 0, "contextWindow": 8192, "maxOutputTokens": 1536 },
213
+ { "providerId": "stepfun", "modelId": "step-1-32k", "name": "Step 1 (32K)", "inputPerMillion": 2.05, "outputPerMillion": 9.59, "cacheReadPerMillion": 0.41, "contextWindow": 32768, "maxOutputTokens": 32768 },
214
+ { "providerId": "stepfun", "modelId": "step-2-16k", "name": "Step 2 (16K)", "inputPerMillion": 5.21, "outputPerMillion": 16.44, "cacheReadPerMillion": 1.04, "contextWindow": 16384, "maxOutputTokens": 8192 },
215
+ { "providerId": "stepfun", "modelId": "step-3.5-flash", "name": "Step 3.5 Flash", "inputPerMillion": 0.1, "outputPerMillion": 0.3, "cacheReadPerMillion": 0.02, "contextWindow": 256000, "maxOutputTokens": 256000 },
216
+ { "providerId": "stepfun", "modelId": "step-3.5-flash-2603", "name": "Step 3.5 Flash 2603", "inputPerMillion": 0.1, "outputPerMillion": 0.3, "cacheReadPerMillion": 0.02, "contextWindow": 256000, "maxOutputTokens": 256000 },
217
+ { "providerId": "stepfun", "modelId": "step-3.7-flash", "name": "Step 3.7 Flash", "inputPerMillion": 0.185, "outputPerMillion": 1.11, "cacheReadPerMillion": 0.037, "contextWindow": 256000, "maxOutputTokens": 256000 },
218
+ { "providerId": "together", "modelId": "deepcogito/cogito-v2-1-671b", "name": "Cogito v2.1 671B", "inputPerMillion": 1.25, "outputPerMillion": 1.25, "contextWindow": 163840, "maxOutputTokens": 163840 },
219
+ { "providerId": "together", "modelId": "deepseek-ai/DeepSeek-R1", "name": "DeepSeek-R1", "inputPerMillion": 3, "outputPerMillion": 7, "contextWindow": 163839, "maxOutputTokens": 163839 },
220
+ { "providerId": "together", "modelId": "deepseek-ai/DeepSeek-V3", "name": "DeepSeek-V3", "inputPerMillion": 1.25, "outputPerMillion": 1.25, "contextWindow": 131072, "maxOutputTokens": 131072 },
221
+ { "providerId": "together", "modelId": "deepseek-ai/DeepSeek-V3-1", "name": "DeepSeek V3.1", "inputPerMillion": 0.6, "outputPerMillion": 1.7, "contextWindow": 131072, "maxOutputTokens": 131072 },
222
+ { "providerId": "together", "modelId": "deepseek-ai/DeepSeek-V4-Pro", "name": "DeepSeek V4 Pro", "inputPerMillion": 1.74, "outputPerMillion": 3.48, "cacheReadPerMillion": 0.2, "contextWindow": 512000, "maxOutputTokens": 384000 },
223
+ { "providerId": "together", "modelId": "essentialai/Rnj-1-Instruct", "name": "Rnj-1 Instruct", "inputPerMillion": 0.15, "outputPerMillion": 0.15, "contextWindow": 32768, "maxOutputTokens": 32768 },
224
+ { "providerId": "together", "modelId": "google/gemma-3n-E4B-it", "name": "Gemma 3N E4B Instruct", "inputPerMillion": 0.06, "outputPerMillion": 0.12, "contextWindow": 32768, "maxOutputTokens": 32768 },
225
+ { "providerId": "together", "modelId": "google/gemma-4-31B-it", "name": "Gemma 4 31B Instruct", "inputPerMillion": 0.39, "outputPerMillion": 0.97, "contextWindow": 262144, "maxOutputTokens": 131072 },
226
+ { "providerId": "together", "modelId": "LiquidAI/LFM2-24B-A2B", "name": "LFM2-24B-A2B", "inputPerMillion": 0.03, "outputPerMillion": 0.12, "contextWindow": 32768, "maxOutputTokens": 32768 },
227
+ { "providerId": "together", "modelId": "meta-llama/Llama-3.3-70B-Instruct-Turbo", "name": "Llama 3.3 70B", "inputPerMillion": 1.04, "outputPerMillion": 1.04, "contextWindow": 131072, "maxOutputTokens": 131072 },
228
+ { "providerId": "together", "modelId": "meta-llama/Meta-Llama-3-8B-Instruct-Lite", "name": "Meta Llama 3 8B Instruct Lite", "inputPerMillion": 0.14, "outputPerMillion": 0.14, "contextWindow": 8192, "maxOutputTokens": 8192 },
229
+ { "providerId": "together", "modelId": "MiniMaxAI/MiniMax-M2.5", "name": "MiniMax-M2.5", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 204800, "maxOutputTokens": 131072 },
230
+ { "providerId": "together", "modelId": "MiniMaxAI/MiniMax-M2.7", "name": "MiniMax-M2.7", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 202752, "maxOutputTokens": 131072 },
231
+ { "providerId": "together", "modelId": "MiniMaxAI/MiniMax-M3", "name": "MiniMax-M3", "inputPerMillion": 0.3, "outputPerMillion": 1.2, "cacheReadPerMillion": 0.06, "contextWindow": 524288, "maxOutputTokens": 250000 },
232
+ { "providerId": "together", "modelId": "moonshotai/Kimi-K2.5", "name": "Kimi K2.5", "inputPerMillion": 0.5, "outputPerMillion": 2.8, "contextWindow": 262144, "maxOutputTokens": 262144 },
233
+ { "providerId": "together", "modelId": "moonshotai/Kimi-K2.6", "name": "Kimi K2.6", "inputPerMillion": 1.2, "outputPerMillion": 4.5, "cacheReadPerMillion": 0.2, "contextWindow": 262144, "maxOutputTokens": 131000 },
234
+ { "providerId": "together", "modelId": "moonshotai/Kimi-K2.7-Code", "name": "Kimi K2.7 Code", "inputPerMillion": 0.95, "outputPerMillion": 4, "cacheReadPerMillion": 0.19, "contextWindow": 262144, "maxOutputTokens": 131072 },
235
+ { "providerId": "together", "modelId": "moonshotai/Kimi-K3", "name": "Kimi K3", "inputPerMillion": 3, "outputPerMillion": 15, "cacheReadPerMillion": 0.3, "contextWindow": 1048576, "maxOutputTokens": 131072 },
236
+ { "providerId": "together", "modelId": "nvidia/nemotron-3-ultra-550b-a55b", "name": "Nemotron 3 Ultra 550B A55B", "inputPerMillion": 0.6, "outputPerMillion": 3.6, "cacheReadPerMillion": 0.2, "contextWindow": 512300, "maxOutputTokens": 512300 },
237
+ { "providerId": "together", "modelId": "openai/gpt-oss-120b", "name": "GPT OSS 120B", "inputPerMillion": 0.15, "outputPerMillion": 0.6, "contextWindow": 131072, "maxOutputTokens": 131072 },
238
+ { "providerId": "together", "modelId": "openai/gpt-oss-20b", "name": "GPT OSS 20B", "inputPerMillion": 0.05, "outputPerMillion": 0.2, "contextWindow": 131072, "maxOutputTokens": 131072 },
239
+ { "providerId": "together", "modelId": "pearl-ai/gemma-4-31b-it", "name": "Pearl AI Gemma 4 31B Instruct", "inputPerMillion": 0.28, "outputPerMillion": 0.86, "contextWindow": 32000, "maxOutputTokens": 32000 },
240
+ { "providerId": "together", "modelId": "Qwen/Qwen2.5-7B-Instruct-Turbo", "name": "Qwen 2.5 7B Instruct Turbo", "inputPerMillion": 0.3, "outputPerMillion": 0.3, "contextWindow": 32768, "maxOutputTokens": 32768 },
241
+ { "providerId": "together", "modelId": "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", "name": "Qwen3 235B A22B Instruct 2507 FP8", "inputPerMillion": 0.2, "outputPerMillion": 0.6, "contextWindow": 262144, "maxOutputTokens": 262144 },
242
+ { "providerId": "together", "modelId": "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", "name": "Qwen3 Coder 480B A35B Instruct", "inputPerMillion": 2, "outputPerMillion": 2, "contextWindow": 262144, "maxOutputTokens": 262144 },
243
+ { "providerId": "together", "modelId": "Qwen/Qwen3-Coder-Next-FP8", "name": "Qwen3 Coder Next FP8", "inputPerMillion": 0.5, "outputPerMillion": 1.2, "contextWindow": 262144, "maxOutputTokens": 262144 },
244
+ { "providerId": "together", "modelId": "Qwen/Qwen3.5-397B-A17B", "name": "Qwen3.5 397B A17B", "inputPerMillion": 0.6, "outputPerMillion": 3.6, "cacheReadPerMillion": 0.35, "contextWindow": 262144, "maxOutputTokens": 130000 },
245
+ { "providerId": "together", "modelId": "Qwen/Qwen3.5-9B", "name": "Qwen3.5 9B", "inputPerMillion": 0.17, "outputPerMillion": 0.25, "contextWindow": 262144, "maxOutputTokens": 65536 },
246
+ { "providerId": "together", "modelId": "Qwen/Qwen3.6-Plus", "name": "Qwen3.6 Plus", "inputPerMillion": 0.5, "outputPerMillion": 3, "contextWindow": 1000000, "maxOutputTokens": 500000 },
247
+ { "providerId": "together", "modelId": "Qwen/Qwen3.7-Max", "name": "Qwen3.7 Max", "inputPerMillion": 1.25, "outputPerMillion": 3.75, "cacheReadPerMillion": 0.125, "contextWindow": 1000000, "maxOutputTokens": 500000 },
248
+ { "providerId": "together", "modelId": "thinkingmachines/Inkling", "name": "Inkling", "inputPerMillion": 1, "outputPerMillion": 4.05, "cacheReadPerMillion": 0.17, "contextWindow": 524288, "maxOutputTokens": 131072 },
249
+ { "providerId": "together", "modelId": "zai-org/GLM-5", "name": "GLM-5", "inputPerMillion": 1, "outputPerMillion": 3.2, "contextWindow": 202752, "maxOutputTokens": 131072 },
250
+ { "providerId": "together", "modelId": "zai-org/GLM-5.1", "name": "GLM-5.1", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.26, "contextWindow": 202752, "maxOutputTokens": 131072 },
251
+ { "providerId": "together", "modelId": "zai-org/GLM-5.2", "name": "GLM-5.2", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.26, "contextWindow": 262144, "maxOutputTokens": 164000 },
252
+ { "providerId": "zai", "modelId": "glm-4.5", "name": "GLM-4.5", "inputPerMillion": 0.6, "outputPerMillion": 2.2, "cacheReadPerMillion": 0.11, "contextWindow": 131072, "maxOutputTokens": 98304 },
253
+ { "providerId": "zai", "modelId": "glm-4.5-air", "name": "GLM-4.5-Air", "inputPerMillion": 0.2, "outputPerMillion": 1.1, "cacheReadPerMillion": 0.03, "contextWindow": 131072, "maxOutputTokens": 98304 },
254
+ { "providerId": "zai", "modelId": "glm-4.5v", "name": "GLM-4.5V", "inputPerMillion": 0.6, "outputPerMillion": 1.8, "contextWindow": 64000, "maxOutputTokens": 16384 },
255
+ { "providerId": "zai", "modelId": "glm-4.6", "name": "GLM-4.6", "inputPerMillion": 0.6, "outputPerMillion": 2.2, "cacheReadPerMillion": 0.11, "contextWindow": 204800, "maxOutputTokens": 131072 },
256
+ { "providerId": "zai", "modelId": "glm-4.6v", "name": "GLM-4.6V", "inputPerMillion": 0.3, "outputPerMillion": 0.9, "contextWindow": 128000, "maxOutputTokens": 32768 },
257
+ { "providerId": "zai", "modelId": "glm-4.7", "name": "GLM-4.7", "inputPerMillion": 0.6, "outputPerMillion": 2.2, "cacheReadPerMillion": 0.11, "contextWindow": 204800, "maxOutputTokens": 131072 },
258
+ { "providerId": "zai", "modelId": "glm-4.7-flashx", "name": "GLM-4.7-FlashX", "inputPerMillion": 0.07, "outputPerMillion": 0.4, "cacheReadPerMillion": 0.01, "contextWindow": 200000, "maxOutputTokens": 131072 },
259
+ { "providerId": "zai", "modelId": "glm-5", "name": "GLM-5", "inputPerMillion": 1, "outputPerMillion": 3.2, "cacheReadPerMillion": 0.2, "contextWindow": 204800, "maxOutputTokens": 131072 },
260
+ { "providerId": "zai", "modelId": "glm-5-turbo", "name": "GLM-5-Turbo", "inputPerMillion": 1.2, "outputPerMillion": 4, "cacheReadPerMillion": 0.24, "contextWindow": 200000, "maxOutputTokens": 131072 },
261
+ { "providerId": "zai", "modelId": "glm-5.1", "name": "GLM-5.1", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.26, "contextWindow": 200000, "maxOutputTokens": 131072 },
262
+ { "providerId": "zai", "modelId": "glm-5.2", "name": "GLM-5.2", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.26, "contextWindow": 1000000, "maxOutputTokens": 131072 },
263
+ { "providerId": "zai", "modelId": "glm-5v-turbo", "name": "GLM-5V-Turbo", "inputPerMillion": 1.2, "outputPerMillion": 4, "cacheReadPerMillion": 0.24, "contextWindow": 200000, "maxOutputTokens": 131072 },
264
+ { "providerId": "zhipuai", "modelId": "glm-4.5", "name": "GLM-4.5", "inputPerMillion": 0.6, "outputPerMillion": 2.2, "cacheReadPerMillion": 0.11, "contextWindow": 131072, "maxOutputTokens": 98304 },
265
+ { "providerId": "zhipuai", "modelId": "glm-4.5-air", "name": "GLM-4.5-Air", "inputPerMillion": 0.2, "outputPerMillion": 1.1, "cacheReadPerMillion": 0.03, "contextWindow": 131072, "maxOutputTokens": 98304 },
266
+ { "providerId": "zhipuai", "modelId": "glm-4.5v", "name": "GLM-4.5V", "inputPerMillion": 0.6, "outputPerMillion": 1.8, "contextWindow": 64000, "maxOutputTokens": 16384 },
267
+ { "providerId": "zhipuai", "modelId": "glm-4.6", "name": "GLM-4.6", "inputPerMillion": 0.6, "outputPerMillion": 2.2, "cacheReadPerMillion": 0.11, "contextWindow": 204800, "maxOutputTokens": 131072 },
268
+ { "providerId": "zhipuai", "modelId": "glm-4.6v", "name": "GLM-4.6V", "inputPerMillion": 0.3, "outputPerMillion": 0.9, "contextWindow": 128000, "maxOutputTokens": 32768 },
269
+ { "providerId": "zhipuai", "modelId": "glm-4.7", "name": "GLM-4.7", "inputPerMillion": 0.6, "outputPerMillion": 2.2, "cacheReadPerMillion": 0.11, "contextWindow": 204800, "maxOutputTokens": 131072 },
270
+ { "providerId": "zhipuai", "modelId": "glm-4.7-flashx", "name": "GLM-4.7-FlashX", "inputPerMillion": 0.07, "outputPerMillion": 0.4, "cacheReadPerMillion": 0.01, "contextWindow": 200000, "maxOutputTokens": 131072 },
271
+ { "providerId": "zhipuai", "modelId": "glm-5", "name": "GLM-5", "inputPerMillion": 1, "outputPerMillion": 3.2, "cacheReadPerMillion": 0.2, "contextWindow": 204800, "maxOutputTokens": 131072 },
272
+ { "providerId": "zhipuai", "modelId": "glm-5.1", "name": "GLM-5.1", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.26, "contextWindow": 200000, "maxOutputTokens": 131072 },
273
+ { "providerId": "zhipuai", "modelId": "glm-5.2", "name": "GLM-5.2", "inputPerMillion": 1.4, "outputPerMillion": 4.4, "cacheReadPerMillion": 0.26, "contextWindow": 1000000, "maxOutputTokens": 131072 },
274
+ { "providerId": "zhipuai", "modelId": "glm-5v-turbo", "name": "GLM-5V-Turbo", "inputPerMillion": 5, "outputPerMillion": 22, "cacheReadPerMillion": 1.2, "contextWindow": 200000, "maxOutputTokens": 131072 },
275
+ ];
@@ -1,5 +1,6 @@
1
- import type { TokenUsage } from "./types.js";
2
- export type PricingCurrency = "USD" | "CNY";
1
+ import type { TokenUsage, UsageCost } from "./types.js";
2
+ export type { UsageCost } from "./types.js";
3
+ export type PricingCurrency = UsageCost["currency"];
3
4
  export interface ModelPricing {
4
5
  providerId: string;
5
6
  modelId: string;
@@ -21,11 +22,14 @@ export interface ModelPricing {
21
22
  outputPerMillion: number;
22
23
  };
23
24
  }
24
- export interface UsageCost {
25
- currency: PricingCurrency;
26
- cost: number;
27
- estimated: boolean;
28
- }
25
+ /**
26
+ * Hand-maintained corrections layered over the generated models.dev snapshot.
27
+ * An entry here shadows the generated entry with the same (providerId, modelId).
28
+ * Only exceptions belong here — facts the upstream catalog cannot carry
29
+ * (promo expiry dates, non-USD billing) or gets wrong. Everything else comes
30
+ * from src/model-data.generated.ts via `npm run refresh-models`.
31
+ */
32
+ export declare const MODEL_PRICING_OVERRIDES: ModelPricing[];
29
33
  export declare const MODEL_PRICING: ModelPricing[];
30
34
  export declare function getModelPricing(providerId: string, modelId: string): ModelPricing | undefined;
31
35
  export declare function calculateUsageCost(providerId: string, modelId: string, usage: TokenUsage): UsageCost | undefined;
Binary file
@@ -22,4 +22,4 @@ export declare function refreshGrok(refreshToken: string, options?: {
22
22
  * Bubble's isolated runtime profile or the user's real ~/.grok). Users who
23
23
  * already completed `grok login` skip the browser round-trip entirely.
24
24
  */
25
- export declare function importGrokCliCredentials(bubbleHome?: string): OAuthTokens | undefined;
25
+ export declare function importGrokCliCredentials(bubbleHome?: string, homeDir?: string): OAuthTokens | undefined;
@@ -207,10 +207,13 @@ export async function refreshGrok(refreshToken, options = {}) {
207
207
  * Bubble's isolated runtime profile or the user's real ~/.grok). Users who
208
208
  * already completed `grok login` skip the browser round-trip entirely.
209
209
  */
210
- export function importGrokCliCredentials(bubbleHome = join(homedir(), ".bubble")) {
210
+ export function importGrokCliCredentials(bubbleHome = join(homedir(), ".bubble"),
211
+ // Injectable so tests can isolate the ~/.grok fallback from the real home
212
+ // directory; production callers rely on the default.
213
+ homeDir = homedir()) {
211
214
  const candidates = [
212
215
  join(bubbleHome, "runtimes", "grok", "grok-home", "auth.json"),
213
- join(homedir(), ".grok", "auth.json"),
216
+ join(homeDir, ".grok", "auth.json"),
214
217
  ];
215
218
  for (const path of candidates) {
216
219
  let parsed;
@@ -1,11 +1,18 @@
1
1
  /**
2
- * OAuth credential storage in ~/.bubble/auth.json
2
+ * OAuth credential storage in <bubble home>/auth.json.
3
+ *
4
+ * The path is resolved at CONSTRUCTION time through getBubbleHome(), never at
5
+ * module load: a module-level constant froze the real ~/.bubble at import,
6
+ * which no test could isolate (known-defects #7) and which ignored
7
+ * BUBBLE_HOME / dev mode while every other config file honored them
8
+ * (config.json, sessions, memory all derive from getBubbleHome).
3
9
  */
4
10
  import type { OAuthCredentials } from "./types.js";
5
11
  export declare class AuthStorage {
6
12
  private data;
7
13
  private mutationListeners;
8
- constructor();
14
+ private readonly authPath;
15
+ constructor(authPath?: string);
9
16
  /**
10
17
  * Observe credential writes/removals. Callers across the codebase mutate
11
18
  * this storage directly (login/logout flows), so consumers that must react