feat(coding-agent): merge origin/main into model runtime facade
This commit is contained in:
+11
-5
@@ -1029,21 +1029,26 @@ const tenantGateway = createProvider({
|
||||
});
|
||||
```
|
||||
|
||||
Dynamic model lists use `refreshModels`; the provider lists empty until the first `models.refresh()`:
|
||||
Dynamic model lists use `fetchModels`. `Models.refresh()` refreshes every configured dynamic provider, passing its effective API-key or refreshed OAuth credential. A `ModelsStore` persists dynamic catalogs; both stores default to in-memory implementations.
|
||||
|
||||
```typescript
|
||||
const models = createModels({ credentials, modelsStore });
|
||||
const llamacpp = createProvider({
|
||||
id: 'llamacpp',
|
||||
auth: { apiKey: { name: 'llama.cpp', resolve: async () => ({ auth: {} }) } },
|
||||
models: [],
|
||||
refreshModels: async () => fetchModelsFromServer('http://localhost:8080'),
|
||||
fetchModels: async ({ signal }) => fetchModelsFromServer('http://localhost:8080', signal),
|
||||
api: openAICompletionsApi(),
|
||||
});
|
||||
|
||||
models.setProvider(llamacpp);
|
||||
await models.refresh('llamacpp');
|
||||
const result = await models.refresh({ signal });
|
||||
if (result.aborted) console.log('refresh cancelled');
|
||||
for (const [provider, error] of result.errors) console.error(provider, error);
|
||||
```
|
||||
|
||||
Use `models.refresh({ allowNetwork: false })` to restore persisted catalogs without network access. Model reads stay synchronous and return the last restored or refreshed list.
|
||||
|
||||
Custom models can carry `headers` (e.g. proxies behind bot detection) and `compat` flags. `Models.getAuth(model)` includes those model headers, and stream methods merge them before explicit request headers and `transformHeaders`. See [OpenAI Compatibility Settings](#openai-compatibility-settings).
|
||||
|
||||
Some OpenAI-compatible servers do not understand the `developer` role used for reasoning-capable models. For those providers, set `compat.supportsDeveloperRole` to `false` so the system prompt is sent as a `system` message instead. If the server also does not support `reasoning_effort`, set `compat.supportsReasoningEffort` to `false` too. This commonly applies to Ollama, vLLM, SGLang, and similar OpenAI-compatible servers.
|
||||
@@ -1117,7 +1122,8 @@ interface OpenAICompletionsCompat {
|
||||
supportsReasoningEffort?: boolean; // Whether provider supports `reasoning_effort` (default: true)
|
||||
supportsUsageInStreaming?: boolean; // Whether provider supports `stream_options: { include_usage: true }` (default: true)
|
||||
supportsStrictMode?: boolean; // Whether provider supports `strict` in tool definitions (default: true)
|
||||
sendSessionAffinityHeaders?: boolean; // Whether to send `session_id`, `x-client-request-id`, and `x-session-affinity` from `sessionId` when caching is enabled (default: false)
|
||||
sendSessionAffinityHeaders?: boolean; // Send session-affinity data from `sessionId` (default: false)
|
||||
sessionAffinityFormat?: 'openai' | 'openai-nosession' | 'openrouter'; // Format for session affinity: 'openai' uses `prompt_cache_key`, `session_id`, `x-client-request-id`, and `x-session-affinity`; 'openai-nosession' uses `prompt_cache_key`, `x-client-request-id`, and `x-session-affinity`; 'openrouter' uses `x-session-id` (default: auto-detected)
|
||||
maxTokensField?: 'max_completion_tokens' | 'max_tokens'; // Which field name to use (default: max_completion_tokens)
|
||||
requiresToolResultName?: boolean; // Whether tool results require the `name` field (default: false)
|
||||
requiresAssistantAfterToolResult?: boolean; // Whether tool results must be followed by an assistant message (default: false)
|
||||
@@ -1132,7 +1138,7 @@ interface OpenAICompletionsCompat {
|
||||
|
||||
interface OpenAIResponsesCompat {
|
||||
supportsDeveloperRole?: boolean; // Whether provider supports `developer` role vs `system` (default: true)
|
||||
sendSessionIdHeader?: boolean; // Whether to send `session_id` from `sessionId` when caching is enabled (default: true)
|
||||
sessionAffinityFormat?: 'openai' | 'openai-nosession' | 'openrouter'; // Session-affinity header format: 'openai' sends `session_id` and `x-client-request-id`; 'openai-nosession' sends `x-client-request-id`; 'openrouter' sends `x-session-id`. Does not affect the `prompt_cache_key` body param (default: auto-detected)
|
||||
supportsLongCacheRetention?: boolean; // Whether provider supports `prompt_cache_retention: "24h"` (default: true)
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user