@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,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pi-native wire format for the auth-gateway.
|
|
3
|
+
*
|
|
4
|
+
* Where the OpenAI / Anthropic / Responses route modules translate foreign
|
|
5
|
+
* wire shapes through pi-ai's canonical {@link Context}, this module accepts
|
|
6
|
+
* the canonical shape *directly* — for clients that already speak pi-ai
|
|
7
|
+
* (containerized Vibrato deployments and sidecar auth gateways).
|
|
8
|
+
* Skipping the wire-format → Context → wire-format round-trip cuts
|
|
9
|
+
* per-request CPU but, more importantly, avoids the quantization that those
|
|
10
|
+
* translations impose on first-class pi-ai fields (service tier, cache
|
|
11
|
+
* markers, thinking budgets, tool-choice variants, …).
|
|
12
|
+
*
|
|
13
|
+
* The streaming wire is {@link AssistantMessageEvent} serialized as SSE. Public
|
|
14
|
+
* projections omit private raw reasoning and serialized Responses reasoning
|
|
15
|
+
* signatures while preserving provider-displayable summaries and genuine opaque
|
|
16
|
+
* signatures. Including `partial: AssistantMessage` on every delta is O(N²) in
|
|
17
|
+
* turn length on the wire — acceptable for the loopback / sidecar topology this
|
|
18
|
+
* transport is designed for; provider latency dominates the actual cost.
|
|
19
|
+
*
|
|
20
|
+
* Endpoint contract:
|
|
21
|
+
* POST /v1/pi/stream
|
|
22
|
+
* body: { modelId, context, options?, stream? } // `stream` defaults to true
|
|
23
|
+
* 200 SSE: stream of `AssistantMessageEvent` (terminated by `data: [DONE]`)
|
|
24
|
+
* 200 JSON (stream=false): { message: AssistantMessage }
|
|
25
|
+
* 4xx/5xx: { error: { type, message } }
|
|
26
|
+
*/
|
|
27
|
+
import type {
|
|
28
|
+
AssistantMessage,
|
|
29
|
+
AssistantMessageEvent,
|
|
30
|
+
AssistantMessageEventStream,
|
|
31
|
+
Context,
|
|
32
|
+
SimpleStreamOptions,
|
|
33
|
+
ThinkingContent,
|
|
34
|
+
} from "../types";
|
|
35
|
+
|
|
36
|
+
export interface PiNativeParsedRequest {
|
|
37
|
+
modelId: string;
|
|
38
|
+
context: Context;
|
|
39
|
+
options: SimpleStreamOptions;
|
|
40
|
+
stream: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Subset of {@link SimpleStreamOptions} accepted from the wire. Function-valued
|
|
44
|
+
* fields (`fetch`, `onPayload`, `onResponse`, `onSseEvent`, exec handlers, the
|
|
45
|
+
* provider-session map) and gateway-owned controls (`apiKey`, `signal`) are
|
|
46
|
+
* intentionally absent — those are server-side concerns. Anything outside this
|
|
47
|
+
* allow-list is dropped silently rather than 400ing, so clients can forward
|
|
48
|
+
* `SimpleStreamOptions` from older / newer vib builds without per-version
|
|
49
|
+
* conditionals.
|
|
50
|
+
*/
|
|
51
|
+
const ALLOWED_OPTION_KEYS: ReadonlySet<keyof SimpleStreamOptions> = new Set([
|
|
52
|
+
"temperature",
|
|
53
|
+
"topP",
|
|
54
|
+
"topK",
|
|
55
|
+
"minP",
|
|
56
|
+
"presencePenalty",
|
|
57
|
+
"frequencyPenalty",
|
|
58
|
+
"repetitionPenalty",
|
|
59
|
+
"stopSequences",
|
|
60
|
+
"maxTokens",
|
|
61
|
+
"cacheRetention",
|
|
62
|
+
"headers",
|
|
63
|
+
"initiatorOverride",
|
|
64
|
+
"maxRetryDelayMs",
|
|
65
|
+
"fallbackManaged",
|
|
66
|
+
"metadata",
|
|
67
|
+
"sessionId",
|
|
68
|
+
"streamFirstEventTimeoutMs",
|
|
69
|
+
"streamIdleTimeoutMs",
|
|
70
|
+
"reasoning",
|
|
71
|
+
"disableReasoning",
|
|
72
|
+
"hideThinkingSummary",
|
|
73
|
+
"thinkingBudgets",
|
|
74
|
+
"toolChoice",
|
|
75
|
+
"serviceTier",
|
|
76
|
+
"kimiApiFormat",
|
|
77
|
+
"syntheticApiFormat",
|
|
78
|
+
"preferWebsockets",
|
|
79
|
+
] as const satisfies readonly (keyof SimpleStreamOptions)[]);
|
|
80
|
+
|
|
81
|
+
const CREDENTIAL_HEADER_NAMES = new Set([
|
|
82
|
+
"authorization",
|
|
83
|
+
"proxy-authorization",
|
|
84
|
+
"cookie",
|
|
85
|
+
"set-cookie",
|
|
86
|
+
"api-key",
|
|
87
|
+
"x-api-key",
|
|
88
|
+
"x-goog-api-key",
|
|
89
|
+
"anthropic-api-key",
|
|
90
|
+
"x-auth-token",
|
|
91
|
+
"x-access-token",
|
|
92
|
+
"x-api-token",
|
|
93
|
+
"x-client-secret",
|
|
94
|
+
]);
|
|
95
|
+
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// parseRequest
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Parse a pi-native request body. Validation is intentionally minimal — only
|
|
102
|
+
* the shape the gateway itself reads is checked (`modelId`, `context.messages`
|
|
103
|
+
* array, options is an object). Everything downstream is the canonical pi-ai
|
|
104
|
+
* type surface; mis-shaped values surface as a `502 upstream_error` from
|
|
105
|
+
* `streamSimple` rather than being re-validated here.
|
|
106
|
+
*
|
|
107
|
+
* Accepts both `{ modelId: string }` and `{ model: { id: string } }` so the
|
|
108
|
+
* existing `streamProxy` client (which sends the full Model object) can target
|
|
109
|
+
* the gateway with only a URL swap.
|
|
110
|
+
*/
|
|
111
|
+
export function parseRequest(body: unknown, _headers?: Headers): PiNativeParsedRequest {
|
|
112
|
+
if (typeof body !== "object" || body === null || Array.isArray(body)) {
|
|
113
|
+
throw new Error("Request body must be a JSON object");
|
|
114
|
+
}
|
|
115
|
+
const obj = body as Record<string, unknown>;
|
|
116
|
+
|
|
117
|
+
let modelId: string | undefined;
|
|
118
|
+
if (typeof obj.modelId === "string" && obj.modelId.length > 0) {
|
|
119
|
+
modelId = obj.modelId;
|
|
120
|
+
} else if (typeof obj.model === "string" && obj.model.length > 0) {
|
|
121
|
+
modelId = obj.model;
|
|
122
|
+
} else if (typeof obj.model === "object" && obj.model !== null) {
|
|
123
|
+
const m = obj.model as Record<string, unknown>;
|
|
124
|
+
if (typeof m.id === "string" && m.id.length > 0) modelId = m.id;
|
|
125
|
+
}
|
|
126
|
+
if (!modelId) throw new Error("Missing `modelId` (or `model.id`) field");
|
|
127
|
+
|
|
128
|
+
const context = obj.context;
|
|
129
|
+
if (typeof context !== "object" || context === null || Array.isArray(context)) {
|
|
130
|
+
throw new Error("Missing `context` object");
|
|
131
|
+
}
|
|
132
|
+
const ctxObj = context as Record<string, unknown>;
|
|
133
|
+
if (!Array.isArray(ctxObj.messages)) {
|
|
134
|
+
throw new Error("`context.messages` must be an array");
|
|
135
|
+
}
|
|
136
|
+
if (ctxObj.systemPrompt !== undefined && !Array.isArray(ctxObj.systemPrompt)) {
|
|
137
|
+
throw new Error("`context.systemPrompt` must be an array of strings when present");
|
|
138
|
+
}
|
|
139
|
+
if (ctxObj.tools !== undefined && !Array.isArray(ctxObj.tools)) {
|
|
140
|
+
throw new Error("`context.tools` must be an array when present");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const options: SimpleStreamOptions = {};
|
|
144
|
+
const rawOpts = obj.options;
|
|
145
|
+
if (typeof rawOpts === "object" && rawOpts !== null && !Array.isArray(rawOpts)) {
|
|
146
|
+
const optsBag = options as Record<string, unknown>;
|
|
147
|
+
for (const [k, v] of Object.entries(rawOpts)) {
|
|
148
|
+
if (v === undefined || v === null) continue;
|
|
149
|
+
if (!ALLOWED_OPTION_KEYS.has(k as keyof SimpleStreamOptions)) continue;
|
|
150
|
+
if (k === "headers" && typeof v === "object" && v !== null && !Array.isArray(v)) {
|
|
151
|
+
const safeHeaders: Record<string, string> = {};
|
|
152
|
+
for (const [name, value] of Object.entries(v)) {
|
|
153
|
+
if (CREDENTIAL_HEADER_NAMES.has(name.toLowerCase())) continue;
|
|
154
|
+
if (typeof value === "string") safeHeaders[name] = value;
|
|
155
|
+
}
|
|
156
|
+
optsBag[k] = safeHeaders;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
optsBag[k] = v;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// `stream` defaults to true — pi-native clients overwhelmingly stream, and
|
|
164
|
+
// matching `streamProxy`'s implicit-stream behavior avoids a one-flag papercut.
|
|
165
|
+
const stream = typeof obj.stream === "boolean" ? obj.stream : true;
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
modelId,
|
|
169
|
+
context: context as Context,
|
|
170
|
+
options,
|
|
171
|
+
stream,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// encodeStream (SSE)
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
|
|
178
|
+
const SSE_ENCODER = new TextEncoder();
|
|
179
|
+
const SSE_DONE = SSE_ENCODER.encode("data: [DONE]\n\n");
|
|
180
|
+
|
|
181
|
+
function isSerializedResponsesReasoningItem(signature: string): boolean {
|
|
182
|
+
try {
|
|
183
|
+
const parsed: unknown = JSON.parse(signature);
|
|
184
|
+
return (
|
|
185
|
+
typeof parsed === "object" &&
|
|
186
|
+
parsed !== null &&
|
|
187
|
+
!Array.isArray(parsed) &&
|
|
188
|
+
(parsed as { type?: unknown }).type === "reasoning"
|
|
189
|
+
);
|
|
190
|
+
} catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Clone a thinking block for public transport. Raw reasoning is private: omit
|
|
197
|
+
* raw-only blocks, retain only the displayable summary for mixed blocks, and
|
|
198
|
+
* never forward a serialized Responses reasoning item as a signature.
|
|
199
|
+
*/
|
|
200
|
+
function isResponsesFamilyApi(api: AssistantMessage["api"]): boolean {
|
|
201
|
+
return api === "openai-responses" || api === "openai-codex-responses";
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function sanitizeThinking(content: ThinkingContent, api: AssistantMessage["api"]): ThinkingContent | undefined {
|
|
205
|
+
if (isResponsesFamilyApi(api) && content.provenance === undefined) return undefined;
|
|
206
|
+
if (content.provenance === "raw") return undefined;
|
|
207
|
+
|
|
208
|
+
let thinking: string;
|
|
209
|
+
if (content.provenance === "mixed") {
|
|
210
|
+
if (content.summaryText === undefined) return undefined;
|
|
211
|
+
thinking = content.summaryText;
|
|
212
|
+
} else {
|
|
213
|
+
thinking = content.provenance === "summary" ? (content.summaryText ?? content.thinking) : content.thinking;
|
|
214
|
+
}
|
|
215
|
+
const signature =
|
|
216
|
+
content.thinkingSignature && isSerializedResponsesReasoningItem(content.thinkingSignature)
|
|
217
|
+
? undefined
|
|
218
|
+
: content.thinkingSignature;
|
|
219
|
+
const { rawText: _rawText, thinkingSignature: _thinkingSignature, ...rest } = content;
|
|
220
|
+
return signature === undefined ? { ...rest, thinking } : { ...rest, thinking, thinkingSignature: signature };
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function sanitizeMessage(message: AssistantMessage): AssistantMessage {
|
|
224
|
+
let changed = false;
|
|
225
|
+
const content: AssistantMessage["content"] = [];
|
|
226
|
+
for (const part of message.content) {
|
|
227
|
+
if (part.type !== "thinking") {
|
|
228
|
+
content.push(part);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const needsSanitizing =
|
|
232
|
+
(isResponsesFamilyApi(message.api) && part.provenance === undefined) ||
|
|
233
|
+
part.provenance !== undefined ||
|
|
234
|
+
part.rawText !== undefined ||
|
|
235
|
+
(part.thinkingSignature !== undefined && isSerializedResponsesReasoningItem(part.thinkingSignature));
|
|
236
|
+
if (!needsSanitizing) {
|
|
237
|
+
content.push(part);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const sanitized = sanitizeThinking(part, message.api);
|
|
241
|
+
changed = true;
|
|
242
|
+
if (sanitized !== undefined) content.push(sanitized);
|
|
243
|
+
}
|
|
244
|
+
return changed ? { ...message, content } : message;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function hasRawOrMixedThinking(partial: AssistantMessage, contentIndex: number): boolean {
|
|
248
|
+
const content = partial.content[contentIndex];
|
|
249
|
+
return content?.type === "thinking" && (content.provenance === "raw" || content.provenance === "mixed");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
type ThinkingEvent = Extract<AssistantMessageEvent, { type: "thinking_start" | "thinking_delta" | "thinking_end" }>;
|
|
253
|
+
|
|
254
|
+
interface BufferedThinkingEvent {
|
|
255
|
+
event: ThinkingEvent;
|
|
256
|
+
sequence: number;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function isFinalSafeThinking(partial: AssistantMessage, contentIndex: number): boolean {
|
|
260
|
+
const content = partial.content[contentIndex];
|
|
261
|
+
return (
|
|
262
|
+
content?.type === "thinking" &&
|
|
263
|
+
(!isResponsesFamilyApi(partial.api) || content.provenance !== undefined) &&
|
|
264
|
+
!hasRawOrMixedThinking(partial, contentIndex)
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function maskBufferedThinking(message: AssistantMessage, contentIndexes: ReadonlySet<number>): AssistantMessage {
|
|
269
|
+
let changed = false;
|
|
270
|
+
const content = message.content.map((part, contentIndex) => {
|
|
271
|
+
if (!contentIndexes.has(contentIndex) || part.type !== "thinking") return part;
|
|
272
|
+
changed = true;
|
|
273
|
+
return { type: "thinking" as const, thinking: "", ...(part.itemId ? { itemId: part.itemId } : {}) };
|
|
274
|
+
});
|
|
275
|
+
return changed ? { ...message, content } : message;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function maskBufferedThinkingInEvent(
|
|
279
|
+
event: AssistantMessageEvent,
|
|
280
|
+
contentIndexes: ReadonlySet<number>,
|
|
281
|
+
): AssistantMessageEvent {
|
|
282
|
+
if (contentIndexes.size === 0) return event;
|
|
283
|
+
switch (event.type) {
|
|
284
|
+
case "done":
|
|
285
|
+
case "error":
|
|
286
|
+
case "toolChoiceIncapability":
|
|
287
|
+
return event;
|
|
288
|
+
case "start":
|
|
289
|
+
case "text_start":
|
|
290
|
+
case "text_delta":
|
|
291
|
+
case "text_end":
|
|
292
|
+
case "thinking_start":
|
|
293
|
+
case "thinking_delta":
|
|
294
|
+
case "thinking_end":
|
|
295
|
+
case "reasoning_summary_start":
|
|
296
|
+
case "reasoning_summary_delta":
|
|
297
|
+
case "reasoning_summary_end":
|
|
298
|
+
case "toolcall_start":
|
|
299
|
+
case "toolcall_delta":
|
|
300
|
+
case "toolcall_end":
|
|
301
|
+
return { ...event, partial: maskBufferedThinking(event.partial, contentIndexes) };
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function withSummaryPartial<
|
|
306
|
+
T extends Extract<
|
|
307
|
+
AssistantMessageEvent,
|
|
308
|
+
{ type: "reasoning_summary_start" | "reasoning_summary_delta" | "reasoning_summary_end" }
|
|
309
|
+
>,
|
|
310
|
+
>(event: T, contentIndexes: ReadonlySet<number>, summaryText: string): T {
|
|
311
|
+
const partial = maskBufferedThinking(event.partial, contentIndexes);
|
|
312
|
+
const content = [...partial.content];
|
|
313
|
+
const original = event.partial.content[event.contentIndex];
|
|
314
|
+
content[event.contentIndex] = {
|
|
315
|
+
type: "thinking",
|
|
316
|
+
thinking: summaryText,
|
|
317
|
+
provenance: "summary",
|
|
318
|
+
summaryText,
|
|
319
|
+
...(original?.type === "thinking" && original.itemId ? { itemId: original.itemId } : {}),
|
|
320
|
+
};
|
|
321
|
+
return { ...event, partial: { ...partial, content } };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function sanitizeEvent(event: AssistantMessageEvent): AssistantMessageEvent | undefined {
|
|
325
|
+
switch (event.type) {
|
|
326
|
+
case "done":
|
|
327
|
+
return { ...event, message: sanitizeMessage(event.message) };
|
|
328
|
+
case "error":
|
|
329
|
+
return { ...event, error: sanitizeMessage(event.error) };
|
|
330
|
+
case "toolChoiceIncapability":
|
|
331
|
+
return event;
|
|
332
|
+
case "thinking_start":
|
|
333
|
+
case "thinking_delta":
|
|
334
|
+
case "thinking_end":
|
|
335
|
+
return hasRawOrMixedThinking(event.partial, event.contentIndex)
|
|
336
|
+
? undefined
|
|
337
|
+
: { ...event, partial: sanitizeMessage(event.partial) };
|
|
338
|
+
case "start":
|
|
339
|
+
case "text_start":
|
|
340
|
+
case "text_delta":
|
|
341
|
+
case "text_end":
|
|
342
|
+
case "reasoning_summary_start":
|
|
343
|
+
case "reasoning_summary_delta":
|
|
344
|
+
case "reasoning_summary_end":
|
|
345
|
+
case "toolcall_start":
|
|
346
|
+
case "toolcall_delta":
|
|
347
|
+
case "toolcall_end":
|
|
348
|
+
return { ...event, partial: sanitizeMessage(event.partial) };
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Ship only public-safe {@link AssistantMessageEvent} projections. Unknown
|
|
354
|
+
* thinking blocks remain buffered until their terminal partial establishes that
|
|
355
|
+
* the provider-native block is safe; raw and mixed blocks never reach SSE.
|
|
356
|
+
*/
|
|
357
|
+
export function encodeStream(events: AssistantMessageEventStream): ReadableStream<Uint8Array> {
|
|
358
|
+
return new ReadableStream<Uint8Array>({
|
|
359
|
+
async start(controller) {
|
|
360
|
+
const bufferedThinking = new Map<number, BufferedThinkingEvent[]>();
|
|
361
|
+
const summaryTextByIndex = new Map<number, string>();
|
|
362
|
+
let sequence = 0;
|
|
363
|
+
const write = (event: AssistantMessageEvent): void => {
|
|
364
|
+
const sanitized = sanitizeEvent(event);
|
|
365
|
+
if (sanitized !== undefined) {
|
|
366
|
+
controller.enqueue(SSE_ENCODER.encode(`data: ${JSON.stringify(sanitized)}\n\n`));
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
const emit = (event: AssistantMessageEvent): void => {
|
|
370
|
+
write(maskBufferedThinkingInEvent(event, new Set(bufferedThinking.keys())));
|
|
371
|
+
};
|
|
372
|
+
const flush = (buffered: BufferedThinkingEvent[]): void => {
|
|
373
|
+
for (const { event } of buffered.sort((a, b) => a.sequence - b.sequence)) emit(event);
|
|
374
|
+
};
|
|
375
|
+
const resolveBufferedThinking = (final: AssistantMessage): void => {
|
|
376
|
+
const ready: BufferedThinkingEvent[] = [];
|
|
377
|
+
for (const [contentIndex, buffered] of bufferedThinking) {
|
|
378
|
+
if (isFinalSafeThinking(final, contentIndex)) ready.push(...buffered);
|
|
379
|
+
}
|
|
380
|
+
bufferedThinking.clear();
|
|
381
|
+
flush(ready);
|
|
382
|
+
};
|
|
383
|
+
try {
|
|
384
|
+
for await (const event of events) {
|
|
385
|
+
switch (event.type) {
|
|
386
|
+
case "thinking_start":
|
|
387
|
+
case "thinking_delta": {
|
|
388
|
+
if (hasRawOrMixedThinking(event.partial, event.contentIndex)) {
|
|
389
|
+
bufferedThinking.delete(event.contentIndex);
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
const buffered = bufferedThinking.get(event.contentIndex) ?? [];
|
|
393
|
+
buffered.push({ event, sequence: sequence++ });
|
|
394
|
+
bufferedThinking.set(event.contentIndex, buffered);
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
case "thinking_end": {
|
|
398
|
+
const buffered = bufferedThinking.get(event.contentIndex) ?? [];
|
|
399
|
+
bufferedThinking.delete(event.contentIndex);
|
|
400
|
+
if (!isFinalSafeThinking(event.partial, event.contentIndex)) break;
|
|
401
|
+
buffered.push({ event, sequence: sequence++ });
|
|
402
|
+
flush(buffered);
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
case "done":
|
|
406
|
+
resolveBufferedThinking(event.message);
|
|
407
|
+
summaryTextByIndex.clear();
|
|
408
|
+
emit(event);
|
|
409
|
+
controller.enqueue(SSE_DONE);
|
|
410
|
+
controller.close();
|
|
411
|
+
return;
|
|
412
|
+
case "error":
|
|
413
|
+
resolveBufferedThinking(event.error);
|
|
414
|
+
summaryTextByIndex.clear();
|
|
415
|
+
emit(event);
|
|
416
|
+
controller.enqueue(SSE_DONE);
|
|
417
|
+
controller.close();
|
|
418
|
+
return;
|
|
419
|
+
case "reasoning_summary_start": {
|
|
420
|
+
summaryTextByIndex.set(event.contentIndex, "");
|
|
421
|
+
write(withSummaryPartial(event, new Set(bufferedThinking.keys()), ""));
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
424
|
+
case "reasoning_summary_delta": {
|
|
425
|
+
const summaryText = `${summaryTextByIndex.get(event.contentIndex) ?? ""}${event.delta}`;
|
|
426
|
+
summaryTextByIndex.set(event.contentIndex, summaryText);
|
|
427
|
+
write(withSummaryPartial(event, new Set(bufferedThinking.keys()), summaryText));
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
case "reasoning_summary_end": {
|
|
431
|
+
const summaryText = event.content || summaryTextByIndex.get(event.contentIndex) || "";
|
|
432
|
+
summaryTextByIndex.delete(event.contentIndex);
|
|
433
|
+
write(withSummaryPartial(event, new Set(bufferedThinking.keys()), summaryText));
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
case "start":
|
|
437
|
+
case "text_start":
|
|
438
|
+
case "text_delta":
|
|
439
|
+
case "text_end":
|
|
440
|
+
case "toolcall_start":
|
|
441
|
+
case "toolcall_delta":
|
|
442
|
+
case "toolcall_end":
|
|
443
|
+
case "toolChoiceIncapability":
|
|
444
|
+
emit(event);
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
controller.enqueue(SSE_DONE);
|
|
449
|
+
controller.close();
|
|
450
|
+
} catch (err) {
|
|
451
|
+
// Best-effort error envelope so the client iterator resolves
|
|
452
|
+
// instead of hanging on the dropped connection. Shape matches the
|
|
453
|
+
// canonical `error` event minus the unrecoverable `error:
|
|
454
|
+
// AssistantMessage` payload (we don't have a usable one here).
|
|
455
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
456
|
+
controller.enqueue(
|
|
457
|
+
SSE_ENCODER.encode(
|
|
458
|
+
`data: ${JSON.stringify({ type: "error", reason: "error", errorMessage: message })}\n\n`,
|
|
459
|
+
),
|
|
460
|
+
);
|
|
461
|
+
controller.enqueue(SSE_DONE);
|
|
462
|
+
controller.close();
|
|
463
|
+
}
|
|
464
|
+
},
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// ---------------------------------------------------------------------------
|
|
469
|
+
// formatError
|
|
470
|
+
// ---------------------------------------------------------------------------
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Pi-native error envelope:
|
|
474
|
+
* `{ error: { type, message } }`
|
|
475
|
+
*
|
|
476
|
+
* Mirrors OpenAI's outer shape (which clients/SDKs already parse) without the
|
|
477
|
+
* provider-specific status taxonomy — pi-native callers consume `type`
|
|
478
|
+
* directly.
|
|
479
|
+
*/
|
|
480
|
+
export function formatError(status: number, type: string, message: string): Response {
|
|
481
|
+
return new Response(JSON.stringify({ error: { type, message } }), {
|
|
482
|
+
status,
|
|
483
|
+
headers: {
|
|
484
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
485
|
+
"Cache-Control": "no-store",
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy provider module loading.
|
|
3
|
+
*
|
|
4
|
+
* Each provider module is loaded only when its stream function is first called.
|
|
5
|
+
* This avoids eagerly importing heavy SDK dependencies (e.g., @anthropic-ai/sdk,
|
|
6
|
+
* openai) at startup. The loaded module promise is cached so subsequent calls
|
|
7
|
+
* reuse the same import.
|
|
8
|
+
*
|
|
9
|
+
* stream.ts imports its provider stream functions from this module (see the
|
|
10
|
+
* lazy wrappers below), so this file IS the main streaming path's provider
|
|
11
|
+
* loader: heavy SDKs stay out of the CLI startup parse graph.
|
|
12
|
+
*/
|
|
13
|
+
import type { Api, AssistantMessageEventStream, Context, Model, OptionsForApi } from "../types";
|
|
14
|
+
import { AssistantMessageEventStream as EventStreamImpl } from "../utils/event-stream";
|
|
15
|
+
import type { BedrockOptions } from "./amazon-bedrock";
|
|
16
|
+
/**
|
|
17
|
+
* Lazy runtime descriptor for a built-in provider implementation.
|
|
18
|
+
*
|
|
19
|
+
* The registry stores descriptors with an erased module type because each
|
|
20
|
+
* provider's stream options are intentionally different. Callers narrow the
|
|
21
|
+
* loaded module at the single API dispatch boundary instead of forcing
|
|
22
|
+
* distributive variance through the collection type.
|
|
23
|
+
*/
|
|
24
|
+
export interface ProviderRuntimeDescriptor<TApi extends Api = Api, TModule = unknown> {
|
|
25
|
+
readonly api: TApi;
|
|
26
|
+
readonly load: () => Promise<TModule>;
|
|
27
|
+
}
|
|
28
|
+
interface BedrockProviderModule {
|
|
29
|
+
streamBedrock: (model: Model<"bedrock-converse-stream">, context: Context, options: BedrockOptions) => AssistantMessageEventStream;
|
|
30
|
+
}
|
|
31
|
+
export declare function setBedrockProviderModule(module: BedrockProviderModule): void;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the first-event timeout fallback for the outer lazy-stream watchdog.
|
|
34
|
+
* A configured wrapper-specific fallback (from `LazyStreamLimits`) always wins;
|
|
35
|
+
* otherwise providers known to have slow first events use the same centralized
|
|
36
|
+
* fallback as their inner provider-level watchdog. Returns `undefined` for
|
|
37
|
+
* providers that should use the shared default.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveLazyStreamFirstEventFallbackMs(provider: string, configuredFallbackMs?: number): number | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Lazy provider descriptors used by core consumers that need to inspect or
|
|
42
|
+
* prewarm a provider without importing its implementation at startup.
|
|
43
|
+
*/
|
|
44
|
+
export declare const PROVIDER_RUNTIME_DESCRIPTORS: readonly ProviderRuntimeDescriptor<Api, unknown>[];
|
|
45
|
+
/** Return the lazy descriptor for a built-in API, if one is registered. */
|
|
46
|
+
export declare function getProviderRuntimeDescriptor<TApi extends Api>(api: TApi): ProviderRuntimeDescriptor<TApi, unknown> | undefined;
|
|
47
|
+
export declare const streamAnthropic: (model: Model<"anthropic-messages">, context: Context, options: OptionsForApi<"anthropic-messages">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
48
|
+
export declare const streamAzureOpenAIResponses: (model: Model<"azure-openai-responses">, context: Context, options: OptionsForApi<"azure-openai-responses">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
49
|
+
export declare const streamGoogle: (model: Model<"google-generative-ai">, context: Context, options: OptionsForApi<"google-generative-ai">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
50
|
+
export declare const streamGoogleGeminiCli: (model: Model<"google-gemini-cli">, context: Context, options: OptionsForApi<"google-gemini-cli">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
51
|
+
export declare const streamGoogleVertex: (model: Model<"google-vertex">, context: Context, options: OptionsForApi<"google-vertex">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
52
|
+
export declare const streamOpenAICodexResponses: (model: Model<"openai-codex-responses">, context: Context, options: OptionsForApi<"openai-codex-responses">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
53
|
+
export declare const streamOpenAICompletions: (model: Model<"openai-completions">, context: Context, options: OptionsForApi<"openai-completions">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
54
|
+
export declare const streamOpenAIResponses: (model: Model<"openai-responses">, context: Context, options: OptionsForApi<"openai-responses">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
55
|
+
export declare const streamCursor: (model: Model<"cursor-agent">, context: Context, options: OptionsForApi<"cursor-agent">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
56
|
+
export declare const streamOllama: (model: Model<"ollama-chat">, context: Context, options: OptionsForApi<"ollama-chat">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
57
|
+
export declare const streamBedrock: (model: Model<"bedrock-converse-stream">, context: Context, options: OptionsForApi<"bedrock-converse-stream">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
58
|
+
export declare const streamKiroCodeWhisperer: (model: Model<"kiro-codewhisperer-stream">, context: Context, options: OptionsForApi<"kiro-codewhisperer-stream">, onStreamCreated?: () => void) => EventStreamImpl;
|
|
59
|
+
export {};
|