@aryee337/aery-ai 0.2.27 → 0.2.29
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 +2914 -0
- package/README.md +614 -813
- package/package.json +140 -105
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +358 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +623 -0
- package/src/auth-broker/server.ts +644 -0
- package/src/auth-broker/types.ts +127 -0
- package/src/auth-broker/wire-schemas.ts +200 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +818 -0
- package/src/auth-gateway/types.ts +143 -0
- package/src/auth-storage.ts +4422 -0
- package/src/index.ts +54 -0
- package/src/model-cache.ts +129 -0
- package/src/model-manager.ts +469 -0
- package/src/model-thinking.ts +782 -0
- package/src/models.json +83530 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +56 -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 +355 -0
- package/src/provider-models/google.ts +88 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +153 -0
- package/src/provider-models/openai-compat.ts +2817 -0
- package/src/provider-models/special.ts +67 -0
- package/src/providers/aery-native-client.ts +228 -0
- package/src/providers/aery-native-server.ts +212 -0
- package/src/providers/amazon-bedrock.ts +873 -0
- package/src/providers/anthropic-client.ts +318 -0
- package/src/providers/anthropic-messages-server-schema.ts +243 -0
- package/src/providers/anthropic-messages-server.ts +683 -0
- package/src/providers/anthropic-wire.ts +268 -0
- package/src/providers/anthropic.ts +3094 -0
- package/src/providers/aws-credentials.ts +501 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +361 -0
- package/src/providers/cursor/gen/agent_pb.ts +15274 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2621 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.ts +372 -0
- package/src/providers/google-auth.ts +252 -0
- package/src/providers/google-gemini-cli.ts +809 -0
- package/src/providers/google-gemini-headers.ts +41 -0
- package/src/providers/google-shared.ts +917 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.ts +91 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +496 -0
- package/src/providers/ollama.ts +644 -0
- package/src/providers/openai-anthropic-shim.ts +138 -0
- package/src/providers/openai-chat-server-schema.ts +252 -0
- package/src/providers/openai-chat-server.ts +647 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.ts +161 -0
- package/src/providers/openai-codex/response-handler.ts +81 -0
- package/src/providers/openai-codex-responses.ts +3018 -0
- package/src/providers/openai-completions-compat.ts +300 -0
- package/src/providers/openai-completions.ts +1979 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1183 -0
- package/src/providers/openai-responses-shared.ts +873 -0
- package/src/providers/openai-responses.ts +679 -0
- package/src/providers/register-builtins.ts +436 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +382 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/providers/xai-responses.ts +82 -0
- package/src/rate-limit-utils.ts +84 -0
- package/src/stream.ts +1065 -0
- package/src/types.ts +944 -0
- package/src/usage/claude.ts +482 -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/kimi.ts +271 -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 +185 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/abortable-iterator.ts +69 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/discovery/antigravity.ts +261 -0
- package/src/utils/discovery/codex.ts +371 -0
- package/src/utils/discovery/cursor.ts +306 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +224 -0
- package/src/utils/event-stream.ts +142 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/http-inspector.ts +176 -0
- package/src/utils/idle-iterator.ts +267 -0
- package/src/utils/json-parse.ts +182 -0
- package/src/utils/oauth/__tests__/xai-oauth.test.ts +107 -0
- package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
- package/src/utils/oauth/anthropic.ts +273 -0
- package/src/utils/oauth/api-key-login.ts +87 -0
- package/src/utils/oauth/api-key-validation.ts +92 -0
- package/src/utils/oauth/callback-server.ts +276 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/cursor.ts +157 -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/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -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 +484 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.ts +254 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/minimax-code.ts +78 -0
- package/src/utils/oauth/moonshot.ts +23 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +203 -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/openrouter.ts +20 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +206 -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/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.ts +99 -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 +40 -0
- package/src/utils/oauth/wafer.ts +50 -0
- package/src/utils/oauth/xai-oauth.ts +342 -0
- package/src/utils/oauth/xiaomi.ts +139 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/oauth/zhipu.ts +60 -0
- package/src/utils/overflow.ts +137 -0
- package/src/utils/parse-bind.ts +54 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/request-debug.ts +336 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +54 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -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 +191 -0
- package/src/utils/schema/index.ts +13 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/wire.ts +293 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/stream-markup-healing.ts +612 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1024 -0
- package/src/utils.ts +166 -0
- package/dist/api-registry.d.ts +0 -20
- package/dist/api-registry.d.ts.map +0 -1
- package/dist/api-registry.js +0 -44
- package/dist/api-registry.js.map +0 -1
- package/dist/bedrock-provider.d.ts +0 -5
- package/dist/bedrock-provider.d.ts.map +0 -1
- package/dist/bedrock-provider.js +0 -6
- package/dist/bedrock-provider.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -130
- package/dist/cli.js.map +0 -1
- package/dist/env-api-keys.d.ts +0 -18
- package/dist/env-api-keys.d.ts.map +0 -1
- package/dist/env-api-keys.js +0 -178
- package/dist/env-api-keys.js.map +0 -1
- package/dist/image-models.d.ts +0 -10
- package/dist/image-models.d.ts.map +0 -1
- package/dist/image-models.generated.d.ts +0 -440
- package/dist/image-models.generated.d.ts.map +0 -1
- package/dist/image-models.generated.js +0 -442
- package/dist/image-models.generated.js.map +0 -1
- package/dist/image-models.js +0 -23
- package/dist/image-models.js.map +0 -1
- package/dist/images-api-registry.d.ts +0 -14
- package/dist/images-api-registry.d.ts.map +0 -1
- package/dist/images-api-registry.js +0 -22
- package/dist/images-api-registry.js.map +0 -1
- package/dist/images.d.ts +0 -4
- package/dist/images.d.ts.map +0 -1
- package/dist/images.js +0 -14
- package/dist/images.js.map +0 -1
- package/dist/index.d.ts +0 -32
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -20
- package/dist/index.js.map +0 -1
- package/dist/models.d.ts +0 -18
- package/dist/models.d.ts.map +0 -1
- package/dist/models.generated.d.ts +0 -17707
- package/dist/models.generated.d.ts.map +0 -1
- package/dist/models.generated.js +0 -16561
- package/dist/models.generated.js.map +0 -1
- package/dist/models.js +0 -71
- package/dist/models.js.map +0 -1
- package/dist/oauth.d.ts +0 -2
- package/dist/oauth.d.ts.map +0 -1
- package/dist/oauth.js +0 -2
- package/dist/oauth.js.map +0 -1
- package/dist/providers/aery-error-formatting.d.ts +0 -13
- package/dist/providers/aery-error-formatting.d.ts.map +0 -1
- package/dist/providers/aery-error-formatting.js +0 -112
- package/dist/providers/aery-error-formatting.js.map +0 -1
- package/dist/providers/amazon-bedrock.d.ts +0 -38
- package/dist/providers/amazon-bedrock.d.ts.map +0 -1
- package/dist/providers/amazon-bedrock.js +0 -763
- package/dist/providers/amazon-bedrock.js.map +0 -1
- package/dist/providers/anthropic.d.ts +0 -71
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js +0 -949
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/azure-openai-responses.d.ts +0 -15
- package/dist/providers/azure-openai-responses.d.ts.map +0 -1
- package/dist/providers/azure-openai-responses.js +0 -225
- package/dist/providers/azure-openai-responses.js.map +0 -1
- package/dist/providers/cloudflare.d.ts +0 -13
- package/dist/providers/cloudflare.d.ts.map +0 -1
- package/dist/providers/cloudflare.js +0 -26
- package/dist/providers/cloudflare.js.map +0 -1
- package/dist/providers/faux.d.ts +0 -56
- package/dist/providers/faux.d.ts.map +0 -1
- package/dist/providers/faux.js +0 -368
- package/dist/providers/faux.js.map +0 -1
- package/dist/providers/github-copilot-headers.d.ts +0 -8
- package/dist/providers/github-copilot-headers.d.ts.map +0 -1
- package/dist/providers/github-copilot-headers.js +0 -29
- package/dist/providers/github-copilot-headers.js.map +0 -1
- package/dist/providers/google-gemini-cli.d.ts +0 -74
- package/dist/providers/google-gemini-cli.d.ts.map +0 -1
- package/dist/providers/google-gemini-cli.js +0 -779
- package/dist/providers/google-gemini-cli.js.map +0 -1
- package/dist/providers/google-shared.d.ts +0 -70
- package/dist/providers/google-shared.d.ts.map +0 -1
- package/dist/providers/google-shared.js +0 -329
- package/dist/providers/google-shared.js.map +0 -1
- package/dist/providers/google-vertex.d.ts +0 -15
- package/dist/providers/google-vertex.d.ts.map +0 -1
- package/dist/providers/google-vertex.js +0 -442
- package/dist/providers/google-vertex.js.map +0 -1
- package/dist/providers/google.d.ts +0 -13
- package/dist/providers/google.d.ts.map +0 -1
- package/dist/providers/google.js +0 -400
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/images/openrouter.d.ts +0 -3
- package/dist/providers/images/openrouter.d.ts.map +0 -1
- package/dist/providers/images/openrouter.js +0 -129
- package/dist/providers/images/openrouter.js.map +0 -1
- package/dist/providers/images/register-builtins.d.ts +0 -4
- package/dist/providers/images/register-builtins.d.ts.map +0 -1
- package/dist/providers/images/register-builtins.js +0 -34
- package/dist/providers/images/register-builtins.js.map +0 -1
- package/dist/providers/mistral.d.ts +0 -25
- package/dist/providers/mistral.d.ts.map +0 -1
- package/dist/providers/mistral.js +0 -535
- package/dist/providers/mistral.js.map +0 -1
- package/dist/providers/openai-codex-responses.d.ts +0 -30
- package/dist/providers/openai-codex-responses.d.ts.map +0 -1
- package/dist/providers/openai-codex-responses.js +0 -1090
- package/dist/providers/openai-codex-responses.js.map +0 -1
- package/dist/providers/openai-completions.d.ts +0 -19
- package/dist/providers/openai-completions.d.ts.map +0 -1
- package/dist/providers/openai-completions.js +0 -950
- package/dist/providers/openai-completions.js.map +0 -1
- package/dist/providers/openai-prompt-cache.d.ts +0 -3
- package/dist/providers/openai-prompt-cache.d.ts.map +0 -1
- package/dist/providers/openai-prompt-cache.js +0 -10
- package/dist/providers/openai-prompt-cache.js.map +0 -1
- package/dist/providers/openai-responses-shared.d.ts +0 -18
- package/dist/providers/openai-responses-shared.d.ts.map +0 -1
- package/dist/providers/openai-responses-shared.js +0 -492
- package/dist/providers/openai-responses-shared.js.map +0 -1
- package/dist/providers/openai-responses.d.ts +0 -13
- package/dist/providers/openai-responses.d.ts.map +0 -1
- package/dist/providers/openai-responses.js +0 -237
- package/dist/providers/openai-responses.js.map +0 -1
- package/dist/providers/register-builtins.d.ts +0 -38
- package/dist/providers/register-builtins.d.ts.map +0 -1
- package/dist/providers/register-builtins.js +0 -278
- package/dist/providers/register-builtins.js.map +0 -1
- package/dist/providers/simple-options.d.ts +0 -8
- package/dist/providers/simple-options.d.ts.map +0 -1
- package/dist/providers/simple-options.js +0 -41
- package/dist/providers/simple-options.js.map +0 -1
- package/dist/providers/transform-messages.d.ts +0 -8
- package/dist/providers/transform-messages.d.ts.map +0 -1
- package/dist/providers/transform-messages.js +0 -184
- package/dist/providers/transform-messages.js.map +0 -1
- package/dist/session-resources.d.ts +0 -4
- package/dist/session-resources.d.ts.map +0 -1
- package/dist/session-resources.js +0 -22
- package/dist/session-resources.js.map +0 -1
- package/dist/stream.d.ts +0 -8
- package/dist/stream.d.ts.map +0 -1
- package/dist/stream.js +0 -27
- package/dist/stream.js.map +0 -1
- package/dist/types.d.ts +0 -498
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/diagnostics.d.ts +0 -19
- package/dist/utils/diagnostics.d.ts.map +0 -1
- package/dist/utils/diagnostics.js +0 -25
- package/dist/utils/diagnostics.js.map +0 -1
- package/dist/utils/event-stream.d.ts +0 -21
- package/dist/utils/event-stream.d.ts.map +0 -1
- package/dist/utils/event-stream.js +0 -81
- package/dist/utils/event-stream.js.map +0 -1
- package/dist/utils/hash.d.ts +0 -3
- package/dist/utils/hash.d.ts.map +0 -1
- package/dist/utils/hash.js +0 -14
- package/dist/utils/hash.js.map +0 -1
- package/dist/utils/headers.d.ts +0 -2
- package/dist/utils/headers.d.ts.map +0 -1
- package/dist/utils/headers.js +0 -8
- package/dist/utils/headers.js.map +0 -1
- package/dist/utils/json-parse.d.ts +0 -16
- package/dist/utils/json-parse.d.ts.map +0 -1
- package/dist/utils/json-parse.js +0 -113
- package/dist/utils/json-parse.js.map +0 -1
- package/dist/utils/node-http-proxy.d.ts +0 -10
- package/dist/utils/node-http-proxy.d.ts.map +0 -1
- package/dist/utils/node-http-proxy.js +0 -97
- package/dist/utils/node-http-proxy.js.map +0 -1
- package/dist/utils/oauth/anthropic.d.ts +0 -25
- package/dist/utils/oauth/anthropic.d.ts.map +0 -1
- package/dist/utils/oauth/anthropic.js +0 -335
- package/dist/utils/oauth/anthropic.js.map +0 -1
- package/dist/utils/oauth/device-code.d.ts +0 -19
- package/dist/utils/oauth/device-code.d.ts.map +0 -1
- package/dist/utils/oauth/device-code.js +0 -55
- package/dist/utils/oauth/device-code.js.map +0 -1
- package/dist/utils/oauth/github-copilot.d.ts +0 -30
- package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
- package/dist/utils/oauth/github-copilot.js +0 -268
- package/dist/utils/oauth/github-copilot.js.map +0 -1
- package/dist/utils/oauth/google-antigravity.d.ts +0 -26
- package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
- package/dist/utils/oauth/google-antigravity.js +0 -377
- package/dist/utils/oauth/google-antigravity.js.map +0 -1
- package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
- package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
- package/dist/utils/oauth/google-gemini-cli.js +0 -482
- package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
- package/dist/utils/oauth/index.d.ts +0 -63
- package/dist/utils/oauth/index.d.ts.map +0 -1
- package/dist/utils/oauth/index.js +0 -131
- package/dist/utils/oauth/index.js.map +0 -1
- package/dist/utils/oauth/oauth-page.d.ts +0 -3
- package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
- package/dist/utils/oauth/oauth-page.js +0 -105
- package/dist/utils/oauth/oauth-page.js.map +0 -1
- package/dist/utils/oauth/openai-codex.d.ts +0 -34
- package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
- package/dist/utils/oauth/openai-codex.js +0 -385
- package/dist/utils/oauth/openai-codex.js.map +0 -1
- package/dist/utils/oauth/pkce.d.ts +0 -13
- package/dist/utils/oauth/pkce.d.ts.map +0 -1
- package/dist/utils/oauth/pkce.js +0 -31
- package/dist/utils/oauth/pkce.js.map +0 -1
- package/dist/utils/oauth/types.d.ts +0 -64
- package/dist/utils/oauth/types.d.ts.map +0 -1
- package/dist/utils/oauth/types.js +0 -2
- package/dist/utils/oauth/types.js.map +0 -1
- package/dist/utils/overflow.d.ts +0 -56
- package/dist/utils/overflow.d.ts.map +0 -1
- package/dist/utils/overflow.js +0 -151
- package/dist/utils/overflow.js.map +0 -1
- package/dist/utils/sanitize-unicode.d.ts +0 -22
- package/dist/utils/sanitize-unicode.d.ts.map +0 -1
- package/dist/utils/sanitize-unicode.js +0 -26
- package/dist/utils/sanitize-unicode.js.map +0 -1
- package/dist/utils/typebox-helpers.d.ts +0 -17
- package/dist/utils/typebox-helpers.d.ts.map +0 -1
- package/dist/utils/typebox-helpers.js +0 -21
- package/dist/utils/typebox-helpers.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -18
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -281
- package/dist/utils/validation.js.map +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared implementation for providers that expose BOTH an OpenAI-compatible
|
|
3
|
+
* and an Anthropic-compatible API surface against the same model catalog
|
|
4
|
+
* (currently Kimi Code and Synthetic).
|
|
5
|
+
*
|
|
6
|
+
* Each call site supplies the provider-specific bits (base URLs, default
|
|
7
|
+
* format, optional extra headers); the streaming/forwarding plumbing lives
|
|
8
|
+
* here once.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { ANTHROPIC_THINKING } from "../stream";
|
|
12
|
+
import type { Context, Model, SimpleStreamOptions } from "../types";
|
|
13
|
+
import { AssistantMessageEventStream } from "../utils/event-stream";
|
|
14
|
+
import { createProviderErrorMessage } from "./error-message";
|
|
15
|
+
import { streamAnthropic, streamOpenAICompletions } from "./register-builtins";
|
|
16
|
+
|
|
17
|
+
export type OpenAIAnthropicApiFormat = "openai" | "anthropic";
|
|
18
|
+
|
|
19
|
+
export interface OpenAIAnthropicShimOptions extends SimpleStreamOptions {
|
|
20
|
+
/** API format: "openai" or "anthropic". */
|
|
21
|
+
format?: OpenAIAnthropicApiFormat;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface OpenAIAnthropicShimConfig {
|
|
25
|
+
/** Base URL for the Anthropic-compatible endpoint (without trailing /v1/messages). */
|
|
26
|
+
anthropicBaseUrl: string;
|
|
27
|
+
/** Optional override for the OpenAI-compatible base URL. If omitted, `model.baseUrl` is used as-is. */
|
|
28
|
+
openaiBaseUrl?: string;
|
|
29
|
+
/** Default API format when caller does not specify one. */
|
|
30
|
+
defaultFormat: OpenAIAnthropicApiFormat;
|
|
31
|
+
/** Provider-specific headers (e.g. auth/session) merged ahead of user-supplied headers. */
|
|
32
|
+
extraHeaders?: () => Record<string, string>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Stream from an OpenAI-or-Anthropic compatible provider. Returns synchronously;
|
|
37
|
+
* async header fetching and stream piping happen internally.
|
|
38
|
+
*/
|
|
39
|
+
export function streamOpenAIAnthropicShim(
|
|
40
|
+
model: Model<"openai-completions">,
|
|
41
|
+
context: Context,
|
|
42
|
+
options: OpenAIAnthropicShimOptions | undefined,
|
|
43
|
+
config: OpenAIAnthropicShimConfig,
|
|
44
|
+
): AssistantMessageEventStream {
|
|
45
|
+
const stream = new AssistantMessageEventStream();
|
|
46
|
+
const format = options?.format ?? config.defaultFormat;
|
|
47
|
+
|
|
48
|
+
(async () => {
|
|
49
|
+
try {
|
|
50
|
+
const mergedHeaders = {
|
|
51
|
+
...(config.extraHeaders?.() ?? {}),
|
|
52
|
+
...options?.headers,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
if (format === "anthropic") {
|
|
56
|
+
const anthropicModel: Model<"anthropic-messages"> = {
|
|
57
|
+
id: model.id,
|
|
58
|
+
name: model.name,
|
|
59
|
+
api: "anthropic-messages",
|
|
60
|
+
provider: model.provider,
|
|
61
|
+
baseUrl: config.anthropicBaseUrl,
|
|
62
|
+
headers: mergedHeaders,
|
|
63
|
+
contextWindow: model.contextWindow,
|
|
64
|
+
maxTokens: model.maxTokens,
|
|
65
|
+
reasoning: model.reasoning,
|
|
66
|
+
input: model.input,
|
|
67
|
+
cost: model.cost,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const reasoningEffort = options?.reasoning;
|
|
71
|
+
const thinkingEnabled = !!reasoningEffort && model.reasoning;
|
|
72
|
+
const thinkingBudget = reasoningEffort
|
|
73
|
+
? (options?.thinkingBudgets?.[reasoningEffort] ?? ANTHROPIC_THINKING[reasoningEffort])
|
|
74
|
+
: undefined;
|
|
75
|
+
|
|
76
|
+
const innerStream = streamAnthropic(anthropicModel, context, {
|
|
77
|
+
apiKey: options?.apiKey,
|
|
78
|
+
temperature: options?.temperature,
|
|
79
|
+
topP: options?.topP,
|
|
80
|
+
topK: options?.topK,
|
|
81
|
+
minP: options?.minP,
|
|
82
|
+
presencePenalty: options?.presencePenalty,
|
|
83
|
+
repetitionPenalty: options?.repetitionPenalty,
|
|
84
|
+
maxTokens: options?.maxTokens ?? Math.min(model.maxTokens, 32000),
|
|
85
|
+
signal: options?.signal,
|
|
86
|
+
headers: mergedHeaders,
|
|
87
|
+
sessionId: options?.sessionId,
|
|
88
|
+
onPayload: options?.onPayload,
|
|
89
|
+
onResponse: options?.onResponse,
|
|
90
|
+
onSseEvent: options?.onSseEvent,
|
|
91
|
+
fetch: options?.fetch,
|
|
92
|
+
thinkingEnabled,
|
|
93
|
+
thinkingBudgetTokens: thinkingBudget,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
for await (const event of innerStream) {
|
|
97
|
+
stream.push(event);
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
const openaiModel: Model<"openai-completions"> = config.openaiBaseUrl
|
|
101
|
+
? { ...model, baseUrl: config.openaiBaseUrl, headers: mergedHeaders }
|
|
102
|
+
: model;
|
|
103
|
+
|
|
104
|
+
const reasoningEffort = options?.reasoning;
|
|
105
|
+
const innerStream = streamOpenAICompletions(openaiModel, context, {
|
|
106
|
+
apiKey: options?.apiKey,
|
|
107
|
+
temperature: options?.temperature,
|
|
108
|
+
topP: options?.topP,
|
|
109
|
+
topK: options?.topK,
|
|
110
|
+
minP: options?.minP,
|
|
111
|
+
presencePenalty: options?.presencePenalty,
|
|
112
|
+
repetitionPenalty: options?.repetitionPenalty,
|
|
113
|
+
maxTokens: options?.maxTokens ?? model.maxTokens,
|
|
114
|
+
signal: options?.signal,
|
|
115
|
+
headers: mergedHeaders,
|
|
116
|
+
sessionId: options?.sessionId,
|
|
117
|
+
onPayload: options?.onPayload,
|
|
118
|
+
onResponse: options?.onResponse,
|
|
119
|
+
onSseEvent: options?.onSseEvent,
|
|
120
|
+
fetch: options?.fetch,
|
|
121
|
+
reasoning: reasoningEffort,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
for await (const event of innerStream) {
|
|
125
|
+
stream.push(event);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} catch (err) {
|
|
129
|
+
stream.push({
|
|
130
|
+
type: "error",
|
|
131
|
+
reason: "error",
|
|
132
|
+
error: createProviderErrorMessage(model, err),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
})();
|
|
136
|
+
|
|
137
|
+
return stream;
|
|
138
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for the OpenAI chat-completions request shape we accept on the
|
|
3
|
+
* gateway. Mirrors https://platform.openai.com/docs/api-reference/chat — only
|
|
4
|
+
* the shapes the gateway translation layer understands. Unknown fields on
|
|
5
|
+
* permissive objects are accepted-and-stripped (via `z.unknown()` passthroughs
|
|
6
|
+
* or `.loose()`) so the official OpenAI SDK — which sends a growing pile of
|
|
7
|
+
* non-strict defaults (e.g. `stream_options.include_obfuscation`) — does not
|
|
8
|
+
* trip 400s on shapes we simply ignore.
|
|
9
|
+
*/
|
|
10
|
+
import type {
|
|
11
|
+
ChatCompletionContentPart,
|
|
12
|
+
ChatCompletionCreateParams,
|
|
13
|
+
ChatCompletionMessageParam,
|
|
14
|
+
ChatCompletionMessageToolCall,
|
|
15
|
+
ChatCompletionTool,
|
|
16
|
+
ChatCompletionToolChoiceOption,
|
|
17
|
+
} from "openai/resources/chat/completions";
|
|
18
|
+
import * as z from "zod/v4";
|
|
19
|
+
|
|
20
|
+
// ─── User-message content parts ─────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
export const textPartSchema = z.object({
|
|
23
|
+
type: z.literal("text"),
|
|
24
|
+
text: z.string(),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* OpenAI documents `image_url` as either `{ url: string, detail?: ... }` or —
|
|
29
|
+
* older clients — a bare string. Accept both shapes; downstream we extract a
|
|
30
|
+
* URL. `detail` is accepted for forward-compat but currently dropped (aery-ai's
|
|
31
|
+
* `ImageContent` has no detail field — TODO: plumb through if/when added).
|
|
32
|
+
*/
|
|
33
|
+
export const imagePartSchema = z.object({
|
|
34
|
+
type: z.literal("image_url"),
|
|
35
|
+
image_url: z.union([
|
|
36
|
+
z.string(),
|
|
37
|
+
z.object({
|
|
38
|
+
url: z.string(),
|
|
39
|
+
detail: z.enum(["auto", "low", "high"]).optional(),
|
|
40
|
+
}),
|
|
41
|
+
]),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/** OpenAI audio input block (gpt-4o-audio). Accepted; currently dropped downstream. */
|
|
45
|
+
export const inputAudioPartSchema = z.object({
|
|
46
|
+
type: z.literal("input_audio"),
|
|
47
|
+
input_audio: z.object({
|
|
48
|
+
data: z.string(),
|
|
49
|
+
format: z.enum(["wav", "mp3"]),
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/** OpenAI file input block (file_search / vision-document). Accepted; currently dropped downstream. */
|
|
54
|
+
export const filePartSchema = z.object({
|
|
55
|
+
type: z.literal("file"),
|
|
56
|
+
file: z.object({
|
|
57
|
+
file_id: z.string().optional(),
|
|
58
|
+
filename: z.string().optional(),
|
|
59
|
+
file_data: z.string().optional(),
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/** Replayed assistant refusal block. Accepted; currently dropped downstream. */
|
|
64
|
+
export const refusalPartSchema = z.object({
|
|
65
|
+
type: z.literal("refusal"),
|
|
66
|
+
refusal: z.string(),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Forward-compat catch-all for unknown content-part types. Matches every other
|
|
71
|
+
* `{ type: string, ... }` object so a new OpenAI block kind does not 400 the
|
|
72
|
+
* whole request; the walker ignores parts whose `type` it does not know.
|
|
73
|
+
*/
|
|
74
|
+
export const unknownPartSchema = z.object({ type: z.string() }).loose();
|
|
75
|
+
|
|
76
|
+
export const userContentPartSchema = z.union([
|
|
77
|
+
textPartSchema,
|
|
78
|
+
imagePartSchema,
|
|
79
|
+
inputAudioPartSchema,
|
|
80
|
+
filePartSchema,
|
|
81
|
+
refusalPartSchema,
|
|
82
|
+
unknownPartSchema,
|
|
83
|
+
]);
|
|
84
|
+
|
|
85
|
+
// ─── Tool calls / tools ─────────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
export const toolCallSchema = z.object({
|
|
88
|
+
id: z.string(),
|
|
89
|
+
type: z.literal("function").optional(),
|
|
90
|
+
function: z.object({
|
|
91
|
+
name: z.string(),
|
|
92
|
+
arguments: z.string(),
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
export const toolSchema = z.object({
|
|
97
|
+
type: z.literal("function"),
|
|
98
|
+
function: z.object({
|
|
99
|
+
name: z.string().min(1),
|
|
100
|
+
description: z.string().optional(),
|
|
101
|
+
parameters: z.record(z.string(), z.unknown()).optional(),
|
|
102
|
+
/** OpenAI structured-output strict mode. Accepted, not enforced upstream. */
|
|
103
|
+
strict: z.boolean().optional(),
|
|
104
|
+
}),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// ─── Tool choice ────────────────────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
export const toolChoiceSchema = z.union([
|
|
110
|
+
z.literal("auto"),
|
|
111
|
+
z.literal("none"),
|
|
112
|
+
z.literal("required"),
|
|
113
|
+
z.object({
|
|
114
|
+
type: z.literal("function"),
|
|
115
|
+
function: z.object({ name: z.string().min(1) }),
|
|
116
|
+
}),
|
|
117
|
+
// Anthropic-style `{ type: 'tool', name }` — translated to the OpenAI
|
|
118
|
+
// function shape in the walker.
|
|
119
|
+
z.object({
|
|
120
|
+
type: z.literal("tool"),
|
|
121
|
+
name: z.string().min(1),
|
|
122
|
+
}),
|
|
123
|
+
]);
|
|
124
|
+
|
|
125
|
+
// ─── Messages ───────────────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
const baseContent = z.union([z.string(), z.array(userContentPartSchema)]);
|
|
128
|
+
|
|
129
|
+
export const systemMessageSchema = z.object({
|
|
130
|
+
role: z.literal("system"),
|
|
131
|
+
content: baseContent,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
export const developerMessageSchema = z.object({
|
|
135
|
+
role: z.literal("developer"),
|
|
136
|
+
content: baseContent,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
export const userMessageSchema = z.object({
|
|
140
|
+
role: z.literal("user"),
|
|
141
|
+
content: baseContent,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
export const assistantMessageSchema = z.object({
|
|
145
|
+
role: z.literal("assistant"),
|
|
146
|
+
content: baseContent.optional(),
|
|
147
|
+
tool_calls: z.array(toolCallSchema).optional(),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
export const toolMessageSchema = z.object({
|
|
151
|
+
role: z.literal("tool"),
|
|
152
|
+
content: baseContent.optional(),
|
|
153
|
+
tool_call_id: z.string().optional(),
|
|
154
|
+
// OpenAI's wire spec omits `name` on `role:"tool"`, but in practice the
|
|
155
|
+
// official Python SDK and several wrappers do send it. Accept it so we can
|
|
156
|
+
// honour it downstream (Google's `functionResponse.name` is required and
|
|
157
|
+
// non-empty); empty strings are coerced to undefined so the back-resolve
|
|
158
|
+
// path runs.
|
|
159
|
+
name: z
|
|
160
|
+
.string()
|
|
161
|
+
.optional()
|
|
162
|
+
.transform(v => (v && v.length > 0 ? v : undefined)),
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Legacy `function` role (pre-tools API). Translated to a `tool` role
|
|
167
|
+
* canonical message in the walker so downstream providers see one shape.
|
|
168
|
+
*/
|
|
169
|
+
export const functionMessageSchema = z.object({
|
|
170
|
+
role: z.literal("function"),
|
|
171
|
+
name: z.string(),
|
|
172
|
+
content: z.string().nullable(),
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
export const messageSchema = z.discriminatedUnion("role", [
|
|
176
|
+
systemMessageSchema,
|
|
177
|
+
developerMessageSchema,
|
|
178
|
+
userMessageSchema,
|
|
179
|
+
assistantMessageSchema,
|
|
180
|
+
toolMessageSchema,
|
|
181
|
+
functionMessageSchema,
|
|
182
|
+
]);
|
|
183
|
+
|
|
184
|
+
// ─── Stream options ─────────────────────────────────────────────────────────
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Permissive: the official OpenAI SDK sets `include_obfuscation: false` by
|
|
188
|
+
* default. We only consume `include_usage`, so unknown keys are silently
|
|
189
|
+
* stripped rather than 400'd.
|
|
190
|
+
*/
|
|
191
|
+
export const streamOptionsSchema = z.object({
|
|
192
|
+
include_usage: z.boolean().optional(),
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// ─── Stop sequences ─────────────────────────────────────────────────────────
|
|
196
|
+
|
|
197
|
+
// OpenAI rejects > 4 stop strings; mirror that at the gateway.
|
|
198
|
+
export const stopSchema = z.union([z.string(), z.array(z.string()).max(4)]);
|
|
199
|
+
|
|
200
|
+
// ─── Top-level request ──────────────────────────────────────────────────────
|
|
201
|
+
|
|
202
|
+
export const openaiChatRequestSchema = z.object({
|
|
203
|
+
model: z.string().min(1),
|
|
204
|
+
messages: z.array(messageSchema),
|
|
205
|
+
tools: z.array(toolSchema).optional(),
|
|
206
|
+
tool_choice: toolChoiceSchema.optional(),
|
|
207
|
+
max_tokens: z.number().optional(),
|
|
208
|
+
max_completion_tokens: z.number().optional(),
|
|
209
|
+
temperature: z.number().optional(),
|
|
210
|
+
top_p: z.number().optional(),
|
|
211
|
+
stop: stopSchema.optional(),
|
|
212
|
+
stream: z.boolean().optional(),
|
|
213
|
+
stream_options: streamOptionsSchema.optional(),
|
|
214
|
+
|
|
215
|
+
// ── Typed first-class passthroughs (now consumed by the walker) ────────
|
|
216
|
+
response_format: z.unknown().optional(),
|
|
217
|
+
seed: z.number().optional(),
|
|
218
|
+
presence_penalty: z.number().optional(),
|
|
219
|
+
frequency_penalty: z.number().optional(),
|
|
220
|
+
logit_bias: z.record(z.string(), z.number()).optional(),
|
|
221
|
+
user: z.string().optional(),
|
|
222
|
+
reasoning_effort: z.enum(["minimal", "low", "medium", "high", "xhigh"]).optional(),
|
|
223
|
+
parallel_tool_calls: z.boolean().optional(),
|
|
224
|
+
service_tier: z.enum(["auto", "default", "flex", "scale", "priority"]).optional(),
|
|
225
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
226
|
+
|
|
227
|
+
// ── Accept-and-ignore passthroughs ─────────────────────────────────────
|
|
228
|
+
// Forward acceptance only: validating these would 400 on shapes the
|
|
229
|
+
// gateway has no opinion on. The downstream provider does the real check.
|
|
230
|
+
logprobs: z.unknown().optional(),
|
|
231
|
+
top_logprobs: z.unknown().optional(),
|
|
232
|
+
prediction: z.unknown().optional(),
|
|
233
|
+
modalities: z.unknown().optional(),
|
|
234
|
+
audio: z.unknown().optional(),
|
|
235
|
+
store: z.unknown().optional(),
|
|
236
|
+
prompt_cache_key: z.unknown().optional(),
|
|
237
|
+
safety_identifier: z.unknown().optional(),
|
|
238
|
+
n: z.unknown().optional(),
|
|
239
|
+
web_search_options: z.unknown().optional(),
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Public types are sourced from the OpenAI SDK so the gateway stays in
|
|
244
|
+
* lock-step with the canonical API surface; the schemas above are runtime
|
|
245
|
+
* validators for the subset we actually accept.
|
|
246
|
+
*/
|
|
247
|
+
export type OpenAIChatRequest = ChatCompletionCreateParams;
|
|
248
|
+
export type OpenAIChatMessage = ChatCompletionMessageParam;
|
|
249
|
+
export type OpenAIChatToolCall = ChatCompletionMessageToolCall;
|
|
250
|
+
export type OpenAIChatTool = ChatCompletionTool;
|
|
251
|
+
export type OpenAIChatToolChoice = ChatCompletionToolChoiceOption;
|
|
252
|
+
export type OpenAIChatContentPart = ChatCompletionContentPart;
|