@copilotkit/runtime 1.57.2 → 1.57.4
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/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 +52 -19
- package/dist/package.mjs +52 -19
- 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 +8 -18
- 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
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# CopilotKit Agent Runners
|
|
2
|
+
|
|
3
|
+
`AgentRunner` is the abstraction that owns thread run state — active runs, the event stream
|
|
4
|
+
replay, and stop semantics. Pick one per `CopilotRuntime` instance.
|
|
5
|
+
|
|
6
|
+
- `InMemoryAgentRunner` — default; globalThis-keyed Map; lost on restart.
|
|
7
|
+
- `SqliteAgentRunner` — file-backed; requires `better-sqlite3` peer.
|
|
8
|
+
- `IntelligenceAgentRunner` — auto-wired by `CopilotIntelligenceRuntime`. You do NOT
|
|
9
|
+
construct this directly and you cannot pass `runner` alongside `intelligence`.
|
|
10
|
+
- Custom — subclass `AgentRunner` for Redis / Postgres / any backend.
|
|
11
|
+
|
|
12
|
+
## Setup
|
|
13
|
+
|
|
14
|
+
Default (in-memory, dev only):
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { CopilotRuntime } from "@copilotkit/runtime/v2";
|
|
18
|
+
|
|
19
|
+
// Equivalent to passing `runner: new InMemoryAgentRunner()`
|
|
20
|
+
const runtime = new CopilotRuntime({
|
|
21
|
+
agents: {
|
|
22
|
+
/* ... */
|
|
23
|
+
} as any,
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Production (file-backed SQLite):
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { CopilotRuntime } from "@copilotkit/runtime/v2";
|
|
31
|
+
import { SqliteAgentRunner } from "@copilotkit/sqlite-runner";
|
|
32
|
+
|
|
33
|
+
const runtime = new CopilotRuntime({
|
|
34
|
+
agents: {
|
|
35
|
+
/* ... */
|
|
36
|
+
} as any,
|
|
37
|
+
runner: new SqliteAgentRunner({ dbPath: "./data/threads.db" }),
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Installation for the SQLite runner (the `better-sqlite3` peer is required):
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pnpm add @copilotkit/sqlite-runner better-sqlite3
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Core Patterns
|
|
48
|
+
|
|
49
|
+
### The AgentRunner contract
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { AgentRunner } from "@copilotkit/runtime/v2";
|
|
53
|
+
import type {
|
|
54
|
+
AgentRunnerRunRequest,
|
|
55
|
+
AgentRunnerConnectRequest,
|
|
56
|
+
AgentRunnerIsRunningRequest,
|
|
57
|
+
AgentRunnerStopRequest,
|
|
58
|
+
} from "@copilotkit/runtime/v2";
|
|
59
|
+
import { Observable } from "rxjs";
|
|
60
|
+
import type { BaseEvent } from "@ag-ui/client";
|
|
61
|
+
|
|
62
|
+
class MyRunner extends AgentRunner {
|
|
63
|
+
run(request: AgentRunnerRunRequest): Observable<BaseEvent> {
|
|
64
|
+
// Start a new run for request.threadId. Throw `new Error("Thread already running")`
|
|
65
|
+
// if a run is in flight. Stream events from agent.run(request.input).
|
|
66
|
+
return new Observable<BaseEvent>();
|
|
67
|
+
}
|
|
68
|
+
connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {
|
|
69
|
+
// Replay events for an active run, or historic runs for request.threadId.
|
|
70
|
+
return new Observable<BaseEvent>();
|
|
71
|
+
}
|
|
72
|
+
async isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean> {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
async stop(request: AgentRunnerStopRequest): Promise<boolean | undefined> {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Handle double-submit on the client
|
|
82
|
+
|
|
83
|
+
Both `InMemoryAgentRunner` and `SqliteAgentRunner` throw
|
|
84
|
+
`"Thread already running"` on concurrent `run()` calls for the same `threadId`. How
|
|
85
|
+
that surfaces to the client depends on the runtime mode:
|
|
86
|
+
|
|
87
|
+
- **Intelligence mode** — the Intelligence platform returns HTTP `409` when a lock is
|
|
88
|
+
held. The client core maps this to `CopilotKitCoreErrorCode.AGENT_THREAD_LOCKED`
|
|
89
|
+
and fires `onError({ code: "agent_thread_locked", ... })`. Handle this in
|
|
90
|
+
`<CopilotKitProvider onError>`.
|
|
91
|
+
- **SSE mode** (default, in-memory / SQLite runners) — the runner throws
|
|
92
|
+
synchronously and the handler returns a plain `500` JSON body like
|
|
93
|
+
`{ "error": "Failed to run agent", "message": "Thread already running" }`.
|
|
94
|
+
There is no typed `agent_thread_locked` code — match on the message text or
|
|
95
|
+
just guard on the client with a busy flag.
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
// client — Intelligence mode (typed code)
|
|
99
|
+
import { CopilotKitProvider } from "@copilotkit/react-core/v2";
|
|
100
|
+
|
|
101
|
+
<CopilotKitProvider
|
|
102
|
+
onError={({ code }) => {
|
|
103
|
+
if (code === "agent_thread_locked") {
|
|
104
|
+
alert("Agent is busy — wait for the current response to finish.");
|
|
105
|
+
}
|
|
106
|
+
}}
|
|
107
|
+
/>;
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
// client — any mode: guard with a busy flag so double-submit is impossible
|
|
112
|
+
import { useAgent } from "@copilotkit/react-core/v2";
|
|
113
|
+
import { useState } from "react";
|
|
114
|
+
|
|
115
|
+
function Composer() {
|
|
116
|
+
const agent = useAgent({ agentId: "default" });
|
|
117
|
+
const [busy, setBusy] = useState(false);
|
|
118
|
+
|
|
119
|
+
async function send(text: string) {
|
|
120
|
+
if (busy) return;
|
|
121
|
+
setBusy(true);
|
|
122
|
+
try {
|
|
123
|
+
await agent?.addMessage({ role: "user", content: text });
|
|
124
|
+
} finally {
|
|
125
|
+
setBusy(false);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Common Mistakes
|
|
134
|
+
|
|
135
|
+
### HIGH Shipping InMemoryAgentRunner to production
|
|
136
|
+
|
|
137
|
+
Wrong:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// production:
|
|
141
|
+
new CopilotRuntime({ agents: { default: agent } });
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Correct:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
import { SqliteAgentRunner } from "@copilotkit/sqlite-runner";
|
|
148
|
+
|
|
149
|
+
new CopilotRuntime({
|
|
150
|
+
agents: { default: agent },
|
|
151
|
+
runner: new SqliteAgentRunner({ dbPath: "./data/threads.db" }),
|
|
152
|
+
});
|
|
153
|
+
// Or upgrade to Intelligence mode for managed durability.
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The default runner is `new InMemoryAgentRunner()`. It keeps state in a `globalThis`-keyed
|
|
157
|
+
Map — threads are lost on restart, and horizontally-scaled instances see divergent state.
|
|
158
|
+
|
|
159
|
+
Source: `packages/runtime/src/v2/runtime/runner/in-memory.ts:63-96`.
|
|
160
|
+
|
|
161
|
+
### HIGH Setting runner alongside intelligence option
|
|
162
|
+
|
|
163
|
+
Wrong:
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
new CopilotRuntime({
|
|
167
|
+
agents,
|
|
168
|
+
intelligence,
|
|
169
|
+
runner: new SqliteAgentRunner({ dbPath: "./data/threads.db" }),
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Correct:
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
new CopilotRuntime({
|
|
177
|
+
agents,
|
|
178
|
+
intelligence,
|
|
179
|
+
identifyUser: (req) => ({ id: req.headers.get("x-user-id")! }),
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
`CopilotIntelligenceRuntimeOptions` does not declare a `runner` field — Intelligence mode
|
|
184
|
+
auto-wires `IntelligenceAgentRunner` pointed at the Cloud socket. Excess-property checks will
|
|
185
|
+
flag a `runner:` key on an Intelligence-shaped options object as a type error, and at runtime
|
|
186
|
+
the auto-wired Intelligence runner wins regardless of what you pass.
|
|
187
|
+
|
|
188
|
+
Source: `packages/runtime/src/v2/runtime/core/runtime.ts:149-173,285-294`.
|
|
189
|
+
|
|
190
|
+
### HIGH Forgetting the better-sqlite3 peer
|
|
191
|
+
|
|
192
|
+
Wrong:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
pnpm add @copilotkit/sqlite-runner
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Correct:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
pnpm add @copilotkit/sqlite-runner better-sqlite3
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
`@copilotkit/sqlite-runner` imports `better-sqlite3` at the top of its module, so if the peer
|
|
205
|
+
is missing, `import { SqliteAgentRunner } from "@copilotkit/sqlite-runner"` itself fails at
|
|
206
|
+
module load with `Cannot find module 'better-sqlite3'` — long before the constructor runs.
|
|
207
|
+
(The constructor has a friendlier multi-line install hint as a belt-and-suspenders fallback,
|
|
208
|
+
but in practice you will see the bare module-resolution error first.) It is a peer dependency,
|
|
209
|
+
not a direct dep.
|
|
210
|
+
|
|
211
|
+
Source: `packages/sqlite-runner/src/sqlite-runner.ts:18`, `:55-66`.
|
|
212
|
+
|
|
213
|
+
### HIGH Default SqliteAgentRunner with :memory: dbPath
|
|
214
|
+
|
|
215
|
+
Wrong:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
new SqliteAgentRunner();
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Correct:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
new SqliteAgentRunner({ dbPath: "./data/threads.db" });
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
The default `dbPath` is `":memory:"` — SQLite's in-memory mode. Data is lost at restart,
|
|
228
|
+
defeating the reason to use the file-backed runner.
|
|
229
|
+
|
|
230
|
+
Source: `packages/sqlite-runner/src/sqlite-runner.ts:48-54`.
|
|
231
|
+
|
|
232
|
+
### MEDIUM Concurrent run() on the same threadId
|
|
233
|
+
|
|
234
|
+
Wrong:
|
|
235
|
+
|
|
236
|
+
```tsx
|
|
237
|
+
// Double-click send button → two POST /agent/:id/run to the same thread
|
|
238
|
+
<button onClick={() => agent.addMessage({ role: "user", content })}>
|
|
239
|
+
Send
|
|
240
|
+
</button>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Correct:
|
|
244
|
+
|
|
245
|
+
```tsx
|
|
246
|
+
const [busy, setBusy] = useState(false);
|
|
247
|
+
<button
|
|
248
|
+
disabled={busy}
|
|
249
|
+
onClick={async () => {
|
|
250
|
+
setBusy(true);
|
|
251
|
+
try {
|
|
252
|
+
await agent.addMessage({ role: "user", content });
|
|
253
|
+
} finally {
|
|
254
|
+
setBusy(false);
|
|
255
|
+
}
|
|
256
|
+
}}
|
|
257
|
+
>
|
|
258
|
+
Send
|
|
259
|
+
</button>;
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Both runners throw `"Thread already running"` on concurrent runs. Debounce on the client.
|
|
263
|
+
In Intelligence mode you can additionally handle `code === "agent_thread_locked"` in
|
|
264
|
+
`<CopilotKitProvider onError>`; SSE mode surfaces only a generic 500 with that message.
|
|
265
|
+
|
|
266
|
+
Source: `packages/runtime/src/v2/runtime/runner/in-memory.ts:110`;
|
|
267
|
+
`packages/core/src/intelligence-agent.ts:368-369`.
|
|
268
|
+
|
|
269
|
+
### HIGH In-memory runner + horizontal scaling
|
|
270
|
+
|
|
271
|
+
Wrong:
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
// 3 Fly.io / Cloud Run instances, each with its own InMemoryAgentRunner
|
|
275
|
+
new CopilotRuntime({ agents });
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Correct:
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
// Either sticky-session a single instance per thread, or use shared state:
|
|
282
|
+
new CopilotRuntime({
|
|
283
|
+
agents,
|
|
284
|
+
runner: new SqliteAgentRunner({ dbPath: process.env.THREADS_DB! }),
|
|
285
|
+
});
|
|
286
|
+
// Best: Intelligence mode for managed multi-instance durability.
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
`InMemoryAgentRunner`'s `globalThis` store is per-process — multi-instance deploys see
|
|
290
|
+
totally different thread state per worker, making reconnects and `GET /connect` non-deterministic.
|
|
291
|
+
|
|
292
|
+
Source: `packages/runtime/src/v2/runtime/runner/in-memory.ts:63-96`.
|
|
293
|
+
|
|
294
|
+
## References
|
|
295
|
+
|
|
296
|
+
- [InMemoryAgentRunner — internals and hot-reload note](agent-runners-in-memory.md)
|
|
297
|
+
- [SqliteAgentRunner — schema, retention, ops](agent-runners-sqlite.md)
|
|
298
|
+
- [Custom runner — Redis/Postgres skeleton](agent-runners-custom.md)
|
|
299
|
+
|
|
300
|
+
## See also
|
|
301
|
+
|
|
302
|
+
- `copilotkit/intelligence-mode` — managed durability alternative (Cloud-only)
|
|
303
|
+
- `copilotkit/setup-endpoint` — runner is passed via the CopilotRuntime constructor
|
|
304
|
+
- `copilotkit/scale-to-multi-agent` — horizontal scaling considerations
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
BuiltInAgent Factory Modes — cookbook for TanStack AI, AI SDK, and custom AG-UI factories.
|
|
2
|
+
|
|
3
|
+
## The AgentFactoryContext
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// packages/runtime/src/agent/index.ts
|
|
7
|
+
export interface AgentFactoryContext {
|
|
8
|
+
input: RunAgentInput; // messages, tools, forwardedProps, context
|
|
9
|
+
abortController: AbortController; // prefer abortSignal
|
|
10
|
+
abortSignal: AbortSignal; // pass to AI SDK / fetch / custom
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Rule of thumb:
|
|
15
|
+
|
|
16
|
+
- Prefer `abortSignal` for AI SDK, fetch, custom backends.
|
|
17
|
+
- Use `abortController` for TanStack AI (its `chat()` takes the controller, not the signal).
|
|
18
|
+
- NEVER call `ctx.abortController.abort()` inside the factory — use
|
|
19
|
+
`agent.abortRun()` from outside.
|
|
20
|
+
|
|
21
|
+
## TanStack AI factory (preferred)
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { BuiltInAgent, convertInputToTanStackAI } from "@copilotkit/runtime/v2";
|
|
25
|
+
import { chat } from "@tanstack/ai";
|
|
26
|
+
import { openaiText } from "@tanstack/ai-openai";
|
|
27
|
+
|
|
28
|
+
new BuiltInAgent({
|
|
29
|
+
type: "tanstack",
|
|
30
|
+
factory: ({ input, abortController }) => {
|
|
31
|
+
const { messages, systemPrompts } = convertInputToTanStackAI(input);
|
|
32
|
+
systemPrompts.unshift("You are a helpful assistant.");
|
|
33
|
+
return chat({
|
|
34
|
+
adapter: openaiText("gpt-4o"),
|
|
35
|
+
messages,
|
|
36
|
+
systemPrompts,
|
|
37
|
+
tools: [
|
|
38
|
+
/* TanStack AI toolDefinition()s */
|
|
39
|
+
],
|
|
40
|
+
abortController,
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### TanStack AI + forwardedProps
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
new BuiltInAgent({
|
|
50
|
+
type: "tanstack",
|
|
51
|
+
factory: ({ input, abortController }) => {
|
|
52
|
+
const { messages, systemPrompts } = convertInputToTanStackAI(input);
|
|
53
|
+
const fwd = input.forwardedProps as
|
|
54
|
+
| { model?: string; temperature?: number }
|
|
55
|
+
| undefined;
|
|
56
|
+
return chat({
|
|
57
|
+
adapter: openaiText(fwd?.model ?? "gpt-4o"),
|
|
58
|
+
messages,
|
|
59
|
+
systemPrompts,
|
|
60
|
+
modelOptions: { temperature: fwd?.temperature ?? 0.2 },
|
|
61
|
+
abortController,
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## AI SDK factory (use when reasoning events are required)
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import {
|
|
71
|
+
BuiltInAgent,
|
|
72
|
+
convertMessagesToVercelAISDKMessages,
|
|
73
|
+
convertToolsToVercelAITools,
|
|
74
|
+
} from "@copilotkit/runtime/v2";
|
|
75
|
+
import { streamText, stepCountIs } from "ai";
|
|
76
|
+
import { openai } from "@ai-sdk/openai";
|
|
77
|
+
|
|
78
|
+
new BuiltInAgent({
|
|
79
|
+
type: "aisdk",
|
|
80
|
+
factory: ({ input, abortSignal }) => {
|
|
81
|
+
const messages = convertMessagesToVercelAISDKMessages(input.messages, {
|
|
82
|
+
forwardSystemMessages: true,
|
|
83
|
+
});
|
|
84
|
+
const tools = convertToolsToVercelAITools(input.tools);
|
|
85
|
+
return streamText({
|
|
86
|
+
model: openai("gpt-4o"),
|
|
87
|
+
messages,
|
|
88
|
+
tools,
|
|
89
|
+
abortSignal,
|
|
90
|
+
stopWhen: stepCountIs(5),
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The `BuiltInAgentAISDKFactoryConfig` contract requires an object with a `fullStream`
|
|
97
|
+
async iterable — this is exactly what `streamText()` returns.
|
|
98
|
+
|
|
99
|
+
## AI SDK + reasoning (Anthropic thinking)
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { anthropic } from "@ai-sdk/anthropic";
|
|
103
|
+
import { streamText } from "ai";
|
|
104
|
+
import {
|
|
105
|
+
BuiltInAgent,
|
|
106
|
+
convertMessagesToVercelAISDKMessages,
|
|
107
|
+
} from "@copilotkit/runtime/v2";
|
|
108
|
+
|
|
109
|
+
new BuiltInAgent({
|
|
110
|
+
type: "aisdk",
|
|
111
|
+
factory: ({ input, abortSignal }) =>
|
|
112
|
+
streamText({
|
|
113
|
+
model: anthropic("claude-sonnet-4"),
|
|
114
|
+
messages: convertMessagesToVercelAISDKMessages(input.messages),
|
|
115
|
+
providerOptions: {
|
|
116
|
+
anthropic: { thinking: { type: "enabled", budgetTokens: 10000 } },
|
|
117
|
+
},
|
|
118
|
+
abortSignal,
|
|
119
|
+
}),
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
TanStack AI silently drops reasoning events — only AI SDK surfaces them.
|
|
124
|
+
|
|
125
|
+
## Custom factory (raw AG-UI events)
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import { BuiltInAgent } from "@copilotkit/runtime/v2";
|
|
129
|
+
import type { BaseEvent } from "@ag-ui/client";
|
|
130
|
+
import { EventType } from "@ag-ui/client";
|
|
131
|
+
|
|
132
|
+
new BuiltInAgent({
|
|
133
|
+
type: "custom",
|
|
134
|
+
factory: async function* ({ input, abortSignal }): AsyncIterable<BaseEvent> {
|
|
135
|
+
// Check abortSignal.aborted on every iteration — agent.abortRun() signals
|
|
136
|
+
// cancellation via this flag, but the generator must consult it to stop yielding.
|
|
137
|
+
if (abortSignal.aborted) return;
|
|
138
|
+
|
|
139
|
+
const messageId = crypto.randomUUID();
|
|
140
|
+
yield {
|
|
141
|
+
type: EventType.TEXT_MESSAGE_START,
|
|
142
|
+
messageId,
|
|
143
|
+
role: "assistant",
|
|
144
|
+
} as any;
|
|
145
|
+
|
|
146
|
+
for (const delta of ["Hello", ", ", "world."]) {
|
|
147
|
+
if (abortSignal.aborted) return; // honor cancellation between yields
|
|
148
|
+
yield {
|
|
149
|
+
type: EventType.TEXT_MESSAGE_CONTENT,
|
|
150
|
+
messageId,
|
|
151
|
+
delta,
|
|
152
|
+
} as any;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
yield { type: EventType.TEXT_MESSAGE_END, messageId } as any;
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
A custom factory that never checks `abortSignal.aborted` (or registers an
|
|
161
|
+
`addEventListener("abort", …)` handler to break its loop) is non-cancellable —
|
|
162
|
+
`agent.abortRun()` will flip the flag but the generator will keep yielding until it
|
|
163
|
+
exhausts its own source. Pass `abortSignal` through to any underlying `fetch` /
|
|
164
|
+
streaming API as well so the upstream request is torn down.
|
|
165
|
+
|
|
166
|
+
## Manual state-tool wiring (Factory Mode only)
|
|
167
|
+
|
|
168
|
+
Simple Mode auto-injects `AGUISendStateSnapshot` / `AGUISendStateDelta`. In Factory Mode
|
|
169
|
+
you must register them by hand for shared-state updates to reach the LLM. The AI SDK
|
|
170
|
+
factory works out of the box because `defineTool` output adapts through
|
|
171
|
+
`convertToolDefinitionsToVercelAITools`:
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import {
|
|
175
|
+
BuiltInAgent,
|
|
176
|
+
convertMessagesToVercelAISDKMessages,
|
|
177
|
+
convertToolDefinitionsToVercelAITools,
|
|
178
|
+
defineTool,
|
|
179
|
+
} from "@copilotkit/runtime/v2";
|
|
180
|
+
import { streamText } from "ai";
|
|
181
|
+
import { openai } from "@ai-sdk/openai";
|
|
182
|
+
import { z } from "zod";
|
|
183
|
+
|
|
184
|
+
const sendStateSnapshot = defineTool({
|
|
185
|
+
name: "AGUISendStateSnapshot",
|
|
186
|
+
description: "Replace the entire application state with a new snapshot",
|
|
187
|
+
parameters: z.object({
|
|
188
|
+
snapshot: z.any().describe("The complete new state object"),
|
|
189
|
+
}),
|
|
190
|
+
execute: async ({ snapshot }) => ({ success: true, snapshot }),
|
|
191
|
+
});
|
|
192
|
+
const sendStateDelta = defineTool({
|
|
193
|
+
name: "AGUISendStateDelta",
|
|
194
|
+
description:
|
|
195
|
+
"Apply incremental updates to application state using JSON Patch operations",
|
|
196
|
+
// MUST mirror the Simple-Mode auto-injected schema (src/agent/index.ts:1140-1176)
|
|
197
|
+
// or the frontend's state handler won't recognize the payload.
|
|
198
|
+
parameters: z.object({
|
|
199
|
+
delta: z
|
|
200
|
+
.array(
|
|
201
|
+
z.object({
|
|
202
|
+
op: z.enum(["add", "replace", "remove"]),
|
|
203
|
+
path: z.string(),
|
|
204
|
+
value: z.any().optional(),
|
|
205
|
+
}),
|
|
206
|
+
)
|
|
207
|
+
.describe("Array of JSON Patch operations"),
|
|
208
|
+
}),
|
|
209
|
+
execute: async ({ delta }) => ({ success: true, delta }),
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
new BuiltInAgent({
|
|
213
|
+
type: "aisdk",
|
|
214
|
+
factory: ({ input, abortSignal }) =>
|
|
215
|
+
streamText({
|
|
216
|
+
model: openai("gpt-4o"),
|
|
217
|
+
messages: convertMessagesToVercelAISDKMessages(input.messages),
|
|
218
|
+
tools: convertToolDefinitionsToVercelAITools([
|
|
219
|
+
sendStateSnapshot,
|
|
220
|
+
sendStateDelta,
|
|
221
|
+
]),
|
|
222
|
+
abortSignal,
|
|
223
|
+
}),
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
For TanStack AI factories, `defineTool` output is NOT a TanStack tool — passing it to
|
|
228
|
+
`chat({ tools })` does not work. Either switch to the AI SDK factory above, or redefine
|
|
229
|
+
the tools with `toolDefinition()` from `@tanstack/ai`.
|
|
230
|
+
|
|
231
|
+
Source: `packages/runtime/src/agent/index.ts`,
|
|
232
|
+
`docs/content/docs/integrations/built-in-agent/custom-agent.mdx`.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
BuiltInAgent helper utilities — exported from `@copilotkit/runtime/v2`.
|
|
2
|
+
|
|
3
|
+
## convertInputToTanStackAI
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { convertInputToTanStackAI } from "@copilotkit/runtime/v2";
|
|
7
|
+
|
|
8
|
+
// signature (simplified):
|
|
9
|
+
// convertInputToTanStackAI(input: RunAgentInput): {
|
|
10
|
+
// messages: TanStackAIMessage[];
|
|
11
|
+
// systemPrompts: string[];
|
|
12
|
+
// }
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Converts the AG-UI `RunAgentInput` into TanStack AI's `chat()` inputs. System messages in
|
|
16
|
+
the input are collected into the `systemPrompts` array (not the `messages` array). Unshift
|
|
17
|
+
your own system prompt onto `systemPrompts` before calling `chat()`:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
const { messages, systemPrompts } = convertInputToTanStackAI(input);
|
|
21
|
+
systemPrompts.unshift("You are a helpful assistant.");
|
|
22
|
+
return chat({ adapter, messages, systemPrompts, abortController });
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Source: `packages/runtime/src/agent/converters/tanstack.ts:156`.
|
|
26
|
+
|
|
27
|
+
## convertMessagesToVercelAISDKMessages
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { convertMessagesToVercelAISDKMessages } from "@copilotkit/runtime/v2";
|
|
31
|
+
|
|
32
|
+
// signature:
|
|
33
|
+
// convertMessagesToVercelAISDKMessages(
|
|
34
|
+
// messages: Message[],
|
|
35
|
+
// options?: { forwardSystemMessages?: boolean; forwardDeveloperMessages?: boolean }
|
|
36
|
+
// ): ModelMessage[]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Converts AG-UI `Message[]` to the Vercel AI SDK's `ModelMessage[]`. Handles multimodal
|
|
40
|
+
content (text, image, audio/video/document, and legacy `binary`). By default drops
|
|
41
|
+
`role: "system"` and `role: "developer"` messages — set the options to opt in.
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
const messages = convertMessagesToVercelAISDKMessages(input.messages, {
|
|
45
|
+
forwardSystemMessages: true,
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Source: `packages/runtime/src/agent/index.ts:435`.
|
|
50
|
+
|
|
51
|
+
## convertToolsToVercelAITools
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { convertToolsToVercelAITools } from "@copilotkit/runtime/v2";
|
|
55
|
+
|
|
56
|
+
// signature:
|
|
57
|
+
// convertToolsToVercelAITools(tools: RunAgentInput["tools"]): ToolSet
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Converts AG-UI `input.tools` (tools registered on the frontend — their parameters are plain
|
|
61
|
+
JSON Schema) into the AI SDK's `ToolSet`. Throws `Invalid JSON schema for tool ${name}`
|
|
62
|
+
when a tool's parameters aren't a JSON schema object. The resulting tools have no
|
|
63
|
+
`execute` — the AI SDK emits tool-call events and the frontend handles them.
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
const tools = convertToolsToVercelAITools(input.tools);
|
|
67
|
+
return streamText({ model, messages, tools, abortSignal });
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Source: `packages/runtime/src/agent/index.ts:599`.
|
|
71
|
+
|
|
72
|
+
## convertToolDefinitionsToVercelAITools
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { convertToolDefinitionsToVercelAITools } from "@copilotkit/runtime/v2";
|
|
76
|
+
|
|
77
|
+
// signature:
|
|
78
|
+
// convertToolDefinitionsToVercelAITools(tools: ToolDefinition[]): ToolSet
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Converts server-side `ToolDefinition[]` (Standard Schema V1 parameters + `execute`
|
|
82
|
+
function) into an AI SDK `ToolSet`. Zod schemas pass through directly; non-Zod Standard
|
|
83
|
+
Schema V1 parameters (Valibot, ArkType, ...) are converted to JSON Schema via
|
|
84
|
+
`schemaToJsonSchema` and wrapped with `jsonSchema()` from `ai`.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { defineTool } from "@copilotkit/runtime/v2";
|
|
88
|
+
import { z } from "zod";
|
|
89
|
+
|
|
90
|
+
const searchTool = defineTool({
|
|
91
|
+
name: "search",
|
|
92
|
+
description: "Search the web.",
|
|
93
|
+
parameters: z.object({ query: z.string() }),
|
|
94
|
+
execute: async ({ query }) => ({ results: [] }),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const tools = convertToolDefinitionsToVercelAITools([searchTool]);
|
|
98
|
+
return streamText({ model, messages, tools, abortSignal });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Source: `packages/runtime/src/agent/index.ts:633`.
|
|
102
|
+
|
|
103
|
+
## resolveModel
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
import { resolveModel } from "@copilotkit/runtime/v2";
|
|
107
|
+
|
|
108
|
+
// signature:
|
|
109
|
+
// resolveModel(spec: ModelSpecifier, apiKey?: string): LanguageModel
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Resolves a `"provider/model"` (or `"provider:model"`) string to a `LanguageModel`. If
|
|
113
|
+
`spec` is already a `LanguageModel`, it's returned as-is. Throws
|
|
114
|
+
`Invalid model string "..."` when the provider separator is missing.
|
|
115
|
+
|
|
116
|
+
Supported providers: `openai`, `anthropic`, `google`/`gemini`/`google-gemini`, `vertex`.
|
|
117
|
+
Unknown providers throw `Unknown provider "..." in "...". Supported: openai, anthropic, google (gemini).`
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const model = resolveModel("openai/gpt-4o", process.env.OPENAI_API_KEY);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Source: `packages/runtime/src/agent/index.ts:176-249`.
|