@fractaal/pi-ai 0.86.9 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -78
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +380 -144
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +9 -11
- package/dist/api/azure-openai-responses.js.map +1 -1
- package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.js +184 -121
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/bedrock-converse-stream.lazy.d.ts +7 -0
- package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.lazy.js +18 -5
- package/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
- package/dist/api/classifier-shared.d.ts +21 -0
- package/dist/api/classifier-shared.d.ts.map +1 -0
- package/dist/api/classifier-shared.js +99 -0
- package/dist/api/classifier-shared.js.map +1 -0
- package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -1
- package/dist/api/cloudflare-workers-ai-system-one.js +10 -1
- package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -1
- package/dist/api/constrained-sampling.d.ts +15 -1
- package/dist/api/constrained-sampling.d.ts.map +1 -1
- package/dist/api/constrained-sampling.js +51 -18
- package/dist/api/constrained-sampling.js.map +1 -1
- package/dist/api/google-generative-ai.d.ts.map +1 -1
- package/dist/api/google-generative-ai.js +4 -10
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts +2 -1
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +60 -3
- package/dist/api/google-shared.js.map +1 -1
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +9 -15
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/lazy.d.ts +7 -2
- package/dist/api/lazy.d.ts.map +1 -1
- package/dist/api/lazy.js +33 -12
- package/dist/api/lazy.js.map +1 -1
- package/dist/api/llama-cpp-classify.d.ts.map +1 -1
- package/dist/api/llama-cpp-classify.js +4 -1
- package/dist/api/llama-cpp-classify.js.map +1 -1
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +50 -60
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.js +30 -17
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts +2 -1
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +93 -90
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-decisions.d.ts +4 -0
- package/dist/api/openai-decisions.d.ts.map +1 -0
- package/dist/api/openai-decisions.js +162 -0
- package/dist/api/openai-decisions.js.map +1 -0
- package/dist/api/openai-decisions.lazy.d.ts +3 -0
- package/dist/api/openai-decisions.lazy.d.ts.map +1 -0
- package/dist/api/openai-decisions.lazy.js +4 -0
- package/dist/api/openai-decisions.lazy.js.map +1 -0
- package/dist/api/openai-responses-shared.d.ts +26 -0
- package/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/dist/api/openai-responses-shared.js +132 -66
- package/dist/api/openai-responses-shared.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +42 -21
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/openrouter-images.d.ts.map +1 -1
- package/dist/api/openrouter-images.js +5 -3
- package/dist/api/openrouter-images.js.map +1 -1
- package/dist/api/pi-messages.d.ts +2 -0
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +27 -12
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +1 -0
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +18 -3
- package/dist/api/simple-options.js.map +1 -1
- package/dist/api/system-one-shared.d.ts +29 -3
- package/dist/api/system-one-shared.d.ts.map +1 -1
- package/dist/api/system-one-shared.js +54 -86
- package/dist/api/system-one-shared.js.map +1 -1
- package/dist/api/transform-messages.d.ts +16 -1
- package/dist/api/transform-messages.d.ts.map +1 -1
- package/dist/api/transform-messages.js +28 -15
- package/dist/api/transform-messages.js.map +1 -1
- package/dist/api/typesafe-system-one.d.ts.map +1 -1
- package/dist/api/typesafe-system-one.js +12 -1
- package/dist/api/typesafe-system-one.js.map +1 -1
- package/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/dist/auth/oauth/anthropic.js +14 -6
- package/dist/auth/oauth/anthropic.js.map +1 -1
- package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/dist/auth/oauth/github-copilot.js +4 -11
- package/dist/auth/oauth/github-copilot.js.map +1 -1
- package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/dist/auth/oauth/kimi-coding.js +4 -22
- package/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/auth/oauth/load.d.ts.map +1 -1
- package/dist/auth/oauth/load.js +5 -2
- package/dist/auth/oauth/load.js.map +1 -1
- package/dist/auth/oauth/meta.d.ts.map +1 -1
- package/dist/auth/oauth/meta.js +1 -14
- package/dist/auth/oauth/meta.js.map +1 -1
- package/dist/auth/oauth/openai-chatgpt.js +1 -1
- package/dist/auth/oauth/openai-chatgpt.js.map +1 -1
- package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
- package/dist/auth/oauth/openai-codex.js +4 -4
- package/dist/auth/oauth/openai-codex.js.map +1 -1
- package/dist/auth/oauth/radius.d.ts.map +1 -1
- package/dist/auth/oauth/radius.js +9 -3
- package/dist/auth/oauth/radius.js.map +1 -1
- package/dist/auth/oauth/trusted-url.d.ts +7 -0
- package/dist/auth/oauth/trusted-url.d.ts.map +1 -0
- package/dist/auth/oauth/trusted-url.js +12 -0
- package/dist/auth/oauth/trusted-url.js.map +1 -0
- package/dist/auth/types.d.ts +9 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/compat/extension-oauth-types.d.ts +4 -0
- package/dist/compat/extension-oauth-types.d.ts.map +1 -1
- package/dist/compat/extension-oauth-types.js.map +1 -1
- package/dist/env-api-keys.d.ts.map +1 -1
- package/dist/env-api-keys.js +1 -0
- package/dist/env-api-keys.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/lazy-bedrock-provider.d.ts +10 -0
- package/dist/lazy-bedrock-provider.d.ts.map +1 -0
- package/dist/lazy-bedrock-provider.js +13 -0
- package/dist/lazy-bedrock-provider.js.map +1 -0
- package/dist/lazy-oauth.d.ts +10 -0
- package/dist/lazy-oauth.d.ts.map +1 -0
- package/dist/lazy-oauth.js +23 -0
- package/dist/lazy-oauth.js.map +1 -0
- package/dist/models.d.ts +9 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +4 -0
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +5 -1
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +28 -12
- package/dist/models.js.map +1 -1
- package/dist/providers/all.d.ts.map +1 -1
- package/dist/providers/all.js +2 -0
- package/dist/providers/all.js.map +1 -1
- package/dist/providers/amazon-bedrock.models.js +1 -1
- package/dist/providers/amazon-bedrock.models.js.map +1 -1
- package/dist/providers/ant-ling.models.js +1 -1
- package/dist/providers/ant-ling.models.js.map +1 -1
- package/dist/providers/anthropic.models.js +1 -1
- package/dist/providers/anthropic.models.js.map +1 -1
- package/dist/providers/azure.models.js +1 -1
- package/dist/providers/azure.models.js.map +1 -1
- package/dist/providers/baseten.models.js +1 -1
- package/dist/providers/baseten.models.js.map +1 -1
- package/dist/providers/cerebras.models.js +1 -1
- package/dist/providers/cerebras.models.js.map +1 -1
- package/dist/providers/cloudflare-ai-gateway.models.js +1 -1
- package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
- package/dist/providers/cloudflare-workers-ai.models.js +1 -1
- package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
- package/dist/providers/compat-schema.d.ts +494 -0
- package/dist/providers/compat-schema.d.ts.map +1 -0
- package/dist/providers/compat-schema.js +447 -0
- package/dist/providers/compat-schema.js.map +1 -0
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure.json +1 -1
- package/dist/providers/data/baseten.json +1 -1
- package/dist/providers/data/cerebras.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/google-vertex.json +1 -1
- package/dist/providers/data/google.json +1 -1
- package/dist/providers/data/groq.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/kimi-coding.json +1 -1
- package/dist/providers/data/meta.json +1 -1
- package/dist/providers/data/minimax-cn.json +1 -1
- package/dist/providers/data/minimax.json +1 -1
- package/dist/providers/data/mistral.json +1 -1
- package/dist/providers/data/moonshotai-cn.json +1 -1
- package/dist/providers/data/moonshotai.json +1 -1
- package/dist/providers/data/nvidia.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openai.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/opencode.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/dist/providers/data/qwen-token-plan-individual-cn.json +1 -0
- package/dist/providers/data/qwen-token-plan-individual.json +1 -1
- package/dist/providers/data/qwen-token-plan.json +1 -1
- package/dist/providers/data/radius.json +1 -1
- package/dist/providers/data/together.json +1 -1
- package/dist/providers/data/typesafe.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/xai.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
- package/dist/providers/data/xiaomi.json +1 -1
- package/dist/providers/data/zai-coding-cn.json +1 -1
- package/dist/providers/data/zai.json +1 -1
- package/dist/providers/deepseek.models.js +1 -1
- package/dist/providers/deepseek.models.js.map +1 -1
- package/dist/providers/faux.d.ts.map +1 -1
- package/dist/providers/faux.js +31 -9
- package/dist/providers/faux.js.map +1 -1
- package/dist/providers/fireworks.models.js +1 -1
- package/dist/providers/fireworks.models.js.map +1 -1
- package/dist/providers/github-copilot.d.ts +3 -1
- package/dist/providers/github-copilot.d.ts.map +1 -1
- package/dist/providers/github-copilot.js +13 -2
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/github-copilot.models.js +1 -1
- package/dist/providers/github-copilot.models.js.map +1 -1
- package/dist/providers/google-vertex.models.js +1 -1
- package/dist/providers/google-vertex.models.js.map +1 -1
- package/dist/providers/google.models.js +1 -1
- package/dist/providers/google.models.js.map +1 -1
- package/dist/providers/groq.models.js +1 -1
- package/dist/providers/groq.models.js.map +1 -1
- package/dist/providers/huggingface.models.js +1 -1
- package/dist/providers/huggingface.models.js.map +1 -1
- package/dist/providers/kimi-coding.d.ts +1 -1
- package/dist/providers/kimi-coding.js +3 -3
- package/dist/providers/kimi-coding.js.map +1 -1
- package/dist/providers/kimi-coding.models.js +1 -1
- package/dist/providers/kimi-coding.models.js.map +1 -1
- package/dist/providers/meta.models.js +1 -1
- package/dist/providers/meta.models.js.map +1 -1
- package/dist/providers/minimax-cn.models.js +1 -1
- package/dist/providers/minimax-cn.models.js.map +1 -1
- package/dist/providers/minimax.models.js +1 -1
- package/dist/providers/minimax.models.js.map +1 -1
- package/dist/providers/mistral.models.js +1 -1
- package/dist/providers/mistral.models.js.map +1 -1
- package/dist/providers/model-schema.d.ts +91 -0
- package/dist/providers/model-schema.d.ts.map +1 -0
- package/dist/providers/model-schema.js +68 -0
- package/dist/providers/model-schema.js.map +1 -0
- package/dist/providers/moonshotai-cn.models.js +1 -1
- package/dist/providers/moonshotai-cn.models.js.map +1 -1
- package/dist/providers/moonshotai.models.js +1 -1
- package/dist/providers/moonshotai.models.js.map +1 -1
- package/dist/providers/nvidia.models.js +1 -1
- package/dist/providers/nvidia.models.js.map +1 -1
- package/dist/providers/openai-codex-catalog.d.ts.map +1 -1
- package/dist/providers/openai-codex-catalog.js +44 -44
- package/dist/providers/openai-codex-catalog.js.map +1 -1
- package/dist/providers/openai-codex.models.js +1 -1
- package/dist/providers/openai-codex.models.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +12 -3
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openai.models.js +1 -1
- package/dist/providers/openai.models.js.map +1 -1
- package/dist/providers/opencode-go.d.ts +3 -1
- package/dist/providers/opencode-go.d.ts.map +1 -1
- package/dist/providers/opencode-go.js +2 -0
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/opencode-go.models.js +1 -1
- package/dist/providers/opencode-go.models.js.map +1 -1
- package/dist/providers/opencode.js +1 -1
- package/dist/providers/opencode.js.map +1 -1
- package/dist/providers/opencode.models.js +1 -1
- package/dist/providers/opencode.models.js.map +1 -1
- package/dist/providers/openrouter-api.d.ts +40 -0
- package/dist/providers/openrouter-api.d.ts.map +1 -0
- package/dist/providers/openrouter-api.js +41 -0
- package/dist/providers/openrouter-api.js.map +1 -0
- package/dist/providers/openrouter.d.ts +11 -1
- package/dist/providers/openrouter.d.ts.map +1 -1
- package/dist/providers/openrouter.js +52 -1
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/openrouter.models.js +1 -1
- package/dist/providers/openrouter.models.js.map +1 -1
- package/dist/providers/qwen-token-plan-cn.models.js +1 -1
- package/dist/providers/qwen-token-plan-cn.models.js.map +1 -1
- package/dist/providers/qwen-token-plan-individual-cn.d.ts +3 -0
- package/dist/providers/qwen-token-plan-individual-cn.d.ts.map +1 -0
- package/dist/providers/qwen-token-plan-individual-cn.js +15 -0
- package/dist/providers/qwen-token-plan-individual-cn.js.map +1 -0
- package/dist/providers/qwen-token-plan-individual-cn.models.d.ts +6 -0
- package/dist/providers/qwen-token-plan-individual-cn.models.d.ts.map +1 -0
- package/dist/providers/qwen-token-plan-individual-cn.models.js +8 -0
- package/dist/providers/qwen-token-plan-individual-cn.models.js.map +1 -0
- package/dist/providers/qwen-token-plan-individual.models.js +1 -1
- package/dist/providers/qwen-token-plan-individual.models.js.map +1 -1
- package/dist/providers/qwen-token-plan.models.js +1 -1
- package/dist/providers/qwen-token-plan.models.js.map +1 -1
- package/dist/providers/radius-config.d.ts.map +1 -1
- package/dist/providers/radius-config.js +2 -1
- package/dist/providers/radius-config.js.map +1 -1
- package/dist/providers/radius.d.ts.map +1 -1
- package/dist/providers/radius.js +4 -12
- package/dist/providers/radius.js.map +1 -1
- package/dist/providers/radius.models.js +1 -1
- package/dist/providers/radius.models.js.map +1 -1
- package/dist/providers/schema-builders.d.ts +10 -0
- package/dist/providers/schema-builders.d.ts.map +1 -0
- package/dist/providers/schema-builders.js +18 -0
- package/dist/providers/schema-builders.js.map +1 -0
- package/dist/providers/together.models.js +1 -1
- package/dist/providers/together.models.js.map +1 -1
- package/dist/providers/typesafe.models.js +1 -1
- package/dist/providers/typesafe.models.js.map +1 -1
- package/dist/providers/vercel-ai-gateway.models.js +1 -1
- package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
- package/dist/providers/xai.models.js +1 -1
- package/dist/providers/xai.models.js.map +1 -1
- package/dist/providers/xiaomi-token-plan-ams.models.js +1 -1
- package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
- package/dist/providers/xiaomi-token-plan-cn.models.js +1 -1
- package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
- package/dist/providers/xiaomi-token-plan-sgp.models.js +1 -1
- package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
- package/dist/providers/xiaomi.models.js +1 -1
- package/dist/providers/xiaomi.models.js.map +1 -1
- package/dist/providers/zai-coding-cn.models.js +1 -1
- package/dist/providers/zai-coding-cn.models.js.map +1 -1
- package/dist/providers/zai.models.js +1 -1
- package/dist/providers/zai.models.js.map +1 -1
- package/dist/telemetry.d.ts +288 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +192 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +57 -310
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/error-body.d.ts +8 -0
- package/dist/utils/error-body.d.ts.map +1 -1
- package/dist/utils/error-body.js +30 -2
- package/dist/utils/error-body.js.map +1 -1
- package/dist/utils/estimate.js +1 -1
- package/dist/utils/estimate.js.map +1 -1
- package/dist/utils/event-stream.d.ts +10 -1
- package/dist/utils/event-stream.d.ts.map +1 -1
- package/dist/utils/event-stream.js +25 -0
- package/dist/utils/event-stream.js.map +1 -1
- package/dist/utils/identity.d.ts +65 -0
- package/dist/utils/identity.d.ts.map +1 -0
- package/dist/utils/identity.js +141 -0
- package/dist/utils/identity.js.map +1 -0
- package/dist/utils/json-parse.d.ts +10 -0
- package/dist/utils/json-parse.d.ts.map +1 -1
- package/dist/utils/json-parse.js +26 -1
- package/dist/utils/json-parse.js.map +1 -1
- package/dist/utils/model-operations.d.ts +3 -1
- package/dist/utils/model-operations.d.ts.map +1 -1
- package/dist/utils/model-operations.js +6 -0
- package/dist/utils/model-operations.js.map +1 -1
- package/dist/utils/openrouter-cost.d.ts +24 -0
- package/dist/utils/openrouter-cost.d.ts.map +1 -0
- package/dist/utils/openrouter-cost.js +34 -0
- package/dist/utils/openrouter-cost.js.map +1 -0
- package/dist/utils/overflow.d.ts +1 -0
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +8 -1
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/provider-retry.d.ts +2 -0
- package/dist/utils/provider-retry.d.ts.map +1 -1
- package/dist/utils/provider-retry.js +2 -0
- package/dist/utils/provider-retry.js.map +1 -1
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +29 -10
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/streaming-json.d.ts +84 -0
- package/dist/utils/streaming-json.d.ts.map +1 -0
- package/dist/utils/streaming-json.js +513 -0
- package/dist/utils/streaming-json.js.map +1 -0
- package/dist/utils/{typebox-helpers.d.ts → string-enum.d.ts} +5 -5
- package/dist/utils/string-enum.d.ts.map +1 -0
- package/dist/utils/{typebox-helpers.js → string-enum.js} +5 -6
- package/dist/utils/string-enum.js.map +1 -0
- package/dist/utils/text.d.ts +7 -0
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/transcript.d.ts +23 -9
- package/dist/utils/transcript.d.ts.map +1 -1
- package/dist/utils/transcript.js +30 -19
- package/dist/utils/transcript.js.map +1 -1
- package/dist/utils/validation.d.ts +5 -3
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +27 -445
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +3 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +19 -10
- package/dist/utils/assistant-message-frame.d.ts +0 -77
- package/dist/utils/assistant-message-frame.d.ts.map +0 -1
- package/dist/utils/assistant-message-frame.js +0 -425
- package/dist/utils/assistant-message-frame.js.map +0 -1
- package/dist/utils/pi-user-agent.d.ts +0 -2
- package/dist/utils/pi-user-agent.d.ts.map +0 -1
- package/dist/utils/pi-user-agent.js +0 -12
- package/dist/utils/pi-user-agent.js.map +0 -1
- package/dist/utils/typebox-helpers.d.ts.map +0 -1
- package/dist/utils/typebox-helpers.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fractaal/pi-ai",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Unified LLM API with automatic model discovery and provider configuration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -46,6 +46,14 @@
|
|
|
46
46
|
"./bun-oauth": {
|
|
47
47
|
"types": "./dist/bun-oauth.d.ts",
|
|
48
48
|
"import": "./dist/bun-oauth.js"
|
|
49
|
+
},
|
|
50
|
+
"./lazy-bedrock-provider": {
|
|
51
|
+
"types": "./dist/lazy-bedrock-provider.d.ts",
|
|
52
|
+
"import": "./dist/lazy-bedrock-provider.js"
|
|
53
|
+
},
|
|
54
|
+
"./lazy-oauth": {
|
|
55
|
+
"types": "./dist/lazy-oauth.d.ts",
|
|
56
|
+
"import": "./dist/lazy-oauth.js"
|
|
49
57
|
}
|
|
50
58
|
},
|
|
51
59
|
"bin": {
|
|
@@ -56,27 +64,27 @@
|
|
|
56
64
|
"README.md"
|
|
57
65
|
],
|
|
58
66
|
"scripts": {
|
|
59
|
-
"clean": "
|
|
60
|
-
"generate-models": "node
|
|
61
|
-
"hydrate-model-data": "node
|
|
62
|
-
"generate-model-catalog": "node
|
|
67
|
+
"clean": "node ../../scripts/package-files.mjs clean dist",
|
|
68
|
+
"generate-models": "node catalog/generate.ts --strict",
|
|
69
|
+
"hydrate-model-data": "node catalog/generate.ts --strict --data-only",
|
|
70
|
+
"generate-model-catalog": "node catalog/generate.ts --strict --json-only --json-output ../../.artifacts/model-catalog",
|
|
63
71
|
"check:model-data": "node scripts/check-model-data.ts",
|
|
64
72
|
"build": "npm run generate-models && npm run build:offline",
|
|
65
|
-
"build:offline": "npm run check:model-data && tsc -p tsconfig.build.json &&
|
|
73
|
+
"build:offline": "npm run check:model-data && tsc -p tsconfig.build.json && node ../../scripts/package-files.mjs clean dist/providers/data && node ../../scripts/package-files.mjs copy src/providers/data dist/providers",
|
|
66
74
|
"test": "vitest --run",
|
|
67
75
|
"prepublishOnly": "npm run clean && npm run build"
|
|
68
76
|
},
|
|
69
77
|
"dependencies": {
|
|
70
78
|
"@anthropic-ai/sdk": "0.129.0",
|
|
71
79
|
"@aws-sdk/client-bedrock-runtime": "3.1127.0",
|
|
72
|
-
"@earendil-works/pi-
|
|
80
|
+
"@earendil-works/pi-schema": "npm:@fractaal/pi-schema@1.6.0",
|
|
81
|
+
"@earendil-works/pi-telemetry": "npm:@fractaal/pi-telemetry@1.6.0",
|
|
73
82
|
"@google/genai": "2.21.0",
|
|
74
83
|
"@smithy/node-http-handler": "4.12.1",
|
|
75
84
|
"http-proxy-agent": "9.1.0",
|
|
76
85
|
"https-proxy-agent": "9.1.0",
|
|
77
86
|
"openai": "7.19.0",
|
|
78
|
-
"partial-json": "0.1.7"
|
|
79
|
-
"typebox": "1.3.27"
|
|
87
|
+
"partial-json": "0.1.7"
|
|
80
88
|
},
|
|
81
89
|
"keywords": [
|
|
82
90
|
"ai",
|
|
@@ -101,7 +109,8 @@
|
|
|
101
109
|
"devDependencies": {
|
|
102
110
|
"@types/node": "22.19.19",
|
|
103
111
|
"canvas": "3.2.3",
|
|
104
|
-
"
|
|
112
|
+
"typebox": "1.3.27",
|
|
113
|
+
"vitest": "4.1.12"
|
|
105
114
|
},
|
|
106
115
|
"homepage": "https://github.com/fractaal/pi",
|
|
107
116
|
"bugs": {
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import type { AssistantMessage, AssistantMessageEvent, TextContent, ThinkingContent, ToolCall } from "../types.ts";
|
|
2
|
-
/**
|
|
3
|
-
* Compact, replayable assistant-message progress. Terminal settlement is
|
|
4
|
-
* intentionally excluded and must be persisted separately.
|
|
5
|
-
*/
|
|
6
|
-
export type AssistantMessageFrame = {
|
|
7
|
-
type: "start";
|
|
8
|
-
partial: AssistantMessage;
|
|
9
|
-
} | {
|
|
10
|
-
type: "text_start";
|
|
11
|
-
contentIndex: number;
|
|
12
|
-
content: TextContent;
|
|
13
|
-
} | {
|
|
14
|
-
type: "text_delta";
|
|
15
|
-
contentIndex: number;
|
|
16
|
-
delta: string;
|
|
17
|
-
} | {
|
|
18
|
-
type: "text_end";
|
|
19
|
-
contentIndex: number;
|
|
20
|
-
content: string;
|
|
21
|
-
textSignature?: string;
|
|
22
|
-
} | {
|
|
23
|
-
type: "thinking_start";
|
|
24
|
-
contentIndex: number;
|
|
25
|
-
content: ThinkingContent;
|
|
26
|
-
} | {
|
|
27
|
-
type: "thinking_delta";
|
|
28
|
-
contentIndex: number;
|
|
29
|
-
delta: string;
|
|
30
|
-
} | {
|
|
31
|
-
type: "thinking_end";
|
|
32
|
-
contentIndex: number;
|
|
33
|
-
content: string;
|
|
34
|
-
thinkingSignature?: string;
|
|
35
|
-
redacted?: boolean;
|
|
36
|
-
} | {
|
|
37
|
-
type: "toolcall_start";
|
|
38
|
-
contentIndex: number;
|
|
39
|
-
toolCall: ToolCall;
|
|
40
|
-
} | {
|
|
41
|
-
type: "toolcall_checkpoint";
|
|
42
|
-
contentIndex: number;
|
|
43
|
-
json: string;
|
|
44
|
-
} | {
|
|
45
|
-
type: "toolcall_delta";
|
|
46
|
-
contentIndex: number;
|
|
47
|
-
delta: string;
|
|
48
|
-
} | {
|
|
49
|
-
type: "toolcall_end";
|
|
50
|
-
contentIndex: number;
|
|
51
|
-
id: string;
|
|
52
|
-
name: string;
|
|
53
|
-
arguments: ToolCall["arguments"];
|
|
54
|
-
thoughtSignature?: string;
|
|
55
|
-
namespace?: string;
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Encodes one assistant stream. `partial` remains a shared live accumulator;
|
|
59
|
-
* the encoder uses per-block offsets to avoid replaying deltas already visible
|
|
60
|
-
* when an older queued event is consumed.
|
|
61
|
-
*/
|
|
62
|
-
export declare class AssistantMessageFrameEncoder {
|
|
63
|
-
private started;
|
|
64
|
-
private terminal;
|
|
65
|
-
private readonly blocks;
|
|
66
|
-
encode(event: AssistantMessageEvent): AssistantMessageFrame | undefined;
|
|
67
|
-
private startBlock;
|
|
68
|
-
private block;
|
|
69
|
-
private endBlock;
|
|
70
|
-
private encodeTextDelta;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Replay compact frames without mutating them. Returns `undefined` when the
|
|
74
|
-
* iterable contains no start frame.
|
|
75
|
-
*/
|
|
76
|
-
export declare function reduceAssistantMessageFrames(frames: Iterable<AssistantMessageFrame>): AssistantMessage | undefined;
|
|
77
|
-
//# sourceMappingURL=assistant-message-frame.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-message-frame.d.ts","sourceRoot":"","sources":["../../src/utils/assistant-message-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnH;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CAClB,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAqGL;;;;GAIG;AACH,qBAAa,4BAA4B;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,GAAG,SAAS,CA6ItE;IAED,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,eAAe;CAgBvB;AA0CD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,gBAAgB,GAAG,SAAS,CAsHlH"}
|
|
@@ -1,425 +0,0 @@
|
|
|
1
|
-
import { parseStreamingJson } from "./json-parse.js";
|
|
2
|
-
function cloneTextContent(content) {
|
|
3
|
-
return {
|
|
4
|
-
type: "text",
|
|
5
|
-
text: content.text,
|
|
6
|
-
...(content.textSignature === undefined ? {} : { textSignature: content.textSignature }),
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
function cloneThinkingContent(content) {
|
|
10
|
-
return {
|
|
11
|
-
type: "thinking",
|
|
12
|
-
thinking: content.thinking,
|
|
13
|
-
...(content.thinkingSignature === undefined ? {} : { thinkingSignature: content.thinkingSignature }),
|
|
14
|
-
...(content.redacted === undefined ? {} : { redacted: content.redacted }),
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function cloneToolCall(toolCall) {
|
|
18
|
-
return {
|
|
19
|
-
type: "toolCall",
|
|
20
|
-
id: toolCall.id,
|
|
21
|
-
name: toolCall.name,
|
|
22
|
-
arguments: structuredClone(toolCall.arguments),
|
|
23
|
-
...(toolCall.thoughtSignature === undefined ? {} : { thoughtSignature: toolCall.thoughtSignature }),
|
|
24
|
-
...(toolCall.namespace === undefined ? {} : { namespace: toolCall.namespace }),
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
function cloneStartMessage(message) {
|
|
28
|
-
return {
|
|
29
|
-
role: "assistant",
|
|
30
|
-
content: [],
|
|
31
|
-
api: message.api,
|
|
32
|
-
provider: message.provider,
|
|
33
|
-
model: message.model,
|
|
34
|
-
...(message.responseModel === undefined ? {} : { responseModel: message.responseModel }),
|
|
35
|
-
...(message.responseId === undefined ? {} : { responseId: message.responseId }),
|
|
36
|
-
...(message.providerThinkingLevel === undefined ? {} : { providerThinkingLevel: message.providerThinkingLevel }),
|
|
37
|
-
...(message.diagnostics === undefined ? {} : { diagnostics: structuredClone(message.diagnostics) }),
|
|
38
|
-
usage: structuredClone(message.usage),
|
|
39
|
-
stopReason: "pending",
|
|
40
|
-
timestamp: message.timestamp,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function assertContentIndex(contentIndex) {
|
|
44
|
-
if (!Number.isSafeInteger(contentIndex) || contentIndex < 0) {
|
|
45
|
-
throw new Error(`Invalid assistant message frame contentIndex: ${contentIndex}`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
function eventBlock(event) {
|
|
49
|
-
assertContentIndex(event.contentIndex);
|
|
50
|
-
const block = event.partial.content[event.contentIndex];
|
|
51
|
-
if (!block) {
|
|
52
|
-
throw new Error(`${event.type} event has no content block at index ${event.contentIndex}`);
|
|
53
|
-
}
|
|
54
|
-
return block;
|
|
55
|
-
}
|
|
56
|
-
function serializedArguments(argumentsValue) {
|
|
57
|
-
const serialized = JSON.stringify(argumentsValue);
|
|
58
|
-
if (serialized === undefined)
|
|
59
|
-
throw new Error("Tool-call arguments are not JSON-serializable");
|
|
60
|
-
return serialized;
|
|
61
|
-
}
|
|
62
|
-
const EMPTY_PARSED_TOOL_ARGUMENTS = serializedArguments(parseStreamingJson(""));
|
|
63
|
-
function isJsonPrefix(snapshot, current) {
|
|
64
|
-
if (typeof snapshot === "string")
|
|
65
|
-
return typeof current === "string" && current.startsWith(snapshot);
|
|
66
|
-
if (Array.isArray(snapshot)) {
|
|
67
|
-
return (Array.isArray(current) &&
|
|
68
|
-
snapshot.length <= current.length &&
|
|
69
|
-
snapshot.every((value, index) => isJsonPrefix(value, current[index])));
|
|
70
|
-
}
|
|
71
|
-
if (typeof snapshot !== "object" || snapshot === null)
|
|
72
|
-
return Object.is(snapshot, current);
|
|
73
|
-
if (typeof current !== "object" || current === null || Array.isArray(current))
|
|
74
|
-
return false;
|
|
75
|
-
const currentRecord = current;
|
|
76
|
-
return Object.entries(snapshot).every(([key, value]) => Object.hasOwn(currentRecord, key) && isJsonPrefix(value, currentRecord[key]));
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Encodes one assistant stream. `partial` remains a shared live accumulator;
|
|
80
|
-
* the encoder uses per-block offsets to avoid replaying deltas already visible
|
|
81
|
-
* when an older queued event is consumed.
|
|
82
|
-
*/
|
|
83
|
-
export class AssistantMessageFrameEncoder {
|
|
84
|
-
started = false;
|
|
85
|
-
terminal = false;
|
|
86
|
-
blocks = new Map();
|
|
87
|
-
encode(event) {
|
|
88
|
-
if (this.terminal)
|
|
89
|
-
throw new Error(`Assistant message event ${event.type} follows a terminal event`);
|
|
90
|
-
switch (event.type) {
|
|
91
|
-
case "start":
|
|
92
|
-
if (this.started)
|
|
93
|
-
throw new Error("Assistant message stream contains more than one start event");
|
|
94
|
-
this.started = true;
|
|
95
|
-
return { type: "start", partial: cloneStartMessage(event.partial) };
|
|
96
|
-
case "done":
|
|
97
|
-
if (!this.started)
|
|
98
|
-
throw new Error("Assistant message done event appears before start");
|
|
99
|
-
this.terminal = true;
|
|
100
|
-
return undefined;
|
|
101
|
-
case "error":
|
|
102
|
-
this.terminal = true;
|
|
103
|
-
return undefined;
|
|
104
|
-
}
|
|
105
|
-
if (!this.started)
|
|
106
|
-
throw new Error(`Assistant message ${event.type} event appears before start`);
|
|
107
|
-
switch (event.type) {
|
|
108
|
-
case "text_start": {
|
|
109
|
-
const content = eventBlock(event);
|
|
110
|
-
if (content.type !== "text") {
|
|
111
|
-
throw new Error(`text_start event points to ${content.type} block at index ${event.contentIndex}`);
|
|
112
|
-
}
|
|
113
|
-
this.startBlock(event.contentIndex, {
|
|
114
|
-
kind: "text",
|
|
115
|
-
coveredChars: content.text.length,
|
|
116
|
-
deltaChars: 0,
|
|
117
|
-
});
|
|
118
|
-
return { type: "text_start", contentIndex: event.contentIndex, content: cloneTextContent(content) };
|
|
119
|
-
}
|
|
120
|
-
case "text_delta":
|
|
121
|
-
return this.encodeTextDelta(event.contentIndex, event.delta, "text");
|
|
122
|
-
case "text_end": {
|
|
123
|
-
const content = eventBlock(event);
|
|
124
|
-
if (content.type !== "text") {
|
|
125
|
-
throw new Error(`text_end event points to ${content.type} block at index ${event.contentIndex}`);
|
|
126
|
-
}
|
|
127
|
-
this.endBlock(event.contentIndex, "text");
|
|
128
|
-
return {
|
|
129
|
-
type: "text_end",
|
|
130
|
-
contentIndex: event.contentIndex,
|
|
131
|
-
content: event.content,
|
|
132
|
-
...(content.textSignature === undefined ? {} : { textSignature: content.textSignature }),
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
case "thinking_start": {
|
|
136
|
-
const content = eventBlock(event);
|
|
137
|
-
if (content.type !== "thinking") {
|
|
138
|
-
throw new Error(`thinking_start event points to ${content.type} block at index ${event.contentIndex}`);
|
|
139
|
-
}
|
|
140
|
-
this.startBlock(event.contentIndex, {
|
|
141
|
-
kind: "thinking",
|
|
142
|
-
coveredChars: content.thinking.length,
|
|
143
|
-
deltaChars: 0,
|
|
144
|
-
});
|
|
145
|
-
return {
|
|
146
|
-
type: "thinking_start",
|
|
147
|
-
contentIndex: event.contentIndex,
|
|
148
|
-
content: cloneThinkingContent(content),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
case "thinking_delta":
|
|
152
|
-
return this.encodeTextDelta(event.contentIndex, event.delta, "thinking");
|
|
153
|
-
case "thinking_end": {
|
|
154
|
-
const content = eventBlock(event);
|
|
155
|
-
if (content.type !== "thinking") {
|
|
156
|
-
throw new Error(`thinking_end event points to ${content.type} block at index ${event.contentIndex}`);
|
|
157
|
-
}
|
|
158
|
-
this.endBlock(event.contentIndex, "thinking");
|
|
159
|
-
return {
|
|
160
|
-
type: "thinking_end",
|
|
161
|
-
contentIndex: event.contentIndex,
|
|
162
|
-
content: event.content,
|
|
163
|
-
...(content.thinkingSignature === undefined ? {} : { thinkingSignature: content.thinkingSignature }),
|
|
164
|
-
...(content.redacted === undefined ? {} : { redacted: content.redacted }),
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
case "toolcall_start": {
|
|
168
|
-
const content = eventBlock(event);
|
|
169
|
-
if (content.type !== "toolCall") {
|
|
170
|
-
throw new Error(`toolcall_start event points to ${content.type} block at index ${event.contentIndex}`);
|
|
171
|
-
}
|
|
172
|
-
const snapshotArguments = serializedArguments(content.arguments);
|
|
173
|
-
const caughtUp = snapshotArguments === EMPTY_PARSED_TOOL_ARGUMENTS;
|
|
174
|
-
this.startBlock(event.contentIndex, {
|
|
175
|
-
kind: "toolCall",
|
|
176
|
-
caughtUp,
|
|
177
|
-
catchupJson: "",
|
|
178
|
-
snapshotArguments: caughtUp ? "" : snapshotArguments,
|
|
179
|
-
});
|
|
180
|
-
return { type: "toolcall_start", contentIndex: event.contentIndex, toolCall: cloneToolCall(content) };
|
|
181
|
-
}
|
|
182
|
-
case "toolcall_delta": {
|
|
183
|
-
const state = this.block(event.contentIndex, "toolCall");
|
|
184
|
-
if (state.kind !== "toolCall")
|
|
185
|
-
throw new Error("Unreachable tool-call encoder state");
|
|
186
|
-
if (state.caughtUp) {
|
|
187
|
-
return event.delta.length === 0
|
|
188
|
-
? undefined
|
|
189
|
-
: { type: "toolcall_delta", contentIndex: event.contentIndex, delta: event.delta };
|
|
190
|
-
}
|
|
191
|
-
state.catchupJson += event.delta;
|
|
192
|
-
const argumentsValue = parseStreamingJson(state.catchupJson);
|
|
193
|
-
if (serializedArguments(argumentsValue) !== state.snapshotArguments) {
|
|
194
|
-
// Legacy grammar calls include the initial input in toolcall_start, but their
|
|
195
|
-
// JSON delta stream still begins at an empty input. Its parsed arguments can
|
|
196
|
-
// therefore extend, rather than exactly reproduce, the start snapshot.
|
|
197
|
-
const snapshotArguments = parseStreamingJson(state.snapshotArguments);
|
|
198
|
-
if (!isJsonPrefix(snapshotArguments, argumentsValue))
|
|
199
|
-
return undefined;
|
|
200
|
-
}
|
|
201
|
-
state.caughtUp = true;
|
|
202
|
-
state.snapshotArguments = "";
|
|
203
|
-
const json = state.catchupJson;
|
|
204
|
-
state.catchupJson = "";
|
|
205
|
-
return json.length === 0
|
|
206
|
-
? undefined
|
|
207
|
-
: { type: "toolcall_checkpoint", contentIndex: event.contentIndex, json };
|
|
208
|
-
}
|
|
209
|
-
case "toolcall_end": {
|
|
210
|
-
const content = eventBlock(event);
|
|
211
|
-
if (content.type !== "toolCall") {
|
|
212
|
-
throw new Error(`toolcall_end event points to ${content.type} block at index ${event.contentIndex}`);
|
|
213
|
-
}
|
|
214
|
-
if (event.toolCall.type !== "toolCall") {
|
|
215
|
-
throw new Error(`toolcall_end event has invalid tool call at index ${event.contentIndex}`);
|
|
216
|
-
}
|
|
217
|
-
this.endBlock(event.contentIndex, "toolCall");
|
|
218
|
-
return {
|
|
219
|
-
type: "toolcall_end",
|
|
220
|
-
contentIndex: event.contentIndex,
|
|
221
|
-
id: event.toolCall.id,
|
|
222
|
-
name: event.toolCall.name,
|
|
223
|
-
arguments: structuredClone(event.toolCall.arguments),
|
|
224
|
-
...(event.toolCall.thoughtSignature === undefined
|
|
225
|
-
? {}
|
|
226
|
-
: { thoughtSignature: event.toolCall.thoughtSignature }),
|
|
227
|
-
...(event.toolCall.namespace === undefined ? {} : { namespace: event.toolCall.namespace }),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
startBlock(contentIndex, state) {
|
|
233
|
-
assertContentIndex(contentIndex);
|
|
234
|
-
if (this.blocks.has(contentIndex)) {
|
|
235
|
-
throw new Error(`Assistant message block ${contentIndex} starts more than once`);
|
|
236
|
-
}
|
|
237
|
-
this.blocks.set(contentIndex, state);
|
|
238
|
-
}
|
|
239
|
-
block(contentIndex, kind) {
|
|
240
|
-
assertContentIndex(contentIndex);
|
|
241
|
-
const state = this.blocks.get(contentIndex);
|
|
242
|
-
if (state === undefined)
|
|
243
|
-
throw new Error(`Assistant message ${kind} block ${contentIndex} has not started`);
|
|
244
|
-
if (state.kind !== kind) {
|
|
245
|
-
throw new Error(`Assistant message block ${contentIndex} is ${state.kind}, not ${kind}`);
|
|
246
|
-
}
|
|
247
|
-
return state;
|
|
248
|
-
}
|
|
249
|
-
endBlock(contentIndex, kind) {
|
|
250
|
-
this.block(contentIndex, kind);
|
|
251
|
-
this.blocks.delete(contentIndex);
|
|
252
|
-
}
|
|
253
|
-
encodeTextDelta(contentIndex, delta, kind) {
|
|
254
|
-
const state = this.block(contentIndex, kind);
|
|
255
|
-
if (state.kind === "toolCall")
|
|
256
|
-
throw new Error("Unreachable text encoder state");
|
|
257
|
-
const deltaStart = state.deltaChars;
|
|
258
|
-
state.deltaChars += delta.length;
|
|
259
|
-
const covered = Math.max(0, state.coveredChars - deltaStart);
|
|
260
|
-
if (covered >= delta.length)
|
|
261
|
-
return undefined;
|
|
262
|
-
const uncovered = covered === 0 ? delta : delta.slice(covered);
|
|
263
|
-
return kind === "text"
|
|
264
|
-
? { type: "text_delta", contentIndex, delta: uncovered }
|
|
265
|
-
: { type: "thinking_delta", contentIndex, delta: uncovered };
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
function appendBlock(message, states, contentIndex, block, state) {
|
|
269
|
-
assertContentIndex(contentIndex);
|
|
270
|
-
if (contentIndex !== message.content.length) {
|
|
271
|
-
const reason = contentIndex < message.content.length ? "already exists" : "would leave a gap";
|
|
272
|
-
throw new Error(`Cannot start assistant message block at index ${contentIndex}: ${reason}`);
|
|
273
|
-
}
|
|
274
|
-
message.content.push(structuredClone(block));
|
|
275
|
-
states.set(contentIndex, state);
|
|
276
|
-
}
|
|
277
|
-
function activeBlock(message, states, contentIndex, expectedKind, frameType) {
|
|
278
|
-
assertContentIndex(contentIndex);
|
|
279
|
-
const state = states.get(contentIndex);
|
|
280
|
-
const block = message.content[contentIndex];
|
|
281
|
-
if (!state || !block) {
|
|
282
|
-
throw new Error(`${frameType} frame has no started block at index ${contentIndex}`);
|
|
283
|
-
}
|
|
284
|
-
if (state.kind !== expectedKind || block.type !== expectedKind) {
|
|
285
|
-
throw new Error(`${frameType} frame expected ${expectedKind} block at index ${contentIndex}, found ${block.type}`);
|
|
286
|
-
}
|
|
287
|
-
if (state.ended) {
|
|
288
|
-
throw new Error(`${frameType} frame follows the end of block at index ${contentIndex}`);
|
|
289
|
-
}
|
|
290
|
-
return { block, state };
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Replay compact frames without mutating them. Returns `undefined` when the
|
|
294
|
-
* iterable contains no start frame.
|
|
295
|
-
*/
|
|
296
|
-
export function reduceAssistantMessageFrames(frames) {
|
|
297
|
-
let message;
|
|
298
|
-
let frameBeforeStart;
|
|
299
|
-
const states = new Map();
|
|
300
|
-
for (const frame of frames) {
|
|
301
|
-
if (frame.type === "start") {
|
|
302
|
-
if (message)
|
|
303
|
-
throw new Error("Assistant message frame sequence contains more than one start frame");
|
|
304
|
-
if (frameBeforeStart !== undefined)
|
|
305
|
-
throw new Error(`${frameBeforeStart} frame appears before the start frame`);
|
|
306
|
-
message = structuredClone(frame.partial);
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
309
|
-
if (!message) {
|
|
310
|
-
frameBeforeStart ??= frame.type;
|
|
311
|
-
continue;
|
|
312
|
-
}
|
|
313
|
-
switch (frame.type) {
|
|
314
|
-
case "text_start":
|
|
315
|
-
if (frame.content.type !== "text") {
|
|
316
|
-
throw new Error(`text_start frame contains ${frame.content.type} content`);
|
|
317
|
-
}
|
|
318
|
-
appendBlock(message, states, frame.contentIndex, frame.content, { kind: "text", ended: false });
|
|
319
|
-
break;
|
|
320
|
-
case "text_delta": {
|
|
321
|
-
const { block } = activeBlock(message, states, frame.contentIndex, "text", frame.type);
|
|
322
|
-
if (block.type !== "text")
|
|
323
|
-
throw new Error("Unreachable text frame state");
|
|
324
|
-
block.text += frame.delta;
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
case "text_end": {
|
|
328
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "text", frame.type);
|
|
329
|
-
if (block.type !== "text")
|
|
330
|
-
throw new Error("Unreachable text frame state");
|
|
331
|
-
block.text = frame.content;
|
|
332
|
-
delete block.textSignature;
|
|
333
|
-
if (frame.textSignature !== undefined)
|
|
334
|
-
block.textSignature = frame.textSignature;
|
|
335
|
-
state.ended = true;
|
|
336
|
-
break;
|
|
337
|
-
}
|
|
338
|
-
case "thinking_start":
|
|
339
|
-
if (frame.content.type !== "thinking") {
|
|
340
|
-
throw new Error(`thinking_start frame contains ${frame.content.type} content`);
|
|
341
|
-
}
|
|
342
|
-
appendBlock(message, states, frame.contentIndex, frame.content, {
|
|
343
|
-
kind: "thinking",
|
|
344
|
-
ended: false,
|
|
345
|
-
});
|
|
346
|
-
break;
|
|
347
|
-
case "thinking_delta": {
|
|
348
|
-
const { block } = activeBlock(message, states, frame.contentIndex, "thinking", frame.type);
|
|
349
|
-
if (block.type !== "thinking")
|
|
350
|
-
throw new Error("Unreachable thinking frame state");
|
|
351
|
-
block.thinking += frame.delta;
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
case "thinking_end": {
|
|
355
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "thinking", frame.type);
|
|
356
|
-
if (block.type !== "thinking")
|
|
357
|
-
throw new Error("Unreachable thinking frame state");
|
|
358
|
-
block.thinking = frame.content;
|
|
359
|
-
delete block.thinkingSignature;
|
|
360
|
-
delete block.redacted;
|
|
361
|
-
if (frame.thinkingSignature !== undefined)
|
|
362
|
-
block.thinkingSignature = frame.thinkingSignature;
|
|
363
|
-
if (frame.redacted !== undefined)
|
|
364
|
-
block.redacted = frame.redacted;
|
|
365
|
-
state.ended = true;
|
|
366
|
-
break;
|
|
367
|
-
}
|
|
368
|
-
case "toolcall_start":
|
|
369
|
-
if (frame.toolCall.type !== "toolCall") {
|
|
370
|
-
throw new Error(`toolcall_start frame contains ${frame.toolCall.type} content`);
|
|
371
|
-
}
|
|
372
|
-
appendBlock(message, states, frame.contentIndex, frame.toolCall, {
|
|
373
|
-
kind: "toolCall",
|
|
374
|
-
ended: false,
|
|
375
|
-
json: "",
|
|
376
|
-
});
|
|
377
|
-
break;
|
|
378
|
-
case "toolcall_checkpoint": {
|
|
379
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "toolCall", frame.type);
|
|
380
|
-
if (block.type !== "toolCall" || state.kind !== "toolCall") {
|
|
381
|
-
throw new Error("Unreachable tool-call checkpoint state");
|
|
382
|
-
}
|
|
383
|
-
state.json = frame.json;
|
|
384
|
-
block.arguments = parseStreamingJson(frame.json);
|
|
385
|
-
break;
|
|
386
|
-
}
|
|
387
|
-
case "toolcall_delta": {
|
|
388
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "toolCall", frame.type);
|
|
389
|
-
if (block.type !== "toolCall" || state.kind !== "toolCall") {
|
|
390
|
-
throw new Error("Unreachable tool-call frame state");
|
|
391
|
-
}
|
|
392
|
-
state.json += frame.delta;
|
|
393
|
-
break;
|
|
394
|
-
}
|
|
395
|
-
case "toolcall_end": {
|
|
396
|
-
const { block, state } = activeBlock(message, states, frame.contentIndex, "toolCall", frame.type);
|
|
397
|
-
if (block.type !== "toolCall")
|
|
398
|
-
throw new Error("Unreachable tool-call frame state");
|
|
399
|
-
block.id = frame.id;
|
|
400
|
-
block.name = frame.name;
|
|
401
|
-
block.arguments = structuredClone(frame.arguments);
|
|
402
|
-
delete block.thoughtSignature;
|
|
403
|
-
delete block.namespace;
|
|
404
|
-
if (frame.thoughtSignature !== undefined)
|
|
405
|
-
block.thoughtSignature = frame.thoughtSignature;
|
|
406
|
-
if (frame.namespace !== undefined)
|
|
407
|
-
block.namespace = frame.namespace;
|
|
408
|
-
state.ended = true;
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
if (!message)
|
|
414
|
-
return undefined;
|
|
415
|
-
for (const [contentIndex, state] of states) {
|
|
416
|
-
if (state.kind !== "toolCall" || state.ended || state.json.length === 0)
|
|
417
|
-
continue;
|
|
418
|
-
const block = message.content[contentIndex];
|
|
419
|
-
if (block?.type !== "toolCall")
|
|
420
|
-
throw new Error("Unreachable tool-call frame state");
|
|
421
|
-
block.arguments = parseStreamingJson(state.json);
|
|
422
|
-
}
|
|
423
|
-
return message;
|
|
424
|
-
}
|
|
425
|
-
//# sourceMappingURL=assistant-message-frame.js.map
|