ctxpkg 0.0.3 → 0.0.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/bin/cli.js +1 -1
- package/bin/daemon.js +1 -1
- package/dist/agent/agent.d.ts +65 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +291 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/agent.prompts.d.ts +13 -0
- package/dist/agent/agent.prompts.d.ts.map +1 -0
- package/{src/agent/agent.prompts.ts → dist/agent/agent.prompts.js} +11 -12
- package/dist/agent/agent.prompts.js.map +1 -0
- package/dist/agent/agent.test-runner.d.ts +73 -0
- package/dist/agent/agent.test-runner.d.ts.map +1 -0
- package/dist/agent/agent.test-runner.js +316 -0
- package/dist/agent/agent.test-runner.js.map +1 -0
- package/dist/agent/agent.test-runner.schemas.d.ts +382 -0
- package/dist/agent/agent.test-runner.schemas.d.ts.map +1 -0
- package/dist/agent/agent.test-runner.schemas.js +110 -0
- package/dist/agent/agent.test-runner.schemas.js.map +1 -0
- package/dist/agent/agent.types.d.ts +122 -0
- package/dist/agent/agent.types.d.ts.map +1 -0
- package/dist/agent/agent.types.js +19 -0
- package/dist/agent/agent.types.js.map +1 -0
- package/dist/backend/backend.d.ts +16 -0
- package/dist/backend/backend.d.ts.map +1 -0
- package/dist/backend/backend.js +79 -0
- package/dist/backend/backend.js.map +1 -0
- package/dist/backend/backend.protocol.d.ts +74 -0
- package/dist/backend/backend.protocol.d.ts.map +1 -0
- package/dist/backend/backend.protocol.js +46 -0
- package/dist/backend/backend.protocol.js.map +1 -0
- package/dist/backend/backend.schemas.d.ts +141 -0
- package/dist/backend/backend.schemas.d.ts.map +1 -0
- package/dist/backend/backend.schemas.js +59 -0
- package/dist/backend/backend.schemas.js.map +1 -0
- package/dist/backend/backend.services.d.ts +290 -0
- package/dist/backend/backend.services.d.ts.map +1 -0
- package/dist/backend/backend.services.js +103 -0
- package/dist/backend/backend.services.js.map +1 -0
- package/dist/backend/backend.types.d.ts +25 -0
- package/dist/backend/backend.types.d.ts.map +1 -0
- package/dist/backend/backend.types.js +6 -0
- package/dist/backend/backend.types.js.map +1 -0
- package/dist/cli/cli.agent.d.ts +4 -0
- package/dist/cli/cli.agent.d.ts.map +1 -0
- package/dist/cli/cli.agent.js +158 -0
- package/dist/cli/cli.agent.js.map +1 -0
- package/dist/cli/cli.chat.d.ts +4 -0
- package/dist/cli/cli.chat.d.ts.map +1 -0
- package/dist/cli/cli.chat.js +311 -0
- package/dist/cli/cli.chat.js.map +1 -0
- package/dist/cli/cli.client.d.ts +11 -0
- package/dist/cli/cli.client.d.ts.map +1 -0
- package/dist/cli/cli.client.js +40 -0
- package/dist/cli/cli.client.js.map +1 -0
- package/dist/cli/cli.collections.d.ts +4 -0
- package/dist/cli/cli.collections.d.ts.map +1 -0
- package/dist/cli/cli.collections.js +411 -0
- package/dist/cli/cli.collections.js.map +1 -0
- package/dist/cli/cli.config.d.ts +4 -0
- package/dist/cli/cli.config.d.ts.map +1 -0
- package/dist/cli/cli.config.js +192 -0
- package/dist/cli/cli.config.js.map +1 -0
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.daemon.d.ts +4 -0
- package/dist/cli/cli.daemon.d.ts.map +1 -0
- package/dist/cli/cli.daemon.js +116 -0
- package/dist/cli/cli.daemon.js.map +1 -0
- package/dist/cli/cli.documents.d.ts +4 -0
- package/dist/cli/cli.documents.d.ts.map +1 -0
- package/dist/cli/cli.documents.js +332 -0
- package/dist/cli/cli.documents.js.map +1 -0
- package/dist/cli/cli.js +23 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/cli.mcp.d.ts +4 -0
- package/dist/cli/cli.mcp.d.ts.map +1 -0
- package/dist/cli/cli.mcp.js +146 -0
- package/dist/cli/cli.mcp.js.map +1 -0
- package/dist/cli/cli.utils.d.ts +51 -0
- package/dist/cli/cli.utils.d.ts.map +1 -0
- package/dist/cli/cli.utils.js +95 -0
- package/dist/cli/cli.utils.js.map +1 -0
- package/dist/client/client.adapters.d.ts +38 -0
- package/dist/client/client.adapters.d.ts.map +1 -0
- package/dist/client/client.adapters.js +233 -0
- package/dist/client/client.adapters.js.map +1 -0
- package/dist/client/client.d.ts +16 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +74 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/client.types.d.ts +10 -0
- package/dist/client/client.types.d.ts.map +1 -0
- package/dist/client/client.types.js +2 -0
- package/dist/client/client.types.js.map +1 -0
- package/dist/collections/collections.d.ts +219 -0
- package/dist/collections/collections.d.ts.map +1 -0
- package/dist/collections/collections.js +933 -0
- package/dist/collections/collections.js.map +1 -0
- package/dist/collections/collections.schemas.d.ts +298 -0
- package/dist/collections/collections.schemas.d.ts.map +1 -0
- package/dist/collections/collections.schemas.js +117 -0
- package/dist/collections/collections.schemas.js.map +1 -0
- package/dist/config/config.d.ts +29 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +112 -0
- package/dist/config/config.js.map +1 -0
- package/dist/daemon/daemon.config.d.ts +6 -0
- package/dist/daemon/daemon.config.d.ts.map +1 -0
- package/dist/daemon/daemon.config.js +19 -0
- package/dist/daemon/daemon.config.js.map +1 -0
- package/dist/daemon/daemon.d.ts +10 -0
- package/dist/daemon/daemon.d.ts.map +1 -0
- package/dist/daemon/daemon.js +173 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/daemon.manager.d.ts +20 -0
- package/dist/daemon/daemon.manager.d.ts.map +1 -0
- package/dist/daemon/daemon.manager.js +176 -0
- package/dist/daemon/daemon.manager.js.map +1 -0
- package/dist/daemon/daemon.schemas.d.ts +38 -0
- package/dist/daemon/daemon.schemas.d.ts.map +1 -0
- package/dist/daemon/daemon.schemas.js +15 -0
- package/dist/daemon/daemon.schemas.js.map +1 -0
- package/dist/database/database.d.ts +10 -0
- package/dist/database/database.d.ts.map +1 -0
- package/dist/database/database.js +52 -0
- package/dist/database/database.js.map +1 -0
- package/dist/database/migrations/migrations.001-init.d.ts +9 -0
- package/dist/database/migrations/migrations.001-init.d.ts.map +1 -0
- package/dist/database/migrations/migrations.001-init.js +46 -0
- package/dist/database/migrations/migrations.001-init.js.map +1 -0
- package/dist/database/migrations/migrations.002-fts5.d.ts +11 -0
- package/dist/database/migrations/migrations.002-fts5.d.ts.map +1 -0
- package/dist/database/migrations/migrations.002-fts5.js +29 -0
- package/dist/database/migrations/migrations.002-fts5.js.map +1 -0
- package/dist/database/migrations/migrations.d.ts +11 -0
- package/dist/database/migrations/migrations.d.ts.map +1 -0
- package/dist/database/migrations/migrations.js +14 -0
- package/dist/database/migrations/migrations.js.map +1 -0
- package/dist/database/migrations/migrations.types.d.ts +8 -0
- package/dist/database/migrations/migrations.types.d.ts.map +1 -0
- package/dist/database/migrations/migrations.types.js +2 -0
- package/dist/database/migrations/migrations.types.js.map +1 -0
- package/dist/documents/documents.d.ts +58 -0
- package/dist/documents/documents.d.ts.map +1 -0
- package/dist/documents/documents.js +597 -0
- package/dist/documents/documents.js.map +1 -0
- package/dist/documents/documents.schemas.d.ts +418 -0
- package/dist/documents/documents.schemas.d.ts.map +1 -0
- package/dist/documents/documents.schemas.js +111 -0
- package/dist/documents/documents.schemas.js.map +1 -0
- package/dist/embedder/embedder.d.ts +22 -0
- package/dist/embedder/embedder.d.ts.map +1 -0
- package/dist/embedder/embedder.js +46 -0
- package/dist/embedder/embedder.js.map +1 -0
- package/dist/exports.d.ts +2 -0
- package/dist/exports.d.ts.map +1 -0
- package/dist/exports.js +2 -0
- package/dist/exports.js.map +1 -0
- package/dist/mcp/mcp.d.ts +44 -0
- package/dist/mcp/mcp.d.ts.map +1 -0
- package/dist/mcp/mcp.js +62 -0
- package/dist/mcp/mcp.js.map +1 -0
- package/dist/tools/agent/agent.d.ts +14 -0
- package/dist/tools/agent/agent.d.ts.map +1 -0
- package/dist/tools/agent/agent.js +31 -0
- package/dist/tools/agent/agent.js.map +1 -0
- package/dist/tools/documents/documents.d.ts +28 -0
- package/dist/tools/documents/documents.d.ts.map +1 -0
- package/dist/tools/documents/documents.js +336 -0
- package/dist/tools/documents/documents.js.map +1 -0
- package/dist/tools/tools.langchain.d.ts +11 -0
- package/dist/tools/tools.langchain.d.ts.map +1 -0
- package/dist/tools/tools.langchain.js +30 -0
- package/dist/tools/tools.langchain.js.map +1 -0
- package/dist/tools/tools.mcp.d.ts +12 -0
- package/dist/tools/tools.mcp.d.ts.map +1 -0
- package/dist/tools/tools.mcp.js +38 -0
- package/dist/tools/tools.mcp.js.map +1 -0
- package/{src/tools/tools.types.ts → dist/tools/tools.types.d.ts} +10 -16
- package/dist/tools/tools.types.d.ts.map +1 -0
- package/dist/tools/tools.types.js +7 -0
- package/dist/tools/tools.types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/utils.services.d.ts +14 -0
- package/dist/utils/utils.services.d.ts.map +1 -0
- package/dist/utils/utils.services.js +33 -0
- package/dist/utils/utils.services.js.map +1 -0
- package/package.json +2 -2
- package/src/agent/AGENTS.md +0 -249
- package/src/agent/agent.test-runner.schemas.ts +0 -158
- package/src/agent/agent.test-runner.ts +0 -436
- package/src/agent/agent.ts +0 -371
- package/src/agent/agent.types.ts +0 -94
- package/src/backend/AGENTS.md +0 -112
- package/src/backend/backend.protocol.ts +0 -95
- package/src/backend/backend.schemas.ts +0 -123
- package/src/backend/backend.services.ts +0 -151
- package/src/backend/backend.ts +0 -111
- package/src/backend/backend.types.ts +0 -34
- package/src/cli/AGENTS.md +0 -213
- package/src/cli/cli.agent.ts +0 -197
- package/src/cli/cli.chat.ts +0 -369
- package/src/cli/cli.client.ts +0 -55
- package/src/cli/cli.collections.ts +0 -491
- package/src/cli/cli.config.ts +0 -252
- package/src/cli/cli.daemon.ts +0 -160
- package/src/cli/cli.documents.ts +0 -413
- package/src/cli/cli.mcp.ts +0 -177
- package/src/cli/cli.ts +0 -28
- package/src/cli/cli.utils.ts +0 -122
- package/src/client/AGENTS.md +0 -135
- package/src/client/client.adapters.ts +0 -279
- package/src/client/client.ts +0 -86
- package/src/client/client.types.ts +0 -17
- package/src/collections/AGENTS.md +0 -185
- package/src/collections/collections.schemas.ts +0 -195
- package/src/collections/collections.ts +0 -1160
- package/src/config/config.ts +0 -118
- package/src/daemon/AGENTS.md +0 -168
- package/src/daemon/daemon.config.ts +0 -23
- package/src/daemon/daemon.manager.ts +0 -215
- package/src/daemon/daemon.schemas.ts +0 -22
- package/src/daemon/daemon.ts +0 -205
- package/src/database/AGENTS.md +0 -211
- package/src/database/database.ts +0 -64
- package/src/database/migrations/migrations.001-init.ts +0 -56
- package/src/database/migrations/migrations.002-fts5.ts +0 -32
- package/src/database/migrations/migrations.ts +0 -20
- package/src/database/migrations/migrations.types.ts +0 -9
- package/src/documents/AGENTS.md +0 -301
- package/src/documents/documents.schemas.ts +0 -190
- package/src/documents/documents.ts +0 -734
- package/src/embedder/embedder.ts +0 -53
- package/src/exports.ts +0 -0
- package/src/mcp/AGENTS.md +0 -264
- package/src/mcp/mcp.ts +0 -105
- package/src/tools/AGENTS.md +0 -228
- package/src/tools/agent/agent.ts +0 -45
- package/src/tools/documents/documents.ts +0 -401
- package/src/tools/tools.langchain.ts +0 -37
- package/src/tools/tools.mcp.ts +0 -46
- package/src/utils/utils.services.ts +0 -46
package/bin/cli.js
CHANGED
package/bin/daemon.js
CHANGED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { AgentResponse, AgentStepCallback, AskOptions, DocumentAgentOptions, LLMConfig, RetryConfig } from './agent.types.js';
|
|
2
|
+
import type { BackendClient } from '#root/client/client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check if an error is retryable (rate limit, temporary failure, etc.)
|
|
5
|
+
*/
|
|
6
|
+
declare const isRetryableError: (error: unknown) => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Execute a function with retry logic
|
|
9
|
+
*/
|
|
10
|
+
declare const withRetry: <T>(fn: () => Promise<T>, config?: RetryConfig, onRetry?: (attempt: number, error: Error, delayMs: number) => void) => Promise<T>;
|
|
11
|
+
/**
|
|
12
|
+
* Document search agent that uses LangChain tools to find and synthesize information.
|
|
13
|
+
*/
|
|
14
|
+
declare class DocumentAgent {
|
|
15
|
+
#private;
|
|
16
|
+
constructor(options: DocumentAgentOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Set the step callback for verbose mode
|
|
19
|
+
*/
|
|
20
|
+
setOnStep(callback: AgentStepCallback | undefined): void;
|
|
21
|
+
/**
|
|
22
|
+
* Clear conversation history for a fresh start
|
|
23
|
+
*/
|
|
24
|
+
clearHistory(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get current conversation history length
|
|
27
|
+
*/
|
|
28
|
+
getHistoryLength(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Ask a question and get a synthesized answer (stateless - doesn't use conversation history).
|
|
31
|
+
*/
|
|
32
|
+
ask(query: string, useCase: string, options?: AskOptions): Promise<AgentResponse>;
|
|
33
|
+
/**
|
|
34
|
+
* Chat with conversation history (stateful - maintains context across calls).
|
|
35
|
+
*/
|
|
36
|
+
chat(message: string, useCase: string, options?: AskOptions): Promise<AgentResponse>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Options for creating a document agent
|
|
40
|
+
*/
|
|
41
|
+
type CreateDocumentAgentOptions = {
|
|
42
|
+
/** Backend client for API calls */
|
|
43
|
+
client: BackendClient;
|
|
44
|
+
/** LLM configuration */
|
|
45
|
+
llmConfig: LLMConfig;
|
|
46
|
+
/** Optional map of alias names to collection IDs */
|
|
47
|
+
aliasMap?: Map<string, string>;
|
|
48
|
+
/** Maximum agent iterations */
|
|
49
|
+
maxIterations?: number;
|
|
50
|
+
/** Callback for verbose mode */
|
|
51
|
+
onStep?: AgentStepCallback;
|
|
52
|
+
/** Collections to restrict searches to */
|
|
53
|
+
collections?: string[];
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Create a document search agent.
|
|
57
|
+
*/
|
|
58
|
+
declare const createDocumentAgent: (options: CreateDocumentAgentOptions) => DocumentAgent;
|
|
59
|
+
/**
|
|
60
|
+
* Get LLM config from the application config.
|
|
61
|
+
*/
|
|
62
|
+
declare const getLLMConfigFromAppConfig: () => Promise<LLMConfig>;
|
|
63
|
+
export { DocumentAgent, createDocumentAgent, getLLMConfigFromAppConfig, withRetry, isRetryableError };
|
|
64
|
+
export type { CreateDocumentAgentOptions };
|
|
65
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAEb,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,SAAS,EACT,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAiB5D;;GAEG;AACH,QAAA,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,OAiB1C,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,SAAS,GAAU,CAAC,EACxB,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAQ,WAAkC,EAC1C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,KACjE,OAAO,CAAC,CAAC,CA6BX,CAAC;AAEF;;GAEG;AACH,cAAM,aAAa;;gBAQL,OAAO,EAAE,oBAAoB;IA8BzC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAIxD;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IASvF;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;CA6I3F;AAED;;GAEG;AACH,KAAK,0BAA0B,GAAG;IAChC,mCAAmC;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,wBAAwB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,mBAAmB,GAAI,SAAS,0BAA0B,KAAG,aAelE,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,yBAAyB,QAAa,OAAO,CAAC,SAAS,CAc5D,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AACtG,YAAY,EAAE,0BAA0B,EAAE,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';
|
|
2
|
+
import { createReactAgent } from '@langchain/langgraph/prebuilt';
|
|
3
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
4
|
+
import { AGENT_SYSTEM_PROMPT, formatCollectionRestriction, formatUserPrompt } from './agent.prompts.js';
|
|
5
|
+
import { createDocumentToolDefinitions } from '#root/tools/documents/documents.js';
|
|
6
|
+
import { toLangchainTools } from '#root/tools/tools.langchain.js';
|
|
7
|
+
/** Default retry configuration */
|
|
8
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
9
|
+
maxRetries: 3,
|
|
10
|
+
initialDelayMs: 1000,
|
|
11
|
+
maxDelayMs: 30000,
|
|
12
|
+
backoffMultiplier: 2,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Sleep for a given number of milliseconds
|
|
16
|
+
*/
|
|
17
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
+
/**
|
|
19
|
+
* Check if an error is retryable (rate limit, temporary failure, etc.)
|
|
20
|
+
*/
|
|
21
|
+
const isRetryableError = (error) => {
|
|
22
|
+
if (error instanceof Error) {
|
|
23
|
+
const message = error.message.toLowerCase();
|
|
24
|
+
// Rate limit errors
|
|
25
|
+
if (message.includes('rate limit') || message.includes('429') || message.includes('too many requests')) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
// Temporary server errors
|
|
29
|
+
if (message.includes('500') || message.includes('502') || message.includes('503') || message.includes('504')) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
// Network errors
|
|
33
|
+
if (message.includes('econnreset') || message.includes('etimedout') || message.includes('network')) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Execute a function with retry logic
|
|
41
|
+
*/
|
|
42
|
+
const withRetry = async (fn, config = DEFAULT_RETRY_CONFIG, onRetry) => {
|
|
43
|
+
let lastError;
|
|
44
|
+
let delayMs = config.initialDelayMs;
|
|
45
|
+
for (let attempt = 1; attempt <= config.maxRetries + 1; attempt++) {
|
|
46
|
+
try {
|
|
47
|
+
return await fn();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
51
|
+
// Don't retry non-retryable errors or on last attempt
|
|
52
|
+
if (!isRetryableError(error) || attempt > config.maxRetries) {
|
|
53
|
+
throw lastError;
|
|
54
|
+
}
|
|
55
|
+
// Notify about retry
|
|
56
|
+
if (onRetry) {
|
|
57
|
+
onRetry(attempt, lastError, delayMs);
|
|
58
|
+
}
|
|
59
|
+
// Wait before retrying
|
|
60
|
+
await sleep(delayMs);
|
|
61
|
+
// Exponential backoff
|
|
62
|
+
delayMs = Math.min(delayMs * config.backoffMultiplier, config.maxDelayMs);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
throw lastError;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Document search agent that uses LangChain tools to find and synthesize information.
|
|
69
|
+
*/
|
|
70
|
+
class DocumentAgent {
|
|
71
|
+
#agent;
|
|
72
|
+
#maxIterations;
|
|
73
|
+
#onStep;
|
|
74
|
+
#collections;
|
|
75
|
+
#conversationHistory;
|
|
76
|
+
#systemPrompt;
|
|
77
|
+
constructor(options) {
|
|
78
|
+
const { llmConfig, tools, maxIterations = 15, onStep, collections } = options;
|
|
79
|
+
const llm = new ChatOpenAI({
|
|
80
|
+
configuration: {
|
|
81
|
+
baseURL: llmConfig.provider,
|
|
82
|
+
},
|
|
83
|
+
modelName: llmConfig.model,
|
|
84
|
+
apiKey: llmConfig.apiKey,
|
|
85
|
+
temperature: llmConfig.temperature,
|
|
86
|
+
maxTokens: llmConfig.maxTokens,
|
|
87
|
+
});
|
|
88
|
+
this.#agent = createReactAgent({
|
|
89
|
+
llm,
|
|
90
|
+
tools,
|
|
91
|
+
});
|
|
92
|
+
this.#maxIterations = maxIterations;
|
|
93
|
+
this.#onStep = onStep;
|
|
94
|
+
this.#collections = collections;
|
|
95
|
+
this.#conversationHistory = [];
|
|
96
|
+
// Build system prompt with collection restriction if needed
|
|
97
|
+
this.#systemPrompt = AGENT_SYSTEM_PROMPT;
|
|
98
|
+
if (collections && collections.length > 0) {
|
|
99
|
+
this.#systemPrompt += formatCollectionRestriction(collections);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Set the step callback for verbose mode
|
|
104
|
+
*/
|
|
105
|
+
setOnStep(callback) {
|
|
106
|
+
this.#onStep = callback;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Clear conversation history for a fresh start
|
|
110
|
+
*/
|
|
111
|
+
clearHistory() {
|
|
112
|
+
this.#conversationHistory = [];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get current conversation history length
|
|
116
|
+
*/
|
|
117
|
+
getHistoryLength() {
|
|
118
|
+
return this.#conversationHistory.length;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Ask a question and get a synthesized answer (stateless - doesn't use conversation history).
|
|
122
|
+
*/
|
|
123
|
+
async ask(query, useCase, options) {
|
|
124
|
+
const onStep = options?.onStep ?? this.#onStep;
|
|
125
|
+
const userPrompt = formatUserPrompt(query, useCase, this.#collections);
|
|
126
|
+
const messages = [new SystemMessage(this.#systemPrompt), new HumanMessage(userPrompt)];
|
|
127
|
+
return this.#runAgent(messages, onStep);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Chat with conversation history (stateful - maintains context across calls).
|
|
131
|
+
*/
|
|
132
|
+
async chat(message, useCase, options) {
|
|
133
|
+
const onStep = options?.onStep ?? this.#onStep;
|
|
134
|
+
// Add user message to history
|
|
135
|
+
const userMessage = new HumanMessage(formatUserPrompt(message, useCase, this.#collections));
|
|
136
|
+
this.#conversationHistory.push(userMessage);
|
|
137
|
+
// Build full message list with system prompt
|
|
138
|
+
const messages = [new SystemMessage(this.#systemPrompt), ...this.#conversationHistory];
|
|
139
|
+
const response = await this.#runAgent(messages, onStep);
|
|
140
|
+
// Add assistant response to history
|
|
141
|
+
this.#conversationHistory.push(new AIMessage(JSON.stringify(response)));
|
|
142
|
+
return response;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Run the agent with retry logic and step callbacks
|
|
146
|
+
*/
|
|
147
|
+
async #runAgent(messages, onStep) {
|
|
148
|
+
// Notify about starting
|
|
149
|
+
if (onStep) {
|
|
150
|
+
onStep({ type: 'thinking', content: 'Starting search...' });
|
|
151
|
+
}
|
|
152
|
+
const result = await withRetry(async () => {
|
|
153
|
+
return this.#agent.invoke({ messages }, {
|
|
154
|
+
recursionLimit: this.#maxIterations,
|
|
155
|
+
});
|
|
156
|
+
}, DEFAULT_RETRY_CONFIG, (attempt, error, delayMs) => {
|
|
157
|
+
if (onStep) {
|
|
158
|
+
onStep({
|
|
159
|
+
type: 'error',
|
|
160
|
+
content: `Retry attempt ${attempt} after error: ${error.message}. Waiting ${delayMs}ms...`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
// Process messages for verbose output
|
|
165
|
+
if (onStep) {
|
|
166
|
+
this.#processMessagesForVerbose(result.messages, onStep);
|
|
167
|
+
}
|
|
168
|
+
// Extract the final message content
|
|
169
|
+
const resultMessages = result.messages;
|
|
170
|
+
const lastMessage = resultMessages[resultMessages.length - 1];
|
|
171
|
+
const content = typeof lastMessage.content === 'string' ? lastMessage.content : JSON.stringify(lastMessage.content);
|
|
172
|
+
// Try to parse as JSON response
|
|
173
|
+
return this.#parseResponse(content);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Process agent messages and emit verbose step callbacks
|
|
177
|
+
*/
|
|
178
|
+
#processMessagesForVerbose(messages, onStep) {
|
|
179
|
+
for (const message of messages) {
|
|
180
|
+
if (message instanceof AIMessage) {
|
|
181
|
+
// Check for tool calls
|
|
182
|
+
const toolCalls = message.tool_calls;
|
|
183
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
184
|
+
for (const toolCall of toolCalls) {
|
|
185
|
+
const step = {
|
|
186
|
+
type: 'tool_call',
|
|
187
|
+
content: `Calling ${toolCall.name}`,
|
|
188
|
+
toolName: toolCall.name,
|
|
189
|
+
toolInput: toolCall.args,
|
|
190
|
+
};
|
|
191
|
+
onStep(step);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else if (message.content) {
|
|
195
|
+
// Regular AI message (thinking or final answer)
|
|
196
|
+
const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
|
|
197
|
+
if (content.trim()) {
|
|
198
|
+
onStep({ type: 'thinking', content: content.slice(0, 200) + (content.length > 200 ? '...' : '') });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (message instanceof ToolMessage) {
|
|
203
|
+
// Tool result
|
|
204
|
+
const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
|
|
205
|
+
const preview = content.slice(0, 150) + (content.length > 150 ? '...' : '');
|
|
206
|
+
onStep({
|
|
207
|
+
type: 'tool_result',
|
|
208
|
+
content: preview,
|
|
209
|
+
toolName: message.name,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Parse the agent's response, extracting JSON if present.
|
|
216
|
+
*/
|
|
217
|
+
#parseResponse(content) {
|
|
218
|
+
// Try to find JSON in the response
|
|
219
|
+
const jsonMatch = content.match(/```json\s*([\s\S]*?)\s*```/);
|
|
220
|
+
if (jsonMatch) {
|
|
221
|
+
try {
|
|
222
|
+
const parsed = JSON.parse(jsonMatch[1]);
|
|
223
|
+
return {
|
|
224
|
+
answer: parsed.answer ?? content,
|
|
225
|
+
sources: parsed.sources ?? [],
|
|
226
|
+
confidence: parsed.confidence ?? 'medium',
|
|
227
|
+
note: parsed.note,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Fall through to default
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Try to parse the whole content as JSON
|
|
235
|
+
try {
|
|
236
|
+
const parsed = JSON.parse(content);
|
|
237
|
+
if (parsed.answer) {
|
|
238
|
+
return {
|
|
239
|
+
answer: parsed.answer,
|
|
240
|
+
sources: parsed.sources ?? [],
|
|
241
|
+
confidence: parsed.confidence ?? 'medium',
|
|
242
|
+
note: parsed.note,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Fall through to default
|
|
248
|
+
}
|
|
249
|
+
// Default: treat the whole content as the answer
|
|
250
|
+
return {
|
|
251
|
+
answer: content,
|
|
252
|
+
sources: [],
|
|
253
|
+
confidence: 'medium',
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Create a document search agent.
|
|
259
|
+
*/
|
|
260
|
+
const createDocumentAgent = (options) => {
|
|
261
|
+
const { client, llmConfig, aliasMap, maxIterations, onStep, collections } = options;
|
|
262
|
+
// Create document tool definitions and convert to LangChain tools
|
|
263
|
+
const toolDefinitions = createDocumentToolDefinitions({ client, aliasMap });
|
|
264
|
+
const langchainTools = toLangchainTools(toolDefinitions);
|
|
265
|
+
const tools = Object.values(langchainTools);
|
|
266
|
+
return new DocumentAgent({
|
|
267
|
+
llmConfig,
|
|
268
|
+
tools,
|
|
269
|
+
maxIterations,
|
|
270
|
+
onStep,
|
|
271
|
+
collections,
|
|
272
|
+
});
|
|
273
|
+
};
|
|
274
|
+
/**
|
|
275
|
+
* Get LLM config from the application config.
|
|
276
|
+
*/
|
|
277
|
+
const getLLMConfigFromAppConfig = async () => {
|
|
278
|
+
const { config } = await import('#root/config/config.js');
|
|
279
|
+
// Use type assertion for dynamic config access
|
|
280
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
281
|
+
const c = config;
|
|
282
|
+
return {
|
|
283
|
+
provider: c.get('llm.provider'),
|
|
284
|
+
model: c.get('llm.model'),
|
|
285
|
+
apiKey: c.get('llm.apiKey'),
|
|
286
|
+
temperature: c.get('llm.temperature'),
|
|
287
|
+
maxTokens: c.get('llm.maxTokens'),
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
export { DocumentAgent, createDocumentAgent, getLLMConfigFromAppConfig, withRetry, isRetryableError };
|
|
291
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAW/C,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGxG,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,kCAAkC;AAClC,MAAM,oBAAoB,GAAgB;IACxC,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/F;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAW,EAAE;IACnD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,oBAAoB;QACpB,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACvG,OAAO,IAAI,CAAC;QACd,CAAC;QACD,0BAA0B;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7G,OAAO,IAAI,CAAC;QACd,CAAC;QACD,iBAAiB;QACjB,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,SAAS,GAAG,KAAK,EACrB,EAAoB,EACpB,SAAsB,oBAAoB,EAC1C,OAAkE,EACtD,EAAE;IACd,IAAI,SAA4B,CAAC;IACjC,IAAI,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;IAEpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAClE,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,sDAAsD;YACtD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC5D,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,qBAAqB;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,uBAAuB;YACvB,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAErB,sBAAsB;YACtB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa;IACjB,MAAM,CAAsC;IAC5C,cAAc,CAAS;IACvB,OAAO,CAAqB;IAC5B,YAAY,CAAY;IACxB,oBAAoB,CAAgB;IACpC,aAAa,CAAS;IAEtB,YAAY,OAA6B;QACvC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAE9E,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC;YACzB,aAAa,EAAE;gBACb,OAAO,EAAE,SAAS,CAAC,QAAQ;aAC5B;YACD,SAAS,EAAE,SAAS,CAAC,KAAK;YAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC;YAC7B,GAAG;YACH,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAE/B,4DAA4D;QAC5D,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC;QACzC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,IAAI,2BAA2B,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAuC;QAC/C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,OAAoB;QAC5D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;QAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEvE,MAAM,QAAQ,GAAkB,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtG,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,OAAe,EAAE,OAAoB;QAC/D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC;QAE/C,8BAA8B;QAC9B,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5C,6CAA6C;QAC7C,MAAM,QAAQ,GAAkB,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEtG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAExD,oCAAoC;QACpC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAuB,EAAE,MAA0B;QACjE,wBAAwB;QACxB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,KAAK,IAAI,EAAE;YACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CACvB,EAAE,QAAQ,EAAE,EACZ;gBACE,cAAc,EAAE,IAAI,CAAC,cAAc;aACpC,CACF,CAAC;QACJ,CAAC,EACD,oBAAoB,EACpB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,iBAAiB,OAAO,iBAAiB,KAAK,CAAC,OAAO,aAAa,OAAO,OAAO;iBAC3F,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CACF,CAAC;QAEF,sCAAsC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,oCAAoC;QACpC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;QACvC,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpH,gCAAgC;QAChC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,QAAuB,EAAE,MAAyB;QAC3E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,YAAY,SAAS,EAAE,CAAC;gBACjC,uBAAuB;gBACvB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;gBACrC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;wBACjC,MAAM,IAAI,GAAc;4BACtB,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,WAAW,QAAQ,CAAC,IAAI,EAAE;4BACnC,QAAQ,EAAE,QAAQ,CAAC,IAAI;4BACvB,SAAS,EAAE,QAAQ,CAAC,IAA+B;yBACpD,CAAC;wBACF,MAAM,CAAC,IAAI,CAAC,CAAC;oBACf,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC3B,gDAAgD;oBAChD,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACxG,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;wBACnB,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACrG,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,YAAY,WAAW,EAAE,CAAC;gBAC1C,cAAc;gBACd,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxG,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5E,MAAM,CAAC;oBACL,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,OAAO,CAAC,IAAI;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC5B,mCAAmC;QACnC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO;oBAChC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;oBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;oBACzC,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;oBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,QAAQ;oBACzC,IAAI,EAAE,MAAM,CAAC,IAAI;iBAClB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,iDAAiD;QACjD,OAAO;YACL,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;CACF;AAoBD;;GAEG;AACH,MAAM,mBAAmB,GAAG,CAAC,OAAmC,EAAiB,EAAE;IACjF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEpF,kEAAkE;IAClE,MAAM,eAAe,GAAG,6BAA6B,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE5C,OAAO,IAAI,aAAa,CAAC;QACvB,SAAS;QACT,KAAK;QACL,aAAa;QACb,MAAM;QACN,WAAW;KACZ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,yBAAyB,GAAG,KAAK,IAAwB,EAAE;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAE1D,+CAA+C;IAC/C,8DAA8D;IAC9D,MAAM,CAAC,GAAG,MAAa,CAAC;IAExB,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3B,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACrC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;KAClC,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System prompt for the document search agent
|
|
3
|
+
*/
|
|
4
|
+
export declare const AGENT_SYSTEM_PROMPT = "You are a documentation search agent. Your task is to find and synthesize information from technical documentation to answer user questions.\n\n## Guidelines\n\n1. **Start broad, then narrow**: Begin with a semantic search, then drill into specific sections or documents as needed.\n\n2. **Use the right tool for the job**:\n - `documents_search` \u2014 Find relevant content across collections\n - `documents_list_documents` \u2014 Browse what's available in a collection \n - `documents_get_outline` \u2014 Understand document structure before diving in\n - `documents_get_section` \u2014 Get specific section content efficiently\n - `documents_get_document` \u2014 Only when you need the full document\n\n3. **Stop when sufficient**: The user has provided a use case. Once you have enough information to address their specific use case, synthesize and respond. Don't over-research.\n\n4. **Cite sources**: Track which documents/sections you used.\n\n5. **Acknowledge uncertainty**: If you can't find sufficient information, say so.\n\n## Response Format\n\nWhen you have found sufficient information, respond with a JSON object in this exact format:\n\n```json\n{\n \"answer\": \"Your synthesized answer here. Be clear, actionable, and include code examples when relevant.\",\n \"sources\": [\n {\"collection\": \"collection-name\", \"document\": \"document-id\", \"section\": \"Section Heading (if applicable)\"}\n ],\n \"confidence\": \"high|medium|low\",\n \"note\": \"Optional note about limitations or suggestions for further reading\"\n}\n```\n\nUse \"high\" confidence when multiple sources agree or you found a direct answer.\nUse \"medium\" when the information is relevant but not comprehensive.\nUse \"low\" when you're extrapolating or the information is tangentially related.";
|
|
5
|
+
/**
|
|
6
|
+
* Format the collection restriction instruction
|
|
7
|
+
*/
|
|
8
|
+
export declare const formatCollectionRestriction: (collections: string[]) => string;
|
|
9
|
+
/**
|
|
10
|
+
* User prompt template
|
|
11
|
+
*/
|
|
12
|
+
export declare const formatUserPrompt: (query: string, useCase: string, collections?: string[]) => string;
|
|
13
|
+
//# sourceMappingURL=agent.prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.prompts.d.ts","sourceRoot":"","sources":["../../src/agent/agent.prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,mBAAmB,uxDAoCgD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,aAAa,MAAM,EAAE,KAAG,MAInE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,cAAc,MAAM,EAAE,WAYtF,CAAC"}
|
|
@@ -38,25 +38,23 @@ When you have found sufficient information, respond with a JSON object in this e
|
|
|
38
38
|
Use "high" confidence when multiple sources agree or you found a direct answer.
|
|
39
39
|
Use "medium" when the information is relevant but not comprehensive.
|
|
40
40
|
Use "low" when you're extrapolating or the information is tangentially related.`;
|
|
41
|
-
|
|
42
41
|
/**
|
|
43
42
|
* Format the collection restriction instruction
|
|
44
43
|
*/
|
|
45
|
-
export const formatCollectionRestriction = (collections
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
export const formatCollectionRestriction = (collections) => {
|
|
45
|
+
if (collections.length === 0)
|
|
46
|
+
return '';
|
|
47
|
+
const collectionList = collections.map((c) => `"${c}"`).join(', ');
|
|
48
|
+
return `\n\n## Collection Restriction\nIMPORTANT: Only search within these collections: ${collectionList}. Always pass this list in the "collections" parameter of your search calls.`;
|
|
49
49
|
};
|
|
50
|
-
|
|
51
50
|
/**
|
|
52
51
|
* User prompt template
|
|
53
52
|
*/
|
|
54
|
-
export const formatUserPrompt = (query
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return `## Question
|
|
53
|
+
export const formatUserPrompt = (query, useCase, collections) => {
|
|
54
|
+
const collectionNote = collections?.length
|
|
55
|
+
? `\n\nNote: Restrict your searches to these collections: ${collections.join(', ')}`
|
|
56
|
+
: '';
|
|
57
|
+
return `## Question
|
|
60
58
|
${query}
|
|
61
59
|
|
|
62
60
|
## Use Case
|
|
@@ -64,3 +62,4 @@ ${useCase}${collectionNote}
|
|
|
64
62
|
|
|
65
63
|
Find the information needed to answer this question for the given use case. Search the documentation, then provide your synthesized answer in JSON format.`;
|
|
66
64
|
};
|
|
65
|
+
//# sourceMappingURL=agent.prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.prompts.js","sourceRoot":"","sources":["../../src/agent/agent.prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gFAoC6C,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,WAAqB,EAAU,EAAE;IAC3E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,mFAAmF,cAAc,8EAA8E,CAAC;AACzL,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,WAAsB,EAAE,EAAE;IACzF,MAAM,cAAc,GAAG,WAAW,EAAE,MAAM;QACxC,CAAC,CAAC,0DAA0D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpF,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;EACP,KAAK;;;EAGL,OAAO,GAAG,cAAc;;2JAEiI,CAAC;AAC5J,CAAC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { LLMConfig } from './agent.types.js';
|
|
2
|
+
import { type TestResult, type TestRunResult, type TestSuite, type ValidationMode } from './agent.test-runner.schemas.js';
|
|
3
|
+
import { destroy } from '#root/utils/utils.services.js';
|
|
4
|
+
/**
|
|
5
|
+
* Callback for test progress updates
|
|
6
|
+
*/
|
|
7
|
+
type TestProgressCallback = (event: TestProgressEvent) => void;
|
|
8
|
+
type TestProgressEvent = {
|
|
9
|
+
type: 'suite_start';
|
|
10
|
+
suiteName: string;
|
|
11
|
+
totalTests: number;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'sync_start';
|
|
14
|
+
} | {
|
|
15
|
+
type: 'sync_complete';
|
|
16
|
+
} | {
|
|
17
|
+
type: 'test_start';
|
|
18
|
+
testId: string;
|
|
19
|
+
index: number;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'test_complete';
|
|
22
|
+
testId: string;
|
|
23
|
+
result: TestResult;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'suite_complete';
|
|
26
|
+
result: TestRunResult;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Options for running a test suite
|
|
30
|
+
*/
|
|
31
|
+
type TestRunnerOptions = {
|
|
32
|
+
/** LLM configuration (defaults to app config) */
|
|
33
|
+
llmConfig?: LLMConfig;
|
|
34
|
+
/** Progress callback */
|
|
35
|
+
onProgress?: TestProgressCallback;
|
|
36
|
+
/** Override validation mode for all tests */
|
|
37
|
+
validationMode?: ValidationMode;
|
|
38
|
+
/** Override pass threshold for all tests */
|
|
39
|
+
passThreshold?: number;
|
|
40
|
+
/** Model to use for LLM validation (defaults to llmConfig.model) */
|
|
41
|
+
validationModel?: string;
|
|
42
|
+
/** Base directory for resolving relative URLs in the test file (defaults to test file's directory) */
|
|
43
|
+
baseDir?: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Test runner service for validating agent performance
|
|
47
|
+
*/
|
|
48
|
+
declare class AgentTestRunner {
|
|
49
|
+
#private;
|
|
50
|
+
constructor();
|
|
51
|
+
/**
|
|
52
|
+
* Load and parse a test suite from a YAML file
|
|
53
|
+
*/
|
|
54
|
+
loadTestSuite(filePath: string): Promise<{
|
|
55
|
+
suite: TestSuite;
|
|
56
|
+
baseDir: string;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Run a complete test suite
|
|
60
|
+
*/
|
|
61
|
+
runTestSuite(suite: TestSuite, options?: TestRunnerOptions): Promise<TestRunResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Clean up resources
|
|
64
|
+
*/
|
|
65
|
+
[destroy](): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a test runner instance
|
|
69
|
+
*/
|
|
70
|
+
declare const createTestRunner: () => AgentTestRunner;
|
|
71
|
+
export { AgentTestRunner, createTestRunner };
|
|
72
|
+
export type { TestProgressCallback, TestProgressEvent, TestRunnerOptions };
|
|
73
|
+
//# sourceMappingURL=agent.test-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test-runner.d.ts","sourceRoot":"","sources":["../../src/agent/agent.test-runner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAAY,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAElE;;GAEG;AACH,KAAK,oBAAoB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAE/D,KAAK,iBAAiB,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAEtD;;GAEG;AACH,KAAK,iBAAiB,GAAG;IACvB,iDAAiD;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wBAAwB;IACxB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,6CAA6C;IAC7C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAkCF;;GAEG;AACH,cAAM,eAAe;;;IAiBnB;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQrF;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IA6S7F;;OAEG;IACG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC;AAED;;GAEG;AACH,QAAA,MAAM,gBAAgB,QAAO,eAE5B,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAC7C,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC"}
|