@copilotkit/runtime 1.57.3 → 1.58.0-canary.thread-id-propagation
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/dist/lib/observability.d.cts +1 -1
- package/dist/lib/observability.d.cts.map +1 -1
- package/dist/lib/observability.d.mts +1 -1
- package/dist/lib/observability.d.mts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.cjs +2 -0
- package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.mjs +2 -0
- package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
- package/dist/package.cjs +5 -8
- package/dist/package.mjs +5 -8
- package/dist/v2/runtime/core/runtime.cjs +4 -1
- package/dist/v2/runtime/core/runtime.cjs.map +1 -1
- package/dist/v2/runtime/core/runtime.d.cts.map +1 -1
- package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
- package/dist/v2/runtime/core/runtime.mjs +4 -1
- package/dist/v2/runtime/core/runtime.mjs.map +1 -1
- package/dist/v2/runtime/handlers/get-runtime-info.cjs +1 -1
- package/dist/v2/runtime/handlers/get-runtime-info.mjs +1 -1
- package/dist/v2/runtime/handlers/handle-connect.cjs +1 -1
- package/dist/v2/runtime/handlers/handle-connect.mjs +1 -1
- package/dist/v2/runtime/handlers/handle-run.cjs +1 -1
- package/dist/v2/runtime/handlers/handle-run.mjs +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.cjs +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.cjs.map +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.mjs +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.mjs.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.cjs +22 -6
- package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.mjs +27 -11
- package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
- package/package.json +9 -19
- package/skills/runtime/SKILL.md +98 -0
- package/skills/runtime/references/agent-runners-custom.md +161 -0
- package/skills/runtime/references/agent-runners-in-memory.md +64 -0
- package/skills/runtime/references/agent-runners-sqlite.md +90 -0
- package/skills/runtime/references/agent-runners.md +304 -0
- package/skills/runtime/references/built-in-agent-factory-modes.md +232 -0
- package/skills/runtime/references/built-in-agent-helper-utilities.md +123 -0
- package/skills/runtime/references/built-in-agent-model-identifiers.md +59 -0
- package/skills/runtime/references/built-in-agent.md +523 -0
- package/skills/runtime/references/intelligence-mode.md +336 -0
- package/skills/runtime/references/middleware.md +376 -0
- package/skills/runtime/references/server-side-tools.md +414 -0
- package/skills/runtime/references/setup-endpoint.md +503 -0
- package/skills/runtime/references/transcription.md +287 -0
- package/skills/runtime/references/wiring-a2a.md +40 -0
- package/skills/runtime/references/wiring-adk.md +45 -0
- package/skills/runtime/references/wiring-ag2.md +41 -0
- package/skills/runtime/references/wiring-agno.md +39 -0
- package/skills/runtime/references/wiring-aws-strands.md +59 -0
- package/skills/runtime/references/wiring-crewai-crews.md +51 -0
- package/skills/runtime/references/wiring-crewai-flows.md +45 -0
- package/skills/runtime/references/wiring-external-agents.md +348 -0
- package/skills/runtime/references/wiring-langgraph.md +50 -0
- package/skills/runtime/references/wiring-llamaindex.md +39 -0
- package/skills/runtime/references/wiring-mastra.md +70 -0
- package/skills/runtime/references/wiring-mcp-apps-middleware.md +68 -0
- package/skills/runtime/references/wiring-ms-agent-framework.md +41 -0
- package/skills/runtime/references/wiring-pydantic-ai.md +45 -0
- package/CHANGELOG.md +0 -3624
- package/__snapshots__/schema/schema.graphql +0 -371
- package/dist/v2/runtime/telemetry/scarf-client.cjs +0 -32
- package/dist/v2/runtime/telemetry/scarf-client.cjs.map +0 -1
- package/dist/v2/runtime/telemetry/scarf-client.mjs +0 -32
- package/dist/v2/runtime/telemetry/scarf-client.mjs.map +0 -1
- package/scripts/generate-gql-schema.ts +0 -16
- package/src/agent/__tests__/agent-test-helpers.ts +0 -476
- package/src/agent/__tests__/agent.test.ts +0 -593
- package/src/agent/__tests__/ai-sdk-v6-compat.test.ts +0 -116
- package/src/agent/__tests__/basic-agent.test.ts +0 -1698
- package/src/agent/__tests__/capabilities.test.ts +0 -81
- package/src/agent/__tests__/config-tools-execution.test.ts +0 -516
- package/src/agent/__tests__/converter-aisdk.test.ts +0 -692
- package/src/agent/__tests__/converter-custom.test.ts +0 -319
- package/src/agent/__tests__/converter-tanstack-input.test.ts +0 -211
- package/src/agent/__tests__/converter-tanstack.test.ts +0 -594
- package/src/agent/__tests__/mcp-clients.test.ts +0 -246
- package/src/agent/__tests__/mcp-servers-integration.test.ts +0 -373
- package/src/agent/__tests__/multimodal-tanstack.test.ts +0 -284
- package/src/agent/__tests__/multimodal.test.ts +0 -176
- package/src/agent/__tests__/property-overrides.test.ts +0 -598
- package/src/agent/__tests__/provider-id-collision.test.ts +0 -195
- package/src/agent/__tests__/standard-schema-tools.test.ts +0 -313
- package/src/agent/__tests__/standard-schema-types.test.ts +0 -158
- package/src/agent/__tests__/state-tools.test.ts +0 -436
- package/src/agent/__tests__/test-helpers.ts +0 -197
- package/src/agent/__tests__/utils.test.ts +0 -536
- package/src/agent/__tests__/zod-regression.test.ts +0 -350
- package/src/agent/converters/aisdk.ts +0 -326
- package/src/agent/converters/index.ts +0 -7
- package/src/agent/converters/tanstack.ts +0 -451
- package/src/agent/index.ts +0 -1743
- package/src/agents/langgraph/__tests__/event-source.test.ts +0 -256
- package/src/agents/langgraph/event-source.ts +0 -365
- package/src/agents/langgraph/events.ts +0 -394
- package/src/graphql/inputs/action.input.ts +0 -16
- package/src/graphql/inputs/agent-session.input.ts +0 -13
- package/src/graphql/inputs/agent-state.input.ts +0 -13
- package/src/graphql/inputs/cloud-guardrails.input.ts +0 -16
- package/src/graphql/inputs/cloud.input.ts +0 -8
- package/src/graphql/inputs/context-property.input.ts +0 -10
- package/src/graphql/inputs/copilot-context.input.ts +0 -10
- package/src/graphql/inputs/custom-property.input.ts +0 -15
- package/src/graphql/inputs/extensions.input.ts +0 -21
- package/src/graphql/inputs/forwarded-parameters.input.ts +0 -22
- package/src/graphql/inputs/frontend.input.ts +0 -14
- package/src/graphql/inputs/generate-copilot-response.input.ts +0 -59
- package/src/graphql/inputs/load-agent-state.input.ts +0 -10
- package/src/graphql/inputs/message.input.ts +0 -110
- package/src/graphql/inputs/meta-event.input.ts +0 -18
- package/src/graphql/message-conversion/agui-to-gql.test.ts +0 -1384
- package/src/graphql/message-conversion/agui-to-gql.ts +0 -384
- package/src/graphql/message-conversion/gql-to-agui.test.ts +0 -1653
- package/src/graphql/message-conversion/gql-to-agui.ts +0 -297
- package/src/graphql/message-conversion/index.ts +0 -2
- package/src/graphql/message-conversion/roundtrip-conversion.test.ts +0 -561
- package/src/graphql/resolvers/__tests__/resolve-message-id.test.ts +0 -25
- package/src/graphql/resolvers/copilot.resolver.ts +0 -785
- package/src/graphql/resolvers/resolve-message-id.ts +0 -14
- package/src/graphql/resolvers/state.resolver.ts +0 -30
- package/src/graphql/types/agents-response.type.ts +0 -19
- package/src/graphql/types/base/index.ts +0 -10
- package/src/graphql/types/converted/index.ts +0 -183
- package/src/graphql/types/copilot-response.type.ts +0 -141
- package/src/graphql/types/enums.ts +0 -38
- package/src/graphql/types/extensions-response.type.ts +0 -23
- package/src/graphql/types/guardrails-result.type.ts +0 -20
- package/src/graphql/types/load-agent-state-response.type.ts +0 -17
- package/src/graphql/types/message-status.type.ts +0 -48
- package/src/graphql/types/meta-events.type.ts +0 -78
- package/src/graphql/types/response-status.type.ts +0 -77
- package/src/index.ts +0 -3
- package/src/langgraph.ts +0 -1
- package/src/lib/__tests__/telemetry-disclosure.test.ts +0 -55
- package/src/lib/cloud/index.ts +0 -4
- package/src/lib/error-messages.ts +0 -211
- package/src/lib/index.ts +0 -52
- package/src/lib/integrations/index.ts +0 -6
- package/src/lib/integrations/nest/index.ts +0 -21
- package/src/lib/integrations/nextjs/app-router.ts +0 -47
- package/src/lib/integrations/nextjs/pages-router.ts +0 -45
- package/src/lib/integrations/node-express/index.ts +0 -21
- package/src/lib/integrations/node-http/__tests__/request-duck-type.test.ts +0 -66
- package/src/lib/integrations/node-http/index.ts +0 -187
- package/src/lib/integrations/node-http/request-handler.ts +0 -128
- package/src/lib/integrations/shared.ts +0 -112
- package/src/lib/logger.ts +0 -31
- package/src/lib/observability.ts +0 -167
- package/src/lib/runtime/__tests__/copilot-runtime-error.test.ts +0 -183
- package/src/lib/runtime/__tests__/handle-service-adapter.test.ts +0 -108
- package/src/lib/runtime/__tests__/mcp-tools-utils.test.ts +0 -499
- package/src/lib/runtime/__tests__/on-after-request.test.ts +0 -122
- package/src/lib/runtime/__tests__/retry-utils.test.ts +0 -137
- package/src/lib/runtime/__tests__/v1-agent-factory.test.ts +0 -109
- package/src/lib/runtime/agent-integrations/langgraph/__tests__/dispatch-event-filtering.test.ts +0 -345
- package/src/lib/runtime/agent-integrations/langgraph/__tests__/run-message-filtering.test.ts +0 -156
- package/src/lib/runtime/agent-integrations/langgraph/agent.ts +0 -263
- package/src/lib/runtime/agent-integrations/langgraph/consts.ts +0 -37
- package/src/lib/runtime/agent-integrations/langgraph/index.ts +0 -2
- package/src/lib/runtime/copilot-runtime.ts +0 -863
- package/src/lib/runtime/mcp-tools-utils.ts +0 -313
- package/src/lib/runtime/retry-utils.ts +0 -141
- package/src/lib/runtime/telemetry-agent-runner.ts +0 -151
- package/src/lib/runtime/types.ts +0 -48
- package/src/lib/runtime/utils.ts +0 -93
- package/src/lib/streaming.ts +0 -220
- package/src/lib/telemetry-client.ts +0 -66
- package/src/lib/telemetry-disclosure.ts +0 -53
- package/src/service-adapters/anthropic/anthropic-adapter.ts +0 -532
- package/src/service-adapters/anthropic/utils.ts +0 -219
- package/src/service-adapters/bedrock/bedrock-adapter.ts +0 -73
- package/src/service-adapters/conversion.test.ts +0 -56
- package/src/service-adapters/conversion.ts +0 -69
- package/src/service-adapters/empty/empty-adapter.ts +0 -38
- package/src/service-adapters/events.ts +0 -337
- package/src/service-adapters/experimental/ollama/ollama-adapter.ts +0 -84
- package/src/service-adapters/google/google-genai-adapter.test.ts +0 -151
- package/src/service-adapters/google/google-genai-adapter.ts +0 -95
- package/src/service-adapters/groq/groq-adapter.ts +0 -229
- package/src/service-adapters/index.ts +0 -18
- package/src/service-adapters/langchain/langchain-adapter.ts +0 -113
- package/src/service-adapters/langchain/langserve.ts +0 -88
- package/src/service-adapters/langchain/types.ts +0 -20
- package/src/service-adapters/langchain/utils.ts +0 -330
- package/src/service-adapters/openai/__tests__/openai-v5-compat.test.ts +0 -177
- package/src/service-adapters/openai/openai-adapter.ts +0 -324
- package/src/service-adapters/openai/openai-assistant-adapter.ts +0 -385
- package/src/service-adapters/openai/utils.ts +0 -305
- package/src/service-adapters/service-adapter.ts +0 -50
- package/src/service-adapters/shared/error-utils.ts +0 -64
- package/src/service-adapters/shared/index.ts +0 -2
- package/src/service-adapters/shared/sdk-client-utils.ts +0 -19
- package/src/service-adapters/unify/unify-adapter.ts +0 -165
- package/src/utils/failed-response-status-reasons.ts +0 -70
- package/src/utils/index.ts +0 -1
- package/src/v2/express.ts +0 -1
- package/src/v2/hono.ts +0 -1
- package/src/v2/index.ts +0 -5
- package/src/v2/node.ts +0 -1
- package/src/v2/runtime/__tests__/agents-factory.test.ts +0 -136
- package/src/v2/runtime/__tests__/backward-compat.test.ts +0 -261
- package/src/v2/runtime/__tests__/code-review-fixes.test.ts +0 -500
- package/src/v2/runtime/__tests__/cors-credentials.test.ts +0 -320
- package/src/v2/runtime/__tests__/debug-sse-response.test.ts +0 -302
- package/src/v2/runtime/__tests__/express-adapter.test.ts +0 -188
- package/src/v2/runtime/__tests__/express-body-order.test.ts +0 -76
- package/src/v2/runtime/__tests__/express-fetch-bridge.test.ts +0 -344
- package/src/v2/runtime/__tests__/express-single-sse.test.ts +0 -122
- package/src/v2/runtime/__tests__/express-single-telemetry.integration.test.ts +0 -65
- package/src/v2/runtime/__tests__/express-telemetry.integration.test.ts +0 -101
- package/src/v2/runtime/__tests__/fetch-cors.test.ts +0 -205
- package/src/v2/runtime/__tests__/fetch-handler-validation.test.ts +0 -440
- package/src/v2/runtime/__tests__/fetch-handler.test.ts +0 -456
- package/src/v2/runtime/__tests__/fetch-router.test.ts +0 -276
- package/src/v2/runtime/__tests__/get-runtime-info.test.ts +0 -335
- package/src/v2/runtime/__tests__/handle-connect.test.ts +0 -585
- package/src/v2/runtime/__tests__/handle-run.test.ts +0 -1388
- package/src/v2/runtime/__tests__/handle-threads.test.ts +0 -930
- package/src/v2/runtime/__tests__/handle-transcribe.test.ts +0 -301
- package/src/v2/runtime/__tests__/header-utils.test.ts +0 -88
- package/src/v2/runtime/__tests__/hono-adapter.test.ts +0 -150
- package/src/v2/runtime/__tests__/hono-single-telemetry.integration.test.ts +0 -46
- package/src/v2/runtime/__tests__/hono-telemetry.integration.test.ts +0 -99
- package/src/v2/runtime/__tests__/hooks-edge-cases.test.ts +0 -457
- package/src/v2/runtime/__tests__/hooks.test.ts +0 -557
- package/src/v2/runtime/__tests__/in-process-agent-runner-messages.test.ts +0 -230
- package/src/v2/runtime/__tests__/in-process-agent-runner.test.ts +0 -1030
- package/src/v2/runtime/__tests__/integration/bun/bun-servers.integration.test.ts +0 -27
- package/src/v2/runtime/__tests__/integration/bun/elysia-multi.ts +0 -32
- package/src/v2/runtime/__tests__/integration/bun/elysia-single.ts +0 -33
- package/src/v2/runtime/__tests__/integration/bun/hono-bun-multi.ts +0 -25
- package/src/v2/runtime/__tests__/integration/bun/hono-bun-single.ts +0 -32
- package/src/v2/runtime/__tests__/integration/helpers/create-test-runtime.ts +0 -15
- package/src/v2/runtime/__tests__/integration/helpers/sse-reader.ts +0 -45
- package/src/v2/runtime/__tests__/integration/helpers/test-agent.ts +0 -58
- package/src/v2/runtime/__tests__/integration/node-servers.integration.test.ts +0 -58
- package/src/v2/runtime/__tests__/integration/servers/express-multi.ts +0 -35
- package/src/v2/runtime/__tests__/integration/servers/express-single.ts +0 -36
- package/src/v2/runtime/__tests__/integration/servers/fetch-direct.ts +0 -39
- package/src/v2/runtime/__tests__/integration/servers/hono-multi.ts +0 -30
- package/src/v2/runtime/__tests__/integration/servers/hono-single.ts +0 -37
- package/src/v2/runtime/__tests__/integration/servers/node-multi.ts +0 -45
- package/src/v2/runtime/__tests__/integration/servers/node-single.ts +0 -46
- package/src/v2/runtime/__tests__/integration/servers/types.ts +0 -18
- package/src/v2/runtime/__tests__/integration/suites/debug-events.suite.ts +0 -253
- package/src/v2/runtime/__tests__/integration/suites/multi-endpoint.suite.ts +0 -358
- package/src/v2/runtime/__tests__/integration/suites/single-endpoint.suite.ts +0 -363
- package/src/v2/runtime/__tests__/intelligence-run-telemetry.test.ts +0 -194
- package/src/v2/runtime/__tests__/mcp-apps-middleware-integration.test.ts +0 -275
- package/src/v2/runtime/__tests__/middleware-express.test.ts +0 -208
- package/src/v2/runtime/__tests__/middleware-single-express.test.ts +0 -213
- package/src/v2/runtime/__tests__/middleware-single.test.ts +0 -225
- package/src/v2/runtime/__tests__/middleware-sse-parser.test.ts +0 -237
- package/src/v2/runtime/__tests__/middleware.test.ts +0 -250
- package/src/v2/runtime/__tests__/node-fetch-handler.test.ts +0 -157
- package/src/v2/runtime/__tests__/open-generative-ui-middleware.e2e.test.ts +0 -728
- package/src/v2/runtime/__tests__/router-edge-cases.test.ts +0 -217
- package/src/v2/runtime/__tests__/routing-express.test.ts +0 -174
- package/src/v2/runtime/__tests__/routing-single-express.test.ts +0 -168
- package/src/v2/runtime/__tests__/routing-single.test.ts +0 -193
- package/src/v2/runtime/__tests__/routing.test.ts +0 -257
- package/src/v2/runtime/__tests__/runtime.test.ts +0 -234
- package/src/v2/runtime/__tests__/sse-response-telemetry.test.ts +0 -108
- package/src/v2/runtime/__tests__/telemetry.test.ts +0 -167
- package/src/v2/runtime/__tests__/thread-names.test.ts +0 -188
- package/src/v2/runtime/core/__tests__/debug-event-bus.test.ts +0 -156
- package/src/v2/runtime/core/debug-event-bus.ts +0 -45
- package/src/v2/runtime/core/fetch-cors.ts +0 -136
- package/src/v2/runtime/core/fetch-handler.ts +0 -492
- package/src/v2/runtime/core/fetch-router.ts +0 -203
- package/src/v2/runtime/core/hooks.ts +0 -160
- package/src/v2/runtime/core/middleware-sse-parser.ts +0 -210
- package/src/v2/runtime/core/middleware.ts +0 -115
- package/src/v2/runtime/core/runtime.ts +0 -432
- package/src/v2/runtime/endpoints/express-fetch-bridge.ts +0 -137
- package/src/v2/runtime/endpoints/express-single.ts +0 -54
- package/src/v2/runtime/endpoints/express.ts +0 -179
- package/src/v2/runtime/endpoints/hono-single.ts +0 -60
- package/src/v2/runtime/endpoints/hono.ts +0 -89
- package/src/v2/runtime/endpoints/index.ts +0 -4
- package/src/v2/runtime/endpoints/node-fetch-handler.ts +0 -48
- package/src/v2/runtime/endpoints/node.ts +0 -28
- package/src/v2/runtime/endpoints/single-route-helpers.ts +0 -125
- package/src/v2/runtime/express.ts +0 -2
- package/src/v2/runtime/handlers/__tests__/handle-debug-events.test.ts +0 -176
- package/src/v2/runtime/handlers/get-runtime-info.ts +0 -101
- package/src/v2/runtime/handlers/handle-connect.ts +0 -80
- package/src/v2/runtime/handlers/handle-debug-events.ts +0 -52
- package/src/v2/runtime/handlers/handle-run.ts +0 -111
- package/src/v2/runtime/handlers/handle-stop.ts +0 -77
- package/src/v2/runtime/handlers/handle-threads.ts +0 -11
- package/src/v2/runtime/handlers/handle-transcribe.ts +0 -269
- package/src/v2/runtime/handlers/header-utils.ts +0 -24
- package/src/v2/runtime/handlers/intelligence/connect.ts +0 -102
- package/src/v2/runtime/handlers/intelligence/run.ts +0 -351
- package/src/v2/runtime/handlers/intelligence/thread-names.ts +0 -246
- package/src/v2/runtime/handlers/intelligence/threads.ts +0 -420
- package/src/v2/runtime/handlers/shared/agent-utils.ts +0 -154
- package/src/v2/runtime/handlers/shared/intelligence-utils.ts +0 -41
- package/src/v2/runtime/handlers/shared/json-response.ts +0 -9
- package/src/v2/runtime/handlers/shared/resolve-intelligence-user.ts +0 -28
- package/src/v2/runtime/handlers/shared/sse-response.ts +0 -215
- package/src/v2/runtime/handlers/sse/__tests__/sse-connect-agent-id.test.ts +0 -71
- package/src/v2/runtime/handlers/sse/connect.ts +0 -30
- package/src/v2/runtime/handlers/sse/run.ts +0 -40
- package/src/v2/runtime/hono.ts +0 -2
- package/src/v2/runtime/index.ts +0 -51
- package/src/v2/runtime/intelligence-platform/__tests__/client.test.ts +0 -601
- package/src/v2/runtime/intelligence-platform/__tests__/intelligence-mcp-helper.test.ts +0 -246
- package/src/v2/runtime/intelligence-platform/client.ts +0 -818
- package/src/v2/runtime/intelligence-platform/index.ts +0 -10
- package/src/v2/runtime/node.ts +0 -6
- package/src/v2/runtime/open-generative-ui-middleware.ts +0 -373
- package/src/v2/runtime/runner/__tests__/finalize-events.test.ts +0 -109
- package/src/v2/runtime/runner/__tests__/in-memory-runner.e2e.test.ts +0 -775
- package/src/v2/runtime/runner/__tests__/in-memory-runner.test.ts +0 -777
- package/src/v2/runtime/runner/__tests__/intelligence-runner.test.ts +0 -1039
- package/src/v2/runtime/runner/agent-runner.ts +0 -35
- package/src/v2/runtime/runner/in-memory.ts +0 -467
- package/src/v2/runtime/runner/index.ts +0 -4
- package/src/v2/runtime/runner/intelligence.ts +0 -498
- package/src/v2/runtime/telemetry/__tests__/instance-created.test.ts +0 -96
- package/src/v2/runtime/telemetry/events.ts +0 -35
- package/src/v2/runtime/telemetry/index.ts +0 -7
- package/src/v2/runtime/telemetry/instance-created.ts +0 -44
- package/src/v2/runtime/telemetry/scarf-client.ts +0 -39
- package/src/v2/runtime/telemetry/telemetry-client.ts +0 -70
- package/src/v2/runtime/transcription-service/transcription-service.ts +0 -11
- package/tests/global.d.ts +0 -1
- package/tests/service-adapters/anthropic/allowlist-approach.test.ts +0 -259
- package/tests/service-adapters/anthropic/anthropic-adapter-language-model.test.ts +0 -101
- package/tests/service-adapters/anthropic/anthropic-adapter.test.ts +0 -645
- package/tests/service-adapters/anthropic/utils-token-trimming.test.ts +0 -301
- package/tests/service-adapters/groq/groq-adapter-language-model.test.ts +0 -102
- package/tests/service-adapters/openai/allowlist-approach.test.ts +0 -294
- package/tests/service-adapters/openai/openai-adapter-language-model.test.ts +0 -122
- package/tests/service-adapters/openai/openai-adapter.test.ts +0 -291
- package/tests/service-adapters/shared/sdk-client-utils.test.ts +0 -36
- package/tests/setup.vitest.ts +0 -8
- package/tests/tsconfig.json +0 -10
- package/tsconfig.json +0 -20
- package/tsdown.config.ts +0 -45
- package/typedoc.json +0 -4
- package/vitest.config.mjs +0 -13
|
@@ -1,645 +0,0 @@
|
|
|
1
|
-
import { AnthropicAdapter } from "../../../src/service-adapters/anthropic/anthropic-adapter";
|
|
2
|
-
import {
|
|
3
|
-
TextMessage,
|
|
4
|
-
ActionExecutionMessage,
|
|
5
|
-
ResultMessage,
|
|
6
|
-
} from "../../../src/graphql/types/converted";
|
|
7
|
-
|
|
8
|
-
// Mock only the Anthropic SDK, not our adapter
|
|
9
|
-
vi.mock("@anthropic-ai/sdk", () => {
|
|
10
|
-
return {
|
|
11
|
-
default: vi.fn().mockImplementation(() => ({
|
|
12
|
-
messages: {
|
|
13
|
-
create: vi.fn(),
|
|
14
|
-
},
|
|
15
|
-
})),
|
|
16
|
-
};
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
// Mock the message classes
|
|
20
|
-
vi.mock("../../../src/graphql/types/converted", () => {
|
|
21
|
-
class MockTextMessage {
|
|
22
|
-
content: string;
|
|
23
|
-
role: string;
|
|
24
|
-
id: string;
|
|
25
|
-
|
|
26
|
-
constructor(role: string, content: string) {
|
|
27
|
-
this.role = role;
|
|
28
|
-
this.content = content;
|
|
29
|
-
this.id = "mock-text-" + Math.random().toString(36).substring(7);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
isTextMessage() {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
isImageMessage() {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
isActionExecutionMessage() {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
isResultMessage() {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
class MockActionExecutionMessage {
|
|
47
|
-
id: string;
|
|
48
|
-
name: string;
|
|
49
|
-
arguments: string;
|
|
50
|
-
|
|
51
|
-
constructor(params: { id: string; name: string; arguments: string }) {
|
|
52
|
-
this.id = params.id;
|
|
53
|
-
this.name = params.name;
|
|
54
|
-
this.arguments = params.arguments;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
isTextMessage() {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
isImageMessage() {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
isActionExecutionMessage() {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
isResultMessage() {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
class MockResultMessage {
|
|
72
|
-
actionExecutionId: string;
|
|
73
|
-
result: string;
|
|
74
|
-
id: string;
|
|
75
|
-
|
|
76
|
-
constructor(params: { actionExecutionId: string; result: string }) {
|
|
77
|
-
this.actionExecutionId = params.actionExecutionId;
|
|
78
|
-
this.result = params.result;
|
|
79
|
-
this.id = "mock-result-" + Math.random().toString(36).substring(7);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
isTextMessage() {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
isImageMessage() {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
isActionExecutionMessage() {
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
isResultMessage() {
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return {
|
|
97
|
-
TextMessage: MockTextMessage,
|
|
98
|
-
ActionExecutionMessage: MockActionExecutionMessage,
|
|
99
|
-
ResultMessage: MockResultMessage,
|
|
100
|
-
};
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
describe("AnthropicAdapter", () => {
|
|
104
|
-
let adapter: AnthropicAdapter;
|
|
105
|
-
let mockEventSource: any;
|
|
106
|
-
let mockAnthropicCreate: any;
|
|
107
|
-
|
|
108
|
-
beforeEach(() => {
|
|
109
|
-
vi.clearAllMocks();
|
|
110
|
-
|
|
111
|
-
// Create a mock Anthropic instance
|
|
112
|
-
const mockAnthropic = {
|
|
113
|
-
messages: {
|
|
114
|
-
create: vi.fn(),
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// Create adapter with the mocked instance
|
|
119
|
-
adapter = new AnthropicAdapter({ anthropic: mockAnthropic as any });
|
|
120
|
-
|
|
121
|
-
// Mock the create method to capture what's being sent
|
|
122
|
-
mockAnthropicCreate = mockAnthropic.messages.create;
|
|
123
|
-
|
|
124
|
-
mockEventSource = {
|
|
125
|
-
stream: vi.fn((callback) => {
|
|
126
|
-
const mockStream = {
|
|
127
|
-
sendTextMessageStart: vi.fn(),
|
|
128
|
-
sendTextMessageContent: vi.fn(),
|
|
129
|
-
sendTextMessageEnd: vi.fn(),
|
|
130
|
-
sendActionExecutionStart: vi.fn(),
|
|
131
|
-
sendActionExecutionArgs: vi.fn(),
|
|
132
|
-
sendActionExecutionEnd: vi.fn(),
|
|
133
|
-
complete: vi.fn(),
|
|
134
|
-
};
|
|
135
|
-
callback(mockStream);
|
|
136
|
-
return Promise.resolve();
|
|
137
|
-
}),
|
|
138
|
-
};
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
describe("Deduplication Logic", () => {
|
|
142
|
-
it("should filter out duplicate result messages", async () => {
|
|
143
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
144
|
-
const userMessage = new TextMessage("user", "Set theme to orange");
|
|
145
|
-
|
|
146
|
-
// Tool execution
|
|
147
|
-
const toolExecution = new ActionExecutionMessage({
|
|
148
|
-
id: "tool-123",
|
|
149
|
-
name: "setThemeColor",
|
|
150
|
-
arguments: '{"themeColor": "orange"}',
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// Multiple duplicate results (this was causing the infinite loop)
|
|
154
|
-
const result1 = new ResultMessage({
|
|
155
|
-
actionExecutionId: "tool-123",
|
|
156
|
-
result: "Theme color set to orange",
|
|
157
|
-
});
|
|
158
|
-
const result2 = new ResultMessage({
|
|
159
|
-
actionExecutionId: "tool-123",
|
|
160
|
-
result: "Theme color set to orange",
|
|
161
|
-
});
|
|
162
|
-
const result3 = new ResultMessage({
|
|
163
|
-
actionExecutionId: "tool-123",
|
|
164
|
-
result: "Theme color set to orange",
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// Mock Anthropic to return empty stream (simulating the original problem)
|
|
168
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
169
|
-
[Symbol.asyncIterator]: async function* () {
|
|
170
|
-
// Empty stream - no content from Anthropic
|
|
171
|
-
},
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
await adapter.process({
|
|
175
|
-
threadId: "test-thread",
|
|
176
|
-
model: "claude-3-5-sonnet-latest",
|
|
177
|
-
messages: [
|
|
178
|
-
systemMessage,
|
|
179
|
-
userMessage,
|
|
180
|
-
toolExecution,
|
|
181
|
-
result1,
|
|
182
|
-
result2,
|
|
183
|
-
result3,
|
|
184
|
-
],
|
|
185
|
-
actions: [],
|
|
186
|
-
eventSource: mockEventSource,
|
|
187
|
-
forwardedParameters: {},
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
// Check that only one result message was sent to Anthropic
|
|
191
|
-
expect(mockAnthropicCreate).toHaveBeenCalledWith(
|
|
192
|
-
expect.objectContaining({
|
|
193
|
-
messages: expect.arrayContaining([
|
|
194
|
-
expect.objectContaining({
|
|
195
|
-
role: "user",
|
|
196
|
-
content: [{ type: "text", text: "Set theme to orange" }],
|
|
197
|
-
}),
|
|
198
|
-
expect.objectContaining({
|
|
199
|
-
role: "assistant",
|
|
200
|
-
content: [
|
|
201
|
-
expect.objectContaining({
|
|
202
|
-
type: "tool_use",
|
|
203
|
-
id: "tool-123",
|
|
204
|
-
name: "setThemeColor",
|
|
205
|
-
}),
|
|
206
|
-
],
|
|
207
|
-
}),
|
|
208
|
-
expect.objectContaining({
|
|
209
|
-
role: "user",
|
|
210
|
-
content: [
|
|
211
|
-
expect.objectContaining({
|
|
212
|
-
type: "tool_result",
|
|
213
|
-
content: "Theme color set to orange",
|
|
214
|
-
tool_use_id: "tool-123",
|
|
215
|
-
}),
|
|
216
|
-
],
|
|
217
|
-
}),
|
|
218
|
-
]),
|
|
219
|
-
}),
|
|
220
|
-
);
|
|
221
|
-
|
|
222
|
-
// Verify only 3 messages sent (user, assistant tool_use, user tool_result) - no duplicates
|
|
223
|
-
const sentMessages = mockAnthropicCreate.mock.calls[0][0].messages;
|
|
224
|
-
expect(sentMessages).toHaveLength(3);
|
|
225
|
-
|
|
226
|
-
// Count tool_result messages - should be only 1
|
|
227
|
-
const toolResults = sentMessages.filter(
|
|
228
|
-
(msg: any) =>
|
|
229
|
-
msg.role === "user" &&
|
|
230
|
-
msg.content.some((c: any) => c.type === "tool_result"),
|
|
231
|
-
);
|
|
232
|
-
expect(toolResults).toHaveLength(1);
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it("should filter out invalid result messages without corresponding tool_use", async () => {
|
|
236
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
237
|
-
|
|
238
|
-
// Valid tool execution
|
|
239
|
-
const validTool = new ActionExecutionMessage({
|
|
240
|
-
id: "valid-tool",
|
|
241
|
-
name: "validAction",
|
|
242
|
-
arguments: "{}",
|
|
243
|
-
});
|
|
244
|
-
const validResult = new ResultMessage({
|
|
245
|
-
actionExecutionId: "valid-tool",
|
|
246
|
-
result: "Valid result",
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
// Invalid result with no corresponding tool_use
|
|
250
|
-
const invalidResult = new ResultMessage({
|
|
251
|
-
actionExecutionId: "nonexistent-tool",
|
|
252
|
-
result: "Invalid result",
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
256
|
-
[Symbol.asyncIterator]: async function* () {},
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
await adapter.process({
|
|
260
|
-
threadId: "test-thread",
|
|
261
|
-
messages: [systemMessage, validTool, validResult, invalidResult],
|
|
262
|
-
actions: [],
|
|
263
|
-
eventSource: mockEventSource,
|
|
264
|
-
forwardedParameters: {},
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
const sentMessages = mockAnthropicCreate.mock.calls[0][0].messages;
|
|
268
|
-
|
|
269
|
-
// Should only include the valid tool result
|
|
270
|
-
const toolResults = sentMessages.filter(
|
|
271
|
-
(msg: any) =>
|
|
272
|
-
msg.role === "user" &&
|
|
273
|
-
msg.content.some((c: any) => c.type === "tool_result"),
|
|
274
|
-
);
|
|
275
|
-
expect(toolResults).toHaveLength(1);
|
|
276
|
-
expect(toolResults[0].content[0].tool_use_id).toBe("valid-tool");
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
describe("Fallback Response Logic", () => {
|
|
281
|
-
it("should generate contextual fallback when Anthropic returns no content", async () => {
|
|
282
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
283
|
-
const userMessage = new TextMessage("user", "Set theme to orange");
|
|
284
|
-
|
|
285
|
-
const toolExecution = new ActionExecutionMessage({
|
|
286
|
-
id: "tool-123",
|
|
287
|
-
name: "setThemeColor",
|
|
288
|
-
arguments: '{"themeColor": "orange"}',
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
const toolResult = new ResultMessage({
|
|
292
|
-
actionExecutionId: "tool-123",
|
|
293
|
-
result: "Theme color set to orange",
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// Mock Anthropic to return empty stream
|
|
297
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
298
|
-
[Symbol.asyncIterator]: async function* () {
|
|
299
|
-
// No content blocks - simulates Anthropic not responding
|
|
300
|
-
},
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
const mockStream = {
|
|
304
|
-
sendTextMessageStart: vi.fn(),
|
|
305
|
-
sendTextMessageContent: vi.fn(),
|
|
306
|
-
sendTextMessageEnd: vi.fn(),
|
|
307
|
-
complete: vi.fn(),
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
mockEventSource.stream.mockImplementation((callback) => {
|
|
311
|
-
callback(mockStream);
|
|
312
|
-
return Promise.resolve();
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
await adapter.process({
|
|
316
|
-
threadId: "test-thread",
|
|
317
|
-
messages: [systemMessage, userMessage, toolExecution, toolResult],
|
|
318
|
-
actions: [],
|
|
319
|
-
eventSource: mockEventSource,
|
|
320
|
-
forwardedParameters: {},
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
// Should generate fallback response with the tool result content
|
|
324
|
-
expect(mockStream.sendTextMessageStart).toHaveBeenCalled();
|
|
325
|
-
expect(mockStream.sendTextMessageContent).toHaveBeenCalledWith({
|
|
326
|
-
messageId: expect.any(String),
|
|
327
|
-
content: "Theme color set to orange", // Uses the actual result content
|
|
328
|
-
});
|
|
329
|
-
expect(mockStream.sendTextMessageEnd).toHaveBeenCalled();
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
it("should use generic fallback when no tool result content available", async () => {
|
|
333
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
334
|
-
|
|
335
|
-
const toolExecution = new ActionExecutionMessage({
|
|
336
|
-
id: "tool-123",
|
|
337
|
-
name: "someAction",
|
|
338
|
-
arguments: "{}",
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
const toolResult = new ResultMessage({
|
|
342
|
-
actionExecutionId: "tool-123",
|
|
343
|
-
result: "", // Empty result
|
|
344
|
-
});
|
|
345
|
-
|
|
346
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
347
|
-
[Symbol.asyncIterator]: async function* () {},
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
const mockStream = {
|
|
351
|
-
sendTextMessageStart: vi.fn(),
|
|
352
|
-
sendTextMessageContent: vi.fn(),
|
|
353
|
-
sendTextMessageEnd: vi.fn(),
|
|
354
|
-
complete: vi.fn(),
|
|
355
|
-
};
|
|
356
|
-
|
|
357
|
-
mockEventSource.stream.mockImplementation((callback) => {
|
|
358
|
-
callback(mockStream);
|
|
359
|
-
return Promise.resolve();
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
await adapter.process({
|
|
363
|
-
threadId: "test-thread",
|
|
364
|
-
messages: [systemMessage, toolExecution, toolResult],
|
|
365
|
-
actions: [],
|
|
366
|
-
eventSource: mockEventSource,
|
|
367
|
-
forwardedParameters: {},
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
// Should use generic fallback
|
|
371
|
-
expect(mockStream.sendTextMessageContent).toHaveBeenCalledWith({
|
|
372
|
-
messageId: expect.any(String),
|
|
373
|
-
content: "Task completed successfully.",
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
describe("Unknown Tool Use Handling", () => {
|
|
379
|
-
it("should skip unknown tool_use blocks without crashing", async () => {
|
|
380
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
381
|
-
const userMessage = new TextMessage("user", "Do something");
|
|
382
|
-
|
|
383
|
-
// Mock Anthropic to return a stream with an unknown tool_use block
|
|
384
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
385
|
-
[Symbol.asyncIterator]: async function* () {
|
|
386
|
-
yield { type: "message_start", message: { id: "msg-1" } };
|
|
387
|
-
// Unknown tool_use block — tool name not in the actions list
|
|
388
|
-
yield {
|
|
389
|
-
type: "content_block_start",
|
|
390
|
-
content_block: {
|
|
391
|
-
type: "tool_use",
|
|
392
|
-
id: "tool-unknown",
|
|
393
|
-
name: "nonexistent_tool",
|
|
394
|
-
},
|
|
395
|
-
};
|
|
396
|
-
yield {
|
|
397
|
-
type: "content_block_delta",
|
|
398
|
-
delta: { type: "input_json_delta", partial_json: '{"query":' },
|
|
399
|
-
};
|
|
400
|
-
yield {
|
|
401
|
-
type: "content_block_delta",
|
|
402
|
-
delta: { type: "input_json_delta", partial_json: '"test"}' },
|
|
403
|
-
};
|
|
404
|
-
yield { type: "content_block_stop" };
|
|
405
|
-
// Then a normal text block
|
|
406
|
-
yield {
|
|
407
|
-
type: "content_block_start",
|
|
408
|
-
content_block: { type: "text" },
|
|
409
|
-
};
|
|
410
|
-
yield {
|
|
411
|
-
type: "content_block_delta",
|
|
412
|
-
delta: { type: "text_delta", text: "Here is the result." },
|
|
413
|
-
};
|
|
414
|
-
yield { type: "content_block_stop" };
|
|
415
|
-
},
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
const mockStream = {
|
|
419
|
-
sendTextMessageStart: vi.fn(),
|
|
420
|
-
sendTextMessageContent: vi.fn(),
|
|
421
|
-
sendTextMessageEnd: vi.fn(),
|
|
422
|
-
sendActionExecutionStart: vi.fn(),
|
|
423
|
-
sendActionExecutionArgs: vi.fn(),
|
|
424
|
-
sendActionExecutionEnd: vi.fn(),
|
|
425
|
-
complete: vi.fn(),
|
|
426
|
-
};
|
|
427
|
-
|
|
428
|
-
let streamCallbackDone: Promise<void>;
|
|
429
|
-
mockEventSource.stream.mockImplementation((callback: any) => {
|
|
430
|
-
streamCallbackDone = callback(mockStream);
|
|
431
|
-
});
|
|
432
|
-
|
|
433
|
-
await adapter.process({
|
|
434
|
-
threadId: "test-thread",
|
|
435
|
-
messages: [systemMessage, userMessage],
|
|
436
|
-
actions: [
|
|
437
|
-
{
|
|
438
|
-
name: "known_tool",
|
|
439
|
-
description: "A known tool",
|
|
440
|
-
parameters: [],
|
|
441
|
-
jsonSchema: '{"type":"object","properties":{}}',
|
|
442
|
-
},
|
|
443
|
-
],
|
|
444
|
-
eventSource: mockEventSource,
|
|
445
|
-
forwardedParameters: {},
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
// Wait for async stream processing to complete
|
|
449
|
-
await streamCallbackDone!;
|
|
450
|
-
|
|
451
|
-
// Should NOT have sent action execution events for the unknown tool
|
|
452
|
-
expect(mockStream.sendActionExecutionStart).not.toHaveBeenCalled();
|
|
453
|
-
expect(mockStream.sendActionExecutionArgs).not.toHaveBeenCalled();
|
|
454
|
-
expect(mockStream.sendActionExecutionEnd).not.toHaveBeenCalled();
|
|
455
|
-
|
|
456
|
-
// Should still process the text block normally
|
|
457
|
-
expect(mockStream.sendTextMessageStart).toHaveBeenCalled();
|
|
458
|
-
expect(mockStream.sendTextMessageContent).toHaveBeenCalledWith({
|
|
459
|
-
messageId: "msg-1",
|
|
460
|
-
content: "Here is the result.",
|
|
461
|
-
});
|
|
462
|
-
expect(mockStream.sendTextMessageEnd).toHaveBeenCalled();
|
|
463
|
-
expect(mockStream.complete).toHaveBeenCalled();
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
it("should trigger fallback when only unknown tool_use blocks are returned", async () => {
|
|
467
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
468
|
-
const userMessage = new TextMessage("user", "Do something");
|
|
469
|
-
|
|
470
|
-
const toolExecution = new ActionExecutionMessage({
|
|
471
|
-
id: "tool-prev",
|
|
472
|
-
name: "someAction",
|
|
473
|
-
arguments: "{}",
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
const toolResult = new ResultMessage({
|
|
477
|
-
actionExecutionId: "tool-prev",
|
|
478
|
-
result: "Previous result",
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
// Mock Anthropic to return ONLY an unknown tool_use block
|
|
482
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
483
|
-
[Symbol.asyncIterator]: async function* () {
|
|
484
|
-
yield { type: "message_start", message: { id: "msg-1" } };
|
|
485
|
-
yield {
|
|
486
|
-
type: "content_block_start",
|
|
487
|
-
content_block: {
|
|
488
|
-
type: "tool_use",
|
|
489
|
-
id: "tool-unknown",
|
|
490
|
-
name: "nonexistent_tool",
|
|
491
|
-
},
|
|
492
|
-
};
|
|
493
|
-
yield {
|
|
494
|
-
type: "content_block_delta",
|
|
495
|
-
delta: { type: "input_json_delta", partial_json: "{}" },
|
|
496
|
-
};
|
|
497
|
-
yield { type: "content_block_stop" };
|
|
498
|
-
},
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
const mockStream = {
|
|
502
|
-
sendTextMessageStart: vi.fn(),
|
|
503
|
-
sendTextMessageContent: vi.fn(),
|
|
504
|
-
sendTextMessageEnd: vi.fn(),
|
|
505
|
-
sendActionExecutionStart: vi.fn(),
|
|
506
|
-
sendActionExecutionArgs: vi.fn(),
|
|
507
|
-
sendActionExecutionEnd: vi.fn(),
|
|
508
|
-
complete: vi.fn(),
|
|
509
|
-
};
|
|
510
|
-
|
|
511
|
-
let streamCallbackDone: Promise<void>;
|
|
512
|
-
mockEventSource.stream.mockImplementation((callback: any) => {
|
|
513
|
-
streamCallbackDone = callback(mockStream);
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
await adapter.process({
|
|
517
|
-
threadId: "test-thread",
|
|
518
|
-
messages: [systemMessage, userMessage, toolExecution, toolResult],
|
|
519
|
-
actions: [
|
|
520
|
-
{
|
|
521
|
-
name: "known_tool",
|
|
522
|
-
description: "A known tool",
|
|
523
|
-
parameters: [],
|
|
524
|
-
jsonSchema: '{"type":"object","properties":{}}',
|
|
525
|
-
},
|
|
526
|
-
],
|
|
527
|
-
eventSource: mockEventSource,
|
|
528
|
-
forwardedParameters: {},
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
// Wait for async stream processing to complete
|
|
532
|
-
await streamCallbackDone!;
|
|
533
|
-
|
|
534
|
-
// Should NOT have sent action execution events
|
|
535
|
-
expect(mockStream.sendActionExecutionStart).not.toHaveBeenCalled();
|
|
536
|
-
|
|
537
|
-
// Should trigger fallback since hasReceivedContent should be false
|
|
538
|
-
expect(mockStream.sendTextMessageStart).toHaveBeenCalled();
|
|
539
|
-
expect(mockStream.sendTextMessageContent).toHaveBeenCalledWith({
|
|
540
|
-
messageId: expect.any(String),
|
|
541
|
-
content: "Previous result",
|
|
542
|
-
});
|
|
543
|
-
expect(mockStream.sendTextMessageEnd).toHaveBeenCalled();
|
|
544
|
-
});
|
|
545
|
-
});
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
describe("AnthropicAdapter max_tokens default", () => {
|
|
549
|
-
let mockAnthropicCreate: any;
|
|
550
|
-
let mockEventSource: any;
|
|
551
|
-
|
|
552
|
-
beforeEach(() => {
|
|
553
|
-
vi.clearAllMocks();
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
it("should default max_tokens to 4096 when not specified", async () => {
|
|
557
|
-
const mockAnthropic = {
|
|
558
|
-
messages: {
|
|
559
|
-
create: vi.fn(),
|
|
560
|
-
},
|
|
561
|
-
};
|
|
562
|
-
|
|
563
|
-
const adapter = new AnthropicAdapter({ anthropic: mockAnthropic as any });
|
|
564
|
-
mockAnthropicCreate = mockAnthropic.messages.create;
|
|
565
|
-
|
|
566
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
567
|
-
[Symbol.asyncIterator]: async function* () {},
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
mockEventSource = {
|
|
571
|
-
stream: vi.fn((callback) => {
|
|
572
|
-
const mockStream = {
|
|
573
|
-
sendTextMessageStart: vi.fn(),
|
|
574
|
-
sendTextMessageContent: vi.fn(),
|
|
575
|
-
sendTextMessageEnd: vi.fn(),
|
|
576
|
-
sendActionExecutionStart: vi.fn(),
|
|
577
|
-
sendActionExecutionArgs: vi.fn(),
|
|
578
|
-
sendActionExecutionEnd: vi.fn(),
|
|
579
|
-
complete: vi.fn(),
|
|
580
|
-
};
|
|
581
|
-
callback(mockStream);
|
|
582
|
-
return Promise.resolve();
|
|
583
|
-
}),
|
|
584
|
-
};
|
|
585
|
-
|
|
586
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
587
|
-
const userMessage = new TextMessage("user", "Hello");
|
|
588
|
-
|
|
589
|
-
await adapter.process({
|
|
590
|
-
threadId: "test-thread",
|
|
591
|
-
messages: [systemMessage, userMessage],
|
|
592
|
-
actions: [],
|
|
593
|
-
eventSource: mockEventSource,
|
|
594
|
-
forwardedParameters: {},
|
|
595
|
-
});
|
|
596
|
-
|
|
597
|
-
const createCallArgs = mockAnthropicCreate.mock.calls[0][0];
|
|
598
|
-
expect(createCallArgs.max_tokens).toBe(4096);
|
|
599
|
-
});
|
|
600
|
-
|
|
601
|
-
it("should use provided maxTokens when specified", async () => {
|
|
602
|
-
const mockAnthropic = {
|
|
603
|
-
messages: {
|
|
604
|
-
create: vi.fn(),
|
|
605
|
-
},
|
|
606
|
-
};
|
|
607
|
-
|
|
608
|
-
const adapter = new AnthropicAdapter({ anthropic: mockAnthropic as any });
|
|
609
|
-
mockAnthropicCreate = mockAnthropic.messages.create;
|
|
610
|
-
|
|
611
|
-
mockAnthropicCreate.mockResolvedValue({
|
|
612
|
-
[Symbol.asyncIterator]: async function* () {},
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
mockEventSource = {
|
|
616
|
-
stream: vi.fn((callback) => {
|
|
617
|
-
const mockStream = {
|
|
618
|
-
sendTextMessageStart: vi.fn(),
|
|
619
|
-
sendTextMessageContent: vi.fn(),
|
|
620
|
-
sendTextMessageEnd: vi.fn(),
|
|
621
|
-
sendActionExecutionStart: vi.fn(),
|
|
622
|
-
sendActionExecutionArgs: vi.fn(),
|
|
623
|
-
sendActionExecutionEnd: vi.fn(),
|
|
624
|
-
complete: vi.fn(),
|
|
625
|
-
};
|
|
626
|
-
callback(mockStream);
|
|
627
|
-
return Promise.resolve();
|
|
628
|
-
}),
|
|
629
|
-
};
|
|
630
|
-
|
|
631
|
-
const systemMessage = new TextMessage("system", "System message");
|
|
632
|
-
const userMessage = new TextMessage("user", "Hello");
|
|
633
|
-
|
|
634
|
-
await adapter.process({
|
|
635
|
-
threadId: "test-thread",
|
|
636
|
-
messages: [systemMessage, userMessage],
|
|
637
|
-
actions: [],
|
|
638
|
-
eventSource: mockEventSource,
|
|
639
|
-
forwardedParameters: { maxTokens: 8192 },
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
const createCallArgs = mockAnthropicCreate.mock.calls[0][0];
|
|
643
|
-
expect(createCallArgs.max_tokens).toBe(8192);
|
|
644
|
-
});
|
|
645
|
-
});
|