saros-proxy 0.5.7 → 0.6.0

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * model-probe.ts — Probe runner for model capabilities.
3
+ *
4
+ * Sends real API requests through the proxy's own endpoint (http://127.0.0.1:{port})
5
+ * to test liveness, reasoning, and tool-calling capabilities of each model.
6
+ *
7
+ * Uses the user's own proxy so results reflect the actual configured setup,
8
+ * including circuit breaker and key failover behavior.
9
+ */
10
+ import { type ProxyConfig } from './config.js';
11
+ import { type ProbeResult, type ModelProbe } from './probe-cache.js';
12
+ /**
13
+ * Probe a model for basic liveness.
14
+ *
15
+ * Sends a simple prompt and expects a text response.
16
+ * Returns 'ok' if the response contains non-empty content.
17
+ */
18
+ export declare function probeLiveness(config: ProxyConfig, modelId: string): Promise<ProbeResult>;
19
+ /**
20
+ * Probe a model for reasoning (thinking) capability.
21
+ *
22
+ * Sends a prompt with `reasoning_effort: "low"` via `extra_body`.
23
+ * Models that do not support reasoning return 400/422 with an error
24
+ * referencing "reasoning_effort" — those are marked 'unsupported'.
25
+ * Models that accept the parameter but return reasoning_content are 'ok'.
26
+ */
27
+ export declare function probeReasoning(config: ProxyConfig, modelId: string): Promise<ProbeResult>;
28
+ /**
29
+ * Probe a model for tool-calling (function calling) capability.
30
+ *
31
+ * Sends a request with a tool definition and expects `tool_calls` in the response.
32
+ * Models that do not support tools return 400/422 with "tools" in the error.
33
+ */
34
+ export declare function probeToolCalling(config: ProxyConfig, modelId: string): Promise<ProbeResult>;
35
+ /**
36
+ * Run all three probes (liveness, reasoning, tool calling) for a single model.
37
+ *
38
+ * All probes run concurrently via Promise.all so one failure does not block others.
39
+ */
40
+ export declare function probeModel(config: ProxyConfig, modelId: string): Promise<ModelProbe>;
41
+ /**
42
+ * Run probeModel for every model ID in the array.
43
+ *
44
+ * Models are probed sequentially (one at a time) to avoid overwhelming the proxy.
45
+ * Returns results in the same order as the input array.
46
+ * Individual failures are captured per-model and do not halt the batch.
47
+ */
48
+ export declare function probeAllModels(config: ProxyConfig, modelIds: string[]): Promise<ModelProbe[]>;
@@ -0,0 +1,234 @@
1
+ /**
2
+ * model-probe.ts — Probe runner for model capabilities.
3
+ *
4
+ * Sends real API requests through the proxy's own endpoint (http://127.0.0.1:{port})
5
+ * to test liveness, reasoning, and tool-calling capabilities of each model.
6
+ *
7
+ * Uses the user's own proxy so results reflect the actual configured setup,
8
+ * including circuit breaker and key failover behavior.
9
+ */
10
+ import { PROBE_REQUEST_TIMEOUT_MS, PROBE_LIVENESS_PROMPT, PROBE_REASONING_PROMPT, PROBE_TOOL_CALLING_PROMPT, } from './constants.js';
11
+ // ---------------------------------------------------------------------------
12
+ // Helpers
13
+ // ---------------------------------------------------------------------------
14
+ /** Build the proxy base URL from config. */
15
+ function buildBaseURL(config) {
16
+ return `http://127.0.0.1:${config.port}`;
17
+ }
18
+ /**
19
+ * Perform a chat completion request through the proxy.
20
+ *
21
+ * Handles HTTP errors, 429 rate limiting, and network/timeout errors uniformly.
22
+ * Returns a normalized FetchResult for the probe functions to interpret.
23
+ */
24
+ async function fetchCompletion(baseURL, body) {
25
+ try {
26
+ const response = await fetch(`${baseURL}/v1/chat/completions`, {
27
+ method: 'POST',
28
+ headers: { 'Content-Type': 'application/json' },
29
+ body: JSON.stringify(body),
30
+ signal: AbortSignal.timeout(PROBE_REQUEST_TIMEOUT_MS),
31
+ });
32
+ // 429 is handled specially
33
+ if (response.status === 429) {
34
+ return { ok: false, status: 429 };
35
+ }
36
+ if (!response.ok) {
37
+ const errorText = await response.text().catch(() => '');
38
+ return { ok: false, status: response.status, errorText };
39
+ }
40
+ const data = (await response.json());
41
+ return { ok: true, status: response.status, data };
42
+ }
43
+ catch (err) {
44
+ const message = err instanceof Error ? err.message : String(err);
45
+ return { ok: false, status: 0, errorText: message };
46
+ }
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Individual probe functions
50
+ // ---------------------------------------------------------------------------
51
+ /**
52
+ * Probe a model for basic liveness.
53
+ *
54
+ * Sends a simple prompt and expects a text response.
55
+ * Returns 'ok' if the response contains non-empty content.
56
+ */
57
+ export async function probeLiveness(config, modelId) {
58
+ const baseURL = buildBaseURL(config);
59
+ const result = await fetchCompletion(baseURL, {
60
+ model: modelId,
61
+ messages: [{ role: 'user', content: PROBE_LIVENESS_PROMPT }],
62
+ max_tokens: 10,
63
+ stream: false,
64
+ });
65
+ if (result.status === 429) {
66
+ return { status: 'rate_limited', ts: Date.now() };
67
+ }
68
+ if (!result.ok) {
69
+ return {
70
+ status: 'error',
71
+ ts: Date.now(),
72
+ details: result.status > 0
73
+ ? result.errorText
74
+ ? `${result.status}: ${result.errorText}`
75
+ : `HTTP ${result.status}`
76
+ : result.errorText ?? 'Unknown error',
77
+ };
78
+ }
79
+ // Verify the response contains actual content
80
+ const content = result.data?.choices?.[0]?.message?.content;
81
+ if (!content || content.trim().length === 0) {
82
+ return { status: 'error', ts: Date.now(), details: 'No content in response' };
83
+ }
84
+ return { status: 'ok', ts: Date.now() };
85
+ }
86
+ /**
87
+ * Probe a model for reasoning (thinking) capability.
88
+ *
89
+ * Sends a prompt with `reasoning_effort: "low"` via `extra_body`.
90
+ * Models that do not support reasoning return 400/422 with an error
91
+ * referencing "reasoning_effort" — those are marked 'unsupported'.
92
+ * Models that accept the parameter but return reasoning_content are 'ok'.
93
+ */
94
+ export async function probeReasoning(config, modelId) {
95
+ const baseURL = buildBaseURL(config);
96
+ const result = await fetchCompletion(baseURL, {
97
+ model: modelId,
98
+ messages: [{ role: 'user', content: PROBE_REASONING_PROMPT }],
99
+ max_tokens: 200,
100
+ stream: false,
101
+ extra_body: { reasoning_effort: 'low' },
102
+ });
103
+ if (result.status === 429) {
104
+ return { status: 'rate_limited', ts: Date.now() };
105
+ }
106
+ if (!result.ok) {
107
+ // 400/422 with "reasoning_effort" in the error message → unsupported
108
+ const errorMsg = (result.errorText ?? '').toLowerCase();
109
+ if ((result.status === 400 || result.status === 422) &&
110
+ errorMsg.includes('reasoning_effort')) {
111
+ return {
112
+ status: 'unsupported',
113
+ ts: Date.now(),
114
+ details: (result.status === 400 ? '400: ' : '422: ') + (result.errorText ?? ''),
115
+ };
116
+ }
117
+ return {
118
+ status: 'error',
119
+ ts: Date.now(),
120
+ details: result.status > 0
121
+ ? result.errorText
122
+ ? `${result.status}: ${result.errorText}`
123
+ : `HTTP ${result.status}`
124
+ : result.errorText ?? 'Unknown error',
125
+ };
126
+ }
127
+ // Call succeeded — some models accept reasoning_effort silently
128
+ // even if they don't return reasoning_content. That's still 'ok'.
129
+ return { status: 'ok', ts: Date.now() };
130
+ }
131
+ /**
132
+ * Probe a model for tool-calling (function calling) capability.
133
+ *
134
+ * Sends a request with a tool definition and expects `tool_calls` in the response.
135
+ * Models that do not support tools return 400/422 with "tools" in the error.
136
+ */
137
+ export async function probeToolCalling(config, modelId) {
138
+ const baseURL = buildBaseURL(config);
139
+ const result = await fetchCompletion(baseURL, {
140
+ model: modelId,
141
+ messages: [{ role: 'user', content: PROBE_TOOL_CALLING_PROMPT }],
142
+ max_tokens: 100,
143
+ stream: false,
144
+ tools: [
145
+ {
146
+ type: 'function',
147
+ function: {
148
+ name: 'get_weather',
149
+ description: 'Get current weather',
150
+ parameters: {
151
+ type: 'object',
152
+ properties: { city: { type: 'string' } },
153
+ required: ['city'],
154
+ },
155
+ },
156
+ },
157
+ ],
158
+ tool_choice: 'auto',
159
+ });
160
+ if (result.status === 429) {
161
+ return { status: 'rate_limited', ts: Date.now() };
162
+ }
163
+ if (!result.ok) {
164
+ // 400/422 with "tools" in the error message → unsupported
165
+ const errorMsg = (result.errorText ?? '').toLowerCase();
166
+ if ((result.status === 400 || result.status === 422) &&
167
+ errorMsg.includes('tools')) {
168
+ return {
169
+ status: 'unsupported',
170
+ ts: Date.now(),
171
+ details: (result.status === 400 ? '400: ' : '422: ') + (result.errorText ?? ''),
172
+ };
173
+ }
174
+ return {
175
+ status: 'error',
176
+ ts: Date.now(),
177
+ details: result.status > 0
178
+ ? result.errorText
179
+ ? `${result.status}: ${result.errorText}`
180
+ : `HTTP ${result.status}`
181
+ : result.errorText ?? 'Unknown error',
182
+ };
183
+ }
184
+ // Verify the response contains tool_calls
185
+ const toolCalls = result.data?.choices?.[0]?.message?.tool_calls;
186
+ if (!toolCalls || toolCalls.length === 0) {
187
+ return { status: 'error', ts: Date.now(), details: 'No tool_calls in response' };
188
+ }
189
+ return { status: 'ok', ts: Date.now() };
190
+ }
191
+ // ---------------------------------------------------------------------------
192
+ // Composite probes
193
+ // ---------------------------------------------------------------------------
194
+ /**
195
+ * Run all three probes (liveness, reasoning, tool calling) for a single model.
196
+ *
197
+ * All probes run concurrently via Promise.all so one failure does not block others.
198
+ */
199
+ export async function probeModel(config, modelId) {
200
+ const [liveness, reasoning, toolCalling] = await Promise.all([
201
+ probeLiveness(config, modelId),
202
+ probeReasoning(config, modelId),
203
+ probeToolCalling(config, modelId),
204
+ ]);
205
+ return { modelId, liveness, reasoning, toolCalling };
206
+ }
207
+ /**
208
+ * Run probeModel for every model ID in the array.
209
+ *
210
+ * Models are probed sequentially (one at a time) to avoid overwhelming the proxy.
211
+ * Returns results in the same order as the input array.
212
+ * Individual failures are captured per-model and do not halt the batch.
213
+ */
214
+ export async function probeAllModels(config, modelIds) {
215
+ const results = [];
216
+ for (const modelId of modelIds) {
217
+ try {
218
+ const probe = await probeModel(config, modelId);
219
+ results.push(probe);
220
+ }
221
+ catch (err) {
222
+ // Catastrophic failure (shouldn't happen since probeModel catches internally)
223
+ const message = err instanceof Error ? err.message : String(err);
224
+ results.push({
225
+ modelId,
226
+ liveness: { status: 'error', ts: Date.now(), details: message },
227
+ reasoning: { status: 'error', ts: Date.now(), details: message },
228
+ toolCalling: { status: 'error', ts: Date.now(), details: message },
229
+ });
230
+ }
231
+ }
232
+ return results;
233
+ }
234
+ //# sourceMappingURL=model-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-probe.js","sourceRoot":"","sources":["../src/model-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * models-fetcher.ts — Fetches model list from the upstream OpenCode-Go API
3
+ * and serves it to clients, with fallback to hardcoded model IDs.
4
+ *
5
+ * Public API:
6
+ * fetchModelsFromUpstream(config) — raw fetch + validation
7
+ * getModelsList(config) — orchestrator with warm buffer & in-flight dedup
8
+ * buildFallbackResponse() — minimal fallback from OPENCODE_MODELS
9
+ * resetModelsFetcherState() — test helper to clear module-level state
10
+ */
11
+ import type { ProxyConfig } from './config.js';
12
+ /** Reset module-level state — used by tests to get a fresh state between runs. */
13
+ export declare function resetModelsFetcherState(): void;
14
+ /**
15
+ * Fetch the model list from the upstream OpenCode-Go public endpoint.
16
+ *
17
+ * GETs `${config.upstreamBaseUrl}/zen/go/v1/models` without auth.
18
+ * Uses a 5-second timeout via AbortSignal.
19
+ *
20
+ * @returns Parsed `{ object, data }` on success, or `null` on any error or
21
+ * shape mismatch. An empty data array IS valid (passthrough).
22
+ */
23
+ export declare function fetchModelsFromUpstream(config: ProxyConfig): Promise<{
24
+ object: string;
25
+ data: unknown[];
26
+ } | null>;
27
+ /**
28
+ * Build a 200 JSON Response using the hardcoded OPENCODE_MODELS list.
29
+ * Used when the upstream endpoint is unreachable.
30
+ *
31
+ * Each entry gets `{ id, object: 'model', created: <unix ts>, owned_by: 'saros' }`.
32
+ */
33
+ export declare function buildFallbackResponse(): Response;
34
+ /**
35
+ * Get the model list response, with:
36
+ * 1. Warm buffer — cached data served for up to 60 seconds.
37
+ * 2. In-flight dedup — concurrent calls share a single upstream request.
38
+ * 3. Fallback — hardcoded models when upstream is unreachable.
39
+ *
40
+ * @returns A 200 JSON Response with upstream data or fallback models.
41
+ */
42
+ export declare function getModelsList(config: ProxyConfig): Promise<Response>;
@@ -0,0 +1,137 @@
1
+ /**
2
+ * models-fetcher.ts — Fetches model list from the upstream OpenCode-Go API
3
+ * and serves it to clients, with fallback to hardcoded model IDs.
4
+ *
5
+ * Public API:
6
+ * fetchModelsFromUpstream(config) — raw fetch + validation
7
+ * getModelsList(config) — orchestrator with warm buffer & in-flight dedup
8
+ * buildFallbackResponse() — minimal fallback from OPENCODE_MODELS
9
+ * resetModelsFetcherState() — test helper to clear module-level state
10
+ */
11
+ import { MODELS_FETCH_TIMEOUT_MS, MODELS_WARM_BUFFER_MS } from './constants.js';
12
+ import { loadModelsFromJson } from './cli/opencode-config.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Module-level state (hidden from callers)
15
+ // ---------------------------------------------------------------------------
16
+ let lastGood = null;
17
+ let inFlightP = null;
18
+ // ---------------------------------------------------------------------------
19
+ // Test helper
20
+ // ---------------------------------------------------------------------------
21
+ /** Reset module-level state — used by tests to get a fresh state between runs. */
22
+ export function resetModelsFetcherState() {
23
+ lastGood = null;
24
+ inFlightP = null;
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Fetch from upstream
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Fetch the model list from the upstream OpenCode-Go public endpoint.
31
+ *
32
+ * GETs `${config.upstreamBaseUrl}/zen/go/v1/models` without auth.
33
+ * Uses a 5-second timeout via AbortSignal.
34
+ *
35
+ * @returns Parsed `{ object, data }` on success, or `null` on any error or
36
+ * shape mismatch. An empty data array IS valid (passthrough).
37
+ */
38
+ export async function fetchModelsFromUpstream(config) {
39
+ try {
40
+ const response = await fetch(`${config.upstreamBaseUrl}/zen/go/v1/models`, {
41
+ method: 'GET',
42
+ signal: AbortSignal.timeout(MODELS_FETCH_TIMEOUT_MS),
43
+ });
44
+ if (!response.ok)
45
+ return null;
46
+ const text = await response.text();
47
+ let parsed;
48
+ try {
49
+ parsed = JSON.parse(text);
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ if (typeof parsed !== 'object' || parsed === null)
55
+ return null;
56
+ const obj = parsed;
57
+ if (obj.object !== 'list')
58
+ return null;
59
+ if (!Array.isArray(obj.data))
60
+ return null;
61
+ return { object: 'list', data: obj.data };
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Response builders
69
+ // ---------------------------------------------------------------------------
70
+ /**
71
+ * Build a 200 JSON Response from upstream-shaped data.
72
+ * Private helper.
73
+ */
74
+ function buildResponse(data) {
75
+ return new Response(JSON.stringify(data), {
76
+ status: 200,
77
+ headers: { 'content-type': 'application/json' },
78
+ });
79
+ }
80
+ /**
81
+ * Build a 200 JSON Response using the hardcoded OPENCODE_MODELS list.
82
+ * Used when the upstream endpoint is unreachable.
83
+ *
84
+ * Each entry gets `{ id, object: 'model', created: <unix ts>, owned_by: 'saros' }`.
85
+ */
86
+ export function buildFallbackResponse() {
87
+ const models = loadModelsFromJson();
88
+ const now = Math.floor(Date.now() / 1000);
89
+ const data = Object.keys(models).map((id) => ({
90
+ id,
91
+ object: 'model',
92
+ created: now,
93
+ owned_by: 'saros',
94
+ }));
95
+ return new Response(JSON.stringify({ object: 'list', data }), {
96
+ status: 200,
97
+ headers: { 'content-type': 'application/json' },
98
+ });
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // Orchestrator
102
+ // ---------------------------------------------------------------------------
103
+ /**
104
+ * Get the model list response, with:
105
+ * 1. Warm buffer — cached data served for up to 60 seconds.
106
+ * 2. In-flight dedup — concurrent calls share a single upstream request.
107
+ * 3. Fallback — hardcoded models when upstream is unreachable.
108
+ *
109
+ * @returns A 200 JSON Response with upstream data or fallback models.
110
+ */
111
+ export async function getModelsList(config) {
112
+ // 1. Warm buffer: serve cached response if within 60s.
113
+ // lastGood is intentionally NOT cleared on upstream failure — a
114
+ // server outage shouldn't reset the cache to nothing.
115
+ if (lastGood && Date.now() - lastGood.ts < MODELS_WARM_BUFFER_MS) {
116
+ return buildResponse(lastGood.data);
117
+ }
118
+ // 2. In-flight dedup: reuse an existing upstream request
119
+ if (inFlightP) {
120
+ const result = await inFlightP;
121
+ return result ? buildResponse(result) : buildFallbackResponse();
122
+ }
123
+ // 3. Start a new upstream request
124
+ inFlightP = fetchModelsFromUpstream(config)
125
+ .then((result) => {
126
+ if (result) {
127
+ lastGood = { ts: Date.now(), data: result };
128
+ }
129
+ return result;
130
+ })
131
+ .finally(() => {
132
+ inFlightP = null;
133
+ });
134
+ const result = await inFlightP;
135
+ return result ? buildResponse(result) : buildFallbackResponse();
136
+ }
137
+ //# sourceMappingURL=models-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-fetcher.js","sourceRoot":"","sources":["../src/models-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * models-sync.ts — Auto-sync models from upstream to opencode.json.
3
+ *
4
+ * Tier 1 of the auto model discovery plan.
5
+ * Fetches upstream model IDs, diffs against opencode.json, and adds
6
+ * any missing models with minimal stubs.
7
+ */
8
+ import type { ProxyConfig } from './config.js';
9
+ import type { OpencodeConfigResult } from './cli/opencode-config.js';
10
+ /**
11
+ * Fetch model IDs from the upstream OpenCode-Go API.
12
+ *
13
+ * Calls `getModelsList(config)` to obtain the /v1/models response,
14
+ * then extracts `data[].id` values.
15
+ *
16
+ * @param config — Proxy configuration
17
+ * @returns Array of model ID strings, or empty array on any failure
18
+ */
19
+ export declare function fetchUpstreamModelIds(config: ProxyConfig): Promise<string[]>;
20
+ /**
21
+ * Return model IDs from `upstream` that are NOT present in `current`.
22
+ *
23
+ * Preserves upstream order and deduplicates the result.
24
+ *
25
+ * @param current — Currently configured model IDs
26
+ * @param upstream — Model IDs from the upstream API
27
+ * @returns Missing model IDs (ordered and deduplicated)
28
+ */
29
+ export declare function getMissingModels(current: string[], upstream: string[]): string[];
30
+ /**
31
+ * Build a minimal model stub for use in opencode.json.
32
+ *
33
+ * Priority (first match wins):
34
+ * 1. models.dev metadata (if provided and found for modelId)
35
+ * 2. OPENCODE_MODELS bundled constants
36
+ * 3. Heuristic title-case of the ID with default limits
37
+ *
38
+ * @param modelId — The upstream model ID (e.g. "glm-5", "kimi-k2.7-code")
39
+ * @param modelsDevMetadata — Optional map from models.dev (takes precedence)
40
+ * @returns A stub object with `id`, `name`, `tool_call`, and `reasoning`
41
+ */
42
+ export declare function buildMinimalStub(modelId: string, modelsDevMetadata?: Record<string, Record<string, unknown>>): Record<string, unknown>;
43
+ /**
44
+ * Read the set of currently configured model IDs from opencode.json.
45
+ *
46
+ * Extracts the keys of `provider["saros-proxy"].models`.
47
+ *
48
+ * @param configPath — Path to opencode.json
49
+ * @returns Array of model ID strings, or empty array on any failure
50
+ */
51
+ export declare function getModelsFromOpencodeConfig(configPath: string): string[];
52
+ /**
53
+ * Add missing model stubs to the saros-proxy.models map in opencode.json.
54
+ *
55
+ * 1. Reads the config file.
56
+ * 2. Ensures `saros-proxy` provider exists.
57
+ * 3. Creates a `.backup` copy.
58
+ * 4. Merges `buildMinimalStub(id)` for each missing ID.
59
+ * 5. Writes the updated JSON.
60
+ * 6. Validates the written file — restores from backup on failure.
61
+ *
62
+ * @param configPath — Path to opencode.json
63
+ * @param missingIds — Model IDs to add
64
+ * @param modelsDevMetadata — Optional models.dev metadata (passed to buildMinimalStub)
65
+ * @returns Result with success status and optional error message
66
+ */
67
+ export declare function addMissingModelsToOpencodeConfig(configPath: string, missingIds: string[], modelsDevMetadata?: Record<string, Record<string, unknown>>): OpencodeConfigResult;
68
+ /**
69
+ * Orchestrator: sync opencode.json models with upstream.
70
+ *
71
+ * Flow:
72
+ * fetchModelsDevMetadata()
73
+ * → fetchUpstreamModelIds(config)
74
+ * → getModelsFromOpencodeConfig(configPath)
75
+ * → getMissingModels(current, upstream)
76
+ * → addMissingModelsToOpencodeConfig(configPath, missing, devMetadata)
77
+ *
78
+ * @param config — Proxy configuration for upstream fetch
79
+ * @param configPath — Path to opencode.json (defaults to platform default)
80
+ * @returns Result with success status and optional error message
81
+ */
82
+ export declare function syncOpencodeModelsWithUpstream(config: ProxyConfig, configPath?: string): Promise<OpencodeConfigResult>;
83
+ /**
84
+ * Extract the opencode-go provider's models from a models.dev API response.
85
+ *
86
+ * Pure function — callers handle JSON parsing and error recovery.
87
+ *
88
+ * @param parsed — Parsed models.dev JSON object (result of `JSON.parse`)
89
+ * @returns Model ID → metadata map, or empty object if provider not found
90
+ */
91
+ export declare function extractOpencodeGoModels(parsed: Record<string, unknown>): Record<string, Record<string, unknown>>;
92
+ /**
93
+ * Fetch and cache models.dev metadata for opencode-go models.
94
+ *
95
+ * Caches in memory with TTL. Never throws — returns null on any failure.
96
+ * Skips in-flight deduplication (YAGNI — single orchestrator path).
97
+ *
98
+ * @returns Model ID → metadata map, null on failure, empty on missing provider
99
+ */
100
+ export declare function fetchModelsDevMetadata(): Promise<Record<string, Record<string, unknown>> | null>;
101
+ /**
102
+ * Clear the models.dev in-memory cache (test helper).
103
+ */
104
+ export declare function resetModelsDevCacheState(): void;