beddel 0.2.2 → 0.3.0
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/CHANGELOG.md +50 -0
- package/README.md +117 -14
- package/dist/agents/chat/chat.handler.d.ts +12 -0
- package/dist/agents/chat/chat.handler.d.ts.map +1 -0
- package/dist/agents/chat/chat.handler.js +145 -0
- package/dist/agents/chat/chat.handler.js.map +1 -0
- package/dist/agents/chat/chat.schema.d.ts +38 -0
- package/dist/agents/chat/chat.schema.d.ts.map +1 -0
- package/dist/agents/chat/chat.schema.js +31 -0
- package/dist/agents/chat/chat.schema.js.map +1 -0
- package/dist/agents/chat/chat.types.d.ts +42 -0
- package/dist/agents/chat/chat.types.d.ts.map +1 -0
- package/dist/agents/chat/chat.types.js +6 -0
- package/dist/agents/chat/chat.types.js.map +1 -0
- package/dist/agents/chat/chat.yaml +148 -0
- package/dist/agents/chat/index.d.ts +16 -0
- package/dist/agents/chat/index.d.ts.map +1 -0
- package/dist/agents/chat/index.js +21 -0
- package/dist/agents/chat/index.js.map +1 -0
- package/dist/agents/chromadb/chromadb.handler.d.ts +12 -0
- package/dist/agents/chromadb/chromadb.handler.d.ts.map +1 -0
- package/dist/agents/chromadb/chromadb.handler.js +139 -0
- package/dist/agents/chromadb/chromadb.handler.js.map +1 -0
- package/dist/agents/chromadb/chromadb.schema.d.ts +36 -0
- package/dist/agents/chromadb/chromadb.schema.d.ts.map +1 -0
- package/dist/agents/chromadb/chromadb.schema.js +33 -0
- package/dist/agents/chromadb/chromadb.schema.js.map +1 -0
- package/dist/agents/chromadb/chromadb.types.d.ts +49 -0
- package/dist/agents/chromadb/chromadb.types.d.ts.map +1 -0
- package/dist/agents/chromadb/chromadb.types.js +6 -0
- package/dist/agents/chromadb/chromadb.types.js.map +1 -0
- package/dist/agents/chromadb/chromadb.yaml +128 -0
- package/dist/agents/chromadb/index.d.ts +15 -0
- package/dist/agents/chromadb/index.d.ts.map +1 -0
- package/dist/agents/chromadb/index.js +20 -0
- package/dist/agents/chromadb/index.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts +8 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js +61 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.handler.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts +22 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js +20 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.schema.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts +32 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.js +6 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.types.js.map +1 -0
- package/dist/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
- package/dist/agents/gemini-vectorize/index.d.ts +15 -0
- package/dist/agents/gemini-vectorize/index.d.ts.map +1 -0
- package/dist/agents/gemini-vectorize/index.js +20 -0
- package/dist/agents/gemini-vectorize/index.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.handler.d.ts +12 -0
- package/dist/agents/gitmcp/gitmcp.handler.d.ts.map +1 -0
- package/dist/agents/gitmcp/gitmcp.handler.js +95 -0
- package/dist/agents/gitmcp/gitmcp.handler.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.schema.d.ts +17 -0
- package/dist/agents/gitmcp/gitmcp.schema.d.ts.map +1 -0
- package/dist/agents/gitmcp/gitmcp.schema.js +18 -0
- package/dist/agents/gitmcp/gitmcp.schema.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.types.d.ts +31 -0
- package/dist/agents/gitmcp/gitmcp.types.d.ts.map +1 -0
- package/dist/agents/gitmcp/gitmcp.types.js +6 -0
- package/dist/agents/gitmcp/gitmcp.types.js.map +1 -0
- package/dist/agents/gitmcp/gitmcp.yaml +71 -0
- package/dist/agents/gitmcp/index.d.ts +16 -0
- package/dist/agents/gitmcp/index.d.ts.map +1 -0
- package/dist/agents/gitmcp/index.js +21 -0
- package/dist/agents/gitmcp/index.js.map +1 -0
- package/dist/agents/image/image.handler.d.ts +8 -0
- package/dist/agents/image/image.handler.d.ts.map +1 -0
- package/dist/agents/image/image.handler.js +69 -0
- package/dist/agents/image/image.handler.js.map +1 -0
- package/dist/agents/image/image.schema.d.ts +29 -0
- package/dist/agents/image/image.schema.d.ts.map +1 -0
- package/dist/agents/image/image.schema.js +26 -0
- package/dist/agents/image/image.schema.js.map +1 -0
- package/dist/agents/image/image.types.d.ts +43 -0
- package/dist/agents/image/image.types.d.ts.map +1 -0
- package/dist/agents/image/image.types.js +6 -0
- package/dist/agents/image/image.types.js.map +1 -0
- package/{src/agents/image-agent.yaml → dist/agents/image/image.yaml} +21 -21
- package/dist/agents/image/index.d.ts +14 -0
- package/dist/agents/image/index.d.ts.map +1 -0
- package/dist/agents/image/index.js +19 -0
- package/dist/agents/image/index.js.map +1 -0
- package/dist/agents/index.d.ts +104 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +82 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/joker/index.d.ts +14 -0
- package/dist/agents/joker/index.d.ts.map +1 -0
- package/dist/agents/joker/index.js +19 -0
- package/dist/agents/joker/index.js.map +1 -0
- package/dist/agents/joker/joker.handler.d.ts +8 -0
- package/dist/agents/joker/joker.handler.d.ts.map +1 -0
- package/dist/agents/joker/joker.handler.js +44 -0
- package/dist/agents/joker/joker.handler.js.map +1 -0
- package/dist/agents/joker/joker.schema.d.ts +12 -0
- package/dist/agents/joker/joker.schema.d.ts.map +1 -0
- package/dist/agents/joker/joker.schema.js +13 -0
- package/dist/agents/joker/joker.schema.js.map +1 -0
- package/dist/agents/joker/joker.types.d.ts +36 -0
- package/dist/agents/joker/joker.types.d.ts.map +1 -0
- package/dist/agents/joker/joker.types.js +6 -0
- package/dist/agents/joker/joker.types.js.map +1 -0
- package/{src/agents/joker-agent.yaml → dist/agents/joker/joker.yaml} +4 -4
- package/dist/agents/llm/index.d.ts +15 -0
- package/dist/agents/llm/index.d.ts.map +1 -0
- package/dist/agents/llm/index.js +20 -0
- package/dist/agents/llm/index.js.map +1 -0
- package/dist/agents/llm/llm.handler.d.ts +8 -0
- package/dist/agents/llm/llm.handler.d.ts.map +1 -0
- package/dist/agents/llm/llm.handler.js +64 -0
- package/dist/agents/llm/llm.handler.js.map +1 -0
- package/dist/agents/llm/llm.schema.d.ts +26 -0
- package/dist/agents/llm/llm.schema.d.ts.map +1 -0
- package/dist/agents/llm/llm.schema.js +23 -0
- package/dist/agents/llm/llm.schema.js.map +1 -0
- package/dist/agents/llm/llm.types.d.ts +34 -0
- package/dist/agents/llm/llm.types.d.ts.map +1 -0
- package/dist/agents/llm/llm.types.js +7 -0
- package/dist/agents/llm/llm.types.js.map +1 -0
- package/dist/agents/llm/llm.yaml +87 -0
- package/dist/agents/mcp-tool/index.d.ts +14 -0
- package/dist/agents/mcp-tool/index.d.ts.map +1 -0
- package/dist/agents/mcp-tool/index.js +19 -0
- package/dist/agents/mcp-tool/index.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.d.ts +12 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.d.ts.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.js +116 -0
- package/dist/agents/mcp-tool/mcp-tool.handler.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.d.ts +19 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.d.ts.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.js +20 -0
- package/dist/agents/mcp-tool/mcp-tool.schema.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.types.d.ts +31 -0
- package/dist/agents/mcp-tool/mcp-tool.types.d.ts.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.types.js +6 -0
- package/dist/agents/mcp-tool/mcp-tool.types.js.map +1 -0
- package/dist/agents/mcp-tool/mcp-tool.yaml +71 -0
- package/dist/agents/rag/index.d.ts +15 -0
- package/dist/agents/rag/index.d.ts.map +1 -0
- package/dist/agents/rag/index.js +20 -0
- package/dist/agents/rag/index.js.map +1 -0
- package/dist/agents/rag/rag.handler.d.ts +9 -0
- package/dist/agents/rag/rag.handler.d.ts.map +1 -0
- package/dist/agents/rag/rag.handler.js +78 -0
- package/dist/agents/rag/rag.handler.js.map +1 -0
- package/dist/agents/rag/rag.schema.d.ts +27 -0
- package/dist/agents/rag/rag.schema.d.ts.map +1 -0
- package/dist/agents/rag/rag.schema.js +24 -0
- package/dist/agents/rag/rag.schema.js.map +1 -0
- package/dist/agents/rag/rag.types.d.ts +42 -0
- package/dist/agents/rag/rag.types.d.ts.map +1 -0
- package/dist/agents/rag/rag.types.js +7 -0
- package/dist/agents/rag/rag.types.js.map +1 -0
- package/dist/agents/rag/rag.yaml +89 -0
- package/dist/agents/{agentRegistry.d.ts → registry/agentRegistry.d.ts} +30 -1
- package/dist/agents/registry/agentRegistry.d.ts.map +1 -0
- package/dist/agents/{agentRegistry.js → registry/agentRegistry.js} +187 -5
- package/dist/agents/registry/agentRegistry.js.map +1 -0
- package/dist/agents/registry/index.d.ts +6 -0
- package/dist/agents/registry/index.d.ts.map +1 -0
- package/dist/agents/registry/index.js +10 -0
- package/dist/agents/registry/index.js.map +1 -0
- package/dist/agents/translator/index.d.ts +14 -0
- package/dist/agents/translator/index.d.ts.map +1 -0
- package/dist/agents/translator/index.js +19 -0
- package/dist/agents/translator/index.js.map +1 -0
- package/dist/agents/translator/translator.handler.d.ts +8 -0
- package/dist/agents/translator/translator.handler.d.ts.map +1 -0
- package/dist/agents/translator/translator.handler.js +81 -0
- package/dist/agents/translator/translator.handler.js.map +1 -0
- package/dist/agents/translator/translator.schema.d.ts +27 -0
- package/dist/agents/translator/translator.schema.d.ts.map +1 -0
- package/dist/agents/translator/translator.schema.js +28 -0
- package/dist/agents/translator/translator.schema.js.map +1 -0
- package/dist/agents/translator/translator.types.d.ts +41 -0
- package/dist/agents/translator/translator.types.d.ts.map +1 -0
- package/dist/agents/translator/translator.types.js +6 -0
- package/dist/agents/translator/translator.types.js.map +1 -0
- package/{src/agents/translator-agent.yaml → dist/agents/translator/translator.yaml} +27 -27
- package/dist/client/index.d.ts +89 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +93 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +17 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +7 -0
- package/dist/client/types.js.map +1 -0
- package/dist/firebase/tenantManager.d.ts +34 -2
- package/dist/firebase/tenantManager.d.ts.map +1 -1
- package/dist/firebase/tenantManager.js +67 -1
- package/dist/firebase/tenantManager.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -7
- package/dist/index.js.map +1 -1
- package/dist/runtime/declarativeAgentRuntime.d.ts +17 -52
- package/dist/runtime/declarativeAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/declarativeAgentRuntime.js +259 -361
- package/dist/runtime/declarativeAgentRuntime.js.map +1 -1
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +38 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/llmProviderFactory.d.ts +47 -0
- package/dist/runtime/llmProviderFactory.d.ts.map +1 -0
- package/dist/runtime/llmProviderFactory.js +119 -0
- package/dist/runtime/llmProviderFactory.js.map +1 -0
- package/dist/runtime/workflowExecutor.d.ts +31 -0
- package/dist/runtime/workflowExecutor.d.ts.map +1 -0
- package/dist/runtime/workflowExecutor.js +80 -0
- package/dist/runtime/workflowExecutor.js.map +1 -0
- package/dist/server/api/graphql.js +3 -3
- package/dist/server/api/graphql.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +23 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/types/agent.types.d.ts +63 -0
- package/dist/shared/types/agent.types.d.ts.map +1 -0
- package/dist/shared/types/agent.types.js +18 -0
- package/dist/shared/types/agent.types.js.map +1 -0
- package/dist/shared/types/execution.types.d.ts +42 -0
- package/dist/shared/types/execution.types.d.ts.map +1 -0
- package/dist/shared/types/execution.types.js +7 -0
- package/dist/shared/types/execution.types.js.map +1 -0
- package/dist/shared/types/index.d.ts +7 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/shared/types/index.js +23 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/shared/types/schema.types.d.ts +52 -0
- package/dist/shared/types/schema.types.d.ts.map +1 -0
- package/dist/shared/types/schema.types.js +7 -0
- package/dist/shared/types/schema.types.js.map +1 -0
- package/dist/shared/utils/index.d.ts +5 -0
- package/dist/shared/utils/index.d.ts.map +1 -0
- package/dist/shared/utils/index.js +21 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/validation.d.ts +42 -0
- package/dist/shared/utils/validation.d.ts.map +1 -0
- package/dist/shared/utils/validation.js +93 -0
- package/dist/shared/utils/validation.js.map +1 -0
- package/dist/tenant/TenantManager.d.ts +152 -0
- package/dist/tenant/TenantManager.d.ts.map +1 -0
- package/dist/tenant/TenantManager.js +392 -0
- package/dist/tenant/TenantManager.js.map +1 -0
- package/dist/tenant/index.d.ts +47 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/tenant/index.js +74 -0
- package/dist/tenant/index.js.map +1 -0
- package/dist/tenant/interfaces.d.ts +170 -0
- package/dist/tenant/interfaces.d.ts.map +1 -0
- package/dist/tenant/interfaces.js +67 -0
- package/dist/tenant/interfaces.js.map +1 -0
- package/dist/tenant/providerFactory.d.ts +43 -0
- package/dist/tenant/providerFactory.d.ts.map +1 -0
- package/dist/tenant/providerFactory.js +70 -0
- package/dist/tenant/providerFactory.js.map +1 -0
- package/dist/tenant/providerRegistry.d.ts +47 -0
- package/dist/tenant/providerRegistry.d.ts.map +1 -0
- package/dist/tenant/providerRegistry.js +79 -0
- package/dist/tenant/providerRegistry.js.map +1 -0
- package/dist/tenant/providers/FirebaseTenantProvider.d.ts +41 -0
- package/dist/tenant/providers/FirebaseTenantProvider.d.ts.map +1 -0
- package/dist/tenant/providers/FirebaseTenantProvider.js +290 -0
- package/dist/tenant/providers/FirebaseTenantProvider.js.map +1 -0
- package/dist/tenant/providers/InMemoryTenantProvider.d.ts +18 -0
- package/dist/tenant/providers/InMemoryTenantProvider.d.ts.map +1 -0
- package/dist/tenant/providers/InMemoryTenantProvider.js +137 -0
- package/dist/tenant/providers/InMemoryTenantProvider.js.map +1 -0
- package/package.json +46 -10
- package/src/agents/chat/chat.handler.ts +211 -0
- package/src/agents/chat/chat.schema.ts +33 -0
- package/src/agents/chat/chat.types.ts +46 -0
- package/src/agents/chat/chat.yaml +148 -0
- package/src/agents/chat/index.ts +21 -0
- package/src/agents/chromadb/chromadb.handler.ts +130 -0
- package/src/agents/chromadb/chromadb.schema.ts +35 -0
- package/src/agents/chromadb/chromadb.types.ts +52 -0
- package/src/agents/chromadb/chromadb.yaml +128 -0
- package/src/agents/chromadb/index.ts +20 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.handler.ts +75 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.schema.ts +22 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.types.ts +34 -0
- package/src/agents/gemini-vectorize/gemini-vectorize.yaml +84 -0
- package/src/agents/gemini-vectorize/index.ts +20 -0
- package/src/agents/gitmcp/gitmcp.handler.ts +122 -0
- package/src/agents/gitmcp/gitmcp.schema.ts +20 -0
- package/src/agents/gitmcp/gitmcp.types.ts +33 -0
- package/src/agents/gitmcp/gitmcp.yaml +71 -0
- package/src/agents/gitmcp/index.ts +21 -0
- package/src/agents/image/image.handler.ts +86 -0
- package/src/agents/image/image.schema.ts +28 -0
- package/src/agents/image/image.types.ts +46 -0
- package/src/agents/image/image.yaml +86 -0
- package/src/agents/image/index.ts +19 -0
- package/src/agents/index.ts +63 -0
- package/src/agents/joker/index.ts +19 -0
- package/src/agents/joker/joker.handler.ts +55 -0
- package/src/agents/joker/joker.schema.ts +15 -0
- package/src/agents/joker/joker.types.ts +38 -0
- package/src/agents/joker/joker.yaml +47 -0
- package/src/agents/llm/index.ts +20 -0
- package/src/agents/llm/llm.handler.ts +82 -0
- package/src/agents/llm/llm.schema.ts +25 -0
- package/src/agents/llm/llm.types.ts +37 -0
- package/src/agents/llm/llm.yaml +87 -0
- package/src/agents/mcp-tool/index.ts +19 -0
- package/src/agents/mcp-tool/mcp-tool.handler.ts +112 -0
- package/src/agents/mcp-tool/mcp-tool.schema.ts +22 -0
- package/src/agents/mcp-tool/mcp-tool.types.ts +33 -0
- package/src/agents/mcp-tool/mcp-tool.yaml +71 -0
- package/src/agents/rag/index.ts +20 -0
- package/src/agents/rag/rag.handler.ts +95 -0
- package/src/agents/rag/rag.schema.ts +26 -0
- package/src/agents/rag/rag.types.ts +45 -0
- package/src/agents/rag/rag.yaml +89 -0
- package/src/agents/{agentRegistry.ts → registry/agentRegistry.ts} +195 -6
- package/src/agents/registry/index.ts +6 -0
- package/src/agents/translator/index.ts +19 -0
- package/src/agents/translator/translator.handler.ts +97 -0
- package/src/agents/translator/translator.schema.ts +30 -0
- package/src/agents/translator/translator.types.ts +43 -0
- package/src/agents/translator/translator.yaml +80 -0
- package/src/client/index.ts +53 -0
- package/src/client/types.ts +38 -0
- package/src/index.ts +56 -5
- package/src/runtime/declarativeAgentRuntime.ts +378 -495
- package/src/runtime/index.ts +36 -0
- package/src/runtime/llmProviderFactory.ts +145 -0
- package/src/runtime/workflowExecutor.ts +107 -0
- package/src/server/api/graphql.ts +1 -1
- package/src/server/index.ts +2 -2
- package/src/shared/index.ts +7 -0
- package/src/shared/types/agent.types.ts +100 -0
- package/src/shared/types/execution.types.ts +45 -0
- package/src/shared/types/index.ts +7 -0
- package/src/shared/types/schema.types.ts +55 -0
- package/src/shared/utils/index.ts +5 -0
- package/src/shared/utils/validation.ts +100 -0
- package/src/tenant/TenantManager.ts +488 -0
- package/src/tenant/index.ts +101 -0
- package/src/tenant/interfaces.ts +231 -0
- package/src/tenant/providerFactory.ts +75 -0
- package/src/tenant/providerRegistry.ts +86 -0
- package/src/tenant/providers/InMemoryTenantProvider.ts +168 -0
- package/dist/agents/agentRegistry.d.ts.map +0 -1
- package/dist/agents/agentRegistry.js.map +0 -1
- package/src/firebase/tenantManager.ts +0 -443
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Chat Agent Handler - Server-only execution logic
|
|
5
|
+
* Orchestrates RAG pipeline or simple LLM chat based on mode
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ExecutionContext } from '../../types/executionContext';
|
|
9
|
+
import type { ExecutionStep } from '../../shared/types/agent.types';
|
|
10
|
+
import type { ChatHandlerParams, ChatHandlerResult, ChatMode } from './chat.types';
|
|
11
|
+
import { executeVectorizeHandler } from '../gemini-vectorize/gemini-vectorize.handler';
|
|
12
|
+
import { executeChromaDBHandler } from '../chromadb/chromadb.handler';
|
|
13
|
+
import { executeRagHandler } from '../rag/rag.handler';
|
|
14
|
+
import { executeLlmHandler } from '../llm/llm.handler';
|
|
15
|
+
|
|
16
|
+
const KNOWLEDGE_COLLECTION = 'beddel_knowledge';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Execute simple chat mode - direct LLM with conversation history (no documents)
|
|
20
|
+
*/
|
|
21
|
+
async function executeSimpleChat(
|
|
22
|
+
query: string,
|
|
23
|
+
messages: ChatHandlerParams['messages'],
|
|
24
|
+
props: Record<string, string>,
|
|
25
|
+
context: ExecutionContext,
|
|
26
|
+
executionSteps: ExecutionStep[]
|
|
27
|
+
): Promise<ChatHandlerResult> {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
|
|
30
|
+
context.log(`[Chat:Simple] Processing query: "${query.substring(0, 50)}..."`);
|
|
31
|
+
|
|
32
|
+
const chatStep: ExecutionStep = {
|
|
33
|
+
agent: 'llm',
|
|
34
|
+
action: 'chat',
|
|
35
|
+
status: 'running',
|
|
36
|
+
startTime: Date.now(),
|
|
37
|
+
phase: 'generation',
|
|
38
|
+
};
|
|
39
|
+
executionSteps.push(chatStep);
|
|
40
|
+
|
|
41
|
+
const result = await executeLlmHandler(
|
|
42
|
+
{ query, history: messages },
|
|
43
|
+
props,
|
|
44
|
+
context
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
chatStep.status = result.error ? 'error' : 'success';
|
|
48
|
+
chatStep.endTime = Date.now();
|
|
49
|
+
chatStep.duration = chatStep.endTime - chatStep.startTime;
|
|
50
|
+
if (result.error) chatStep.error = result.error;
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
response: result.response,
|
|
54
|
+
timestamp: result.timestamp,
|
|
55
|
+
execution_steps: executionSteps,
|
|
56
|
+
total_duration: Date.now() - startTime,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Execute RAG chat mode - full pipeline with knowledge base
|
|
62
|
+
*/
|
|
63
|
+
async function executeRagChat(
|
|
64
|
+
query: string,
|
|
65
|
+
messages: ChatHandlerParams['messages'],
|
|
66
|
+
props: Record<string, string>,
|
|
67
|
+
context: ExecutionContext,
|
|
68
|
+
executionSteps: ExecutionStep[]
|
|
69
|
+
): Promise<ChatHandlerResult> {
|
|
70
|
+
const startTime = Date.now();
|
|
71
|
+
|
|
72
|
+
context.log(`[Chat:RAG] Processing query: "${query.substring(0, 50)}..."`);
|
|
73
|
+
|
|
74
|
+
// Step 1: Vectorize user query
|
|
75
|
+
const vectorizeStep: ExecutionStep = {
|
|
76
|
+
agent: 'gemini-vectorize',
|
|
77
|
+
action: 'embedSingle',
|
|
78
|
+
status: 'running',
|
|
79
|
+
startTime: Date.now(),
|
|
80
|
+
phase: 'vectorization',
|
|
81
|
+
};
|
|
82
|
+
executionSteps.push(vectorizeStep);
|
|
83
|
+
|
|
84
|
+
const vectorResult = await executeVectorizeHandler(
|
|
85
|
+
{ action: 'embedSingle', text: query },
|
|
86
|
+
props,
|
|
87
|
+
context
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
vectorizeStep.status = vectorResult.success ? 'success' : 'error';
|
|
91
|
+
vectorizeStep.endTime = Date.now();
|
|
92
|
+
vectorizeStep.duration = vectorizeStep.endTime - vectorizeStep.startTime;
|
|
93
|
+
|
|
94
|
+
if (!vectorResult.success || !vectorResult.vector) {
|
|
95
|
+
throw new Error(`Vectorization failed: ${vectorResult.error}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Step 2: Check if knowledge base has data
|
|
99
|
+
const checkStep: ExecutionStep = {
|
|
100
|
+
agent: 'chromadb',
|
|
101
|
+
action: 'hasData',
|
|
102
|
+
status: 'running',
|
|
103
|
+
startTime: Date.now(),
|
|
104
|
+
phase: 'retrieval',
|
|
105
|
+
};
|
|
106
|
+
executionSteps.push(checkStep);
|
|
107
|
+
|
|
108
|
+
const hasDataResult = await executeChromaDBHandler(
|
|
109
|
+
{ action: 'hasData', collection_name: KNOWLEDGE_COLLECTION, min_count: 5 },
|
|
110
|
+
props,
|
|
111
|
+
context
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
checkStep.status = hasDataResult.success ? 'success' : 'error';
|
|
115
|
+
checkStep.endTime = Date.now();
|
|
116
|
+
checkStep.duration = checkStep.endTime - checkStep.startTime;
|
|
117
|
+
|
|
118
|
+
// Step 3: Search knowledge base
|
|
119
|
+
const searchStep: ExecutionStep = {
|
|
120
|
+
agent: 'chromadb',
|
|
121
|
+
action: 'search',
|
|
122
|
+
status: 'running',
|
|
123
|
+
startTime: Date.now(),
|
|
124
|
+
phase: 'retrieval',
|
|
125
|
+
};
|
|
126
|
+
executionSteps.push(searchStep);
|
|
127
|
+
|
|
128
|
+
const searchResult = await executeChromaDBHandler(
|
|
129
|
+
{
|
|
130
|
+
action: 'search',
|
|
131
|
+
collection_name: KNOWLEDGE_COLLECTION,
|
|
132
|
+
query_vector: vectorResult.vector,
|
|
133
|
+
limit: 5,
|
|
134
|
+
},
|
|
135
|
+
props,
|
|
136
|
+
context
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
searchStep.status = searchResult.success ? 'success' : 'error';
|
|
140
|
+
searchStep.endTime = Date.now();
|
|
141
|
+
searchStep.duration = searchStep.endTime - searchStep.startTime;
|
|
142
|
+
|
|
143
|
+
// Step 4: Generate answer using RAG
|
|
144
|
+
const ragStep: ExecutionStep = {
|
|
145
|
+
agent: 'rag',
|
|
146
|
+
action: 'generate',
|
|
147
|
+
status: 'running',
|
|
148
|
+
startTime: Date.now(),
|
|
149
|
+
phase: 'generation',
|
|
150
|
+
};
|
|
151
|
+
executionSteps.push(ragStep);
|
|
152
|
+
|
|
153
|
+
const hasDocuments = searchResult.documents && searchResult.documents.trim().length > 0;
|
|
154
|
+
const documents = hasDocuments
|
|
155
|
+
? searchResult.documents
|
|
156
|
+
: 'No specific documentation available. Answer based on general knowledge.';
|
|
157
|
+
|
|
158
|
+
const ragResult = await executeRagHandler(
|
|
159
|
+
{ query, documents, history: messages },
|
|
160
|
+
props,
|
|
161
|
+
context
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
ragStep.status = ragResult.error ? 'error' : 'success';
|
|
165
|
+
ragStep.endTime = Date.now();
|
|
166
|
+
ragStep.duration = ragStep.endTime - ragStep.startTime;
|
|
167
|
+
if (ragResult.error) ragStep.error = ragResult.error;
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
response: ragResult.response,
|
|
171
|
+
timestamp: ragResult.timestamp,
|
|
172
|
+
execution_steps: executionSteps,
|
|
173
|
+
total_duration: Date.now() - startTime,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Execute chat orchestration
|
|
179
|
+
*/
|
|
180
|
+
export async function executeChatHandler(
|
|
181
|
+
params: ChatHandlerParams,
|
|
182
|
+
props: Record<string, string>,
|
|
183
|
+
context: ExecutionContext
|
|
184
|
+
): Promise<ChatHandlerResult> {
|
|
185
|
+
const executionSteps: ExecutionStep[] = [];
|
|
186
|
+
const messages = params.messages || [];
|
|
187
|
+
const lastUserMessage = [...messages].reverse().find((m) => m.role === 'user');
|
|
188
|
+
const query = params.query || lastUserMessage?.content || '';
|
|
189
|
+
const mode: ChatMode = params.mode || 'rag';
|
|
190
|
+
|
|
191
|
+
if (!query) {
|
|
192
|
+
throw new Error('No query found in messages or query parameter');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
return mode === 'simple'
|
|
197
|
+
? await executeSimpleChat(query, messages, props, context, executionSteps)
|
|
198
|
+
: await executeRagChat(query, messages, props, context, executionSteps);
|
|
199
|
+
} catch (error: unknown) {
|
|
200
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
201
|
+
context.log(`[Chat] Error: ${message}`);
|
|
202
|
+
context.setError(message);
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
response: `Error processing your request: ${message}`,
|
|
206
|
+
timestamp: new Date().toISOString(),
|
|
207
|
+
execution_steps: executionSteps,
|
|
208
|
+
total_duration: 0,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Agent Schema - Zod validation schemas
|
|
3
|
+
* Safe for both client and server
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
|
|
8
|
+
export const ChatInputSchema = z.object({
|
|
9
|
+
messages: z.array(z.object({
|
|
10
|
+
role: z.enum(['user', 'assistant', 'system']),
|
|
11
|
+
content: z.string(),
|
|
12
|
+
})),
|
|
13
|
+
query: z.string().optional(),
|
|
14
|
+
knowledge_sources: z.array(z.string()).optional(),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const ChatOutputSchema = z.object({
|
|
18
|
+
response: z.string(),
|
|
19
|
+
timestamp: z.string(),
|
|
20
|
+
execution_steps: z.array(z.object({
|
|
21
|
+
agent: z.string(),
|
|
22
|
+
action: z.string(),
|
|
23
|
+
status: z.enum(['running', 'success', 'error']),
|
|
24
|
+
startTime: z.number(),
|
|
25
|
+
endTime: z.number().optional(),
|
|
26
|
+
duration: z.number().optional(),
|
|
27
|
+
error: z.string().optional(),
|
|
28
|
+
})).optional(),
|
|
29
|
+
total_duration: z.number().optional(),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export type ChatInput = z.infer<typeof ChatInputSchema>;
|
|
33
|
+
export type ChatOutput = z.infer<typeof ChatOutputSchema>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Agent Types - Shared between client and server
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ConversationMessage } from '../rag/rag.types';
|
|
6
|
+
import type { ExecutionStep } from '../../shared/types/agent.types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Chat mode determines the execution flow
|
|
10
|
+
* - 'rag': Full RAG pipeline with knowledge base (default)
|
|
11
|
+
* - 'simple': Direct LLM chat maintaining conversation context only
|
|
12
|
+
*/
|
|
13
|
+
export type ChatMode = 'rag' | 'simple';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parameters for chat orchestration
|
|
17
|
+
*/
|
|
18
|
+
export interface ChatHandlerParams {
|
|
19
|
+
messages: ConversationMessage[];
|
|
20
|
+
query?: string;
|
|
21
|
+
mode?: ChatMode;
|
|
22
|
+
knowledge_sources?: string[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Result from chat orchestration
|
|
27
|
+
*/
|
|
28
|
+
export interface ChatHandlerResult {
|
|
29
|
+
response: string;
|
|
30
|
+
timestamp: string;
|
|
31
|
+
execution_steps?: ExecutionStep[];
|
|
32
|
+
total_duration?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Chat agent metadata
|
|
37
|
+
*/
|
|
38
|
+
export interface ChatMetadata {
|
|
39
|
+
id: 'chat';
|
|
40
|
+
name: string;
|
|
41
|
+
description: string;
|
|
42
|
+
category: 'chat';
|
|
43
|
+
route: '/agents/chat';
|
|
44
|
+
knowledge_sources: string[];
|
|
45
|
+
tags: string[];
|
|
46
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Chat Agent - Native Builtin Orchestrator Agent for Beddel Runtime
|
|
2
|
+
# Route: /agents/chat
|
|
3
|
+
# Method: chat.execute
|
|
4
|
+
|
|
5
|
+
agent:
|
|
6
|
+
id: chat
|
|
7
|
+
version: 1.0.0
|
|
8
|
+
protocol: beddel-declarative-protocol/v2.0
|
|
9
|
+
|
|
10
|
+
metadata:
|
|
11
|
+
name: "Q&A Context Chat Agent"
|
|
12
|
+
description: "Orchestrates RAG pipeline or direct LLM chat based on mode selection"
|
|
13
|
+
category: "chat"
|
|
14
|
+
route: "/agents/chat"
|
|
15
|
+
knowledge_sources:
|
|
16
|
+
- "gitmcp-agent"
|
|
17
|
+
tags:
|
|
18
|
+
- "chat"
|
|
19
|
+
- "orchestrator"
|
|
20
|
+
- "rag"
|
|
21
|
+
- "llm"
|
|
22
|
+
- "qa"
|
|
23
|
+
|
|
24
|
+
schema:
|
|
25
|
+
input:
|
|
26
|
+
type: "object"
|
|
27
|
+
properties:
|
|
28
|
+
messages:
|
|
29
|
+
type: "array"
|
|
30
|
+
items:
|
|
31
|
+
type: "object"
|
|
32
|
+
properties:
|
|
33
|
+
role:
|
|
34
|
+
type: "string"
|
|
35
|
+
enum: ["user", "assistant", "system"]
|
|
36
|
+
content:
|
|
37
|
+
type: "string"
|
|
38
|
+
required: ["role", "content"]
|
|
39
|
+
description: "Conversation messages"
|
|
40
|
+
query:
|
|
41
|
+
type: "string"
|
|
42
|
+
description: "Direct query (alternative to messages)"
|
|
43
|
+
mode:
|
|
44
|
+
type: "string"
|
|
45
|
+
enum: ["rag", "simple"]
|
|
46
|
+
default: "rag"
|
|
47
|
+
description: "Chat mode: 'rag' for knowledge-based answers, 'simple' for direct LLM chat"
|
|
48
|
+
knowledge_sources:
|
|
49
|
+
type: "array"
|
|
50
|
+
items:
|
|
51
|
+
type: "string"
|
|
52
|
+
description: "GitMCP URLs to use as knowledge sources"
|
|
53
|
+
required: ["messages"]
|
|
54
|
+
|
|
55
|
+
output:
|
|
56
|
+
type: "object"
|
|
57
|
+
properties:
|
|
58
|
+
response:
|
|
59
|
+
type: "string"
|
|
60
|
+
description: "Generated answer"
|
|
61
|
+
timestamp:
|
|
62
|
+
type: "string"
|
|
63
|
+
description: "ISO timestamp"
|
|
64
|
+
execution_steps:
|
|
65
|
+
type: "array"
|
|
66
|
+
description: "Detailed execution steps for observability"
|
|
67
|
+
total_duration:
|
|
68
|
+
type: "number"
|
|
69
|
+
description: "Total execution time in milliseconds"
|
|
70
|
+
required: ["response", "timestamp"]
|
|
71
|
+
|
|
72
|
+
logic:
|
|
73
|
+
variables:
|
|
74
|
+
- name: "userQuery"
|
|
75
|
+
type: "string"
|
|
76
|
+
init: '""'
|
|
77
|
+
- name: "allDocuments"
|
|
78
|
+
type: "string"
|
|
79
|
+
init: '""'
|
|
80
|
+
|
|
81
|
+
workflow:
|
|
82
|
+
# Step 1: Extract user query from messages
|
|
83
|
+
- name: "extract-query"
|
|
84
|
+
type: "output-generator"
|
|
85
|
+
action:
|
|
86
|
+
type: "generate"
|
|
87
|
+
output:
|
|
88
|
+
_extracted: true
|
|
89
|
+
|
|
90
|
+
# Step 2: Mode branch - Simple LLM chat or RAG pipeline
|
|
91
|
+
- name: "mode-check"
|
|
92
|
+
type: "conditional"
|
|
93
|
+
condition: "$input.mode == 'simple'"
|
|
94
|
+
then:
|
|
95
|
+
# Simple mode: Direct LLM chat with conversation history (no documents)
|
|
96
|
+
- name: "simple-chat"
|
|
97
|
+
type: "llm"
|
|
98
|
+
action:
|
|
99
|
+
query: "$input.query"
|
|
100
|
+
history: "$input.messages"
|
|
101
|
+
result: "llmResult"
|
|
102
|
+
else:
|
|
103
|
+
# RAG mode: Full pipeline with knowledge base
|
|
104
|
+
- name: "vectorize-query"
|
|
105
|
+
type: "gemini-vectorize"
|
|
106
|
+
action:
|
|
107
|
+
action: "embedSingle"
|
|
108
|
+
text: "$input.query"
|
|
109
|
+
result: "queryVector"
|
|
110
|
+
|
|
111
|
+
- name: "check-knowledge"
|
|
112
|
+
type: "chromadb"
|
|
113
|
+
action:
|
|
114
|
+
action: "hasData"
|
|
115
|
+
collection_name: "beddel_knowledge"
|
|
116
|
+
min_count: 5
|
|
117
|
+
result: "hasDataResult"
|
|
118
|
+
|
|
119
|
+
- name: "search-knowledge"
|
|
120
|
+
type: "chromadb"
|
|
121
|
+
action:
|
|
122
|
+
action: "search"
|
|
123
|
+
collection_name: "beddel_knowledge"
|
|
124
|
+
query_vector: "$queryVector.vector"
|
|
125
|
+
limit: 5
|
|
126
|
+
result: "searchResult"
|
|
127
|
+
|
|
128
|
+
- name: "generate-answer"
|
|
129
|
+
type: "rag"
|
|
130
|
+
action:
|
|
131
|
+
query: "$input.query"
|
|
132
|
+
documents: "$searchResult.documents"
|
|
133
|
+
history: "$input.messages"
|
|
134
|
+
result: "ragResult"
|
|
135
|
+
|
|
136
|
+
# Step 3: Deliver final response
|
|
137
|
+
- name: "deliver-response"
|
|
138
|
+
type: "output-generator"
|
|
139
|
+
action:
|
|
140
|
+
type: "generate"
|
|
141
|
+
output:
|
|
142
|
+
response: "$ragResult.response"
|
|
143
|
+
timestamp: "$ragResult.timestamp"
|
|
144
|
+
|
|
145
|
+
output:
|
|
146
|
+
schema:
|
|
147
|
+
response: "$ragResult.response"
|
|
148
|
+
timestamp: "$ragResult.timestamp"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Agent - Public exports (client-safe)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Schema exports (client-safe)
|
|
6
|
+
export { ChatInputSchema, ChatOutputSchema } from './chat.schema';
|
|
7
|
+
export type { ChatInput, ChatOutput } from './chat.schema';
|
|
8
|
+
|
|
9
|
+
// Type exports (client-safe)
|
|
10
|
+
export type { ChatHandlerParams, ChatHandlerResult, ChatMetadata } from './chat.types';
|
|
11
|
+
|
|
12
|
+
// Metadata (client-safe)
|
|
13
|
+
export const chatMetadata = {
|
|
14
|
+
id: 'chat',
|
|
15
|
+
name: 'Q&A Context Chat Agent',
|
|
16
|
+
description: 'Orchestrates RAG pipeline: vectorization, storage, retrieval and answer generation',
|
|
17
|
+
category: 'chat',
|
|
18
|
+
route: '/agents/chat',
|
|
19
|
+
knowledge_sources: ['gitmcp-agent'],
|
|
20
|
+
tags: ['chat', 'orchestrator', 'rag', 'qa'],
|
|
21
|
+
} as const;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ChromaDB Agent Handler - Server-only execution logic
|
|
5
|
+
* Vector storage and retrieval using ChromaDB
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ExecutionContext } from '../../types/executionContext';
|
|
9
|
+
import type { ChromaDBHandlerParams, ChromaDBHandlerResult, ChromaDBSearchResult } from './chromadb.types';
|
|
10
|
+
|
|
11
|
+
// ChromaDB imports (lazy loaded)
|
|
12
|
+
let chromaClient: any = null;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Execute ChromaDB operations
|
|
16
|
+
*/
|
|
17
|
+
export async function executeChromaDBHandler(
|
|
18
|
+
params: ChromaDBHandlerParams,
|
|
19
|
+
_props: Record<string, string>,
|
|
20
|
+
context: ExecutionContext
|
|
21
|
+
): Promise<ChromaDBHandlerResult> {
|
|
22
|
+
const action = params.action;
|
|
23
|
+
const collectionName = params.collection_name;
|
|
24
|
+
|
|
25
|
+
if (!collectionName) {
|
|
26
|
+
throw new Error('Missing required ChromaDB input: collection_name');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
// Lazy load ChromaDB
|
|
31
|
+
if (!chromaClient) {
|
|
32
|
+
const chromaModule = await import('chromadb');
|
|
33
|
+
|
|
34
|
+
if (process.env.CHROMADB_API_KEY) {
|
|
35
|
+
context.log('[ChromaDB] Initializing CloudClient...');
|
|
36
|
+
chromaClient = new chromaModule.CloudClient({
|
|
37
|
+
apiKey: process.env.CHROMADB_API_KEY,
|
|
38
|
+
tenant: process.env.CHROMADB_TENANT || 'default_tenant',
|
|
39
|
+
database: process.env.CHROMADB_DATABASE || 'dev',
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
context.log('[ChromaDB] Initializing Local ChromaClient...');
|
|
43
|
+
chromaClient = new chromaModule.ChromaClient({
|
|
44
|
+
path: process.env.CHROMADB_URL || 'http://localhost:8000',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (action === 'hasData') {
|
|
50
|
+
const minCount = params.min_count || 1;
|
|
51
|
+
context.log(`[ChromaDB] Checking data for collection: ${collectionName}`);
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const collection = await chromaClient.getCollection({
|
|
55
|
+
name: collectionName,
|
|
56
|
+
embeddingFunction: undefined,
|
|
57
|
+
});
|
|
58
|
+
const count = await collection.count();
|
|
59
|
+
const hasEnoughData = count >= minCount;
|
|
60
|
+
|
|
61
|
+
return { success: true, has_data: hasEnoughData, count };
|
|
62
|
+
} catch {
|
|
63
|
+
return { success: true, has_data: false, count: 0 };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
} else if (action === 'store') {
|
|
67
|
+
const ids = params.ids;
|
|
68
|
+
const vectors = params.vectors;
|
|
69
|
+
const documents = params.documents;
|
|
70
|
+
const metadatas = params.metadatas;
|
|
71
|
+
|
|
72
|
+
context.log(`[ChromaDB] Storing ${ids?.length || 0} items in ${collectionName}...`);
|
|
73
|
+
|
|
74
|
+
const collection = await chromaClient.getOrCreateCollection({
|
|
75
|
+
name: collectionName,
|
|
76
|
+
embeddingFunction: undefined,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
await collection.add({
|
|
80
|
+
ids,
|
|
81
|
+
embeddings: vectors,
|
|
82
|
+
documents,
|
|
83
|
+
metadatas,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return { success: true, stored_count: ids?.length || 0 };
|
|
87
|
+
|
|
88
|
+
} else if (action === 'search') {
|
|
89
|
+
const queryVector = params.query_vector;
|
|
90
|
+
const limit = params.limit || 5;
|
|
91
|
+
|
|
92
|
+
context.log(`[ChromaDB] Searching ${collectionName}...`);
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
const collection = await chromaClient.getCollection({
|
|
96
|
+
name: collectionName,
|
|
97
|
+
embeddingFunction: undefined,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const results = await collection.query({
|
|
101
|
+
queryEmbeddings: [queryVector],
|
|
102
|
+
nResults: limit,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const flatResults: ChromaDBSearchResult[] = (results.documents[0] || []).map(
|
|
106
|
+
(doc: string | null, idx: number) => ({
|
|
107
|
+
text: doc,
|
|
108
|
+
metadata: results.metadatas[0]?.[idx] || null,
|
|
109
|
+
distance: results.distances?.[0]?.[idx] || null,
|
|
110
|
+
})
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const documentsString = flatResults.map((r) => r.text).join('\n\n---\n\n');
|
|
114
|
+
|
|
115
|
+
return { success: true, results: flatResults, documents: documentsString };
|
|
116
|
+
} catch {
|
|
117
|
+
// Collection doesn't exist - return empty results
|
|
118
|
+
context.log(`[ChromaDB] Collection ${collectionName} not found, returning empty results`);
|
|
119
|
+
return { success: true, results: [], documents: '' };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
} else {
|
|
123
|
+
throw new Error(`Unknown ChromaDB action: ${action}`);
|
|
124
|
+
}
|
|
125
|
+
} catch (error: unknown) {
|
|
126
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
127
|
+
context.log(`[ChromaDB] Error: ${message}`);
|
|
128
|
+
return { success: false, error: message };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChromaDB Agent Schema - Zod validation schemas
|
|
3
|
+
* Safe for both client and server
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
|
|
8
|
+
export const ChromaDBInputSchema = z.object({
|
|
9
|
+
action: z.enum(['hasData', 'store', 'search']),
|
|
10
|
+
collection_name: z.string().min(1),
|
|
11
|
+
min_count: z.number().optional(),
|
|
12
|
+
ids: z.array(z.string()).optional(),
|
|
13
|
+
vectors: z.array(z.array(z.number())).optional(),
|
|
14
|
+
documents: z.array(z.string()).optional(),
|
|
15
|
+
metadatas: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
16
|
+
query_vector: z.array(z.number()).optional(),
|
|
17
|
+
limit: z.number().optional(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export const ChromaDBOutputSchema = z.object({
|
|
21
|
+
success: z.boolean(),
|
|
22
|
+
has_data: z.boolean().optional(),
|
|
23
|
+
count: z.number().optional(),
|
|
24
|
+
stored_count: z.number().optional(),
|
|
25
|
+
results: z.array(z.object({
|
|
26
|
+
text: z.string().nullable(),
|
|
27
|
+
metadata: z.record(z.string(), z.unknown()).nullable(),
|
|
28
|
+
distance: z.number().nullable(),
|
|
29
|
+
})).optional(),
|
|
30
|
+
documents: z.string().optional(),
|
|
31
|
+
error: z.string().optional(),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
export type ChromaDBInput = z.infer<typeof ChromaDBInputSchema>;
|
|
35
|
+
export type ChromaDBOutput = z.infer<typeof ChromaDBOutputSchema>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChromaDB Agent Types - Shared between client and server
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parameters for ChromaDB operations
|
|
7
|
+
*/
|
|
8
|
+
export interface ChromaDBHandlerParams {
|
|
9
|
+
action: 'hasData' | 'store' | 'search';
|
|
10
|
+
collection_name: string;
|
|
11
|
+
min_count?: number;
|
|
12
|
+
ids?: string[];
|
|
13
|
+
vectors?: number[][];
|
|
14
|
+
documents?: string[];
|
|
15
|
+
metadatas?: Record<string, unknown>[];
|
|
16
|
+
query_vector?: number[];
|
|
17
|
+
limit?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Search result item
|
|
22
|
+
*/
|
|
23
|
+
export interface ChromaDBSearchResult {
|
|
24
|
+
text: string | null;
|
|
25
|
+
metadata: Record<string, unknown> | null;
|
|
26
|
+
distance: number | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Result from ChromaDB operations
|
|
31
|
+
*/
|
|
32
|
+
export interface ChromaDBHandlerResult {
|
|
33
|
+
success: boolean;
|
|
34
|
+
has_data?: boolean;
|
|
35
|
+
count?: number;
|
|
36
|
+
stored_count?: number;
|
|
37
|
+
results?: ChromaDBSearchResult[];
|
|
38
|
+
documents?: string;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* ChromaDB agent metadata
|
|
44
|
+
*/
|
|
45
|
+
export interface ChromaDBMetadata {
|
|
46
|
+
id: 'chromadb';
|
|
47
|
+
name: string;
|
|
48
|
+
description: string;
|
|
49
|
+
category: 'database';
|
|
50
|
+
route: '/agents/chromadb';
|
|
51
|
+
tags: string[];
|
|
52
|
+
}
|