@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,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming-safe filter for the Kimi K2 chat-template "tool-call section"
|
|
3
|
+
* grammar.
|
|
4
|
+
*
|
|
5
|
+
* Some providers hosting Kimi K2 (the native `kimi-code` API, OpenRouter,
|
|
6
|
+
* Fireworks, and others) leak the raw chat-template special tokens into
|
|
7
|
+
* `delta.content` instead of emitting structured `tool_calls`. Visually
|
|
8
|
+
* that looks like:
|
|
9
|
+
*
|
|
10
|
+
* <|tool_calls_section_begin|>
|
|
11
|
+
* <|tool_call_begin|>functions.read:0<|tool_call_argument_begin|>{"path":"foo"}<|tool_call_end|>
|
|
12
|
+
* <|tool_calls_section_end|>
|
|
13
|
+
*
|
|
14
|
+
* Without healing, the user sees the raw markers and the agent loop never
|
|
15
|
+
* sees a tool call. This module reconstructs the embedded calls and strips
|
|
16
|
+
* the markers from visible text. It is stream-aware: any partial token at
|
|
17
|
+
* the end of a chunk is held back until the next chunk arrives.
|
|
18
|
+
*/
|
|
19
|
+
import { type UnicodeEscapeEvidence } from "./json-parse";
|
|
20
|
+
export interface HealedToolCall {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly arguments: string;
|
|
24
|
+
/**
|
|
25
|
+
* Whether the raw leaked payload carried unsafe Unicode argument data.
|
|
26
|
+
* Captured before the normalizing round-trip below, which would otherwise
|
|
27
|
+
* erase malformed escape evidence. Valid `\uXXXX` spellings decode
|
|
28
|
+
* canonically and leave this false.
|
|
29
|
+
*/
|
|
30
|
+
readonly escapedNonAsciiArguments: boolean;
|
|
31
|
+
readonly escapedUnicodeArgumentEvidence?: UnicodeEscapeEvidence;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* State machine that consumes streamed text, emits visible text with all
|
|
35
|
+
* Kimi tool-call markers stripped, and accumulates the embedded tool calls
|
|
36
|
+
* for the caller to drain after each `feed()`.
|
|
37
|
+
*
|
|
38
|
+
* One instance per stream. Feed only the channel that may carry leaked
|
|
39
|
+
* markers (typically `delta.content`); mixing reasoning + content into the
|
|
40
|
+
* same accumulator corrupts the holdback buffer if both channels race in
|
|
41
|
+
* the same chunk.
|
|
42
|
+
*/
|
|
43
|
+
export declare class ToolCallHealer {
|
|
44
|
+
#private;
|
|
45
|
+
/**
|
|
46
|
+
* Feed a chunk of streamed text. Returns the portion safe to emit
|
|
47
|
+
* downstream (with all tokens stripped). Any partial token suffix is
|
|
48
|
+
* held back until the next chunk arrives or {@link flushPending} is
|
|
49
|
+
* called.
|
|
50
|
+
*/
|
|
51
|
+
feed(text: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Like {@link feed}, but discards any tool calls that the chunk completes.
|
|
54
|
+
* Used when the upstream provider also emits structured `delta.tool_calls`
|
|
55
|
+
* for the same chunk: the healer still strips leaked marker text from the
|
|
56
|
+
* visible output, but the structured payload remains the single source of
|
|
57
|
+
* truth for the call list.
|
|
58
|
+
*/
|
|
59
|
+
consumeWithoutCalls(text: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Drain accumulated tool calls. The internal list is cleared so a
|
|
62
|
+
* subsequent section in the same stream (rare) yields fresh calls.
|
|
63
|
+
*/
|
|
64
|
+
drainCompleted(): HealedToolCall[];
|
|
65
|
+
/**
|
|
66
|
+
* Flush any held-back fragment when the stream ends. If we were mid-call
|
|
67
|
+
* the partial is dropped (emitting raw token bytes would surface markers
|
|
68
|
+
* to the user); otherwise the fragment is returned verbatim so a literal
|
|
69
|
+
* `<|` in prose is not silently lost.
|
|
70
|
+
*/
|
|
71
|
+
flushPending(): string;
|
|
72
|
+
/** True once any tool-call section in this stream has fully closed. */
|
|
73
|
+
get sectionClosed(): boolean;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Cheap test for whether a given model is known to leak Kimi-K2 chat-template
|
|
77
|
+
* tool-call tokens into visible text. Used to gate the per-stream healer so
|
|
78
|
+
* non-Kimi providers do not pay for the scan.
|
|
79
|
+
*/
|
|
80
|
+
export declare function modelMayLeakKimiToolCalls(provider: string, modelId: string): boolean;
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming-safe filter for the Kimi K2 chat-template "tool-call section"
|
|
3
|
+
* grammar.
|
|
4
|
+
*
|
|
5
|
+
* Some providers hosting Kimi K2 (the native `kimi-code` API, OpenRouter,
|
|
6
|
+
* Fireworks, and others) leak the raw chat-template special tokens into
|
|
7
|
+
* `delta.content` instead of emitting structured `tool_calls`. Visually
|
|
8
|
+
* that looks like:
|
|
9
|
+
*
|
|
10
|
+
* <|tool_calls_section_begin|>
|
|
11
|
+
* <|tool_call_begin|>functions.read:0<|tool_call_argument_begin|>{"path":"foo"}<|tool_call_end|>
|
|
12
|
+
* <|tool_calls_section_end|>
|
|
13
|
+
*
|
|
14
|
+
* Without healing, the user sees the raw markers and the agent loop never
|
|
15
|
+
* sees a tool call. This module reconstructs the embedded calls and strips
|
|
16
|
+
* the markers from visible text. It is stream-aware: any partial token at
|
|
17
|
+
* the end of a chunk is held back until the next chunk arrives.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
attachUnicodeEscapeEvidence,
|
|
22
|
+
collectUnsafeUnicodeEscapeEvidence,
|
|
23
|
+
parseJsonWithRepair,
|
|
24
|
+
type UnicodeEscapeEvidence,
|
|
25
|
+
} from "./json-parse";
|
|
26
|
+
|
|
27
|
+
const TOK_SECTION_BEGIN = "<|tool_calls_section_begin|>";
|
|
28
|
+
const TOK_SECTION_END = "<|tool_calls_section_end|>";
|
|
29
|
+
const TOK_CALL_BEGIN = "<|tool_call_begin|>";
|
|
30
|
+
const TOK_CALL_END = "<|tool_call_end|>";
|
|
31
|
+
const TOK_ARG_BEGIN = "<|tool_call_argument_begin|>";
|
|
32
|
+
|
|
33
|
+
const TOKENS = [TOK_SECTION_BEGIN, TOK_SECTION_END, TOK_CALL_BEGIN, TOK_CALL_END, TOK_ARG_BEGIN] as const;
|
|
34
|
+
|
|
35
|
+
/** Maximum buffered partial-token length before we give up holding back. */
|
|
36
|
+
const MAX_PARTIAL_HOLD = 64;
|
|
37
|
+
|
|
38
|
+
export interface HealedToolCall {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly name: string;
|
|
41
|
+
readonly arguments: string;
|
|
42
|
+
/**
|
|
43
|
+
* Whether the raw leaked payload carried unsafe Unicode argument data.
|
|
44
|
+
* Captured before the normalizing round-trip below, which would otherwise
|
|
45
|
+
* erase malformed escape evidence. Valid `\uXXXX` spellings decode
|
|
46
|
+
* canonically and leave this false.
|
|
47
|
+
*/
|
|
48
|
+
readonly escapedNonAsciiArguments: boolean;
|
|
49
|
+
readonly escapedUnicodeArgumentEvidence?: UnicodeEscapeEvidence;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* State machine that consumes streamed text, emits visible text with all
|
|
54
|
+
* Kimi tool-call markers stripped, and accumulates the embedded tool calls
|
|
55
|
+
* for the caller to drain after each `feed()`.
|
|
56
|
+
*
|
|
57
|
+
* One instance per stream. Feed only the channel that may carry leaked
|
|
58
|
+
* markers (typically `delta.content`); mixing reasoning + content into the
|
|
59
|
+
* same accumulator corrupts the holdback buffer if both channels race in
|
|
60
|
+
* the same chunk.
|
|
61
|
+
*/
|
|
62
|
+
export class ToolCallHealer {
|
|
63
|
+
#buffer = "";
|
|
64
|
+
#offset = 0;
|
|
65
|
+
#inSection = false;
|
|
66
|
+
#inCall = false;
|
|
67
|
+
#inArgs = false;
|
|
68
|
+
#pendingId = "";
|
|
69
|
+
#pendingArgs = "";
|
|
70
|
+
#sectionTerminated = false;
|
|
71
|
+
readonly #completed: HealedToolCall[] = [];
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Feed a chunk of streamed text. Returns the portion safe to emit
|
|
75
|
+
* downstream (with all tokens stripped). Any partial token suffix is
|
|
76
|
+
* held back until the next chunk arrives or {@link flushPending} is
|
|
77
|
+
* called.
|
|
78
|
+
*/
|
|
79
|
+
feed(text: string): string {
|
|
80
|
+
if (text.length === 0) return "";
|
|
81
|
+
this.#compact();
|
|
82
|
+
this.#buffer += text;
|
|
83
|
+
return this.#consume();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Like {@link feed}, but discards any tool calls that the chunk completes.
|
|
88
|
+
* Used when the upstream provider also emits structured `delta.tool_calls`
|
|
89
|
+
* for the same chunk: the healer still strips leaked marker text from the
|
|
90
|
+
* visible output, but the structured payload remains the single source of
|
|
91
|
+
* truth for the call list.
|
|
92
|
+
*/
|
|
93
|
+
consumeWithoutCalls(text: string): string {
|
|
94
|
+
const clean = this.feed(text);
|
|
95
|
+
if (this.#completed.length > 0) this.#completed.length = 0;
|
|
96
|
+
return clean;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Drain accumulated tool calls. The internal list is cleared so a
|
|
101
|
+
* subsequent section in the same stream (rare) yields fresh calls.
|
|
102
|
+
*/
|
|
103
|
+
drainCompleted(): HealedToolCall[] {
|
|
104
|
+
if (this.#completed.length === 0) return [];
|
|
105
|
+
return this.#completed.splice(0, this.#completed.length);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Flush any held-back fragment when the stream ends. If we were mid-call
|
|
110
|
+
* the partial is dropped (emitting raw token bytes would surface markers
|
|
111
|
+
* to the user); otherwise the fragment is returned verbatim so a literal
|
|
112
|
+
* `<|` in prose is not silently lost.
|
|
113
|
+
*/
|
|
114
|
+
flushPending(): string {
|
|
115
|
+
const tail = this.#remaining();
|
|
116
|
+
this.#buffer = "";
|
|
117
|
+
this.#offset = 0;
|
|
118
|
+
if (this.#inCall || this.#inSection) return "";
|
|
119
|
+
return tail;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** True once any tool-call section in this stream has fully closed. */
|
|
123
|
+
get sectionClosed(): boolean {
|
|
124
|
+
return this.#sectionTerminated;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#remaining(): string {
|
|
128
|
+
return this.#offset === 0 ? this.#buffer : this.#buffer.slice(this.#offset);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
#compact(): void {
|
|
132
|
+
if (this.#offset === 0) return;
|
|
133
|
+
this.#buffer = this.#buffer.slice(this.#offset);
|
|
134
|
+
this.#offset = 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
#consume(): string {
|
|
138
|
+
let clean = "";
|
|
139
|
+
|
|
140
|
+
while (this.#offset < this.#buffer.length) {
|
|
141
|
+
if (this.#startsWithPartialToken()) break;
|
|
142
|
+
|
|
143
|
+
if (this.#matches(TOK_SECTION_BEGIN)) {
|
|
144
|
+
this.#inSection = true;
|
|
145
|
+
this.#offset += TOK_SECTION_BEGIN.length;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (this.#matches(TOK_SECTION_END)) {
|
|
149
|
+
this.#inSection = false;
|
|
150
|
+
this.#sectionTerminated = true;
|
|
151
|
+
this.#offset += TOK_SECTION_END.length;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (this.#matches(TOK_CALL_BEGIN)) {
|
|
155
|
+
if (!this.#inSection) {
|
|
156
|
+
// Literal mention outside a section — pass through as text so
|
|
157
|
+
// docs/examples explaining tool tokens are not silently eaten.
|
|
158
|
+
clean += TOK_CALL_BEGIN;
|
|
159
|
+
this.#offset += TOK_CALL_BEGIN.length;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
this.#inCall = true;
|
|
163
|
+
this.#inArgs = false;
|
|
164
|
+
this.#pendingId = "";
|
|
165
|
+
this.#pendingArgs = "";
|
|
166
|
+
this.#offset += TOK_CALL_BEGIN.length;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (this.#matches(TOK_ARG_BEGIN)) {
|
|
170
|
+
if (!this.#inSection) {
|
|
171
|
+
clean += TOK_ARG_BEGIN;
|
|
172
|
+
this.#offset += TOK_ARG_BEGIN.length;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
this.#inArgs = true;
|
|
176
|
+
this.#offset += TOK_ARG_BEGIN.length;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (this.#matches(TOK_CALL_END)) {
|
|
180
|
+
if (!this.#inSection || !this.#inCall) {
|
|
181
|
+
// Token appeared outside an active call (e.g. an assistant
|
|
182
|
+
// turn explaining the Kimi format). Emit it verbatim instead
|
|
183
|
+
// of synthesizing a bogus empty tool call.
|
|
184
|
+
clean += TOK_CALL_END;
|
|
185
|
+
this.#offset += TOK_CALL_END.length;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
this.#finalizeCall();
|
|
189
|
+
this.#offset += TOK_CALL_END.length;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const ch = this.#buffer[this.#offset]!;
|
|
194
|
+
this.#offset += 1;
|
|
195
|
+
|
|
196
|
+
if (this.#inCall) {
|
|
197
|
+
if (this.#inArgs) {
|
|
198
|
+
this.#pendingArgs += ch;
|
|
199
|
+
} else {
|
|
200
|
+
this.#pendingId += ch;
|
|
201
|
+
}
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Inside the section but outside an individual call: swallow
|
|
206
|
+
// inter-call whitespace/newlines. Outside the section: pass through.
|
|
207
|
+
if (!this.#inSection) clean += ch;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return clean;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
#matches(token: string): boolean {
|
|
214
|
+
return this.#buffer.startsWith(token, this.#offset);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* True if the remaining buffer is a strict prefix of any known token —
|
|
219
|
+
* we need more bytes before deciding whether it's a token or prose.
|
|
220
|
+
* Capped so a stray `<|` in normal text can't grow the holdback
|
|
221
|
+
* unboundedly.
|
|
222
|
+
*/
|
|
223
|
+
#startsWithPartialToken(): boolean {
|
|
224
|
+
const remainingLength = this.#buffer.length - this.#offset;
|
|
225
|
+
if (remainingLength === 0 || remainingLength > MAX_PARTIAL_HOLD) return false;
|
|
226
|
+
for (const token of TOKENS) {
|
|
227
|
+
if (token.length <= remainingLength) continue;
|
|
228
|
+
if (this.#bufferIsPrefixOf(token, remainingLength)) return true;
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
#bufferIsPrefixOf(token: string, remainingLength: number): boolean {
|
|
234
|
+
for (let i = 0; i < remainingLength; i++) {
|
|
235
|
+
if (this.#buffer[this.#offset + i] !== token[i]) return false;
|
|
236
|
+
}
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
#finalizeCall(): void {
|
|
241
|
+
const rawId = this.#pendingId.trim();
|
|
242
|
+
const rawArgs = this.#pendingArgs.trim();
|
|
243
|
+
const name = normalizeFunctionName(rawId);
|
|
244
|
+
const id = generateHealedToolCallId();
|
|
245
|
+
|
|
246
|
+
// Sample unsafe raw payloads first: the round-trip below decodes `\uXXXX`
|
|
247
|
+
// into literal characters, so malformed escape data must be retained before
|
|
248
|
+
// normalization. Valid escapes need no evidence because their decoded value
|
|
249
|
+
// is canonical.
|
|
250
|
+
const escapedUnicodeArgumentEvidence = collectUnsafeUnicodeEscapeEvidence(rawArgs);
|
|
251
|
+
const escapedNonAsciiArguments = escapedUnicodeArgumentEvidence !== undefined;
|
|
252
|
+
|
|
253
|
+
let argsJson = rawArgs;
|
|
254
|
+
if (rawArgs.length > 0) {
|
|
255
|
+
try {
|
|
256
|
+
// Round-trip to normalize whitespace and repair near-valid JSON.
|
|
257
|
+
argsJson = JSON.stringify(parseJsonWithRepair<unknown>(rawArgs));
|
|
258
|
+
} catch {
|
|
259
|
+
// Leave raw; downstream parseStreamingJson absorbs the failure.
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
argsJson = "{}";
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const completed: HealedToolCall = {
|
|
266
|
+
id,
|
|
267
|
+
name,
|
|
268
|
+
arguments: argsJson,
|
|
269
|
+
escapedNonAsciiArguments,
|
|
270
|
+
};
|
|
271
|
+
if (escapedUnicodeArgumentEvidence) attachUnicodeEscapeEvidence(completed, escapedUnicodeArgumentEvidence);
|
|
272
|
+
this.#completed.push(completed);
|
|
273
|
+
this.#inCall = false;
|
|
274
|
+
this.#inArgs = false;
|
|
275
|
+
this.#pendingId = "";
|
|
276
|
+
this.#pendingArgs = "";
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Cheap test for whether a given model is known to leak Kimi-K2 chat-template
|
|
282
|
+
* tool-call tokens into visible text. Used to gate the per-stream healer so
|
|
283
|
+
* non-Kimi providers do not pay for the scan.
|
|
284
|
+
*/
|
|
285
|
+
export function modelMayLeakKimiToolCalls(provider: string, modelId: string): boolean {
|
|
286
|
+
if (provider === "kimi-code" || provider === "moonshot") return true;
|
|
287
|
+
return /kimi[-/_.]?k2/i.test(modelId);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function normalizeFunctionName(rawId: string): string {
|
|
291
|
+
const stripped = rawId.startsWith("functions.") ? rawId.slice("functions.".length) : rawId;
|
|
292
|
+
const colon = stripped.indexOf(":");
|
|
293
|
+
return colon >= 0 ? stripped.slice(0, colon) : stripped;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function generateHealedToolCallId(): string {
|
|
297
|
+
return `call_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
|
|
298
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Api, Model, ToolChoice, ToolChoiceCompat, ToolChoiceSupport, ToolChoiceSupportSource } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Mythos accepts tools but rejects forced tool use (Anthropic 400:
|
|
4
|
+
* "tool_choice forces tool use is not compatible with this model"). Catalog
|
|
5
|
+
* generation and dynamic discovery use this to default `toolChoiceSupport`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isClaudeForcedToolChoiceIncapableModelId(modelId: string): boolean;
|
|
8
|
+
/** Derives the effective static tool-choice support from compatibility flags. */
|
|
9
|
+
export declare function deriveToolChoiceSupport(compat: ToolChoiceCompat | undefined): {
|
|
10
|
+
support: ToolChoiceSupport;
|
|
11
|
+
source: "static" | "derived";
|
|
12
|
+
};
|
|
13
|
+
/** Returns the registry key used for runtime tool-choice capability overrides. */
|
|
14
|
+
export declare function toolChoiceRegistryKey(model: Model<Api>): string;
|
|
15
|
+
/** Returns the current runtime tool-choice capability override for a model. */
|
|
16
|
+
export declare function getToolChoiceCapabilityOverride(model: Model<Api>): ToolChoiceSupport | undefined;
|
|
17
|
+
/** Clears runtime tool-choice capability overrides for tests. */
|
|
18
|
+
export declare function clearToolChoiceIncapabilityRegistryForTests(): void;
|
|
19
|
+
/** Overrides durable-cache dependencies for isolated tests. */
|
|
20
|
+
export declare function configureToolChoiceCapabilityCacheForTests(options?: {
|
|
21
|
+
path?: string;
|
|
22
|
+
now?: () => number;
|
|
23
|
+
beforeExpiredDelete?: () => void;
|
|
24
|
+
beforeMalformedDelete?: () => void;
|
|
25
|
+
onCacheOpen?: () => void;
|
|
26
|
+
simulateOperationError?: () => Error | undefined;
|
|
27
|
+
beforeCorruptRetire?: () => void;
|
|
28
|
+
beforeLockExactUnlink?: (lockPath: string) => void;
|
|
29
|
+
}): void;
|
|
30
|
+
/** Records a discovered maximum supported tool-choice level for a model. */
|
|
31
|
+
export declare function markToolChoiceIncapability(model: Model<Api>, maxSupport: ToolChoiceSupport, reason?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves a requested tool_choice against static and runtime capability limits.
|
|
34
|
+
* `compat` overrides `model.compat` for transports that layer URL/provider
|
|
35
|
+
* detection on top of explicit model overrides (e.g. resolveOpenAICompat).
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveToolChoice(model: Model<Api>, requested: ToolChoice | undefined, compat?: ToolChoiceCompat): ResolveToolChoiceResult;
|
|
38
|
+
/** Detects provider errors indicating forced tool_choice is unsupported. */
|
|
39
|
+
export declare function isForcedToolChoiceUnsupportedError(error: unknown, sentForcedToolChoice: boolean): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Detects Codex's statusless SSE rejection for a named function tool choice.
|
|
42
|
+
* This is intentionally separate from the shared HTTP-400 classifier.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isCodexStatuslessNamedToolChoiceNotFoundError(error: unknown, forcedToolName: string | undefined, sentToolNames: readonly string[]): boolean;
|
|
45
|
+
export type { ToolChoiceCompat, ToolChoiceSupport, ToolChoiceSupportSource } from "../types";
|
|
46
|
+
export interface ResolveToolChoiceResult {
|
|
47
|
+
requestedChoice: ToolChoice | undefined;
|
|
48
|
+
requestedLevel: ToolChoiceSupport;
|
|
49
|
+
resolvedChoice: ToolChoice | undefined;
|
|
50
|
+
resolvedLevel: ToolChoiceSupport;
|
|
51
|
+
support: ToolChoiceSupport;
|
|
52
|
+
supportSource: ToolChoiceSupportSource;
|
|
53
|
+
degraded: boolean;
|
|
54
|
+
reason?: string;
|
|
55
|
+
registryKey: string;
|
|
56
|
+
targetToolName?: string;
|
|
57
|
+
}
|