@linxiraos/pi-ai 1.0.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 +5066 -0
- package/README.md +1195 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
- package/dist/types/auth-broker/client.d.ts +93 -0
- package/dist/types/auth-broker/discover.d.ts +39 -0
- package/dist/types/auth-broker/index.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +136 -0
- package/dist/types/auth-broker/server.d.ts +48 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +152 -0
- package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
- package/dist/types/auth-gateway/http.d.ts +56 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +127 -0
- package/dist/types/auth-retry.d.ts +150 -0
- package/dist/types/auth-storage.d.ts +1258 -0
- package/dist/types/dialect/anthropic.d.ts +15 -0
- package/dist/types/dialect/catalog.d.ts +3 -0
- package/dist/types/dialect/coercion.d.ts +23 -0
- package/dist/types/dialect/deepseek.d.ts +14 -0
- package/dist/types/dialect/demotion.d.ts +30 -0
- package/dist/types/dialect/examples.d.ts +18 -0
- package/dist/types/dialect/factory.d.ts +3 -0
- package/dist/types/dialect/fenced-thinking.d.ts +53 -0
- package/dist/types/dialect/gemini.d.ts +17 -0
- package/dist/types/dialect/gemma.d.ts +15 -0
- package/dist/types/dialect/glm.d.ts +9 -0
- package/dist/types/dialect/harmony.d.ts +8 -0
- package/dist/types/dialect/hermes.d.ts +9 -0
- package/dist/types/dialect/history.d.ts +3 -0
- package/dist/types/dialect/index.d.ts +11 -0
- package/dist/types/dialect/inventory.d.ts +9 -0
- package/dist/types/dialect/kimi.d.ts +14 -0
- package/dist/types/dialect/minimax.d.ts +3 -0
- package/dist/types/dialect/owned-stream.d.ts +4 -0
- package/dist/types/dialect/qwen3.d.ts +9 -0
- package/dist/types/dialect/rendering.d.ts +54 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +68 -0
- package/dist/types/dialect/xml.d.ts +9 -0
- package/dist/types/error/abort.d.ts +14 -0
- package/dist/types/error/auth-classify.d.ts +20 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +27 -0
- package/dist/types/error/classes.d.ts +106 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +94 -0
- package/dist/types/error/format.d.ts +20 -0
- package/dist/types/error/gateway.d.ts +20 -0
- package/dist/types/error/index.d.ts +14 -0
- package/dist/types/error/oauth.d.ts +43 -0
- package/dist/types/error/provider.d.ts +42 -0
- package/dist/types/error/rate-limit.d.ts +80 -0
- package/dist/types/error/retryable.d.ts +27 -0
- package/dist/types/error/validation.d.ts +32 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +106 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +345 -0
- package/dist/types/providers/anthropic.d.ts +261 -0
- package/dist/types/providers/aws-credentials.d.ts +48 -0
- package/dist/types/providers/aws-eventstream.d.ts +39 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +16 -0
- package/dist/types/providers/bedrock-mantle.d.ts +13 -0
- package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
- package/dist/types/providers/cowork-fetch.d.ts +3 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor-pi-args.d.ts +105 -0
- package/dist/types/providers/cursor.d.ts +221 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +25 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +120 -0
- package/dist/types/providers/google-shared.d.ts +203 -0
- package/dist/types/providers/google-types.d.ts +155 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +179 -0
- package/dist/types/providers/ollama.d.ts +8 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +669 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +238 -0
- package/dist/types/providers/openai-completions.d.ts +48 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
- package/dist/types/providers/openai-responses.d.ts +131 -0
- package/dist/types/providers/openai-shared.d.ts +624 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +69 -0
- package/dist/types/providers/register-builtins.d.ts +37 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +32 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aiand.d.ts +7 -0
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
- package/dist/types/registry/alibaba-token-plan.d.ts +18 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/registry/api-key-login.d.ts +42 -0
- package/dist/types/registry/api-key-validation.d.ts +43 -0
- package/dist/types/registry/aws.d.ts +13 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/baseten.d.ts +7 -0
- package/dist/types/registry/bedrock-mantle.d.ts +22 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/coreweave.d.ts +7 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/devin.d.ts +8 -0
- package/dist/types/registry/exa.d.ts +8 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/gmi-cloud.d.ts +7 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/llama-cpp.d.ts +8 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/meta.d.ts +7 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/novita.d.ts +6 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
- package/dist/types/registry/oauth/anthropic.d.ts +24 -0
- package/dist/types/registry/oauth/callback-server.d.ts +74 -0
- package/dist/types/registry/oauth/cursor.d.ts +16 -0
- package/dist/types/registry/oauth/device-code.d.ts +25 -0
- package/dist/types/registry/oauth/devin.d.ts +5 -0
- package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
- package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
- package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/registry/oauth/google-gemini-cli.d.ts +22 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
- package/dist/types/registry/oauth/index.d.ts +45 -0
- package/dist/types/registry/oauth/kimi.d.ts +21 -0
- package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
- package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
- package/dist/types/registry/oauth/opencode.d.ts +18 -0
- package/dist/types/registry/oauth/perplexity.d.ts +9 -0
- package/dist/types/registry/oauth/pkce.d.ts +8 -0
- package/dist/types/registry/oauth/types.d.ts +87 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/oauth/zai.d.ts +25 -0
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +367 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/siliconflow-cn.d.ts +7 -0
- package/dist/types/registry/siliconflow.d.ts +7 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +75 -0
- package/dist/types/registry/umans.d.ts +7 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +7 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +15 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +46 -0
- package/dist/types/types.d.ts +1064 -0
- package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/cursor.d.ts +4 -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 +15 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +3 -0
- package/dist/types/usage/ollama.d.ts +5 -0
- package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
- package/dist/types/usage/openai-codex-reset.d.ts +88 -0
- package/dist/types/usage/openai-codex.d.ts +10 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/synthetic.d.ts +2 -0
- package/dist/types/usage/umans.d.ts +2 -0
- package/dist/types/usage/xai-oauth.d.ts +12 -0
- package/dist/types/usage/zai.d.ts +3 -0
- package/dist/types/usage.d.ts +527 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/aws-profile.d.ts +17 -0
- package/dist/types/utils/block-symbols.d.ts +62 -0
- package/dist/types/utils/deterministic-id.d.ts +16 -0
- package/dist/types/utils/empty-completion-retry.d.ts +21 -0
- package/dist/types/utils/event-stream.d.ts +39 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/google-validation.d.ts +2 -0
- package/dist/types/utils/harmony-leak.d.ts +135 -0
- package/dist/types/utils/http-inspector.d.ts +49 -0
- package/dist/types/utils/idle-iterator.d.ts +149 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
- package/dist/types/utils/openai-http.d.ts +48 -0
- package/dist/types/utils/openrouter-headers.d.ts +1 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/proxy.d.ts +39 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +4 -0
- package/dist/types/utils/retry.d.ts +14 -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 +54 -0
- package/dist/types/utils/schema/index.d.ts +14 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +153 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +17 -0
- package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/typescript.d.ts +24 -0
- package/dist/types/utils/schema/wire.d.ts +52 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +5 -0
- package/dist/types/utils/stream-markup-healing.d.ts +87 -0
- package/dist/types/utils/thinking-loop.d.ts +102 -0
- package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
- package/dist/types/utils/tool-choice.d.ts +52 -0
- package/dist/types/utils/validation.d.ts +28 -0
- package/dist/types/utils.d.ts +57 -0
- package/package.json +138 -0
- package/src/api-registry.ts +109 -0
- package/src/auth/sqlite-credential-store.ts +2066 -0
- package/src/auth-broker/client.ts +471 -0
- package/src/auth-broker/discover.ts +310 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +1332 -0
- package/src/auth-broker/server.ts +898 -0
- package/src/auth-broker/snapshot-cache.ts +200 -0
- package/src/auth-broker/types.ts +193 -0
- package/src/auth-broker/wire-schema-resource.ts +487 -0
- package/src/auth-broker/wire-schemas.ts +43 -0
- package/src/auth-gateway/http.ts +227 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +836 -0
- package/src/auth-gateway/types.ts +153 -0
- package/src/auth-retry.ts +401 -0
- package/src/auth-storage.ts +6540 -0
- package/src/dialect/anthropic.md +31 -0
- package/src/dialect/anthropic.ts +608 -0
- package/src/dialect/catalog.ts +29 -0
- package/src/dialect/coercion.ts +136 -0
- package/src/dialect/deepseek.md +24 -0
- package/src/dialect/deepseek.ts +609 -0
- package/src/dialect/demotion.ts +40 -0
- package/src/dialect/examples.ts +71 -0
- package/src/dialect/factory.ts +34 -0
- package/src/dialect/fenced-thinking.ts +184 -0
- package/src/dialect/gemini.md +44 -0
- package/src/dialect/gemini.ts +583 -0
- package/src/dialect/gemma.md +33 -0
- package/src/dialect/gemma.ts +387 -0
- package/src/dialect/glm.md +32 -0
- package/src/dialect/glm.ts +579 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +345 -0
- package/src/dialect/hermes.md +25 -0
- package/src/dialect/hermes.ts +206 -0
- package/src/dialect/history.ts +81 -0
- package/src/dialect/index.ts +15 -0
- package/src/dialect/inventory.ts +30 -0
- package/src/dialect/kimi.md +24 -0
- package/src/dialect/kimi.ts +340 -0
- package/src/dialect/minimax.md +31 -0
- package/src/dialect/minimax.ts +95 -0
- package/src/dialect/owned-stream.ts +481 -0
- package/src/dialect/prompt-template.md +12 -0
- package/src/dialect/qwen3.md +28 -0
- package/src/dialect/qwen3.ts +240 -0
- package/src/dialect/rendering.ts +304 -0
- package/src/dialect/thinking.ts +292 -0
- package/src/dialect/types.ts +56 -0
- package/src/dialect/xml.md +22 -0
- package/src/dialect/xml.ts +90 -0
- package/src/error/abort.ts +18 -0
- package/src/error/auth-classify.ts +47 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +35 -0
- package/src/error/classes.ts +281 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +602 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +14 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +63 -0
- package/src/error/rate-limit.ts +303 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +51 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/amazon-bedrock.ts +1064 -0
- package/src/providers/anthropic-client.ts +317 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +818 -0
- package/src/providers/anthropic-wire.ts +359 -0
- package/src/providers/anthropic.ts +4539 -0
- package/src/providers/aws-credentials.ts +772 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +438 -0
- package/src/providers/bedrock-mantle.ts +110 -0
- package/src/providers/claude-code-fingerprint.ts +20 -0
- package/src/providers/cowork-fetch.ts +201 -0
- package/src/providers/cursor/exec-modern.ts +496 -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.ts +165 -0
- package/src/providers/cursor.ts +4689 -0
- package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
- package/src/providers/devin/proto/buf.gen.yaml +33 -0
- package/src/providers/devin/proto/buf.yaml +17 -0
- package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
- package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
- package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
- package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
- package/src/providers/devin/proto/cel/expr/value.proto +41 -0
- package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
- package/src/providers/devin/proto/errorspb/errors.proto +56 -0
- package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
- package/src/providers/devin/proto/errorspb/markers.proto +10 -0
- package/src/providers/devin/proto/errorspb/tags.proto +12 -0
- package/src/providers/devin/proto/errorspb/testing.proto +6 -0
- package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
- package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
- package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
- package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
- package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
- package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
- package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
- package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
- package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
- package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
- package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
- package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
- package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
- package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
- package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
- package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
- package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
- package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
- package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
- package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
- package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
- package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
- package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
- package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
- package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
- package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
- package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
- package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
- package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
- package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
- package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
- package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
- package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
- package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
- package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
- package/src/providers/devin.ts +679 -0
- package/src/providers/error-message.ts +23 -0
- package/src/providers/github-copilot-headers.ts +141 -0
- package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
- package/src/providers/gitlab-duo-workflow.ts +3135 -0
- package/src/providers/gitlab-duo.ts +399 -0
- package/src/providers/google-auth.ts +330 -0
- package/src/providers/google-gemini-cli.ts +1370 -0
- package/src/providers/google-shared.ts +1122 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +135 -0
- package/src/providers/google.ts +47 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +51 -0
- package/src/providers/mock.ts +514 -0
- package/src/providers/ollama.ts +776 -0
- package/src/providers/openai-anthropic-shim.ts +166 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +752 -0
- package/src/providers/openai-chat-wire.ts +859 -0
- package/src/providers/openai-codex/request-transformer.ts +491 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +4716 -0
- package/src/providers/openai-completions.ts +2389 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-server-schema.ts +397 -0
- package/src/providers/openai-responses-server.ts +1466 -0
- package/src/providers/openai-responses-wire.ts +6416 -0
- package/src/providers/openai-responses.ts +1393 -0
- package/src/providers/openai-shared.ts +3500 -0
- package/src/providers/pi-native-client.ts +275 -0
- package/src/providers/pi-native-server.ts +245 -0
- package/src/providers/register-builtins.ts +503 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +1083 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aiand.ts +22 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +104 -0
- package/src/registry/alibaba-token-plan.ts +125 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +115 -0
- package/src/registry/api-key-validation.ts +145 -0
- package/src/registry/aws.ts +57 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/baseten.ts +22 -0
- package/src/registry/bedrock-mantle.ts +34 -0
- package/src/registry/cerebras.ts +23 -0
- package/src/registry/cloudflare-ai-gateway.ts +45 -0
- package/src/registry/coreweave.ts +40 -0
- package/src/registry/cursor.ts +20 -0
- package/src/registry/deepseek.ts +46 -0
- package/src/registry/derived.ts +9 -0
- package/src/registry/devin.ts +15 -0
- package/src/registry/exa.ts +19 -0
- package/src/registry/firepass.ts +32 -0
- package/src/registry/fireworks.ts +28 -0
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo-workflow.ts +20 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/gmi-cloud.ts +22 -0
- package/src/registry/google-antigravity.ts +22 -0
- package/src/registry/google-gemini-cli.ts +22 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/registry/huggingface.ts +29 -0
- package/src/registry/index.ts +4 -0
- package/src/registry/kagi.ts +46 -0
- package/src/registry/kilo.ts +114 -0
- package/src/registry/kimi-code.ts +17 -0
- package/src/registry/litellm.ts +45 -0
- package/src/registry/llama-cpp.ts +35 -0
- package/src/registry/lm-studio.ts +31 -0
- package/src/registry/meta.ts +22 -0
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/registry/moonshot.ts +28 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/novita.ts +25 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/anthropic-constants.ts +12 -0
- package/src/registry/oauth/anthropic.ts +346 -0
- package/src/registry/oauth/callback-server.ts +438 -0
- package/src/registry/oauth/cursor.ts +187 -0
- package/src/registry/oauth/device-code.ts +92 -0
- package/src/registry/oauth/devin.ts +124 -0
- package/src/registry/oauth/github-copilot.ts +369 -0
- package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
- package/src/registry/oauth/gitlab-duo.ts +222 -0
- package/src/registry/oauth/google-antigravity.ts +225 -0
- package/src/registry/oauth/google-gemini-cli.ts +297 -0
- package/src/registry/oauth/google-oauth-shared.ts +211 -0
- package/src/registry/oauth/index.ts +187 -0
- package/src/registry/oauth/kimi.ts +297 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +317 -0
- package/src/registry/oauth/openai-codex.ts +384 -0
- package/src/registry/oauth/opencode.ts +50 -0
- package/src/registry/oauth/perplexity.ts +228 -0
- package/src/registry/oauth/pkce.ts +18 -0
- package/src/registry/oauth/types.ts +96 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +559 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/oauth/zai.ts +285 -0
- package/src/registry/ollama-cloud.ts +36 -0
- package/src/registry/ollama.ts +43 -0
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/registry/openrouter.ts +28 -0
- package/src/registry/parallel.ts +45 -0
- package/src/registry/perplexity.ts +13 -0
- package/src/registry/qianfan.ts +27 -0
- package/src/registry/qwen-portal.ts +50 -0
- package/src/registry/registry.ts +182 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/siliconflow-cn.ts +22 -0
- package/src/registry/siliconflow.ts +22 -0
- package/src/registry/synthetic.ts +21 -0
- package/src/registry/tavily.ts +45 -0
- package/src/registry/together.ts +22 -0
- package/src/registry/types.ts +86 -0
- package/src/registry/umans.ts +23 -0
- package/src/registry/venice.ts +33 -0
- package/src/registry/vercel-ai-gateway.ts +38 -0
- package/src/registry/vllm.ts +34 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +22 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/registry/zai.ts +41 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1944 -0
- package/src/types.ts +1243 -0
- package/src/usage/alibaba-token-plan.ts +230 -0
- package/src/usage/claude.ts +830 -0
- package/src/usage/cursor.ts +335 -0
- package/src/usage/gemini.ts +258 -0
- package/src/usage/github-copilot.ts +424 -0
- package/src/usage/google-antigravity.ts +497 -0
- package/src/usage/kimi.ts +277 -0
- package/src/usage/minimax-code.ts +291 -0
- package/src/usage/ollama.ts +41 -0
- package/src/usage/openai-codex-base-url.ts +35 -0
- package/src/usage/openai-codex-reset.ts +205 -0
- package/src/usage/openai-codex.ts +627 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/synthetic.ts +180 -0
- package/src/usage/umans.ts +192 -0
- package/src/usage/xai-oauth.ts +414 -0
- package/src/usage/zai.ts +370 -0
- package/src/usage.ts +411 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/aws-profile.ts +88 -0
- package/src/utils/block-symbols.ts +78 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +161 -0
- package/src/utils/event-stream.ts +202 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +500 -0
- package/src/utils/http-inspector.ts +196 -0
- package/src/utils/idle-iterator.ts +531 -0
- package/src/utils/leaked-thinking-stream.ts +483 -0
- package/src/utils/openai-http.ts +119 -0
- package/src/utils/openrouter-headers.ts +12 -0
- package/src/utils/parse-bind.ts +56 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/proxy.ts +314 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +121 -0
- package/src/utils/retry.ts +77 -0
- package/src/utils/schema/CONSTRAINTS.md +168 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +210 -0
- package/src/utils/schema/index.ts +14 -0
- package/src/utils/schema/json-schema-validator.ts +595 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +2314 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +109 -0
- package/src/utils/schema/strict-tool-validation.ts +117 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/typescript.ts +212 -0
- package/src/utils/schema/wire.ts +662 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +18 -0
- package/src/utils/stream-markup-healing.ts +247 -0
- package/src/utils/thinking-loop.ts +552 -0
- package/src/utils/tool-call-loop-guard.ts +107 -0
- package/src/utils/tool-choice.ts +101 -0
- package/src/utils/validation.ts +1932 -0
- package/src/utils.ts +492 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export type HeadersLike = Headers | Record<string, string | undefined> | undefined | null;
|
|
2
|
+
|
|
3
|
+
const RETRY_AFTER_HINT = "retry-after-ms=";
|
|
4
|
+
|
|
5
|
+
export function formatErrorMessageWithRetryAfter(error: unknown, headers?: HeadersLike): string {
|
|
6
|
+
const message = error instanceof Error ? error.message : JSON.stringify(error);
|
|
7
|
+
if (message.includes(RETRY_AFTER_HINT)) {
|
|
8
|
+
return message;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const retryAfterMs = getRetryAfterMsFromHeaders(headers ?? getHeadersFromError(error));
|
|
12
|
+
if (retryAfterMs === undefined) {
|
|
13
|
+
return message;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return `${message} ${RETRY_AFTER_HINT}${retryAfterMs}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getRetryAfterMsFromHeaders(headers: HeadersLike): number | undefined {
|
|
20
|
+
if (!headers) return undefined;
|
|
21
|
+
|
|
22
|
+
const retryAfterMs = parseRetryAfterMsHeader(getHeaderValue(headers, "retry-after-ms"));
|
|
23
|
+
const retryAfter = parseRetryAfterHeader(getHeaderValue(headers, "retry-after"));
|
|
24
|
+
const resetMs = parseResetHeader(getHeaderValue(headers, "x-ratelimit-reset-ms"), "ms");
|
|
25
|
+
const resetSeconds = parseResetHeader(getHeaderValue(headers, "x-ratelimit-reset"), "s");
|
|
26
|
+
|
|
27
|
+
const candidates = [retryAfterMs, retryAfter, resetMs, resetSeconds].filter(
|
|
28
|
+
(value): value is number => value !== undefined,
|
|
29
|
+
);
|
|
30
|
+
if (candidates.length === 0) return undefined;
|
|
31
|
+
return Math.max(...candidates);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function getHeadersFromError(error: unknown): HeadersLike {
|
|
35
|
+
if (!error || typeof error !== "object") return undefined;
|
|
36
|
+
const record = error as { headers?: unknown; response?: { headers?: unknown }; cause?: unknown };
|
|
37
|
+
const direct = extractHeaders(record.headers) ?? extractHeaders(record.response?.headers);
|
|
38
|
+
if (direct) return direct;
|
|
39
|
+
if (record.cause) return getHeadersFromError(record.cause);
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function extractHeaders(value: unknown): HeadersLike {
|
|
44
|
+
if (!value) return undefined;
|
|
45
|
+
if (value instanceof Headers) return value;
|
|
46
|
+
if (typeof value === "object") return value as Record<string, string | undefined>;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function getHeaderValue(headers: Headers | Record<string, string | undefined>, name: string): string | undefined {
|
|
51
|
+
if (headers instanceof Headers) {
|
|
52
|
+
const value = headers.get(name);
|
|
53
|
+
return value ?? undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const target = name.toLowerCase();
|
|
57
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
58
|
+
if (key.toLowerCase() === target && typeof value === "string") {
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** `retry-after-ms` (Anthropic-style): a plain millisecond delta. */
|
|
66
|
+
function parseRetryAfterMsHeader(value: string | undefined): number | undefined {
|
|
67
|
+
if (!value) return undefined;
|
|
68
|
+
const ms = Number(value.trim());
|
|
69
|
+
if (!Number.isFinite(ms) || ms <= 0) return undefined;
|
|
70
|
+
return Math.ceil(ms);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function parseRetryAfterHeader(value: string | undefined): number | undefined {
|
|
74
|
+
if (!value) return undefined;
|
|
75
|
+
const trimmed = value.trim();
|
|
76
|
+
if (!trimmed) return undefined;
|
|
77
|
+
|
|
78
|
+
const numeric = Number(trimmed);
|
|
79
|
+
if (Number.isFinite(numeric)) {
|
|
80
|
+
if (numeric <= 0) return undefined;
|
|
81
|
+
return Math.ceil(numeric * 1000);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const dateMs = Date.parse(trimmed);
|
|
85
|
+
if (!Number.isNaN(dateMs)) {
|
|
86
|
+
const delay = dateMs - Date.now();
|
|
87
|
+
return delay > 0 ? Math.ceil(delay) : undefined;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function parseResetHeader(value: string | undefined, unit: "ms" | "s"): number | undefined {
|
|
94
|
+
if (!value) return undefined;
|
|
95
|
+
const numeric = Number(value);
|
|
96
|
+
if (!Number.isFinite(numeric) || numeric <= 0) return undefined;
|
|
97
|
+
|
|
98
|
+
const nowMs = Date.now();
|
|
99
|
+
let targetMs: number | undefined;
|
|
100
|
+
|
|
101
|
+
if (unit === "ms") {
|
|
102
|
+
if (numeric > 1e12) {
|
|
103
|
+
targetMs = numeric;
|
|
104
|
+
} else if (numeric > 1e9) {
|
|
105
|
+
targetMs = numeric * 1000;
|
|
106
|
+
} else {
|
|
107
|
+
return Math.ceil(numeric);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
if (numeric > 1e12) {
|
|
111
|
+
targetMs = numeric;
|
|
112
|
+
} else if (numeric > 1e9) {
|
|
113
|
+
targetMs = numeric * 1000;
|
|
114
|
+
} else {
|
|
115
|
+
return Math.ceil(numeric * 1000);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (targetMs <= nowMs) return undefined;
|
|
120
|
+
return Math.ceil(targetMs - nowMs);
|
|
121
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { scheduler } from "node:timers/promises";
|
|
2
|
+
import { isRetryableError } from "@linxiraos/pi-utils";
|
|
3
|
+
import { isCopilotTransientModelError, status } from "../error/flags";
|
|
4
|
+
import { getHeadersFromError, getRetryAfterMsFromHeaders } from "./retry-after";
|
|
5
|
+
|
|
6
|
+
// `isCopilotTransientModelError` now lives in the error module (its classifier
|
|
7
|
+
// home). Re-exported here so existing `../utils/retry` importers keep working.
|
|
8
|
+
export { isCopilotTransientModelError };
|
|
9
|
+
|
|
10
|
+
// Copilot's model-availability flap is a per-request coin flip across fleet
|
|
11
|
+
// replicas, not backpressure. Measured per-attempt rejection rates for models
|
|
12
|
+
// mid-rollout reach ~70% (gpt-5.4, 2026-08-04), and a live 10-turn run needed 6
|
|
13
|
+
// attempts on one turn — so a small budget just pushes the failure up to the
|
|
14
|
+
// agent-level retry, which restarts the whole turn. Eight attempts on a flat
|
|
15
|
+
// delay keep the residual near 5% at p=0.7 and under 1% at p=0.5, bounded at
|
|
16
|
+
// ~2.8s of dead time in the pathological case.
|
|
17
|
+
const COPILOT_MODEL_RETRY_MAX_ATTEMPTS = 8;
|
|
18
|
+
// Transport blips and status-bearing failures keep the pre-flap budget: they are
|
|
19
|
+
// not coin flips, so a longer ramp only delays surfacing a persistent fault.
|
|
20
|
+
const COPILOT_GENERIC_RETRY_MAX_ATTEMPTS = 3;
|
|
21
|
+
const COPILOT_MODEL_RETRY_BASE_DELAY_MS = 400;
|
|
22
|
+
/** Longest server-requested backoff we are willing to sit out before giving up. */
|
|
23
|
+
const COPILOT_RETRY_AFTER_MAX_WAIT_MS = 30_000;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Wrap an initial Copilot request so transient `model_not_supported` 400s are
|
|
27
|
+
* retried a small number of times. No-op for non-Copilot providers.
|
|
28
|
+
*
|
|
29
|
+
* The callback **MUST** create a fresh in-flight request each invocation — a
|
|
30
|
+
* once-consumed AsyncIterable cannot be re-iterated.
|
|
31
|
+
*/
|
|
32
|
+
export async function callWithCopilotModelRetry<T>(
|
|
33
|
+
fn: () => Promise<T>,
|
|
34
|
+
options: { provider: string; signal?: AbortSignal; retryBaseDelayMs?: number },
|
|
35
|
+
): Promise<T> {
|
|
36
|
+
if (options.provider !== "github-copilot") return fn();
|
|
37
|
+
|
|
38
|
+
let lastError: unknown;
|
|
39
|
+
const retryBaseDelayMs = options.retryBaseDelayMs ?? COPILOT_MODEL_RETRY_BASE_DELAY_MS;
|
|
40
|
+
for (let attempt = 0; attempt < COPILOT_MODEL_RETRY_MAX_ATTEMPTS; attempt++) {
|
|
41
|
+
try {
|
|
42
|
+
return await fn();
|
|
43
|
+
} catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
// A latched abort (caller cancel or local watchdog) makes any retry a
|
|
46
|
+
// guaranteed-dead attempt — surface the original error, not the
|
|
47
|
+
// scheduler's AbortError.
|
|
48
|
+
if (options.signal?.aborted) throw error;
|
|
49
|
+
const transientModelError = isCopilotTransientModelError(error);
|
|
50
|
+
if (!transientModelError && !isRetryableError(error)) throw error;
|
|
51
|
+
// Budget is per failure kind, counted over attempts already spent: the
|
|
52
|
+
// eight-attempt allowance only covers the cheap model-availability reroll.
|
|
53
|
+
const maxAttempts = transientModelError
|
|
54
|
+
? COPILOT_MODEL_RETRY_MAX_ATTEMPTS
|
|
55
|
+
: COPILOT_GENERIC_RETRY_MAX_ATTEMPTS;
|
|
56
|
+
if (attempt >= maxAttempts - 1) break;
|
|
57
|
+
// Reroll the model flap on a flat delay: a ramp only adds dead time to a
|
|
58
|
+
// coin flip the next attempt is equally likely to win. Generic retryable
|
|
59
|
+
// failures (429/5xx/transport) keep the linear backoff below.
|
|
60
|
+
let delayMs = transientModelError ? retryBaseDelayMs : retryBaseDelayMs * (attempt + 1);
|
|
61
|
+
if (!transientModelError) {
|
|
62
|
+
const errorStatus = status(error);
|
|
63
|
+
if (errorStatus !== undefined) {
|
|
64
|
+
// Status-bearing retryable errors (429/5xx) are only re-sent when
|
|
65
|
+
// the server told us when to come back — a blind fixed-delay retry
|
|
66
|
+
// of a rate limit just burns the remaining attempts. Status-less
|
|
67
|
+
// transport blips (socket close, h2 reset) keep the linear backoff.
|
|
68
|
+
const retryAfterMs = getRetryAfterMsFromHeaders(getHeadersFromError(error));
|
|
69
|
+
if (retryAfterMs === undefined || retryAfterMs > COPILOT_RETRY_AFTER_MAX_WAIT_MS) throw error;
|
|
70
|
+
delayMs = Math.max(delayMs, retryAfterMs);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
await scheduler.wait(delayMs, { signal: options.signal });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw lastError;
|
|
77
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Schema Constraints
|
|
2
|
+
|
|
3
|
+
This document is the operational contract for schema normalization/strictness in `packages/ai/src/utils/schema`.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
- Applies to provider-facing tool schemas produced by:
|
|
8
|
+
- `normalize.ts` — Google, CCA, MCP, OpenAI Responses, and OpenAI strict-mode (sanitize + enforce) sanitization. All schema walkers live here.
|
|
9
|
+
- `adapt.ts` — thin composer wrapping `tryEnforceStrictSchema` for provider call sites, plus the `PI_NO_STRICT` env flag callers consult to opt out of strict mode.
|
|
10
|
+
- `fields.ts` — keyword classification sets used by the walkers.
|
|
11
|
+
- Covers OpenAI-style strict mode, OpenAI Responses `oneOf` rejection, Google schema constraints, and Cloud Code Assist Claude constraints.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1) OpenAI-style strict mode (`adaptSchemaForStrict` / `tryEnforceStrictSchema`)
|
|
15
|
+
|
|
16
|
+
When strict mode is requested (`strict=true` at call site), the schema MUST satisfy all of the following after adaptation:
|
|
17
|
+
|
|
18
|
+
1. **Non-structural keywords are removed before strict enforcement**
|
|
19
|
+
- Sanitization uses `sanitizeSchemaForStrictMode`.
|
|
20
|
+
- Removed keys include formatting/validation/decorative keywords and unsupported structural extras:
|
|
21
|
+
- `format`, `pattern`, `minLength`, `maxLength`, `minimum`, `maximum`, `exclusiveMinimum`, `exclusiveMaximum`
|
|
22
|
+
- `minItems`, `maxItems`, `uniqueItems`, `multipleOf`
|
|
23
|
+
- `$schema`, `examples`, `default`, `title`, `$comment`
|
|
24
|
+
- `if`, `then`, `else`, `not`
|
|
25
|
+
- `unevaluatedProperties`, `unevaluatedItems`, `patternProperties`
|
|
26
|
+
- `propertyNames`, `contains`, `minContains`, `maxContains`
|
|
27
|
+
- `dependentRequired`, `dependentSchemas`
|
|
28
|
+
- `contentEncoding`, `contentMediaType`, `contentSchema`
|
|
29
|
+
- `deprecated`, `readOnly`, `writeOnly`
|
|
30
|
+
- `minProperties`, `maxProperties`
|
|
31
|
+
- `$dynamicRef`, `$dynamicAnchor`
|
|
32
|
+
- Before stripping `default`, its value is inlined into the sibling `description` as ` (default: X)` so that strict-mode providers retain the default hint in free-form text. Inlining is skipped when `description` already contains `(default:` or when no sibling `description` is present.
|
|
33
|
+
|
|
34
|
+
2. **`const` is normalized to `enum`**
|
|
35
|
+
- If a node contains `const`, strict sanitization converts it to `enum: [const]`.
|
|
36
|
+
|
|
37
|
+
3. **Object and tuple strictness is enforced recursively**
|
|
38
|
+
- Every object node gets `additionalProperties: false`.
|
|
39
|
+
- Every property key is included in `required`.
|
|
40
|
+
- Optional properties are made nullable:
|
|
41
|
+
- Pure union nodes (only `anyOf` plus optional `description`) get a `{ "type": "null" }` branch appended in place — never a nested wrapper.
|
|
42
|
+
- All other nodes are wrapped as `anyOf: [<original schema>, { "type": "null" }]`. Nodes with constraining siblings next to `anyOf` MUST keep the wrapper: sibling keywords are conjunctive with `anyOf`, so appending a null branch would not make the node nullable.
|
|
43
|
+
- Nested pure unions are spliced into the parent `anyOf` (`(A ∨ B) ∨ C` → `A ∨ B ∨ C`); an inner `description` is hoisted to the parent when the parent has none. Strict output MUST NOT contain an `anyOf` branch that is itself a pure union — some upstream validators (OpenRouter DeepSeek) reject branches without `type`.
|
|
44
|
+
- Tuple entries in `prefixItems` are strictified recursively.
|
|
45
|
+
|
|
46
|
+
4. **Schema nodes must be representable in strict mode**
|
|
47
|
+
- Nodes without `type`, combinator, `$ref`, or `not` are invalid in strict enforcement and MUST throw.
|
|
48
|
+
- Example invalid node: `{}` or `{ items: {} }`.
|
|
49
|
+
|
|
50
|
+
5. **Failure mode is fail-open to non-strict**
|
|
51
|
+
- `tryEnforceStrictSchema` MUST return `{ strict: false, schema: original }` when strict enforcement throws.
|
|
52
|
+
- It MUST NOT emit partially-broken strict schema.
|
|
53
|
+
|
|
54
|
+
6. **Provider payload strict flag must match effective strictness**
|
|
55
|
+
- Callers MUST send `strict: true` only if enforcement succeeded (`effectiveStrict === true`).
|
|
56
|
+
- Callers MUST preserve an author's explicit `tool.strict === false` on the wire so that `strict: false` and omitted `strict` remain distinguishable — some OpenAI-compat backends over-fill optional fields when the flag is absent but respect it when set to `false` (#4336). Exceptions: `openai-responses` emits explicit `false` only while its `strictMode` gate and `PI_NO_STRICT` permit sending the strict field; `openai-codex-responses` gates explicit `false` on `!PI_NO_STRICT` so the documented global bypass keeps the `strict` key off the wire for Codex proxies that reject it; `openai-completions` emits explicit `false` only in `toolStrictMode === "mixed"` with `compat.supportsStrictMode !== false`, because the `all_strict → none` collapse and providers that reject the `strict` key rely on uniform absence.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 2) Google Gemini / Vertex / Gemini CLI (`normalizeSchemaForGoogle`)
|
|
61
|
+
|
|
62
|
+
Schemas sent on the Google JSON Schema path MUST follow:
|
|
63
|
+
|
|
64
|
+
1. **Unsupported JSON Schema keywords are stripped (except property names under `properties`)**
|
|
65
|
+
- Unsupported keys (`UNSUPPORTED_SCHEMA_FIELDS`):
|
|
66
|
+
- `$schema`, `$ref`, `$defs`, `$dynamicRef`, `$dynamicAnchor`
|
|
67
|
+
- `examples`, `prefixItems`, `unevaluatedProperties`, `unevaluatedItems`
|
|
68
|
+
- `patternProperties`, `additionalProperties`
|
|
69
|
+
- `minItems`, `maxItems`, `minLength`, `maxLength`
|
|
70
|
+
- `minimum`, `maximum`, `exclusiveMinimum`, `exclusiveMaximum`
|
|
71
|
+
- `pattern`, `format`
|
|
72
|
+
- `dependencies`, `dependentSchemas`, `dependentRequired`
|
|
73
|
+
- Important: keys inside a `properties` object are treated as property names and MUST NOT be stripped by keyword match.
|
|
74
|
+
- Human-meaningful stripped keys (`pattern`, `format`, min/max constraints, `default`, `examples`, etc.) are appended to the sibling `description` as an Anthropic-style spill block: `{pattern: "^foo$", minimum: 0}`. Structural/meta keys such as `$ref`, `$defs`, and `additionalProperties` are not spilled.
|
|
75
|
+
|
|
76
|
+
2. **`type` arrays are normalized to scalar type + nullable marker**
|
|
77
|
+
- `type: ["T", "null"]` becomes `type: "T"` and `nullable: true`.
|
|
78
|
+
- Google expects scalar type, not `type[]`.
|
|
79
|
+
|
|
80
|
+
3. **`const` is converted to `enum`**
|
|
81
|
+
- If `const` exists, schema uses/merges `enum` with the const value.
|
|
82
|
+
|
|
83
|
+
4. **Object schemas get an explicit properties map**
|
|
84
|
+
- `{ "type": "object" }` becomes `{ "type": "object", "properties": {} }`.
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 3) Claude via Cloud Code Assist (`normalizeSchemaForCCA`)
|
|
88
|
+
|
|
89
|
+
For Cloud Code Assist Claude tool declarations, schema MUST satisfy stricter constraints than generic Google path.
|
|
90
|
+
|
|
91
|
+
### 3.1 Transport contract
|
|
92
|
+
|
|
93
|
+
1. **Use legacy `parameters` field** (not `parametersJsonSchema`) for CCA Claude.
|
|
94
|
+
2. CCA path uses the full `normalizeSchemaForCCA` pipeline.
|
|
95
|
+
|
|
96
|
+
### 3.2 Sanitization contract
|
|
97
|
+
|
|
98
|
+
1. Start with Google unsupported-key stripping behavior.
|
|
99
|
+
2. **`nullable` keyword MUST be stripped** in CCA Claude path.
|
|
100
|
+
3. `type: ["T", "null"]` becomes `type: "T"` with no `nullable` marker.
|
|
101
|
+
4. Human-meaningful stripped keys are appended to `description` with the same spill format used by the Google dispatcher.
|
|
102
|
+
|
|
103
|
+
### 3.3 Combiner/union normalization contract
|
|
104
|
+
|
|
105
|
+
1. Object-only `anyOf`/`oneOf` variants SHOULD be merged into a single object shape where safe.
|
|
106
|
+
2. Same-type combiner variants SHOULD be collapsed to one schema.
|
|
107
|
+
3. Mixed-type combiner variants MAY be lossy-collapsed to first non-null scalar type when required for CCA acceptance.
|
|
108
|
+
4. Residual combiners are recursively stripped where collapsible (`stripResidualCombiners`).
|
|
109
|
+
|
|
110
|
+
### 3.4 Nullable property normalization contract
|
|
111
|
+
|
|
112
|
+
1. Property-local nullability expressed as:
|
|
113
|
+
- `nullable: true`, or
|
|
114
|
+
- `type` union including `null`, or
|
|
115
|
+
- `anyOf`/`oneOf` with one `{ "type": "null" }` branch
|
|
116
|
+
MUST be converted to non-required property semantics where possible.
|
|
117
|
+
2. If a property is detected nullable after normalization, it MUST be removed from `required`.
|
|
118
|
+
|
|
119
|
+
### 3.5 Residual incompatibility gate (hard stop)
|
|
120
|
+
|
|
121
|
+
After normalization, schema MUST NOT contain any of:
|
|
122
|
+
|
|
123
|
+
- `type` as array
|
|
124
|
+
- `type: "null"`
|
|
125
|
+
- `nullable` key
|
|
126
|
+
- `anyOf`, `oneOf`, `allOf` arrays
|
|
127
|
+
|
|
128
|
+
If any remain, schema is incompatible.
|
|
129
|
+
|
|
130
|
+
### 3.6 Validation + fallback contract
|
|
131
|
+
|
|
132
|
+
1. Normalized schema is validated with AJV 2020 schema validation.
|
|
133
|
+
2. If invalid OR residual incompatibilities exist, output MUST fallback to:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{ "type": "object", "properties": {} }
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
3. Fallback is per-tool and fail-open; one bad tool schema MUST NOT fail the whole request.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 4) Practical provider mapping
|
|
144
|
+
|
|
145
|
+
- **OpenAI-compatible strict paths** (`openai-completions`, `openai-responses`, `openai-codex-responses`):
|
|
146
|
+
- Use `adaptSchemaForStrict`.
|
|
147
|
+
- Emit `strict: true` only when effective strict enforcement succeeded.
|
|
148
|
+
|
|
149
|
+
- **Google Gemini/Vertex/Gemini CLI (non-CCA Claude)**:
|
|
150
|
+
- Use `normalizeSchemaForGoogle` and send schema on `parametersJsonSchema` path.
|
|
151
|
+
|
|
152
|
+
- **Cloud Code Assist Claude models (`model.id` starts with `claude-`)**:
|
|
153
|
+
- Use `normalizeSchemaForCCA` and send sanitized normalized schema in `parameters`.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 5) Maintenance rules
|
|
158
|
+
|
|
159
|
+
When adding/changing provider adapters:
|
|
160
|
+
|
|
161
|
+
1. Any new unsupported keyword MUST be added to the appropriate set in `fields.ts`.
|
|
162
|
+
2. Any new normalization rule MUST include regression tests under `packages/ai/test`.
|
|
163
|
+
3. Never bypass adapter helpers (`adaptSchemaForStrict`, `normalizeSchemaForGoogle`, `normalizeSchemaForCCA`, `normalizeSchemaForMCP`) in provider code.
|
|
164
|
+
4. If a provider rejects schema with partial support, prefer deterministic per-tool fallback over request-wide failure.
|
|
165
|
+
|
|
166
|
+
## 6) Gemini CLI / Antigravity CCA parity
|
|
167
|
+
|
|
168
|
+
The Gemini CLI / Antigravity Claude path MUST run the same full `normalizeSchemaForCCA` pipeline as the shared Google Claude path. It MUST NOT call only the first keyword-stripping pass, because that leaves object combiners, nullable unions, residual combiners, and fallback gating inconsistent between transports.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { $flag } from "@linxiraos/pi-utils";
|
|
2
|
+
import { upgradeJsonSchemaTo202012 } from "./draft";
|
|
3
|
+
import { tryEnforceStrictSchema } from "./normalize";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Set when callers want to globally bypass OpenAI strict-mode enforcement
|
|
7
|
+
* (e.g. for debugging a provider that misreports strict support, or when
|
|
8
|
+
* comparing strict vs non-strict outputs).
|
|
9
|
+
*
|
|
10
|
+
* Honored by every provider that emits `strict: true` on its function tools —
|
|
11
|
+
* see `openai-completions`, `openai-responses`, `openai-codex-responses`, and
|
|
12
|
+
* the strict candidate selection in `anthropic`.
|
|
13
|
+
*/
|
|
14
|
+
export const NO_STRICT = $flag("PI_NO_STRICT");
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Consolidated helper for OpenAI-style strict schema enforcement.
|
|
18
|
+
*
|
|
19
|
+
* Each provider computes its own `strict` boolean (logic differs), then calls
|
|
20
|
+
* this to handle the tryEnforceStrictSchema dance uniformly:
|
|
21
|
+
* - Draft-07-shaped inputs are upgraded to draft 2020-12 first.
|
|
22
|
+
* - If `strict` is false, passes the upgraded schema through unchanged.
|
|
23
|
+
* - If `strict` is true, attempts to enforce strict mode; falls back to
|
|
24
|
+
* non-strict if the schema isn't representable.
|
|
25
|
+
*/
|
|
26
|
+
export function adaptSchemaForStrict(
|
|
27
|
+
schema: Record<string, unknown>,
|
|
28
|
+
strict: boolean,
|
|
29
|
+
): { schema: Record<string, unknown>; strict: boolean } {
|
|
30
|
+
const upgraded = upgradeJsonSchemaTo202012(schema) as Record<string, unknown>;
|
|
31
|
+
if (!strict) {
|
|
32
|
+
return { schema: upgraded, strict: false };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return tryEnforceStrictSchema(upgraded);
|
|
36
|
+
}
|