llm-agent-runtime 0.1.0 → 0.1.2
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/README.md +1 -1
- package/dist/create-runtime.d.ts +2 -0
- package/dist/create-runtime.d.ts.map +1 -1
- package/dist/create-runtime.js +28 -4
- package/dist/env-llm.d.ts +13 -0
- package/dist/env-llm.d.ts.map +1 -0
- package/dist/env-llm.js +44 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/services/simple-config.d.ts +49 -0
- package/dist/services/simple-config.d.ts.map +1 -0
- package/dist/services/simple-config.js +70 -0
- package/dist/types.d.ts +24 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/create-runtime.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type AgentRuntime = {
|
|
|
4
4
|
connect: () => Promise<void>;
|
|
5
5
|
disconnect: () => Promise<void>;
|
|
6
6
|
clearFlow: (threadId: string) => Promise<void>;
|
|
7
|
+
/** Clears LangGraph checkpoint thread (conversation memory). */
|
|
8
|
+
clearThread: (threadId: string) => Promise<void>;
|
|
7
9
|
getCachedAnswer: (message: string) => Promise<string | undefined>;
|
|
8
10
|
setCachedAnswer: (message: string, answer: string) => Promise<void>;
|
|
9
11
|
/** Invalidate embedding cache after changing intent examples at runtime. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-runtime.d.ts","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-runtime.d.ts","sourceRoot":"","sources":["../src/create-runtime.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EAEb,MAAM,YAAY,CAAC;AAepB,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,gEAAgE;IAChE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,4EAA4E;IAC5E,0BAA0B,EAAE,MAAM,IAAI,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,CAAC,CAsOvB"}
|
package/dist/create-runtime.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { createAgentFactory } from "./agent.js";
|
|
2
2
|
import { createModels } from "./llm.js";
|
|
3
|
+
import { llmConfigFromEnv } from "./env-llm.js";
|
|
3
4
|
import { createRedis } from "./redis.js";
|
|
4
5
|
import { createAgentRunner } from "./services/agent-runner.js";
|
|
5
6
|
import { createChatCache } from "./services/chat-cache.js";
|
|
6
7
|
import { createConversationService } from "./services/conversation.js";
|
|
7
8
|
import { createToolOutputExtractor, extractRawToolOutputs } from "./services/extract.js";
|
|
9
|
+
import { createCompleteOnFinalize, toolOutputMapToExtractors, } from "./services/simple-config.js";
|
|
8
10
|
import { createFlowRouter, stickySetFromIntents, } from "./services/flow-router.js";
|
|
9
11
|
import { createIntentEmbeddings } from "./services/intent-embeddings.js";
|
|
10
12
|
import { createIntentRouter } from "./services/intent-router.js";
|
|
@@ -40,10 +42,23 @@ export async function createAgentRuntime(config) {
|
|
|
40
42
|
};
|
|
41
43
|
const stickyFlows = stickySetFromIntents(config.intents);
|
|
42
44
|
const menuMap = config.menuMap ?? {};
|
|
43
|
-
const
|
|
45
|
+
const llm = config.llm ?? llmConfigFromEnv();
|
|
46
|
+
const created = createModels(llm);
|
|
44
47
|
const chat = config.models?.chat ?? created.chat;
|
|
45
48
|
const intentRouterModel = config.models?.intentRouter ?? created.intentRouter;
|
|
46
49
|
const embeddings = config.models?.embeddings ?? created.embeddings;
|
|
50
|
+
const fromMap = config.toolOutputMap
|
|
51
|
+
? toolOutputMapToExtractors(config.toolOutputMap)
|
|
52
|
+
: null;
|
|
53
|
+
const toolExtractors = config.toolExtractors ?? fromMap?.toolExtractors;
|
|
54
|
+
const initialToolOutputs = config.initialToolOutputs ?? fromMap?.initialToolOutputs;
|
|
55
|
+
const finalizeFlow = config.finalizeFlow ??
|
|
56
|
+
(config.completeOn?.length
|
|
57
|
+
? createCompleteOnFinalize({
|
|
58
|
+
completeOn: config.completeOn,
|
|
59
|
+
toolOutputMap: config.toolOutputMap,
|
|
60
|
+
})
|
|
61
|
+
: undefined);
|
|
47
62
|
// Redis client when redisUrl is set (flow state + optional answer cache)
|
|
48
63
|
const redis = config.redisUrl
|
|
49
64
|
? createRedis(config.redisUrl)
|
|
@@ -91,12 +106,14 @@ export async function createAgentRuntime(config) {
|
|
|
91
106
|
classifyIntentWithLlm: intentRouter.classifyIntentWithLlm,
|
|
92
107
|
mergeIntentResults: intentRouter.mergeIntentResults,
|
|
93
108
|
chatCache,
|
|
94
|
-
finalizeFlow
|
|
109
|
+
finalizeFlow,
|
|
95
110
|
thresholds: config.thresholds,
|
|
96
111
|
});
|
|
97
112
|
const extractToolOutputs = config.extractToolOutputs ??
|
|
98
|
-
(
|
|
99
|
-
? createToolOutputExtractor(
|
|
113
|
+
(toolExtractors
|
|
114
|
+
? createToolOutputExtractor(toolExtractors, initialToolOutputs, {
|
|
115
|
+
includeUnknown: config.includeUnknownToolOutputs ?? false,
|
|
116
|
+
})
|
|
100
117
|
: extractRawToolOutputs);
|
|
101
118
|
const buildSystemPrompt = config.buildSystemPrompt ??
|
|
102
119
|
((ctx) => {
|
|
@@ -190,6 +207,13 @@ export async function createAgentRuntime(config) {
|
|
|
190
207
|
await redis?.disconnect();
|
|
191
208
|
},
|
|
192
209
|
clearFlow: chatCache.clearChatCacheFlowState,
|
|
210
|
+
clearThread: async (threadId) => {
|
|
211
|
+
const saver = agentFactory.checkpointer;
|
|
212
|
+
if (typeof saver.deleteThread === "function") {
|
|
213
|
+
await saver.deleteThread(threadId);
|
|
214
|
+
}
|
|
215
|
+
await chatCache.clearChatCacheFlowState(threadId);
|
|
216
|
+
},
|
|
193
217
|
getCachedAnswer: chatCache.getCachedAnswer,
|
|
194
218
|
setCachedAnswer: chatCache.setCachedAnswer,
|
|
195
219
|
invalidateIntentEmbeddings: intentEmbeddings.invalidate,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LlmConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Build LlmConfig from process.env (Xel / recharge defaults).
|
|
4
|
+
*
|
|
5
|
+
* Env knobs:
|
|
6
|
+
* - LLM_PROVIDER / EMBEDDINGS_PROVIDER — ollama | openai
|
|
7
|
+
* - OLLAMA_MODEL / OPENAI_MODEL
|
|
8
|
+
* - INTENT_ROUTER_MODEL / OPENAI_INTENT_ROUTER_MODEL
|
|
9
|
+
* - OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
10
|
+
* - OLLAMA_BASE_URL / OPENAI_API_KEY
|
|
11
|
+
*/
|
|
12
|
+
export declare function llmConfigFromEnv(env?: NodeJS.ProcessEnv): LlmConfig;
|
|
13
|
+
//# sourceMappingURL=env-llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-llm.d.ts","sourceRoot":"","sources":["../src/env-llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAezD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,CA6BX"}
|
package/dist/env-llm.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const asProvider = (value, fallback) => {
|
|
2
|
+
const normalized = value?.trim().toLowerCase();
|
|
3
|
+
if (normalized === "openai" ||
|
|
4
|
+
normalized === "gpt" ||
|
|
5
|
+
normalized === "chatgpt") {
|
|
6
|
+
return "openai";
|
|
7
|
+
}
|
|
8
|
+
if (normalized === "ollama")
|
|
9
|
+
return "ollama";
|
|
10
|
+
return fallback;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Build LlmConfig from process.env (Xel / recharge defaults).
|
|
14
|
+
*
|
|
15
|
+
* Env knobs:
|
|
16
|
+
* - LLM_PROVIDER / EMBEDDINGS_PROVIDER — ollama | openai
|
|
17
|
+
* - OLLAMA_MODEL / OPENAI_MODEL
|
|
18
|
+
* - INTENT_ROUTER_MODEL / OPENAI_INTENT_ROUTER_MODEL
|
|
19
|
+
* - OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
20
|
+
* - OLLAMA_BASE_URL / OPENAI_API_KEY
|
|
21
|
+
*/
|
|
22
|
+
export function llmConfigFromEnv(env = process.env) {
|
|
23
|
+
const provider = asProvider(env.LLM_PROVIDER, "ollama");
|
|
24
|
+
const embeddingsProvider = asProvider(env.EMBEDDINGS_PROVIDER ?? env.LLM_PROVIDER, provider);
|
|
25
|
+
return {
|
|
26
|
+
provider,
|
|
27
|
+
embeddingsProvider,
|
|
28
|
+
model: provider === "openai"
|
|
29
|
+
? (env.OPENAI_MODEL ?? "gpt-4o-mini")
|
|
30
|
+
: (env.OLLAMA_MODEL ?? "qwen2.5:7b"),
|
|
31
|
+
intentRouterModel: provider === "openai"
|
|
32
|
+
? (env.OPENAI_INTENT_ROUTER_MODEL ??
|
|
33
|
+
env.OPENAI_MODEL ??
|
|
34
|
+
"gpt-4o-mini")
|
|
35
|
+
: (env.INTENT_ROUTER_MODEL ??
|
|
36
|
+
env.OLLAMA_INTENT_ROUTER_MODEL ??
|
|
37
|
+
"qwen2.5:7b"),
|
|
38
|
+
embeddingsModel: embeddingsProvider === "openai"
|
|
39
|
+
? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
|
|
40
|
+
: (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest"),
|
|
41
|
+
baseUrl: env.OLLAMA_BASE_URL,
|
|
42
|
+
apiKey: env.OPENAI_API_KEY,
|
|
43
|
+
};
|
|
44
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { createAgentRuntime, type AgentRuntime } from "./create-runtime.js";
|
|
2
2
|
export { createModels } from "./llm.js";
|
|
3
|
+
export { llmConfigFromEnv } from "./env-llm.js";
|
|
3
4
|
export { createRedis } from "./redis.js";
|
|
4
5
|
export { extractRawToolOutputs, extractToolCallArgs, getToolCallsFromMessages, createToolOutputExtractor, } from "./services/extract.js";
|
|
6
|
+
export { toolOutputMapToExtractors, createCompleteOnFinalize, type ToolOutputMap, } from "./services/simple-config.js";
|
|
5
7
|
export { isWizardInput } from "./services/flow-router.js";
|
|
6
8
|
export { getLastMessageContent } from "./utils/message.js";
|
|
7
9
|
export { normalize } from "./utils/normalize.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { createAgentRuntime } from "./create-runtime.js";
|
|
2
2
|
export { createModels } from "./llm.js";
|
|
3
|
+
export { llmConfigFromEnv } from "./env-llm.js";
|
|
3
4
|
export { createRedis } from "./redis.js";
|
|
4
5
|
export { extractRawToolOutputs, extractToolCallArgs, getToolCallsFromMessages, createToolOutputExtractor, } from "./services/extract.js";
|
|
6
|
+
export { toolOutputMapToExtractors, createCompleteOnFinalize, } from "./services/simple-config.js";
|
|
5
7
|
export { isWizardInput } from "./services/flow-router.js";
|
|
6
8
|
export { getLastMessageContent } from "./utils/message.js";
|
|
7
9
|
export { normalize } from "./utils/normalize.js";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ToolExtractorMap } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Simple tool → output key map.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* {
|
|
7
|
+
* create_campaign: "campaign",
|
|
8
|
+
* buy_airtime: "buyAirtime",
|
|
9
|
+
* propose_tickets: { as: "tickets", from: "tickets", initial: [] },
|
|
10
|
+
* }
|
|
11
|
+
*/
|
|
12
|
+
export type ToolOutputMap = Record<string, string | {
|
|
13
|
+
/** Key written onto toolOutputs / extras. */
|
|
14
|
+
as: string;
|
|
15
|
+
/** Nested field on tool args (e.g. args.tickets). */
|
|
16
|
+
from?: string;
|
|
17
|
+
/** Seed value when nothing extracted yet. */
|
|
18
|
+
initial?: unknown;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function resolveToolOutputKey(toolName: string, map: ToolOutputMap): string;
|
|
21
|
+
/** Build first-wins extractors + initial seed from a simple map. */
|
|
22
|
+
export declare function toolOutputMapToExtractors(map: ToolOutputMap): {
|
|
23
|
+
toolExtractors: ToolExtractorMap;
|
|
24
|
+
initialToolOutputs: () => Record<string, unknown>;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Default finalize: complete sticky flow when any listed tool produced output.
|
|
28
|
+
* `completeOn` is tool names (keys of toolOutputMap / LangChain tool name).
|
|
29
|
+
*/
|
|
30
|
+
export declare function createCompleteOnFinalize(options: {
|
|
31
|
+
completeOn: string[];
|
|
32
|
+
toolOutputMap?: ToolOutputMap;
|
|
33
|
+
}): ({ flow, toolOutputs, }: {
|
|
34
|
+
threadId: string;
|
|
35
|
+
promptIntent: string;
|
|
36
|
+
flow: {
|
|
37
|
+
active: boolean;
|
|
38
|
+
intent: string | null;
|
|
39
|
+
};
|
|
40
|
+
toolOutputs: Record<string, unknown>;
|
|
41
|
+
}) => {
|
|
42
|
+
flowCompleted: boolean;
|
|
43
|
+
flow: {
|
|
44
|
+
active: boolean;
|
|
45
|
+
intent: string | null;
|
|
46
|
+
};
|
|
47
|
+
extras: Record<string, unknown>;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=simple-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-config.d.ts","sourceRoot":"","sources":["../../src/services/simple-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAChC,MAAM,EACJ,MAAM,GACN;IACE,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CACJ,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,aAAa,GACjB,MAAM,CAIR;AAED,oEAAoE;AACpE,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,aAAa,GAAG;IAC7D,cAAc,EAAE,gBAAgB,CAAC;IACjC,kBAAkB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnD,CAkCA;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,IAGS,wBAGL;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;;;;;;;EA0BF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function resolveToolOutputKey(toolName, map) {
|
|
2
|
+
const entry = map[toolName];
|
|
3
|
+
if (!entry)
|
|
4
|
+
return toolName;
|
|
5
|
+
return typeof entry === "string" ? entry : entry.as;
|
|
6
|
+
}
|
|
7
|
+
/** Build first-wins extractors + initial seed from a simple map. */
|
|
8
|
+
export function toolOutputMapToExtractors(map) {
|
|
9
|
+
const toolExtractors = {};
|
|
10
|
+
const initial = {};
|
|
11
|
+
for (const [toolName, entry] of Object.entries(map)) {
|
|
12
|
+
if (typeof entry === "string") {
|
|
13
|
+
toolExtractors[toolName] = (args, acc) => {
|
|
14
|
+
if (acc[entry] !== undefined)
|
|
15
|
+
return;
|
|
16
|
+
acc[entry] = args;
|
|
17
|
+
};
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const key = entry.as;
|
|
21
|
+
if (entry.initial !== undefined && !(key in initial)) {
|
|
22
|
+
initial[key] = entry.initial;
|
|
23
|
+
}
|
|
24
|
+
toolExtractors[toolName] = (args, acc) => {
|
|
25
|
+
const current = acc[key];
|
|
26
|
+
if (Array.isArray(current) && current.length > 0)
|
|
27
|
+
return;
|
|
28
|
+
if (current !== undefined && !Array.isArray(current))
|
|
29
|
+
return;
|
|
30
|
+
acc[key] =
|
|
31
|
+
entry.from !== undefined
|
|
32
|
+
? (args[entry.from] ?? entry.initial ?? [])
|
|
33
|
+
: args;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
toolExtractors,
|
|
38
|
+
initialToolOutputs: () => ({ ...initial }),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Default finalize: complete sticky flow when any listed tool produced output.
|
|
43
|
+
* `completeOn` is tool names (keys of toolOutputMap / LangChain tool name).
|
|
44
|
+
*/
|
|
45
|
+
export function createCompleteOnFinalize(options) {
|
|
46
|
+
const { completeOn, toolOutputMap = {} } = options;
|
|
47
|
+
return ({ flow, toolOutputs, }) => {
|
|
48
|
+
const extras = {};
|
|
49
|
+
let flowCompleted = false;
|
|
50
|
+
for (const toolName of completeOn) {
|
|
51
|
+
const key = resolveToolOutputKey(toolName, toolOutputMap);
|
|
52
|
+
const value = toolOutputs[key];
|
|
53
|
+
const hit = Array.isArray(value)
|
|
54
|
+
? value.length > 0
|
|
55
|
+
: value !== undefined && value !== null;
|
|
56
|
+
if (hit) {
|
|
57
|
+
flowCompleted = true;
|
|
58
|
+
extras[key] = value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
flowCompleted,
|
|
63
|
+
flow: {
|
|
64
|
+
active: flow.active && !flowCompleted,
|
|
65
|
+
intent: flowCompleted ? null : flow.intent,
|
|
66
|
+
},
|
|
67
|
+
extras,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import type { BaseChatModel } from "@langchain/core/language_models/chat_models"
|
|
|
2
2
|
import type { Embeddings } from "@langchain/core/embeddings";
|
|
3
3
|
import type { DynamicStructuredTool } from "@langchain/core/tools";
|
|
4
4
|
import type { BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
|
|
5
|
+
import type { ToolOutputMap } from "./services/simple-config.js";
|
|
6
|
+
export type { ToolOutputMap };
|
|
5
7
|
/** Intent catalog entry used for embedding routing + sticky-flow rules. */
|
|
6
8
|
export type IntentDefinition = {
|
|
7
9
|
name: string;
|
|
@@ -118,12 +120,19 @@ export type InvokeResult = {
|
|
|
118
120
|
};
|
|
119
121
|
export type AgentRuntimeConfig = {
|
|
120
122
|
redisUrl?: string;
|
|
121
|
-
|
|
123
|
+
/**
|
|
124
|
+
* LLM config. Omit to use `llmConfigFromEnv()` (OLLAMA_* / OPENAI_* env vars).
|
|
125
|
+
*/
|
|
126
|
+
llm?: LlmConfig;
|
|
122
127
|
/** Intent catalog for embeddings + sticky flags. */
|
|
123
128
|
intents: IntentDefinition[];
|
|
124
129
|
/** Per-intent prompt + tools factory. */
|
|
125
130
|
intentRegistry: IntentRegistry;
|
|
126
|
-
/**
|
|
131
|
+
/**
|
|
132
|
+
* Optional digit → intent routing (e.g. menu "1" → create_campaign).
|
|
133
|
+
* Prompt text alone cannot switch intent when the user types a number —
|
|
134
|
+
* keep this if you use a numbered menu. Safe to omit otherwise.
|
|
135
|
+
*/
|
|
127
136
|
menuMap?: Record<string, string>;
|
|
128
137
|
/** Map legacy/alias names onto catalog intents. */
|
|
129
138
|
intentAliases?: Record<string, string>;
|
|
@@ -133,19 +142,27 @@ export type AgentRuntimeConfig = {
|
|
|
133
142
|
/** Custom system prompt builder; default uses intentRegistry[intent].prompt. */
|
|
134
143
|
buildSystemPrompt?: (ctx: PromptContext) => string;
|
|
135
144
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
145
|
+
* Simple toolName → output key map (preferred).
|
|
146
|
+
* @example { create_campaign: "campaign", buy_airtime: "buyAirtime" }
|
|
147
|
+
*/
|
|
148
|
+
toolOutputMap?: ToolOutputMap;
|
|
149
|
+
/**
|
|
150
|
+
* Tool names that complete a sticky flow when they produce output.
|
|
151
|
+
* Library owns finalize logic — you only pass the list.
|
|
152
|
+
*/
|
|
153
|
+
completeOn?: string[];
|
|
154
|
+
/**
|
|
155
|
+
* Per-tool extractors (advanced). Prefer `toolOutputMap` instead.
|
|
138
156
|
*/
|
|
139
157
|
toolExtractors?: ToolExtractorMap;
|
|
140
158
|
/** Seed object for tool extractors (e.g. () => ({ tickets: [] })). */
|
|
141
159
|
initialToolOutputs?: () => Record<string, unknown>;
|
|
142
160
|
/** If true, unknown tool names are kept as raw args. Default false when using toolExtractors. */
|
|
143
161
|
includeUnknownToolOutputs?: boolean;
|
|
144
|
-
/** Full custom extractor. Overrides toolExtractors when provided. */
|
|
162
|
+
/** Full custom extractor. Overrides toolOutputMap / toolExtractors when provided. */
|
|
145
163
|
extractToolOutputs?: (messages: unknown[]) => Record<string, unknown>;
|
|
146
164
|
/**
|
|
147
|
-
*
|
|
148
|
-
* Default: never auto-complete (app must clear via finalize or clearFlow).
|
|
165
|
+
* Custom finalize. Prefer `completeOn` for the common case.
|
|
149
166
|
*/
|
|
150
167
|
finalizeFlow?: (input: FinalizeFlowInput) => FinalizeFlowResult | Promise<FinalizeFlowResult>;
|
|
151
168
|
/** Derive phone/session key for tools. Default: phoneKey ?? threadId. */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED