@jeffreycao/copilot-api 2.7.2 → 2.7.4
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.
- package/README.md +7 -7
- package/README.zh-CN.md +7 -7
- package/dist/{auth-DC-EO-eb.js → auth-D1czv5AK.js} +5 -5
- package/dist/auth-D1czv5AK.js.map +1 -0
- package/dist/auth-DZZzrMnx.js +2 -0
- package/dist/{config-DIDLVXMU.js → config-D1F-TyTn.js} +3 -3
- package/dist/{config-DIDLVXMU.js.map → config-D1F-TyTn.js.map} +1 -1
- package/dist/{config-store-CMgB1mCV.js → config-store-Bgmf82i_.js} +29 -5
- package/dist/config-store-Bgmf82i_.js.map +1 -0
- package/dist/{copilot-runtime-CRTYwDWy.js → copilot-runtime-BCf245Y5.js} +4 -90
- package/dist/copilot-runtime-BCf245Y5.js.map +1 -0
- package/dist/{debug-B0URJ4gT.js → debug-EkODckEE.js} +3 -3
- package/dist/{debug-B0URJ4gT.js.map → debug-EkODckEE.js.map} +1 -1
- package/dist/{github-copilot-provider-CLEAHyT-.js → github-copilot-provider-Cx4Afaco.js} +2 -2
- package/dist/{github-copilot-provider-CLEAHyT-.js.map → github-copilot-provider-Cx4Afaco.js.map} +1 -1
- package/dist/main.js +4 -4
- package/dist/{provider-C2Hs8Dua.js → provider-DXivPd6W.js} +2 -2
- package/dist/{provider-C2Hs8Dua.js.map → provider-DXivPd6W.js.map} +1 -1
- package/dist/{provider-management-BjU3aJnC.js → provider-management-DiQ92JMT.js} +12 -12
- package/dist/provider-management-DiQ92JMT.js.map +1 -0
- package/dist/{server-DbkseGH6.js → server-BmGSx45N.js} +226 -39
- package/dist/server-BmGSx45N.js.map +1 -0
- package/dist/{start-C_Svr70X.js → start-CaNs870A.js} +13 -111
- package/dist/start-CaNs870A.js.map +1 -0
- package/dist/{token-BjzzuPSb.js → token-CBDlQufZ.js} +6 -6
- package/dist/token-CBDlQufZ.js.map +1 -0
- package/package.json +1 -2
- package/dist/auth-C3_rHdk6.js +0 -2
- package/dist/auth-DC-EO-eb.js.map +0 -1
- package/dist/config-store-CMgB1mCV.js.map +0 -1
- package/dist/copilot-runtime-CRTYwDWy.js.map +0 -1
- package/dist/provider-management-BjU3aJnC.js.map +0 -1
- package/dist/server-DbkseGH6.js.map +0 -1
- package/dist/start-C_Svr70X.js.map +0 -1
- package/dist/token-BjzzuPSb.js.map +0 -1
package/README.md
CHANGED
|
@@ -22,15 +22,15 @@
|
|
|
22
22
|
English | <a href="README.zh-CN.md">简体中文</a>
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
|
-
Copilot API is a local AI gateway that connects Claude Code, OpenCode, Codex, and other clients to GitHub Copilot, the built-in Codex
|
|
25
|
+
Copilot API is a local AI gateway that connects Claude Code, OpenCode, Codex, and other clients to GitHub Copilot, the built-in Codex and xAI providers, and third-party model providers through a unified API.
|
|
26
26
|
|
|
27
27
|
## Highlights
|
|
28
28
|
|
|
29
29
|
- **Unified API Gateway**: Serve OpenAI-compatible Chat Completions (`/v1/chat/completions`), the OpenAI Responses API (`/v1/responses`), and Anthropic-compatible Messages (`/v1/messages`) from one local endpoint.
|
|
30
|
-
- **Multi-Provider**: Route GitHub Copilot, the built-in `codex`
|
|
31
|
-
- **Coding Agent Ready**: First-class setups for Claude Code, OpenCode, and Codex, including
|
|
30
|
+
- **Multi-Provider**: Route GitHub Copilot, the built-in `codex` and `xai` providers, and third-party providers (Kimi, DeepSeek, DashScope, OpenRouter, OpenCode Go, or a custom provider from models.dev) behind the same gateway. GitHub Copilot is optional — with at least one enabled provider, the server starts in provider-only mode without a GitHub token.
|
|
31
|
+
- **Coding Agent Ready**: First-class setups for Claude Code, OpenCode, and Codex, including settings.json gateway model discovery and a merged model catalog for Codex.
|
|
32
32
|
- **Streaming & WebSocket**: SSE streaming on all three client-facing protocols. Upstream Copilot Responses traffic selects WebSocket or HTTP from each model's advertised endpoints; streamed Responses traffic for the built-in `codex` provider uses WebSocket by default and uses HTTP when `useResponsesApiWebSocket` is disabled.
|
|
33
|
-
- **Desktop App**: Electron GUI with GitHub Copilot sign-in, Codex OAuth, provider configuration, token usage, logs, and one-click start/stop.
|
|
33
|
+
- **Desktop App**: Electron GUI with GitHub Copilot sign-in, Codex and xAI OAuth, provider configuration, token usage, logs, and one-click start/stop.
|
|
34
34
|
|
|
35
35
|
## Quick Start
|
|
36
36
|
|
|
@@ -59,7 +59,7 @@ From here, jump to the guide for your client: [Claude Code](docs/guides/en/claud
|
|
|
59
59
|
|
|
60
60
|
## Compatibility
|
|
61
61
|
|
|
62
|
-
Every client talks to the same local endpoint. The gateway routes each request to GitHub Copilot, the built-in `codex` provider, or a configured third-party provider, translating between protocols when the provider speaks a different one.
|
|
62
|
+
Every client talks to the same local endpoint. The gateway routes each request to GitHub Copilot, the built-in `codex` or `xai` provider, or a configured third-party provider, translating between protocols when the provider speaks a different one.
|
|
63
63
|
|
|
64
64
|
**Client / Protocol Matrix**
|
|
65
65
|
|
|
@@ -75,7 +75,7 @@ Every client talks to the same local endpoint. The gateway routes each request t
|
|
|
75
75
|
|
|
76
76
|
## Desktop App
|
|
77
77
|
|
|
78
|
-
Prefer a GUI? The Electron desktop app in `desktop/` covers GitHub Copilot sign-in, OpenAI Codex OAuth, and API-key configuration for Kimi, DeepSeek, DashScope, OpenRouter, or a custom provider — with one-click start/stop of the local server, and the local endpoint, auth header, available models, usage, and logs in one window.
|
|
78
|
+
Prefer a GUI? The Electron desktop app in `desktop/` covers GitHub Copilot sign-in, OpenAI Codex and xAI OAuth, and API-key configuration for Kimi, DeepSeek, DashScope, OpenRouter, or a custom provider from models.dev — with one-click start/stop of the local server, and the local endpoint, auth header, available models, usage, and logs in one window.
|
|
79
79
|
|
|
80
80
|
<p align="center">
|
|
81
81
|
<img src="docs/screenshots/desktop-dashboard.png" alt="Copilot API desktop app dashboard" width="49%" />
|
|
@@ -89,7 +89,7 @@ Windows x64 (`.exe`), macOS Apple Silicon (`.dmg`), and Linux x64 (`.AppImage`)
|
|
|
89
89
|
| Guide | Contents |
|
|
90
90
|
| --- | --- |
|
|
91
91
|
| [Installation and Startup](docs/guides/en/getting-started.md) | Prerequisites, project overview, `npx` and source runs, provider-only mode without Copilot, and gateway API key setup |
|
|
92
|
-
| [Claude Code](docs/guides/en/claude-code.md) |
|
|
92
|
+
| [Claude Code](docs/guides/en/claude-code.md) | settings.json, gateway model discovery, model mappings, auto-compact window, and WebSearch behavior |
|
|
93
93
|
| [OpenCode](docs/guides/en/opencode.md) | OpenCode OAuth login, the `@ai-sdk/anthropic` provider in `opencode.json`, `baseURL` conventions, model context limits, and thinking options |
|
|
94
94
|
| [Codex](docs/guides/en/codex.md) | A full `config.toml` provider block, `GITHUB_COPILOT_API_KEY` environment variable setup, auto-review model mapping, generating `model_catalog.json`, and the merged model picker catalog with protocol adapters |
|
|
95
95
|
| [Docker](docs/guides/en/docker.md) | Docker Compose quick start, the `/data` persistent mount and its ownership repair, supported environment variables, and host interface binding |
|
package/README.zh-CN.md
CHANGED
|
@@ -22,17 +22,17 @@
|
|
|
22
22
|
<a href="README.md">English</a> | 简体中文
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
|
-
Copilot API 是一个本地 AI 网关,让 Claude Code、OpenCode、Codex 等客户端通过统一的 API 使用 GitHub Copilot、内置 Codex 和第三方模型服务。
|
|
25
|
+
Copilot API 是一个本地 AI 网关,让 Claude Code、OpenCode、Codex 等客户端通过统一的 API 使用 GitHub Copilot、内置 Codex、xAI 和第三方模型服务。
|
|
26
26
|
|
|
27
27
|
<a id="highlights"></a>
|
|
28
28
|
|
|
29
29
|
## 功能亮点
|
|
30
30
|
|
|
31
31
|
- **统一 API 网关**:在同一个本地端点上提供 OpenAI 兼容的 Chat Completions(`/v1/chat/completions`)、OpenAI Responses API(`/v1/responses`)和 Anthropic 兼容的 Messages(`/v1/messages`)。
|
|
32
|
-
- **多 Provider 接入**:在同一个网关后面统一路由 GitHub Copilot、内置 `codex` provider 和第三方 provider(Kimi、DeepSeek、DashScope、OpenRouter、OpenCode Go
|
|
33
|
-
- **为 Coding Agent 而生**:为 Claude Code、OpenCode 和 Codex
|
|
32
|
+
- **多 Provider 接入**:在同一个网关后面统一路由 GitHub Copilot、内置 `codex`、`xai` provider 和第三方 provider(Kimi、DeepSeek、DashScope、OpenRouter、OpenCode Go 或从 models.dev 选择的自定义 provider)。GitHub Copilot 是可选能力——只要至少有一个启用中的 provider,无需 GitHub token 也能按 provider-only 模式启动。
|
|
33
|
+
- **为 Coding Agent 而生**:为 Claude Code、OpenCode 和 Codex 提供完整的配置指南,包括 settings.json 网关模型发现和面向 Codex 的合并模型目录。
|
|
34
34
|
- **Streaming 与 WebSocket**:三种面向客户端的协议都支持 SSE 流式输出。上游 Copilot Responses 流量会根据每个模型声明的端点选择 WebSocket 或 HTTP;内置 `codex` provider 的流式 Responses 请求默认走 WebSocket,关闭 `useResponsesApiWebSocket` 后改走 HTTP。
|
|
35
|
-
- **桌面应用**:Electron 图形界面,支持 GitHub Copilot 登录、Codex OAuth、provider 配置、token 用量、日志查看和一键启动 / 停止。
|
|
35
|
+
- **桌面应用**:Electron 图形界面,支持 GitHub Copilot 登录、Codex 与 xAI OAuth、provider 配置、token 用量、日志查看和一键启动 / 停止。
|
|
36
36
|
|
|
37
37
|
<a id="quick-start"></a>
|
|
38
38
|
|
|
@@ -65,7 +65,7 @@ curl http://localhost:4141/v1/models
|
|
|
65
65
|
|
|
66
66
|
## 兼容性
|
|
67
67
|
|
|
68
|
-
所有客户端都访问同一个本地端点。网关会把每个请求路由到 GitHub Copilot、内置 `codex` provider 或已配置的第三方 provider,并在 provider 使用不同协议时进行协议翻译。
|
|
68
|
+
所有客户端都访问同一个本地端点。网关会把每个请求路由到 GitHub Copilot、内置 `codex`、`xai` provider 或已配置的第三方 provider,并在 provider 使用不同协议时进行协议翻译。
|
|
69
69
|
|
|
70
70
|
**客户端 / 协议矩阵**
|
|
71
71
|
|
|
@@ -83,7 +83,7 @@ curl http://localhost:4141/v1/models
|
|
|
83
83
|
|
|
84
84
|
## 桌面应用
|
|
85
85
|
|
|
86
|
-
更喜欢图形界面?`desktop/` 目录下的 Electron 桌面应用支持 GitHub Copilot 登录、OpenAI Codex OAuth,以及 Kimi、DeepSeek、DashScope、OpenRouter
|
|
86
|
+
更喜欢图形界面?`desktop/` 目录下的 Electron 桌面应用支持 GitHub Copilot 登录、OpenAI Codex 与 xAI OAuth,以及 Kimi、DeepSeek、DashScope、OpenRouter 或从 models.dev 选择的自定义 provider 的 API Key 配置——可以一键启动 / 停止本地服务,并在一个窗口里查看本地端点、鉴权 Header、可用模型、用量和日志。
|
|
87
87
|
|
|
88
88
|
<p align="center">
|
|
89
89
|
<img src="docs/screenshots/desktop-dashboard.png" alt="Copilot API 桌面应用首页" width="49%" />
|
|
@@ -97,7 +97,7 @@ Windows x64(`.exe`)、macOS Apple Silicon(`.dmg`)和 Linux x64(`.AppIm
|
|
|
97
97
|
| 文档 | 内容 |
|
|
98
98
|
| --- | --- |
|
|
99
99
|
| [安装与启动](docs/guides/zh-CN/getting-started.md) | 环境要求、项目概览、npx 与源码运行、无 Copilot 时的 provider-only 模式,以及网关 API Key 配置 |
|
|
100
|
-
| [Claude Code](docs/guides/zh-CN/claude-code.md) |
|
|
100
|
+
| [Claude Code](docs/guides/zh-CN/claude-code.md) | settings.json、网关模型发现、模型映射、自动压缩窗口与 WebSearch 行为 |
|
|
101
101
|
| [OpenCode](docs/guides/zh-CN/opencode.md) | OpenCode OAuth 登录、`opencode.json` 中的 `@ai-sdk/anthropic` provider、`baseURL` 约定、模型上下文上限与思考选项 |
|
|
102
102
|
| [Codex](docs/guides/zh-CN/codex.md) | 完整的 `config.toml` provider 配置块、`GITHUB_COPILOT_API_KEY` 环境变量设置、自动审核模型映射、生成 `model_catalog.json`,以及合并后的模型选择器目录与协议适配 |
|
|
103
103
|
| [Docker](docs/guides/zh-CN/docker.md) | Docker Compose 快速启动、`/data` 持久化挂载与属主修复、支持的环境变量,以及监听所有网卡地址 |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { S as ensurePaths, t as SUPPORTED_PROVIDER_TYPES, x as PATHS, y as setConfiguredApiKeys } from "./config-store-
|
|
2
|
-
import { a as normalizeProviderBaseUrl, c as setProviderConfig, n as getRawProviderConfig, p as loadModelsDevProviderOptions, r as isSupportedProviderType } from "./config-
|
|
3
|
-
import { B as selectXaiAccount, G as loginCodex, L as getXaiAccounts, P as getConfiguredApiKeys, R as persistXaiCredentials,
|
|
1
|
+
import { S as ensurePaths, t as SUPPORTED_PROVIDER_TYPES, x as PATHS, y as setConfiguredApiKeys } from "./config-store-Bgmf82i_.js";
|
|
2
|
+
import { a as normalizeProviderBaseUrl, c as setProviderConfig, n as getRawProviderConfig, p as loadModelsDevProviderOptions, r as isSupportedProviderType } from "./config-D1F-TyTn.js";
|
|
3
|
+
import { B as selectXaiAccount, G as loginXai, K as loginCodex, L as getXaiAccounts, P as getConfiguredApiKeys, R as persistXaiCredentials, a as removeCodexAccount, i as persistCodexCredentials, l as setupGitHubToken, o as selectCodexAccount, ot as state, t as getCodexAccounts, z as removeXaiAccount } from "./token-CBDlQufZ.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
import consola from "consola";
|
|
6
6
|
//#region src/lib/quick-providers.ts
|
|
@@ -333,7 +333,7 @@ function buildCustomProviderConfig(existingProviderConfig, options) {
|
|
|
333
333
|
apiKey: options.apiKey,
|
|
334
334
|
...options.authType ? { authType: options.authType } : {},
|
|
335
335
|
pricingCurrency: options.pricingCurrency ?? existingProviderConfig.pricingCurrency,
|
|
336
|
-
...existingProviderConfig.
|
|
336
|
+
...existingProviderConfig.agentsModels !== void 0 ? { agentsModels: existingProviderConfig.agentsModels } : {},
|
|
337
337
|
...existingProviderConfig.models ? { models: existingProviderConfig.models } : {}
|
|
338
338
|
};
|
|
339
339
|
}
|
|
@@ -653,4 +653,4 @@ const auth = defineCommand({
|
|
|
653
653
|
//#endregion
|
|
654
654
|
export { runAuthLogin as a, runAuthKeys as i, runAuthAccounts as n, runProviderSetup as o, runAuthCodex as r, auth as t };
|
|
655
655
|
|
|
656
|
-
//# sourceMappingURL=auth-
|
|
656
|
+
//# sourceMappingURL=auth-D1czv5AK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-D1czv5AK.js","names":[],"sources":["../src/lib/quick-providers.ts","../src/lib/interactive-prompt.ts","../src/auth.ts"],"sourcesContent":["import type { ProviderType } from \"./config\"\n\ninterface QuickProviderConfig {\n type: ProviderType\n baseUrl: string\n pricingCurrency: string\n editableType: boolean\n}\n\nexport const QUICK_PROVIDER_CONFIGS = {\n \"opencode-go\": {\n type: \"openai-compatible\",\n baseUrl: \"https://opencode.ai/zen/go\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n kimi: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.kimi.com/coding\",\n pricingCurrency: \"USD\",\n editableType: true,\n },\n deepseek: {\n type: \"anthropic\",\n baseUrl: \"https://api.deepseek.com/anthropic\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n dashscope: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode\",\n pricingCurrency: \"CNY\",\n editableType: true,\n },\n openrouter: {\n type: \"anthropic\",\n baseUrl: \"https://openrouter.ai/api\",\n pricingCurrency: \"USD\",\n editableType: false,\n },\n} satisfies Record<string, QuickProviderConfig>\n\nexport type QuickProviderName = keyof typeof QUICK_PROVIDER_CONFIGS\n","import consola from \"consola\"\n\ninterface PromptSelectOption {\n label: string\n value: string\n hint?: string\n}\n\ninterface TextPromptOptions {\n type?: \"text\"\n default?: string\n initial?: string\n placeholder?: string\n}\n\ninterface SelectPromptOptions {\n type: \"select\"\n initial?: string\n options: Array<string | PromptSelectOption>\n}\n\nexport type InteractivePromptOptions = SelectPromptOptions | TextPromptOptions\n\ninterface ClackSelectOptions {\n message: string\n initialValue?: string\n options: Array<PromptSelectOption>\n}\n\ninterface ClackTextOptions {\n message: string\n defaultValue?: string\n initialValue?: string\n placeholder?: string\n}\n\nexport interface ClackPromptBackend {\n isCancel(value: unknown): boolean\n select(options: ClackSelectOptions): Promise<string | symbol>\n text(options: ClackTextOptions): Promise<string | symbol>\n}\n\ninterface PromptRuntime {\n bunVersion?: string\n platform: NodeJS.Platform\n stdinIsTTY?: boolean\n stdoutIsTTY?: boolean\n stdoutIsTTYStream?: boolean\n}\n\n// Consola 3.4.2 bundles a prompt implementation that writes keyboard input to\n// tty fd 0. Bun treats that as a real stdin write on Windows and throws EPIPE.\nexport function shouldUseClackPrompt(\n runtime: PromptRuntime = {\n bunVersion: process.versions.bun,\n platform: process.platform,\n stdinIsTTY: process.stdin.isTTY,\n stdoutIsTTY: process.stdout.isTTY,\n stdoutIsTTYStream: typeof process.stdout.getColorDepth === \"function\",\n },\n): boolean {\n return Boolean(\n runtime.platform === \"win32\"\n && runtime.bunVersion\n && runtime.stdinIsTTY\n && runtime.stdoutIsTTY\n && runtime.stdoutIsTTYStream,\n )\n}\n\nfunction getCancelValue(options: InteractivePromptOptions): string | undefined {\n return options.type === \"select\" ?\n options.initial\n : (options.default ?? options.initial)\n}\n\nexport async function promptWithClack(\n message: string,\n options: InteractivePromptOptions,\n backend: ClackPromptBackend,\n): Promise<string | undefined> {\n if (options.type === \"select\") {\n const value = await backend.select({\n message,\n options: options.options.map((option) =>\n typeof option === \"string\" ? { label: option, value: option } : option,\n ),\n initialValue: options.initial,\n })\n if (backend.isCancel(value)) {\n return getCancelValue(options)\n }\n return typeof value === \"string\" ? value : undefined\n }\n\n const value = await backend.text({\n message,\n defaultValue: options.default,\n initialValue: options.initial,\n placeholder: options.placeholder,\n })\n if (backend.isCancel(value)) {\n return getCancelValue(options)\n }\n return typeof value === \"string\" ? value : undefined\n}\n\nexport async function prompt(\n message: string,\n options: InteractivePromptOptions,\n): Promise<string | undefined> {\n if (!shouldUseClackPrompt()) {\n if (options.type === \"select\") {\n const value = await consola.prompt(message, options)\n return typeof value === \"string\" ? value : undefined\n }\n return await consola.prompt(message, options)\n }\n\n const clack = await import(\"@clack/prompts\")\n return await promptWithClack(message, options, clack)\n}\n","#!/usr/bin/env node\n\nimport { defineCommand } from \"citty\"\nimport consola from \"consola\"\n\nimport {\n getRawProviderConfig,\n isSupportedProviderType,\n normalizeProviderBaseUrl,\n setProviderConfig,\n setConfiguredApiKeys,\n SUPPORTED_PROVIDER_TYPES,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./lib/config\"\nimport { loginCodex } from \"./lib/oauth/codex\"\nimport { loginXai } from \"./lib/oauth/xai\"\nimport {\n persistXaiCredentials,\n getXaiAccounts,\n selectXaiAccount,\n removeXaiAccount,\n} from \"./lib/xai-token\"\nimport {\n loadModelsDevProviderOptions,\n type ModelsDevProviderOption,\n} from \"./lib/models-dev-cache\"\nimport { PATHS, ensurePaths } from \"./lib/paths\"\nimport { getConfiguredApiKeys } from \"./lib/request-auth\"\nimport {\n QUICK_PROVIDER_CONFIGS,\n type QuickProviderName,\n} from \"./lib/quick-providers\"\nimport { prompt } from \"./lib/interactive-prompt\"\nimport { state } from \"./lib/state\"\nimport {\n getCodexAccounts,\n persistCodexCredentials,\n removeCodexAccount,\n selectCodexAccount,\n setupGitHubToken,\n type CodexAccountSummary,\n} from \"./lib/token\"\n\ninterface RunAuthOptions {\n alias?: string\n provider?: string\n verbose: boolean\n showToken: boolean\n}\n\nconst authArgs = {\n provider: {\n type: \"string\",\n description:\n \"Provider to log in with or configure (copilot, codex, xai, opencode-go, kimi, deepseek, dashscope, openrouter, custom)\",\n },\n alias: {\n type: \"string\",\n description: \"Optional alias for a Codex or xAI account\",\n },\n verbose: {\n alias: \"v\",\n type: \"boolean\",\n default: false,\n description: \"Enable verbose logging\",\n },\n \"show-token\": {\n type: \"boolean\",\n default: false,\n description: \"Show provider access token on auth\",\n },\n} as const\n\nconst BUILTIN_PROVIDER_NAMES = [\"copilot\", \"codex\", \"xai\"] as const\nconst QUICK_PROVIDER_NAMES = Object.keys(\n QUICK_PROVIDER_CONFIGS,\n) as Array<QuickProviderName>\nconst AUTH_PROVIDER_NAMES = [\n ...BUILTIN_PROVIDER_NAMES,\n ...QUICK_PROVIDER_NAMES,\n \"custom\",\n] as const\nconst CUSTOM_PROVIDER_AUTH_TYPE_OPTION = \"__default__\"\nconst QUICK_PROVIDER_DEFAULT_TYPE_OPTION = \"__default__\"\nconst CUSTOM_PROVIDER_AUTH_TYPES = [\"x-api-key\", \"authorization\"] as const\n\ntype BuiltinProviderName = (typeof BUILTIN_PROVIDER_NAMES)[number]\ntype AuthProviderName = (typeof AUTH_PROVIDER_NAMES)[number]\ntype CustomProviderAuthType = (typeof CUSTOM_PROVIDER_AUTH_TYPES)[number]\n\nconst BUILTIN_PROVIDER_LABELS: Record<BuiltinProviderName, string> = {\n copilot: \"GitHub Copilot\",\n codex: \"OpenAI Codex\",\n xai: \"xAI (SuperGrok Subscription)\",\n}\nconst AUTH_PROVIDER_LABELS: Record<AuthProviderName, string> = {\n ...BUILTIN_PROVIDER_LABELS,\n \"opencode-go\": \"OpenCode Go\",\n kimi: \"Kimi\",\n deepseek: \"DeepSeek\",\n dashscope: \"DashScope\",\n openrouter: \"OpenRouter\",\n custom: \"Custom provider\",\n}\n\nfunction isAuthProviderName(\n providerName: string,\n): providerName is AuthProviderName {\n return AUTH_PROVIDER_NAMES.includes(providerName as AuthProviderName)\n}\n\nfunction isCustomProviderAuthType(\n value: string,\n): value is CustomProviderAuthType {\n return CUSTOM_PROVIDER_AUTH_TYPES.includes(value as CustomProviderAuthType)\n}\n\nfunction isQuickProviderName(\n providerName: AuthProviderName,\n): providerName is QuickProviderName {\n return QUICK_PROVIDER_NAMES.includes(providerName as QuickProviderName)\n}\n\nasync function resolveProviderSelection(\n providerArg: string | undefined,\n): Promise<AuthProviderName> {\n const availableProviders = [...AUTH_PROVIDER_NAMES]\n\n if (providerArg !== undefined) {\n const providerName = providerArg.trim()\n if (!isAuthProviderName(providerName)) {\n throw new Error(\n `Unknown provider '${providerArg}'. Expected one of: ${availableProviders.join(\", \")}`,\n )\n }\n return providerName\n }\n\n if (availableProviders.length === 1) {\n return availableProviders[0]\n }\n\n const provider = await prompt(\"Select a provider to log in with\", {\n type: \"select\",\n options: availableProviders.map((providerName) => ({\n label: `${AUTH_PROVIDER_LABELS[providerName]} (${providerName})`,\n value: providerName,\n })),\n })\n\n if (!provider || !isAuthProviderName(provider)) {\n throw new Error(\"No provider selected\")\n }\n\n return provider\n}\n\nfunction assertCustomProviderName(providerName: string): void {\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (!/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(providerName)) {\n throw new Error(\n \"Provider name must start with a letter or number and contain only letters, numbers, underscores, or hyphens\",\n )\n }\n\n if (\n providerName === \"copilot\"\n || providerName === \"github-copilot\"\n || providerName === \"codex\"\n ) {\n throw new Error(\n `Provider name '${providerName}' is reserved for a builtin provider`,\n )\n }\n}\n\nasync function promptRequiredText(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await prompt(message, { type: \"text\" })\n const normalizedValue = typeof value === \"string\" ? value.trim() : \"\"\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nfunction canUseMaskedPrompt(): boolean {\n return Boolean(\n process.stdin.isTTY\n && process.stdout.isTTY\n && typeof process.stdin.setRawMode === \"function\",\n )\n}\n\nasync function promptMaskedText(message: string): Promise<string> {\n if (!canUseMaskedPrompt()) {\n const value = await prompt(message, { type: \"text\" })\n return typeof value === \"string\" ? value : \"\"\n }\n\n return await new Promise<string>((resolve, reject) => {\n let value = \"\"\n const rawModeWasEnabled = process.stdin.isRaw === true\n\n function cleanup(): void {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode(rawModeWasEnabled)\n process.stdin.pause()\n }\n\n function finish(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n resolve(value)\n }\n\n function cancel(): void {\n cleanup()\n process.stdout.write(\"\\n\")\n reject(new Error(\"Prompt cancelled\"))\n }\n\n function onData(chunk: Buffer): void {\n const input = chunk.toString(\"utf8\")\n\n if (input.startsWith(\"\\u001B\")) {\n return\n }\n\n for (const char of input) {\n if (char === \"\\u0003\") {\n cancel()\n return\n }\n\n if (char === \"\\r\" || char === \"\\n\") {\n finish()\n return\n }\n\n if (char === \"\\b\" || char === \"\\u007F\") {\n if (value.length > 0) {\n value = value.slice(0, -1)\n process.stdout.write(\"\\b \\b\")\n }\n continue\n }\n\n if (char >= \" \") {\n value += char\n process.stdout.write(\"*\")\n }\n }\n }\n\n process.stdout.write(`${message}: `)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.on(\"data\", onData)\n })\n}\n\nasync function promptRequiredSecret(\n message: string,\n fieldName: string,\n): Promise<string> {\n const value = await promptMaskedText(message)\n const normalizedValue = value.trim()\n if (!normalizedValue) {\n throw new Error(`${fieldName} must be a non-empty string`)\n }\n return normalizedValue\n}\n\nasync function promptCustomProviderName(defaultName?: string): Promise<string> {\n const value = await prompt(\"Enter provider name\", {\n type: \"text\",\n ...(defaultName ? { default: defaultName, initial: defaultName } : {}),\n })\n const providerName = (value || defaultName || \"\").trim()\n assertCustomProviderName(providerName)\n return providerName\n}\n\nasync function promptCustomProviderType(\n defaultType?: ProviderType,\n): Promise<ProviderType> {\n const providerType = await prompt(\"Select provider type\", {\n type: \"select\",\n initial: defaultType,\n options: SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n })\n\n if (\n typeof providerType !== \"string\"\n || !isSupportedProviderType(providerType)\n ) {\n throw new Error(\"No provider type selected\")\n }\n\n return providerType\n}\n\nasync function promptModelsDevProvider(): Promise<\n ModelsDevProviderOption | undefined\n> {\n const source = await prompt(\"Choose custom provider source\", {\n type: \"select\",\n options: [\n { label: \"Enter manually\", value: \"manual\" },\n { label: \"Choose from models.dev\", value: \"models-dev\" },\n ],\n })\n if (source === \"manual\") return undefined\n if (source !== \"models-dev\") throw new Error(\"No provider source selected\")\n\n const providers = await loadModelsDevProviderOptions()\n const query = (\n (await prompt(\"Search models.dev providers (blank to list all)\", {\n type: \"text\",\n })) ?? \"\"\n )\n .trim()\n .toLowerCase()\n const matches = providers.filter(\n (provider) =>\n provider.id.toLowerCase().includes(query)\n || provider.name.toLowerCase().includes(query),\n )\n if (matches.length === 0) {\n throw new Error(\"No matching models.dev providers with a supported API URL\")\n }\n const selectedId = await prompt(\"Select a models.dev provider\", {\n type: \"select\",\n options: matches.map((provider) => ({\n label: `${provider.name} (${provider.id}) — ${provider.type}`,\n value: provider.id,\n })),\n })\n const selectedProvider = matches.find(\n (provider) => provider.id === selectedId,\n )\n if (!selectedProvider) throw new Error(\"No models.dev provider selected\")\n return selectedProvider\n}\n\nasync function promptQuickProviderType(\n defaultType: ProviderType,\n): Promise<ProviderType> {\n const providerType = await prompt(\n `Select provider type (default: ${defaultType})`,\n {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultType})`,\n value: QUICK_PROVIDER_DEFAULT_TYPE_OPTION,\n },\n ...SUPPORTED_PROVIDER_TYPES.map((type) => ({\n label: type,\n value: type,\n })),\n ],\n },\n )\n\n if (providerType === QUICK_PROVIDER_DEFAULT_TYPE_OPTION) {\n return defaultType\n }\n\n if (\n typeof providerType === \"string\"\n && isSupportedProviderType(providerType)\n ) {\n return providerType\n }\n\n throw new Error(\"No provider type selected\")\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nasync function promptCustomProviderAuthType(\n providerType: ProviderType,\n): Promise<ProviderAuthType | undefined> {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n const authType = await prompt(\"Select provider auth type\", {\n type: \"select\",\n options: [\n {\n label: `Default (${defaultAuthType})`,\n value: CUSTOM_PROVIDER_AUTH_TYPE_OPTION,\n },\n ...CUSTOM_PROVIDER_AUTH_TYPES.map((value) => ({\n label: value,\n value,\n })),\n ],\n })\n\n if (authType === CUSTOM_PROVIDER_AUTH_TYPE_OPTION) {\n return undefined\n }\n\n if (typeof authType === \"string\" && isCustomProviderAuthType(authType)) {\n return authType\n }\n\n throw new Error(\"No provider auth type selected\")\n}\n\nasync function promptQuickProviderBaseUrl(\n defaultBaseUrl: string,\n): Promise<string> {\n const value = await prompt(\n `Enter provider baseUrl (default: ${defaultBaseUrl})`,\n {\n type: \"text\",\n default: defaultBaseUrl,\n initial: defaultBaseUrl,\n },\n )\n const baseUrl = normalizeProviderBaseUrl(\n typeof value === \"string\" && value.trim() ? value : defaultBaseUrl,\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n return baseUrl\n}\n\nfunction buildCustomProviderConfig(\n existingProviderConfig: ProviderConfig,\n options: {\n apiKey: string\n authType?: ProviderAuthType\n baseUrl: string\n pricingCurrency?: string\n type: ProviderType\n modelsDevProviderId?: string\n },\n): ProviderConfig {\n return {\n type: options.type,\n enabled: true,\n baseUrl: options.baseUrl,\n ...(options.modelsDevProviderId && {\n modelsDevProviderId: options.modelsDevProviderId,\n }),\n apiKey: options.apiKey,\n ...(options.authType ? { authType: options.authType } : {}),\n pricingCurrency:\n options.pricingCurrency ?? existingProviderConfig.pricingCurrency,\n ...(existingProviderConfig.agentsModels !== undefined ?\n { agentsModels: existingProviderConfig.agentsModels }\n : {}),\n ...(existingProviderConfig.models ?\n { models: existingProviderConfig.models }\n : {}),\n }\n}\n\nasync function configureCustomProvider(): Promise<void> {\n const catalogProvider = await promptModelsDevProvider()\n const providerName = await promptCustomProviderName(catalogProvider?.id)\n const type = await promptCustomProviderType(catalogProvider?.type)\n const baseUrl =\n catalogProvider ?\n await promptQuickProviderBaseUrl(catalogProvider.api)\n : normalizeProviderBaseUrl(\n await promptRequiredText(\"Enter provider baseUrl\", \"baseUrl\"),\n )\n if (!baseUrl) {\n throw new Error(\"baseUrl must be a non-empty string\")\n }\n\n const apiKey = await promptRequiredSecret(\"Enter provider apiKey\", \"apiKey\")\n const authType = await promptCustomProviderAuthType(type)\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n authType,\n baseUrl,\n modelsDevProviderId: catalogProvider?.id,\n type,\n }),\n )\n\n consola.success(\n `Custom provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function configureQuickProvider(\n providerName: QuickProviderName,\n): Promise<void> {\n const defaultProviderConfig = QUICK_PROVIDER_CONFIGS[providerName]\n const apiKey = await promptRequiredSecret(\n `Enter ${providerName} apiKey`,\n \"apiKey\",\n )\n const type =\n defaultProviderConfig.editableType ?\n await promptQuickProviderType(defaultProviderConfig.type)\n : defaultProviderConfig.type\n const baseUrl = await promptQuickProviderBaseUrl(\n defaultProviderConfig.baseUrl,\n )\n const existingProviderConfig = getRawProviderConfig(providerName) ?? {}\n\n setProviderConfig(\n providerName,\n buildCustomProviderConfig(existingProviderConfig, {\n apiKey,\n baseUrl,\n pricingCurrency: defaultProviderConfig.pricingCurrency,\n type,\n }),\n )\n\n consola.success(\n `${AUTH_PROVIDER_LABELS[providerName]} provider '${providerName}' written to ${PATHS.CONFIG_PATH}`,\n )\n}\n\nasync function loginWithCodex(alias?: string): Promise<void> {\n const credentials = await loginCodex({\n onAuth(info) {\n consola.info(\"Open the following URL to authenticate with Codex:\")\n consola.log(info.url)\n if (info.instructions) {\n consola.info(info.instructions)\n }\n },\n onPrompt(message) {\n return prompt(message, { type: \"text\" }).then((value) => value ?? \"\")\n },\n onProgress(message) {\n consola.debug(message)\n },\n })\n\n await persistCodexCredentials(credentials, {\n activateAccount: true,\n alias,\n enableProvider: true,\n })\n consola.success(\n `Codex provider config written to ${PATHS.CONFIG_PATH} and credentials written to ${PATHS.CODEX_CREDENTIAL_PATH}`,\n )\n}\n\nasync function loginWithProvider(\n provider: AuthProviderName,\n alias?: string,\n): Promise<void> {\n if (alias !== undefined && provider !== \"codex\" && provider !== \"xai\") {\n throw new Error(\"--alias is only supported with the codex or xai provider\")\n }\n\n if (provider === \"copilot\") {\n await setupGitHubToken({ force: true })\n consola.success(\"GitHub token written to\", PATHS.GITHUB_TOKEN_PATH)\n return\n }\n\n if (provider === \"codex\") {\n await loginWithCodex(alias)\n return\n }\n\n if (provider === \"xai\") {\n const credentials = await loginXai({\n onAuth(info) {\n consola.info(\"Open the following URL to authenticate with xAI:\")\n consola.log(info.url)\n consola.info(\n `Open ${info.verificationUri} on any device and enter code: ${info.userCode}`,\n )\n },\n })\n await persistXaiCredentials(credentials, { alias })\n consola.success(\n `xAI provider config written to ${PATHS.CONFIG_PATH} and credentials written to ${PATHS.XAI_CREDENTIAL_PATH}`,\n )\n return\n }\n\n if (isQuickProviderName(provider)) {\n await configureQuickProvider(provider)\n return\n }\n\n await configureCustomProvider()\n}\n\nexport async function runProviderSetup(): Promise<void> {\n const provider = await resolveProviderSelection(undefined)\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider)\n}\n\nexport async function runAuthLogin(options: RunAuthOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n if (options.verbose) {\n consola.level = 5\n consola.info(\"Verbose logging enabled\")\n }\n\n state.showToken = options.showToken\n\n await ensurePaths()\n const provider = await resolveProviderSelection(options.provider)\n\n consola.info(`Logging in with ${AUTH_PROVIDER_LABELS[provider]}`)\n await loginWithProvider(provider, options.alias)\n}\n\nconst authAccountArgs = {\n list: {\n alias: \"l\",\n type: \"boolean\",\n default: false,\n description: \"List stored OAuth accounts\",\n },\n remove: {\n alias: \"r\",\n type: \"string\",\n description:\n \"Remove an OAuth account by alias or account id; the account in use cannot be removed\",\n },\n use: {\n alias: \"u\",\n type: \"string\",\n description: \"Select an OAuth account by alias or account id\",\n },\n} as const\n\ninterface RunAuthAccountsOptions {\n list?: boolean\n remove?: string\n use?: string\n}\n\nfunction formatOAuthAccountName(\n account: Pick<CodexAccountSummary, \"accountId\" | \"alias\">,\n): string {\n return account.alias ?\n `${account.alias} (${account.accountId})`\n : account.accountId\n}\n\nfunction formatOAuthAccount(account: CodexAccountSummary): string {\n return `${account.active ? \"*\" : \"-\"} ${formatOAuthAccountName(account)}`\n}\n\nexport async function runAuthCodex(\n options: RunAuthAccountsOptions,\n): Promise<void> {\n return await runAuthAccounts(\"codex\", options)\n}\n\nexport async function runAuthAccounts(\n provider: \"codex\" | \"xai\",\n options: RunAuthAccountsOptions,\n): Promise<void> {\n const label = provider === \"codex\" ? \"Codex\" : \"xAI\"\n const accountsApi =\n provider === \"codex\" ?\n {\n list: getCodexAccounts,\n select: selectCodexAccount,\n remove: removeCodexAccount,\n }\n : {\n list: getXaiAccounts,\n select: selectXaiAccount,\n remove: removeXaiAccount,\n }\n await ensurePaths()\n\n const operationCount = [\n options.list === true,\n options.use !== undefined,\n options.remove !== undefined,\n ].filter(Boolean).length\n if (operationCount > 1) {\n throw new Error(\"Use only one of --list, --use, or --remove per invocation\")\n }\n\n if (options.use !== undefined) {\n const account = await accountsApi.select(options.use)\n consola.success(\n `Selected ${label} account ${formatOAuthAccountName(account)}`,\n )\n consola.info(`Restart the server to use the selected ${label} account.`)\n return\n }\n\n if (options.remove !== undefined) {\n const account = await accountsApi.remove(options.remove)\n consola.success(\n `Removed ${label} account ${formatOAuthAccountName(account)}`,\n )\n return\n }\n\n const accounts = await accountsApi.list()\n if (accounts.length === 0) {\n consola.info(\n `No ${label} accounts configured. Run \\`copilot-api auth login --provider ${provider}\\` to add one.`,\n )\n return\n }\n\n consola.info(`Configured ${label} accounts:`)\n for (const account of accounts) {\n consola.info(formatOAuthAccount(account))\n }\n}\n\nconst authKeysArgs = {\n add: {\n alias: \"a\",\n type: \"string\",\n description: \"Add an API key for gateway authentication\",\n },\n remove: {\n alias: \"r\",\n type: \"string\",\n description: \"Remove an API key\",\n },\n list: {\n alias: \"l\",\n type: \"boolean\",\n default: false,\n description: \"List configured API keys\",\n },\n clear: {\n type: \"boolean\",\n default: false,\n description: \"Remove all configured API keys\",\n },\n} as const\n\ninterface RunAuthKeysOptions {\n add?: string\n remove?: string\n list?: boolean\n clear?: boolean\n}\n\nfunction normalizeAuthKeyValue(value: string): string {\n const normalizedKey = value.trim()\n if (!normalizedKey) {\n throw new Error(\"API key must be a non-empty string\")\n }\n return normalizedKey\n}\n\nexport async function runAuthKeys(options: RunAuthKeysOptions): Promise<void> {\n const tlsModule = await import(\"./lib/tls\")\n tlsModule.enableSystemCACompat()\n\n await ensurePaths()\n\n const operations = [\n ...(options.add !== undefined ? [\"add\"] : []),\n ...(options.remove !== undefined ? [\"remove\"] : []),\n ...(options.list ? [\"list\"] : []),\n ...(options.clear ? [\"clear\"] : []),\n ]\n if (operations.length > 1) {\n throw new Error(\n \"Use only one of --add, --remove, --list, or --clear per invocation\",\n )\n }\n\n const operation = operations[0] ?? \"list\"\n\n if (operation === \"add\") {\n const apiKey = normalizeAuthKeyValue(options.add ?? \"\")\n const currentKeys = getConfiguredApiKeys()\n if (currentKeys.includes(apiKey)) {\n consola.info(\n `API key already configured. ${currentKeys.length} API key(s) configured.`,\n )\n return\n }\n const storedKeys = setConfiguredApiKeys([...currentKeys, apiKey])\n consola.success(\n `API key added to ${PATHS.CONFIG_PATH}. ${storedKeys.length} API key(s) configured.`,\n )\n return\n }\n\n if (operation === \"remove\") {\n const apiKey = normalizeAuthKeyValue(options.remove ?? \"\")\n const currentKeys = getConfiguredApiKeys()\n if (!currentKeys.includes(apiKey)) {\n consola.info(\n `API key not found. ${currentKeys.length} API key(s) configured.`,\n )\n return\n }\n const storedKeys = setConfiguredApiKeys(\n currentKeys.filter((key) => key !== apiKey),\n )\n consola.success(\n `API key removed from ${PATHS.CONFIG_PATH}. ${storedKeys.length} API key(s) configured.`,\n )\n return\n }\n\n if (operation === \"clear\") {\n setConfiguredApiKeys([])\n consola.success(`Removed all API keys from ${PATHS.CONFIG_PATH}.`)\n return\n }\n\n const currentKeys = getConfiguredApiKeys()\n if (currentKeys.length === 0) {\n consola.info(\n \"No API keys configured. Run `npx @jeffreycao/copilot-api@latest auth keys --add <key>` to add one.\",\n )\n return\n }\n consola.info(\"Configured API keys:\")\n for (const key of currentKeys) {\n consola.info(`- ${key}`)\n }\n}\n\nconst authLogin = defineCommand({\n meta: {\n name: \"login\",\n description:\n \"Authenticate or configure a provider without running the server\",\n },\n args: authArgs,\n run({ args }) {\n return runAuthLogin({\n alias: args.alias,\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n\nconst authKeys = defineCommand({\n meta: {\n name: \"keys\",\n description: \"Manage gateway API keys (auth.apiKeys) in the config\",\n },\n args: authKeysArgs,\n run({ args }) {\n return runAuthKeys({\n add: args.add,\n remove: args.remove,\n list: args.list,\n clear: args.clear,\n })\n },\n})\n\nconst authCodex = defineCommand({\n meta: {\n name: \"codex\",\n description: \"List, select, or remove stored Codex accounts\",\n },\n args: authAccountArgs,\n run({ args }) {\n return runAuthCodex({\n list: args.list,\n remove: args.remove,\n use: args.use,\n })\n },\n})\n\nexport const auth = defineCommand({\n meta: {\n name: \"auth\",\n description: \"Run authentication flows without running the server\",\n },\n args: authArgs,\n subCommands: {\n codex: authCodex,\n xai: defineCommand({\n meta: { name: \"xai\", description: \"Manage stored xAI accounts\" },\n args: authAccountArgs,\n run({ args }) {\n return runAuthAccounts(\"xai\", {\n list: args.list,\n remove: args.remove,\n use: args.use,\n })\n },\n }),\n login: authLogin,\n keys: authKeys,\n },\n run({ args }) {\n if ((args._[0] ?? \"\").trim()) {\n return\n }\n\n return runAuthLogin({\n alias: args.alias,\n provider: args.provider,\n verbose: args.verbose,\n showToken: args[\"show-token\"],\n })\n },\n})\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as readEditableConfigFromDisk, b as writeConfigToDisk, c as getConfig, n as defaultConfig, r as defaultContextManagement, t as SUPPORTED_PROVIDER_TYPES, v as reloadConfig, x as PATHS } from "./config-store-
|
|
1
|
+
import { _ as readEditableConfigFromDisk, b as writeConfigToDisk, c as getConfig, n as defaultConfig, r as defaultContextManagement, t as SUPPORTED_PROVIDER_TYPES, v as reloadConfig, x as PATHS } from "./config-store-Bgmf82i_.js";
|
|
2
2
|
import consola from "consola";
|
|
3
3
|
import { createHash, randomUUID } from "node:crypto";
|
|
4
4
|
import path from "node:path";
|
|
@@ -578,7 +578,7 @@ function getProviderConfig(name) {
|
|
|
578
578
|
authTypeExplicit: provider.authType !== void 0,
|
|
579
579
|
pricingCurrency: normalizePricingCurrency(provider.pricingCurrency),
|
|
580
580
|
models: provider.models,
|
|
581
|
-
|
|
581
|
+
agentsModels: provider.agentsModels
|
|
582
582
|
};
|
|
583
583
|
}
|
|
584
584
|
function resolveEffectiveProviderType(providerConfig, model) {
|
|
@@ -629,4 +629,4 @@ function isReservedProviderName(name) {
|
|
|
629
629
|
//#endregion
|
|
630
630
|
export { isGpt56OrAbove as C, isContextManagementEnabledForResponses as S, setModelMappings as T, getModelResponsesApiCompactThreshold as _, normalizeProviderBaseUrl as a, getSmallModelForProvider as b, setProviderConfig as c, getOpencodeGoModelIds as d, getOpencodeGoModelRecords as f, getModelMappings as g, getExtraPromptForModel as h, listEnabledProviders as i, getModelsDevModelMaxOutputTokens as l, startModelsDevCache as m, getRawProviderConfig as n, resolveEffectiveProviderType as o, loadModelsDevProviderOptions as p, isSupportedProviderType as r, resolveProviderConfigForModel as s, getProviderConfig as t, getOpencodeGoModelConfig as u, getReasoningEffortForModel as v, resolveMappedModel as w, isContextManagementEnabledForMessages as x, getSmallModel as y };
|
|
631
631
|
|
|
632
|
-
//# sourceMappingURL=config-
|
|
632
|
+
//# sourceMappingURL=config-D1F-TyTn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-DIDLVXMU.js","names":[],"sources":["../src/lib/model-policy.ts","../src/lib/models-dev-cache.ts","../src/lib/provider-config.ts"],"sourcesContent":["import {\n defaultConfig,\n defaultContextManagement,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n} from \"./config-store\"\n\nconst GPT_MODEL_PATTERN = /^gpt-(\\d+)(?:\\.(\\d+))?/\n\nfunction isGpt53OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 3\n}\n\nexport function isGpt56OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 6\n}\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n const userPrompt = config.extraPrompts?.[model]\n if (userPrompt !== undefined) {\n return userPrompt\n }\n return isGpt53OrAbove(model) ? gpt5CommentaryPrompt : \"\"\n}\n\nexport function getModelMappings(): Record<string, string> {\n const config = getConfig()\n const modelMappings = config.modelMappings\n if (!modelMappings) {\n return { ...defaultConfig.modelMappings }\n }\n\n const validMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (\n !sourceModel\n || typeof targetModel !== \"string\"\n || targetModel.length === 0\n ) {\n continue\n }\n validMappings[sourceModel] = targetModel\n }\n\n return validMappings\n}\n\nfunction validateModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const validatedMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (!sourceModel || !targetModel) {\n throw new Error(\n \"Each model mapping must use non-empty source and target values.\",\n )\n }\n validatedMappings[sourceModel] = targetModel\n }\n\n return validatedMappings\n}\n\nexport function setModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const nextConfig = {\n ...readEditableConfigFromDisk(),\n modelMappings: validateModelMappings(modelMappings),\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getModelMappings()\n}\n\nexport function resolveMappedModel(model: string): string {\n return getModelMappings()[model] ?? model\n}\n\nexport function getSmallModel(): string {\n return getSmallModelForProvider(\"copilot\") ?? \"gpt-6-luna\"\n}\n\nexport function getSmallModelForProvider(provider: string): string | undefined {\n const providerName = provider.trim()\n const configuredModels = getConfig().smallModels\n const model =\n configuredModels && Object.hasOwn(configuredModels, providerName) ?\n configuredModels[providerName]\n : defaultConfig.smallModels?.[providerName]\n\n return typeof model === \"string\" ? model.trim() || undefined : undefined\n}\n\nexport function isContextManagementEnabledForMessages(): boolean {\n const config = getConfig()\n return config.contextManagement?.messages ?? defaultContextManagement.messages\n}\n\nexport function isContextManagementEnabledForResponses(): boolean {\n const config = getConfig()\n return (\n config.contextManagement?.responses ?? defaultContextManagement.responses\n )\n}\n\nexport function getModelResponsesApiCompactThreshold(\n model: string,\n): number | undefined {\n const config = getConfig()\n const threshold = config.modelResponsesApiCompactThresholds?.[model]\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" {\n const config = getConfig()\n const userEffort = config.modelReasoningEfforts?.[model]\n if (userEffort !== undefined) {\n return userEffort\n }\n return isGpt53OrAbove(model) ? \"xhigh\" : \"high\"\n}\n","import { createHash, randomUUID } from \"node:crypto\"\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type {\n Cost as ModelsDevCost,\n Model as ModelsDevModel,\n ModelCost as ModelsDevModelCost,\n ProviderMap as ModelsDevProviderMap,\n} from \"@opencode-ai/models\"\nimport consola from \"consola\"\n\nimport type {\n BuiltinProviderInputModality,\n BuiltinProviderModelConfig,\n} from \"./builtin-provider-models\"\nimport type {\n CodexReasoningEffort,\n ModelReasoningField,\n ProviderType,\n} from \"./config-store\"\nimport { PATHS } from \"./paths\"\nimport type {\n TokenUsagePricingConfig,\n TokenUsagePricingTier,\n} from \"./token-usage/pricing\"\n\nconst MODELS_DEV_URL = \"https://models.dev/api.json\"\nconst REFRESH_INTERVAL_MS = 5 * 60 * 1000\nconst FETCH_TIMEOUT_MS = 15_000\nconst OPENCODE_GO = \"opencode-go\"\nconst REASONING_EFFORTS = new Set<CodexReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n])\n\ninterface ModelRecord {\n [key: string]: string | number | Array<string> | undefined\n id: string\n name: string\n object: \"model\"\n created: number\n owned_by: typeof OPENCODE_GO\n context_window?: number\n max_output_tokens?: number\n input_modalities?: Array<BuiltinProviderInputModality>\n reasoning_efforts?: Array<CodexReasoningEffort>\n}\ntype ModelsDevFetcher = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>\n\ninterface CatalogSnapshot {\n configs: Record<string, BuiltinProviderModelConfig>\n providerTypes: Record<string, ProviderType>\n records: Array<ModelRecord>\n modelOutputTokens: Record<string, Record<string, number>>\n selectableProviders: Array<ModelsDevProviderOption>\n selectableProviderModelTypes: Record<string, Record<string, ProviderType>>\n selectableProviderModelApis: Record<string, Record<string, string>>\n selectableProviderModelPricing: Record<\n string,\n Record<string, TokenUsagePricingConfig>\n >\n}\n\nexport interface ModelsDevProviderOption {\n id: string\n name: string\n api: string\n type: ProviderType\n}\n\ninterface ResponseValidator {\n etag?: string\n lastModified?: string\n}\n\nexport interface ModelsDevCacheOptions {\n cachePath?: string\n fetcher?: ModelsDevFetcher\n intervalMs?: number\n}\n\nlet snapshot: CatalogSnapshot | null = null\nlet refreshTimer: ReturnType<typeof setTimeout> | null = null\nlet refreshGeneration = 0\nlet responseValidator: ResponseValidator | null = null\nlet cachedBodyHash: string | null = null\nlet activeCachePath: string | null = null\nlet refreshAbortController: AbortController | null = null\nlet activeRefresh: Promise<void> | null = null\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction getMetadataPath(cachePath: string): string {\n const extension = path.extname(cachePath)\n return path.join(\n path.dirname(cachePath),\n `${path.basename(cachePath, extension)}.meta.json`,\n )\n}\n\nfunction hashBody(body: string): string {\n return createHash(\"sha256\").update(body).digest(\"hex\")\n}\n\nfunction nonNegativeNumber(value: number | undefined): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : undefined\n}\n\nfunction positiveNumber(value: number | undefined): number | undefined {\n const number = nonNegativeNumber(value)\n return number && number > 0 ? number : undefined\n}\n\nfunction mapPriceTier(value: ModelsDevCost): TokenUsagePricingTier {\n const input = nonNegativeNumber(value.input)\n const output = nonNegativeNumber(value.output)\n const cachedInput = nonNegativeNumber(value.cache_read)\n const cacheCreationInput = nonNegativeNumber(value.cache_write)\n return {\n ...(input !== undefined && { input }),\n ...(output !== undefined && { output }),\n ...(cachedInput !== undefined && { cachedInput }),\n ...(cacheCreationInput !== undefined && { cacheCreationInput }),\n }\n}\n\nfunction mapPricing(\n value: ModelsDevModelCost | undefined,\n): TokenUsagePricingConfig | undefined {\n if (!isRecord(value)) return undefined\n\n const base = mapPriceTier(value)\n const higherTiers = (Array.isArray(value.tiers) ? value.tiers : [])\n .flatMap((tier) => {\n const threshold = positiveNumber(tier?.tier?.size)\n return threshold && threshold >= 1 && tier.tier.type === \"context\" ?\n [{ threshold, price: mapPriceTier(tier) }]\n : []\n })\n .sort((a, b) => a.threshold - b.threshold)\n\n if (higherTiers.length === 0) return base\n\n const firstTierMax = Math.ceil(higherTiers[0].threshold) - 1\n const tiers: Array<TokenUsagePricingTier> = [\n ...(firstTierMax > 0 ? [{ ...base, maxInputTokens: firstTierMax }] : []),\n ...higherTiers.map((tier, index) => ({\n ...tier.price,\n ...(higherTiers[index + 1] && {\n maxInputTokens: Math.ceil(higherTiers[index + 1].threshold) - 1,\n }),\n })),\n ]\n return { tiers }\n}\n\nfunction mapReasoningEfforts(\n value: ModelsDevModel[\"reasoning_options\"],\n): Array<CodexReasoningEffort> {\n if (!Array.isArray(value)) return []\n const efforts: Array<string | null> = []\n for (const option of value) {\n if (option?.type === \"effort\" && Array.isArray(option.values)) {\n efforts.push(...option.values)\n }\n }\n return [\n ...new Set(\n efforts.filter(\n (effort): effort is CodexReasoningEffort =>\n typeof effort === \"string\"\n && REASONING_EFFORTS.has(effort as CodexReasoningEffort),\n ),\n ),\n ]\n}\n\nfunction mapInputModalities(\n value: ModelsDevModel[\"modalities\"],\n): Array<BuiltinProviderInputModality> {\n if (!isRecord(value) || !Array.isArray(value.input)) return []\n return [\n ...new Set(\n value.input.filter(\n (modality): modality is BuiltinProviderInputModality =>\n modality === \"text\" || modality === \"image\",\n ),\n ),\n ]\n}\n\nfunction mapReasoningField(\n model: ModelsDevModel,\n): ModelReasoningField | undefined {\n const interleaved = model.interleaved\n const field = isRecord(interleaved) ? interleaved.field : interleaved\n if (field === \"reasoning_content\") return field\n // models.dev omits `interleaved` for the Hy family, whose Chat Completions\n // history expects the OpenRouter-style `reasoning` field.\n if (model.family === \"Hy\") return \"reasoning\"\n return undefined\n}\n\nfunction mapModelConfig(model: ModelsDevModel): BuiltinProviderModelConfig {\n const contextWindow = positiveNumber(model.limit?.context)\n const maxOutputTokens = positiveNumber(model.limit?.output)\n const reasoningEfforts = mapReasoningEfforts(model.reasoning_options)\n const inputModalities = mapInputModalities(model.modalities)\n const reasoningField = mapReasoningField(model)\n const pricing = mapPricing(model.cost)\n const defaultReasoningEffort =\n (\n (model.family === \"Hy\" || model.family === \"grok\")\n && reasoningEfforts.includes(\"high\")\n ) ?\n \"high\"\n : undefined\n return {\n ...(contextWindow && { contextWindow }),\n ...(maxOutputTokens && { maxOutputTokens }),\n ...(inputModalities.length > 0 && { inputModalities }),\n ...(reasoningEfforts.length > 0 && { reasoningEfforts }),\n ...(defaultReasoningEffort && { defaultReasoningEffort }),\n ...(reasoningField && { reasoningField }),\n ...(pricing && { pricing }),\n }\n}\n\nfunction mapProviderType(\n model: ModelsDevModel,\n providerNpm: string | undefined,\n): ProviderType {\n switch (model.provider?.npm || providerNpm) {\n case \"@ai-sdk/anthropic\":\n return \"anthropic\"\n case \"@ai-sdk/openai\":\n return model.provider?.shape === \"completions\" ?\n \"openai-compatible\"\n : \"openai-responses\"\n case \"@ai-sdk/openai-compatible\":\n default:\n return \"openai-compatible\"\n }\n}\n\nfunction normalizeCatalogApi(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.includes(\"${\")) return undefined\n const api = value.trim().replace(/\\/+$/u, \"\")\n let url: URL\n try {\n url = new URL(api)\n } catch {\n return undefined\n }\n if (\n (url.protocol !== \"https:\" && url.protocol !== \"http:\")\n || url.username\n || url.password\n || url.search\n || url.hash\n ) {\n return undefined\n }\n return api\n}\n\nfunction parseSelectableProviders(\n data: Record<string, unknown>,\n): Pick<\n CatalogSnapshot,\n | \"selectableProviders\"\n | \"selectableProviderModelTypes\"\n | \"selectableProviderModelApis\"\n | \"selectableProviderModelPricing\"\n> {\n const selectableProviders: Array<ModelsDevProviderOption> = []\n const selectableProviderModelTypes: Record<\n string,\n Record<string, ProviderType>\n > = Object.create(null) as Record<string, Record<string, ProviderType>>\n const selectableProviderModelApis: Record<\n string,\n Record<string, string>\n > = Object.create(null) as Record<string, Record<string, string>>\n const selectableProviderModelPricing: Record<\n string,\n Record<string, TokenUsagePricingConfig>\n > = Object.create(null) as Record<\n string,\n Record<string, TokenUsagePricingConfig>\n >\n\n for (const [id, value] of Object.entries(data)) {\n if (\n id === \"openrouter\"\n || id === \"github-copilot\"\n || id === \"opencode-go\"\n || id === \"copilot\"\n || id === \"codex\"\n || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(id)\n || !isRecord(value)\n || (value.npm !== \"@ai-sdk/openai-compatible\"\n && value.npm !== \"@ai-sdk/openai\"\n && value.npm !== \"@ai-sdk/anthropic\")\n ) {\n continue\n }\n\n const api = normalizeCatalogApi(value.api)\n if (!api) continue\n\n selectableProviders.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ?\n value.name.trim()\n : id,\n api,\n type:\n value.npm === \"@ai-sdk/openai\" ? \"openai-responses\"\n : value.npm === \"@ai-sdk/anthropic\" ? \"anthropic\"\n : \"openai-compatible\",\n })\n\n const modelTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const modelApis: Record<string, string> = Object.create(null) as Record<\n string,\n string\n >\n const modelPricing: Record<string, TokenUsagePricingConfig> = Object.create(\n null,\n ) as Record<string, TokenUsagePricingConfig>\n if (isRecord(value.models)) {\n for (const [modelId, model] of Object.entries(value.models)) {\n if (!isRecord(model) || model.status === \"deprecated\") continue\n const modelProvider = isRecord(model.provider) ? model.provider : null\n const modelNpm = modelProvider?.npm ?? value.npm\n if (\n modelNpm !== \"@ai-sdk/openai-compatible\"\n && modelNpm !== \"@ai-sdk/openai\"\n && modelNpm !== \"@ai-sdk/anthropic\"\n ) {\n continue\n }\n const type = mapProviderType(\n model as unknown as ModelsDevModel,\n value.npm,\n )\n modelTypes[modelId] = type\n const modelApi = normalizeCatalogApi(modelProvider?.api)\n if (modelApi) modelApis[modelId] = modelApi\n const pricing = mapPricing((model as unknown as ModelsDevModel).cost)\n if (pricing) modelPricing[modelId] = pricing\n }\n }\n selectableProviderModelTypes[id] = modelTypes\n selectableProviderModelApis[id] = modelApis\n selectableProviderModelPricing[id] = modelPricing\n }\n\n selectableProviders.sort(\n (a, b) =>\n a.name.localeCompare(b.name, \"en\") || a.id.localeCompare(b.id, \"en\"),\n )\n return {\n selectableProviders,\n selectableProviderModelTypes,\n selectableProviderModelApis,\n selectableProviderModelPricing,\n }\n}\n\nfunction parseModelOutputTokens(\n data: Record<string, unknown>,\n): CatalogSnapshot[\"modelOutputTokens\"] {\n const providers = Object.create(null) as CatalogSnapshot[\"modelOutputTokens\"]\n for (const [providerId, provider] of Object.entries(data)) {\n if (!isRecord(provider) || !isRecord(provider.models)) continue\n const models = Object.create(null) as Record<string, number>\n for (const [modelId, model] of Object.entries(provider.models)) {\n if (!isRecord(model) || model.status === \"deprecated\") continue\n const output = positiveNumber(\n (model as unknown as ModelsDevModel).limit?.output,\n )\n if (output !== undefined && Number.isInteger(output)) {\n models[modelId] = output\n }\n }\n providers[providerId] = models\n }\n return providers\n}\n\nfunction parseCatalog(data: unknown): CatalogSnapshot {\n const provider = isRecord(data) ? data[OPENCODE_GO] : undefined\n const models = isRecord(provider) ? provider.models : undefined\n if (!isRecord(models)) {\n throw new Error(\"models.dev response has no opencode-go models\")\n }\n const providerNpm =\n isRecord(provider) && typeof provider.npm === \"string\" ?\n provider.npm\n : undefined\n\n const configs: Record<string, BuiltinProviderModelConfig> = Object.create(\n null,\n ) as Record<string, BuiltinProviderModelConfig>\n const providerTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const records: Array<ModelRecord> = []\n const typedModels = models as ModelsDevProviderMap[string][\"models\"]\n for (const id of Object.keys(typedModels).sort()) {\n const value = typedModels[id]\n if (\n !id.trim()\n || !isRecord(value)\n || value.id !== id\n || value.status === \"deprecated\"\n )\n continue\n const config = mapModelConfig(value)\n configs[id] = config\n providerTypes[id] = mapProviderType(value, providerNpm)\n records.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ? value.name : id,\n object: \"model\",\n created: 0,\n owned_by: OPENCODE_GO,\n ...(config.contextWindow && { context_window: config.contextWindow }),\n ...(config.maxOutputTokens && {\n max_output_tokens: config.maxOutputTokens,\n }),\n ...(config.inputModalities && {\n input_modalities: config.inputModalities,\n }),\n ...(config.reasoningEfforts && {\n reasoning_efforts: config.reasoningEfforts,\n }),\n })\n }\n\n if (records.length === 0) {\n throw new Error(\"models.dev response has no valid opencode-go models\")\n }\n return {\n configs,\n providerTypes,\n records,\n modelOutputTokens: parseModelOutputTokens(data as Record<string, unknown>),\n ...parseSelectableProviders(data as Record<string, unknown>),\n }\n}\n\nexport function installModelsDevCatalog(data: unknown): number {\n snapshot = parseCatalog(data)\n return snapshot.records.length\n}\n\nexport function getOpencodeGoModelIds(): Array<string> {\n return snapshot?.records.map((model) => model.id) ?? []\n}\n\nexport function getOpencodeGoModelConfig(\n modelId: string,\n): BuiltinProviderModelConfig | undefined {\n return (\n snapshot?.configs[modelId.trim()]\n ?? snapshot?.configs[modelId.trim().toLowerCase()]\n )\n}\n\nexport function getOpencodeGoModelProviderType(modelId: string): ProviderType {\n const id = modelId.trim()\n return (\n snapshot?.providerTypes[id]\n ?? snapshot?.providerTypes[id.toLowerCase()]\n ?? \"openai-compatible\"\n )\n}\n\nexport function getOpencodeGoModelRecords(): Array<ModelRecord> {\n return snapshot?.records ?? []\n}\n\nexport function getModelsDevProviderOptions(): Array<ModelsDevProviderOption> {\n return snapshot?.selectableProviders ?? []\n}\n\nexport function getModelsDevProviderModelIds(\n providerId: string,\n): Array<string> {\n return Object.keys(snapshot?.selectableProviderModelTypes[providerId] ?? {})\n}\n\nexport async function loadCachedModelsDevCatalog(): Promise<void> {\n if (!snapshot) {\n await loadDiskCache(\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\"),\n )\n }\n}\n\nexport function getModelsDevProviderApi(\n providerId: string,\n): string | undefined {\n return snapshot?.selectableProviders.find(\n (provider) => provider.id === providerId,\n )?.api\n}\n\nexport function getModelsDevModelProviderType(\n providerId: string,\n modelId: string,\n): ProviderType | undefined {\n return snapshot?.selectableProviderModelTypes[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelApi(\n providerId: string,\n modelId: string,\n): string | undefined {\n return snapshot?.selectableProviderModelApis[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelPricing(\n providerId: string,\n modelId: string,\n): TokenUsagePricingConfig | undefined {\n return snapshot?.selectableProviderModelPricing[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelMaxOutputTokens(\n providerId: string,\n modelId: string,\n): number | undefined {\n return snapshot?.modelOutputTokens[providerId]?.[modelId]\n}\n\nexport async function loadModelsDevProviderOptions(): Promise<\n Array<ModelsDevProviderOption>\n> {\n if (!snapshot) {\n const cachePath =\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n await loadDiskCache(cachePath)\n if (!snapshot) {\n await refreshCatalog(\n cachePath,\n fetch,\n new AbortController().signal,\n refreshGeneration,\n )\n activeCachePath = cachePath\n }\n }\n return getModelsDevProviderOptions()\n}\n\nexport async function stopModelsDevRefreshLoop(): Promise<void> {\n refreshGeneration += 1\n if (refreshTimer) clearTimeout(refreshTimer)\n refreshTimer = null\n refreshAbortController?.abort()\n await activeRefresh?.catch(() => undefined)\n activeRefresh = null\n}\n\nasync function loadDiskCache(cachePath: string): Promise<void> {\n let body: string\n try {\n body = await fs.readFile(cachePath, \"utf8\")\n installModelsDevCatalog(JSON.parse(body))\n cachedBodyHash = hashBody(body)\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev disk cache.\", error)\n return\n }\n\n try {\n const metadata = JSON.parse(\n await fs.readFile(getMetadataPath(cachePath), \"utf8\"),\n ) as unknown\n if (isRecord(metadata) && metadata.sha256 === cachedBodyHash) {\n responseValidator = {\n etag:\n typeof metadata.etag === \"string\" && metadata.etag.trim() ?\n metadata.etag\n : undefined,\n lastModified:\n (\n typeof metadata.lastModified === \"string\"\n && metadata.lastModified.trim()\n ) ?\n metadata.lastModified\n : undefined,\n }\n }\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev cache metadata.\", error)\n }\n}\n\nasync function persistMetadata(\n cachePath: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n const metadataPath = getMetadataPath(cachePath)\n const temporaryPath = `${metadataPath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(\n temporaryPath,\n JSON.stringify({ sha256, ...validator }),\n { mode: 0o600 },\n )\n await fs.rename(temporaryPath, metadataPath)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function persistCache(\n cachePath: string,\n body: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n const temporaryPath = `${cachePath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(temporaryPath, body, { mode: 0o600 })\n await fs.rename(temporaryPath, cachePath)\n await persistMetadata(cachePath, sha256, validator)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function refreshCatalog(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n signal: AbortSignal,\n generation: number,\n): Promise<void> {\n const headers = new Headers({ accept: \"application/json\" })\n if (snapshot && responseValidator?.etag) {\n headers.set(\"if-none-match\", responseValidator.etag)\n } else if (snapshot && responseValidator?.lastModified) {\n headers.set(\"if-modified-since\", responseValidator.lastModified)\n }\n const response = await fetcher(MODELS_DEV_URL, {\n headers,\n signal: AbortSignal.any([signal, AbortSignal.timeout(FETCH_TIMEOUT_MS)]),\n })\n if (signal.aborted || generation !== refreshGeneration) return\n if (response.status === 304) {\n if (!snapshot) {\n throw new Error(\"models.dev returned HTTP 304 without a cached catalog\")\n }\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? responseValidator?.etag,\n lastModified:\n response.headers.get(\"last-modified\")\n ?? responseValidator?.lastModified,\n }\n if (cachedBodyHash) {\n try {\n await persistMetadata(cachePath, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev cache metadata.\", error)\n }\n }\n consola.debug(\"models.dev catalog is unchanged\")\n return\n }\n if (!response.ok) {\n throw new Error(`models.dev returned HTTP ${response.status}`)\n }\n\n const body = await response.text()\n if (signal.aborted || generation !== refreshGeneration) return\n const nextSnapshot = parseCatalog(JSON.parse(body))\n snapshot = nextSnapshot\n cachedBodyHash = hashBody(body)\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? undefined,\n lastModified: response.headers.get(\"last-modified\") ?? undefined,\n }\n try {\n await persistCache(cachePath, body, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev disk cache.\", error)\n }\n consola.debug(\n `Loaded ${nextSnapshot.records.length} OpenCode Go models from models.dev`,\n )\n}\n\nfunction scheduleRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n): void {\n refreshTimer = setTimeout(() => {\n refreshTimer = null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n false,\n )\n }, intervalMs)\n}\n\nasync function runRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n required: boolean,\n): Promise<void> {\n const controller = new AbortController()\n refreshAbortController = controller\n let refreshed = false\n try {\n await refreshCatalog(cachePath, fetcher, controller.signal, generation)\n refreshed = true\n } catch (error) {\n if (required) {\n throw new Error(\n `Failed to fetch initial models.dev catalog: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n )\n }\n if (generation === refreshGeneration && !controller.signal.aborted) {\n consola.warn(\n \"Failed to refresh models.dev catalog; keeping cached models.\",\n error,\n )\n }\n } finally {\n if (refreshAbortController === controller) refreshAbortController = null\n if (generation === refreshGeneration && (!required || refreshed)) {\n scheduleRefresh(cachePath, fetcher, intervalMs, generation)\n }\n }\n}\n\nexport async function startModelsDevCache(\n options: ModelsDevCacheOptions = {},\n): Promise<void> {\n await stopModelsDevRefreshLoop()\n responseValidator = null\n const generation = refreshGeneration\n const cachePath =\n options.cachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n if (activeCachePath !== cachePath) {\n snapshot = null\n cachedBodyHash = null\n }\n activeCachePath = cachePath\n const fetcher = options.fetcher ?? fetch\n const intervalMs = options.intervalMs ?? REFRESH_INTERVAL_MS\n await loadDiskCache(cachePath)\n if (generation === refreshGeneration) {\n const required = snapshot === null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n required,\n )\n if (required) await activeRefresh\n }\n}\n","import consola from \"consola\"\n\nimport {\n SUPPORTED_PROVIDER_TYPES,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n type ModelConfig,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./config-store\"\nimport {\n getModelsDevModelApi,\n getModelsDevModelPricing,\n getModelsDevModelProviderType,\n getModelsDevProviderApi,\n getOpencodeGoModelProviderType,\n} from \"./models-dev-cache\"\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n modelsDevProviderId?: string\n apiKey: string\n authType: ProviderAuthType\n authTypeExplicit?: boolean\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n codexModels?: Array<string>\n}\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nexport function isSupportedProviderType(value: string): value is ProviderType {\n return SUPPORTED_PROVIDER_TYPES.includes(value as ProviderType)\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nexport function resolveProviderAuthType(\n providerName: string,\n authType: string | undefined,\n providerType: ProviderType,\n): ProviderAuthType {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n if (authType === undefined) {\n return defaultAuthType\n }\n\n if (authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"oauth2\") {\n if (providerName === \"codex\" || providerName === \"xai\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has authType 'oauth2', which is only supported by the builtin codex and xai providers, falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n }\n\n if (authType === \"authorization\" || authType === \"azure-entra\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n}\n\nfunction isProviderApiKeyRequired(\n providerName: string,\n authType: ProviderAuthType,\n): boolean {\n return (\n authType !== \"azure-entra\"\n && !(\n (providerName === \"codex\" || providerName === \"xai\")\n && authType === \"oauth2\"\n )\n )\n}\n\nexport function getRawProviderConfig(name: string): ProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n return config.providers?.[providerName] ?? null\n}\n\nexport function setProviderConfig(\n name: string,\n provider: ProviderConfig,\n): ProviderConfig {\n const providerName = name.trim()\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (isReservedProviderName(providerName)) {\n throw new Error(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const nextConfig = {\n ...editableConfig,\n providers: {\n ...editableConfig.providers,\n [providerName]: provider,\n },\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getRawProviderConfig(providerName) ?? provider\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n if (isReservedProviderName(providerName)) {\n consola.warn(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n return null\n }\n\n const provider = getRawProviderConfig(providerName)\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? \"anthropic\"\n if (!isSupportedProviderType(type)) {\n consola.warn(\n `Provider ${providerName} is ignored because type '${type}' is not supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const authType = resolveProviderAuthType(\n providerName,\n provider.authType,\n type,\n )\n const apiKey = (provider.apiKey ?? \"\").trim()\n const missingFields = [\n ...(baseUrl ? [] : [\"baseUrl\"]),\n ...(isProviderApiKeyRequired(providerName, authType) && !apiKey ?\n [\"apiKey\"]\n : []),\n ]\n\n if (missingFields.length > 0) {\n consola.warn(\n `Provider ${providerName} is enabled but missing ${missingFields.join(\" or \")}`,\n )\n return null\n }\n\n return {\n name: providerName,\n type,\n baseUrl,\n modelsDevProviderId: provider.modelsDevProviderId,\n apiKey,\n authType,\n authTypeExplicit: provider.authType !== undefined,\n pricingCurrency: normalizePricingCurrency(provider.pricingCurrency),\n models: provider.models,\n codexModels: provider.codexModels,\n }\n}\n\nexport function resolveEffectiveProviderType(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ProviderType {\n const modelConfig = providerConfig.models?.[model]\n if (modelConfig?.type && isSupportedProviderType(modelConfig.type)) {\n return modelConfig.type\n }\n\n if (providerConfig.name === \"opencode-go\") {\n return getOpencodeGoModelProviderType(model)\n }\n\n if (providerConfig.modelsDevProviderId) {\n const catalogType = getModelsDevModelProviderType(\n providerConfig.modelsDevProviderId,\n model,\n )\n if (catalogType) return catalogType\n }\n\n if (providerConfig.name === \"openrouter\") {\n if (model.includes(\"gpt-\")) {\n return \"openai-responses\"\n }\n }\n\n return providerConfig.type\n}\n\nexport function resolveProviderConfigForModel(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ResolvedProviderConfig {\n const type = resolveEffectiveProviderType(providerConfig, model)\n const modelApi =\n (\n providerConfig.modelsDevProviderId\n && providerConfig.baseUrl\n === getModelsDevProviderApi(providerConfig.modelsDevProviderId)\n ) ?\n getModelsDevModelApi(providerConfig.modelsDevProviderId, model)\n : undefined\n const configuredModel = providerConfig.models?.[model]\n const catalogPricing =\n providerConfig.modelsDevProviderId ?\n getModelsDevModelPricing(providerConfig.modelsDevProviderId, model)\n : undefined\n const useCatalogPricing =\n catalogPricing !== undefined && configuredModel?.pricing === undefined\n if (type === providerConfig.type && !modelApi && !useCatalogPricing) {\n return providerConfig\n }\n\n return {\n ...providerConfig,\n type,\n baseUrl: modelApi ?? providerConfig.baseUrl,\n models:\n useCatalogPricing ?\n {\n ...providerConfig.models,\n [model]: { ...configuredModel, pricing: catalogPricing },\n }\n : providerConfig.models,\n pricingCurrency: useCatalogPricing ? \"USD\" : providerConfig.pricingCurrency,\n authType:\n (\n type !== providerConfig.type\n && !providerConfig.authTypeExplicit\n && providerConfig.authType !== \"azure-entra\"\n && providerConfig.authType !== \"oauth2\"\n ) ?\n resolveProviderAuthType(providerConfig.name, undefined, type)\n : providerConfig.authType,\n }\n}\n\nfunction normalizePricingCurrency(\n value: string | undefined,\n): string | undefined {\n const currency = value?.trim().toUpperCase()\n return currency || undefined\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter(\n (name) => !isReservedProviderName(name) && getProviderConfig(name) !== null,\n )\n}\n\nexport function isReservedProviderName(name: string): boolean {\n return name.trim() === \"copilot\" || name.trim() === \"github-copilot\"\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config-D1F-TyTn.js","names":[],"sources":["../src/lib/model-policy.ts","../src/lib/models-dev-cache.ts","../src/lib/provider-config.ts"],"sourcesContent":["import {\n defaultConfig,\n defaultContextManagement,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n} from \"./config-store\"\n\nconst GPT_MODEL_PATTERN = /^gpt-(\\d+)(?:\\.(\\d+))?/\n\nfunction isGpt53OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 3\n}\n\nexport function isGpt56OrAbove(model: string): boolean {\n const match = GPT_MODEL_PATTERN.exec(model)\n if (!match) {\n return false\n }\n const majorVersion = Number.parseInt(match[1], 10)\n if (majorVersion > 5) {\n return true\n }\n if (majorVersion !== 5) {\n return false\n }\n const minorVersion = match[2] ? Number.parseInt(match[2], 10) : 0\n return minorVersion >= 6\n}\n\nconst gpt5CommentaryPrompt = `# Working with the user\n\nYou interact with the user through a terminal. You have 2 ways of communicating with the users: \n- Share intermediary updates in \\`commentary\\` channel. \n- After you have completed all your work, send a message to the \\`final\\` channel. \n\n## Intermediary updates\n\n- Intermediary updates go to the \\`commentary\\` channel.\n- User updates are short updates while you are working, they are NOT final answers.\n- You use 1-2 sentence user updates to communicate progress and new information to the user as you are doing work.\n- Do not begin responses with conversational interjections or meta commentary. Avoid openers such as acknowledgements (“Done —”, “Got it”, “Great question, ”) or framing phrases.\n- You provide user updates frequently, every 20s.\n- Before exploring or doing substantial work, you start with a user update acknowledging the request and explaining your first step. You should include your understanding of the user request and explain what you will do. Avoid commenting on the request or using starters such as \"Got it -\" or \"Understood -\" etc.\n- When exploring, e.g. searching, reading files, you provide user updates as you go, every 20s, explaining what context you are gathering and what you've learned. Vary your sentence structure when providing these updates to avoid sounding repetitive - in particular, don't start each sentence the same way.\n- After you have sufficient context, and the work is substantial, you provide a longer plan (this is the only user update that may be longer than 2 sentences and can contain formatting).\n- Before performing file edits of any kind, you provide updates explaining what edits you are making.\n- As you are thinking, you very frequently provide updates even if not taking any actions, informing the user of your progress. You interrupt your thinking and send multiple updates in a row if thinking for more than 100 words.\n- Tone of your updates MUST match your personality.`\n\nexport function getExtraPromptForModel(model: string): string {\n const config = getConfig()\n const userPrompt = config.extraPrompts?.[model]\n if (userPrompt !== undefined) {\n return userPrompt\n }\n return isGpt53OrAbove(model) ? gpt5CommentaryPrompt : \"\"\n}\n\nexport function getModelMappings(): Record<string, string> {\n const config = getConfig()\n const modelMappings = config.modelMappings\n if (!modelMappings) {\n return { ...defaultConfig.modelMappings }\n }\n\n const validMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (\n !sourceModel\n || typeof targetModel !== \"string\"\n || targetModel.length === 0\n ) {\n continue\n }\n validMappings[sourceModel] = targetModel\n }\n\n return validMappings\n}\n\nfunction validateModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const validatedMappings: Record<string, string> = {}\n for (const [sourceModel, targetModel] of Object.entries(modelMappings)) {\n if (!sourceModel || !targetModel) {\n throw new Error(\n \"Each model mapping must use non-empty source and target values.\",\n )\n }\n validatedMappings[sourceModel] = targetModel\n }\n\n return validatedMappings\n}\n\nexport function setModelMappings(\n modelMappings: Record<string, string>,\n): Record<string, string> {\n const nextConfig = {\n ...readEditableConfigFromDisk(),\n modelMappings: validateModelMappings(modelMappings),\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getModelMappings()\n}\n\nexport function resolveMappedModel(model: string): string {\n return getModelMappings()[model] ?? model\n}\n\nexport function getSmallModel(): string {\n return getSmallModelForProvider(\"copilot\") ?? \"gpt-6-luna\"\n}\n\nexport function getSmallModelForProvider(provider: string): string | undefined {\n const providerName = provider.trim()\n const configuredModels = getConfig().smallModels\n const model =\n configuredModels && Object.hasOwn(configuredModels, providerName) ?\n configuredModels[providerName]\n : defaultConfig.smallModels?.[providerName]\n\n return typeof model === \"string\" ? model.trim() || undefined : undefined\n}\n\nexport function isContextManagementEnabledForMessages(): boolean {\n const config = getConfig()\n return config.contextManagement?.messages ?? defaultContextManagement.messages\n}\n\nexport function isContextManagementEnabledForResponses(): boolean {\n const config = getConfig()\n return (\n config.contextManagement?.responses ?? defaultContextManagement.responses\n )\n}\n\nexport function getModelResponsesApiCompactThreshold(\n model: string,\n): number | undefined {\n const config = getConfig()\n const threshold = config.modelResponsesApiCompactThresholds?.[model]\n\n if (\n typeof threshold !== \"number\"\n || !Number.isFinite(threshold)\n || threshold <= 0\n ) {\n return undefined\n }\n\n return threshold\n}\n\nexport function getReasoningEffortForModel(\n model: string,\n): \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" {\n const config = getConfig()\n const userEffort = config.modelReasoningEfforts?.[model]\n if (userEffort !== undefined) {\n return userEffort\n }\n return isGpt53OrAbove(model) ? \"xhigh\" : \"high\"\n}\n","import { createHash, randomUUID } from \"node:crypto\"\nimport fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type {\n Cost as ModelsDevCost,\n Model as ModelsDevModel,\n ModelCost as ModelsDevModelCost,\n ProviderMap as ModelsDevProviderMap,\n} from \"@opencode-ai/models\"\nimport consola from \"consola\"\n\nimport type {\n BuiltinProviderInputModality,\n BuiltinProviderModelConfig,\n} from \"./builtin-provider-models\"\nimport type {\n CodexReasoningEffort,\n ModelReasoningField,\n ProviderType,\n} from \"./config-store\"\nimport { PATHS } from \"./paths\"\nimport type {\n TokenUsagePricingConfig,\n TokenUsagePricingTier,\n} from \"./token-usage/pricing\"\n\nconst MODELS_DEV_URL = \"https://models.dev/api.json\"\nconst REFRESH_INTERVAL_MS = 5 * 60 * 1000\nconst FETCH_TIMEOUT_MS = 15_000\nconst OPENCODE_GO = \"opencode-go\"\nconst REASONING_EFFORTS = new Set<CodexReasoningEffort>([\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"ultra\",\n])\n\ninterface ModelRecord {\n [key: string]: string | number | Array<string> | undefined\n id: string\n name: string\n object: \"model\"\n created: number\n owned_by: typeof OPENCODE_GO\n context_window?: number\n max_output_tokens?: number\n input_modalities?: Array<BuiltinProviderInputModality>\n reasoning_efforts?: Array<CodexReasoningEffort>\n}\ntype ModelsDevFetcher = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>\n\ninterface CatalogSnapshot {\n configs: Record<string, BuiltinProviderModelConfig>\n providerTypes: Record<string, ProviderType>\n records: Array<ModelRecord>\n modelOutputTokens: Record<string, Record<string, number>>\n selectableProviders: Array<ModelsDevProviderOption>\n selectableProviderModelTypes: Record<string, Record<string, ProviderType>>\n selectableProviderModelApis: Record<string, Record<string, string>>\n selectableProviderModelPricing: Record<\n string,\n Record<string, TokenUsagePricingConfig>\n >\n}\n\nexport interface ModelsDevProviderOption {\n id: string\n name: string\n api: string\n type: ProviderType\n}\n\ninterface ResponseValidator {\n etag?: string\n lastModified?: string\n}\n\nexport interface ModelsDevCacheOptions {\n cachePath?: string\n fetcher?: ModelsDevFetcher\n intervalMs?: number\n}\n\nlet snapshot: CatalogSnapshot | null = null\nlet refreshTimer: ReturnType<typeof setTimeout> | null = null\nlet refreshGeneration = 0\nlet responseValidator: ResponseValidator | null = null\nlet cachedBodyHash: string | null = null\nlet activeCachePath: string | null = null\nlet refreshAbortController: AbortController | null = null\nlet activeRefresh: Promise<void> | null = null\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction getMetadataPath(cachePath: string): string {\n const extension = path.extname(cachePath)\n return path.join(\n path.dirname(cachePath),\n `${path.basename(cachePath, extension)}.meta.json`,\n )\n}\n\nfunction hashBody(body: string): string {\n return createHash(\"sha256\").update(body).digest(\"hex\")\n}\n\nfunction nonNegativeNumber(value: number | undefined): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ?\n value\n : undefined\n}\n\nfunction positiveNumber(value: number | undefined): number | undefined {\n const number = nonNegativeNumber(value)\n return number && number > 0 ? number : undefined\n}\n\nfunction mapPriceTier(value: ModelsDevCost): TokenUsagePricingTier {\n const input = nonNegativeNumber(value.input)\n const output = nonNegativeNumber(value.output)\n const cachedInput = nonNegativeNumber(value.cache_read)\n const cacheCreationInput = nonNegativeNumber(value.cache_write)\n return {\n ...(input !== undefined && { input }),\n ...(output !== undefined && { output }),\n ...(cachedInput !== undefined && { cachedInput }),\n ...(cacheCreationInput !== undefined && { cacheCreationInput }),\n }\n}\n\nfunction mapPricing(\n value: ModelsDevModelCost | undefined,\n): TokenUsagePricingConfig | undefined {\n if (!isRecord(value)) return undefined\n\n const base = mapPriceTier(value)\n const higherTiers = (Array.isArray(value.tiers) ? value.tiers : [])\n .flatMap((tier) => {\n const threshold = positiveNumber(tier?.tier?.size)\n return threshold && threshold >= 1 && tier.tier.type === \"context\" ?\n [{ threshold, price: mapPriceTier(tier) }]\n : []\n })\n .sort((a, b) => a.threshold - b.threshold)\n\n if (higherTiers.length === 0) return base\n\n const firstTierMax = Math.ceil(higherTiers[0].threshold) - 1\n const tiers: Array<TokenUsagePricingTier> = [\n ...(firstTierMax > 0 ? [{ ...base, maxInputTokens: firstTierMax }] : []),\n ...higherTiers.map((tier, index) => ({\n ...tier.price,\n ...(higherTiers[index + 1] && {\n maxInputTokens: Math.ceil(higherTiers[index + 1].threshold) - 1,\n }),\n })),\n ]\n return { tiers }\n}\n\nfunction mapReasoningEfforts(\n value: ModelsDevModel[\"reasoning_options\"],\n): Array<CodexReasoningEffort> {\n if (!Array.isArray(value)) return []\n const efforts: Array<string | null> = []\n for (const option of value) {\n if (option?.type === \"effort\" && Array.isArray(option.values)) {\n efforts.push(...option.values)\n }\n }\n return [\n ...new Set(\n efforts.filter(\n (effort): effort is CodexReasoningEffort =>\n typeof effort === \"string\"\n && REASONING_EFFORTS.has(effort as CodexReasoningEffort),\n ),\n ),\n ]\n}\n\nfunction mapInputModalities(\n value: ModelsDevModel[\"modalities\"],\n): Array<BuiltinProviderInputModality> {\n if (!isRecord(value) || !Array.isArray(value.input)) return []\n return [\n ...new Set(\n value.input.filter(\n (modality): modality is BuiltinProviderInputModality =>\n modality === \"text\" || modality === \"image\",\n ),\n ),\n ]\n}\n\nfunction mapReasoningField(\n model: ModelsDevModel,\n): ModelReasoningField | undefined {\n const interleaved = model.interleaved\n const field = isRecord(interleaved) ? interleaved.field : interleaved\n if (field === \"reasoning_content\") return field\n // models.dev omits `interleaved` for the Hy family, whose Chat Completions\n // history expects the OpenRouter-style `reasoning` field.\n if (model.family === \"Hy\") return \"reasoning\"\n return undefined\n}\n\nfunction mapModelConfig(model: ModelsDevModel): BuiltinProviderModelConfig {\n const contextWindow = positiveNumber(model.limit?.context)\n const maxOutputTokens = positiveNumber(model.limit?.output)\n const reasoningEfforts = mapReasoningEfforts(model.reasoning_options)\n const inputModalities = mapInputModalities(model.modalities)\n const reasoningField = mapReasoningField(model)\n const pricing = mapPricing(model.cost)\n const defaultReasoningEffort =\n (\n (model.family === \"Hy\" || model.family === \"grok\")\n && reasoningEfforts.includes(\"high\")\n ) ?\n \"high\"\n : undefined\n return {\n ...(contextWindow && { contextWindow }),\n ...(maxOutputTokens && { maxOutputTokens }),\n ...(inputModalities.length > 0 && { inputModalities }),\n ...(reasoningEfforts.length > 0 && { reasoningEfforts }),\n ...(defaultReasoningEffort && { defaultReasoningEffort }),\n ...(reasoningField && { reasoningField }),\n ...(pricing && { pricing }),\n }\n}\n\nfunction mapProviderType(\n model: ModelsDevModel,\n providerNpm: string | undefined,\n): ProviderType {\n switch (model.provider?.npm || providerNpm) {\n case \"@ai-sdk/anthropic\":\n return \"anthropic\"\n case \"@ai-sdk/openai\":\n return model.provider?.shape === \"completions\" ?\n \"openai-compatible\"\n : \"openai-responses\"\n case \"@ai-sdk/openai-compatible\":\n default:\n return \"openai-compatible\"\n }\n}\n\nfunction normalizeCatalogApi(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.includes(\"${\")) return undefined\n const api = value.trim().replace(/\\/+$/u, \"\")\n let url: URL\n try {\n url = new URL(api)\n } catch {\n return undefined\n }\n if (\n (url.protocol !== \"https:\" && url.protocol !== \"http:\")\n || url.username\n || url.password\n || url.search\n || url.hash\n ) {\n return undefined\n }\n return api\n}\n\nfunction parseSelectableProviders(\n data: Record<string, unknown>,\n): Pick<\n CatalogSnapshot,\n | \"selectableProviders\"\n | \"selectableProviderModelTypes\"\n | \"selectableProviderModelApis\"\n | \"selectableProviderModelPricing\"\n> {\n const selectableProviders: Array<ModelsDevProviderOption> = []\n const selectableProviderModelTypes: Record<\n string,\n Record<string, ProviderType>\n > = Object.create(null) as Record<string, Record<string, ProviderType>>\n const selectableProviderModelApis: Record<\n string,\n Record<string, string>\n > = Object.create(null) as Record<string, Record<string, string>>\n const selectableProviderModelPricing: Record<\n string,\n Record<string, TokenUsagePricingConfig>\n > = Object.create(null) as Record<\n string,\n Record<string, TokenUsagePricingConfig>\n >\n\n for (const [id, value] of Object.entries(data)) {\n if (\n id === \"openrouter\"\n || id === \"github-copilot\"\n || id === \"opencode-go\"\n || id === \"copilot\"\n || id === \"codex\"\n || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/u.test(id)\n || !isRecord(value)\n || (value.npm !== \"@ai-sdk/openai-compatible\"\n && value.npm !== \"@ai-sdk/openai\"\n && value.npm !== \"@ai-sdk/anthropic\")\n ) {\n continue\n }\n\n const api = normalizeCatalogApi(value.api)\n if (!api) continue\n\n selectableProviders.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ?\n value.name.trim()\n : id,\n api,\n type:\n value.npm === \"@ai-sdk/openai\" ? \"openai-responses\"\n : value.npm === \"@ai-sdk/anthropic\" ? \"anthropic\"\n : \"openai-compatible\",\n })\n\n const modelTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const modelApis: Record<string, string> = Object.create(null) as Record<\n string,\n string\n >\n const modelPricing: Record<string, TokenUsagePricingConfig> = Object.create(\n null,\n ) as Record<string, TokenUsagePricingConfig>\n if (isRecord(value.models)) {\n for (const [modelId, model] of Object.entries(value.models)) {\n if (!isRecord(model) || model.status === \"deprecated\") continue\n const modelProvider = isRecord(model.provider) ? model.provider : null\n const modelNpm = modelProvider?.npm ?? value.npm\n if (\n modelNpm !== \"@ai-sdk/openai-compatible\"\n && modelNpm !== \"@ai-sdk/openai\"\n && modelNpm !== \"@ai-sdk/anthropic\"\n ) {\n continue\n }\n const type = mapProviderType(\n model as unknown as ModelsDevModel,\n value.npm,\n )\n modelTypes[modelId] = type\n const modelApi = normalizeCatalogApi(modelProvider?.api)\n if (modelApi) modelApis[modelId] = modelApi\n const pricing = mapPricing((model as unknown as ModelsDevModel).cost)\n if (pricing) modelPricing[modelId] = pricing\n }\n }\n selectableProviderModelTypes[id] = modelTypes\n selectableProviderModelApis[id] = modelApis\n selectableProviderModelPricing[id] = modelPricing\n }\n\n selectableProviders.sort(\n (a, b) =>\n a.name.localeCompare(b.name, \"en\") || a.id.localeCompare(b.id, \"en\"),\n )\n return {\n selectableProviders,\n selectableProviderModelTypes,\n selectableProviderModelApis,\n selectableProviderModelPricing,\n }\n}\n\nfunction parseModelOutputTokens(\n data: Record<string, unknown>,\n): CatalogSnapshot[\"modelOutputTokens\"] {\n const providers = Object.create(null) as CatalogSnapshot[\"modelOutputTokens\"]\n for (const [providerId, provider] of Object.entries(data)) {\n if (!isRecord(provider) || !isRecord(provider.models)) continue\n const models = Object.create(null) as Record<string, number>\n for (const [modelId, model] of Object.entries(provider.models)) {\n if (!isRecord(model) || model.status === \"deprecated\") continue\n const output = positiveNumber(\n (model as unknown as ModelsDevModel).limit?.output,\n )\n if (output !== undefined && Number.isInteger(output)) {\n models[modelId] = output\n }\n }\n providers[providerId] = models\n }\n return providers\n}\n\nfunction parseCatalog(data: unknown): CatalogSnapshot {\n const provider = isRecord(data) ? data[OPENCODE_GO] : undefined\n const models = isRecord(provider) ? provider.models : undefined\n if (!isRecord(models)) {\n throw new Error(\"models.dev response has no opencode-go models\")\n }\n const providerNpm =\n isRecord(provider) && typeof provider.npm === \"string\" ?\n provider.npm\n : undefined\n\n const configs: Record<string, BuiltinProviderModelConfig> = Object.create(\n null,\n ) as Record<string, BuiltinProviderModelConfig>\n const providerTypes: Record<string, ProviderType> = Object.create(\n null,\n ) as Record<string, ProviderType>\n const records: Array<ModelRecord> = []\n const typedModels = models as ModelsDevProviderMap[string][\"models\"]\n for (const id of Object.keys(typedModels).sort()) {\n const value = typedModels[id]\n if (\n !id.trim()\n || !isRecord(value)\n || value.id !== id\n || value.status === \"deprecated\"\n )\n continue\n const config = mapModelConfig(value)\n configs[id] = config\n providerTypes[id] = mapProviderType(value, providerNpm)\n records.push({\n id,\n name:\n typeof value.name === \"string\" && value.name.trim() ? value.name : id,\n object: \"model\",\n created: 0,\n owned_by: OPENCODE_GO,\n ...(config.contextWindow && { context_window: config.contextWindow }),\n ...(config.maxOutputTokens && {\n max_output_tokens: config.maxOutputTokens,\n }),\n ...(config.inputModalities && {\n input_modalities: config.inputModalities,\n }),\n ...(config.reasoningEfforts && {\n reasoning_efforts: config.reasoningEfforts,\n }),\n })\n }\n\n if (records.length === 0) {\n throw new Error(\"models.dev response has no valid opencode-go models\")\n }\n return {\n configs,\n providerTypes,\n records,\n modelOutputTokens: parseModelOutputTokens(data as Record<string, unknown>),\n ...parseSelectableProviders(data as Record<string, unknown>),\n }\n}\n\nexport function installModelsDevCatalog(data: unknown): number {\n snapshot = parseCatalog(data)\n return snapshot.records.length\n}\n\nexport function getOpencodeGoModelIds(): Array<string> {\n return snapshot?.records.map((model) => model.id) ?? []\n}\n\nexport function getOpencodeGoModelConfig(\n modelId: string,\n): BuiltinProviderModelConfig | undefined {\n return (\n snapshot?.configs[modelId.trim()]\n ?? snapshot?.configs[modelId.trim().toLowerCase()]\n )\n}\n\nexport function getOpencodeGoModelProviderType(modelId: string): ProviderType {\n const id = modelId.trim()\n return (\n snapshot?.providerTypes[id]\n ?? snapshot?.providerTypes[id.toLowerCase()]\n ?? \"openai-compatible\"\n )\n}\n\nexport function getOpencodeGoModelRecords(): Array<ModelRecord> {\n return snapshot?.records ?? []\n}\n\nexport function getModelsDevProviderOptions(): Array<ModelsDevProviderOption> {\n return snapshot?.selectableProviders ?? []\n}\n\nexport function getModelsDevProviderModelIds(\n providerId: string,\n): Array<string> {\n return Object.keys(snapshot?.selectableProviderModelTypes[providerId] ?? {})\n}\n\nexport async function loadCachedModelsDevCatalog(): Promise<void> {\n if (!snapshot) {\n await loadDiskCache(\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\"),\n )\n }\n}\n\nexport function getModelsDevProviderApi(\n providerId: string,\n): string | undefined {\n return snapshot?.selectableProviders.find(\n (provider) => provider.id === providerId,\n )?.api\n}\n\nexport function getModelsDevModelProviderType(\n providerId: string,\n modelId: string,\n): ProviderType | undefined {\n return snapshot?.selectableProviderModelTypes[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelApi(\n providerId: string,\n modelId: string,\n): string | undefined {\n return snapshot?.selectableProviderModelApis[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelPricing(\n providerId: string,\n modelId: string,\n): TokenUsagePricingConfig | undefined {\n return snapshot?.selectableProviderModelPricing[providerId]?.[modelId]\n}\n\nexport function getModelsDevModelMaxOutputTokens(\n providerId: string,\n modelId: string,\n): number | undefined {\n return snapshot?.modelOutputTokens[providerId]?.[modelId]\n}\n\nexport async function loadModelsDevProviderOptions(): Promise<\n Array<ModelsDevProviderOption>\n> {\n if (!snapshot) {\n const cachePath =\n activeCachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n await loadDiskCache(cachePath)\n if (!snapshot) {\n await refreshCatalog(\n cachePath,\n fetch,\n new AbortController().signal,\n refreshGeneration,\n )\n activeCachePath = cachePath\n }\n }\n return getModelsDevProviderOptions()\n}\n\nexport async function stopModelsDevRefreshLoop(): Promise<void> {\n refreshGeneration += 1\n if (refreshTimer) clearTimeout(refreshTimer)\n refreshTimer = null\n refreshAbortController?.abort()\n await activeRefresh?.catch(() => undefined)\n activeRefresh = null\n}\n\nasync function loadDiskCache(cachePath: string): Promise<void> {\n let body: string\n try {\n body = await fs.readFile(cachePath, \"utf8\")\n installModelsDevCatalog(JSON.parse(body))\n cachedBodyHash = hashBody(body)\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev disk cache.\", error)\n return\n }\n\n try {\n const metadata = JSON.parse(\n await fs.readFile(getMetadataPath(cachePath), \"utf8\"),\n ) as unknown\n if (isRecord(metadata) && metadata.sha256 === cachedBodyHash) {\n responseValidator = {\n etag:\n typeof metadata.etag === \"string\" && metadata.etag.trim() ?\n metadata.etag\n : undefined,\n lastModified:\n (\n typeof metadata.lastModified === \"string\"\n && metadata.lastModified.trim()\n ) ?\n metadata.lastModified\n : undefined,\n }\n }\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") return\n consola.warn(\"Failed to load models.dev cache metadata.\", error)\n }\n}\n\nasync function persistMetadata(\n cachePath: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n const metadataPath = getMetadataPath(cachePath)\n const temporaryPath = `${metadataPath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(\n temporaryPath,\n JSON.stringify({ sha256, ...validator }),\n { mode: 0o600 },\n )\n await fs.rename(temporaryPath, metadataPath)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function persistCache(\n cachePath: string,\n body: string,\n sha256: string,\n validator: ResponseValidator | null,\n): Promise<void> {\n await fs.mkdir(path.dirname(cachePath), { recursive: true })\n const temporaryPath = `${cachePath}.${randomUUID()}.tmp`\n try {\n await fs.writeFile(temporaryPath, body, { mode: 0o600 })\n await fs.rename(temporaryPath, cachePath)\n await persistMetadata(cachePath, sha256, validator)\n } finally {\n await fs.rm(temporaryPath, { force: true })\n }\n}\n\nasync function refreshCatalog(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n signal: AbortSignal,\n generation: number,\n): Promise<void> {\n const headers = new Headers({ accept: \"application/json\" })\n if (snapshot && responseValidator?.etag) {\n headers.set(\"if-none-match\", responseValidator.etag)\n } else if (snapshot && responseValidator?.lastModified) {\n headers.set(\"if-modified-since\", responseValidator.lastModified)\n }\n const response = await fetcher(MODELS_DEV_URL, {\n headers,\n signal: AbortSignal.any([signal, AbortSignal.timeout(FETCH_TIMEOUT_MS)]),\n })\n if (signal.aborted || generation !== refreshGeneration) return\n if (response.status === 304) {\n if (!snapshot) {\n throw new Error(\"models.dev returned HTTP 304 without a cached catalog\")\n }\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? responseValidator?.etag,\n lastModified:\n response.headers.get(\"last-modified\")\n ?? responseValidator?.lastModified,\n }\n if (cachedBodyHash) {\n try {\n await persistMetadata(cachePath, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev cache metadata.\", error)\n }\n }\n consola.debug(\"models.dev catalog is unchanged\")\n return\n }\n if (!response.ok) {\n throw new Error(`models.dev returned HTTP ${response.status}`)\n }\n\n const body = await response.text()\n if (signal.aborted || generation !== refreshGeneration) return\n const nextSnapshot = parseCatalog(JSON.parse(body))\n snapshot = nextSnapshot\n cachedBodyHash = hashBody(body)\n responseValidator = {\n etag: response.headers.get(\"etag\") ?? undefined,\n lastModified: response.headers.get(\"last-modified\") ?? undefined,\n }\n try {\n await persistCache(cachePath, body, cachedBodyHash, responseValidator)\n } catch (error) {\n consola.warn(\"Failed to save models.dev disk cache.\", error)\n }\n consola.debug(\n `Loaded ${nextSnapshot.records.length} OpenCode Go models from models.dev`,\n )\n}\n\nfunction scheduleRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n): void {\n refreshTimer = setTimeout(() => {\n refreshTimer = null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n false,\n )\n }, intervalMs)\n}\n\nasync function runRefresh(\n cachePath: string,\n fetcher: ModelsDevFetcher,\n intervalMs: number,\n generation: number,\n required: boolean,\n): Promise<void> {\n const controller = new AbortController()\n refreshAbortController = controller\n let refreshed = false\n try {\n await refreshCatalog(cachePath, fetcher, controller.signal, generation)\n refreshed = true\n } catch (error) {\n if (required) {\n throw new Error(\n `Failed to fetch initial models.dev catalog: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n )\n }\n if (generation === refreshGeneration && !controller.signal.aborted) {\n consola.warn(\n \"Failed to refresh models.dev catalog; keeping cached models.\",\n error,\n )\n }\n } finally {\n if (refreshAbortController === controller) refreshAbortController = null\n if (generation === refreshGeneration && (!required || refreshed)) {\n scheduleRefresh(cachePath, fetcher, intervalMs, generation)\n }\n }\n}\n\nexport async function startModelsDevCache(\n options: ModelsDevCacheOptions = {},\n): Promise<void> {\n await stopModelsDevRefreshLoop()\n responseValidator = null\n const generation = refreshGeneration\n const cachePath =\n options.cachePath ?? path.join(PATHS.APP_DIR, \"models-dev-api.json\")\n if (activeCachePath !== cachePath) {\n snapshot = null\n cachedBodyHash = null\n }\n activeCachePath = cachePath\n const fetcher = options.fetcher ?? fetch\n const intervalMs = options.intervalMs ?? REFRESH_INTERVAL_MS\n await loadDiskCache(cachePath)\n if (generation === refreshGeneration) {\n const required = snapshot === null\n activeRefresh = runRefresh(\n cachePath,\n fetcher,\n intervalMs,\n generation,\n required,\n )\n if (required) await activeRefresh\n }\n}\n","import consola from \"consola\"\n\nimport {\n SUPPORTED_PROVIDER_TYPES,\n getConfig,\n readEditableConfigFromDisk,\n reloadConfig,\n writeConfigToDisk,\n type ModelConfig,\n type ProviderAuthType,\n type ProviderConfig,\n type ProviderType,\n} from \"./config-store\"\nimport {\n getModelsDevModelApi,\n getModelsDevModelPricing,\n getModelsDevModelProviderType,\n getModelsDevProviderApi,\n getOpencodeGoModelProviderType,\n} from \"./models-dev-cache\"\n\nexport interface ResolvedProviderConfig {\n name: string\n type: ProviderType\n baseUrl: string\n modelsDevProviderId?: string\n apiKey: string\n authType: ProviderAuthType\n authTypeExplicit?: boolean\n pricingCurrency?: string\n models?: Record<string, ModelConfig>\n agentsModels?: Array<string>\n}\n\nexport function normalizeProviderBaseUrl(url: string): string {\n return url.trim().replace(/\\/+$/u, \"\")\n}\n\nexport function isSupportedProviderType(value: string): value is ProviderType {\n return SUPPORTED_PROVIDER_TYPES.includes(value as ProviderType)\n}\n\nfunction getDefaultProviderAuthType(\n providerType: ProviderType,\n): ProviderAuthType {\n return providerType === \"anthropic\" ? \"x-api-key\" : \"authorization\"\n}\n\nexport function resolveProviderAuthType(\n providerName: string,\n authType: string | undefined,\n providerType: ProviderType,\n): ProviderAuthType {\n const defaultAuthType = getDefaultProviderAuthType(providerType)\n if (authType === undefined) {\n return defaultAuthType\n }\n\n if (authType === \"x-api-key\") {\n return \"x-api-key\"\n }\n\n if (authType === \"oauth2\") {\n if (providerName === \"codex\" || providerName === \"xai\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has authType 'oauth2', which is only supported by the builtin codex and xai providers, falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n }\n\n if (authType === \"authorization\" || authType === \"azure-entra\") {\n return authType\n }\n\n consola.warn(\n `Provider ${providerName} has invalid authType '${authType}', falling back to ${defaultAuthType}`,\n )\n return defaultAuthType\n}\n\nfunction isProviderApiKeyRequired(\n providerName: string,\n authType: ProviderAuthType,\n): boolean {\n return (\n authType !== \"azure-entra\"\n && !(\n (providerName === \"codex\" || providerName === \"xai\")\n && authType === \"oauth2\"\n )\n )\n}\n\nexport function getRawProviderConfig(name: string): ProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n const config = getConfig()\n return config.providers?.[providerName] ?? null\n}\n\nexport function setProviderConfig(\n name: string,\n provider: ProviderConfig,\n): ProviderConfig {\n const providerName = name.trim()\n if (!providerName) {\n throw new Error(\"Provider name must be a non-empty string\")\n }\n\n if (isReservedProviderName(providerName)) {\n throw new Error(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n }\n\n const editableConfig = readEditableConfigFromDisk()\n const nextConfig = {\n ...editableConfig,\n providers: {\n ...editableConfig.providers,\n [providerName]: provider,\n },\n }\n\n writeConfigToDisk(nextConfig)\n reloadConfig()\n return getRawProviderConfig(providerName) ?? provider\n}\n\nexport function getProviderConfig(name: string): ResolvedProviderConfig | null {\n const providerName = name.trim()\n if (!providerName) {\n return null\n }\n\n if (isReservedProviderName(providerName)) {\n consola.warn(\n `Provider ${providerName} is reserved and cannot be configured in config.providers`,\n )\n return null\n }\n\n const provider = getRawProviderConfig(providerName)\n if (!provider) {\n return null\n }\n\n if (provider.enabled === false) {\n return null\n }\n\n const type = provider.type ?? \"anthropic\"\n if (!isSupportedProviderType(type)) {\n consola.warn(\n `Provider ${providerName} is ignored because type '${type}' is not supported`,\n )\n return null\n }\n\n const baseUrl = normalizeProviderBaseUrl(provider.baseUrl ?? \"\")\n const authType = resolveProviderAuthType(\n providerName,\n provider.authType,\n type,\n )\n const apiKey = (provider.apiKey ?? \"\").trim()\n const missingFields = [\n ...(baseUrl ? [] : [\"baseUrl\"]),\n ...(isProviderApiKeyRequired(providerName, authType) && !apiKey ?\n [\"apiKey\"]\n : []),\n ]\n\n if (missingFields.length > 0) {\n consola.warn(\n `Provider ${providerName} is enabled but missing ${missingFields.join(\" or \")}`,\n )\n return null\n }\n\n return {\n name: providerName,\n type,\n baseUrl,\n modelsDevProviderId: provider.modelsDevProviderId,\n apiKey,\n authType,\n authTypeExplicit: provider.authType !== undefined,\n pricingCurrency: normalizePricingCurrency(provider.pricingCurrency),\n models: provider.models,\n agentsModels: provider.agentsModels,\n }\n}\n\nexport function resolveEffectiveProviderType(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ProviderType {\n const modelConfig = providerConfig.models?.[model]\n if (modelConfig?.type && isSupportedProviderType(modelConfig.type)) {\n return modelConfig.type\n }\n\n if (providerConfig.name === \"opencode-go\") {\n return getOpencodeGoModelProviderType(model)\n }\n\n if (providerConfig.modelsDevProviderId) {\n const catalogType = getModelsDevModelProviderType(\n providerConfig.modelsDevProviderId,\n model,\n )\n if (catalogType) return catalogType\n }\n\n if (providerConfig.name === \"openrouter\") {\n if (model.includes(\"gpt-\")) {\n return \"openai-responses\"\n }\n }\n\n return providerConfig.type\n}\n\nexport function resolveProviderConfigForModel(\n providerConfig: ResolvedProviderConfig,\n model: string,\n): ResolvedProviderConfig {\n const type = resolveEffectiveProviderType(providerConfig, model)\n const modelApi =\n (\n providerConfig.modelsDevProviderId\n && providerConfig.baseUrl\n === getModelsDevProviderApi(providerConfig.modelsDevProviderId)\n ) ?\n getModelsDevModelApi(providerConfig.modelsDevProviderId, model)\n : undefined\n const configuredModel = providerConfig.models?.[model]\n const catalogPricing =\n providerConfig.modelsDevProviderId ?\n getModelsDevModelPricing(providerConfig.modelsDevProviderId, model)\n : undefined\n const useCatalogPricing =\n catalogPricing !== undefined && configuredModel?.pricing === undefined\n if (type === providerConfig.type && !modelApi && !useCatalogPricing) {\n return providerConfig\n }\n\n return {\n ...providerConfig,\n type,\n baseUrl: modelApi ?? providerConfig.baseUrl,\n models:\n useCatalogPricing ?\n {\n ...providerConfig.models,\n [model]: { ...configuredModel, pricing: catalogPricing },\n }\n : providerConfig.models,\n pricingCurrency: useCatalogPricing ? \"USD\" : providerConfig.pricingCurrency,\n authType:\n (\n type !== providerConfig.type\n && !providerConfig.authTypeExplicit\n && providerConfig.authType !== \"azure-entra\"\n && providerConfig.authType !== \"oauth2\"\n ) ?\n resolveProviderAuthType(providerConfig.name, undefined, type)\n : providerConfig.authType,\n }\n}\n\nfunction normalizePricingCurrency(\n value: string | undefined,\n): string | undefined {\n const currency = value?.trim().toUpperCase()\n return currency || undefined\n}\n\nexport function listEnabledProviders(): Array<string> {\n const config = getConfig()\n const providerNames = Object.keys(config.providers ?? {})\n return providerNames.filter(\n (name) => !isReservedProviderName(name) && getProviderConfig(name) !== null,\n )\n}\n\nexport function isReservedProviderName(name: string): boolean {\n return name.trim() === \"copilot\" || name.trim() === \"github-copilot\"\n}\n"],"mappings":"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"}
|