@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,246 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { BasicAgent, type MCPClientProvider } from "../index";
|
|
3
|
-
import { EventType, type RunAgentInput } from "@ag-ui/client";
|
|
4
|
-
import { streamText } from "ai";
|
|
5
|
-
import {
|
|
6
|
-
mockStreamTextResponse,
|
|
7
|
-
textDelta,
|
|
8
|
-
finish,
|
|
9
|
-
collectEvents,
|
|
10
|
-
} from "./test-helpers";
|
|
11
|
-
|
|
12
|
-
// Mock the ai module
|
|
13
|
-
vi.mock("ai", () => ({
|
|
14
|
-
streamText: vi.fn(),
|
|
15
|
-
tool: vi.fn((config) => config),
|
|
16
|
-
stepCountIs: vi.fn((count: number) => ({ type: "stepCount", count })),
|
|
17
|
-
}));
|
|
18
|
-
|
|
19
|
-
// Mock the SDK clients
|
|
20
|
-
vi.mock("@ai-sdk/openai", () => ({
|
|
21
|
-
createOpenAI: vi.fn(() => (modelId: string) => ({
|
|
22
|
-
modelId,
|
|
23
|
-
provider: "openai",
|
|
24
|
-
})),
|
|
25
|
-
}));
|
|
26
|
-
|
|
27
|
-
// Mock MCP imports so mcpServers code path doesn't fail when tested alongside mcpClients
|
|
28
|
-
vi.mock("@ai-sdk/mcp", () => ({
|
|
29
|
-
createMCPClient: vi.fn(),
|
|
30
|
-
}));
|
|
31
|
-
|
|
32
|
-
describe("mcpClients — user-managed MCP clients", () => {
|
|
33
|
-
const originalEnv = process.env;
|
|
34
|
-
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
vi.clearAllMocks();
|
|
37
|
-
process.env = { ...originalEnv };
|
|
38
|
-
process.env.OPENAI_API_KEY = "test-key";
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
afterEach(() => {
|
|
42
|
-
process.env = originalEnv;
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const baseInput: RunAgentInput = {
|
|
46
|
-
threadId: "thread1",
|
|
47
|
-
runId: "run1",
|
|
48
|
-
messages: [],
|
|
49
|
-
tools: [],
|
|
50
|
-
context: [],
|
|
51
|
-
state: {},
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
function makeMockProvider(
|
|
55
|
-
tools: Record<string, any>,
|
|
56
|
-
): MCPClientProvider & { close: ReturnType<typeof vi.fn> } {
|
|
57
|
-
return {
|
|
58
|
-
tools: vi.fn().mockResolvedValue(tools),
|
|
59
|
-
close: vi.fn(),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
it("tools from mcpClients are passed to streamText", async () => {
|
|
64
|
-
const mockTools = {
|
|
65
|
-
listEnvelopes: { description: "List envelopes", execute: vi.fn() },
|
|
66
|
-
};
|
|
67
|
-
const provider = makeMockProvider(mockTools);
|
|
68
|
-
|
|
69
|
-
const agent = new BasicAgent({
|
|
70
|
-
model: "openai/gpt-4o",
|
|
71
|
-
mcpClients: [provider],
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
vi.mocked(streamText).mockReturnValue(
|
|
75
|
-
mockStreamTextResponse([textDelta("Hello"), finish()]) as any,
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
await collectEvents(agent["run"](baseInput));
|
|
79
|
-
|
|
80
|
-
const callArgs = vi.mocked(streamText).mock.calls[0][0];
|
|
81
|
-
expect(callArgs.tools).toHaveProperty("listEnvelopes");
|
|
82
|
-
expect(callArgs.tools.listEnvelopes.description).toBe("List envelopes");
|
|
83
|
-
expect(provider.tools).toHaveBeenCalledOnce();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("mcpClients are NOT closed after run completes", async () => {
|
|
87
|
-
const provider = makeMockProvider({
|
|
88
|
-
myTool: { description: "A tool", execute: vi.fn() },
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
const agent = new BasicAgent({
|
|
92
|
-
model: "openai/gpt-4o",
|
|
93
|
-
mcpClients: [provider],
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
vi.mocked(streamText).mockReturnValue(
|
|
97
|
-
mockStreamTextResponse([finish()]) as any,
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
await collectEvents(agent["run"](baseInput));
|
|
101
|
-
|
|
102
|
-
expect(provider.close).not.toHaveBeenCalled();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("mcpServers tools override mcpClients tools on name collision", async () => {
|
|
106
|
-
const clientExecute = vi.fn();
|
|
107
|
-
const serverExecute = vi.fn();
|
|
108
|
-
|
|
109
|
-
const provider = makeMockProvider({
|
|
110
|
-
sharedTool: { description: "from client", execute: clientExecute },
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Mock mcpServers flow: createMCPClient returns a client with tools()
|
|
114
|
-
const { createMCPClient } = await import("@ai-sdk/mcp");
|
|
115
|
-
vi.mocked(createMCPClient).mockResolvedValue({
|
|
116
|
-
tools: vi.fn().mockResolvedValue({
|
|
117
|
-
sharedTool: { description: "from server", execute: serverExecute },
|
|
118
|
-
}),
|
|
119
|
-
close: vi.fn(),
|
|
120
|
-
} as any);
|
|
121
|
-
|
|
122
|
-
const agent = new BasicAgent({
|
|
123
|
-
model: "openai/gpt-4o",
|
|
124
|
-
mcpClients: [provider],
|
|
125
|
-
mcpServers: [{ type: "http", url: "http://localhost:9999" }],
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
vi.mocked(streamText).mockReturnValue(
|
|
129
|
-
mockStreamTextResponse([finish()]) as any,
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
await collectEvents(agent["run"](baseInput));
|
|
133
|
-
|
|
134
|
-
const callArgs = vi.mocked(streamText).mock.calls[0][0];
|
|
135
|
-
// mcpServers runs after mcpClients, so "from server" should win
|
|
136
|
-
expect(callArgs.tools.sharedTool.description).toBe("from server");
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("multiple mcpClients merge in order (later overrides earlier)", async () => {
|
|
140
|
-
const provider1 = makeMockProvider({
|
|
141
|
-
toolA: { description: "from provider 1", execute: vi.fn() },
|
|
142
|
-
shared: { description: "from provider 1", execute: vi.fn() },
|
|
143
|
-
});
|
|
144
|
-
const provider2 = makeMockProvider({
|
|
145
|
-
toolB: { description: "from provider 2", execute: vi.fn() },
|
|
146
|
-
shared: { description: "from provider 2", execute: vi.fn() },
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
const agent = new BasicAgent({
|
|
150
|
-
model: "openai/gpt-4o",
|
|
151
|
-
mcpClients: [provider1, provider2],
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
vi.mocked(streamText).mockReturnValue(
|
|
155
|
-
mockStreamTextResponse([finish()]) as any,
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
await collectEvents(agent["run"](baseInput));
|
|
159
|
-
|
|
160
|
-
const callArgs = vi.mocked(streamText).mock.calls[0][0];
|
|
161
|
-
expect(callArgs.tools).toHaveProperty("toolA");
|
|
162
|
-
expect(callArgs.tools).toHaveProperty("toolB");
|
|
163
|
-
expect(callArgs.tools.shared.description).toBe("from provider 2");
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("empty mcpClients array is a no-op", async () => {
|
|
167
|
-
const agent = new BasicAgent({
|
|
168
|
-
model: "openai/gpt-4o",
|
|
169
|
-
mcpClients: [],
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
vi.mocked(streamText).mockReturnValue(
|
|
173
|
-
mockStreamTextResponse([textDelta("Hi"), finish()]) as any,
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
const events = await collectEvents(agent["run"](baseInput));
|
|
177
|
-
|
|
178
|
-
// Should still work normally
|
|
179
|
-
const textEvents = events.filter(
|
|
180
|
-
(e: any) => e.type === EventType.TEXT_MESSAGE_CHUNK,
|
|
181
|
-
);
|
|
182
|
-
expect(textEvents.length).toBeGreaterThan(0);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it("mcpClients .tools() rejection emits RUN_ERROR", async () => {
|
|
186
|
-
const failingProvider: MCPClientProvider = {
|
|
187
|
-
tools: vi.fn().mockRejectedValue(new Error("MCP connection lost")),
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const agent = new BasicAgent({
|
|
191
|
-
model: "openai/gpt-4o",
|
|
192
|
-
mcpClients: [failingProvider],
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
vi.mocked(streamText).mockReturnValue(
|
|
196
|
-
mockStreamTextResponse([finish()]) as any,
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
// Collect events manually so we can capture RUN_ERROR before the rejection
|
|
200
|
-
const events: any[] = [];
|
|
201
|
-
try {
|
|
202
|
-
await new Promise((resolve, reject) => {
|
|
203
|
-
agent["run"](baseInput).subscribe({
|
|
204
|
-
next: (event: any) => events.push(event),
|
|
205
|
-
error: (err: any) => reject(err),
|
|
206
|
-
complete: () => resolve(events),
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
} catch {
|
|
210
|
-
// Expected — Observable errors after emitting RUN_ERROR
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// streamText should NOT have been called (error before reaching it)
|
|
214
|
-
expect(streamText).not.toHaveBeenCalled();
|
|
215
|
-
// A RUN_ERROR event should have been emitted
|
|
216
|
-
expect(events.some((e) => e.type === EventType.RUN_ERROR)).toBe(true);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it("clone() shares the same mcpClients references", () => {
|
|
220
|
-
const provider = makeMockProvider({});
|
|
221
|
-
|
|
222
|
-
const agent = new BasicAgent({
|
|
223
|
-
model: "openai/gpt-4o",
|
|
224
|
-
mcpClients: [provider],
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
const cloned = agent.clone();
|
|
228
|
-
|
|
229
|
-
// Access the config to verify same reference
|
|
230
|
-
// Both agents share the same config object (by reference)
|
|
231
|
-
expect((cloned as any).config.mcpClients[0]).toBe(provider);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it("type compatibility: @ai-sdk/mcp MCPClient satisfies MCPClientProvider", async () => {
|
|
235
|
-
// Compile-time check that `MCPClientProvider` is structurally compatible
|
|
236
|
-
// with `@ai-sdk/mcp`'s `MCPClient`. After the refactor `MCPClientProvider`
|
|
237
|
-
// is an alias for `Pick<MCPClient, "tools">`, so this is trivially true —
|
|
238
|
-
// but keeping the test guards against future divergence.
|
|
239
|
-
type MCPClient = Awaited<
|
|
240
|
-
ReturnType<typeof import("@ai-sdk/mcp").createMCPClient>
|
|
241
|
-
>;
|
|
242
|
-
const _assignable: MCPClientProvider = {} as MCPClient;
|
|
243
|
-
void _assignable;
|
|
244
|
-
expect(true).toBe(true);
|
|
245
|
-
});
|
|
246
|
-
});
|
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { BasicAgent } from "../index";
|
|
3
|
-
import { EventType } from "@ag-ui/client";
|
|
4
|
-
import { streamText } from "ai";
|
|
5
|
-
import { LLMock, MCPMock } from "@copilotkit/aimock";
|
|
6
|
-
import {
|
|
7
|
-
mockStreamTextResponse,
|
|
8
|
-
textDelta,
|
|
9
|
-
finish,
|
|
10
|
-
collectEvents,
|
|
11
|
-
toolCall,
|
|
12
|
-
toolResult,
|
|
13
|
-
} from "./test-helpers";
|
|
14
|
-
|
|
15
|
-
// Mock the ai module — we don't want real LLM calls
|
|
16
|
-
vi.mock("ai", () => ({
|
|
17
|
-
streamText: vi.fn(),
|
|
18
|
-
tool: vi.fn((config) => config),
|
|
19
|
-
stepCountIs: vi.fn((count: number) => ({ type: "stepCount", count })),
|
|
20
|
-
}));
|
|
21
|
-
|
|
22
|
-
vi.mock("@ai-sdk/openai", () => ({
|
|
23
|
-
createOpenAI: vi.fn(() => (modelId: string) => ({
|
|
24
|
-
modelId,
|
|
25
|
-
provider: "openai",
|
|
26
|
-
})),
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
// Do NOT mock @ai-sdk/mcp or @modelcontextprotocol/sdk transports —
|
|
30
|
-
// we want real HTTP connections to the MCPMock server.
|
|
31
|
-
|
|
32
|
-
describe("mcpServers — real MCP server integration", () => {
|
|
33
|
-
const originalEnv = process.env;
|
|
34
|
-
let llm: LLMock;
|
|
35
|
-
let mcpMock: MCPMock;
|
|
36
|
-
|
|
37
|
-
beforeEach(() => {
|
|
38
|
-
vi.clearAllMocks();
|
|
39
|
-
process.env = { ...originalEnv };
|
|
40
|
-
process.env.OPENAI_API_KEY = "test-key";
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
afterEach(async () => {
|
|
44
|
-
process.env = originalEnv;
|
|
45
|
-
if (llm) {
|
|
46
|
-
await llm.stop().catch(() => {});
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const baseInput = {
|
|
51
|
-
threadId: "thread1",
|
|
52
|
-
runId: "run1",
|
|
53
|
-
messages: [],
|
|
54
|
-
tools: [],
|
|
55
|
-
context: [],
|
|
56
|
-
state: {},
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Start an LLMock with an MCPMock mounted at /mcp.
|
|
61
|
-
* Returns the full MCP endpoint URL.
|
|
62
|
-
*/
|
|
63
|
-
async function startMcpServer(
|
|
64
|
-
tools: Array<{ name: string; description?: string }>,
|
|
65
|
-
): Promise<{ mcpUrl: string; llm: LLMock; mcpMock: MCPMock }> {
|
|
66
|
-
const mock = new MCPMock();
|
|
67
|
-
for (const t of tools) {
|
|
68
|
-
mock.addTool({
|
|
69
|
-
name: t.name,
|
|
70
|
-
description: t.description ?? `${t.name} tool`,
|
|
71
|
-
inputSchema: {
|
|
72
|
-
type: "object",
|
|
73
|
-
properties: { query: { type: "string" } },
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
mock.onToolCall(t.name, () => `result from ${t.name}`);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const server = new LLMock({ port: 0 });
|
|
80
|
-
server.mount("/mcp", mock);
|
|
81
|
-
await server.start();
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
mcpUrl: `${server.url}/mcp`,
|
|
85
|
-
llm: server,
|
|
86
|
-
mcpMock: mock,
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
it("HTTP transport fetches tools from MCPMock", async () => {
|
|
91
|
-
const result = await startMcpServer([
|
|
92
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
93
|
-
]);
|
|
94
|
-
llm = result.llm;
|
|
95
|
-
mcpMock = result.mcpMock;
|
|
96
|
-
|
|
97
|
-
const agent = new BasicAgent({
|
|
98
|
-
model: "openai/gpt-4o",
|
|
99
|
-
mcpServers: [{ type: "http", url: result.mcpUrl }],
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
vi.mocked(streamText).mockReturnValue(
|
|
103
|
-
mockStreamTextResponse([textDelta("Hello"), finish()]) as any,
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
await collectEvents(agent["run"](baseInput));
|
|
107
|
-
|
|
108
|
-
const callArgs = vi.mocked(streamText).mock.calls[0][0];
|
|
109
|
-
expect(callArgs.tools).toHaveProperty("get_weather");
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it("SSE transport against MCPMock emits RUN_ERROR or completes without crash", async () => {
|
|
113
|
-
// MCPMock only supports Streamable HTTP, not SSE.
|
|
114
|
-
// The agent should emit RUN_ERROR when SSE connection fails.
|
|
115
|
-
const result = await startMcpServer([
|
|
116
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
117
|
-
]);
|
|
118
|
-
llm = result.llm;
|
|
119
|
-
mcpMock = result.mcpMock;
|
|
120
|
-
|
|
121
|
-
const agent = new BasicAgent({
|
|
122
|
-
model: "openai/gpt-4o",
|
|
123
|
-
mcpServers: [{ type: "sse", url: result.mcpUrl }],
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
vi.mocked(streamText).mockReturnValue(
|
|
127
|
-
mockStreamTextResponse([finish()]) as any,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
// Collect events manually — the Observable may error after emitting RUN_ERROR
|
|
131
|
-
const events: any[] = [];
|
|
132
|
-
try {
|
|
133
|
-
await new Promise((resolve, reject) => {
|
|
134
|
-
agent["run"](baseInput).subscribe({
|
|
135
|
-
next: (event: any) => events.push(event),
|
|
136
|
-
error: (err: any) => reject(err),
|
|
137
|
-
complete: () => resolve(events),
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
// If it completes without error, that's also acceptable (graceful fallthrough)
|
|
141
|
-
} catch {
|
|
142
|
-
// Expected — SSE transport failure should emit RUN_ERROR then error
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const hasRunError = events.some((e) => e.type === EventType.RUN_ERROR);
|
|
146
|
-
// Either we got a RUN_ERROR or streamText was never called (connection failed before tools fetch)
|
|
147
|
-
expect(hasRunError || !vi.mocked(streamText).mock.calls.length).toBe(true);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it("tool call round-trip emits TOOL_CALL_START, TOOL_CALL_RESULT, and TEXT_MESSAGE_CHUNK", async () => {
|
|
151
|
-
const result = await startMcpServer([
|
|
152
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
153
|
-
]);
|
|
154
|
-
llm = result.llm;
|
|
155
|
-
mcpMock = result.mcpMock;
|
|
156
|
-
|
|
157
|
-
const agent = new BasicAgent({
|
|
158
|
-
model: "openai/gpt-4o",
|
|
159
|
-
mcpServers: [{ type: "http", url: result.mcpUrl }],
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
vi.mocked(streamText).mockReturnValue(
|
|
163
|
-
mockStreamTextResponse([
|
|
164
|
-
toolCall("tc1", "get_weather", { query: "NYC" }),
|
|
165
|
-
toolResult("tc1", "get_weather", "Sunny 72F"),
|
|
166
|
-
textDelta("The weather is sunny."),
|
|
167
|
-
finish(),
|
|
168
|
-
]) as any,
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
const events = await collectEvents(agent["run"](baseInput));
|
|
172
|
-
|
|
173
|
-
const types = events.map((e: any) => e.type);
|
|
174
|
-
expect(types).toContain(EventType.TOOL_CALL_START);
|
|
175
|
-
expect(types).toContain(EventType.TOOL_CALL_RESULT);
|
|
176
|
-
expect(types).toContain(EventType.TEXT_MESSAGE_CHUNK);
|
|
177
|
-
|
|
178
|
-
// Verify the tool call result content
|
|
179
|
-
const resultEvent = events.find(
|
|
180
|
-
(e: any) => e.type === EventType.TOOL_CALL_RESULT,
|
|
181
|
-
) as any;
|
|
182
|
-
expect(resultEvent.toolCallId).toBe("tc1");
|
|
183
|
-
expect(resultEvent.content).toContain("Sunny 72F");
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it("MCP clients are cleaned up after completion — second run creates fresh connections", async () => {
|
|
187
|
-
const result = await startMcpServer([
|
|
188
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
189
|
-
]);
|
|
190
|
-
llm = result.llm;
|
|
191
|
-
mcpMock = result.mcpMock;
|
|
192
|
-
|
|
193
|
-
const agent = new BasicAgent({
|
|
194
|
-
model: "openai/gpt-4o",
|
|
195
|
-
mcpServers: [{ type: "http", url: result.mcpUrl }],
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// First run
|
|
199
|
-
vi.mocked(streamText).mockReturnValue(
|
|
200
|
-
mockStreamTextResponse([textDelta("Run 1"), finish()]) as any,
|
|
201
|
-
);
|
|
202
|
-
const events1 = await collectEvents(agent["run"](baseInput));
|
|
203
|
-
expect(events1.some((e: any) => e.type === EventType.RUN_FINISHED)).toBe(
|
|
204
|
-
true,
|
|
205
|
-
);
|
|
206
|
-
|
|
207
|
-
// Second run — should succeed with fresh MCP client connections
|
|
208
|
-
vi.mocked(streamText).mockReturnValue(
|
|
209
|
-
mockStreamTextResponse([textDelta("Run 2"), finish()]) as any,
|
|
210
|
-
);
|
|
211
|
-
const events2 = await collectEvents(agent["run"](baseInput));
|
|
212
|
-
expect(events2.some((e: any) => e.type === EventType.RUN_FINISHED)).toBe(
|
|
213
|
-
true,
|
|
214
|
-
);
|
|
215
|
-
|
|
216
|
-
// streamText was called twice (once per run), each time with MCP tools
|
|
217
|
-
expect(vi.mocked(streamText).mock.calls).toHaveLength(2);
|
|
218
|
-
expect(vi.mocked(streamText).mock.calls[0][0].tools).toHaveProperty(
|
|
219
|
-
"get_weather",
|
|
220
|
-
);
|
|
221
|
-
expect(vi.mocked(streamText).mock.calls[1][0].tools).toHaveProperty(
|
|
222
|
-
"get_weather",
|
|
223
|
-
);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it("unreachable MCP server emits RUN_ERROR", async () => {
|
|
227
|
-
const agent = new BasicAgent({
|
|
228
|
-
model: "openai/gpt-4o",
|
|
229
|
-
mcpServers: [{ type: "http", url: "http://localhost:59999" }],
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
vi.mocked(streamText).mockReturnValue(
|
|
233
|
-
mockStreamTextResponse([finish()]) as any,
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
const events: any[] = [];
|
|
237
|
-
try {
|
|
238
|
-
await new Promise((resolve, reject) => {
|
|
239
|
-
agent["run"](baseInput).subscribe({
|
|
240
|
-
next: (event: any) => events.push(event),
|
|
241
|
-
error: (err: any) => reject(err),
|
|
242
|
-
complete: () => resolve(events),
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
} catch {
|
|
246
|
-
// Expected — connection refused should cause an error
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
expect(events.some((e) => e.type === EventType.RUN_ERROR)).toBe(true);
|
|
250
|
-
// streamText should not have been called since MCP init failed
|
|
251
|
-
expect(streamText).not.toHaveBeenCalled();
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it("MCP clients are cleaned up after streamText error — subsequent run still works", async () => {
|
|
255
|
-
const result = await startMcpServer([
|
|
256
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
257
|
-
]);
|
|
258
|
-
llm = result.llm;
|
|
259
|
-
mcpMock = result.mcpMock;
|
|
260
|
-
|
|
261
|
-
const agent = new BasicAgent({
|
|
262
|
-
model: "openai/gpt-4o",
|
|
263
|
-
mcpServers: [{ type: "http", url: result.mcpUrl }],
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
// First run — streamText throws an error
|
|
267
|
-
vi.mocked(streamText).mockImplementation(() => {
|
|
268
|
-
throw new Error("LLM connection failed");
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
const events1: any[] = [];
|
|
272
|
-
try {
|
|
273
|
-
await new Promise((resolve, reject) => {
|
|
274
|
-
agent["run"](baseInput).subscribe({
|
|
275
|
-
next: (event: any) => events1.push(event),
|
|
276
|
-
error: (err: any) => reject(err),
|
|
277
|
-
complete: () => resolve(events1),
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
} catch {
|
|
281
|
-
// Expected — streamText threw
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Should have emitted RUN_ERROR
|
|
285
|
-
expect(events1.some((e) => e.type === EventType.RUN_ERROR)).toBe(true);
|
|
286
|
-
|
|
287
|
-
// Second run — streamText works normally, proving MCP cleanup happened
|
|
288
|
-
vi.mocked(streamText).mockReturnValue(
|
|
289
|
-
mockStreamTextResponse([textDelta("Recovery"), finish()]) as any,
|
|
290
|
-
);
|
|
291
|
-
const events2 = await collectEvents(agent["run"](baseInput));
|
|
292
|
-
expect(events2.some((e: any) => e.type === EventType.RUN_FINISHED)).toBe(
|
|
293
|
-
true,
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
// The second run should have MCP tools available
|
|
297
|
-
const secondCallArgs = vi.mocked(streamText).mock.calls[1][0];
|
|
298
|
-
expect(secondCallArgs.tools).toHaveProperty("get_weather");
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
it("MCP tool descriptions are passed to streamText tools config", async () => {
|
|
302
|
-
const result = await startMcpServer([
|
|
303
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
304
|
-
]);
|
|
305
|
-
llm = result.llm;
|
|
306
|
-
mcpMock = result.mcpMock;
|
|
307
|
-
|
|
308
|
-
const agent = new BasicAgent({
|
|
309
|
-
model: "openai/gpt-4o",
|
|
310
|
-
mcpServers: [{ type: "http", url: result.mcpUrl }],
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
vi.mocked(streamText).mockReturnValue(
|
|
314
|
-
mockStreamTextResponse([textDelta("Hello"), finish()]) as any,
|
|
315
|
-
);
|
|
316
|
-
|
|
317
|
-
await collectEvents(agent["run"](baseInput));
|
|
318
|
-
|
|
319
|
-
const callArgs = vi.mocked(streamText).mock.calls[0][0];
|
|
320
|
-
expect(callArgs.tools).toHaveProperty("get_weather");
|
|
321
|
-
// The MCP tool should include the description from the MCPMock server
|
|
322
|
-
expect(callArgs.tools.get_weather.description).toBe("Get the weather");
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
it("multiple MCP servers merge tools from both", async () => {
|
|
326
|
-
// First server with get_weather
|
|
327
|
-
const result1 = await startMcpServer([
|
|
328
|
-
{ name: "get_weather", description: "Get the weather" },
|
|
329
|
-
]);
|
|
330
|
-
llm = result1.llm;
|
|
331
|
-
|
|
332
|
-
// Second server with search_docs
|
|
333
|
-
const mock2 = new MCPMock();
|
|
334
|
-
mock2.addTool({
|
|
335
|
-
name: "search_docs",
|
|
336
|
-
description: "Search documentation",
|
|
337
|
-
inputSchema: {
|
|
338
|
-
type: "object",
|
|
339
|
-
properties: { query: { type: "string" } },
|
|
340
|
-
},
|
|
341
|
-
});
|
|
342
|
-
mock2.onToolCall("search_docs", () => "doc results");
|
|
343
|
-
|
|
344
|
-
const llm2 = new LLMock({ port: 0 });
|
|
345
|
-
llm2.mount("/mcp", mock2);
|
|
346
|
-
await llm2.start();
|
|
347
|
-
|
|
348
|
-
try {
|
|
349
|
-
const agent = new BasicAgent({
|
|
350
|
-
model: "openai/gpt-4o",
|
|
351
|
-
mcpServers: [
|
|
352
|
-
{ type: "http", url: result1.mcpUrl },
|
|
353
|
-
{ type: "http", url: `${llm2.url}/mcp` },
|
|
354
|
-
],
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
vi.mocked(streamText).mockReturnValue(
|
|
358
|
-
mockStreamTextResponse([
|
|
359
|
-
textDelta("Both tools available"),
|
|
360
|
-
finish(),
|
|
361
|
-
]) as any,
|
|
362
|
-
);
|
|
363
|
-
|
|
364
|
-
await collectEvents(agent["run"](baseInput));
|
|
365
|
-
|
|
366
|
-
const callArgs = vi.mocked(streamText).mock.calls[0][0];
|
|
367
|
-
expect(callArgs.tools).toHaveProperty("get_weather");
|
|
368
|
-
expect(callArgs.tools).toHaveProperty("search_docs");
|
|
369
|
-
} finally {
|
|
370
|
-
await llm2.stop().catch(() => {});
|
|
371
|
-
}
|
|
372
|
-
});
|
|
373
|
-
});
|