@gajae-code/ai 0.1.1
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/CHANGELOG.md +2644 -0
- package/README.md +1181 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +66 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +96 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +105 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +17 -0
- package/dist/types/auth-gateway/types.d.ts +115 -0
- package/dist/types/auth-storage.d.ts +641 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/model-cache.d.ts +17 -0
- package/dist/types/model-manager.d.ts +62 -0
- package/dist/types/model-thinking.d.ts +71 -0
- package/dist/types/models.d.ts +12 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/provider-models/bundled-references.d.ts +4 -0
- package/dist/types/provider-models/descriptors.d.ts +48 -0
- package/dist/types/provider-models/google.d.ts +20 -0
- package/dist/types/provider-models/index.d.ts +5 -0
- package/dist/types/provider-models/ollama.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +237 -0
- package/dist/types/provider-models/special.d.ts +16 -0
- package/dist/types/providers/amazon-bedrock.d.ts +36 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic.d.ts +188 -0
- package/dist/types/providers/aws-credentials.d.ts +43 -0
- package/dist/types/providers/aws-eventstream.d.ts +38 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +15 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
- package/dist/types/providers/cursor.d.ts +42 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +72 -0
- package/dist/types/providers/google-gemini-headers.d.ts +18 -0
- package/dist/types/providers/google-shared.d.ts +163 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +175 -0
- package/dist/types/providers/ollama.d.ts +6 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +814 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-codex/constants.d.ts +26 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
- package/dist/types/providers/openai-codex-responses.d.ts +67 -0
- package/dist/types/providers/openai-completions-compat.d.ts +25 -0
- package/dist/types/providers/openai-completions.d.ts +33 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-shared.d.ts +89 -0
- package/dist/types/providers/openai-responses.d.ts +32 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +68 -0
- package/dist/types/providers/register-builtins.d.ts +31 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +12 -0
- package/dist/types/providers/vision-guard.d.ts +8 -0
- package/dist/types/rate-limit-utils.d.ts +19 -0
- package/dist/types/stream.d.ts +24 -0
- package/dist/types/types.d.ts +746 -0
- package/dist/types/usage/claude.d.ts +3 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +2 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +258 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +31 -0
- package/dist/types/utils/discovery/antigravity.d.ts +61 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +23 -0
- package/dist/types/utils/discovery/gemini.d.ts +25 -0
- package/dist/types/utils/discovery/index.d.ts +4 -0
- package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
- package/dist/types/utils/event-stream.d.ts +28 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +31 -0
- package/dist/types/utils/idle-iterator.d.ts +67 -0
- package/dist/types/utils/json-parse.d.ts +10 -0
- package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
- package/dist/types/utils/oauth/anthropic.d.ts +22 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
- package/dist/types/utils/oauth/callback-server.d.ts +57 -0
- package/dist/types/utils/oauth/cerebras.d.ts +1 -0
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepseek.d.ts +10 -0
- package/dist/types/utils/oauth/firepass.d.ts +1 -0
- package/dist/types/utils/oauth/fireworks.d.ts +1 -0
- package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
- package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
- package/dist/types/utils/oauth/huggingface.d.ts +19 -0
- package/dist/types/utils/oauth/index.d.ts +38 -0
- package/dist/types/utils/oauth/kagi.d.ts +17 -0
- package/dist/types/utils/oauth/kilo.d.ts +5 -0
- package/dist/types/utils/oauth/kimi.d.ts +21 -0
- package/dist/types/utils/oauth/litellm.d.ts +18 -0
- package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
- package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
- package/dist/types/utils/oauth/moonshot.d.ts +1 -0
- package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
- package/dist/types/utils/oauth/nvidia.d.ts +18 -0
- package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
- package/dist/types/utils/oauth/ollama.d.ts +18 -0
- package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
- package/dist/types/utils/oauth/opencode.d.ts +18 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +9 -0
- package/dist/types/utils/oauth/pkce.d.ts +8 -0
- package/dist/types/utils/oauth/qianfan.d.ts +17 -0
- package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
- package/dist/types/utils/oauth/synthetic.d.ts +1 -0
- package/dist/types/utils/oauth/tavily.d.ts +17 -0
- package/dist/types/utils/oauth/together.d.ts +1 -0
- package/dist/types/utils/oauth/types.d.ts +44 -0
- package/dist/types/utils/oauth/venice.d.ts +18 -0
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/vllm.d.ts +16 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
- package/dist/types/utils/oauth/zai.d.ts +18 -0
- package/dist/types/utils/oauth/zenmux.d.ts +1 -0
- package/dist/types/utils/overflow.d.ts +54 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry.d.ts +26 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +49 -0
- package/dist/types/utils/schema/index.d.ts +13 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +93 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +25 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/wire.d.ts +54 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sse-debug.d.ts +10 -0
- package/dist/types/utils/tool-call-healing.d.ts +71 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +17 -0
- package/dist/types/utils.d.ts +28 -0
- package/package.json +146 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +358 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/refresher.ts +127 -0
- package/src/auth-broker/remote-store.ts +623 -0
- package/src/auth-broker/server.ts +644 -0
- package/src/auth-broker/types.ts +127 -0
- package/src/auth-broker/wire-schemas.ts +200 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +717 -0
- package/src/auth-gateway/types.ts +134 -0
- package/src/auth-storage.ts +4104 -0
- package/src/cli.ts +262 -0
- package/src/index.ts +54 -0
- package/src/model-cache.ts +129 -0
- package/src/model-manager.ts +450 -0
- package/src/model-thinking.ts +691 -0
- package/src/models.json +73853 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +56 -0
- package/src/prompts/turn-aborted-guidance.md +4 -0
- package/src/provider-details.ts +90 -0
- package/src/provider-models/bundled-references.ts +38 -0
- package/src/provider-models/descriptors.ts +308 -0
- package/src/provider-models/google.ts +91 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +153 -0
- package/src/provider-models/openai-compat.ts +2275 -0
- package/src/provider-models/special.ts +67 -0
- package/src/providers/amazon-bedrock.ts +849 -0
- package/src/providers/anthropic-messages-server-schema.ts +229 -0
- package/src/providers/anthropic-messages-server.ts +677 -0
- package/src/providers/anthropic.ts +2696 -0
- package/src/providers/aws-credentials.ts +501 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +337 -0
- package/src/providers/cursor/gen/agent_pb.ts +15274 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2561 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.ts +372 -0
- package/src/providers/google-auth.ts +252 -0
- package/src/providers/google-gemini-cli.ts +795 -0
- package/src/providers/google-gemini-headers.ts +41 -0
- package/src/providers/google-shared.ts +902 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.ts +88 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +500 -0
- package/src/providers/ollama.ts +544 -0
- package/src/providers/openai-anthropic-shim.ts +138 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +628 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.ts +161 -0
- package/src/providers/openai-codex/response-handler.ts +81 -0
- package/src/providers/openai-codex-responses.ts +2598 -0
- package/src/providers/openai-completions-compat.ts +279 -0
- package/src/providers/openai-completions.ts +1853 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1183 -0
- package/src/providers/openai-responses-shared.ts +800 -0
- package/src/providers/openai-responses.ts +621 -0
- package/src/providers/pi-native-client.ts +228 -0
- package/src/providers/pi-native-server.ts +210 -0
- package/src/providers/register-builtins.ts +412 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +309 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/rate-limit-utils.ts +84 -0
- package/src/stream.ts +895 -0
- package/src/types.ts +884 -0
- package/src/usage/claude.ts +431 -0
- package/src/usage/gemini.ts +250 -0
- package/src/usage/github-copilot.ts +421 -0
- package/src/usage/google-antigravity.ts +201 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +31 -0
- package/src/usage/openai-codex.ts +503 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +247 -0
- package/src/usage.ts +183 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/anthropic-auth.ts +87 -0
- package/src/utils/discovery/antigravity.ts +261 -0
- package/src/utils/discovery/codex.ts +371 -0
- package/src/utils/discovery/cursor.ts +306 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +224 -0
- package/src/utils/event-stream.ts +142 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/h2-fetch.ts +60 -0
- package/src/utils/http-inspector.ts +176 -0
- package/src/utils/idle-iterator.ts +250 -0
- package/src/utils/json-parse.ts +148 -0
- package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
- package/src/utils/oauth/anthropic.ts +200 -0
- package/src/utils/oauth/api-key-login.ts +87 -0
- package/src/utils/oauth/api-key-validation.ts +92 -0
- package/src/utils/oauth/callback-server.ts +276 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepseek.ts +53 -0
- package/src/utils/oauth/firepass.ts +24 -0
- package/src/utils/oauth/fireworks.ts +15 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/google-antigravity.ts +200 -0
- package/src/utils/oauth/google-gemini-cli.ts +256 -0
- package/src/utils/oauth/google-oauth-shared.ts +110 -0
- package/src/utils/oauth/huggingface.ts +62 -0
- package/src/utils/oauth/index.ts +444 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.ts +254 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/minimax-code.ts +78 -0
- package/src/utils/oauth/moonshot.ts +16 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +199 -0
- package/src/utils/oauth/ollama-cloud.ts +28 -0
- package/src/utils/oauth/ollama.ts +47 -0
- package/src/utils/oauth/openai-codex.ts +299 -0
- package/src/utils/oauth/opencode.ts +49 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +206 -0
- package/src/utils/oauth/pkce.ts +18 -0
- package/src/utils/oauth/qianfan.ts +58 -0
- package/src/utils/oauth/qwen-portal.ts +60 -0
- package/src/utils/oauth/synthetic.ts +16 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.ts +94 -0
- package/src/utils/oauth/venice.ts +59 -0
- package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
- package/src/utils/oauth/vllm.ts +40 -0
- package/src/utils/oauth/xiaomi.ts +137 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/overflow.ts +137 -0
- package/src/utils/parse-bind.ts +54 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +54 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +190 -0
- package/src/utils/schema/index.ts +13 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.ts +11 -0
- package/src/utils/schema/wire.ts +213 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/tool-call-healing.ts +271 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1019 -0
- package/src/utils.ts +166 -0
package/src/types.ts
ADDED
|
@@ -0,0 +1,884 @@
|
|
|
1
|
+
import type { ZodType, z } from "zod/v4";
|
|
2
|
+
import type { BedrockOptions } from "./providers/amazon-bedrock";
|
|
3
|
+
import type { AnthropicOptions } from "./providers/anthropic";
|
|
4
|
+
import type { AzureOpenAIResponsesOptions } from "./providers/azure-openai-responses";
|
|
5
|
+
import type { CursorOptions } from "./providers/cursor";
|
|
6
|
+
import type {
|
|
7
|
+
DeleteArgs,
|
|
8
|
+
DeleteResult,
|
|
9
|
+
DiagnosticsArgs,
|
|
10
|
+
DiagnosticsResult,
|
|
11
|
+
GrepArgs,
|
|
12
|
+
GrepResult,
|
|
13
|
+
LsArgs,
|
|
14
|
+
LsResult,
|
|
15
|
+
McpResult,
|
|
16
|
+
ReadArgs,
|
|
17
|
+
ReadResult,
|
|
18
|
+
ShellArgs,
|
|
19
|
+
ShellResult,
|
|
20
|
+
WriteArgs,
|
|
21
|
+
WriteResult,
|
|
22
|
+
} from "./providers/cursor/gen/agent_pb";
|
|
23
|
+
import type { GoogleOptions } from "./providers/google";
|
|
24
|
+
import type { GoogleGeminiCliOptions } from "./providers/google-gemini-cli";
|
|
25
|
+
import type { GoogleVertexOptions } from "./providers/google-vertex";
|
|
26
|
+
import type { OllamaChatOptions } from "./providers/ollama";
|
|
27
|
+
import type { OpenAICodexResponsesOptions } from "./providers/openai-codex-responses";
|
|
28
|
+
import type { OpenAICompletionsOptions } from "./providers/openai-completions";
|
|
29
|
+
import type { OpenAIResponsesOptions } from "./providers/openai-responses";
|
|
30
|
+
import type { AssistantMessageEventStream } from "./utils/event-stream";
|
|
31
|
+
|
|
32
|
+
export type { AssistantMessageEventStream } from "./utils/event-stream";
|
|
33
|
+
|
|
34
|
+
export type KnownApi =
|
|
35
|
+
| "openai-completions"
|
|
36
|
+
| "openai-responses"
|
|
37
|
+
| "openai-codex-responses"
|
|
38
|
+
| "azure-openai-responses"
|
|
39
|
+
| "anthropic-messages"
|
|
40
|
+
| "bedrock-converse-stream"
|
|
41
|
+
| "google-generative-ai"
|
|
42
|
+
| "google-gemini-cli"
|
|
43
|
+
| "google-vertex"
|
|
44
|
+
| "ollama-chat"
|
|
45
|
+
| "cursor-agent";
|
|
46
|
+
export type Api = KnownApi | (string & {});
|
|
47
|
+
export interface ApiOptionsMap {
|
|
48
|
+
"anthropic-messages": AnthropicOptions;
|
|
49
|
+
"bedrock-converse-stream": BedrockOptions;
|
|
50
|
+
"openai-completions": OpenAICompletionsOptions;
|
|
51
|
+
"openai-responses": OpenAIResponsesOptions;
|
|
52
|
+
"openai-codex-responses": OpenAICodexResponsesOptions;
|
|
53
|
+
"azure-openai-responses": AzureOpenAIResponsesOptions;
|
|
54
|
+
"google-generative-ai": GoogleOptions;
|
|
55
|
+
"google-gemini-cli": GoogleGeminiCliOptions;
|
|
56
|
+
"google-vertex": GoogleVertexOptions;
|
|
57
|
+
"ollama-chat": OllamaChatOptions;
|
|
58
|
+
"cursor-agent": CursorOptions;
|
|
59
|
+
}
|
|
60
|
+
// Compile-time exhaustiveness check - this will fail if ApiOptionsMap doesn't have all KnownApi keys
|
|
61
|
+
type _CheckExhaustive =
|
|
62
|
+
ApiOptionsMap extends Record<KnownApi, StreamOptions>
|
|
63
|
+
? Record<KnownApi, StreamOptions> extends ApiOptionsMap
|
|
64
|
+
? true
|
|
65
|
+
: ["ApiOptionsMap is missing some KnownApi values", Exclude<KnownApi, keyof ApiOptionsMap>]
|
|
66
|
+
: ["ApiOptionsMap doesn't extend Record<KnownApi, StreamOptions>"];
|
|
67
|
+
true satisfies _CheckExhaustive;
|
|
68
|
+
export type OptionsForApi<TApi extends Api> =
|
|
69
|
+
| StreamOptions
|
|
70
|
+
| (TApi extends keyof ApiOptionsMap ? ApiOptionsMap[TApi] : never);
|
|
71
|
+
|
|
72
|
+
/** Canonical thinking transport used by a model. */
|
|
73
|
+
export type ThinkingControlMode =
|
|
74
|
+
| "effort"
|
|
75
|
+
| "budget"
|
|
76
|
+
| "google-level"
|
|
77
|
+
| "anthropic-adaptive"
|
|
78
|
+
| "anthropic-budget-effort";
|
|
79
|
+
|
|
80
|
+
/** Per-model thinking capabilities used to clamp and map user-facing effort levels. */
|
|
81
|
+
export interface ThinkingConfig {
|
|
82
|
+
/** Least intensive supported user-facing effort level. */
|
|
83
|
+
minLevel: Effort;
|
|
84
|
+
/** Most intensive supported user-facing effort level. */
|
|
85
|
+
maxLevel: Effort;
|
|
86
|
+
/**
|
|
87
|
+
* Optional explicit list of supported levels. When present, takes precedence over
|
|
88
|
+
* the `minLevel`..`maxLevel` range — used to encode discrete sets with gaps
|
|
89
|
+
* (e.g. Gemini 3 Pro supports `low` and `high` but not `medium`).
|
|
90
|
+
*/
|
|
91
|
+
levels?: readonly Effort[];
|
|
92
|
+
/** Optional default effort applied when this model is selected. Falls back to global default if absent. */
|
|
93
|
+
defaultLevel?: Effort;
|
|
94
|
+
/** Provider-specific transport used to encode the selected effort. */
|
|
95
|
+
mode: ThinkingControlMode;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export type KnownProvider =
|
|
99
|
+
| "alibaba-coding-plan"
|
|
100
|
+
| "amazon-bedrock"
|
|
101
|
+
| "anthropic"
|
|
102
|
+
| "google"
|
|
103
|
+
| "google-gemini-cli"
|
|
104
|
+
| "google-antigravity"
|
|
105
|
+
| "google-vertex"
|
|
106
|
+
| "openai"
|
|
107
|
+
| "openai-codex"
|
|
108
|
+
| "kimi-code"
|
|
109
|
+
| "minimax-code"
|
|
110
|
+
| "minimax-code-cn"
|
|
111
|
+
| "github-copilot"
|
|
112
|
+
| "fireworks"
|
|
113
|
+
| "firepass"
|
|
114
|
+
| "gitlab-duo"
|
|
115
|
+
| "cursor"
|
|
116
|
+
| "deepseek"
|
|
117
|
+
| "xai"
|
|
118
|
+
| "groq"
|
|
119
|
+
| "cerebras"
|
|
120
|
+
| "openrouter"
|
|
121
|
+
| "kilo"
|
|
122
|
+
| "vercel-ai-gateway"
|
|
123
|
+
| "zai"
|
|
124
|
+
| "mistral"
|
|
125
|
+
| "minimax"
|
|
126
|
+
| "opencode-go"
|
|
127
|
+
| "opencode-zen"
|
|
128
|
+
| "synthetic"
|
|
129
|
+
| "cloudflare-ai-gateway"
|
|
130
|
+
| "huggingface"
|
|
131
|
+
| "litellm"
|
|
132
|
+
| "moonshot"
|
|
133
|
+
| "nvidia"
|
|
134
|
+
| "nanogpt"
|
|
135
|
+
| "ollama"
|
|
136
|
+
| "ollama-cloud"
|
|
137
|
+
| "qianfan"
|
|
138
|
+
| "qwen-portal"
|
|
139
|
+
| "together"
|
|
140
|
+
| "venice"
|
|
141
|
+
| "vllm"
|
|
142
|
+
| "xiaomi"
|
|
143
|
+
| "zenmux"
|
|
144
|
+
| "lm-studio";
|
|
145
|
+
export type Provider = KnownProvider | string;
|
|
146
|
+
|
|
147
|
+
import type { Effort } from "./model-thinking";
|
|
148
|
+
|
|
149
|
+
/** Token budgets for each thinking level (token-based providers only) */
|
|
150
|
+
export type ThinkingBudgets = { [key in Effort]?: number };
|
|
151
|
+
|
|
152
|
+
export type MessageAttribution = "user" | "agent";
|
|
153
|
+
|
|
154
|
+
export type ToolChoice =
|
|
155
|
+
| "auto"
|
|
156
|
+
| "none"
|
|
157
|
+
| "any"
|
|
158
|
+
| "required"
|
|
159
|
+
| { type: "function"; name: string }
|
|
160
|
+
| { type: "function"; function: { name: string } }
|
|
161
|
+
| { type: "tool"; name: string };
|
|
162
|
+
|
|
163
|
+
// Base options all providers share
|
|
164
|
+
export type CacheRetention = "none" | "short" | "long";
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Service tier hint for processing priority / cost control.
|
|
168
|
+
*
|
|
169
|
+
* The unscoped values (`"auto"`, `"default"`, `"flex"`, `"scale"`,
|
|
170
|
+
* `"priority"`) are passed through to providers that understand them
|
|
171
|
+
* (OpenAI's `service_tier` field directly; Anthropic translates
|
|
172
|
+
* `"priority"` into `speed: "fast"` on supported Opus models).
|
|
173
|
+
*
|
|
174
|
+
* The scoped values target a specific provider family and behave as the
|
|
175
|
+
* unscoped value on the matching provider, or `undefined` everywhere else.
|
|
176
|
+
* They let users opt into priority on one family without paying premium
|
|
177
|
+
* costs on the other when switching models mid-session.
|
|
178
|
+
*
|
|
179
|
+
* - `"openai-only"` → `"priority"` on `openai` and `OpenAI code provider`; ignored elsewhere.
|
|
180
|
+
* - `"Anthropic model-only"` → `"priority"` on direct `anthropic` (not Bedrock/Vertex Anthropic model).
|
|
181
|
+
*/
|
|
182
|
+
export type ServiceTier = "auto" | "default" | "flex" | "scale" | "priority" | "openai-only" | "claude-only";
|
|
183
|
+
|
|
184
|
+
/** Resolved tier — one of the values that providers actually consume on the wire. */
|
|
185
|
+
export type ResolvedServiceTier = Exclude<ServiceTier, "openai-only" | "claude-only">;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Resolves a possibly scoped `ServiceTier` to the effective tier for the
|
|
189
|
+
* given provider. Scoped values match their target family and otherwise
|
|
190
|
+
* collapse to `undefined`; unscoped values pass through unchanged.
|
|
191
|
+
*/
|
|
192
|
+
export function resolveServiceTier(
|
|
193
|
+
serviceTier: ServiceTier | null | undefined,
|
|
194
|
+
provider: Provider | undefined,
|
|
195
|
+
): ResolvedServiceTier | undefined {
|
|
196
|
+
if (!serviceTier) return undefined;
|
|
197
|
+
switch (serviceTier) {
|
|
198
|
+
case "openai-only":
|
|
199
|
+
return provider === "openai" || provider === "openai-codex" ? "priority" : undefined;
|
|
200
|
+
case "claude-only":
|
|
201
|
+
return provider === "anthropic" ? "priority" : undefined;
|
|
202
|
+
default:
|
|
203
|
+
return serviceTier;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* True when the (possibly scoped) tier should be sent as OpenAI's
|
|
209
|
+
* `service_tier` request field for the given provider. Non-OpenAI
|
|
210
|
+
* providers, unsupported tiers (`"auto"`, `"default"`), and scope
|
|
211
|
+
* mismatches all return false.
|
|
212
|
+
*/
|
|
213
|
+
export function shouldSendServiceTier(
|
|
214
|
+
serviceTier: ServiceTier | null | undefined,
|
|
215
|
+
provider: Provider | undefined,
|
|
216
|
+
): boolean {
|
|
217
|
+
if (provider !== "openai" && provider !== "openai-codex") return false;
|
|
218
|
+
const resolved = resolveServiceTier(serviceTier, provider);
|
|
219
|
+
return resolved === "flex" || resolved === "scale" || resolved === "priority";
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Premium-request weight contributed by sending priority to a provider
|
|
224
|
+
* that supports it. Mirrors GitHub Copilot's `premiumRequests` accounting
|
|
225
|
+
* so the "premium requests" stat aggregates priority traffic across the
|
|
226
|
+
* OpenAI family and Anthropic fast-mode realizations.
|
|
227
|
+
*
|
|
228
|
+
* Returns 1 per resolved priority request, 0 otherwise.
|
|
229
|
+
*/
|
|
230
|
+
export function getPriorityPremiumRequests(
|
|
231
|
+
serviceTier: ServiceTier | null | undefined,
|
|
232
|
+
provider: Provider | undefined,
|
|
233
|
+
): number {
|
|
234
|
+
if (resolveServiceTier(serviceTier, provider) !== "priority") return 0;
|
|
235
|
+
// Only providers that realize `priority` on the wire bill the user.
|
|
236
|
+
// Everywhere else, the field is silently dropped and nothing is charged.
|
|
237
|
+
return provider === "openai" || provider === "openai-codex" || provider === "anthropic" ? 1 : 0;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export interface ProviderSessionState {
|
|
241
|
+
close(): void;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export interface ProviderResponseMetadata {
|
|
245
|
+
status: number;
|
|
246
|
+
headers: Record<string, string>;
|
|
247
|
+
requestId?: string | null;
|
|
248
|
+
metadata?: Record<string, unknown>;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface RawSseEvent {
|
|
252
|
+
event: string | null;
|
|
253
|
+
data: string;
|
|
254
|
+
raw: string[];
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* `fetch`-compatible function. Accepts any callable matching the standard
|
|
259
|
+
* fetch signature; `preconnect` is optional because non-Bun runtimes (browsers,
|
|
260
|
+
* test mocks) won't expose it.
|
|
261
|
+
*/
|
|
262
|
+
export type FetchImpl = ((input: string | URL | Request, init?: RequestInit) => Promise<Response>) & {
|
|
263
|
+
preconnect?: typeof globalThis.fetch.preconnect;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
export interface StreamOptions {
|
|
267
|
+
temperature?: number;
|
|
268
|
+
topP?: number;
|
|
269
|
+
topK?: number;
|
|
270
|
+
minP?: number;
|
|
271
|
+
presencePenalty?: number;
|
|
272
|
+
repetitionPenalty?: number;
|
|
273
|
+
/**
|
|
274
|
+
* Stop sequences. Anthropic encodes as `stop_sequences` (array, max 4);
|
|
275
|
+
* OpenAI chat-completions encodes as `stop` (string or array of up to 4);
|
|
276
|
+
* OpenAI Responses API has no `stop` field today (silently dropped by the
|
|
277
|
+
* provider when present).
|
|
278
|
+
*/
|
|
279
|
+
stopSequences?: string[];
|
|
280
|
+
/**
|
|
281
|
+
* Frequency penalty (OpenAI). Penalizes new tokens based on existing frequency
|
|
282
|
+
* in the text so far. Range -2.0 to 2.0. Parallel to {@link presencePenalty}.
|
|
283
|
+
*/
|
|
284
|
+
frequencyPenalty?: number;
|
|
285
|
+
maxTokens?: number;
|
|
286
|
+
signal?: AbortSignal;
|
|
287
|
+
apiKey?: string;
|
|
288
|
+
/**
|
|
289
|
+
* Called when a provider returns 401 before any replay-unsafe assistant
|
|
290
|
+
* event has been emitted. Returning a different key retries the provider
|
|
291
|
+
* request once.
|
|
292
|
+
*/
|
|
293
|
+
onAuthError?: (provider: string, apiKey: string, error: unknown) => Promise<string | undefined>;
|
|
294
|
+
cacheRetention?: CacheRetention;
|
|
295
|
+
/**
|
|
296
|
+
* Additional headers to include in provider requests.
|
|
297
|
+
* These are merged on top of model-defined headers.
|
|
298
|
+
*/
|
|
299
|
+
headers?: Record<string, string>;
|
|
300
|
+
/**
|
|
301
|
+
* Optional explicit request attribution override for providers that support it.
|
|
302
|
+
*/
|
|
303
|
+
initiatorOverride?: MessageAttribution;
|
|
304
|
+
/**
|
|
305
|
+
* Maximum delay in milliseconds to wait for a retry when the server requests a long wait.
|
|
306
|
+
* If the server's requested delay exceeds this value, the request fails immediately
|
|
307
|
+
* with an error containing the requested delay, allowing higher-level retry logic
|
|
308
|
+
* to handle it with user visibility.
|
|
309
|
+
* Default: 60000 (60 seconds). Set to 0 to disable the cap.
|
|
310
|
+
*/
|
|
311
|
+
maxRetryDelayMs?: number;
|
|
312
|
+
/**
|
|
313
|
+
* Optional metadata to include in API requests.
|
|
314
|
+
* Providers extract the fields they understand and ignore the rest.
|
|
315
|
+
* For example, Anthropic uses `user_id` for abuse tracking and rate limiting.
|
|
316
|
+
*/
|
|
317
|
+
metadata?: Record<string, unknown>;
|
|
318
|
+
/**
|
|
319
|
+
* Optional session identifier for providers that support session-based caching.
|
|
320
|
+
* Providers can use this to enable prompt caching, request routing, or other
|
|
321
|
+
* session-aware features. Ignored by providers that don't support it.
|
|
322
|
+
*/
|
|
323
|
+
sessionId?: string;
|
|
324
|
+
/**
|
|
325
|
+
* Provider-scoped mutable state store for this agent session.
|
|
326
|
+
* Providers can use this to persist transport/session state between turns.
|
|
327
|
+
*/
|
|
328
|
+
providerSessionState?: Map<string, ProviderSessionState>;
|
|
329
|
+
/**
|
|
330
|
+
* Optional callback for inspecting or replacing provider payloads before sending.
|
|
331
|
+
* Return undefined to keep the payload unchanged.
|
|
332
|
+
*/
|
|
333
|
+
onPayload?: (payload: unknown, model?: Model<Api>) => unknown | undefined | Promise<unknown | undefined>;
|
|
334
|
+
/**
|
|
335
|
+
* Optional callback for provider response metadata after headers are received.
|
|
336
|
+
*/
|
|
337
|
+
onResponse?: (response: ProviderResponseMetadata, model?: Model<Api>) => void | Promise<void>;
|
|
338
|
+
/**
|
|
339
|
+
* Optional callback for raw Server-Sent Events as they arrive from HTTP streaming providers.
|
|
340
|
+
*
|
|
341
|
+
* Diagnostic only: provider implementations must ignore callback failures and must not
|
|
342
|
+
* let observers alter stream contents.
|
|
343
|
+
*/
|
|
344
|
+
onSseEvent?: (event: RawSseEvent, model?: Model<Api>) => void;
|
|
345
|
+
/**
|
|
346
|
+
* Optional override for the first streamed event watchdog in milliseconds.
|
|
347
|
+
* Set to 0 to disable the first-event watchdog for this request.
|
|
348
|
+
*/
|
|
349
|
+
streamFirstEventTimeoutMs?: number;
|
|
350
|
+
/**
|
|
351
|
+
* Optional override for the maximum idle gap between streamed events in milliseconds.
|
|
352
|
+
* Set to 0 to disable the inter-event idle watchdog for this request.
|
|
353
|
+
*/
|
|
354
|
+
streamIdleTimeoutMs?: number;
|
|
355
|
+
/**
|
|
356
|
+
* Optional retry delay hook for tests and transports that need custom scheduling.
|
|
357
|
+
*/
|
|
358
|
+
providerRetryWait?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
|
|
359
|
+
/**
|
|
360
|
+
* Optional `fetch` implementation override. Providers route every HTTP
|
|
361
|
+
* request — direct calls, SDK clients, and retry helpers — through this
|
|
362
|
+
* implementation when set. Defaults to `globalThis.fetch`. Providers that
|
|
363
|
+
* do not use `fetch` (Bedrock's AWS SDK transport, Cursor's HTTP/2
|
|
364
|
+
* channel) silently ignore the override.
|
|
365
|
+
*/
|
|
366
|
+
fetch?: FetchImpl;
|
|
367
|
+
/** Cursor exec/MCP tool handlers (cursor-agent only). */
|
|
368
|
+
execHandlers?: CursorExecHandlers;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Unified options with reasoning passed to streamSimple() and completeSimple()
|
|
372
|
+
export interface SimpleStreamOptions extends StreamOptions {
|
|
373
|
+
reasoning?: Effort;
|
|
374
|
+
/**
|
|
375
|
+
* Force-disable reasoning for the request even when the model supports it.
|
|
376
|
+
* Takes precedence over `reasoning`. Useful for fast utility calls
|
|
377
|
+
* (e.g. title generation) where the model would otherwise burn the entire
|
|
378
|
+
* output budget on internal thinking. Provider support is format-specific:
|
|
379
|
+
* some transports can disable reasoning directly, while generic
|
|
380
|
+
* effort-based OpenAI-compatible endpoints use the lowest supported effort.
|
|
381
|
+
*/
|
|
382
|
+
disableReasoning?: boolean;
|
|
383
|
+
/**
|
|
384
|
+
* If true, request that the provider omit thinking/reasoning summaries
|
|
385
|
+
* from the response (e.g. Anthropic `thinking.display = "omitted"`,
|
|
386
|
+
* OpenAI Responses `reasoning.summary` left unset). The model still
|
|
387
|
+
* reasons internally; only the human-readable summary stream is dropped.
|
|
388
|
+
* Useful when the UI hides thinking blocks anyway and the summary is wasted bandwidth.
|
|
389
|
+
*/
|
|
390
|
+
hideThinkingSummary?: boolean;
|
|
391
|
+
/** Custom token budgets for thinking levels (token-based providers only) */
|
|
392
|
+
thinkingBudgets?: ThinkingBudgets;
|
|
393
|
+
/** Cursor exec handlers for local tool execution */
|
|
394
|
+
cursorExecHandlers?: CursorExecHandlers;
|
|
395
|
+
/** Hook to handle tool results from Cursor exec */
|
|
396
|
+
cursorOnToolResult?: CursorToolResultHandler;
|
|
397
|
+
/** Optional tool choice override for compatible providers */
|
|
398
|
+
toolChoice?: ToolChoice;
|
|
399
|
+
/** OpenAI service tier for processing priority/cost control. Ignored by non-OpenAI providers. */
|
|
400
|
+
serviceTier?: ServiceTier;
|
|
401
|
+
/** API format for Kimi Code provider: "openai" or "anthropic" (default: "anthropic") */
|
|
402
|
+
kimiApiFormat?: "openai" | "anthropic";
|
|
403
|
+
/** API format for Synthetic provider: "openai" or "anthropic" (default: "openai") */
|
|
404
|
+
syntheticApiFormat?: "openai" | "anthropic";
|
|
405
|
+
/** Hint that websocket transport should be preferred when supported by the provider implementation. */
|
|
406
|
+
preferWebsockets?: boolean;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Generic StreamFunction with typed options
|
|
410
|
+
export type StreamFunction<TApi extends Api> = (
|
|
411
|
+
model: Model<TApi>,
|
|
412
|
+
context: Context,
|
|
413
|
+
options: OptionsForApi<TApi>,
|
|
414
|
+
) => AssistantMessageEventStream;
|
|
415
|
+
|
|
416
|
+
export interface TextSignatureV1 {
|
|
417
|
+
v: 1;
|
|
418
|
+
id: string;
|
|
419
|
+
phase?: "commentary" | "final_answer";
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
export interface TextContent {
|
|
423
|
+
type: "text";
|
|
424
|
+
text: string;
|
|
425
|
+
textSignature?: string; // e.g., for OpenAI responses, message metadata (legacy id string or TextSignatureV1 JSON)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export interface ThinkingContent {
|
|
429
|
+
type: "thinking";
|
|
430
|
+
thinking: string;
|
|
431
|
+
thinkingSignature?: string; // e.g., for OpenAI responses, the reasoning item ID
|
|
432
|
+
itemId?: string; // item.id from output_item.added, used to match output_item.done
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
export interface RedactedThinkingContent {
|
|
436
|
+
type: "redactedThinking";
|
|
437
|
+
data: string;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
export interface ImageContent {
|
|
441
|
+
type: "image";
|
|
442
|
+
data: string; // base64 encoded image data
|
|
443
|
+
mimeType: string; // e.g., "image/jpeg", "image/png"
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export interface ToolCall {
|
|
447
|
+
type: "toolCall";
|
|
448
|
+
id: string;
|
|
449
|
+
name: string;
|
|
450
|
+
arguments: Record<string, any>;
|
|
451
|
+
thoughtSignature?: string; // Google-specific: opaque signature for reusing thought context
|
|
452
|
+
intent?: string; // Harness-level intent metadata extracted from traced tool arguments
|
|
453
|
+
/**
|
|
454
|
+
* Original wire-level name when the tool was invoked via OpenAI's custom-tool
|
|
455
|
+
* mechanism (e.g., `apply_patch`). Set by `openai-responses` on receive so
|
|
456
|
+
* the history-replay path can re-emit the call as `custom_tool_call` with
|
|
457
|
+
* its paired tool-result as `custom_tool_call_output`. Absent for regular
|
|
458
|
+
* JSON function tools.
|
|
459
|
+
*/
|
|
460
|
+
customWireName?: string;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
export interface Usage {
|
|
464
|
+
/** Non-cached input tokens (matches the bucket the provider bills as new input). */
|
|
465
|
+
input: number;
|
|
466
|
+
/** Total output tokens for the turn, including thinking, assistant text, and tool-call argument tokens. */
|
|
467
|
+
output: number;
|
|
468
|
+
/** Tokens read from the prompt cache. */
|
|
469
|
+
cacheRead: number;
|
|
470
|
+
/** Tokens written to the prompt cache (cache creation). */
|
|
471
|
+
cacheWrite: number;
|
|
472
|
+
/** Sum of input + output + cacheRead + cacheWrite. */
|
|
473
|
+
totalTokens: number;
|
|
474
|
+
/** Copilot premium-request counter, when applicable. */
|
|
475
|
+
premiumRequests?: number;
|
|
476
|
+
/**
|
|
477
|
+
* Reasoning/thinking tokens included in `output`, when the provider reports them
|
|
478
|
+
* (OpenAI `output_tokens_details.reasoning_tokens`, Google `thoughtsTokenCount`).
|
|
479
|
+
* Always a subset of `output` — non-reasoning output is `output - reasoningTokens`.
|
|
480
|
+
*
|
|
481
|
+
* Providers that don't expose this leave it undefined rather than guessing;
|
|
482
|
+
* `undefined` means unknown, NOT zero.
|
|
483
|
+
*/
|
|
484
|
+
reasoningTokens?: number;
|
|
485
|
+
/**
|
|
486
|
+
* Cache-write TTL breakdown (Anthropic only). When set, the components sum to
|
|
487
|
+
* `cacheWrite`. Absent providers do not populate this.
|
|
488
|
+
*/
|
|
489
|
+
cttl?: {
|
|
490
|
+
ephemeral5m?: number;
|
|
491
|
+
ephemeral1h?: number;
|
|
492
|
+
};
|
|
493
|
+
/**
|
|
494
|
+
* Server-side tool invocations made during this turn (Anthropic web_search /
|
|
495
|
+
* web_fetch, OpenAI built-in tools when reported). Counts requests, not tokens.
|
|
496
|
+
*/
|
|
497
|
+
server?: {
|
|
498
|
+
webSearch?: number;
|
|
499
|
+
webFetch?: number;
|
|
500
|
+
};
|
|
501
|
+
cost: {
|
|
502
|
+
input: number;
|
|
503
|
+
output: number;
|
|
504
|
+
cacheRead: number;
|
|
505
|
+
cacheWrite: number;
|
|
506
|
+
total: number;
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
export type StopReason = "stop" | "length" | "toolUse" | "error" | "aborted";
|
|
511
|
+
|
|
512
|
+
export interface OpenAIResponsesHistoryPayload {
|
|
513
|
+
type: "openaiResponsesHistory";
|
|
514
|
+
provider?: string;
|
|
515
|
+
dt?: boolean;
|
|
516
|
+
items: Array<Record<string, unknown>>;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export type ProviderPayload = OpenAIResponsesHistoryPayload;
|
|
520
|
+
|
|
521
|
+
export interface UserMessage {
|
|
522
|
+
role: "user";
|
|
523
|
+
content: string | (TextContent | ImageContent)[];
|
|
524
|
+
/** True if the message was injected by the system (e.g., auto-continue). */
|
|
525
|
+
synthetic?: boolean;
|
|
526
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
527
|
+
attribution?: MessageAttribution;
|
|
528
|
+
/** Provider-specific opaque payload used to reconstruct transport-native history. */
|
|
529
|
+
providerPayload?: ProviderPayload;
|
|
530
|
+
timestamp: number; // Unix timestamp in milliseconds
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export interface DeveloperMessage {
|
|
534
|
+
role: "developer";
|
|
535
|
+
content: string | (TextContent | ImageContent)[];
|
|
536
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
537
|
+
attribution?: MessageAttribution;
|
|
538
|
+
/** Provider-specific opaque payload used to reconstruct transport-native history. */
|
|
539
|
+
providerPayload?: ProviderPayload;
|
|
540
|
+
timestamp: number; // Unix timestamp in milliseconds
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
export interface AssistantMessage {
|
|
544
|
+
role: "assistant";
|
|
545
|
+
content: (TextContent | ThinkingContent | RedactedThinkingContent | ToolCall)[];
|
|
546
|
+
api: Api;
|
|
547
|
+
provider: Provider;
|
|
548
|
+
model: string;
|
|
549
|
+
responseId?: string; // Provider-specific response/message identifier when the upstream API exposes one
|
|
550
|
+
usage: Usage;
|
|
551
|
+
stopReason: StopReason;
|
|
552
|
+
errorMessage?: string;
|
|
553
|
+
/** HTTP status surfaced by the provider when the request failed. Populated by every provider's catch block alongside `errorMessage` so consumers (auth retry, telemetry, UI) can branch without regex-scraping the message. */
|
|
554
|
+
errorStatus?: number;
|
|
555
|
+
/**
|
|
556
|
+
* Stable identifiers for request features the provider silently dropped
|
|
557
|
+
* during this turn (e.g. `"priority"`). Set when a server-side rejection
|
|
558
|
+
* triggered an in-provider fallback retry that succeeded without the
|
|
559
|
+
* feature. Callers can use this to sync user-facing toggles back to the
|
|
560
|
+
* server's actual state.
|
|
561
|
+
*/
|
|
562
|
+
disabledFeatures?: string[];
|
|
563
|
+
/** Provider-specific opaque payload used to reconstruct transport-native history. */
|
|
564
|
+
providerPayload?: ProviderPayload;
|
|
565
|
+
timestamp: number; // Unix timestamp in milliseconds
|
|
566
|
+
duration?: number; // Request duration in milliseconds
|
|
567
|
+
ttft?: number; // Time to first token in milliseconds
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
export interface ToolResultMessage<TDetails = any> {
|
|
571
|
+
role: "toolResult";
|
|
572
|
+
toolCallId: string;
|
|
573
|
+
toolName: string;
|
|
574
|
+
content: (TextContent | ImageContent)[]; // Supports text and images
|
|
575
|
+
details?: TDetails;
|
|
576
|
+
isError: boolean;
|
|
577
|
+
/** Who initiated this message for billing/attribution semantics. */
|
|
578
|
+
attribution?: MessageAttribution;
|
|
579
|
+
/** Timestamp when output was pruned (ms since epoch). Undefined if unpruned. */
|
|
580
|
+
prunedAt?: number;
|
|
581
|
+
timestamp: number; // Unix timestamp in milliseconds
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
export type Message = UserMessage | DeveloperMessage | AssistantMessage | ToolResultMessage;
|
|
585
|
+
|
|
586
|
+
export type CursorExecHandlerResult<T> = { result: T; toolResult?: ToolResultMessage } | T | ToolResultMessage;
|
|
587
|
+
|
|
588
|
+
export type CursorToolResultHandler = (
|
|
589
|
+
result: ToolResultMessage,
|
|
590
|
+
) => ToolResultMessage | undefined | Promise<ToolResultMessage | undefined>;
|
|
591
|
+
|
|
592
|
+
export interface CursorMcpCall {
|
|
593
|
+
name: string;
|
|
594
|
+
providerIdentifier: string;
|
|
595
|
+
toolName: string;
|
|
596
|
+
toolCallId: string;
|
|
597
|
+
args: Record<string, unknown>;
|
|
598
|
+
rawArgs: Record<string, Uint8Array>;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
export interface CursorShellStreamCallbacks {
|
|
602
|
+
onStdout(data: string): void;
|
|
603
|
+
onStderr(data: string): void;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
export interface CursorExecHandlers {
|
|
607
|
+
read?: (args: ReadArgs) => Promise<CursorExecHandlerResult<ReadResult>>;
|
|
608
|
+
ls?: (args: LsArgs) => Promise<CursorExecHandlerResult<LsResult>>;
|
|
609
|
+
grep?: (args: GrepArgs) => Promise<CursorExecHandlerResult<GrepResult>>;
|
|
610
|
+
write?: (args: WriteArgs) => Promise<CursorExecHandlerResult<WriteResult>>;
|
|
611
|
+
delete?: (args: DeleteArgs) => Promise<CursorExecHandlerResult<DeleteResult>>;
|
|
612
|
+
shell?: (args: ShellArgs) => Promise<CursorExecHandlerResult<ShellResult>>;
|
|
613
|
+
shellStream?: (
|
|
614
|
+
args: ShellArgs,
|
|
615
|
+
callbacks: CursorShellStreamCallbacks,
|
|
616
|
+
) => Promise<CursorExecHandlerResult<ShellResult>>;
|
|
617
|
+
diagnostics?: (args: DiagnosticsArgs) => Promise<CursorExecHandlerResult<DiagnosticsResult>>;
|
|
618
|
+
mcp?: (call: CursorMcpCall) => Promise<CursorExecHandlerResult<McpResult>>;
|
|
619
|
+
onToolResult?: CursorToolResultHandler;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Plain JSON Schema document used by extension-authored tools (legacy TypeBox
|
|
624
|
+
* emits this shape). Distinguished from Zod at runtime via {@link isZodSchema}.
|
|
625
|
+
*/
|
|
626
|
+
export type TJsonSchema = Record<string, unknown>;
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Schema type accepted by the {@link Tool} interface.
|
|
630
|
+
*
|
|
631
|
+
* Canonical authoring uses Zod. Extension compat may supply a JSON Schema
|
|
632
|
+
* object (including TypeBox static schema objects).
|
|
633
|
+
*/
|
|
634
|
+
export type TSchema = ZodType | TJsonSchema;
|
|
635
|
+
|
|
636
|
+
/** Resolve parameter types for tool execution / handlers. */
|
|
637
|
+
export type Static<S> = S extends ZodType ? z.infer<S> : S extends { static: infer T } ? T : unknown;
|
|
638
|
+
|
|
639
|
+
export interface Tool<TParameters extends TSchema = TSchema> {
|
|
640
|
+
name: string;
|
|
641
|
+
description: string;
|
|
642
|
+
parameters: TParameters;
|
|
643
|
+
/** If true, tool is strictly typed and validated against the parameters schema before execution */
|
|
644
|
+
strict?: boolean;
|
|
645
|
+
/**
|
|
646
|
+
* Optional grammar constraint for OpenAI custom-tool emission.
|
|
647
|
+
* When set, providers that support grammar-constrained tools (currently only
|
|
648
|
+
* `openai-responses` against models with the right capability flag) may emit
|
|
649
|
+
* this tool as `{type: "custom", format: {type: "grammar", …}}` instead of a
|
|
650
|
+
* JSON function tool. Other providers ignore the field.
|
|
651
|
+
*/
|
|
652
|
+
customFormat?: { syntax: "lark" | "regex"; definition: string };
|
|
653
|
+
/**
|
|
654
|
+
* Optional wire-level name used when this tool is emitted as a custom tool
|
|
655
|
+
* (e.g. OpenAI's `{type: "custom"}` shape). Models trained on specific tool
|
|
656
|
+
* names — like GPT-5 on `apply_patch` — need to see that exact name on the
|
|
657
|
+
* wire, but it may differ from the harness-internal `name`. The agent-loop
|
|
658
|
+
* dispatcher matches both `name` and `customWireName` so returned tool
|
|
659
|
+
* calls route correctly. Absent for regular JSON function tools.
|
|
660
|
+
*/
|
|
661
|
+
customWireName?: string;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
export interface Context {
|
|
665
|
+
systemPrompt?: string[];
|
|
666
|
+
messages: Message[];
|
|
667
|
+
tools?: Tool[];
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
export type AssistantMessageEvent =
|
|
671
|
+
| { type: "start"; contentIndex?: undefined; partial: AssistantMessage }
|
|
672
|
+
| { type: "text_start"; contentIndex: number; partial: AssistantMessage }
|
|
673
|
+
| { type: "text_delta"; contentIndex: number; delta: string; partial: AssistantMessage }
|
|
674
|
+
| { type: "text_end"; contentIndex: number; content: string; partial: AssistantMessage }
|
|
675
|
+
| { type: "thinking_start"; contentIndex: number; partial: AssistantMessage }
|
|
676
|
+
| { type: "thinking_delta"; contentIndex: number; delta: string; partial: AssistantMessage }
|
|
677
|
+
| { type: "thinking_end"; contentIndex: number; content: string; partial: AssistantMessage }
|
|
678
|
+
| { type: "toolcall_start"; contentIndex: number; partial: AssistantMessage }
|
|
679
|
+
| { type: "toolcall_delta"; contentIndex: number; delta: string; partial: AssistantMessage }
|
|
680
|
+
| { type: "toolcall_end"; contentIndex: number; toolCall: ToolCall; partial: AssistantMessage }
|
|
681
|
+
| {
|
|
682
|
+
type: "done";
|
|
683
|
+
contentIndex?: undefined;
|
|
684
|
+
reason: Extract<StopReason, "stop" | "length" | "toolUse">;
|
|
685
|
+
message: AssistantMessage;
|
|
686
|
+
}
|
|
687
|
+
| {
|
|
688
|
+
type: "error";
|
|
689
|
+
contentIndex?: undefined;
|
|
690
|
+
reason: Extract<StopReason, "aborted" | "error">;
|
|
691
|
+
error: AssistantMessage;
|
|
692
|
+
};
|
|
693
|
+
|
|
694
|
+
/**
|
|
695
|
+
* Compatibility settings for openai-completions API.
|
|
696
|
+
* Use this to override URL-based auto-detection for custom providers.
|
|
697
|
+
*/
|
|
698
|
+
export interface OpenAICompat {
|
|
699
|
+
/** Whether the provider supports the `store` field. Default: auto-detected from URL. */
|
|
700
|
+
supportsStore?: boolean;
|
|
701
|
+
/** Whether the provider supports the `developer` role (vs `system`). Default: auto-detected from URL. */
|
|
702
|
+
supportsDeveloperRole?: boolean;
|
|
703
|
+
/**
|
|
704
|
+
* Whether the provider's chat-completions endpoint accepts multiple
|
|
705
|
+
* leading `system`/`developer` messages. When false, ordered system
|
|
706
|
+
* prompts are coalesced into a single message joined by `\n\n` so
|
|
707
|
+
* strict chat templates (e.g. Qwen-served via vLLM, MiniMax) accept
|
|
708
|
+
* the request. Default: detected per provider/baseUrl. Canonical
|
|
709
|
+
* OpenAI/Azure/OpenRouter/Cerebras/Together/Fireworks/Groq/DeepSeek/
|
|
710
|
+
* Mistral/xAI/Z.ai/GitHub Copilot/Zenmux are treated as `true`;
|
|
711
|
+
* unknown or strict-template hosts default to `false`. Setting this
|
|
712
|
+
* to `true` preserves separate blocks, which is preferred for
|
|
713
|
+
* KV-cache reuse when the trailing prompt changes between calls.
|
|
714
|
+
*/
|
|
715
|
+
supportsMultipleSystemMessages?: boolean;
|
|
716
|
+
/** Whether the provider supports `reasoning_effort`. Default: auto-detected from URL. */
|
|
717
|
+
supportsReasoningEffort?: boolean;
|
|
718
|
+
/** Optional mapping from pi-ai reasoning levels to provider/model-specific `reasoning_effort` values. */
|
|
719
|
+
reasoningEffortMap?: Partial<Record<Effort, string>>;
|
|
720
|
+
/** Whether the provider supports `stream_options: { include_usage: true }` for token usage in streaming responses. Default: true. */
|
|
721
|
+
supportsUsageInStreaming?: boolean;
|
|
722
|
+
/** Which field to use for max tokens. Default: auto-detected from URL. */
|
|
723
|
+
maxTokensField?: "max_completion_tokens" | "max_tokens";
|
|
724
|
+
/** Whether tool results require the `name` field. Default: auto-detected from URL. */
|
|
725
|
+
requiresToolResultName?: boolean;
|
|
726
|
+
/** Whether a user message after tool results requires an assistant message in between. Default: auto-detected from URL. */
|
|
727
|
+
requiresAssistantAfterToolResult?: boolean;
|
|
728
|
+
/** Whether thinking blocks must be converted to text blocks with <thinking> delimiters. Default: auto-detected from URL. */
|
|
729
|
+
requiresThinkingAsText?: boolean;
|
|
730
|
+
/** Whether tool call IDs must be normalized to Mistral format (exactly 9 alphanumeric chars). Default: auto-detected from URL. */
|
|
731
|
+
requiresMistralToolIds?: boolean;
|
|
732
|
+
/** Format for reasoning/thinking parameter. "openai" uses reasoning_effort, "openrouter" uses reasoning: { effort }, "zai" uses thinking: { type: "enabled" | "disabled" } (also used by Moonshot Kimi), "qwen" uses top-level enable_thinking, and "qwen-chat-template" uses chat_template_kwargs.enable_thinking. Default: "openai". */
|
|
733
|
+
thinkingFormat?: "openai" | "openrouter" | "zai" | "qwen" | "qwen-chat-template";
|
|
734
|
+
/** Which reasoning content field to emit on assistant messages. Default: auto-detected. */
|
|
735
|
+
reasoningContentField?: "reasoning_content" | "reasoning" | "reasoning_text";
|
|
736
|
+
/** Whether assistant tool-call messages must include reasoning content. Default: false. */
|
|
737
|
+
requiresReasoningContentForToolCalls?: boolean;
|
|
738
|
+
/** Whether the provider accepts a synthetic placeholder (e.g. ".") for missing reasoning_content on tool-call turns. Default: true. Set to false for providers like DeepSeek that validate the exact reasoning_content value. */
|
|
739
|
+
allowsSyntheticReasoningContentForToolCalls?: boolean;
|
|
740
|
+
/** Whether assistant tool-call messages must include non-empty content. Default: false. */
|
|
741
|
+
requiresAssistantContentForToolCalls?: boolean;
|
|
742
|
+
/** Whether the provider supports the `tool_choice` parameter. Default: true. */
|
|
743
|
+
supportsToolChoice?: boolean;
|
|
744
|
+
/**
|
|
745
|
+
* Drop reasoning fields (`reasoning_effort`, OpenRouter `reasoning`) for
|
|
746
|
+
* the request when `tool_choice` forces a tool call. Mirrors the Anthropic
|
|
747
|
+
* `disableThinkingIfToolChoiceForced` rule for backends like Kimi that
|
|
748
|
+
* 400 with `tool_choice 'specified' is incompatible with thinking
|
|
749
|
+
* enabled` whenever both are present. Default: auto-detected (Kimi).
|
|
750
|
+
*/
|
|
751
|
+
disableReasoningOnForcedToolChoice?: boolean;
|
|
752
|
+
/**
|
|
753
|
+
* Drop reasoning fields (`reasoning_effort`, OpenRouter `reasoning`) for
|
|
754
|
+
* any request that sends `tool_choice`. Use for providers/models that accept
|
|
755
|
+
* tools and `tool_choice`, but reject `tool_choice` while thinking is enabled.
|
|
756
|
+
* Default: auto-detected (DeepSeek reasoning models).
|
|
757
|
+
*/
|
|
758
|
+
disableReasoningOnToolChoice?: boolean;
|
|
759
|
+
/** OpenRouter-specific routing preferences. Only used when baseUrl points to OpenRouter. */
|
|
760
|
+
openRouterRouting?: OpenRouterRouting;
|
|
761
|
+
/** Vercel AI Gateway routing preferences. Only used when baseUrl points to Vercel AI Gateway. */
|
|
762
|
+
vercelGatewayRouting?: VercelGatewayRouting;
|
|
763
|
+
/** Extra fields to include in request body (e.g. gateway routing hints for OpenClaw-style proxies). */
|
|
764
|
+
extraBody?: Record<string, unknown>;
|
|
765
|
+
/** Whether the provider supports the `strict` field in tool definitions. Default: auto-detected per provider/baseUrl (conservative for unknown providers). */
|
|
766
|
+
supportsStrictMode?: boolean;
|
|
767
|
+
/** Whether tool schemas must be sent either all strict or all non-strict. Undefined keeps the existing per-tool mixed behavior. */
|
|
768
|
+
toolStrictMode?: "all_strict" | "none";
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
/**
|
|
772
|
+
* Compatibility settings for anthropic-messages API.
|
|
773
|
+
* Use this to disable features that strict-by-default Anthropic accepts but
|
|
774
|
+
* that proxy gateways (Vertex AI, AWS Bedrock-style fronts, etc.) reject.
|
|
775
|
+
*/
|
|
776
|
+
export interface AnthropicCompat {
|
|
777
|
+
/**
|
|
778
|
+
* Drop the top-level `strict: true` field on tool definitions. Vertex AI's
|
|
779
|
+
* Anthropic-compatible endpoint rejects unknown tool fields with
|
|
780
|
+
* `tools.<n>.custom.strict: Extra inputs are not permitted`.
|
|
781
|
+
*/
|
|
782
|
+
disableStrictTools?: boolean;
|
|
783
|
+
/**
|
|
784
|
+
* Map adaptive thinking (`thinking: { type: "adaptive" }`) to
|
|
785
|
+
* `{ type: "enabled", budget_tokens }`. Vertex AI rejects the `adaptive`
|
|
786
|
+
* tag with `Input tag 'adaptive' ... does not match any of the expected
|
|
787
|
+
* tags: 'disabled', 'enabled'`.
|
|
788
|
+
*/
|
|
789
|
+
disableAdaptiveThinking?: boolean;
|
|
790
|
+
/** Whether tools may include Anthropic's per-tool eager_input_streaming flag. Default: true. */
|
|
791
|
+
supportsEagerToolInputStreaming?: boolean;
|
|
792
|
+
/** Whether long prompt-cache retention (`ttl: "1h"`) is supported. Default: true for canonical Anthropic API. */
|
|
793
|
+
supportsLongCacheRetention?: boolean;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/**
|
|
797
|
+
* OpenRouter provider routing preferences.
|
|
798
|
+
* Controls which upstream providers OpenRouter routes requests to.
|
|
799
|
+
* @see https://openrouter.ai/docs/provider-routing
|
|
800
|
+
*/
|
|
801
|
+
export interface OpenRouterRouting {
|
|
802
|
+
/** List of provider slugs to exclusively use for this request (e.g., ["amazon-bedrock", "anthropic"]). */
|
|
803
|
+
only?: string[];
|
|
804
|
+
/** List of provider slugs to try in order (e.g., ["anthropic", "openai"]). */
|
|
805
|
+
order?: string[];
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* Vercel AI Gateway routing preferences.
|
|
810
|
+
* Controls which upstream providers the gateway routes requests to.
|
|
811
|
+
* @see https://vercel.com/docs/ai-gateway/models-and-providers/provider-options
|
|
812
|
+
*/
|
|
813
|
+
export interface VercelGatewayRouting {
|
|
814
|
+
/** List of provider slugs to exclusively use for this request (e.g., ["bedrock", "anthropic"]). */
|
|
815
|
+
only?: string[];
|
|
816
|
+
/** List of provider slugs to try in order (e.g., ["anthropic", "openai"]). */
|
|
817
|
+
order?: string[];
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
// Model interface for the unified model system
|
|
821
|
+
export interface Model<TApi extends Api = any> {
|
|
822
|
+
id: string;
|
|
823
|
+
name: string;
|
|
824
|
+
api: TApi;
|
|
825
|
+
provider: Provider;
|
|
826
|
+
baseUrl: string;
|
|
827
|
+
reasoning: boolean;
|
|
828
|
+
input: ("text" | "image")[];
|
|
829
|
+
cost: {
|
|
830
|
+
input: number; // $/million tokens
|
|
831
|
+
output: number; // $/million tokens
|
|
832
|
+
cacheRead: number; // $/million tokens
|
|
833
|
+
cacheWrite: number; // $/million tokens
|
|
834
|
+
};
|
|
835
|
+
/** Premium Copilot requests charged per user-initiated request (defaults to 1). */
|
|
836
|
+
premiumMultiplier?: number;
|
|
837
|
+
contextWindow: number;
|
|
838
|
+
maxTokens: number;
|
|
839
|
+
headers?: Record<string, string>;
|
|
840
|
+
/**
|
|
841
|
+
* Streaming transport override. When `"pi-native"`, `streamSimple` routes
|
|
842
|
+
* the request to the model's `baseUrl` via the auth-gateway's
|
|
843
|
+
* `POST /v1/pi/stream` endpoint instead of dispatching the per-API
|
|
844
|
+
* provider client. The `baseUrl` must point at an `gjc auth-gateway`
|
|
845
|
+
* (or compatible) host; `headers.Authorization` (or `apiKey` resolved by
|
|
846
|
+
* the registry) carries the gateway bearer.
|
|
847
|
+
*
|
|
848
|
+
* Used by containerized gjc installs (e.g. robogjc slots) to route every
|
|
849
|
+
* LLM call through a sidecar gateway that holds the real provider
|
|
850
|
+
* credentials. The model's other metadata (pricing, context window,
|
|
851
|
+
* thinking config, …) still resolves locally; only the streaming
|
|
852
|
+
* dispatch is redirected.
|
|
853
|
+
*/
|
|
854
|
+
transport?: "pi-native";
|
|
855
|
+
/** Hint that websocket transport should be preferred when supported by the provider implementation. */
|
|
856
|
+
preferWebsockets?: boolean;
|
|
857
|
+
/** Preferred model to switch to when context promotion is triggered (model id or provider/id). */
|
|
858
|
+
contextPromotionTarget?: string;
|
|
859
|
+
/** Provider-assigned priority value (lower = higher priority). */
|
|
860
|
+
priority?: number;
|
|
861
|
+
/** Canonical thinking capability metadata for this model. */
|
|
862
|
+
thinking?: ThinkingConfig;
|
|
863
|
+
/** Compatibility overrides per API. If not set, auto-detected from baseUrl. */
|
|
864
|
+
compat?: TApi extends "openai-completions" | "openai-responses"
|
|
865
|
+
? OpenAICompat
|
|
866
|
+
: TApi extends "anthropic-messages"
|
|
867
|
+
? AnthropicCompat
|
|
868
|
+
: never;
|
|
869
|
+
/**
|
|
870
|
+
* Which shape to use when exposing the OpenAI code backend `apply_patch` tool to this model.
|
|
871
|
+
* Generated catalog policy sets `"freeform"` for first-party GPT-5 Responses
|
|
872
|
+
* models that support OpenAI custom tools with a Lark grammar. The freeform
|
|
873
|
+
* variant sends a raw patch string with no JSON envelope.
|
|
874
|
+
* - `"function"` or undefined: JSON function-tool with `{input: string}` (spec §1.2).
|
|
875
|
+
*/
|
|
876
|
+
applyPatchToolType?: "freeform" | "function";
|
|
877
|
+
/**
|
|
878
|
+
* Force OAuth-style request shaping for providers whose API key prefix doesn't
|
|
879
|
+
* match an OAuth token (e.g. routing Anthropic traffic through a proxy that
|
|
880
|
+
* expects Anthropic Code framing). When true, the streaming layer sets
|
|
881
|
+
* `options.isOAuth = true` for the underlying provider call.
|
|
882
|
+
*/
|
|
883
|
+
isOAuth?: boolean;
|
|
884
|
+
}
|