@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,337 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Action,
|
|
3
|
-
CopilotKitError,
|
|
4
|
-
CopilotKitErrorCode,
|
|
5
|
-
CopilotKitLowLevelError,
|
|
6
|
-
ensureStructuredError,
|
|
7
|
-
randomId,
|
|
8
|
-
Severity,
|
|
9
|
-
} from "@copilotkit/shared";
|
|
10
|
-
import { plainToInstance } from "class-transformer";
|
|
11
|
-
import {
|
|
12
|
-
catchError,
|
|
13
|
-
concat,
|
|
14
|
-
concatMap,
|
|
15
|
-
EMPTY,
|
|
16
|
-
firstValueFrom,
|
|
17
|
-
from,
|
|
18
|
-
of,
|
|
19
|
-
ReplaySubject,
|
|
20
|
-
scan,
|
|
21
|
-
Subject,
|
|
22
|
-
} from "rxjs";
|
|
23
|
-
import { ActionInput } from "../graphql/inputs/action.input";
|
|
24
|
-
import {
|
|
25
|
-
ActionExecutionMessage,
|
|
26
|
-
ResultMessage,
|
|
27
|
-
TextMessage,
|
|
28
|
-
} from "../graphql/types/converted";
|
|
29
|
-
import { GuardrailsResult } from "../graphql/types/guardrails-result.type";
|
|
30
|
-
import { generateHelpfulErrorMessage } from "../lib/streaming";
|
|
31
|
-
import telemetry from "../lib/telemetry-client";
|
|
32
|
-
import { streamLangChainResponse } from "./langchain/utils";
|
|
33
|
-
|
|
34
|
-
export enum RuntimeEventTypes {
|
|
35
|
-
TextMessageStart = "TextMessageStart",
|
|
36
|
-
TextMessageContent = "TextMessageContent",
|
|
37
|
-
TextMessageEnd = "TextMessageEnd",
|
|
38
|
-
ActionExecutionStart = "ActionExecutionStart",
|
|
39
|
-
ActionExecutionArgs = "ActionExecutionArgs",
|
|
40
|
-
ActionExecutionEnd = "ActionExecutionEnd",
|
|
41
|
-
ActionExecutionResult = "ActionExecutionResult",
|
|
42
|
-
AgentStateMessage = "AgentStateMessage",
|
|
43
|
-
MetaEvent = "MetaEvent",
|
|
44
|
-
RunError = "RunError",
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export enum RuntimeMetaEventName {
|
|
48
|
-
LangGraphInterruptEvent = "LangGraphInterruptEvent",
|
|
49
|
-
LangGraphInterruptResumeEvent = "LangGraphInterruptResumeEvent",
|
|
50
|
-
CopilotKitLangGraphInterruptEvent = "CopilotKitLangGraphInterruptEvent",
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export type RunTimeMetaEvent =
|
|
54
|
-
| {
|
|
55
|
-
type: RuntimeEventTypes.MetaEvent;
|
|
56
|
-
name: RuntimeMetaEventName.LangGraphInterruptEvent;
|
|
57
|
-
value: string;
|
|
58
|
-
}
|
|
59
|
-
| {
|
|
60
|
-
type: RuntimeEventTypes.MetaEvent;
|
|
61
|
-
name: RuntimeMetaEventName.CopilotKitLangGraphInterruptEvent;
|
|
62
|
-
data: {
|
|
63
|
-
value: string;
|
|
64
|
-
messages: (TextMessage | ActionExecutionMessage | ResultMessage)[];
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
| {
|
|
68
|
-
type: RuntimeEventTypes.MetaEvent;
|
|
69
|
-
name: RuntimeMetaEventName.LangGraphInterruptResumeEvent;
|
|
70
|
-
data: string;
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
export type RuntimeErrorEvent = {
|
|
74
|
-
type: RuntimeEventTypes.RunError;
|
|
75
|
-
message: string;
|
|
76
|
-
code?: string;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export type RuntimeEvent =
|
|
80
|
-
| {
|
|
81
|
-
type: RuntimeEventTypes.TextMessageStart;
|
|
82
|
-
messageId: string;
|
|
83
|
-
parentMessageId?: string;
|
|
84
|
-
}
|
|
85
|
-
| {
|
|
86
|
-
type: RuntimeEventTypes.TextMessageContent;
|
|
87
|
-
messageId: string;
|
|
88
|
-
content: string;
|
|
89
|
-
}
|
|
90
|
-
| { type: RuntimeEventTypes.TextMessageEnd; messageId: string }
|
|
91
|
-
| {
|
|
92
|
-
type: RuntimeEventTypes.ActionExecutionStart;
|
|
93
|
-
actionExecutionId: string;
|
|
94
|
-
actionName: string;
|
|
95
|
-
parentMessageId?: string;
|
|
96
|
-
}
|
|
97
|
-
| {
|
|
98
|
-
type: RuntimeEventTypes.ActionExecutionArgs;
|
|
99
|
-
actionExecutionId: string;
|
|
100
|
-
args: string;
|
|
101
|
-
}
|
|
102
|
-
| { type: RuntimeEventTypes.ActionExecutionEnd; actionExecutionId: string }
|
|
103
|
-
| {
|
|
104
|
-
type: RuntimeEventTypes.ActionExecutionResult;
|
|
105
|
-
actionName: string;
|
|
106
|
-
actionExecutionId: string;
|
|
107
|
-
result: string;
|
|
108
|
-
}
|
|
109
|
-
| {
|
|
110
|
-
type: RuntimeEventTypes.AgentStateMessage;
|
|
111
|
-
threadId: string;
|
|
112
|
-
agentName: string;
|
|
113
|
-
nodeName: string;
|
|
114
|
-
runId: string;
|
|
115
|
-
active: boolean;
|
|
116
|
-
role: string;
|
|
117
|
-
state: string;
|
|
118
|
-
running: boolean;
|
|
119
|
-
}
|
|
120
|
-
| RunTimeMetaEvent
|
|
121
|
-
| RuntimeErrorEvent;
|
|
122
|
-
|
|
123
|
-
interface RuntimeEventWithState {
|
|
124
|
-
event: RuntimeEvent | null;
|
|
125
|
-
callActionServerSide: boolean;
|
|
126
|
-
action: Action<any> | null;
|
|
127
|
-
actionExecutionId: string | null;
|
|
128
|
-
args: string;
|
|
129
|
-
actionExecutionParentMessageId: string | null;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
type EventSourceCallback = (eventStream$: RuntimeEventSubject) => Promise<void>;
|
|
133
|
-
|
|
134
|
-
export class RuntimeEventSubject extends ReplaySubject<RuntimeEvent> {
|
|
135
|
-
constructor() {
|
|
136
|
-
super();
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
sendTextMessageStart({
|
|
140
|
-
messageId,
|
|
141
|
-
parentMessageId,
|
|
142
|
-
}: {
|
|
143
|
-
messageId: string;
|
|
144
|
-
parentMessageId?: string;
|
|
145
|
-
}) {
|
|
146
|
-
this.next({
|
|
147
|
-
type: RuntimeEventTypes.TextMessageStart,
|
|
148
|
-
messageId,
|
|
149
|
-
parentMessageId,
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
sendTextMessageContent({
|
|
154
|
-
messageId,
|
|
155
|
-
content,
|
|
156
|
-
}: {
|
|
157
|
-
messageId: string;
|
|
158
|
-
content: string;
|
|
159
|
-
}) {
|
|
160
|
-
this.next({
|
|
161
|
-
type: RuntimeEventTypes.TextMessageContent,
|
|
162
|
-
content,
|
|
163
|
-
messageId,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
sendTextMessageEnd({ messageId }: { messageId: string }) {
|
|
168
|
-
this.next({ type: RuntimeEventTypes.TextMessageEnd, messageId });
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
sendTextMessage(messageId: string, content: string) {
|
|
172
|
-
this.sendTextMessageStart({ messageId });
|
|
173
|
-
this.sendTextMessageContent({ messageId, content });
|
|
174
|
-
this.sendTextMessageEnd({ messageId });
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
sendActionExecutionStart({
|
|
178
|
-
actionExecutionId,
|
|
179
|
-
actionName,
|
|
180
|
-
parentMessageId,
|
|
181
|
-
}: {
|
|
182
|
-
actionExecutionId: string;
|
|
183
|
-
actionName: string;
|
|
184
|
-
parentMessageId?: string;
|
|
185
|
-
}) {
|
|
186
|
-
this.next({
|
|
187
|
-
type: RuntimeEventTypes.ActionExecutionStart,
|
|
188
|
-
actionExecutionId,
|
|
189
|
-
actionName,
|
|
190
|
-
parentMessageId,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
sendActionExecutionArgs({
|
|
195
|
-
actionExecutionId,
|
|
196
|
-
args,
|
|
197
|
-
}: {
|
|
198
|
-
actionExecutionId: string;
|
|
199
|
-
args: string;
|
|
200
|
-
}) {
|
|
201
|
-
this.next({
|
|
202
|
-
type: RuntimeEventTypes.ActionExecutionArgs,
|
|
203
|
-
args,
|
|
204
|
-
actionExecutionId,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
sendActionExecutionEnd({ actionExecutionId }: { actionExecutionId: string }) {
|
|
209
|
-
this.next({
|
|
210
|
-
type: RuntimeEventTypes.ActionExecutionEnd,
|
|
211
|
-
actionExecutionId,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
sendActionExecution({
|
|
216
|
-
actionExecutionId,
|
|
217
|
-
actionName,
|
|
218
|
-
args,
|
|
219
|
-
parentMessageId,
|
|
220
|
-
}: {
|
|
221
|
-
actionExecutionId: string;
|
|
222
|
-
actionName: string;
|
|
223
|
-
args: string;
|
|
224
|
-
parentMessageId?: string;
|
|
225
|
-
}) {
|
|
226
|
-
this.sendActionExecutionStart({
|
|
227
|
-
actionExecutionId,
|
|
228
|
-
actionName,
|
|
229
|
-
parentMessageId,
|
|
230
|
-
});
|
|
231
|
-
this.sendActionExecutionArgs({ actionExecutionId, args });
|
|
232
|
-
this.sendActionExecutionEnd({ actionExecutionId });
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
sendActionExecutionResult({
|
|
236
|
-
actionExecutionId,
|
|
237
|
-
actionName,
|
|
238
|
-
result,
|
|
239
|
-
error,
|
|
240
|
-
}: {
|
|
241
|
-
actionExecutionId: string;
|
|
242
|
-
actionName: string;
|
|
243
|
-
result?: string;
|
|
244
|
-
error?: { code: string; message: string };
|
|
245
|
-
}) {
|
|
246
|
-
this.next({
|
|
247
|
-
type: RuntimeEventTypes.ActionExecutionResult,
|
|
248
|
-
actionName,
|
|
249
|
-
actionExecutionId,
|
|
250
|
-
result: ResultMessage.encodeResult(result, error),
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
sendAgentStateMessage({
|
|
255
|
-
threadId,
|
|
256
|
-
agentName,
|
|
257
|
-
nodeName,
|
|
258
|
-
runId,
|
|
259
|
-
active,
|
|
260
|
-
role,
|
|
261
|
-
state,
|
|
262
|
-
running,
|
|
263
|
-
}: {
|
|
264
|
-
threadId: string;
|
|
265
|
-
agentName: string;
|
|
266
|
-
nodeName: string;
|
|
267
|
-
runId: string;
|
|
268
|
-
active: boolean;
|
|
269
|
-
role: string;
|
|
270
|
-
state: string;
|
|
271
|
-
running: boolean;
|
|
272
|
-
}) {
|
|
273
|
-
this.next({
|
|
274
|
-
type: RuntimeEventTypes.AgentStateMessage,
|
|
275
|
-
threadId,
|
|
276
|
-
agentName,
|
|
277
|
-
nodeName,
|
|
278
|
-
runId,
|
|
279
|
-
active,
|
|
280
|
-
role,
|
|
281
|
-
state,
|
|
282
|
-
running,
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
export class RuntimeEventSource {
|
|
288
|
-
private eventStream$ = new RuntimeEventSubject();
|
|
289
|
-
private callback!: EventSourceCallback;
|
|
290
|
-
private errorHandler?: (error: any, context: any) => Promise<void>;
|
|
291
|
-
private errorContext?: any;
|
|
292
|
-
|
|
293
|
-
constructor(params?: {
|
|
294
|
-
errorHandler?: (error: any, context: any) => Promise<void>;
|
|
295
|
-
errorContext?: any;
|
|
296
|
-
}) {
|
|
297
|
-
this.errorHandler = params?.errorHandler;
|
|
298
|
-
this.errorContext = params?.errorContext;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
async stream(callback: EventSourceCallback): Promise<void> {
|
|
302
|
-
this.callback = callback;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function convertStreamingErrorToStructured(error: any): CopilotKitError {
|
|
307
|
-
// Determine a more helpful error message based on context
|
|
308
|
-
let helpfulMessage = generateHelpfulErrorMessage(
|
|
309
|
-
error,
|
|
310
|
-
"event streaming connection",
|
|
311
|
-
);
|
|
312
|
-
|
|
313
|
-
// For network-related errors, use CopilotKitLowLevelError to preserve the original error
|
|
314
|
-
if (
|
|
315
|
-
error?.message?.includes("fetch failed") ||
|
|
316
|
-
error?.message?.includes("ECONNREFUSED") ||
|
|
317
|
-
error?.message?.includes("ENOTFOUND") ||
|
|
318
|
-
error?.message?.includes("ETIMEDOUT") ||
|
|
319
|
-
error?.message?.includes("terminated") ||
|
|
320
|
-
error?.cause?.code === "UND_ERR_SOCKET" ||
|
|
321
|
-
error?.message?.includes("other side closed") ||
|
|
322
|
-
error?.code === "UND_ERR_SOCKET"
|
|
323
|
-
) {
|
|
324
|
-
return new CopilotKitLowLevelError({
|
|
325
|
-
error: error instanceof Error ? error : new Error(String(error)),
|
|
326
|
-
url: "event streaming connection",
|
|
327
|
-
message: helpfulMessage,
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// For all other errors, preserve the raw error in a basic CopilotKitError
|
|
332
|
-
return new CopilotKitError({
|
|
333
|
-
message: helpfulMessage,
|
|
334
|
-
code: CopilotKitErrorCode.UNKNOWN,
|
|
335
|
-
severity: Severity.CRITICAL,
|
|
336
|
-
});
|
|
337
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CopilotKit Adapter for Ollama
|
|
3
|
-
*
|
|
4
|
-
* <RequestExample>
|
|
5
|
-
* ```jsx CopilotRuntime Example
|
|
6
|
-
* const copilotKit = new CopilotRuntime();
|
|
7
|
-
* return copilotKit.response(req, new OllamaAdapter());
|
|
8
|
-
* ```
|
|
9
|
-
* </RequestExample>
|
|
10
|
-
*
|
|
11
|
-
* You can easily set the model to use by passing it to the constructor.
|
|
12
|
-
* ```jsx
|
|
13
|
-
* const copilotKit = new CopilotRuntime();
|
|
14
|
-
* return copilotKit.response(
|
|
15
|
-
* req,
|
|
16
|
-
* new OllamaAdapter({ model: "llama3-70b-8192" }),
|
|
17
|
-
* );
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
import { TextMessage } from "../../../graphql/types/converted";
|
|
21
|
-
import {
|
|
22
|
-
CopilotServiceAdapter,
|
|
23
|
-
CopilotRuntimeChatCompletionRequest,
|
|
24
|
-
CopilotRuntimeChatCompletionResponse,
|
|
25
|
-
} from "../../service-adapter";
|
|
26
|
-
import { randomId, randomUUID } from "@copilotkit/shared";
|
|
27
|
-
|
|
28
|
-
const DEFAULT_MODEL = "llama3:latest";
|
|
29
|
-
|
|
30
|
-
interface OllamaAdapterOptions {
|
|
31
|
-
model?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class ExperimentalOllamaAdapter implements CopilotServiceAdapter {
|
|
35
|
-
public model: string;
|
|
36
|
-
public provider = "ollama";
|
|
37
|
-
public get name() {
|
|
38
|
-
return "OllamaAdapter";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
constructor(options?: OllamaAdapterOptions) {
|
|
42
|
-
if (options?.model) {
|
|
43
|
-
this.model = options.model;
|
|
44
|
-
} else {
|
|
45
|
-
this.model = DEFAULT_MODEL;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async process(
|
|
50
|
-
request: CopilotRuntimeChatCompletionRequest,
|
|
51
|
-
): Promise<CopilotRuntimeChatCompletionResponse> {
|
|
52
|
-
const { messages, actions, eventSource } = request;
|
|
53
|
-
// const messages = this.transformMessages(forwardedProps.messages);
|
|
54
|
-
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
56
|
-
const { Ollama } = require("@langchain/community/llms/ollama");
|
|
57
|
-
const ollama = new Ollama({
|
|
58
|
-
model: this.model,
|
|
59
|
-
});
|
|
60
|
-
const contents = (
|
|
61
|
-
messages.filter((m) => m.isTextMessage()) as TextMessage[]
|
|
62
|
-
).map((m) => m.content);
|
|
63
|
-
const _stream = await ollama.stream(contents); // [TODO] role info is dropped...
|
|
64
|
-
|
|
65
|
-
eventSource.stream(async (eventStream$) => {
|
|
66
|
-
const currentMessageId = randomId();
|
|
67
|
-
eventStream$.sendTextMessageStart({ messageId: currentMessageId });
|
|
68
|
-
for await (const chunkText of _stream) {
|
|
69
|
-
eventStream$.sendTextMessageContent({
|
|
70
|
-
messageId: currentMessageId,
|
|
71
|
-
content: chunkText,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
eventStream$.sendTextMessageEnd({ messageId: currentMessageId });
|
|
75
|
-
// we may need to add this later.. [nc]
|
|
76
|
-
// let calls = (await result.response).functionCalls();
|
|
77
|
-
|
|
78
|
-
eventStream$.complete();
|
|
79
|
-
});
|
|
80
|
-
return {
|
|
81
|
-
threadId: request.threadId || randomUUID(),
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AIMessage,
|
|
3
|
-
HumanMessage,
|
|
4
|
-
SystemMessage,
|
|
5
|
-
} from "@langchain/core/messages";
|
|
6
|
-
import * as langchainMessages from "@langchain/core/messages";
|
|
7
|
-
|
|
8
|
-
// Create mock ChatGoogle that captures the filtered messages passed to stream()
|
|
9
|
-
const mockStream = vi.fn();
|
|
10
|
-
const mockBindTools = vi.fn();
|
|
11
|
-
const MockChatGoogle = vi.fn();
|
|
12
|
-
|
|
13
|
-
// The adapter's chainFn uses lazy require() calls for @langchain/google-gauth
|
|
14
|
-
// and @langchain/core/messages. Vitest's vi.mock cannot intercept CJS require()
|
|
15
|
-
// calls in all environments. Instead, inject mocks directly into Node's require
|
|
16
|
-
// cache so that:
|
|
17
|
-
// 1. require("@langchain/google-gauth") returns our mock ChatGoogle
|
|
18
|
-
// 2. require("@langchain/core/messages") returns the same module instance as
|
|
19
|
-
// the ESM import above, ensuring instanceof checks work correctly
|
|
20
|
-
beforeAll(() => {
|
|
21
|
-
mockStream.mockImplementation((messages: any) =>
|
|
22
|
-
Promise.resolve({ filteredMessages: messages }),
|
|
23
|
-
);
|
|
24
|
-
mockBindTools.mockReturnValue({ stream: mockStream });
|
|
25
|
-
MockChatGoogle.mockImplementation(() => ({ bindTools: mockBindTools }));
|
|
26
|
-
|
|
27
|
-
const googleAuthPath = require.resolve("@langchain/google-gauth");
|
|
28
|
-
require.cache[googleAuthPath] = {
|
|
29
|
-
id: googleAuthPath,
|
|
30
|
-
filename: googleAuthPath,
|
|
31
|
-
loaded: true,
|
|
32
|
-
exports: { ChatGoogle: MockChatGoogle },
|
|
33
|
-
} as any;
|
|
34
|
-
|
|
35
|
-
const messagesPath = require.resolve("@langchain/core/messages");
|
|
36
|
-
require.cache[messagesPath] = {
|
|
37
|
-
id: messagesPath,
|
|
38
|
-
filename: messagesPath,
|
|
39
|
-
loaded: true,
|
|
40
|
-
exports: langchainMessages,
|
|
41
|
-
} as any;
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
afterAll(() => {
|
|
45
|
-
const googleAuthPath = require.resolve("@langchain/google-gauth");
|
|
46
|
-
delete require.cache[googleAuthPath];
|
|
47
|
-
const messagesPath = require.resolve("@langchain/core/messages");
|
|
48
|
-
delete require.cache[messagesPath];
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
import { GoogleGenerativeAIAdapter } from "./google-genai-adapter";
|
|
52
|
-
|
|
53
|
-
describe("GoogleGenerativeAIAdapter", () => {
|
|
54
|
-
beforeEach(() => {
|
|
55
|
-
vi.clearAllMocks();
|
|
56
|
-
mockStream.mockImplementation((messages: any) =>
|
|
57
|
-
Promise.resolve({ filteredMessages: messages }),
|
|
58
|
-
);
|
|
59
|
-
mockBindTools.mockReturnValue({ stream: mockStream });
|
|
60
|
-
MockChatGoogle.mockImplementation(() => ({ bindTools: mockBindTools }));
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("should filter out empty AIMessages to prevent Gemini validation errors", async () => {
|
|
64
|
-
const adapter = new GoogleGenerativeAIAdapter();
|
|
65
|
-
|
|
66
|
-
// Create a mix of messages including an empty AIMessage (the problematic case)
|
|
67
|
-
const messages = [
|
|
68
|
-
new HumanMessage("Hello"),
|
|
69
|
-
new AIMessage(""), // This should be filtered out
|
|
70
|
-
new HumanMessage("How are you?"),
|
|
71
|
-
new AIMessage("I'm doing well!"), // This should be kept
|
|
72
|
-
new SystemMessage("You are a helpful assistant"), // This should be kept
|
|
73
|
-
new AIMessage(""), // Another empty one to filter out
|
|
74
|
-
];
|
|
75
|
-
|
|
76
|
-
// Access the internal chainFn to test the filtering logic
|
|
77
|
-
const chainFnResult = await (adapter as any).options.chainFn({
|
|
78
|
-
messages,
|
|
79
|
-
tools: [],
|
|
80
|
-
threadId: "test-thread",
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
// The result should be filtered messages passed to ChatGoogle.stream()
|
|
84
|
-
const { filteredMessages } = chainFnResult;
|
|
85
|
-
|
|
86
|
-
// Should only contain non-empty messages
|
|
87
|
-
expect(filteredMessages).toHaveLength(4);
|
|
88
|
-
expect(filteredMessages[0]).toBeInstanceOf(HumanMessage);
|
|
89
|
-
expect(filteredMessages[0].content).toBe("Hello");
|
|
90
|
-
expect(filteredMessages[1]).toBeInstanceOf(HumanMessage);
|
|
91
|
-
expect(filteredMessages[1].content).toBe("How are you?");
|
|
92
|
-
expect(filteredMessages[2]).toBeInstanceOf(AIMessage);
|
|
93
|
-
expect(filteredMessages[2].content).toBe("I'm doing well!");
|
|
94
|
-
expect(filteredMessages[3]).toBeInstanceOf(SystemMessage);
|
|
95
|
-
expect(filteredMessages[3].content).toBe("You are a helpful assistant");
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("should keep AIMessages with tool_calls even if content is empty", async () => {
|
|
99
|
-
const adapter = new GoogleGenerativeAIAdapter();
|
|
100
|
-
|
|
101
|
-
const messagesWithToolCalls = [
|
|
102
|
-
new HumanMessage("Execute a function"),
|
|
103
|
-
new AIMessage({
|
|
104
|
-
content: "", // Empty content but has tool calls
|
|
105
|
-
tool_calls: [
|
|
106
|
-
{
|
|
107
|
-
id: "call_123",
|
|
108
|
-
name: "test_function",
|
|
109
|
-
args: { param: "value" },
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
}),
|
|
113
|
-
];
|
|
114
|
-
|
|
115
|
-
const chainFnResult = await (adapter as any).options.chainFn({
|
|
116
|
-
messages: messagesWithToolCalls,
|
|
117
|
-
tools: [],
|
|
118
|
-
threadId: "test-thread",
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const { filteredMessages } = chainFnResult;
|
|
122
|
-
|
|
123
|
-
// Should keep both messages - the AIMessage has tool_calls so it's valid
|
|
124
|
-
expect(filteredMessages).toHaveLength(2);
|
|
125
|
-
expect(filteredMessages[1]).toBeInstanceOf(AIMessage);
|
|
126
|
-
expect(filteredMessages[1].tool_calls).toHaveLength(1);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("should keep all non-AIMessage types regardless of content", async () => {
|
|
130
|
-
const adapter = new GoogleGenerativeAIAdapter();
|
|
131
|
-
|
|
132
|
-
const messages = [
|
|
133
|
-
new HumanMessage(""), // Empty human message should be kept
|
|
134
|
-
new SystemMessage(""), // Empty system message should be kept
|
|
135
|
-
new AIMessage(""), // Empty AI message should be filtered
|
|
136
|
-
];
|
|
137
|
-
|
|
138
|
-
const chainFnResult = await (adapter as any).options.chainFn({
|
|
139
|
-
messages,
|
|
140
|
-
tools: [],
|
|
141
|
-
threadId: "test-thread",
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
const { filteredMessages } = chainFnResult;
|
|
145
|
-
|
|
146
|
-
// Should keep HumanMessage and SystemMessage, filter out empty AIMessage
|
|
147
|
-
expect(filteredMessages).toHaveLength(2);
|
|
148
|
-
expect(filteredMessages[0]).toBeInstanceOf(HumanMessage);
|
|
149
|
-
expect(filteredMessages[1]).toBeInstanceOf(SystemMessage);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copilot Runtime adapter for Google Generative AI (e.g. Gemini).
|
|
3
|
-
*
|
|
4
|
-
* ## Example
|
|
5
|
-
*
|
|
6
|
-
* ```ts
|
|
7
|
-
* import { CopilotRuntime, GoogleGenerativeAIAdapter } from "@copilotkit/runtime";
|
|
8
|
-
* const { GoogleGenerativeAI } = require("@google/generative-ai");
|
|
9
|
-
*
|
|
10
|
-
* const genAI = new GoogleGenerativeAI(process.env["GOOGLE_API_KEY"]);
|
|
11
|
-
*
|
|
12
|
-
* const copilotKit = new CopilotRuntime();
|
|
13
|
-
*
|
|
14
|
-
* return new GoogleGenerativeAIAdapter({ model: "gemini-2.5-flash", apiVersion: "v1" });
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
import { LangChainAdapter } from "../langchain/langchain-adapter";
|
|
18
|
-
|
|
19
|
-
interface GoogleGenerativeAIAdapterOptions {
|
|
20
|
-
/**
|
|
21
|
-
* A custom Google Generative AI model to use.
|
|
22
|
-
*/
|
|
23
|
-
model?: string;
|
|
24
|
-
/**
|
|
25
|
-
* The API version to use (e.g. "v1" or "v1beta"). Defaults to "v1".
|
|
26
|
-
*/
|
|
27
|
-
apiVersion?: "v1" | "v1beta";
|
|
28
|
-
/**
|
|
29
|
-
* The API key to use.
|
|
30
|
-
*/
|
|
31
|
-
apiKey?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const DEFAULT_MODEL = "gemini-2.5-flash";
|
|
35
|
-
const DEFAULT_API_VERSION: GoogleGenerativeAIAdapterOptions["apiVersion"] =
|
|
36
|
-
"v1";
|
|
37
|
-
let hasWarnedDefaultGoogleModel = false;
|
|
38
|
-
|
|
39
|
-
export class GoogleGenerativeAIAdapter extends LangChainAdapter {
|
|
40
|
-
public provider = "google";
|
|
41
|
-
public model: string = DEFAULT_MODEL;
|
|
42
|
-
|
|
43
|
-
constructor(options?: GoogleGenerativeAIAdapterOptions) {
|
|
44
|
-
if (
|
|
45
|
-
!hasWarnedDefaultGoogleModel &&
|
|
46
|
-
!options?.model &&
|
|
47
|
-
!options?.apiVersion
|
|
48
|
-
) {
|
|
49
|
-
console.warn(
|
|
50
|
-
`You are using the GoogleGenerativeAIAdapter without explicitly setting a model or apiVersion. ` +
|
|
51
|
-
`CopilotKit will default to apiVersion="v1" and model="${DEFAULT_MODEL}". ` +
|
|
52
|
-
`To silence this warning, pass model and apiVersion when constructing the adapter.`,
|
|
53
|
-
);
|
|
54
|
-
hasWarnedDefaultGoogleModel = true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
super({
|
|
58
|
-
chainFn: async ({ messages, tools, threadId }) => {
|
|
59
|
-
// Lazy require for optional peer dependencies
|
|
60
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
61
|
-
const { ChatGoogle } = require("@langchain/google-gauth");
|
|
62
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
63
|
-
const { AIMessage } = require("@langchain/core/messages");
|
|
64
|
-
|
|
65
|
-
// Filter out empty assistant messages to prevent Gemini validation errors
|
|
66
|
-
// Gemini specifically rejects conversations containing AIMessages with empty content
|
|
67
|
-
const filteredMessages = messages.filter((message) => {
|
|
68
|
-
// Keep all non-AI messages (HumanMessage, SystemMessage, ToolMessage, etc.)
|
|
69
|
-
if (!(message instanceof AIMessage)) {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// For AIMessages, only keep those with non-empty content
|
|
74
|
-
// Also keep AIMessages with tool_calls even if content is empty
|
|
75
|
-
const aiMsg = message as any;
|
|
76
|
-
return (
|
|
77
|
-
(aiMsg.content && String(aiMsg.content).trim().length > 0) ||
|
|
78
|
-
(aiMsg.tool_calls && aiMsg.tool_calls.length > 0)
|
|
79
|
-
);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
this.model = options?.model ?? DEFAULT_MODEL;
|
|
83
|
-
const model = new ChatGoogle({
|
|
84
|
-
apiKey: options?.apiKey ?? process.env.GOOGLE_API_KEY,
|
|
85
|
-
modelName: this.model,
|
|
86
|
-
apiVersion: options?.apiVersion ?? DEFAULT_API_VERSION,
|
|
87
|
-
}).bindTools(tools);
|
|
88
|
-
|
|
89
|
-
return model.stream(filteredMessages, {
|
|
90
|
-
metadata: { conversation_id: threadId },
|
|
91
|
-
});
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|