jeopi-ai 16.2.13
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 +4347 -0
- package/README.md +1193 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +73 -0
- package/dist/types/auth-broker/discover.d.ts +35 -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 +102 -0
- package/dist/types/auth-broker/server.d.ts +43 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +107 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +411 -0
- package/dist/types/auth-gateway/http.d.ts +39 -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 +123 -0
- package/dist/types/auth-retry.d.ts +124 -0
- package/dist/types/auth-storage.d.ts +1026 -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 +23 -0
- package/dist/types/dialect/examples.d.ts +2 -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 +12 -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 +45 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +69 -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 +16 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +23 -0
- package/dist/types/error/classes.d.ts +102 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +79 -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 +13 -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 +59 -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 +49 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/__tests__/google-auth.test.d.ts +1 -0
- package/dist/types/providers/__tests__/kimi-code-thinking.test.d.ts +1 -0
- package/dist/types/providers/__tests__/openai-codex-error.test.d.ts +1 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +94 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +497 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +318 -0
- package/dist/types/providers/anthropic.d.ts +248 -0
- package/dist/types/providers/aws-credentials.d.ts +53 -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/cursor.d.ts +91 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +32 -0
- package/dist/types/providers/google-gemini-cli.d.ts +118 -0
- package/dist/types/providers/google-interactions.d.ts +65 -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 +178 -0
- package/dist/types/providers/ollama.d.ts +7 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +695 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +644 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +54 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +108 -0
- package/dist/types/providers/openai-completions.d.ts +45 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +349 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
- package/dist/types/providers/openai-responses.d.ts +126 -0
- package/dist/types/providers/openai-shared.d.ts +506 -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 +32 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +11 -0
- package/dist/types/providers/vision-guard.d.ts +20 -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/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/azure.d.ts +4 -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/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/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/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/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
- package/dist/types/registry/oauth/anthropic.d.ts +23 -0
- package/dist/types/registry/oauth/callback-server.d.ts +72 -0
- package/dist/types/registry/oauth/cursor.d.ts +15 -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 +10 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +22 -0
- package/dist/types/registry/oauth/index.d.ts +64 -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 +56 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +52 -0
- package/dist/types/registry/oauth/xiaomi.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 +303 -0
- package/dist/types/registry/sakana.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 +51 -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 +4 -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 +7 -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 +44 -0
- package/dist/types/types.d.ts +715 -0
- package/dist/types/usage/claude.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 +2 -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 +79 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +346 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/block-symbols.d.ts +20 -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 +30 -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 +118 -0
- package/dist/types/utils/http-inspector.d.ts +30 -0
- package/dist/types/utils/idle-iterator.d.ts +137 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +29 -0
- package/dist/types/utils/openai-http.d.ts +54 -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 +29 -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 +15 -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 +124 -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 +18 -0
- package/dist/types/utils/schema/wire.d.ts +92 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -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 +50 -0
- package/dist/types/utils/validation.d.ts +42 -0
- package/dist/types/utils.d.ts +24 -0
- package/package.json +139 -0
- package/src/api-registry.ts +109 -0
- package/src/auth-broker/client.ts +359 -0
- package/src/auth-broker/discover.ts +222 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +657 -0
- package/src/auth-broker/server.ts +646 -0
- package/src/auth-broker/snapshot-cache.ts +191 -0
- package/src/auth-broker/types.ts +130 -0
- package/src/auth-broker/wire-schemas.ts +249 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +802 -0
- package/src/auth-gateway/types.ts +151 -0
- package/src/auth-retry.ts +250 -0
- package/src/auth-storage.ts +5576 -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 +36 -0
- package/src/dialect/examples.ts +33 -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 +597 -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 +456 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +346 -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 +73 -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 +470 -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 +249 -0
- package/src/dialect/thinking.ts +122 -0
- package/src/dialect/types.ts +57 -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 +30 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +31 -0
- package/src/error/classes.ts +186 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +506 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +13 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +62 -0
- package/src/error/rate-limit.ts +161 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +49 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/__tests__/google-auth.test.ts +144 -0
- package/src/providers/__tests__/kimi-code-thinking.test.ts +112 -0
- package/src/providers/__tests__/openai-codex-error.test.ts +84 -0
- package/src/providers/amazon-bedrock.ts +1042 -0
- package/src/providers/anthropic-client.ts +295 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +756 -0
- package/src/providers/anthropic-wire.ts +318 -0
- package/src/providers/anthropic.ts +4078 -0
- package/src/providers/aws-credentials.ts +586 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +382 -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 +2695 -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 +577 -0
- package/src/providers/error-message.ts +21 -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 +3058 -0
- package/src/providers/gitlab-duo.ts +395 -0
- package/src/providers/google-auth.ts +350 -0
- package/src/providers/google-gemini-cli.ts +1362 -0
- package/src/providers/google-interactions.ts +753 -0
- package/src/providers/google-shared.ts +1103 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +183 -0
- package/src/providers/google.ts +87 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +507 -0
- package/src/providers/ollama.ts +773 -0
- package/src/providers/openai-anthropic-shim.ts +152 -0
- package/src/providers/openai-chat-server-schema.ts +242 -0
- package/src/providers/openai-chat-server.ts +715 -0
- package/src/providers/openai-chat-wire.ts +847 -0
- package/src/providers/openai-codex/request-transformer.ts +295 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +3468 -0
- package/src/providers/openai-completions.ts +2173 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-reasoning-suppression.md +1 -0
- package/src/providers/openai-responses-server-schema.ts +282 -0
- package/src/providers/openai-responses-server.ts +1280 -0
- package/src/providers/openai-responses-wire.ts +6391 -0
- package/src/providers/openai-responses.ts +1022 -0
- package/src/providers/openai-shared.ts +2648 -0
- package/src/providers/pi-native-client.ts +266 -0
- package/src/providers/pi-native-server.ts +242 -0
- package/src/providers/register-builtins.ts +475 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +787 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +95 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +112 -0
- package/src/registry/api-key-validation.ts +161 -0
- package/src/registry/azure.ts +6 -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/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/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/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 +22 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/__tests__/xai-oauth.test.ts +104 -0
- package/src/registry/oauth/anthropic.ts +311 -0
- package/src/registry/oauth/callback-server.ts +315 -0
- package/src/registry/oauth/cursor.ts +171 -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 +209 -0
- package/src/registry/oauth/google-gemini-cli.ts +273 -0
- package/src/registry/oauth/google-oauth-shared.ts +125 -0
- package/src/registry/oauth/index.ts +269 -0
- package/src/registry/oauth/kimi.ts +289 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +311 -0
- package/src/registry/oauth/openai-codex.ts +364 -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 +65 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +394 -0
- package/src/registry/oauth/xiaomi.ts +211 -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 +161 -0
- package/src/registry/sakana.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 +56 -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 +6 -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 +27 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1778 -0
- package/src/types.ts +856 -0
- package/src/usage/claude.ts +485 -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 +271 -0
- package/src/usage/minimax-code.ts +30 -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 +174 -0
- package/src/usage/openai-codex.ts +535 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +321 -0
- package/src/usage.ts +333 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/block-symbols.ts +32 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +159 -0
- package/src/utils/event-stream.ts +171 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +456 -0
- package/src/utils/http-inspector.ts +168 -0
- package/src/utils/idle-iterator.ts +473 -0
- package/src/utils/leaked-thinking-stream.ts +294 -0
- package/src/utils/openai-http.ts +122 -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 +240 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +59 -0
- package/src/utils/schema/CONSTRAINTS.md +166 -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 +207 -0
- package/src/utils/schema/index.ts +15 -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 +1901 -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 +198 -0
- package/src/utils/schema/wire.ts +789 -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 +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 +99 -0
- package/src/utils/validation.ts +1507 -0
- package/src/utils.ts +171 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { parseJsonWithRepair } from "jeopi-utils";
|
|
2
|
+
import type { Message, ToolCall } from "../types";
|
|
3
|
+
import { asRecord, mintToolCallId, partialSuffixOverlapAny } from "./coercion";
|
|
4
|
+
import dialectPrompt from "./qwen3.md" with { type: "text" };
|
|
5
|
+
import { renderChatMlTranscript, renderToolResponseResults, stringifyJson } from "./rendering";
|
|
6
|
+
import type {
|
|
7
|
+
DialectDefinition,
|
|
8
|
+
DialectRenderOptions,
|
|
9
|
+
DialectToolResult,
|
|
10
|
+
InbandScanEvent,
|
|
11
|
+
InbandScanner,
|
|
12
|
+
InbandScannerOptions,
|
|
13
|
+
} from "./types";
|
|
14
|
+
|
|
15
|
+
const TOOL_OPEN = "<tool_call>";
|
|
16
|
+
const TOOL_CLOSE = "</tool_call>";
|
|
17
|
+
const THINK_OPEN = "<think>";
|
|
18
|
+
const THINK_CLOSE = "</think>";
|
|
19
|
+
|
|
20
|
+
const TOOL_START_TAGS = [TOOL_OPEN] as const;
|
|
21
|
+
const START_TAGS = [TOOL_OPEN, THINK_OPEN] as const;
|
|
22
|
+
const THINK_CLOSE_TAGS = [THINK_CLOSE] as const;
|
|
23
|
+
const COMPLETE_NAME = /^\s*\{\s*"name"\s*:\s*("(?:\\.|[^"\\])*")/;
|
|
24
|
+
|
|
25
|
+
type State = "outside" | "thinking" | "tool";
|
|
26
|
+
|
|
27
|
+
export class Qwen3InbandScanner implements InbandScanner {
|
|
28
|
+
#buffer = "";
|
|
29
|
+
#state: State = "outside";
|
|
30
|
+
#id = "";
|
|
31
|
+
#name = "";
|
|
32
|
+
#started = false;
|
|
33
|
+
#thinking = "";
|
|
34
|
+
readonly #parseThinking: boolean;
|
|
35
|
+
|
|
36
|
+
constructor(options: InbandScannerOptions = {}) {
|
|
37
|
+
this.#parseThinking = options.parseThinking !== false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
feed(text: string): InbandScanEvent[] {
|
|
41
|
+
if (text.length === 0) return [];
|
|
42
|
+
this.#buffer += text;
|
|
43
|
+
return this.#consume(false);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
flush(): InbandScanEvent[] {
|
|
47
|
+
return this.#consume(true);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#consume(final: boolean): InbandScanEvent[] {
|
|
51
|
+
const events: InbandScanEvent[] = [];
|
|
52
|
+
while (this.#buffer.length > 0) {
|
|
53
|
+
if (this.#state === "outside") {
|
|
54
|
+
this.#consumeOutside(final, events);
|
|
55
|
+
if (this.#state === "outside") break;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (this.#state === "thinking") {
|
|
60
|
+
this.#consumeThinking(final, events);
|
|
61
|
+
if (this.#state === "thinking") break;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
this.#consumeTool(final, events);
|
|
66
|
+
if (this.#state === "tool") break;
|
|
67
|
+
}
|
|
68
|
+
if (final && this.#state === "thinking") this.#endThinking(events);
|
|
69
|
+
return events;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
#consumeOutside(final: boolean, events: InbandScanEvent[]): void {
|
|
73
|
+
const tool = this.#buffer.indexOf(TOOL_OPEN);
|
|
74
|
+
const think = this.#parseThinking ? this.#buffer.indexOf(THINK_OPEN) : -1;
|
|
75
|
+
let start = tool;
|
|
76
|
+
let isThink = false;
|
|
77
|
+
if (think !== -1 && (start === -1 || think < start)) {
|
|
78
|
+
start = think;
|
|
79
|
+
isThink = true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (start === -1) {
|
|
83
|
+
const tags = this.#parseThinking ? START_TAGS : TOOL_START_TAGS;
|
|
84
|
+
const hold = final ? 0 : partialSuffixOverlapAny(this.#buffer, tags);
|
|
85
|
+
const emit = this.#buffer.slice(0, this.#buffer.length - hold);
|
|
86
|
+
if (emit.length > 0) events.push({ type: "text", text: emit });
|
|
87
|
+
this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (start > 0) events.push({ type: "text", text: this.#buffer.slice(0, start) });
|
|
92
|
+
if (isThink) {
|
|
93
|
+
this.#buffer = this.#buffer.slice(start + THINK_OPEN.length);
|
|
94
|
+
this.#state = "thinking";
|
|
95
|
+
this.#thinking = "";
|
|
96
|
+
events.push({ type: "thinkingStart" });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
this.#buffer = this.#buffer.slice(start + TOOL_OPEN.length);
|
|
101
|
+
this.#state = "tool";
|
|
102
|
+
this.#id = mintToolCallId();
|
|
103
|
+
this.#name = "";
|
|
104
|
+
this.#started = false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#consumeThinking(final: boolean, events: InbandScanEvent[]): void {
|
|
108
|
+
const close = this.#buffer.indexOf(THINK_CLOSE);
|
|
109
|
+
if (close === -1) {
|
|
110
|
+
const hold = final ? 0 : partialSuffixOverlapAny(this.#buffer, THINK_CLOSE_TAGS);
|
|
111
|
+
const delta = this.#buffer.slice(0, this.#buffer.length - hold);
|
|
112
|
+
this.#emitThinkingDelta(delta, events);
|
|
113
|
+
this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
|
|
114
|
+
if (final) this.#endThinking(events);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
this.#emitThinkingDelta(this.#buffer.slice(0, close), events);
|
|
119
|
+
this.#buffer = this.#buffer.slice(close + THINK_CLOSE.length);
|
|
120
|
+
this.#endThinking(events);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
#consumeTool(final: boolean, events: InbandScanEvent[]): void {
|
|
124
|
+
const close = this.#buffer.indexOf(TOOL_CLOSE);
|
|
125
|
+
const body = close === -1 ? this.#buffer : this.#buffer.slice(0, close);
|
|
126
|
+
if (!this.#started) this.#tryStart(body, events);
|
|
127
|
+
if (close === -1) {
|
|
128
|
+
if (final) this.#resetTool();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const parsed = this.#parseCall(body);
|
|
133
|
+
if (parsed) {
|
|
134
|
+
if (!this.#started) {
|
|
135
|
+
events.push({ type: "toolStart", id: this.#id, name: parsed.name });
|
|
136
|
+
this.#started = true;
|
|
137
|
+
}
|
|
138
|
+
events.push({
|
|
139
|
+
type: "toolEnd",
|
|
140
|
+
id: this.#id,
|
|
141
|
+
name: parsed.name,
|
|
142
|
+
arguments: parsed.arguments,
|
|
143
|
+
rawBlock: `${TOOL_OPEN}${body}${TOOL_CLOSE}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
this.#buffer = this.#buffer.slice(close + TOOL_CLOSE.length);
|
|
147
|
+
this.#resetTool();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#emitThinkingDelta(delta: string, events: InbandScanEvent[]): void {
|
|
151
|
+
if (delta.length === 0) return;
|
|
152
|
+
this.#thinking += delta;
|
|
153
|
+
events.push({ type: "thinkingDelta", delta });
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
#endThinking(events: InbandScanEvent[]): void {
|
|
157
|
+
events.push({ type: "thinkingEnd", thinking: this.#thinking });
|
|
158
|
+
this.#thinking = "";
|
|
159
|
+
this.#state = "outside";
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
#tryStart(body: string, events: InbandScanEvent[]): void {
|
|
163
|
+
const nameMatch = COMPLETE_NAME.exec(body);
|
|
164
|
+
if (!nameMatch) return;
|
|
165
|
+
let name: unknown;
|
|
166
|
+
try {
|
|
167
|
+
name = JSON.parse(nameMatch[1]!);
|
|
168
|
+
} catch {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (typeof name !== "string" || name.length === 0) return;
|
|
172
|
+
this.#name = name;
|
|
173
|
+
this.#started = true;
|
|
174
|
+
events.push({ type: "toolStart", id: this.#id, name: this.#name });
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
#parseCall(body: string): { name: string; arguments: Record<string, unknown> } | undefined {
|
|
178
|
+
try {
|
|
179
|
+
const parsed = parseJsonWithRepair<{ name?: unknown; arguments?: unknown }>(body.trim());
|
|
180
|
+
if (typeof parsed.name !== "string" || parsed.name.length === 0) return undefined;
|
|
181
|
+
let args = parsed.arguments;
|
|
182
|
+
if (typeof args === "string") {
|
|
183
|
+
try {
|
|
184
|
+
args = parseJsonWithRepair<unknown>(args);
|
|
185
|
+
} catch {
|
|
186
|
+
args = {};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return { name: parsed.name, arguments: asRecord(args) };
|
|
190
|
+
} catch {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
#resetTool(): void {
|
|
196
|
+
this.#state = "outside";
|
|
197
|
+
this.#id = "";
|
|
198
|
+
this.#name = "";
|
|
199
|
+
this.#started = false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function renderToolCall(call: ToolCall, _options: DialectRenderOptions = {}): string {
|
|
204
|
+
return `${TOOL_OPEN}\n${stringifyJson({ name: call.name, arguments: call.arguments })}\n${TOOL_CLOSE}`;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function renderAssistantToolCalls(calls: readonly ToolCall[], options: DialectRenderOptions = {}): string {
|
|
208
|
+
return calls.map(call => renderToolCall(call, options)).join("\n");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function renderToolResults(results: readonly DialectToolResult[], _options: DialectRenderOptions = {}): string {
|
|
212
|
+
return renderToolResponseResults(results);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function renderThinking(text: string): string {
|
|
216
|
+
if (!text) return "";
|
|
217
|
+
return `${THINK_OPEN}\n${text}\n${THINK_CLOSE}`;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function renderTranscript(messages: readonly Message[], options: DialectRenderOptions = {}): string {
|
|
221
|
+
return renderChatMlTranscript(messages, options, {
|
|
222
|
+
toolResultRole: "user",
|
|
223
|
+
renderThinking,
|
|
224
|
+
renderCalls: renderAssistantToolCalls,
|
|
225
|
+
renderResultsBody: renderToolResults,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const definition: DialectDefinition = {
|
|
230
|
+
dialect: "qwen3",
|
|
231
|
+
prompt: dialectPrompt,
|
|
232
|
+
createScanner: options => new Qwen3InbandScanner(options),
|
|
233
|
+
renderToolCall,
|
|
234
|
+
renderAssistantToolCalls,
|
|
235
|
+
renderToolResults,
|
|
236
|
+
renderThinking,
|
|
237
|
+
renderTranscript,
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
export default definition;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import type { AssistantMessage, Message, ToolCall, ToolResultMessage } from "../types";
|
|
2
|
+
import type { DialectRenderOptions, DialectToolResult } from "./types";
|
|
3
|
+
|
|
4
|
+
export function renderToolResponseResults(results: readonly DialectToolResult[]): string {
|
|
5
|
+
return results.map(result => `<tool_response>\n${result.text}\n</tool_response>`).join("\n");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function kimiCallId(name: string, id: string, index: number): string {
|
|
9
|
+
const trimmed = id.trim();
|
|
10
|
+
return trimmed.startsWith("functions.") ? trimmed : `functions.${name}:${index}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function harmonyRecipient(name: string): string {
|
|
14
|
+
return name.startsWith("functions.") ? name : `functions.${name}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function stringifyJson(value: unknown): string {
|
|
18
|
+
return JSON.stringify(value) ?? "null";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function escapeXmlAttr(value: string): string {
|
|
22
|
+
return value.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<").replaceAll(">", ">");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function escapeXmlText(value: string): string {
|
|
26
|
+
return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type AssistantTranscriptParts = {
|
|
30
|
+
readonly text: string;
|
|
31
|
+
readonly thinking: string;
|
|
32
|
+
readonly toolCalls: readonly ToolCall[];
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export type ToolCallRenderer = (calls: readonly ToolCall[], options?: DialectRenderOptions) => string;
|
|
36
|
+
export type ToolResultRenderer = (results: readonly DialectToolResult[], options?: DialectRenderOptions) => string;
|
|
37
|
+
|
|
38
|
+
export type ChatMlTranscriptConfig = {
|
|
39
|
+
readonly bos?: string;
|
|
40
|
+
readonly toolResultRole: "tool" | "user";
|
|
41
|
+
readonly renderThinking: (text: string) => string;
|
|
42
|
+
readonly renderCalls: ToolCallRenderer;
|
|
43
|
+
readonly renderResultsBody: ToolResultRenderer;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export type LegacyTextTranscriptConfig = {
|
|
47
|
+
readonly renderThinking: (text: string) => string;
|
|
48
|
+
readonly renderCalls: ToolCallRenderer;
|
|
49
|
+
readonly renderResults: ToolResultRenderer;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export function renderChatMlTranscript(
|
|
53
|
+
messages: readonly Message[],
|
|
54
|
+
options: DialectRenderOptions,
|
|
55
|
+
config: ChatMlTranscriptConfig,
|
|
56
|
+
): string {
|
|
57
|
+
if (messages.length === 0) return "";
|
|
58
|
+
let out = config.bos ?? "";
|
|
59
|
+
for (let i = 0; i < messages.length; ) {
|
|
60
|
+
const message = messages[i]!;
|
|
61
|
+
if (message.role === "assistant") {
|
|
62
|
+
const parts = assistantTranscriptParts(message);
|
|
63
|
+
out += chatMlTurn(
|
|
64
|
+
"assistant",
|
|
65
|
+
`${config.renderThinking(parts.thinking)}${parts.text}${config.renderCalls(parts.toolCalls, options)}`,
|
|
66
|
+
);
|
|
67
|
+
i++;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (message.role === "toolResult") {
|
|
71
|
+
const run = collectToolResultRun(messages, i);
|
|
72
|
+
out += chatMlTurn(config.toolResultRole, config.renderResultsBody(run.results, options));
|
|
73
|
+
i = run.next;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const role = message.role === "developer" ? "system" : message.role;
|
|
77
|
+
out += chatMlTurn(role, messageContentText(message.content));
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function renderLegacyTextTranscript(
|
|
84
|
+
messages: readonly Message[],
|
|
85
|
+
options: DialectRenderOptions,
|
|
86
|
+
config: LegacyTextTranscriptConfig,
|
|
87
|
+
): string {
|
|
88
|
+
let out = "";
|
|
89
|
+
for (let i = 0; i < messages.length; ) {
|
|
90
|
+
const message = messages[i]!;
|
|
91
|
+
if (message.role === "assistant") {
|
|
92
|
+
const parts = assistantTranscriptParts(message);
|
|
93
|
+
out = appendLegacySegment(
|
|
94
|
+
out,
|
|
95
|
+
`Assistant: ${config.renderThinking(parts.thinking)}${parts.text}${config.renderCalls(parts.toolCalls, options)}`,
|
|
96
|
+
);
|
|
97
|
+
i++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (message.role === "toolResult") {
|
|
101
|
+
const run = collectToolResultRun(messages, i);
|
|
102
|
+
out = appendLegacySegment(out, `Human: ${config.renderResults(run.results, options)}`);
|
|
103
|
+
i = run.next;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const text = messageContentText(message.content);
|
|
107
|
+
out = message.role === "developer" ? appendLegacyPlain(out, text) : appendLegacySegment(out, `Human: ${text}`);
|
|
108
|
+
i++;
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function assistantTranscriptParts(message: AssistantMessage): AssistantTranscriptParts {
|
|
114
|
+
let text = "";
|
|
115
|
+
const thinking: string[] = [];
|
|
116
|
+
const toolCalls: ToolCall[] = [];
|
|
117
|
+
for (const block of message.content) {
|
|
118
|
+
if (block.type === "text") text += block.text;
|
|
119
|
+
else if (block.type === "thinking") thinking.push(block.thinking);
|
|
120
|
+
else if (block.type === "toolCall") toolCalls.push(block);
|
|
121
|
+
}
|
|
122
|
+
return { text, thinking: thinking.join("\n"), toolCalls };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function collectToolResultRun(
|
|
126
|
+
messages: readonly Message[],
|
|
127
|
+
start: number,
|
|
128
|
+
): { readonly results: readonly DialectToolResult[]; readonly next: number } {
|
|
129
|
+
const results: DialectToolResult[] = [];
|
|
130
|
+
let next = start;
|
|
131
|
+
while (next < messages.length && messages[next]!.role === "toolResult") {
|
|
132
|
+
results.push(toolResultToDialectResult(messages[next] as ToolResultMessage, results.length));
|
|
133
|
+
next++;
|
|
134
|
+
}
|
|
135
|
+
return { results, next };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function toolResultToDialectResult(message: ToolResultMessage, index: number): DialectToolResult {
|
|
139
|
+
return {
|
|
140
|
+
id: message.toolCallId,
|
|
141
|
+
name: message.toolName,
|
|
142
|
+
index,
|
|
143
|
+
text: messageContentText(message.content),
|
|
144
|
+
isError: message.isError,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function messageContentText(
|
|
149
|
+
content: string | readonly { readonly type: string; readonly text?: string; readonly mimeType?: string }[],
|
|
150
|
+
): string {
|
|
151
|
+
if (typeof content === "string") return content;
|
|
152
|
+
let text = "";
|
|
153
|
+
for (const block of content) {
|
|
154
|
+
if (block.type === "text" && block.text !== undefined) text += block.text;
|
|
155
|
+
else if (block.type === "image") text += block.mimeType ? `[Image: ${block.mimeType}]` : "[Image]";
|
|
156
|
+
}
|
|
157
|
+
return text;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function isAsciiWhitespace(code: number): boolean {
|
|
161
|
+
return code === 9 || code === 10 || code === 11 || code === 12 || code === 13 || code === 32;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function trimAsciiStart(text: string, start: number, end: number): number {
|
|
165
|
+
let cursor = start;
|
|
166
|
+
while (cursor < end && isAsciiWhitespace(text.charCodeAt(cursor))) cursor++;
|
|
167
|
+
return cursor;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function trimAsciiEnd(text: string, start: number, end: number): number {
|
|
171
|
+
let cursor = end;
|
|
172
|
+
while (cursor > start && isAsciiWhitespace(text.charCodeAt(cursor - 1))) cursor--;
|
|
173
|
+
return cursor;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function findDelimitedThinkingClose(open: string, close: string, text: string, start: number, end: number): number {
|
|
177
|
+
let depth = 1;
|
|
178
|
+
let cursor = start;
|
|
179
|
+
while (cursor < end) {
|
|
180
|
+
const nextClose = text.indexOf(close, cursor);
|
|
181
|
+
if (nextClose < 0 || nextClose >= end) return -1;
|
|
182
|
+
const nextOpen = text.indexOf(open, cursor);
|
|
183
|
+
if (nextOpen >= 0 && nextOpen < nextClose) {
|
|
184
|
+
depth++;
|
|
185
|
+
cursor = nextOpen + open.length;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
depth--;
|
|
189
|
+
if (depth === 0) return nextClose;
|
|
190
|
+
cursor = nextClose + close.length;
|
|
191
|
+
}
|
|
192
|
+
return -1;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function unwrapDelimitedThinking(open: string, close: string, text: string): string {
|
|
196
|
+
const end = trimAsciiEnd(text, 0, text.length);
|
|
197
|
+
let cursor = trimAsciiStart(text, 0, end);
|
|
198
|
+
if (cursor >= end || !text.startsWith(open, cursor)) return text;
|
|
199
|
+
|
|
200
|
+
const segments: string[] = [];
|
|
201
|
+
while (cursor < end) {
|
|
202
|
+
if (!text.startsWith(open, cursor)) return text;
|
|
203
|
+
const innerStart = cursor + open.length;
|
|
204
|
+
const innerEnd = findDelimitedThinkingClose(open, close, text, innerStart, end);
|
|
205
|
+
if (innerEnd < 0) return text;
|
|
206
|
+
|
|
207
|
+
const trimmedInnerEnd = trimAsciiEnd(text, innerStart, innerEnd);
|
|
208
|
+
const trimmedInnerStart = trimAsciiStart(text, innerStart, trimmedInnerEnd);
|
|
209
|
+
segments.push(unwrapDelimitedThinking(open, close, text.slice(trimmedInnerStart, trimmedInnerEnd)));
|
|
210
|
+
cursor = trimAsciiStart(text, innerEnd + close.length, end);
|
|
211
|
+
}
|
|
212
|
+
return segments.join("\n");
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function renderDelimitedThinking(open: string, close: string, text: string): string {
|
|
216
|
+
if (!text) return "";
|
|
217
|
+
return `${open}\n${unwrapDelimitedThinking(open, close, text)}\n${close}`;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function chatMlTurn(role: "assistant" | "system" | "tool" | "user", body: string): string {
|
|
221
|
+
return `<|im_start|>${role}\n${body}<|im_end|>\n`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export function kimiTurn(role: "assistant" | "system" | "user", name: string, body: string): string {
|
|
225
|
+
return `<|im_${role}|>${name}<|im_middle|>${body}<|im_end|>`;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function gemmaTurn(role: "model" | "system" | "user", body: string): string {
|
|
229
|
+
return `<|turn>${role}\n${body}<turn|>`;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function geminiTurn(role: "model" | "user", body: string): string {
|
|
233
|
+
return `<start_of_turn>${role}\n${body}<end_of_turn>\n`;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export function joinUserBodies(left: string, right: string): string {
|
|
237
|
+
if (!left) return right;
|
|
238
|
+
if (!right) return left;
|
|
239
|
+
return `${left}\n${right}`;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function appendLegacyPlain(out: string, text: string): string {
|
|
243
|
+
if (!text) return out;
|
|
244
|
+
return out ? `${out}\n\n${text}` : text;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function appendLegacySegment(out: string, segment: string): string {
|
|
248
|
+
return `${out}\n\n${segment}`;
|
|
249
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { partialSuffixOverlapAny } from "./coercion";
|
|
2
|
+
import { FencedThinkingScanner } from "./fenced-thinking";
|
|
3
|
+
import type { InbandScanEvent, InbandScanner } from "./types";
|
|
4
|
+
|
|
5
|
+
type Tag = { readonly open: string; readonly close: string; readonly fenced?: boolean };
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Every dialect's in-band thinking section in its canonical `renderThinking`
|
|
9
|
+
* form (see the sibling `./*.ts` scanners). {@link ThinkingInbandScanner} heals
|
|
10
|
+
* reasoning a model leaked into its visible text channel back into thinking
|
|
11
|
+
* events, whichever dialect idiom the leak used.
|
|
12
|
+
*
|
|
13
|
+
* Plain (attribute-free) delimiters only — matching what `renderThinking`
|
|
14
|
+
* emits and what models leak in practice. Attributed or namespaced XML thinking
|
|
15
|
+
* tags (`<thinking signature="…">`, `antml:thinking`) are recovered by the owned
|
|
16
|
+
* anthropic-dialect parser, not this text-channel healing fallback.
|
|
17
|
+
*/
|
|
18
|
+
const TAGS: readonly Tag[] = [
|
|
19
|
+
{ open: "<think>", close: "</think>" }, // deepseek, glm, hermes, kimi, qwen3 (and anthropic/minimax/xml)
|
|
20
|
+
{ open: "<thinking>", close: "</thinking>" }, // anthropic, minimax, xml
|
|
21
|
+
{ open: "<scratchpad>", close: "</scratchpad>" }, // anthropic
|
|
22
|
+
{ open: "```thinking\n", close: "```", fenced: true }, // gemini fenced thinking
|
|
23
|
+
{ open: "<|channel>thought\n", close: "<channel|>" }, // gemma reasoning channel
|
|
24
|
+
{ open: "<|start|>assistant<|channel|>analysis<|message|>", close: "<|end|>" }, // harmony analysis (rendered)
|
|
25
|
+
{ open: "<|channel|>analysis<|message|>", close: "<|end|>" }, // harmony analysis (bare leak)
|
|
26
|
+
];
|
|
27
|
+
const OPENS = TAGS.map(tag => tag.open);
|
|
28
|
+
|
|
29
|
+
export class ThinkingInbandScanner implements InbandScanner {
|
|
30
|
+
#buffer = "";
|
|
31
|
+
#closeTag = "";
|
|
32
|
+
#thinking = "";
|
|
33
|
+
/** Fence-aware close-matcher while inside a ` ```thinking ` block; undefined otherwise. */
|
|
34
|
+
#fenced: FencedThinkingScanner | undefined;
|
|
35
|
+
|
|
36
|
+
feed(text: string): InbandScanEvent[] {
|
|
37
|
+
if (text.length === 0) return [];
|
|
38
|
+
this.#buffer += text;
|
|
39
|
+
return this.#consume(false);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
flush(): InbandScanEvent[] {
|
|
43
|
+
const events = this.#consume(true);
|
|
44
|
+
if (this.#buffer.length === 0) return events;
|
|
45
|
+
if (this.#closeTag) {
|
|
46
|
+
this.#emitThinking(this.#buffer, events);
|
|
47
|
+
events.push({ type: "thinkingEnd", thinking: this.#thinking });
|
|
48
|
+
} else {
|
|
49
|
+
events.push({ type: "text", text: this.#buffer });
|
|
50
|
+
}
|
|
51
|
+
this.#buffer = "";
|
|
52
|
+
this.#closeTag = "";
|
|
53
|
+
return events;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#consume(final: boolean): InbandScanEvent[] {
|
|
57
|
+
const events: InbandScanEvent[] = [];
|
|
58
|
+
for (;;) {
|
|
59
|
+
if (this.#fenced) {
|
|
60
|
+
// Run even with an empty buffer so a held partial close flushes on final.
|
|
61
|
+
const result = this.#fenced.feed(this.#buffer, final);
|
|
62
|
+
this.#buffer = result.closed ? result.rest : "";
|
|
63
|
+
this.#emitThinking(result.thinking, events);
|
|
64
|
+
if (result.closed || final) {
|
|
65
|
+
events.push({ type: "thinkingEnd", thinking: this.#thinking });
|
|
66
|
+
this.#thinking = "";
|
|
67
|
+
this.#closeTag = "";
|
|
68
|
+
this.#fenced = undefined;
|
|
69
|
+
}
|
|
70
|
+
if (this.#fenced) break;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (this.#buffer.length === 0) break;
|
|
74
|
+
if (this.#closeTag) {
|
|
75
|
+
const close = this.#buffer.indexOf(this.#closeTag);
|
|
76
|
+
if (close === -1) {
|
|
77
|
+
const hold = final ? 0 : partialSuffixOverlapAny(this.#buffer, [this.#closeTag]);
|
|
78
|
+
this.#emitThinking(this.#buffer.slice(0, this.#buffer.length - hold), events);
|
|
79
|
+
this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
this.#emitThinking(this.#buffer.slice(0, close), events);
|
|
83
|
+
this.#buffer = this.#buffer.slice(close + this.#closeTag.length);
|
|
84
|
+
events.push({ type: "thinkingEnd", thinking: this.#thinking });
|
|
85
|
+
this.#thinking = "";
|
|
86
|
+
this.#closeTag = "";
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const tag = findEarliestOpen(this.#buffer);
|
|
91
|
+
if (!tag) {
|
|
92
|
+
const hold = final ? 0 : partialSuffixOverlapAny(this.#buffer, OPENS);
|
|
93
|
+
const emit = this.#buffer.slice(0, this.#buffer.length - hold);
|
|
94
|
+
if (emit.length > 0) events.push({ type: "text", text: emit });
|
|
95
|
+
this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
if (tag.index > 0) events.push({ type: "text", text: this.#buffer.slice(0, tag.index) });
|
|
99
|
+
this.#buffer = this.#buffer.slice(tag.index + tag.open.length);
|
|
100
|
+
this.#closeTag = tag.close;
|
|
101
|
+
this.#thinking = "";
|
|
102
|
+
if (tag.fenced) this.#fenced = new FencedThinkingScanner();
|
|
103
|
+
events.push({ type: "thinkingStart" });
|
|
104
|
+
}
|
|
105
|
+
return events;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
#emitThinking(delta: string, events: InbandScanEvent[]): void {
|
|
109
|
+
if (delta.length === 0) return;
|
|
110
|
+
this.#thinking += delta;
|
|
111
|
+
events.push({ type: "thinkingDelta", delta });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function findEarliestOpen(buffer: string): (Tag & { index: number }) | undefined {
|
|
116
|
+
let best: (Tag & { index: number }) | undefined;
|
|
117
|
+
for (const tag of TAGS) {
|
|
118
|
+
const index = buffer.indexOf(tag.open);
|
|
119
|
+
if (index !== -1 && (!best || index < best.index)) best = { ...tag, index };
|
|
120
|
+
}
|
|
121
|
+
return best;
|
|
122
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Dialect as CatalogDialect } from "jeopi-catalog/identity";
|
|
2
|
+
import type { Context, Message, ToolCall } from "../types";
|
|
3
|
+
|
|
4
|
+
export type { Dialect } from "jeopi-catalog/identity";
|
|
5
|
+
|
|
6
|
+
export type InbandScanEvent =
|
|
7
|
+
| { type: "text"; text: string }
|
|
8
|
+
| { type: "thinkingStart" }
|
|
9
|
+
| { type: "thinkingDelta"; delta: string }
|
|
10
|
+
| { type: "thinkingEnd"; thinking: string }
|
|
11
|
+
| { type: "toolStart"; id: string; name: string }
|
|
12
|
+
| { type: "toolArgDelta"; id: string; name: string; key: string; delta: string }
|
|
13
|
+
| { type: "toolEnd"; id: string; name: string; arguments: Record<string, unknown>; rawBlock?: string };
|
|
14
|
+
|
|
15
|
+
export interface InbandScanner {
|
|
16
|
+
feed(text: string): InbandScanEvent[];
|
|
17
|
+
flush(): InbandScanEvent[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface DialectToolResult {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly index: number;
|
|
24
|
+
readonly text: string;
|
|
25
|
+
readonly isError: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface DialectRenderOptions {
|
|
29
|
+
readonly tools?: readonly InbandTool[];
|
|
30
|
+
readonly example?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface DialectDefinition {
|
|
34
|
+
readonly dialect: CatalogDialect;
|
|
35
|
+
readonly prompt: string;
|
|
36
|
+
createScanner(options?: InbandScannerOptions): InbandScanner;
|
|
37
|
+
/** Render a single tool-call invocation — the inner element only, WITHOUT any parallel-call block envelope (e.g. anthropic's `<function_calls>` / kimi's section wrapper). */
|
|
38
|
+
renderToolCall(call: ToolCall, options?: DialectRenderOptions): string;
|
|
39
|
+
/** Render a batch of (parallel) tool calls as one complete block, including whatever envelope the dialect wraps multiple calls in. */
|
|
40
|
+
renderAssistantToolCalls(calls: readonly ToolCall[], options?: DialectRenderOptions): string;
|
|
41
|
+
renderToolResults(results: readonly DialectToolResult[], options?: DialectRenderOptions): string;
|
|
42
|
+
renderThinking(text: string): string;
|
|
43
|
+
renderTranscript(messages: readonly Message[], options?: DialectRenderOptions): string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface InbandScannerOptions {
|
|
47
|
+
/** string-typed arg names for a tool → read verbatim. Ignored by JSON-carrying dialects. */
|
|
48
|
+
stringArgs?: (toolName: string) => ReadonlySet<string>;
|
|
49
|
+
/** Full tool schemas for schema-driven dialects such as GLM XML and pi-native. */
|
|
50
|
+
tools?: readonly InbandTool[];
|
|
51
|
+
/** XML only: parse pipe-wrapped DeepSeek DSML tags vs plain Anthropic invoke/parameter tags. */
|
|
52
|
+
xmlTagset?: "anthropic" | "dsml";
|
|
53
|
+
/** Emit thinking markers as thinking events instead of visible text when the dialect defines them. */
|
|
54
|
+
parseThinking?: boolean;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type InbandTool = NonNullable<Context["tools"]>[number];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## Format guide
|
|
2
|
+
|
|
3
|
+
A call is one `<invoke>` element whose `<parameter>` children carry its arguments:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
<invoke name="fn"><parameter name="arg">value</parameter></invoke>
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Emit consecutive `<invoke>…</invoke>` blocks for multiple calls; you MAY wrap them in `<tool_calls>…</tool_calls>`. Each call's result arrives as a response block:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
<tool_response>
|
|
13
|
+
verbatim tool result
|
|
14
|
+
</tool_response>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Rules
|
|
18
|
+
|
|
19
|
+
- `name` MUST match a listed function.
|
|
20
|
+
- Parameter values are read literally by regex (delimiter matching), NOT a real XML parser: write them verbatim and never HTML-escape (emit `a & b`, never `a & b`; `<`/`>` stay literal too). Only the body's own `</parameter>` closing tag is reserved. Non-string values are JSON; add `string="false"` to a parameter only to force JSON parsing of a value the schema treats as a string.
|
|
21
|
+
- Read each `<tool_response>` in call order. NEVER emit `<tool_response>` yourself.
|
|
22
|
+
- Emit the stop sequence ONLY after the call is fully written — NEVER announce a tool then stop (e.g. halting at "Let's run `cargo clippy`" with no `<invoke>` emitted). Write the complete call, THEN the stop sequence, THEN halt.
|