@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,594 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import { EventType } from "@ag-ui/client";
|
|
3
|
-
import {
|
|
4
|
-
createAgent,
|
|
5
|
-
createDefaultInput,
|
|
6
|
-
collectEvents,
|
|
7
|
-
expectLifecycleWrapped,
|
|
8
|
-
expectEventSequence,
|
|
9
|
-
eventField,
|
|
10
|
-
tanstackTextChunk,
|
|
11
|
-
tanstackToolCallStart,
|
|
12
|
-
tanstackToolCallArgs,
|
|
13
|
-
tanstackToolCallEnd,
|
|
14
|
-
tanstackToolCallResult,
|
|
15
|
-
tanstackReasoningStart,
|
|
16
|
-
tanstackReasoningMessageStart,
|
|
17
|
-
tanstackReasoningMessageContent,
|
|
18
|
-
tanstackReasoningMessageEnd,
|
|
19
|
-
tanstackReasoningEnd,
|
|
20
|
-
} from "./agent-test-helpers";
|
|
21
|
-
|
|
22
|
-
describe("TanStack AI converter (via Agent)", () => {
|
|
23
|
-
// -------------------------------------------------------------------------
|
|
24
|
-
// Text Events
|
|
25
|
-
// -------------------------------------------------------------------------
|
|
26
|
-
describe("Text Events", () => {
|
|
27
|
-
it("TEXT_MESSAGE_CONTENT chunk produces TEXT_MESSAGE_CHUNK with role assistant and correct delta", async () => {
|
|
28
|
-
const agent = createAgent("tanstack", [tanstackTextChunk("Hello world")]);
|
|
29
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
30
|
-
|
|
31
|
-
expectLifecycleWrapped(events);
|
|
32
|
-
|
|
33
|
-
const textEvents = events.filter(
|
|
34
|
-
(e) => e.type === EventType.TEXT_MESSAGE_CHUNK,
|
|
35
|
-
);
|
|
36
|
-
expect(textEvents).toHaveLength(1);
|
|
37
|
-
|
|
38
|
-
expect(eventField<string>(textEvents[0], "role")).toBe("assistant");
|
|
39
|
-
expect(eventField<string>(textEvents[0], "delta")).toBe("Hello world");
|
|
40
|
-
expect(eventField<string>(textEvents[0], "messageId")).toBeDefined();
|
|
41
|
-
expect(typeof eventField<string>(textEvents[0], "messageId")).toBe(
|
|
42
|
-
"string",
|
|
43
|
-
);
|
|
44
|
-
expect(
|
|
45
|
-
eventField<string>(textEvents[0], "messageId").length,
|
|
46
|
-
).toBeGreaterThan(0);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("multiple text chunks share the same messageId", async () => {
|
|
50
|
-
const agent = createAgent("tanstack", [
|
|
51
|
-
tanstackTextChunk("Hello "),
|
|
52
|
-
tanstackTextChunk("world"),
|
|
53
|
-
tanstackTextChunk("!"),
|
|
54
|
-
]);
|
|
55
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
56
|
-
|
|
57
|
-
expectLifecycleWrapped(events);
|
|
58
|
-
|
|
59
|
-
const textEvents = events.filter(
|
|
60
|
-
(e) => e.type === EventType.TEXT_MESSAGE_CHUNK,
|
|
61
|
-
);
|
|
62
|
-
expect(textEvents).toHaveLength(3);
|
|
63
|
-
|
|
64
|
-
const messageIds = new Set(
|
|
65
|
-
textEvents.map((e) => eventField<string>(e, "messageId")),
|
|
66
|
-
);
|
|
67
|
-
expect(messageIds.size).toBe(1);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("empty stream produces only RUN_STARTED + RUN_FINISHED", async () => {
|
|
71
|
-
const agent = createAgent("tanstack", []);
|
|
72
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
73
|
-
|
|
74
|
-
expectEventSequence(events, [
|
|
75
|
-
EventType.RUN_STARTED,
|
|
76
|
-
EventType.RUN_FINISHED,
|
|
77
|
-
]);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// -------------------------------------------------------------------------
|
|
82
|
-
// Tool Call Events
|
|
83
|
-
// -------------------------------------------------------------------------
|
|
84
|
-
describe("Tool Call Events", () => {
|
|
85
|
-
it("full tool call lifecycle produces START, ARGS, END events in order", async () => {
|
|
86
|
-
const agent = createAgent("tanstack", [
|
|
87
|
-
tanstackToolCallStart("tc-1", "myTool"),
|
|
88
|
-
tanstackToolCallArgs("tc-1", '{"key":'),
|
|
89
|
-
tanstackToolCallArgs("tc-1", '"value"}'),
|
|
90
|
-
tanstackToolCallEnd("tc-1"),
|
|
91
|
-
]);
|
|
92
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
93
|
-
|
|
94
|
-
expectLifecycleWrapped(events);
|
|
95
|
-
expectEventSequence(events, [
|
|
96
|
-
EventType.RUN_STARTED,
|
|
97
|
-
EventType.TOOL_CALL_START,
|
|
98
|
-
EventType.TOOL_CALL_ARGS,
|
|
99
|
-
EventType.TOOL_CALL_ARGS,
|
|
100
|
-
EventType.TOOL_CALL_END,
|
|
101
|
-
EventType.RUN_FINISHED,
|
|
102
|
-
]);
|
|
103
|
-
|
|
104
|
-
expect(eventField<string>(events[1], "toolCallId")).toBe("tc-1");
|
|
105
|
-
expect(eventField<string>(events[1], "toolCallName")).toBe("myTool");
|
|
106
|
-
|
|
107
|
-
expect(eventField<string>(events[2], "toolCallId")).toBe("tc-1");
|
|
108
|
-
expect(eventField<string>(events[2], "delta")).toBe('{"key":');
|
|
109
|
-
|
|
110
|
-
expect(eventField<string>(events[3], "toolCallId")).toBe("tc-1");
|
|
111
|
-
expect(eventField<string>(events[3], "delta")).toBe('"value"}');
|
|
112
|
-
|
|
113
|
-
expect(eventField<string>(events[4], "toolCallId")).toBe("tc-1");
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it("TOOL_CALL_START sets parentMessageId", async () => {
|
|
117
|
-
const agent = createAgent("tanstack", [
|
|
118
|
-
tanstackTextChunk("before"),
|
|
119
|
-
tanstackToolCallStart("tc-1", "myTool"),
|
|
120
|
-
tanstackToolCallEnd("tc-1"),
|
|
121
|
-
]);
|
|
122
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
123
|
-
|
|
124
|
-
const textEvent = events.find(
|
|
125
|
-
(e) => e.type === EventType.TEXT_MESSAGE_CHUNK,
|
|
126
|
-
)!;
|
|
127
|
-
const toolStartEvent = events.find(
|
|
128
|
-
(e) => e.type === EventType.TOOL_CALL_START,
|
|
129
|
-
)!;
|
|
130
|
-
|
|
131
|
-
expect(
|
|
132
|
-
eventField<string>(toolStartEvent, "parentMessageId"),
|
|
133
|
-
).toBeDefined();
|
|
134
|
-
expect(eventField<string>(toolStartEvent, "parentMessageId")).toBe(
|
|
135
|
-
eventField<string>(textEvent, "messageId"),
|
|
136
|
-
);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("multiple tool calls in sequence each get correct events", async () => {
|
|
140
|
-
const agent = createAgent("tanstack", [
|
|
141
|
-
tanstackToolCallStart("tc-1", "toolA"),
|
|
142
|
-
tanstackToolCallArgs("tc-1", '{"a":1}'),
|
|
143
|
-
tanstackToolCallEnd("tc-1"),
|
|
144
|
-
tanstackToolCallStart("tc-2", "toolB"),
|
|
145
|
-
tanstackToolCallArgs("tc-2", '{"b":2}'),
|
|
146
|
-
tanstackToolCallEnd("tc-2"),
|
|
147
|
-
]);
|
|
148
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
149
|
-
|
|
150
|
-
expectLifecycleWrapped(events);
|
|
151
|
-
expectEventSequence(events, [
|
|
152
|
-
EventType.RUN_STARTED,
|
|
153
|
-
EventType.TOOL_CALL_START,
|
|
154
|
-
EventType.TOOL_CALL_ARGS,
|
|
155
|
-
EventType.TOOL_CALL_END,
|
|
156
|
-
EventType.TOOL_CALL_START,
|
|
157
|
-
EventType.TOOL_CALL_ARGS,
|
|
158
|
-
EventType.TOOL_CALL_END,
|
|
159
|
-
EventType.RUN_FINISHED,
|
|
160
|
-
]);
|
|
161
|
-
|
|
162
|
-
// Verify first tool call
|
|
163
|
-
expect(eventField<string>(events[1], "toolCallId")).toBe("tc-1");
|
|
164
|
-
expect(eventField<string>(events[1], "toolCallName")).toBe("toolA");
|
|
165
|
-
|
|
166
|
-
expect(eventField<string>(events[2], "toolCallId")).toBe("tc-1");
|
|
167
|
-
|
|
168
|
-
expect(eventField<string>(events[3], "toolCallId")).toBe("tc-1");
|
|
169
|
-
|
|
170
|
-
// Verify second tool call
|
|
171
|
-
expect(eventField<string>(events[4], "toolCallId")).toBe("tc-2");
|
|
172
|
-
expect(eventField<string>(events[4], "toolCallName")).toBe("toolB");
|
|
173
|
-
|
|
174
|
-
expect(eventField<string>(events[5], "toolCallId")).toBe("tc-2");
|
|
175
|
-
|
|
176
|
-
expect(eventField<string>(events[6], "toolCallId")).toBe("tc-2");
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it("tool call with no ARGS chunks produces only START + END", async () => {
|
|
180
|
-
const agent = createAgent("tanstack", [
|
|
181
|
-
tanstackToolCallStart("tc-1", "noArgsTool"),
|
|
182
|
-
tanstackToolCallEnd("tc-1"),
|
|
183
|
-
]);
|
|
184
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
185
|
-
|
|
186
|
-
expectLifecycleWrapped(events);
|
|
187
|
-
expectEventSequence(events, [
|
|
188
|
-
EventType.RUN_STARTED,
|
|
189
|
-
EventType.TOOL_CALL_START,
|
|
190
|
-
EventType.TOOL_CALL_END,
|
|
191
|
-
EventType.RUN_FINISHED,
|
|
192
|
-
]);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
// -------------------------------------------------------------------------
|
|
197
|
-
// Tool Call Result Events
|
|
198
|
-
// -------------------------------------------------------------------------
|
|
199
|
-
describe("Tool Call Result Events", () => {
|
|
200
|
-
it("TOOL_CALL_RESULT chunk produces TOOL_CALL_RESULT event with correct content", async () => {
|
|
201
|
-
const agent = createAgent("tanstack", [
|
|
202
|
-
tanstackToolCallStart("tc-1", "myTool"),
|
|
203
|
-
tanstackToolCallArgs("tc-1", '{"key":"value"}'),
|
|
204
|
-
tanstackToolCallEnd("tc-1"),
|
|
205
|
-
{
|
|
206
|
-
type: "TOOL_CALL_RESULT",
|
|
207
|
-
toolCallId: "tc-1",
|
|
208
|
-
content: JSON.stringify({ result: "ok" }),
|
|
209
|
-
},
|
|
210
|
-
]);
|
|
211
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
212
|
-
|
|
213
|
-
expectLifecycleWrapped(events);
|
|
214
|
-
|
|
215
|
-
const resultEvents = events.filter(
|
|
216
|
-
(e) => e.type === EventType.TOOL_CALL_RESULT,
|
|
217
|
-
);
|
|
218
|
-
expect(resultEvents).toHaveLength(1);
|
|
219
|
-
expect(eventField<string>(resultEvents[0], "toolCallId")).toBe("tc-1");
|
|
220
|
-
expect(eventField<string>(resultEvents[0], "role")).toBe("tool");
|
|
221
|
-
expect(
|
|
222
|
-
JSON.parse(eventField<string>(resultEvents[0], "content")),
|
|
223
|
-
).toEqual({ result: "ok" });
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it("TOOL_CALL_RESULT with object content serializes to JSON", async () => {
|
|
227
|
-
const agent = createAgent("tanstack", [
|
|
228
|
-
tanstackToolCallStart("tc-2", "myTool"),
|
|
229
|
-
tanstackToolCallEnd("tc-2"),
|
|
230
|
-
{
|
|
231
|
-
type: "TOOL_CALL_RESULT",
|
|
232
|
-
toolCallId: "tc-2",
|
|
233
|
-
result: { data: 42 },
|
|
234
|
-
},
|
|
235
|
-
]);
|
|
236
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
237
|
-
|
|
238
|
-
const resultEvents = events.filter(
|
|
239
|
-
(e) => e.type === EventType.TOOL_CALL_RESULT,
|
|
240
|
-
);
|
|
241
|
-
expect(resultEvents).toHaveLength(1);
|
|
242
|
-
expect(
|
|
243
|
-
JSON.parse(eventField<string>(resultEvents[0], "content")),
|
|
244
|
-
).toEqual({ data: 42 });
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
// -------------------------------------------------------------------------
|
|
249
|
-
// Mixed Content
|
|
250
|
-
// -------------------------------------------------------------------------
|
|
251
|
-
describe("Mixed Content", () => {
|
|
252
|
-
it("text interleaved with tool calls produces correct event types and order", async () => {
|
|
253
|
-
const agent = createAgent("tanstack", [
|
|
254
|
-
tanstackTextChunk("Let me help. "),
|
|
255
|
-
tanstackToolCallStart("tc-1", "search"),
|
|
256
|
-
tanstackToolCallArgs("tc-1", '{"q":"test"}'),
|
|
257
|
-
tanstackToolCallEnd("tc-1"),
|
|
258
|
-
tanstackTextChunk("Here are the results."),
|
|
259
|
-
]);
|
|
260
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
261
|
-
|
|
262
|
-
expectLifecycleWrapped(events);
|
|
263
|
-
expectEventSequence(events, [
|
|
264
|
-
EventType.RUN_STARTED,
|
|
265
|
-
EventType.TEXT_MESSAGE_CHUNK,
|
|
266
|
-
EventType.TOOL_CALL_START,
|
|
267
|
-
EventType.TOOL_CALL_ARGS,
|
|
268
|
-
EventType.TOOL_CALL_END,
|
|
269
|
-
EventType.TEXT_MESSAGE_CHUNK,
|
|
270
|
-
EventType.RUN_FINISHED,
|
|
271
|
-
]);
|
|
272
|
-
|
|
273
|
-
// Verify content of text events
|
|
274
|
-
const textEvents = events.filter(
|
|
275
|
-
(e) => e.type === EventType.TEXT_MESSAGE_CHUNK,
|
|
276
|
-
);
|
|
277
|
-
expect(eventField<string>(textEvents[0], "delta")).toBe("Let me help. ");
|
|
278
|
-
expect(eventField<string>(textEvents[1], "delta")).toBe(
|
|
279
|
-
"Here are the results.",
|
|
280
|
-
);
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
// -------------------------------------------------------------------------
|
|
285
|
-
// Edge Cases
|
|
286
|
-
// -------------------------------------------------------------------------
|
|
287
|
-
describe("Edge Cases", () => {
|
|
288
|
-
it("unknown chunk types are silently ignored", async () => {
|
|
289
|
-
const agent = createAgent("tanstack", [
|
|
290
|
-
tanstackTextChunk("hello"),
|
|
291
|
-
{ type: "SOME_UNKNOWN_TYPE", data: "foo" },
|
|
292
|
-
{ type: "ANOTHER_MYSTERY", value: 42 },
|
|
293
|
-
tanstackTextChunk(" world"),
|
|
294
|
-
]);
|
|
295
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
296
|
-
|
|
297
|
-
expectLifecycleWrapped(events);
|
|
298
|
-
expectEventSequence(events, [
|
|
299
|
-
EventType.RUN_STARTED,
|
|
300
|
-
EventType.TEXT_MESSAGE_CHUNK,
|
|
301
|
-
EventType.TEXT_MESSAGE_CHUNK,
|
|
302
|
-
EventType.RUN_FINISHED,
|
|
303
|
-
]);
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it("large deltas (100k chars) are passed through", async () => {
|
|
307
|
-
const largeDelta = "x".repeat(100_000);
|
|
308
|
-
const agent = createAgent("tanstack", [tanstackTextChunk(largeDelta)]);
|
|
309
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
310
|
-
|
|
311
|
-
expectLifecycleWrapped(events);
|
|
312
|
-
|
|
313
|
-
const textEvent = events.find(
|
|
314
|
-
(e) => e.type === EventType.TEXT_MESSAGE_CHUNK,
|
|
315
|
-
)!;
|
|
316
|
-
expect(eventField<string>(textEvent, "delta")).toBe(largeDelta);
|
|
317
|
-
expect(eventField<string>(textEvent, "delta").length).toBe(100_000);
|
|
318
|
-
});
|
|
319
|
-
});
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
describe("TanStack AI converter — state tools", () => {
|
|
323
|
-
it("emits STATE_SNAPSHOT before TOOL_CALL_RESULT for AGUISendStateSnapshot", async () => {
|
|
324
|
-
const snapshot = { counter: 5, items: ["x", "y"] };
|
|
325
|
-
const agent = createAgent("tanstack", [
|
|
326
|
-
tanstackToolCallStart("call1", "AGUISendStateSnapshot"),
|
|
327
|
-
tanstackToolCallEnd("call1"),
|
|
328
|
-
tanstackToolCallResult("call1", { success: true, snapshot }),
|
|
329
|
-
]);
|
|
330
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
331
|
-
|
|
332
|
-
expectLifecycleWrapped(events);
|
|
333
|
-
|
|
334
|
-
const snapshotIdx = events.findIndex(
|
|
335
|
-
(e) => e.type === EventType.STATE_SNAPSHOT,
|
|
336
|
-
);
|
|
337
|
-
const resultIdx = events.findIndex(
|
|
338
|
-
(e) => e.type === EventType.TOOL_CALL_RESULT,
|
|
339
|
-
);
|
|
340
|
-
|
|
341
|
-
expect(snapshotIdx).toBeGreaterThanOrEqual(0);
|
|
342
|
-
expect(resultIdx).toBeGreaterThanOrEqual(0);
|
|
343
|
-
expect(snapshotIdx).toBeLessThan(resultIdx);
|
|
344
|
-
expect(eventField<unknown>(events[snapshotIdx], "snapshot")).toEqual(
|
|
345
|
-
snapshot,
|
|
346
|
-
);
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
it("emits STATE_DELTA before TOOL_CALL_RESULT for AGUISendStateDelta", async () => {
|
|
350
|
-
const delta = [{ op: "replace", path: "/counter", value: 7 }];
|
|
351
|
-
const agent = createAgent("tanstack", [
|
|
352
|
-
tanstackToolCallStart("call1", "AGUISendStateDelta"),
|
|
353
|
-
tanstackToolCallEnd("call1"),
|
|
354
|
-
tanstackToolCallResult("call1", { success: true, delta }),
|
|
355
|
-
]);
|
|
356
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
357
|
-
|
|
358
|
-
expectLifecycleWrapped(events);
|
|
359
|
-
|
|
360
|
-
const deltaIdx = events.findIndex((e) => e.type === EventType.STATE_DELTA);
|
|
361
|
-
const resultIdx = events.findIndex(
|
|
362
|
-
(e) => e.type === EventType.TOOL_CALL_RESULT,
|
|
363
|
-
);
|
|
364
|
-
|
|
365
|
-
expect(deltaIdx).toBeGreaterThanOrEqual(0);
|
|
366
|
-
expect(deltaIdx).toBeLessThan(resultIdx);
|
|
367
|
-
expect(eventField<unknown>(events[deltaIdx], "delta")).toEqual(delta);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
it("emits STATE_SNAPSHOT when payload arrives in raw.result instead of raw.content", async () => {
|
|
371
|
-
// Regression: serialization fell back to raw.result (`?? raw.result ?? null`)
|
|
372
|
-
// but state-tool detection only inspected raw.content, so STATE_* events
|
|
373
|
-
// were silently dropped if upstream used `result` for the state-tool body.
|
|
374
|
-
// See the "TOOL_CALL_RESULT with object content serializes to JSON" test
|
|
375
|
-
// above which already exercises the `result` field on a non-state tool.
|
|
376
|
-
const snapshot = { counter: 99 };
|
|
377
|
-
const agent = createAgent("tanstack", [
|
|
378
|
-
tanstackToolCallStart("call1", "AGUISendStateSnapshot"),
|
|
379
|
-
tanstackToolCallEnd("call1"),
|
|
380
|
-
{
|
|
381
|
-
type: "TOOL_CALL_RESULT",
|
|
382
|
-
toolCallId: "call1",
|
|
383
|
-
result: { success: true, snapshot },
|
|
384
|
-
},
|
|
385
|
-
]);
|
|
386
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
387
|
-
|
|
388
|
-
expectLifecycleWrapped(events);
|
|
389
|
-
|
|
390
|
-
const snapshotIdx = events.findIndex(
|
|
391
|
-
(e) => e.type === EventType.STATE_SNAPSHOT,
|
|
392
|
-
);
|
|
393
|
-
expect(snapshotIdx).toBeGreaterThanOrEqual(0);
|
|
394
|
-
expect(eventField<unknown>(events[snapshotIdx], "snapshot")).toEqual(
|
|
395
|
-
snapshot,
|
|
396
|
-
);
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
it("does NOT emit STATE_* for non-state tool results", async () => {
|
|
400
|
-
const agent = createAgent("tanstack", [
|
|
401
|
-
tanstackToolCallStart("call1", "getWeather"),
|
|
402
|
-
tanstackToolCallEnd("call1"),
|
|
403
|
-
tanstackToolCallResult("call1", {
|
|
404
|
-
snapshot: { spoofed: true },
|
|
405
|
-
delta: [{ op: "x" }],
|
|
406
|
-
}),
|
|
407
|
-
]);
|
|
408
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
409
|
-
|
|
410
|
-
expectLifecycleWrapped(events);
|
|
411
|
-
|
|
412
|
-
expect(
|
|
413
|
-
events.find(
|
|
414
|
-
(e) =>
|
|
415
|
-
e.type === EventType.STATE_SNAPSHOT ||
|
|
416
|
-
e.type === EventType.STATE_DELTA,
|
|
417
|
-
),
|
|
418
|
-
).toBeUndefined();
|
|
419
|
-
expect(
|
|
420
|
-
events.find((e) => e.type === EventType.TOOL_CALL_RESULT),
|
|
421
|
-
).toBeDefined();
|
|
422
|
-
});
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
describe("TanStack AI converter — reasoning", () => {
|
|
426
|
-
it("emits the full REASONING lifecycle for reasoning chunks", async () => {
|
|
427
|
-
const agent = createAgent("tanstack", [
|
|
428
|
-
tanstackReasoningStart("r1"),
|
|
429
|
-
tanstackReasoningMessageStart("r1"),
|
|
430
|
-
tanstackReasoningMessageContent("r1", "thinking"),
|
|
431
|
-
tanstackReasoningMessageEnd("r1"),
|
|
432
|
-
tanstackReasoningEnd("r1"),
|
|
433
|
-
]);
|
|
434
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
435
|
-
|
|
436
|
-
expectLifecycleWrapped(events);
|
|
437
|
-
|
|
438
|
-
// Strip the lifecycle wrap and inspect the inner sequence.
|
|
439
|
-
const inner = events.slice(1, -1).map((e) => e.type);
|
|
440
|
-
expect(inner).toEqual([
|
|
441
|
-
EventType.REASONING_START,
|
|
442
|
-
EventType.REASONING_MESSAGE_START,
|
|
443
|
-
EventType.REASONING_MESSAGE_CONTENT,
|
|
444
|
-
EventType.REASONING_MESSAGE_END,
|
|
445
|
-
EventType.REASONING_END,
|
|
446
|
-
]);
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
it("auto-closes an open reasoning lifecycle when text starts", async () => {
|
|
450
|
-
const agent = createAgent("tanstack", [
|
|
451
|
-
tanstackReasoningStart("r1"),
|
|
452
|
-
tanstackReasoningMessageStart("r1"),
|
|
453
|
-
tanstackReasoningMessageContent("r1", "thinking"),
|
|
454
|
-
// No REASONING_MESSAGE_END / REASONING_END before text
|
|
455
|
-
tanstackTextChunk("Hi"),
|
|
456
|
-
]);
|
|
457
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
458
|
-
const types = events.map((e) => e.type);
|
|
459
|
-
|
|
460
|
-
const reasonEndIdx = types.indexOf(EventType.REASONING_END);
|
|
461
|
-
const reasonMsgEndIdx = types.indexOf(EventType.REASONING_MESSAGE_END);
|
|
462
|
-
const textIdx = types.indexOf(EventType.TEXT_MESSAGE_CHUNK);
|
|
463
|
-
|
|
464
|
-
expect(reasonMsgEndIdx).toBeGreaterThan(-1);
|
|
465
|
-
expect(reasonEndIdx).toBeGreaterThan(-1);
|
|
466
|
-
expect(reasonEndIdx).toBeLessThan(textIdx);
|
|
467
|
-
});
|
|
468
|
-
|
|
469
|
-
it("auto-closes an open reasoning lifecycle when a tool call starts", async () => {
|
|
470
|
-
const agent = createAgent("tanstack", [
|
|
471
|
-
tanstackReasoningStart("r1"),
|
|
472
|
-
tanstackReasoningMessageStart("r1"),
|
|
473
|
-
tanstackReasoningMessageContent("r1", "..."),
|
|
474
|
-
tanstackToolCallStart("t1", "x"),
|
|
475
|
-
]);
|
|
476
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
477
|
-
const types = events.map((e) => e.type);
|
|
478
|
-
|
|
479
|
-
expect(types).toContain(EventType.REASONING_MESSAGE_END);
|
|
480
|
-
expect(types).toContain(EventType.REASONING_END);
|
|
481
|
-
expect(types.indexOf(EventType.REASONING_END)).toBeLessThan(
|
|
482
|
-
types.indexOf(EventType.TOOL_CALL_START),
|
|
483
|
-
);
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
it("auto-closes when the stream ends without explicit reasoning end", async () => {
|
|
487
|
-
const agent = createAgent("tanstack", [
|
|
488
|
-
tanstackReasoningStart("r1"),
|
|
489
|
-
tanstackReasoningMessageStart("r1"),
|
|
490
|
-
tanstackReasoningMessageContent("r1", "x"),
|
|
491
|
-
]);
|
|
492
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
493
|
-
const types = events.map((e) => e.type);
|
|
494
|
-
|
|
495
|
-
expect(types).toContain(EventType.REASONING_MESSAGE_END);
|
|
496
|
-
expect(types).toContain(EventType.REASONING_END);
|
|
497
|
-
});
|
|
498
|
-
|
|
499
|
-
it("emits REASONING_MESSAGE_END before REASONING_END when upstream sends END with message still open", async () => {
|
|
500
|
-
// Regression: if the converter received REASONING_END while a message
|
|
501
|
-
// was still open, it cleared run-open and emitted END only — leaving
|
|
502
|
-
// message-open true. The next non-reasoning chunk then triggered
|
|
503
|
-
// closeReasoningIfOpen, which emitted MSG_END AFTER END (wrong order).
|
|
504
|
-
// Fix: REASONING_END handler closes any open message first.
|
|
505
|
-
const agent = createAgent("tanstack", [
|
|
506
|
-
tanstackReasoningStart("r1"),
|
|
507
|
-
tanstackReasoningMessageStart("r1"),
|
|
508
|
-
tanstackReasoningMessageContent("r1", "thinking"),
|
|
509
|
-
// Upstream skips MSG_END and goes straight to END
|
|
510
|
-
tanstackReasoningEnd("r1"),
|
|
511
|
-
tanstackTextChunk("Hi"),
|
|
512
|
-
]);
|
|
513
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
514
|
-
const types = events.map((e) => e.type);
|
|
515
|
-
|
|
516
|
-
const msgEndIdx = types.indexOf(EventType.REASONING_MESSAGE_END);
|
|
517
|
-
const endIdx = types.indexOf(EventType.REASONING_END);
|
|
518
|
-
|
|
519
|
-
expect(msgEndIdx).toBeGreaterThan(-1);
|
|
520
|
-
expect(endIdx).toBeGreaterThan(-1);
|
|
521
|
-
expect(msgEndIdx).toBeLessThan(endIdx);
|
|
522
|
-
// No duplicate MSG_END or END from auto-close on the text chunk
|
|
523
|
-
expect(
|
|
524
|
-
types.filter((t) => t === EventType.REASONING_MESSAGE_END),
|
|
525
|
-
).toHaveLength(1);
|
|
526
|
-
expect(types.filter((t) => t === EventType.REASONING_END)).toHaveLength(1);
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
it("auto-closes prior reasoning run when a new REASONING_START arrives without END", async () => {
|
|
530
|
-
// Regression: REASONING_START used to overwrite reasoningMessageId
|
|
531
|
-
// unconditionally, orphaning the prior run's MSG_END / END.
|
|
532
|
-
// Fix: REASONING_START handler calls closeReasoningIfOpen() first.
|
|
533
|
-
const agent = createAgent("tanstack", [
|
|
534
|
-
tanstackReasoningStart("r1"),
|
|
535
|
-
tanstackReasoningMessageStart("r1"),
|
|
536
|
-
tanstackReasoningMessageContent("r1", "first"),
|
|
537
|
-
// Second START with no intervening END
|
|
538
|
-
tanstackReasoningStart("r2"),
|
|
539
|
-
tanstackReasoningMessageStart("r2"),
|
|
540
|
-
tanstackReasoningMessageContent("r2", "second"),
|
|
541
|
-
tanstackReasoningMessageEnd("r2"),
|
|
542
|
-
tanstackReasoningEnd("r2"),
|
|
543
|
-
]);
|
|
544
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
545
|
-
const types = events.map((e) => e.type);
|
|
546
|
-
|
|
547
|
-
// Two complete START → MSG_START → ... → MSG_END → END sequences
|
|
548
|
-
expect(types.filter((t) => t === EventType.REASONING_START)).toHaveLength(
|
|
549
|
-
2,
|
|
550
|
-
);
|
|
551
|
-
expect(types.filter((t) => t === EventType.REASONING_END)).toHaveLength(2);
|
|
552
|
-
expect(
|
|
553
|
-
types.filter((t) => t === EventType.REASONING_MESSAGE_END),
|
|
554
|
-
).toHaveLength(2);
|
|
555
|
-
|
|
556
|
-
// First START's prior message gets closed BEFORE the second START
|
|
557
|
-
const firstEndIdx = types.indexOf(EventType.REASONING_END);
|
|
558
|
-
const secondStartIdx = types.indexOf(
|
|
559
|
-
EventType.REASONING_START,
|
|
560
|
-
firstEndIdx + 1,
|
|
561
|
-
);
|
|
562
|
-
expect(firstEndIdx).toBeLessThan(secondStartIdx);
|
|
563
|
-
});
|
|
564
|
-
|
|
565
|
-
it("does NOT duplicate REASONING_MESSAGE_END when upstream emits it explicitly before text", async () => {
|
|
566
|
-
// Regression: a single isInReasoning flag conflated message-open with
|
|
567
|
-
// run-open, so closeReasoningIfOpen on TEXT_MESSAGE_CONTENT emitted a
|
|
568
|
-
// second REASONING_MESSAGE_END after upstream's own. Track message-open
|
|
569
|
-
// and run-open separately so closeReasoningIfOpen owes only what's still
|
|
570
|
-
// open.
|
|
571
|
-
const agent = createAgent("tanstack", [
|
|
572
|
-
tanstackReasoningStart("r1"),
|
|
573
|
-
tanstackReasoningMessageStart("r1"),
|
|
574
|
-
tanstackReasoningMessageContent("r1", "thinking"),
|
|
575
|
-
tanstackReasoningMessageEnd("r1"),
|
|
576
|
-
// No explicit REASONING_END before text — closeReasoningIfOpen should
|
|
577
|
-
// emit REASONING_END but NOT a second REASONING_MESSAGE_END.
|
|
578
|
-
tanstackTextChunk("Hi"),
|
|
579
|
-
]);
|
|
580
|
-
const events = await collectEvents(agent.run(createDefaultInput()));
|
|
581
|
-
const types = events.map((e) => e.type);
|
|
582
|
-
|
|
583
|
-
const msgEndCount = types.filter(
|
|
584
|
-
(t) => t === EventType.REASONING_MESSAGE_END,
|
|
585
|
-
).length;
|
|
586
|
-
const endCount = types.filter((t) => t === EventType.REASONING_END).length;
|
|
587
|
-
|
|
588
|
-
expect(msgEndCount).toBe(1);
|
|
589
|
-
expect(endCount).toBe(1);
|
|
590
|
-
expect(types.indexOf(EventType.REASONING_END)).toBeLessThan(
|
|
591
|
-
types.indexOf(EventType.TEXT_MESSAGE_CHUNK),
|
|
592
|
-
);
|
|
593
|
-
});
|
|
594
|
-
});
|