@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,447 @@
|
|
|
1
|
+
import { $credentialEnv, $env, extractHttpStatusFromError, logger } from "@vib-rato/utils";
|
|
2
|
+
import { APIConnectionTimeoutError, AzureOpenAI } from "openai";
|
|
3
|
+
import type {
|
|
4
|
+
Tool as OpenAITool,
|
|
5
|
+
ResponseCreateParamsStreaming,
|
|
6
|
+
ResponseInput,
|
|
7
|
+
} from "openai/resources/responses/responses";
|
|
8
|
+
import { getEnvApiKey } from "../stream";
|
|
9
|
+
import type {
|
|
10
|
+
AssistantMessage,
|
|
11
|
+
Context,
|
|
12
|
+
Model,
|
|
13
|
+
ServiceTier,
|
|
14
|
+
StreamFunction,
|
|
15
|
+
StreamOptions,
|
|
16
|
+
Tool,
|
|
17
|
+
ToolChoice,
|
|
18
|
+
ToolResultMessage,
|
|
19
|
+
} from "../types";
|
|
20
|
+
import { normalizeSystemPrompts } from "../utils";
|
|
21
|
+
import { createAbortSourceTracker } from "../utils/abort";
|
|
22
|
+
import { AssistantMessageEventStream } from "../utils/event-stream";
|
|
23
|
+
import { transportFailureFacts } from "../utils/fallback-transport";
|
|
24
|
+
import { finalizeErrorMessage, type RawHttpRequestDump } from "../utils/http-inspector";
|
|
25
|
+
import {
|
|
26
|
+
FirstEventTimeoutError,
|
|
27
|
+
getOpenAIStreamIdleTimeoutMs,
|
|
28
|
+
getStreamFirstEventTimeoutMs,
|
|
29
|
+
iterateWithIdleTimeout,
|
|
30
|
+
resolveOpenAISdkRequestTimeoutMs,
|
|
31
|
+
} from "../utils/idle-iterator";
|
|
32
|
+
import { resolveRetryBudget } from "../utils/retry-budget";
|
|
33
|
+
import { flattenToolRootCombinators, sanitizeSchemaForOpenAIResponses, toolWireSchema } from "../utils/schema";
|
|
34
|
+
import { wrapFetchForSseDebug } from "../utils/sse-debug";
|
|
35
|
+
import { mapToOpenAIResponsesToolChoice } from "../utils/tool-choice";
|
|
36
|
+
import {
|
|
37
|
+
isForcedToolChoiceUnsupportedError,
|
|
38
|
+
markToolChoiceIncapability,
|
|
39
|
+
resolveToolChoice,
|
|
40
|
+
} from "../utils/tool-choice-capability";
|
|
41
|
+
import { wrapOpenAIFetchForBoundedRateLimits } from "./openai-bounded-rate-limits";
|
|
42
|
+
import { normalizeOpenAIResponsesPromptCacheKey, supportsDeveloperRole } from "./openai-responses";
|
|
43
|
+
import {
|
|
44
|
+
appendResponsesToolResultMessages,
|
|
45
|
+
applyCommonResponsesSamplingParams,
|
|
46
|
+
applyResponsesReasoningParams,
|
|
47
|
+
convertResponsesAssistantMessage,
|
|
48
|
+
convertResponsesInputContent,
|
|
49
|
+
createInitialResponsesAssistantMessage,
|
|
50
|
+
isOpenAIResponsesProgressEvent,
|
|
51
|
+
normalizeResponsesToolCallIdForTransform,
|
|
52
|
+
processResponsesStream,
|
|
53
|
+
} from "./openai-responses-shared";
|
|
54
|
+
import { transformMessages } from "./transform-messages";
|
|
55
|
+
|
|
56
|
+
const DEFAULT_AZURE_API_VERSION = "v1";
|
|
57
|
+
const AZURE_OPENAI_RESPONSES_FIRST_EVENT_TIMEOUT_MESSAGE =
|
|
58
|
+
"Azure OpenAI responses stream timed out while waiting for the first event";
|
|
59
|
+
|
|
60
|
+
function parseDeploymentNameMap(value: string | undefined): Map<string, string> {
|
|
61
|
+
const map = new Map<string, string>();
|
|
62
|
+
if (!value) return map;
|
|
63
|
+
for (const entry of value.split(",")) {
|
|
64
|
+
const trimmed = entry.trim();
|
|
65
|
+
if (!trimmed) continue;
|
|
66
|
+
const [modelId, deploymentName] = trimmed.split("=", 2);
|
|
67
|
+
if (!modelId || !deploymentName) continue;
|
|
68
|
+
map.set(modelId.trim(), deploymentName.trim());
|
|
69
|
+
}
|
|
70
|
+
return map;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function resolveDeploymentName(model: Model<"azure-openai-responses">, options?: AzureOpenAIResponsesOptions): string {
|
|
74
|
+
if (options?.azureDeploymentName) {
|
|
75
|
+
return options.azureDeploymentName;
|
|
76
|
+
}
|
|
77
|
+
const mappedDeployment = parseDeploymentNameMap($env.AZURE_OPENAI_DEPLOYMENT_NAME_MAP).get(model.id);
|
|
78
|
+
return mappedDeployment ?? model.id;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Azure OpenAI Responses-specific options
|
|
82
|
+
export interface AzureOpenAIResponsesOptions extends StreamOptions {
|
|
83
|
+
reasoning?: "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
84
|
+
reasoningSummary?: "auto" | "detailed" | "concise" | null;
|
|
85
|
+
azureApiVersion?: string;
|
|
86
|
+
azureResourceName?: string;
|
|
87
|
+
azureBaseUrl?: string;
|
|
88
|
+
azureDeploymentName?: string;
|
|
89
|
+
toolChoice?: ToolChoice;
|
|
90
|
+
serviceTier?: ServiceTier;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type AzureOpenAIResponsesSamplingParams = ResponseCreateParamsStreaming & {
|
|
94
|
+
top_p?: number;
|
|
95
|
+
top_k?: number;
|
|
96
|
+
min_p?: number;
|
|
97
|
+
presence_penalty?: number;
|
|
98
|
+
repetition_penalty?: number;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Generate function for Azure OpenAI Responses API
|
|
103
|
+
*/
|
|
104
|
+
export const streamAzureOpenAIResponses: StreamFunction<"azure-openai-responses"> = (
|
|
105
|
+
model: Model<"azure-openai-responses">,
|
|
106
|
+
context: Context,
|
|
107
|
+
options?: AzureOpenAIResponsesOptions,
|
|
108
|
+
): AssistantMessageEventStream => {
|
|
109
|
+
const stream = new AssistantMessageEventStream();
|
|
110
|
+
|
|
111
|
+
// Start async processing
|
|
112
|
+
(async () => {
|
|
113
|
+
const startTime = Date.now();
|
|
114
|
+
let firstTokenTime: number | undefined;
|
|
115
|
+
let streamConnected = false;
|
|
116
|
+
const deploymentName = resolveDeploymentName(model, options);
|
|
117
|
+
|
|
118
|
+
const output: AssistantMessage = createInitialResponsesAssistantMessage(
|
|
119
|
+
"azure-openai-responses",
|
|
120
|
+
model.provider,
|
|
121
|
+
model.id,
|
|
122
|
+
);
|
|
123
|
+
let rawRequestDump: RawHttpRequestDump | undefined;
|
|
124
|
+
const abortTracker = createAbortSourceTracker(options?.signal);
|
|
125
|
+
const { requestAbortController, requestSignal } = abortTracker;
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
// Create Azure OpenAI client
|
|
129
|
+
const apiKey = options?.apiKey || getEnvApiKey(model.provider) || "";
|
|
130
|
+
const client = createClient(model, apiKey, options);
|
|
131
|
+
const { baseUrl } = resolveAzureConfig(model, options);
|
|
132
|
+
const params = buildParams(model, context, options, deploymentName, baseUrl);
|
|
133
|
+
const idleTimeoutMs = options?.streamIdleTimeoutMs ?? getOpenAIStreamIdleTimeoutMs();
|
|
134
|
+
options?.onPayload?.(params, model, options?.attemptScope);
|
|
135
|
+
rawRequestDump = {
|
|
136
|
+
provider: model.provider,
|
|
137
|
+
api: output.api,
|
|
138
|
+
model: model.id,
|
|
139
|
+
method: "POST",
|
|
140
|
+
url: `${baseUrl}/responses`,
|
|
141
|
+
body: params,
|
|
142
|
+
};
|
|
143
|
+
let openaiStream: Awaited<ReturnType<typeof client.responses.create>>;
|
|
144
|
+
try {
|
|
145
|
+
options?.onStreamCreated?.();
|
|
146
|
+
openaiStream = await client.responses.create(params, { signal: requestSignal });
|
|
147
|
+
} catch (error) {
|
|
148
|
+
if (
|
|
149
|
+
!isForcedToolChoiceUnsupportedError(error, isForcedAzureResponsesToolChoice(params.tool_choice)) ||
|
|
150
|
+
options?.fallbackManaged ||
|
|
151
|
+
options?.disableProviderRetries
|
|
152
|
+
) {
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
const reason = await finalizeErrorMessage(error, rawRequestDump);
|
|
156
|
+
markToolChoiceIncapability(model, "auto", reason);
|
|
157
|
+
const resolvedToolChoice = resolveToolChoice(model, options?.toolChoice);
|
|
158
|
+
stream.push({
|
|
159
|
+
type: "toolChoiceIncapability",
|
|
160
|
+
api: model.api,
|
|
161
|
+
provider: model.provider,
|
|
162
|
+
model: model.id,
|
|
163
|
+
requestedLevel: resolvedToolChoice.requestedLevel,
|
|
164
|
+
resolvedLevel: "auto",
|
|
165
|
+
reason,
|
|
166
|
+
registryKey: resolvedToolChoice.registryKey,
|
|
167
|
+
});
|
|
168
|
+
delete params.tool_choice;
|
|
169
|
+
rawRequestDump = { ...rawRequestDump, body: params };
|
|
170
|
+
options?.onStreamCreated?.();
|
|
171
|
+
openaiStream = await client.responses.create(params, { signal: requestSignal });
|
|
172
|
+
}
|
|
173
|
+
streamConnected = true;
|
|
174
|
+
const firstEventTimeoutMs = options?.streamFirstEventTimeoutMs ?? getStreamFirstEventTimeoutMs(idleTimeoutMs);
|
|
175
|
+
stream.push({ type: "start", partial: output });
|
|
176
|
+
|
|
177
|
+
await processResponsesStream(
|
|
178
|
+
iterateWithIdleTimeout(openaiStream, {
|
|
179
|
+
firstItemTimeoutMs: firstEventTimeoutMs,
|
|
180
|
+
firstItemErrorMessage: AZURE_OPENAI_RESPONSES_FIRST_EVENT_TIMEOUT_MESSAGE,
|
|
181
|
+
idleTimeoutMs,
|
|
182
|
+
errorMessage: "Azure OpenAI responses stream stalled while waiting for the next event",
|
|
183
|
+
onIdle: () => requestAbortController.abort(),
|
|
184
|
+
onFirstItemTimeout: () => requestAbortController.abort(),
|
|
185
|
+
isProgressItem: isOpenAIResponsesProgressEvent,
|
|
186
|
+
abortSignal: options?.signal,
|
|
187
|
+
}),
|
|
188
|
+
output,
|
|
189
|
+
stream,
|
|
190
|
+
model,
|
|
191
|
+
{
|
|
192
|
+
onFirstToken: () => {
|
|
193
|
+
if (!firstTokenTime) firstTokenTime = Date.now();
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
const firstEventTimeoutError = abortTracker.getLocalAbortReason();
|
|
199
|
+
if (firstEventTimeoutError) {
|
|
200
|
+
throw firstEventTimeoutError;
|
|
201
|
+
}
|
|
202
|
+
if (abortTracker.wasCallerAbort()) {
|
|
203
|
+
throw new Error("Request was aborted");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (output.stopReason === "aborted" || output.stopReason === "error") {
|
|
207
|
+
throw new Error(output.errorMessage ?? "An unknown error occurred");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
output.duration = Date.now() - startTime;
|
|
211
|
+
if (firstTokenTime) output.ttft = firstTokenTime - startTime;
|
|
212
|
+
stream.push({ type: "done", reason: output.stopReason, message: output });
|
|
213
|
+
stream.end();
|
|
214
|
+
} catch (error) {
|
|
215
|
+
for (const block of output.content) delete (block as { index?: number }).index;
|
|
216
|
+
const firstEventTimeoutError = abortTracker.getLocalAbortReason();
|
|
217
|
+
const normalizedError =
|
|
218
|
+
!streamConnected && error instanceof APIConnectionTimeoutError
|
|
219
|
+
? new FirstEventTimeoutError(AZURE_OPENAI_RESPONSES_FIRST_EVENT_TIMEOUT_MESSAGE)
|
|
220
|
+
: error;
|
|
221
|
+
output.stopReason = abortTracker.wasCallerAbort() ? "aborted" : "error";
|
|
222
|
+
output.errorStatus = extractHttpStatusFromError(firstEventTimeoutError ?? normalizedError);
|
|
223
|
+
output.transportFailure = transportFailureFacts(firstEventTimeoutError ?? normalizedError);
|
|
224
|
+
output.errorMessage =
|
|
225
|
+
firstEventTimeoutError?.message ?? (await finalizeErrorMessage(normalizedError, rawRequestDump));
|
|
226
|
+
output.duration = Date.now() - startTime;
|
|
227
|
+
if (firstTokenTime) output.ttft = firstTokenTime - startTime;
|
|
228
|
+
stream.push({ type: "error", reason: output.stopReason, error: output });
|
|
229
|
+
stream.end();
|
|
230
|
+
}
|
|
231
|
+
})();
|
|
232
|
+
|
|
233
|
+
return stream;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
function normalizeAzureBaseUrl(baseUrl: string): string {
|
|
237
|
+
return baseUrl.replace(/\/+$/, "");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function buildDefaultBaseUrl(resourceName: string): string {
|
|
241
|
+
return `https://${resourceName}.openai.azure.com/openai/v1`;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function resolveAzureConfig(
|
|
245
|
+
model: Model<"azure-openai-responses">,
|
|
246
|
+
options?: AzureOpenAIResponsesOptions,
|
|
247
|
+
): { baseUrl: string; apiVersion: string } {
|
|
248
|
+
const apiVersion = options?.azureApiVersion || $env.AZURE_OPENAI_API_VERSION || DEFAULT_AZURE_API_VERSION;
|
|
249
|
+
|
|
250
|
+
// Trusted sources only: both of these decide the request endpoint that carries
|
|
251
|
+
// the Azure credential, and `$env` merges the caller's `cwd/.env`. The resource
|
|
252
|
+
// name is the alternate constructor for the same host
|
|
253
|
+
// (`https://<resource>.openai.azure.com/openai/v1`), so it needs the same
|
|
254
|
+
// boundary as the explicit base URL.
|
|
255
|
+
const baseUrl = options?.azureBaseUrl?.trim() || $credentialEnv("AZURE_OPENAI_BASE_URL") || undefined;
|
|
256
|
+
const resourceName = options?.azureResourceName || $credentialEnv("AZURE_OPENAI_RESOURCE_NAME");
|
|
257
|
+
|
|
258
|
+
let resolvedBaseUrl = baseUrl;
|
|
259
|
+
|
|
260
|
+
if (!resolvedBaseUrl && resourceName) {
|
|
261
|
+
resolvedBaseUrl = buildDefaultBaseUrl(resourceName);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (!resolvedBaseUrl && model.baseUrl) {
|
|
265
|
+
resolvedBaseUrl = model.baseUrl;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (!resolvedBaseUrl) {
|
|
269
|
+
throw new Error(
|
|
270
|
+
"Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.",
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return {
|
|
275
|
+
baseUrl: normalizeAzureBaseUrl(resolvedBaseUrl),
|
|
276
|
+
apiVersion,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** Test seam: the Azure endpoint config as resolved from trusted env. */
|
|
281
|
+
export function resolveAzureConfigForTest(
|
|
282
|
+
model: Model<"azure-openai-responses">,
|
|
283
|
+
options?: AzureOpenAIResponsesOptions,
|
|
284
|
+
): { baseUrl: string; apiVersion: string } {
|
|
285
|
+
return resolveAzureConfig(model, options);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Azure API key for the client, from trusted environment sources only.
|
|
290
|
+
*
|
|
291
|
+
* `$env` merges the caller's `cwd/.env`, so reading the key there would let
|
|
292
|
+
* repository content supply the credential this client authenticates with.
|
|
293
|
+
* Provider credentials are resolved from the launching shell plus Vibrato/user-owned
|
|
294
|
+
* `.env` files, never the project `.env` — this fallback now matches that rule.
|
|
295
|
+
*/
|
|
296
|
+
function resolveAzureClientApiKey(apiKey: string): string | undefined {
|
|
297
|
+
if (apiKey) return apiKey;
|
|
298
|
+
return $credentialEnv("AZURE_OPENAI_API_KEY");
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** Test seam: the client API key as resolved from a caller value plus trusted env. */
|
|
302
|
+
export function resolveAzureClientApiKeyForTest(apiKey: string): string | undefined {
|
|
303
|
+
return resolveAzureClientApiKey(apiKey);
|
|
304
|
+
}
|
|
305
|
+
function createClient(model: Model<"azure-openai-responses">, apiKey: string, options?: AzureOpenAIResponsesOptions) {
|
|
306
|
+
const resolvedApiKey = resolveAzureClientApiKey(apiKey);
|
|
307
|
+
if (!resolvedApiKey) {
|
|
308
|
+
throw new Error(
|
|
309
|
+
"Azure OpenAI API key is required. Set AZURE_OPENAI_API_KEY environment variable or pass it as an argument.",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
apiKey = resolvedApiKey;
|
|
313
|
+
|
|
314
|
+
const headers = { ...(model.headers ?? {}) };
|
|
315
|
+
|
|
316
|
+
if (options?.headers) {
|
|
317
|
+
Object.assign(headers, options.headers);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const { baseUrl, apiVersion } = resolveAzureConfig(model, options);
|
|
321
|
+
|
|
322
|
+
const baseFetch = wrapOpenAIFetchForBoundedRateLimits(options?.fetch ?? fetch, options?.maxRetryDelayMs);
|
|
323
|
+
const onSseEvent = options?.onSseEvent;
|
|
324
|
+
// Bound HTTP request timeout to the first-event window so a stalled-before-headers
|
|
325
|
+
// fetch cannot wait the SDK's 10-minute default before the transport watchdog arms.
|
|
326
|
+
const sdkTimeoutMs = resolveOpenAISdkRequestTimeoutMs(model.provider, options?.streamFirstEventTimeoutMs);
|
|
327
|
+
return new AzureOpenAI({
|
|
328
|
+
apiKey,
|
|
329
|
+
apiVersion,
|
|
330
|
+
dangerouslyAllowBrowser: true,
|
|
331
|
+
maxRetries: resolveRetryBudget(options?.requestMaxRetries, 5),
|
|
332
|
+
defaultHeaders: headers,
|
|
333
|
+
baseURL: baseUrl,
|
|
334
|
+
fetch: onSseEvent
|
|
335
|
+
? wrapFetchForSseDebug(baseFetch, event => onSseEvent(event, model, options?.attemptScope))
|
|
336
|
+
: baseFetch,
|
|
337
|
+
...(sdkTimeoutMs !== undefined ? { timeout: sdkTimeoutMs } : {}),
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function buildParams(
|
|
342
|
+
model: Model<"azure-openai-responses">,
|
|
343
|
+
context: Context,
|
|
344
|
+
options: AzureOpenAIResponsesOptions | undefined,
|
|
345
|
+
deploymentName: string,
|
|
346
|
+
resolvedBaseUrl?: string,
|
|
347
|
+
) {
|
|
348
|
+
const messages = convertMessages(model, context, true, resolvedBaseUrl);
|
|
349
|
+
|
|
350
|
+
const params: AzureOpenAIResponsesSamplingParams = {
|
|
351
|
+
model: deploymentName,
|
|
352
|
+
input: messages,
|
|
353
|
+
stream: true,
|
|
354
|
+
prompt_cache_key: normalizeOpenAIResponsesPromptCacheKey(options?.sessionId),
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
applyCommonResponsesSamplingParams(params, options, model.provider);
|
|
358
|
+
|
|
359
|
+
if (context.tools) {
|
|
360
|
+
params.tools = convertTools(context.tools);
|
|
361
|
+
if (options?.toolChoice) {
|
|
362
|
+
const toolChoice = resolveToolChoice(model, options.toolChoice);
|
|
363
|
+
if (toolChoice.degraded && toolChoice.supportSource === "runtime") {
|
|
364
|
+
logger.debug("azure-openai-responses: degraded tool_choice after runtime capability discovery", {
|
|
365
|
+
model: model.id,
|
|
366
|
+
requestedLevel: toolChoice.requestedLevel,
|
|
367
|
+
resolvedLevel: toolChoice.resolvedLevel,
|
|
368
|
+
reason: toolChoice.reason,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
params.tool_choice = mapToOpenAIResponsesToolChoice(toolChoice.resolvedChoice);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
applyResponsesReasoningParams(params, model, options, messages);
|
|
376
|
+
|
|
377
|
+
return params;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function isForcedAzureResponsesToolChoice(choice: AzureOpenAIResponsesSamplingParams["tool_choice"]): boolean {
|
|
381
|
+
return !!choice && choice !== "none" && choice !== "auto";
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function convertMessages(
|
|
385
|
+
model: Model<"azure-openai-responses">,
|
|
386
|
+
context: Context,
|
|
387
|
+
strictResponsesPairing: boolean,
|
|
388
|
+
resolvedBaseUrl?: string,
|
|
389
|
+
): ResponseInput {
|
|
390
|
+
const messages: ResponseInput = [];
|
|
391
|
+
const transformedMessages = transformMessages(context.messages, model, normalizeResponsesToolCallIdForTransform);
|
|
392
|
+
const knownCallIds = new Set<string>();
|
|
393
|
+
|
|
394
|
+
const systemPrompts = normalizeSystemPrompts(context.systemPrompt);
|
|
395
|
+
if (systemPrompts.length > 0) {
|
|
396
|
+
const role = model.reasoning && supportsDeveloperRole(resolvedBaseUrl ?? model) ? "developer" : "system";
|
|
397
|
+
for (const systemPrompt of systemPrompts) {
|
|
398
|
+
messages.push({ role, content: systemPrompt });
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
let msgIndex = 0;
|
|
403
|
+
// Consecutive tool results are batched into one append call so every output
|
|
404
|
+
// of the turn stays contiguous before the collected image user message;
|
|
405
|
+
// per-result image user messages interleave with sibling outputs and break
|
|
406
|
+
// tool_use→tool_result adjacency through Anthropic-translating proxies (#4807).
|
|
407
|
+
let pendingToolResults: ToolResultMessage[] = [];
|
|
408
|
+
const flushPendingToolResults = (): void => {
|
|
409
|
+
if (pendingToolResults.length === 0) return;
|
|
410
|
+
appendResponsesToolResultMessages(messages, pendingToolResults, model, strictResponsesPairing, knownCallIds);
|
|
411
|
+
pendingToolResults = [];
|
|
412
|
+
};
|
|
413
|
+
for (const msg of transformedMessages) {
|
|
414
|
+
if (msg.role === "toolResult") {
|
|
415
|
+
pendingToolResults.push(msg);
|
|
416
|
+
msgIndex++;
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
flushPendingToolResults();
|
|
420
|
+
if (msg.role === "user" || msg.role === "developer") {
|
|
421
|
+
const content = convertResponsesInputContent(msg.content, model.input.includes("image"));
|
|
422
|
+
if (!content) continue;
|
|
423
|
+
messages.push({
|
|
424
|
+
role: "user",
|
|
425
|
+
content: msg.role === "developer" && typeof msg.content === "string" ? msg.content.toWellFormed() : content,
|
|
426
|
+
});
|
|
427
|
+
} else if (msg.role === "assistant") {
|
|
428
|
+
const outputItems = convertResponsesAssistantMessage(msg as AssistantMessage, model, msgIndex, knownCallIds);
|
|
429
|
+
if (outputItems.length === 0) continue;
|
|
430
|
+
messages.push(...outputItems);
|
|
431
|
+
}
|
|
432
|
+
msgIndex++;
|
|
433
|
+
}
|
|
434
|
+
flushPendingToolResults();
|
|
435
|
+
|
|
436
|
+
return messages;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
function convertTools(tools: Tool[]): OpenAITool[] {
|
|
440
|
+
return tools.map(tool => ({
|
|
441
|
+
type: "function",
|
|
442
|
+
name: tool.name,
|
|
443
|
+
description: tool.description || "",
|
|
444
|
+
parameters: sanitizeSchemaForOpenAIResponses(flattenToolRootCombinators(toolWireSchema(tool))),
|
|
445
|
+
strict: false,
|
|
446
|
+
}));
|
|
447
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare function isComposerHarnessModel(modelId: string): boolean;
|
|
2
|
+
/** Stable text contract for a local shell rejection caused by Composer file-I/O discipline. */
|
|
3
|
+
export declare const COMPOSER_BASH_POLICY_ERROR_PREFIX = "Composer bash policy blocked repository file I/O.";
|
|
4
|
+
export declare const COMPOSER_BASH_POLICY_ERROR_CODE = "composer-bash-policy:repository-file-io";
|
|
5
|
+
export type ComposerBashPolicyToolSurface = "generic" | "cursor";
|
|
6
|
+
/**
|
|
7
|
+
* Format the model-visible policy rejection with a stable marker and the tool
|
|
8
|
+
* vocabulary the model actually receives on this provider surface.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatComposerBashPolicyError(surface?: ComposerBashPolicyToolSurface): string;
|
|
11
|
+
/**
|
|
12
|
+
* Matches both the structured current error and the original prefix so a
|
|
13
|
+
* resumed session can recover after an upgrade without string-version skew.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isComposerBashPolicyBlockedError(text: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Matches only errors emitted directly by the current policy implementation.
|
|
18
|
+
* Live recovery must use this strict form so failed shell output that merely
|
|
19
|
+
* quotes a policy error cannot masquerade as the policy gate itself.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isCurrentComposerBashPolicyBlockedError(text: string): boolean;
|
|
22
|
+
/** One bounded, tool-enabled retry instruction for generic Composer agent loops. */
|
|
23
|
+
export declare const COMPOSER_BASH_POLICY_RECOVERY_PROMPT: string;
|
|
24
|
+
/** One bounded, tool-enabled retry instruction for Cursor's native remote tool surface. */
|
|
25
|
+
export declare const CURSOR_COMPOSER_BASH_POLICY_RECOVERY_PROMPT: string;
|
|
26
|
+
export declare const COMPOSER_EDIT_DISCIPLINE_PROMPT = "File-editing discipline for this Composer harness (this OVERRIDES contrary habits from your training):\n\n- Discover file names ONLY with the find tool; search file contents ONLY with the search tool; read file bodies or line ranges ONLY with the read tool. NEVER inspect repository files through shell commands (ls, find, fd, cat, sed, awk, grep, rg, head, tail, less, more) or scripts \u2014 that output carries no hashline anchors and bypasses the agent's safety limits.\n- Modify files ONLY with the edit/write tools. NEVER mutate files through shell redirection, tee, sed -i, perl -pi, inline python/node/bun scripts, or other out-of-band writes \u2014 those writes invalidate every known anchor and break edit recovery.\n- A line anchor (e.g. \"42sr\") is a line number plus a 2-char content hash. You CANNOT compute the hash yourself: copy anchors verbatim from the MOST RECENT read/search/edit output of that exact file. NEVER guess, renumber, or arithmetically shift an anchor.\n- After ANY edit to a file (including your own), anchors you saw earlier are stale. Re-read the edited region, or copy the fresh anchors printed in the edit result, before issuing the next edit.\n- If an edit is rejected with \"anchors do not match\", the rejection message prints the current lines WITH fresh anchors. Retry using exactly those printed anchors.\n- Tool-call arguments must be the exact JSON/schema object requested by the tool. Do not include Markdown, commentary, analysis text, or invented fields inside tool arguments.\n- Use bash only for terminal operations such as tests, builds, package scripts, and git commands. A shell command string must contain only the command itself; NEVER interleave reasoning or commentary into command strings or heredocs.";
|
|
27
|
+
/**
|
|
28
|
+
* Cursor executes a different native tool vocabulary from the generic agent
|
|
29
|
+
* loop. Keep this prompt separate so Composer is never told to call `edit`,
|
|
30
|
+
* `find`, or `search` when those names are unavailable remotely.
|
|
31
|
+
*/
|
|
32
|
+
export declare const CURSOR_COMPOSER_EDIT_DISCIPLINE_PROMPT: string;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import composerBashPolicyRecoveryPrompt from "../prompts/composer-bash-policy-recovery.md" with { type: "text" };
|
|
2
|
+
import cursorComposerBashPolicyRecoveryPrompt from "../prompts/cursor-composer-bash-policy-recovery.md" with {
|
|
3
|
+
type: "text",
|
|
4
|
+
};
|
|
5
|
+
import cursorComposerEditDisciplinePrompt from "../prompts/cursor-composer-edit-discipline.md" with { type: "text" };
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Anchor/edit discipline for composer-harness models (xai grok-composer-*,
|
|
9
|
+
* cursor composer-*).
|
|
10
|
+
*
|
|
11
|
+
* Composer models are trained on a proprietary coding-agent harness
|
|
12
|
+
* (Cursor / Grok Build) and carry habits that break this agent's hashline
|
|
13
|
+
* edit workflow when driven through a generic provider. Observed in live
|
|
14
|
+
* sessions with grok-composer-2.5-fast:
|
|
15
|
+
*
|
|
16
|
+
* - they print files with shell commands (`sed -n`, `cat`, `grep -n`) or
|
|
17
|
+
* python heredocs whose output carries NO line anchors, then FABRICATE the
|
|
18
|
+
* 2-char anchor hash the edit tool requires (e.g. guessed "617hp" where
|
|
19
|
+
* the file had "617ca" → "Edit rejected: N anchors do not match");
|
|
20
|
+
* - they mutate files out-of-band via python heredocs (pathlib write_text /
|
|
21
|
+
* str.replace), which invalidates every previously seen anchor and defeats
|
|
22
|
+
* the read-cache snapshot that powers stale-anchor recovery;
|
|
23
|
+
* - they arithmetically renumber anchors after their own edits instead of
|
|
24
|
+
* copying them from the latest tool output;
|
|
25
|
+
* - they leak reasoning prose into heredoc bodies, producing shell/python
|
|
26
|
+
* syntax errors.
|
|
27
|
+
*
|
|
28
|
+
* This prompt is the per-request countermeasure, pinned ahead of the host
|
|
29
|
+
* system prompt on openai-completions, openai-responses, and cursor RPC paths.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** Matches composer-harness model ids on any provider (xai grok-composer-*, cursor composer-* / composer2.*). */
|
|
33
|
+
const COMPOSER_MODEL_ID_PATTERN = /(?:^|[/:._-])(?:grok-)?composer(?:[/:._-]|(?=\d)|$)/i;
|
|
34
|
+
|
|
35
|
+
export function isComposerHarnessModel(modelId: string): boolean {
|
|
36
|
+
return COMPOSER_MODEL_ID_PATTERN.test(modelId);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Stable text contract for a local shell rejection caused by Composer file-I/O discipline. */
|
|
40
|
+
export const COMPOSER_BASH_POLICY_ERROR_PREFIX = "Composer bash policy blocked repository file I/O.";
|
|
41
|
+
export const COMPOSER_BASH_POLICY_ERROR_CODE = "composer-bash-policy:repository-file-io";
|
|
42
|
+
|
|
43
|
+
export type ComposerBashPolicyToolSurface = "generic" | "cursor";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Format the model-visible policy rejection with a stable marker and the tool
|
|
47
|
+
* vocabulary the model actually receives on this provider surface.
|
|
48
|
+
*/
|
|
49
|
+
export function formatComposerBashPolicyError(surface: ComposerBashPolicyToolSurface = "generic"): string {
|
|
50
|
+
const recovery =
|
|
51
|
+
surface === "cursor"
|
|
52
|
+
? "Continue the same task with Cursor-native read, grep, write, or delete tools; do not retry repository file I/O through shell."
|
|
53
|
+
: "Continue the same task with find, search, read, and edit tools; do not retry repository file I/O through bash.";
|
|
54
|
+
return `${COMPOSER_BASH_POLICY_ERROR_PREFIX} [${COMPOSER_BASH_POLICY_ERROR_CODE}] Recovery required: ${recovery}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Matches both the structured current error and the original prefix so a
|
|
59
|
+
* resumed session can recover after an upgrade without string-version skew.
|
|
60
|
+
*/
|
|
61
|
+
export function isComposerBashPolicyBlockedError(text: string): boolean {
|
|
62
|
+
return text.includes(COMPOSER_BASH_POLICY_ERROR_PREFIX);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Matches only errors emitted directly by the current policy implementation.
|
|
67
|
+
* Live recovery must use this strict form so failed shell output that merely
|
|
68
|
+
* quotes a policy error cannot masquerade as the policy gate itself.
|
|
69
|
+
*/
|
|
70
|
+
export function isCurrentComposerBashPolicyBlockedError(text: string): boolean {
|
|
71
|
+
return text === formatComposerBashPolicyError("generic") || text === formatComposerBashPolicyError("cursor");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** One bounded, tool-enabled retry instruction for generic Composer agent loops. */
|
|
75
|
+
export const COMPOSER_BASH_POLICY_RECOVERY_PROMPT = composerBashPolicyRecoveryPrompt;
|
|
76
|
+
|
|
77
|
+
/** One bounded, tool-enabled retry instruction for Cursor's native remote tool surface. */
|
|
78
|
+
export const CURSOR_COMPOSER_BASH_POLICY_RECOVERY_PROMPT = cursorComposerBashPolicyRecoveryPrompt;
|
|
79
|
+
|
|
80
|
+
export const COMPOSER_EDIT_DISCIPLINE_PROMPT = `File-editing discipline for this Composer harness (this OVERRIDES contrary habits from your training):
|
|
81
|
+
|
|
82
|
+
- Discover file names ONLY with the find tool; search file contents ONLY with the search tool; read file bodies or line ranges ONLY with the read tool. NEVER inspect repository files through shell commands (ls, find, fd, cat, sed, awk, grep, rg, head, tail, less, more) or scripts — that output carries no hashline anchors and bypasses the agent's safety limits.
|
|
83
|
+
- Modify files ONLY with the edit/write tools. NEVER mutate files through shell redirection, tee, sed -i, perl -pi, inline python/node/bun scripts, or other out-of-band writes — those writes invalidate every known anchor and break edit recovery.
|
|
84
|
+
- A line anchor (e.g. "42sr") is a line number plus a 2-char content hash. You CANNOT compute the hash yourself: copy anchors verbatim from the MOST RECENT read/search/edit output of that exact file. NEVER guess, renumber, or arithmetically shift an anchor.
|
|
85
|
+
- After ANY edit to a file (including your own), anchors you saw earlier are stale. Re-read the edited region, or copy the fresh anchors printed in the edit result, before issuing the next edit.
|
|
86
|
+
- If an edit is rejected with "anchors do not match", the rejection message prints the current lines WITH fresh anchors. Retry using exactly those printed anchors.
|
|
87
|
+
- Tool-call arguments must be the exact JSON/schema object requested by the tool. Do not include Markdown, commentary, analysis text, or invented fields inside tool arguments.
|
|
88
|
+
- Use bash only for terminal operations such as tests, builds, package scripts, and git commands. A shell command string must contain only the command itself; NEVER interleave reasoning or commentary into command strings or heredocs.`;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Cursor executes a different native tool vocabulary from the generic agent
|
|
92
|
+
* loop. Keep this prompt separate so Composer is never told to call `edit`,
|
|
93
|
+
* `find`, or `search` when those names are unavailable remotely.
|
|
94
|
+
*/
|
|
95
|
+
export const CURSOR_COMPOSER_EDIT_DISCIPLINE_PROMPT = cursorComposerEditDisciplinePrompt;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor client version reported to api2.cursor.sh.
|
|
3
|
+
*
|
|
4
|
+
* Every call against the Cursor backend must send the same
|
|
5
|
+
* x-cursor-client-version: the backend gates features and minimum versions on
|
|
6
|
+
* it, so a drift between the agent Run path and model discovery makes one of
|
|
7
|
+
* them fail while the other keeps working. Keep this as the single source of
|
|
8
|
+
* truth for the header value.
|
|
9
|
+
*/
|
|
10
|
+
export declare const CURSOR_CLIENT_VERSION = "cli-2026.02.13-41ac335";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cursor client version reported to api2.cursor.sh.
|
|
3
|
+
*
|
|
4
|
+
* Every call against the Cursor backend must send the same
|
|
5
|
+
* x-cursor-client-version: the backend gates features and minimum versions on
|
|
6
|
+
* it, so a drift between the agent Run path and model discovery makes one of
|
|
7
|
+
* them fail while the other keeps working. Keep this as the single source of
|
|
8
|
+
* truth for the header value.
|
|
9
|
+
*/
|
|
10
|
+
export const CURSOR_CLIENT_VERSION = "cli-2026.02.13-41ac335";
|