@vib-rato/ai 0.16.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/CHANGELOG.md +3354 -0
- package/README.md +1194 -0
- package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +80 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/redact.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +153 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +132 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
- package/dist/types/auth-gateway/http.d.ts +40 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +70 -0
- package/dist/types/auth-gateway/types.d.ts +129 -0
- package/dist/types/auth-storage.d.ts +1074 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/codex-tools.d.ts +4 -0
- package/dist/types/context-cap-policy.d.ts +68 -0
- package/dist/types/core.d.ts +35 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/model-cache.d.ts +24 -0
- package/dist/types/model-manager.d.ts +77 -0
- package/dist/types/model-pricing.d.ts +3 -0
- package/dist/types/model-retirements.d.ts +6 -0
- package/dist/types/model-thinking.d.ts +100 -0
- package/dist/types/models.d.ts +21 -0
- package/dist/types/openai-completions-compat.d.ts +34 -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 +293 -0
- package/dist/types/provider-models/special.d.ts +29 -0
- package/dist/types/providers/amazon-bedrock.d.ts +60 -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 +280 -0
- package/dist/types/providers/aws-credential-config.d.ts +19 -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 +22 -0
- package/dist/types/providers/composer-discipline.d.ts +32 -0
- package/dist/types/providers/cursor/client-version.d.ts +10 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
- package/dist/types/providers/cursor-pi-args.d.ts +119 -0
- package/dist/types/providers/cursor.d.ts +72 -0
- package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -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 +26 -0
- package/dist/types/providers/google-gemini-cli.d.ts +75 -0
- package/dist/types/providers/google-gemini-headers.d.ts +43 -0
- package/dist/types/providers/google-shared.d.ts +183 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +11 -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/kiro-api-key.d.ts +50 -0
- package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
- package/dist/types/providers/mock.d.ts +189 -0
- package/dist/types/providers/ollama.d.ts +41 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -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 +50 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
- package/dist/types/providers/openai-codex-responses.d.ts +71 -0
- package/dist/types/providers/openai-completions-compat.d.ts +6 -0
- package/dist/types/providers/openai-completions.d.ts +35 -0
- package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
- package/dist/types/providers/openai-request-transform.d.ts +4 -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 +106 -0
- package/dist/types/providers/openai-responses.d.ts +37 -0
- package/dist/types/providers/pi-native-client.d.ts +29 -0
- package/dist/types/providers/pi-native-server.d.ts +60 -0
- package/dist/types/providers/register-builtins.d.ts +59 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +33 -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 +45 -0
- package/dist/types/types.d.ts +1073 -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/grok-cli.d.ts +17 -0
- package/dist/types/usage/kimi.d.ts +4 -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 +264 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +39 -0
- package/dist/types/utils/block-symbols.d.ts +6 -0
- package/dist/types/utils/discovery/antigravity.d.ts +67 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +49 -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 +81 -0
- package/dist/types/utils/event-stream.d.ts +41 -0
- package/dist/types/utils/fallback-transport.d.ts +110 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +11 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +59 -0
- package/dist/types/utils/idle-iterator.d.ts +122 -0
- package/dist/types/utils/json-parse.d.ts +98 -0
- package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
- package/dist/types/utils/oauth/anthropic.d.ts +41 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
- package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
- package/dist/types/utils/oauth/callback-server.d.ts +80 -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/commandcode.d.ts +1 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepinfra.d.ts +1 -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/fugu.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/glm-zcode.d.ts +71 -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 +39 -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 +17 -0
- package/dist/types/utils/oauth/kiro.d.ts +71 -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/mara.d.ts +1 -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/opengateway.d.ts +1 -0
- package/dist/types/utils/oauth/openrouter.d.ts +1 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +4 -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/sglang.d.ts +16 -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 +56 -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/xai.d.ts +30 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +25 -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 +14 -0
- package/dist/types/utils/parse-bind.d.ts +26 -0
- package/dist/types/utils/provider-response.d.ts +6 -0
- package/dist/types/utils/provider-safety-stop.d.ts +8 -0
- package/dist/types/utils/proxy.d.ts +7 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry-budget.d.ts +1 -0
- package/dist/types/utils/retry.d.ts +29 -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 +14 -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/root-combinator.d.ts +12 -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 +80 -0
- package/dist/types/utils/tool-choice-capability.d.ts +57 -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 +117 -0
- package/package.json +152 -0
- package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
- package/src/adapter-internals/provider-safety-stop.ts +156 -0
- package/src/api-registry.d.ts +30 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +444 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/redact.ts +39 -0
- package/src/auth-broker/refresher.ts +130 -0
- package/src/auth-broker/remote-store.ts +1576 -0
- package/src/auth-broker/server.ts +764 -0
- package/src/auth-broker/types.ts +164 -0
- package/src/auth-broker/wire-schemas.ts +261 -0
- package/src/auth-gateway/http.ts +198 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +1315 -0
- package/src/auth-gateway/types.ts +160 -0
- package/src/auth-storage.ts +7312 -0
- package/src/cli.ts +269 -0
- package/src/codex-tools.d.ts +4 -0
- package/src/codex-tools.ts +24 -0
- package/src/context-cap-policy.d.ts +68 -0
- package/src/context-cap-policy.ts +123 -0
- package/src/core.ts +44 -0
- package/src/index.ts +61 -0
- package/src/model-cache.ts +236 -0
- package/src/model-manager.ts +744 -0
- package/src/model-pricing.d.ts +3 -0
- package/src/model-pricing.ts +68 -0
- package/src/model-retirements.d.ts +6 -0
- package/src/model-retirements.ts +19 -0
- package/src/model-thinking.d.ts +100 -0
- package/src/model-thinking.ts +1054 -0
- package/src/models.d.ts +21 -0
- package/src/models.json +94672 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +126 -0
- package/src/openai-completions-compat.d.ts +34 -0
- package/src/openai-completions-compat.ts +383 -0
- package/src/prompts/composer-bash-policy-recovery.md +1 -0
- package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
- package/src/prompts/cursor-composer-edit-discipline.md +7 -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 +392 -0
- package/src/provider-models/google.ts +92 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +159 -0
- package/src/provider-models/openai-compat.ts +2920 -0
- package/src/provider-models/special.ts +185 -0
- package/src/providers/amazon-bedrock.d.ts +60 -0
- package/src/providers/amazon-bedrock.ts +939 -0
- package/src/providers/anthropic-messages-server-schema.ts +229 -0
- package/src/providers/anthropic-messages-server.ts +839 -0
- package/src/providers/anthropic.d.ts +280 -0
- package/src/providers/anthropic.ts +4421 -0
- package/src/providers/aws-credential-config.d.ts +19 -0
- package/src/providers/aws-credential-config.ts +179 -0
- package/src/providers/aws-credentials.d.ts +43 -0
- package/src/providers/aws-credentials.ts +457 -0
- package/src/providers/aws-eventstream.d.ts +38 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.d.ts +55 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.d.ts +22 -0
- package/src/providers/azure-openai-responses.ts +447 -0
- package/src/providers/composer-discipline.d.ts +32 -0
- package/src/providers/composer-discipline.ts +95 -0
- package/src/providers/cursor/client-version.d.ts +10 -0
- package/src/providers/cursor/client-version.ts +10 -0
- package/src/providers/cursor/exec-modern.d.ts +98 -0
- package/src/providers/cursor/exec-modern.ts +497 -0
- package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
- package/src/providers/cursor/gen/agent_pb.ts +19780 -0
- package/src/providers/cursor/proto/agent.proto +4533 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor-pi-args.d.ts +119 -0
- package/src/providers/cursor-pi-args.ts +187 -0
- package/src/providers/cursor.d.ts +72 -0
- package/src/providers/cursor.ts +3396 -0
- package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
- package/src/providers/dashscope-token-plan-headers.ts +84 -0
- package/src/providers/error-message.d.ts +27 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.d.ts +40 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.d.ts +27 -0
- package/src/providers/gitlab-duo.ts +393 -0
- package/src/providers/google-auth.d.ts +26 -0
- package/src/providers/google-auth.ts +262 -0
- package/src/providers/google-gemini-cli.d.ts +75 -0
- package/src/providers/google-gemini-cli.ts +969 -0
- package/src/providers/google-gemini-headers.d.ts +43 -0
- package/src/providers/google-gemini-headers.ts +100 -0
- package/src/providers/google-shared.d.ts +183 -0
- package/src/providers/google-shared.ts +1105 -0
- package/src/providers/google-types.d.ts +138 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.d.ts +11 -0
- package/src/providers/google-vertex.ts +124 -0
- package/src/providers/google.d.ts +4 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.d.ts +1 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.d.ts +27 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/kiro-api-key.d.ts +50 -0
- package/src/providers/kiro-api-key.ts +786 -0
- package/src/providers/kiro-codewhisperer.d.ts +11 -0
- package/src/providers/kiro-codewhisperer.ts +600 -0
- package/src/providers/mock.ts +526 -0
- package/src/providers/ollama.d.ts +41 -0
- package/src/providers/ollama.ts +645 -0
- package/src/providers/openai-anthropic-shim.d.ts +31 -0
- package/src/providers/openai-anthropic-shim.ts +156 -0
- package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
- package/src/providers/openai-bounded-rate-limits.ts +57 -0
- package/src/providers/openai-chat-server-schema.ts +254 -0
- package/src/providers/openai-chat-server.ts +724 -0
- package/src/providers/openai-codex/constants.d.ts +26 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.d.ts +50 -0
- package/src/providers/openai-codex/request-transformer.ts +219 -0
- package/src/providers/openai-codex/response-handler.d.ts +18 -0
- package/src/providers/openai-codex/response-handler.ts +111 -0
- package/src/providers/openai-codex-responses.d.ts +71 -0
- package/src/providers/openai-codex-responses.ts +3288 -0
- package/src/providers/openai-completions-compat.d.ts +6 -0
- package/src/providers/openai-completions-compat.ts +6 -0
- package/src/providers/openai-completions.d.ts +35 -0
- package/src/providers/openai-completions.ts +2294 -0
- package/src/providers/openai-opencodex-responses.ts +174 -0
- package/src/providers/openai-request-transform.d.ts +4 -0
- package/src/providers/openai-request-transform.ts +136 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1268 -0
- package/src/providers/openai-responses-shared.d.ts +106 -0
- package/src/providers/openai-responses-shared.ts +1253 -0
- package/src/providers/openai-responses.d.ts +37 -0
- package/src/providers/openai-responses.ts +989 -0
- package/src/providers/pi-native-client.d.ts +29 -0
- package/src/providers/pi-native-client.ts +243 -0
- package/src/providers/pi-native-server.ts +488 -0
- package/src/providers/register-builtins.d.ts +59 -0
- package/src/providers/register-builtins.ts +544 -0
- package/src/providers/synthetic.d.ts +26 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.d.ts +33 -0
- package/src/providers/transform-messages.ts +408 -0
- package/src/providers/vision-guard.d.ts +8 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/rate-limit-utils.d.ts +19 -0
- package/src/rate-limit-utils.ts +102 -0
- package/src/stream.d.ts +45 -0
- package/src/stream.ts +1306 -0
- package/src/types.d.ts +1073 -0
- package/src/types.ts +1305 -0
- package/src/usage/claude.ts +449 -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/grok-cli.ts +259 -0
- package/src/usage/kimi.ts +285 -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 +190 -0
- package/src/utils/abort.d.ts +19 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/anthropic-auth.ts +95 -0
- package/src/utils/block-symbols.d.ts +6 -0
- package/src/utils/block-symbols.ts +11 -0
- package/src/utils/discovery/antigravity.ts +275 -0
- package/src/utils/discovery/codex.ts +362 -0
- package/src/utils/discovery/cursor.ts +388 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +379 -0
- package/src/utils/event-stream.d.ts +41 -0
- package/src/utils/event-stream.ts +269 -0
- package/src/utils/fallback-transport.d.ts +110 -0
- package/src/utils/fallback-transport.ts +411 -0
- package/src/utils/fireworks-model-id.d.ts +10 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.d.ts +11 -0
- package/src/utils/foundry.ts +18 -0
- package/src/utils/h2-fetch.ts +60 -0
- package/src/utils/http-inspector.d.ts +59 -0
- package/src/utils/http-inspector.ts +380 -0
- package/src/utils/idle-iterator.d.ts +122 -0
- package/src/utils/idle-iterator.ts +410 -0
- package/src/utils/json-parse.d.ts +98 -0
- package/src/utils/json-parse.ts +607 -0
- package/src/utils/oauth/alibaba-token-plan.ts +60 -0
- package/src/utils/oauth/anthropic.ts +233 -0
- package/src/utils/oauth/api-key-login.ts +98 -0
- package/src/utils/oauth/api-key-validation.ts +344 -0
- package/src/utils/oauth/bizrouter.ts +15 -0
- package/src/utils/oauth/callback-server.d.ts +80 -0
- package/src/utils/oauth/callback-server.ts +359 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/commandcode.ts +17 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepinfra.ts +15 -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/fugu.ts +15 -0
- package/src/utils/oauth/github-copilot.d.ts +38 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/glm-zcode.d.ts +71 -0
- package/src/utils/oauth/glm-zcode.ts +433 -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 +558 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.d.ts +17 -0
- package/src/utils/oauth/kimi.ts +275 -0
- package/src/utils/oauth/kiro.ts +448 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/mara.ts +16 -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/opengateway.ts +15 -0
- package/src/utils/oauth/openrouter.ts +16 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +225 -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/sglang.ts +42 -0
- package/src/utils/oauth/synthetic.ts +15 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.d.ts +56 -0
- package/src/utils/oauth/types.ts +122 -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 +42 -0
- package/src/utils/oauth/xai.ts +246 -0
- package/src/utils/oauth/xiaomi.ts +199 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/overflow.ts +275 -0
- package/src/utils/parse-bind.ts +81 -0
- package/src/utils/provider-response.d.ts +6 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/provider-safety-stop.ts +8 -0
- package/src/utils/proxy.d.ts +7 -0
- package/src/utils/proxy.ts +652 -0
- package/src/utils/retry-after.d.ts +3 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry-budget.d.ts +1 -0
- package/src/utils/retry-budget.ts +4 -0
- package/src/utils/retry.d.ts +29 -0
- package/src/utils/retry.ts +67 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.d.ts +24 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.d.ts +30 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.d.ts +11 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.d.ts +10 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.d.ts +4 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.d.ts +49 -0
- package/src/utils/schema/fields.ts +190 -0
- package/src/utils/schema/index.d.ts +14 -0
- package/src/utils/schema/index.ts +14 -0
- package/src/utils/schema/json-schema-validator.d.ts +12 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.d.ts +2 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.d.ts +93 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/root-combinator.d.ts +12 -0
- package/src/utils/schema/root-combinator.ts +143 -0
- package/src/utils/schema/spill.d.ts +8 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.d.ts +25 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.d.ts +4 -0
- package/src/utils/schema/types.ts +11 -0
- package/src/utils/schema/wire.d.ts +54 -0
- package/src/utils/schema/wire.ts +213 -0
- package/src/utils/schema/zod-decontaminate.d.ts +31 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sse-debug.d.ts +10 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/tool-call-healing.d.ts +80 -0
- package/src/utils/tool-call-healing.ts +298 -0
- package/src/utils/tool-choice-capability.d.ts +57 -0
- package/src/utils/tool-choice-capability.ts +633 -0
- package/src/utils/tool-choice.d.ts +50 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1080 -0
- package/src/utils.d.ts +117 -0
- package/src/utils.ts +523 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as net from "node:net";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
|
|
6
|
+
import type { Model } from "../types";
|
|
7
|
+
|
|
8
|
+
export const OPENCODEX_DEFAULT_PORT = 10100;
|
|
9
|
+
export const OPENCODEX_PROBE_TIMEOUT_MS = 750;
|
|
10
|
+
export const OPENCODEX_MODEL_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
11
|
+
|
|
12
|
+
interface RuntimePortFile {
|
|
13
|
+
hostname?: unknown;
|
|
14
|
+
host?: unknown;
|
|
15
|
+
port?: unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface HealthPayload {
|
|
19
|
+
ok?: unknown;
|
|
20
|
+
pid?: unknown;
|
|
21
|
+
port?: unknown;
|
|
22
|
+
version?: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface CatalogRow {
|
|
26
|
+
id?: unknown;
|
|
27
|
+
model?: unknown;
|
|
28
|
+
name?: unknown;
|
|
29
|
+
displayName?: unknown;
|
|
30
|
+
contextWindow?: unknown;
|
|
31
|
+
maxTokens?: unknown;
|
|
32
|
+
reasoning?: unknown;
|
|
33
|
+
input?: unknown;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface OpenCodexEndpoint {
|
|
37
|
+
baseUrl: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function timeoutSignal(signal?: AbortSignal): AbortSignal {
|
|
41
|
+
return signal
|
|
42
|
+
? AbortSignal.any([signal, AbortSignal.timeout(OPENCODEX_PROBE_TIMEOUT_MS)])
|
|
43
|
+
: AbortSignal.timeout(OPENCODEX_PROBE_TIMEOUT_MS);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function normalizeEndpoint(hostname: string, port: number): string | undefined {
|
|
47
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) return undefined;
|
|
48
|
+
const host = normalizeLoopbackHost(hostname);
|
|
49
|
+
if (!host) return undefined;
|
|
50
|
+
return `http://${formatEndpointHost(host)}:${port}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function normalizeLoopbackHost(hostname: string): string | undefined {
|
|
54
|
+
const host = hostname.trim().toLowerCase();
|
|
55
|
+
if (net.isIP(host) === 4 && host.startsWith("127.")) return host;
|
|
56
|
+
if (host === "::1") return host;
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function formatEndpointHost(host: string): string {
|
|
61
|
+
return host.includes(":") ? `[${host}]` : host;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function healthPort(endpoint: string): number {
|
|
65
|
+
return Number(new URL(endpoint).port);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function readRuntimeEndpoint(): Promise<string | undefined> {
|
|
69
|
+
const home = process.env.OPENCODEX_HOME?.trim() || path.join(os.homedir(), ".opencodex");
|
|
70
|
+
try {
|
|
71
|
+
const raw = JSON.parse(await fs.readFile(path.join(home, "runtime-port.json"), "utf8")) as RuntimePortFile;
|
|
72
|
+
const hostname =
|
|
73
|
+
typeof raw.hostname === "string" ? raw.hostname : typeof raw.host === "string" ? raw.host : "127.0.0.1";
|
|
74
|
+
const port = typeof raw.port === "number" ? raw.port : typeof raw.port === "string" ? Number(raw.port) : NaN;
|
|
75
|
+
return normalizeEndpoint(hostname, port);
|
|
76
|
+
} catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function candidateEndpoints(runtimeEndpoint: string | undefined): string[] {
|
|
82
|
+
const candidates = runtimeEndpoint ? [runtimeEndpoint] : [];
|
|
83
|
+
const fallback = normalizeEndpoint("127.0.0.1", OPENCODEX_DEFAULT_PORT);
|
|
84
|
+
if (fallback && !candidates.includes(fallback)) candidates.push(fallback);
|
|
85
|
+
return candidates;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function fetchJson(url: string, signal?: AbortSignal): Promise<unknown> {
|
|
89
|
+
const response = await fetch(url, {
|
|
90
|
+
headers: { Accept: "application/json" },
|
|
91
|
+
redirect: "error",
|
|
92
|
+
signal: timeoutSignal(signal),
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok) return undefined;
|
|
95
|
+
return response.json();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function isOpenCodexHealth(payload: unknown, expectedPort: number): boolean {
|
|
99
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
|
|
100
|
+
const health = payload as HealthPayload;
|
|
101
|
+
return health.ok === true && health.version === "opencodex" && health.port === expectedPort;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export async function resolveOpenCodexEndpoint(signal?: AbortSignal): Promise<OpenCodexEndpoint | undefined> {
|
|
105
|
+
const runtimeEndpoint = await readRuntimeEndpoint();
|
|
106
|
+
for (const candidate of candidateEndpoints(runtimeEndpoint)) {
|
|
107
|
+
try {
|
|
108
|
+
const health = await fetchJson(`${candidate}/healthz`, signal);
|
|
109
|
+
if (isOpenCodexHealth(health, healthPort(candidate))) return { baseUrl: candidate };
|
|
110
|
+
} catch {
|
|
111
|
+
// An unavailable or foreign listener is a normal provider absence.
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function asPositiveNumber(value: unknown, fallback: number): number {
|
|
118
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function normalizeCatalogPayload(payload: unknown): CatalogRow[] {
|
|
122
|
+
if (Array.isArray(payload)) return payload as CatalogRow[];
|
|
123
|
+
if (payload && typeof payload === "object" && Array.isArray((payload as { models?: unknown }).models)) {
|
|
124
|
+
return (payload as { models: CatalogRow[] }).models;
|
|
125
|
+
}
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function normalizeModel(row: CatalogRow, endpoint: OpenCodexEndpoint): Model<"openai-responses"> | undefined {
|
|
130
|
+
const rawId = typeof row.id === "string" ? row.id.trim() : typeof row.model === "string" ? row.model.trim() : "";
|
|
131
|
+
if (!rawId || rawId.includes("\n")) return undefined;
|
|
132
|
+
const publicId = `opencodex/${rawId}`;
|
|
133
|
+
const input =
|
|
134
|
+
Array.isArray(row.input) && row.input.every(value => value === "text" || value === "image")
|
|
135
|
+
? row.input
|
|
136
|
+
: ["text"];
|
|
137
|
+
return {
|
|
138
|
+
id: publicId,
|
|
139
|
+
wireModelId: rawId,
|
|
140
|
+
name: typeof row.displayName === "string" ? row.displayName : typeof row.name === "string" ? row.name : rawId,
|
|
141
|
+
api: "openai-responses",
|
|
142
|
+
provider: "opencodex",
|
|
143
|
+
baseUrl: `${endpoint.baseUrl}/v1`,
|
|
144
|
+
compat: { supportsServiceTier: true },
|
|
145
|
+
reasoning: row.reasoning !== false,
|
|
146
|
+
input,
|
|
147
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
148
|
+
contextWindow: asPositiveNumber(row.contextWindow, 128_000),
|
|
149
|
+
maxTokens: asPositiveNumber(row.maxTokens, 16_384),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export async function fetchOpenCodexModels(): Promise<readonly Model<"openai-responses">[] | null> {
|
|
154
|
+
const endpoint = await resolveOpenCodexEndpoint();
|
|
155
|
+
if (!endpoint) return null;
|
|
156
|
+
try {
|
|
157
|
+
const rows = normalizeCatalogPayload(await fetchJson(`${endpoint.baseUrl}/api/models`));
|
|
158
|
+
const models = rows
|
|
159
|
+
.map(row => normalizeModel(row, endpoint))
|
|
160
|
+
.filter((model): model is Model<"openai-responses"> => model !== undefined);
|
|
161
|
+
return models.length > 0 ? models : null;
|
|
162
|
+
} catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export async function checkOpenCodexStatus(onProgress?: (message: string) => void): Promise<void> {
|
|
168
|
+
const endpoint = await resolveOpenCodexEndpoint();
|
|
169
|
+
if (endpoint) {
|
|
170
|
+
onProgress?.(`OpenCodex is available at ${endpoint.baseUrl}`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
onProgress?.("OpenCodex is unavailable; no identity-checked local proxy was found.");
|
|
174
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FetchImpl, ModelRequestTransform } from "../types";
|
|
2
|
+
export declare function applyOpenAIRequestTransformHeaders(headers: Record<string, string>, transform: ModelRequestTransform | undefined, profileUserAgent: string): Record<string, string>;
|
|
3
|
+
export declare function applyOpenAIRequestTransformBody(params: object, transform: ModelRequestTransform | undefined): void;
|
|
4
|
+
export declare function wrapFetchForOpenAIRequestTransform(baseFetch: FetchImpl, transform: ModelRequestTransform | undefined, profileUserAgent: string): FetchImpl;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { FetchImpl, ModelRequestTransform } from "../types";
|
|
2
|
+
|
|
3
|
+
const PROTECTED_EXTRA_BODY_KEYS = new Set([
|
|
4
|
+
"model",
|
|
5
|
+
"messages",
|
|
6
|
+
"input",
|
|
7
|
+
"instructions",
|
|
8
|
+
"stream",
|
|
9
|
+
"stream_options",
|
|
10
|
+
"store",
|
|
11
|
+
"max_tokens",
|
|
12
|
+
"max_completion_tokens",
|
|
13
|
+
"max_output_tokens",
|
|
14
|
+
"temperature",
|
|
15
|
+
"top_p",
|
|
16
|
+
"presence_penalty",
|
|
17
|
+
"frequency_penalty",
|
|
18
|
+
"reasoning",
|
|
19
|
+
"reasoning_effort",
|
|
20
|
+
"prompt_cache_key",
|
|
21
|
+
"prompt_cache_retention",
|
|
22
|
+
"service_tier",
|
|
23
|
+
"stop",
|
|
24
|
+
"tools",
|
|
25
|
+
"tool_choice",
|
|
26
|
+
"parallel_tool_calls",
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
const OPENAI_PROXY_STRIP_HEADERS = [
|
|
30
|
+
"x-stainless-arch",
|
|
31
|
+
"x-stainless-async",
|
|
32
|
+
"x-stainless-lang",
|
|
33
|
+
"x-stainless-os",
|
|
34
|
+
"x-stainless-package-version",
|
|
35
|
+
"x-stainless-retry-count",
|
|
36
|
+
"x-stainless-runtime",
|
|
37
|
+
"x-stainless-runtime-version",
|
|
38
|
+
"x-stainless-timeout",
|
|
39
|
+
"x-stainless-helper-method",
|
|
40
|
+
"openai-organization",
|
|
41
|
+
"openai-project",
|
|
42
|
+
"openai-beta",
|
|
43
|
+
] as const;
|
|
44
|
+
|
|
45
|
+
function resolveRequestTransform(
|
|
46
|
+
transform: ModelRequestTransform | undefined,
|
|
47
|
+
profileUserAgent: string,
|
|
48
|
+
): ModelRequestTransform | undefined {
|
|
49
|
+
if (!transform) return undefined;
|
|
50
|
+
const profileTransform: ModelRequestTransform =
|
|
51
|
+
transform.profile === "openai-proxy"
|
|
52
|
+
? {
|
|
53
|
+
stripHeaders: [...OPENAI_PROXY_STRIP_HEADERS],
|
|
54
|
+
setHeaders: { "User-Agent": profileUserAgent },
|
|
55
|
+
}
|
|
56
|
+
: {};
|
|
57
|
+
return {
|
|
58
|
+
...profileTransform,
|
|
59
|
+
...transform,
|
|
60
|
+
stripHeaders: transform.stripHeaders ?? profileTransform.stripHeaders,
|
|
61
|
+
setHeaders: transform.setHeaders
|
|
62
|
+
? { ...(profileTransform.setHeaders ?? {}), ...transform.setHeaders }
|
|
63
|
+
: profileTransform.setHeaders,
|
|
64
|
+
extraBody: transform.extraBody,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function deleteHeaders(headers: Headers, names: readonly string[] | undefined): void {
|
|
69
|
+
for (const name of names ?? []) {
|
|
70
|
+
headers.delete(name);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function setHeaders(headers: Headers, values: Record<string, string | null> | undefined): void {
|
|
75
|
+
for (const [name, value] of Object.entries(values ?? {})) {
|
|
76
|
+
if (value === null) {
|
|
77
|
+
headers.delete(name);
|
|
78
|
+
} else {
|
|
79
|
+
headers.set(name, value);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function transformHeaders(
|
|
85
|
+
headers: RequestInit["headers"] | undefined,
|
|
86
|
+
transform: ModelRequestTransform | undefined,
|
|
87
|
+
): Headers {
|
|
88
|
+
const result = new Headers(headers);
|
|
89
|
+
deleteHeaders(result, transform?.stripHeaders);
|
|
90
|
+
setHeaders(result, transform?.setHeaders);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function applyOpenAIRequestTransformHeaders(
|
|
95
|
+
headers: Record<string, string>,
|
|
96
|
+
transform: ModelRequestTransform | undefined,
|
|
97
|
+
profileUserAgent: string,
|
|
98
|
+
): Record<string, string> {
|
|
99
|
+
const resolved = resolveRequestTransform(transform, profileUserAgent);
|
|
100
|
+
if (!resolved) return headers;
|
|
101
|
+
return Object.fromEntries(transformHeaders(headers, resolved).entries());
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function applyOpenAIRequestTransformBody(params: object, transform: ModelRequestTransform | undefined): void {
|
|
105
|
+
if (!transform?.extraBody) return;
|
|
106
|
+
const body = params as Record<string, unknown>;
|
|
107
|
+
for (const [key, value] of Object.entries(transform.extraBody)) {
|
|
108
|
+
if (!PROTECTED_EXTRA_BODY_KEYS.has(key) && !(key in body)) {
|
|
109
|
+
body[key] = value;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function wrapFetchForOpenAIRequestTransform(
|
|
115
|
+
baseFetch: FetchImpl,
|
|
116
|
+
transform: ModelRequestTransform | undefined,
|
|
117
|
+
profileUserAgent: string,
|
|
118
|
+
): FetchImpl {
|
|
119
|
+
const resolved = resolveRequestTransform(transform, profileUserAgent);
|
|
120
|
+
if (!resolved) return baseFetch;
|
|
121
|
+
return Object.assign(
|
|
122
|
+
async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {
|
|
123
|
+
if (input instanceof Request) {
|
|
124
|
+
const request = new Request(input, init);
|
|
125
|
+
deleteHeaders(request.headers, resolved.stripHeaders);
|
|
126
|
+
setHeaders(request.headers, resolved.setHeaders);
|
|
127
|
+
return baseFetch(request);
|
|
128
|
+
}
|
|
129
|
+
return baseFetch(input, {
|
|
130
|
+
...init,
|
|
131
|
+
headers: transformHeaders(init?.headers, resolved),
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
baseFetch.preconnect ? { preconnect: baseFetch.preconnect } : {},
|
|
135
|
+
);
|
|
136
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for the OpenAI Responses API request shape we accept on the
|
|
3
|
+
* gateway. Mirrors https://platform.openai.com/docs/api-reference/responses.
|
|
4
|
+
*
|
|
5
|
+
* Unsupported / opaque controls (background/include/metadata/prompt/…) are
|
|
6
|
+
* accepted as `z.unknown().optional()` so we silently ignore rather than 400.
|
|
7
|
+
* Real clients (OpenAI code backend, openai-python, llm-git) routinely send these and a 400
|
|
8
|
+
* is a worse outcome than dropping them on the floor.
|
|
9
|
+
*/
|
|
10
|
+
import type {
|
|
11
|
+
EasyInputMessage,
|
|
12
|
+
ResponseCreateParams,
|
|
13
|
+
ResponseFunctionToolCall,
|
|
14
|
+
ResponseInputContent,
|
|
15
|
+
ResponseInputItem,
|
|
16
|
+
ResponseOutputMessage,
|
|
17
|
+
ResponseReasoningItem,
|
|
18
|
+
Tool as ResponsesTool,
|
|
19
|
+
} from "openai/resources/responses/responses";
|
|
20
|
+
import * as z from "zod/v4";
|
|
21
|
+
|
|
22
|
+
// ─── Input content blocks ───────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
const inputTextSchema = z.object({
|
|
25
|
+
type: z.literal("input_text"),
|
|
26
|
+
text: z.string(),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const plainTextSchema = z.object({
|
|
30
|
+
type: z.literal("text"),
|
|
31
|
+
text: z.string(),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const inputImageBlockSchema = z
|
|
35
|
+
.object({
|
|
36
|
+
type: z.literal("input_image"),
|
|
37
|
+
detail: z.enum(["auto", "low", "high"]).optional(),
|
|
38
|
+
image_url: z.string().optional(),
|
|
39
|
+
file_id: z.string().optional(),
|
|
40
|
+
})
|
|
41
|
+
.refine(v => typeof v.image_url === "string" || typeof v.file_id === "string", {
|
|
42
|
+
message: "input_image requires at least one of `image_url` or `file_id`",
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const inputFileBlockSchema = z.object({
|
|
46
|
+
type: z.literal("input_file"),
|
|
47
|
+
file_id: z.string().optional(),
|
|
48
|
+
filename: z.string().optional(),
|
|
49
|
+
file_data: z.string().optional(),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const outputTextSchema = z.object({
|
|
53
|
+
type: z.literal("output_text"),
|
|
54
|
+
text: z.string(),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const outputRefusalSchema = z.object({
|
|
58
|
+
type: z.literal("refusal"),
|
|
59
|
+
refusal: z.string(),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const summaryTextSchema = z.object({
|
|
63
|
+
type: z.literal("summary_text"),
|
|
64
|
+
text: z.string(),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const reasoningTextSchema = z.object({
|
|
68
|
+
type: z.literal("reasoning_text"),
|
|
69
|
+
text: z.string(),
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const inputContentBlockSchema = z.union([
|
|
73
|
+
inputTextSchema,
|
|
74
|
+
plainTextSchema,
|
|
75
|
+
inputImageBlockSchema,
|
|
76
|
+
inputFileBlockSchema,
|
|
77
|
+
]);
|
|
78
|
+
const outputContentBlockSchema = z.union([outputTextSchema, plainTextSchema, outputRefusalSchema]);
|
|
79
|
+
|
|
80
|
+
// ─── Input items ────────────────────────────────────────────────────────────
|
|
81
|
+
|
|
82
|
+
const userMessageItemSchema = z.object({
|
|
83
|
+
type: z.literal("message").optional(),
|
|
84
|
+
role: z.union([z.literal("user"), z.literal("developer")]),
|
|
85
|
+
content: z.union([z.string(), z.array(inputContentBlockSchema)]).optional(),
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const systemMessageItemSchema = z.object({
|
|
89
|
+
type: z.literal("message").optional(),
|
|
90
|
+
role: z.literal("system"),
|
|
91
|
+
content: z.union([z.string(), z.array(inputContentBlockSchema)]).optional(),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const assistantMessageItemSchema = z.object({
|
|
95
|
+
type: z.literal("message").optional(),
|
|
96
|
+
role: z.literal("assistant"),
|
|
97
|
+
content: z.union([z.string(), z.array(outputContentBlockSchema)]).optional(),
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const reasoningItemSchema = z.object({
|
|
101
|
+
type: z.literal("reasoning"),
|
|
102
|
+
id: z.string().optional(),
|
|
103
|
+
summary: z.array(summaryTextSchema).optional(),
|
|
104
|
+
content: z.array(reasoningTextSchema).optional(),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const functionCallItemSchema = z.object({
|
|
108
|
+
type: z.literal("function_call"),
|
|
109
|
+
id: z.string().optional(),
|
|
110
|
+
call_id: z.string().min(1),
|
|
111
|
+
name: z.string().min(1),
|
|
112
|
+
arguments: z.string().optional(),
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const functionCallOutputItemSchema = z.object({
|
|
116
|
+
type: z.literal("function_call_output"),
|
|
117
|
+
call_id: z.string().min(1),
|
|
118
|
+
// OpenAI code backend CLI replays multimodal tool results in array form (text + refusal).
|
|
119
|
+
output: z.union([z.string(), z.array(outputContentBlockSchema)]).optional(),
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const customToolCallItemSchema = z.object({
|
|
123
|
+
type: z.literal("custom_tool_call"),
|
|
124
|
+
id: z.string().optional(),
|
|
125
|
+
call_id: z.string().min(1),
|
|
126
|
+
name: z.string().min(1),
|
|
127
|
+
// Raw input string — NOT JSON.stringified. apply_patch flow streams a
|
|
128
|
+
// freeform body and reading it as JSON would corrupt it.
|
|
129
|
+
input: z.string(),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const customToolCallOutputItemSchema = z.object({
|
|
133
|
+
type: z.literal("custom_tool_call_output"),
|
|
134
|
+
call_id: z.string().min(1),
|
|
135
|
+
output: z.string(),
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* An input item is one of the union members below. The convenience shape
|
|
140
|
+
* `{role, content}` (no `type`) is mapped to "message" before validation in
|
|
141
|
+
* the walker — schemas here only handle the canonical {type, ...} forms.
|
|
142
|
+
*/
|
|
143
|
+
export const inputItemSchema = z.union([
|
|
144
|
+
userMessageItemSchema,
|
|
145
|
+
systemMessageItemSchema,
|
|
146
|
+
assistantMessageItemSchema,
|
|
147
|
+
reasoningItemSchema,
|
|
148
|
+
functionCallItemSchema,
|
|
149
|
+
functionCallOutputItemSchema,
|
|
150
|
+
customToolCallItemSchema,
|
|
151
|
+
customToolCallOutputItemSchema,
|
|
152
|
+
// Tolerated but not bridged (file_search_call, web_search_call, …).
|
|
153
|
+
z.object({ type: z.string() }).loose(),
|
|
154
|
+
]);
|
|
155
|
+
|
|
156
|
+
// Variant types alias the canonical SDK union members so the walker can
|
|
157
|
+
// narrow them cleanly. The convenience "message" shape (no `type` field) maps
|
|
158
|
+
// to EasyInputMessage; the explicit form maps to ResponseInputItem.Message.
|
|
159
|
+
export type OpenAIResponsesUserItem = EasyInputMessage | ResponseInputItem.Message;
|
|
160
|
+
export type OpenAIResponsesSystemItem = EasyInputMessage | ResponseInputItem.Message;
|
|
161
|
+
export type OpenAIResponsesAssistantItem = EasyInputMessage | ResponseOutputMessage;
|
|
162
|
+
export type OpenAIResponsesReasoningItem = ResponseReasoningItem;
|
|
163
|
+
export type OpenAIResponsesFunctionCallItem = ResponseFunctionToolCall;
|
|
164
|
+
export type OpenAIResponsesFunctionCallOutputItem = ResponseInputItem.FunctionCallOutput;
|
|
165
|
+
|
|
166
|
+
/** Inferred shape of the custom tool call input item (no canonical SDK alias). */
|
|
167
|
+
export type OpenAIResponsesCustomToolCallItem = z.infer<typeof customToolCallItemSchema>;
|
|
168
|
+
export type OpenAIResponsesCustomToolCallOutputItem = z.infer<typeof customToolCallOutputItemSchema>;
|
|
169
|
+
export type OpenAIResponsesInputImageBlock = z.infer<typeof inputImageBlockSchema>;
|
|
170
|
+
export type OpenAIResponsesInputFileBlock = z.infer<typeof inputFileBlockSchema>;
|
|
171
|
+
export type OpenAIResponsesOutputRefusalBlock = z.infer<typeof outputRefusalSchema>;
|
|
172
|
+
|
|
173
|
+
// ─── Tools ──────────────────────────────────────────────────────────────────
|
|
174
|
+
|
|
175
|
+
export const toolSchema = z.object({
|
|
176
|
+
type: z.literal("function"),
|
|
177
|
+
name: z.string().min(1),
|
|
178
|
+
description: z.string().optional(),
|
|
179
|
+
parameters: z.record(z.string(), z.unknown()).optional(),
|
|
180
|
+
strict: z.boolean().optional(),
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Built-in / hosted tool entries (web_search_preview, file_search, …) — accepted
|
|
184
|
+
// but skipped by the walker.
|
|
185
|
+
const builtinToolSchema = z
|
|
186
|
+
.object({
|
|
187
|
+
type: z.string(),
|
|
188
|
+
})
|
|
189
|
+
.loose();
|
|
190
|
+
|
|
191
|
+
// ─── Tool choice ────────────────────────────────────────────────────────────
|
|
192
|
+
|
|
193
|
+
const hostedToolType = z.enum([
|
|
194
|
+
"web_search_preview",
|
|
195
|
+
"file_search",
|
|
196
|
+
"computer_use_preview",
|
|
197
|
+
"code_interpreter",
|
|
198
|
+
"image_generation",
|
|
199
|
+
"mcp",
|
|
200
|
+
]);
|
|
201
|
+
|
|
202
|
+
const allowedToolEntrySchema = z.object({
|
|
203
|
+
type: z.string(),
|
|
204
|
+
name: z.string().optional(),
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
export const toolChoiceSchema = z.union([
|
|
208
|
+
z.literal("auto"),
|
|
209
|
+
z.literal("none"),
|
|
210
|
+
z.literal("required"),
|
|
211
|
+
z.object({
|
|
212
|
+
type: z.literal("function"),
|
|
213
|
+
name: z.string().min(1),
|
|
214
|
+
}),
|
|
215
|
+
// OpenAI code backend apply_patch flow.
|
|
216
|
+
z.object({
|
|
217
|
+
type: z.literal("custom"),
|
|
218
|
+
name: z.string().min(1),
|
|
219
|
+
}),
|
|
220
|
+
// Hosted-tool selection (no extra fields).
|
|
221
|
+
z.object({
|
|
222
|
+
type: hostedToolType,
|
|
223
|
+
}),
|
|
224
|
+
// `allowed_tools` — walker treats as auto.
|
|
225
|
+
z.object({
|
|
226
|
+
type: z.literal("allowed_tools"),
|
|
227
|
+
mode: z.enum(["auto", "required"]),
|
|
228
|
+
tools: z.array(allowedToolEntrySchema),
|
|
229
|
+
}),
|
|
230
|
+
]);
|
|
231
|
+
|
|
232
|
+
// ─── Reasoning config ───────────────────────────────────────────────────────
|
|
233
|
+
|
|
234
|
+
export const reasoningConfigSchema = z.object({
|
|
235
|
+
effort: z.string().optional(),
|
|
236
|
+
// `none` maps to hideThinkingSummary; auto/concise/detailed mean "show
|
|
237
|
+
// summary". pi-ai has no per-level plumbing for the latter — walker logs
|
|
238
|
+
// once and treats them as default.
|
|
239
|
+
summary: z.enum(["auto", "concise", "detailed", "none"]).optional(),
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// ─── Stop ───────────────────────────────────────────────────────────────────
|
|
243
|
+
|
|
244
|
+
export const stopSchema = z.union([z.string(), z.array(z.string()), z.null()]);
|
|
245
|
+
|
|
246
|
+
// ─── Top-level request ──────────────────────────────────────────────────────
|
|
247
|
+
|
|
248
|
+
export const openaiResponsesRequestSchema = z.object({
|
|
249
|
+
model: z.string().min(1),
|
|
250
|
+
input: z.union([z.string(), z.array(inputItemSchema)]).optional(),
|
|
251
|
+
instructions: z.union([z.string(), z.null()]).optional(),
|
|
252
|
+
tools: z.array(z.union([toolSchema, builtinToolSchema])).optional(),
|
|
253
|
+
tool_choice: toolChoiceSchema.optional(),
|
|
254
|
+
max_output_tokens: z.number().optional(),
|
|
255
|
+
temperature: z.number().optional(),
|
|
256
|
+
top_p: z.number().optional(),
|
|
257
|
+
stop: stopSchema.optional(),
|
|
258
|
+
stream: z.boolean().optional(),
|
|
259
|
+
reasoning: reasoningConfigSchema.optional(),
|
|
260
|
+
store: z.boolean().optional(),
|
|
261
|
+
previous_response_id: z.string().optional(),
|
|
262
|
+
parallel_tool_calls: z.boolean().optional(),
|
|
263
|
+
prompt_cache_key: z.string().optional(),
|
|
264
|
+
metadata: z.unknown().optional(),
|
|
265
|
+
user: z.string().optional(),
|
|
266
|
+
service_tier: z.string().optional(),
|
|
267
|
+
presence_penalty: z.number().optional(),
|
|
268
|
+
frequency_penalty: z.number().optional(),
|
|
269
|
+
// Accepted-but-ignored: include `reasoning.encrypted_content` is the canonical
|
|
270
|
+
// way to request reasoning replay — silently accept and drop.
|
|
271
|
+
background: z.unknown().optional(),
|
|
272
|
+
include: z.unknown().optional(),
|
|
273
|
+
prompt: z.unknown().optional(),
|
|
274
|
+
safety_identifier: z.unknown().optional(),
|
|
275
|
+
text: z.unknown().optional(),
|
|
276
|
+
top_logprobs: z.unknown().optional(),
|
|
277
|
+
truncation: z.unknown().optional(),
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Public types are sourced from the OpenAI SDK so the gateway stays in
|
|
282
|
+
* lock-step with the canonical API surface; the schemas above are runtime
|
|
283
|
+
* validators for the subset we actually accept.
|
|
284
|
+
*/
|
|
285
|
+
export type OpenAIResponsesRequest = ResponseCreateParams;
|
|
286
|
+
export type OpenAIResponsesInputItem = ResponseInputItem;
|
|
287
|
+
export type OpenAIResponsesTool = ResponsesTool;
|
|
288
|
+
export type OpenAIResponsesToolChoice = NonNullable<ResponseCreateParams["tool_choice"]>;
|
|
289
|
+
export type OpenAIResponsesInputContent = ResponseInputContent;
|
|
290
|
+
export type OpenAIResponsesOutputContent = ResponseOutputMessage["content"][number];
|