llm-agent-runtime 0.1.6 → 0.1.17
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 +8 -2
- package/USAGE.md +528 -283
- package/dist/agent.d.ts +2 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +36 -4
- package/dist/create-runtime.d.ts +14 -4
- package/dist/create-runtime.d.ts.map +1 -1
- package/dist/create-runtime.js +108 -20
- package/dist/embeddings/xenova.d.ts +19 -0
- package/dist/embeddings/xenova.d.ts.map +1 -0
- package/dist/embeddings/xenova.js +69 -0
- package/dist/env-llm.d.ts +17 -4
- package/dist/env-llm.d.ts.map +1 -1
- package/dist/env-llm.js +66 -16
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +17 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/intents/define.d.ts +35 -0
- package/dist/intents/define.d.ts.map +1 -0
- package/dist/intents/define.js +52 -0
- package/dist/intents/general.d.ts +37 -0
- package/dist/intents/general.d.ts.map +1 -0
- package/dist/intents/general.js +67 -0
- package/dist/llm.d.ts +2 -2
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +45 -15
- package/dist/rag/index.d.ts +67 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +140 -0
- package/dist/rag/loaders.d.ts +11 -0
- package/dist/rag/loaders.d.ts.map +1 -0
- package/dist/rag/loaders.js +80 -0
- package/dist/rag/sources.d.ts +29 -0
- package/dist/rag/sources.d.ts.map +1 -0
- package/dist/rag/sources.js +101 -0
- package/dist/services/intent-embeddings.d.ts.map +1 -1
- package/dist/services/intent-embeddings.js +5 -6
- package/dist/services/token-usage.d.ts +26 -0
- package/dist/services/token-usage.d.ts.map +1 -0
- package/dist/services/token-usage.js +63 -0
- package/dist/services/usage-store.d.ts +24 -0
- package/dist/services/usage-store.d.ts.map +1 -0
- package/dist/services/usage-store.js +92 -0
- package/dist/types.d.ts +47 -15
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -3
package/dist/agent.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ export type AgentFactory = {
|
|
|
13
13
|
};
|
|
14
14
|
export declare function createAgentFactory(options: {
|
|
15
15
|
llm: BaseChatModel;
|
|
16
|
-
|
|
16
|
+
/** Tools only — context typing is owned by prompts / createAgentRuntime. */
|
|
17
|
+
intentRegistry: IntentRegistry<any>;
|
|
17
18
|
redisUrl?: string;
|
|
18
19
|
checkpointer?: BaseCheckpointSaver;
|
|
19
20
|
}): Promise<AgentFactory>;
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACxF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE;YAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CACpF,CAAC;AA4CF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,GAAG,EAAE,aAAa,CAAC;IACnB,4EAA4E;IAC5E,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCxB"}
|
package/dist/agent.js
CHANGED
|
@@ -1,11 +1,43 @@
|
|
|
1
1
|
import { createReactAgent } from "@langchain/langgraph/prebuilt";
|
|
2
2
|
import { MemorySaver } from "@langchain/langgraph-checkpoint";
|
|
3
3
|
import { RedisSaver } from "@langchain/langgraph-checkpoint-redis";
|
|
4
|
+
import { createClient } from "redis";
|
|
5
|
+
/**
|
|
6
|
+
* RedisSaver needs Redis Stack (RedisJSON + RediSearch).
|
|
7
|
+
* Plain redis://localhost has neither — probe and fall back to MemorySaver.
|
|
8
|
+
*/
|
|
9
|
+
async function createCheckpointer(redisUrl, existing) {
|
|
10
|
+
if (existing)
|
|
11
|
+
return existing;
|
|
12
|
+
if (!redisUrl)
|
|
13
|
+
return new MemorySaver();
|
|
14
|
+
const client = createClient({ url: redisUrl });
|
|
15
|
+
client.on("error", () => {
|
|
16
|
+
/* probe client — swallow to avoid process crash */
|
|
17
|
+
});
|
|
18
|
+
try {
|
|
19
|
+
await client.connect();
|
|
20
|
+
const probeKey = `__llm_agent_runtime_probe_${Date.now()}`;
|
|
21
|
+
await client.sendCommand(["JSON.SET", probeKey, "$", "{}"]);
|
|
22
|
+
await client.del(probeKey);
|
|
23
|
+
await client.quit().catch(() => undefined);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
await client.quit().catch(() => undefined);
|
|
27
|
+
console.warn("[llm-agent-runtime] Redis Stack (RedisJSON) not available — using in-memory checkpointer. " +
|
|
28
|
+
"Flow cache can still use Redis; install Redis Stack for durable LangGraph checkpoints.");
|
|
29
|
+
return new MemorySaver();
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
return await RedisSaver.fromUrl(redisUrl);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.warn("[llm-agent-runtime] RedisSaver.fromUrl failed — using in-memory checkpointer:", err instanceof Error ? err.message : err);
|
|
36
|
+
return new MemorySaver();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
4
39
|
export async function createAgentFactory(options) {
|
|
5
|
-
const checkpointer = options.checkpointer
|
|
6
|
-
(options.redisUrl
|
|
7
|
-
? await RedisSaver.fromUrl(options.redisUrl)
|
|
8
|
-
: new MemorySaver());
|
|
40
|
+
const checkpointer = await createCheckpointer(options.redisUrl, options.checkpointer);
|
|
9
41
|
const fallbackTools = () => {
|
|
10
42
|
const first = Object.values(options.intentRegistry)[0];
|
|
11
43
|
return first?.tools("") ?? [];
|
package/dist/create-runtime.d.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import type { AgentRuntimeConfig, InvokeInput, InvokeResult } from "./types.js";
|
|
2
|
-
export type AgentRuntime = {
|
|
3
|
-
invoke: (input: InvokeInput) => Promise<InvokeResult>;
|
|
1
|
+
import type { AgentRuntimeConfig, InvokeInput, InvokeResult, TokenUsageReport } from "./types.js";
|
|
2
|
+
export type AgentRuntime<TContext = unknown> = {
|
|
3
|
+
invoke: (input: InvokeInput<TContext>) => Promise<InvokeResult>;
|
|
4
4
|
connect: () => Promise<void>;
|
|
5
5
|
disconnect: () => Promise<void>;
|
|
6
6
|
clearFlow: (threadId: string) => Promise<void>;
|
|
7
7
|
/** Clears LangGraph checkpoint thread (conversation memory). */
|
|
8
8
|
clearThread: (threadId: string) => Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Frontend “clear session”: checkpoint + sticky flow state + token usage.
|
|
11
|
+
* Same as clearThread + usage wipe.
|
|
12
|
+
*/
|
|
13
|
+
clearSession: (threadId: string) => Promise<void>;
|
|
14
|
+
/** Read accumulated token usage for a thread (Redis or memory). */
|
|
15
|
+
getUsage: (threadId: string) => Promise<TokenUsageReport["total"]>;
|
|
9
16
|
getCachedAnswer: (message: string) => Promise<string | undefined>;
|
|
10
17
|
setCachedAnswer: (message: string, answer: string) => Promise<void>;
|
|
11
18
|
/** Invalidate embedding cache after changing intent examples at runtime. */
|
|
@@ -14,6 +21,9 @@ export type AgentRuntime = {
|
|
|
14
21
|
/**
|
|
15
22
|
* Factory for a reusable agent runtime.
|
|
16
23
|
* Engine pipeline: resolveFlow → runAgent → getTurnMessages → extract → finalize
|
|
24
|
+
*
|
|
25
|
+
* Pass your context type so prompts get typed `ctx.context`:
|
|
26
|
+
* `createAgentRuntime<{ userInfo?: { name?: string } }>({ ... })`
|
|
17
27
|
*/
|
|
18
|
-
export declare function createAgentRuntime(config: AgentRuntimeConfig): Promise<AgentRuntime
|
|
28
|
+
export declare function createAgentRuntime<TContext = unknown>(config: AgentRuntimeConfig<TContext>): Promise<AgentRuntime<TContext>>;
|
|
19
29
|
//# sourceMappingURL=create-runtime.d.ts.map
|
|
@@ -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":"AAwBA,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EAEZ,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAepB,MAAM,MAAM,YAAY,CAAC,QAAQ,GAAG,OAAO,IAAI;IAC7C,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,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;;;OAGG;IACH,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,mEAAmE;IACnE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,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;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACzD,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GACnC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAwVjC"}
|
package/dist/create-runtime.js
CHANGED
|
@@ -10,6 +10,9 @@ import { createCompleteOnFinalize, toolOutputMapToExtractors, } from "./services
|
|
|
10
10
|
import { createFlowRouter, stickySetFromIntents, } from "./services/flow-router.js";
|
|
11
11
|
import { createIntentEmbeddings } from "./services/intent-embeddings.js";
|
|
12
12
|
import { createIntentRouter } from "./services/intent-router.js";
|
|
13
|
+
import { extractTokenUsageFromMessages } from "./services/token-usage.js";
|
|
14
|
+
import { createUsageStore } from "./services/usage-store.js";
|
|
15
|
+
import { assertInvokeInput } from "./errors.js";
|
|
13
16
|
import { getLastMessageContent } from "./utils/message.js";
|
|
14
17
|
/** Messages for this user turn only (used to extract tool outputs). */
|
|
15
18
|
const getTurnMessages = (allMessages, userMessage) => {
|
|
@@ -26,16 +29,34 @@ const getTurnMessages = (allMessages, userMessage) => {
|
|
|
26
29
|
/**
|
|
27
30
|
* Factory for a reusable agent runtime.
|
|
28
31
|
* Engine pipeline: resolveFlow → runAgent → getTurnMessages → extract → finalize
|
|
32
|
+
*
|
|
33
|
+
* Pass your context type so prompts get typed `ctx.context`:
|
|
34
|
+
* `createAgentRuntime<{ userInfo?: { name?: string } }>({ ... })`
|
|
29
35
|
*/
|
|
30
36
|
export async function createAgentRuntime(config) {
|
|
31
|
-
// Wire LangSmith tracing
|
|
32
|
-
|
|
33
|
-
const
|
|
37
|
+
// Wire LangSmith tracing before models are created.
|
|
38
|
+
// Respect LANGSMITH_PROJECT / LANGCHAIN_PROJECT (do not force a package default over env).
|
|
39
|
+
const langsmithKey = process.env.LANGSMITH_API_KEY?.trim() ||
|
|
40
|
+
process.env.LANGCHAIN_API_KEY?.trim() ||
|
|
41
|
+
undefined;
|
|
42
|
+
const tracingEnabled = config.tracing?.enabled ?? Boolean(langsmithKey);
|
|
34
43
|
if (tracingEnabled) {
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
if (!langsmithKey) {
|
|
45
|
+
console.warn("[llm-agent-runtime] tracing.enabled but no LANGSMITH_API_KEY / LANGCHAIN_API_KEY set");
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const project = config.tracing?.projectName?.trim() ||
|
|
49
|
+
process.env.LANGSMITH_PROJECT?.trim() ||
|
|
50
|
+
process.env.LANGCHAIN_PROJECT?.trim() ||
|
|
51
|
+
"llm-agent-runtime";
|
|
52
|
+
process.env.LANGCHAIN_TRACING_V2 = "true";
|
|
53
|
+
process.env.LANGSMITH_TRACING = "true";
|
|
37
54
|
process.env.LANGCHAIN_API_KEY = langsmithKey;
|
|
38
|
-
|
|
55
|
+
process.env.LANGSMITH_API_KEY = langsmithKey;
|
|
56
|
+
process.env.LANGCHAIN_PROJECT = project;
|
|
57
|
+
process.env.LANGSMITH_PROJECT = project;
|
|
58
|
+
console.log("[llm-agent-runtime] LangSmith tracing on", { project });
|
|
59
|
+
}
|
|
39
60
|
}
|
|
40
61
|
const defaultIntent = config.defaultIntent ?? config.intents[0]?.name ?? "greetings";
|
|
41
62
|
const intentNames = new Set(config.intents.map((i) => i.name));
|
|
@@ -56,6 +77,15 @@ export async function createAgentRuntime(config) {
|
|
|
56
77
|
const chat = config.models?.chat ?? created.chat;
|
|
57
78
|
const intentRouterModel = config.models?.intentRouter ?? created.intentRouter;
|
|
58
79
|
const embeddings = config.models?.embeddings ?? created.embeddings;
|
|
80
|
+
console.log("[llm-agent-runtime] models", {
|
|
81
|
+
provider: created.config.provider,
|
|
82
|
+
chat: created.config.model,
|
|
83
|
+
intentRouter: created.config.intentRouterModel,
|
|
84
|
+
embeddingsProvider: created.config.embeddingsProvider,
|
|
85
|
+
embeddings: created.config.embeddingsModel,
|
|
86
|
+
baseUrl: llm.baseUrl,
|
|
87
|
+
embeddingsBaseUrl: llm.embeddingsBaseUrl,
|
|
88
|
+
});
|
|
59
89
|
const fromMap = config.toolOutputMap
|
|
60
90
|
? toolOutputMapToExtractors(config.toolOutputMap)
|
|
61
91
|
: null;
|
|
@@ -70,7 +100,7 @@ export async function createAgentRuntime(config) {
|
|
|
70
100
|
toolOutputMap: config.toolOutputMap,
|
|
71
101
|
})
|
|
72
102
|
: undefined);
|
|
73
|
-
// Redis client when redisUrl is set (flow state + optional answer cache)
|
|
103
|
+
// Redis client when redisUrl is set (flow state + optional answer cache + usage)
|
|
74
104
|
const redis = config.redisUrl
|
|
75
105
|
? createRedis(config.redisUrl)
|
|
76
106
|
: undefined;
|
|
@@ -83,6 +113,10 @@ export async function createAgentRuntime(config) {
|
|
|
83
113
|
scope: config.cache?.scope,
|
|
84
114
|
},
|
|
85
115
|
});
|
|
116
|
+
const usageStore = createUsageStore({
|
|
117
|
+
redis: redis?.client,
|
|
118
|
+
ttlSeconds: config.cache?.ttlSeconds ?? 60 * 60 * 24 * 7,
|
|
119
|
+
});
|
|
86
120
|
const agentFactory = await createAgentFactory({
|
|
87
121
|
llm: chat,
|
|
88
122
|
intentRegistry: config.intentRegistry,
|
|
@@ -127,21 +161,44 @@ export async function createAgentRuntime(config) {
|
|
|
127
161
|
includeUnknown: config.includeUnknownToolOutputs ?? false,
|
|
128
162
|
})
|
|
129
163
|
: extractRawToolOutputs);
|
|
164
|
+
const resolveSharedPrompt = (ctx) => {
|
|
165
|
+
const shared = config.sharedPrompt;
|
|
166
|
+
if (!shared)
|
|
167
|
+
return "";
|
|
168
|
+
return typeof shared === "function" ? shared(ctx) : shared;
|
|
169
|
+
};
|
|
170
|
+
const buildIntentPrompt = (ctx) => {
|
|
171
|
+
const binding = config.intentRegistry[ctx.intent];
|
|
172
|
+
if (!binding) {
|
|
173
|
+
const fallback = Object.values(config.intentRegistry)[0];
|
|
174
|
+
return fallback?.prompt(ctx) ?? "";
|
|
175
|
+
}
|
|
176
|
+
return binding.prompt(ctx);
|
|
177
|
+
};
|
|
130
178
|
const buildSystemPrompt = config.buildSystemPrompt ??
|
|
131
179
|
((ctx) => {
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
return binding.prompt(ctx);
|
|
180
|
+
const shared = resolveSharedPrompt(ctx).trim();
|
|
181
|
+
const intentPrompt = buildIntentPrompt(ctx).trim();
|
|
182
|
+
if (shared && intentPrompt)
|
|
183
|
+
return `${shared}\n\n${intentPrompt}`;
|
|
184
|
+
return shared || intentPrompt;
|
|
138
185
|
});
|
|
139
186
|
const resolvePhoneKey = config.resolvePhoneKey ??
|
|
140
187
|
(({ threadId, phoneKey }) => phoneKey ?? threadId);
|
|
188
|
+
const clearSession = async (threadId) => {
|
|
189
|
+
const saver = agentFactory.checkpointer;
|
|
190
|
+
if (typeof saver.deleteThread === "function") {
|
|
191
|
+
await saver.deleteThread(threadId);
|
|
192
|
+
}
|
|
193
|
+
await chatCache.clearChatCacheFlowState(threadId);
|
|
194
|
+
await usageStore.clearThreadUsage(threadId);
|
|
195
|
+
};
|
|
141
196
|
const invoke = async (input) => {
|
|
197
|
+
assertInvokeInput(input);
|
|
142
198
|
if (chatCache.enabled) {
|
|
143
199
|
const cached = await chatCache.getCachedAnswer(input.message);
|
|
144
200
|
if (cached) {
|
|
201
|
+
const total = await usageStore.getThreadUsage(input.threadId);
|
|
145
202
|
return {
|
|
146
203
|
messages: [],
|
|
147
204
|
answer: cached,
|
|
@@ -150,6 +207,16 @@ export async function createAgentRuntime(config) {
|
|
|
150
207
|
toolOutputs: {},
|
|
151
208
|
flowCompleted: false,
|
|
152
209
|
extras: { cacheHit: true },
|
|
210
|
+
usage: {
|
|
211
|
+
turn: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
|
|
212
|
+
flow: {
|
|
213
|
+
inputTokens: 0,
|
|
214
|
+
outputTokens: 0,
|
|
215
|
+
totalTokens: 0,
|
|
216
|
+
intent: null,
|
|
217
|
+
},
|
|
218
|
+
total,
|
|
219
|
+
},
|
|
153
220
|
};
|
|
154
221
|
}
|
|
155
222
|
}
|
|
@@ -197,6 +264,30 @@ export async function createAgentRuntime(config) {
|
|
|
197
264
|
if (chatCache.enabled && answer) {
|
|
198
265
|
await chatCache.setCachedAnswer(input.message, answer);
|
|
199
266
|
}
|
|
267
|
+
// Token usage: this turn + sticky-flow bucket + thread total (Redis when set)
|
|
268
|
+
const turnUsage = extractTokenUsageFromMessages(turnMessages);
|
|
269
|
+
const flowIntentForUsage = finalized.flow.active && finalized.flow.intent
|
|
270
|
+
? finalized.flow.intent
|
|
271
|
+
: stickyFlows.has(promptIntent)
|
|
272
|
+
? promptIntent
|
|
273
|
+
: null;
|
|
274
|
+
const { total, flow: flowUsage } = await usageStore.recordTurn({
|
|
275
|
+
threadId: input.threadId,
|
|
276
|
+
flowIntent: flowIntentForUsage,
|
|
277
|
+
turn: turnUsage,
|
|
278
|
+
});
|
|
279
|
+
if (finalized.flowCompleted && flowIntentForUsage) {
|
|
280
|
+
// Keep completed-flow totals in this response; reset bucket for next flow
|
|
281
|
+
await usageStore.clearFlowUsage(input.threadId, flowIntentForUsage);
|
|
282
|
+
}
|
|
283
|
+
const usage = {
|
|
284
|
+
turn: turnUsage,
|
|
285
|
+
flow: {
|
|
286
|
+
...flowUsage,
|
|
287
|
+
intent: flowIntentForUsage,
|
|
288
|
+
},
|
|
289
|
+
total,
|
|
290
|
+
};
|
|
200
291
|
return {
|
|
201
292
|
messages: resultMessages,
|
|
202
293
|
answer,
|
|
@@ -205,6 +296,7 @@ export async function createAgentRuntime(config) {
|
|
|
205
296
|
toolOutputs,
|
|
206
297
|
flowCompleted: finalized.flowCompleted,
|
|
207
298
|
extras: finalized.extras,
|
|
299
|
+
usage,
|
|
208
300
|
...(llmResult
|
|
209
301
|
? { router: { action: llmResult.action, reason: llmResult.reason } }
|
|
210
302
|
: {}),
|
|
@@ -219,13 +311,9 @@ export async function createAgentRuntime(config) {
|
|
|
219
311
|
await redis?.disconnect();
|
|
220
312
|
},
|
|
221
313
|
clearFlow: chatCache.clearChatCacheFlowState,
|
|
222
|
-
clearThread:
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
await saver.deleteThread(threadId);
|
|
226
|
-
}
|
|
227
|
-
await chatCache.clearChatCacheFlowState(threadId);
|
|
228
|
-
},
|
|
314
|
+
clearThread: clearSession,
|
|
315
|
+
clearSession,
|
|
316
|
+
getUsage: usageStore.getThreadUsage,
|
|
229
317
|
getCachedAnswer: chatCache.getCachedAnswer,
|
|
230
318
|
setCachedAnswer: chatCache.setCachedAnswer,
|
|
231
319
|
invalidateIntentEmbeddings: intentEmbeddings.invalidate,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Embeddings, type EmbeddingsParams } from "@langchain/core/embeddings";
|
|
2
|
+
export type XenovaEmbeddingsParams = EmbeddingsParams & {
|
|
3
|
+
/** Hugging Face / Xenova model id. Default: Xenova/all-MiniLM-L6-v2 */
|
|
4
|
+
model?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Free, in-process embeddings via `@xenova/transformers` (no Ollama / OpenAI).
|
|
8
|
+
* Install: `pnpm add @xenova/transformers`
|
|
9
|
+
*/
|
|
10
|
+
export declare class XenovaEmbeddings extends Embeddings {
|
|
11
|
+
model: string;
|
|
12
|
+
private pipelinePromise;
|
|
13
|
+
constructor(fields?: XenovaEmbeddingsParams);
|
|
14
|
+
private getPipeline;
|
|
15
|
+
private toVector;
|
|
16
|
+
embedDocuments(documents: string[]): Promise<number[][]>;
|
|
17
|
+
embedQuery(document: string): Promise<number[]>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=xenova.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xenova.d.ts","sourceRoot":"","sources":["../../src/embeddings/xenova.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAoD/E,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG;IACtD,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,eAAe,CAAmD;gBAE9D,MAAM,CAAC,EAAE,sBAAsB;YAK7B,WAAW;IAUzB,OAAO,CAAC,QAAQ;IAQV,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAUxD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAItD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Embeddings } from "@langchain/core/embeddings";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
async function loadXenovaTransformers() {
|
|
6
|
+
const errors = [];
|
|
7
|
+
try {
|
|
8
|
+
return (await import("@xenova/transformers"));
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
errors.push(`package import: ${err instanceof Error ? err.message : String(err)}`);
|
|
12
|
+
}
|
|
13
|
+
// pnpm nests this package; resolve from the app's node_modules / cwd.
|
|
14
|
+
try {
|
|
15
|
+
const requireFromCwd = createRequire(path.join(process.cwd(), "package.json"));
|
|
16
|
+
const resolved = requireFromCwd.resolve("@xenova/transformers");
|
|
17
|
+
return (await import(pathToFileURL(resolved).href));
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
errors.push(`cwd resolve: ${err instanceof Error ? err.message : String(err)}`);
|
|
21
|
+
}
|
|
22
|
+
throw new Error([
|
|
23
|
+
'embeddingsProvider "xenova" could not load @xenova/transformers.',
|
|
24
|
+
"Install in your app: pnpm add @xenova/transformers",
|
|
25
|
+
"If you see a sharp error, rebuild native deps: pnpm rebuild sharp --config.ignore-scripts=false",
|
|
26
|
+
...errors.map((e) => ` - ${e.split("\n")[0]}`),
|
|
27
|
+
].join("\n"));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Free, in-process embeddings via `@xenova/transformers` (no Ollama / OpenAI).
|
|
31
|
+
* Install: `pnpm add @xenova/transformers`
|
|
32
|
+
*/
|
|
33
|
+
export class XenovaEmbeddings extends Embeddings {
|
|
34
|
+
model;
|
|
35
|
+
pipelinePromise = null;
|
|
36
|
+
constructor(fields) {
|
|
37
|
+
super(fields ?? {});
|
|
38
|
+
this.model = fields?.model ?? "Xenova/all-MiniLM-L6-v2";
|
|
39
|
+
}
|
|
40
|
+
async getPipeline() {
|
|
41
|
+
if (!this.pipelinePromise) {
|
|
42
|
+
this.pipelinePromise = (async () => {
|
|
43
|
+
const mod = await loadXenovaTransformers();
|
|
44
|
+
return mod.pipeline("feature-extraction", this.model);
|
|
45
|
+
})();
|
|
46
|
+
}
|
|
47
|
+
return this.pipelinePromise;
|
|
48
|
+
}
|
|
49
|
+
toVector(result) {
|
|
50
|
+
if (typeof result.tolist === "function") {
|
|
51
|
+
const list = result.tolist();
|
|
52
|
+
return Array.isArray(list[0]) ? list[0] : list;
|
|
53
|
+
}
|
|
54
|
+
return Array.from(result.data);
|
|
55
|
+
}
|
|
56
|
+
async embedDocuments(documents) {
|
|
57
|
+
const pipe = await this.getPipeline();
|
|
58
|
+
const vectors = [];
|
|
59
|
+
for (const doc of documents) {
|
|
60
|
+
const result = await pipe(doc, { pooling: "mean", normalize: true });
|
|
61
|
+
vectors.push(this.toVector(result));
|
|
62
|
+
}
|
|
63
|
+
return vectors;
|
|
64
|
+
}
|
|
65
|
+
async embedQuery(document) {
|
|
66
|
+
const [vector] = await this.embedDocuments([document]);
|
|
67
|
+
return vector ?? [];
|
|
68
|
+
}
|
|
69
|
+
}
|
package/dist/env-llm.d.ts
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
|
-
import type { LlmConfig } from "./types.js";
|
|
1
|
+
import type { EmbeddingsProvider, LlmConfig, LlmProvider } from "./types.js";
|
|
2
|
+
/** Vercel / Lambda / Netlify — @xenova/transformers + sharp do not work here. */
|
|
3
|
+
export declare function isServerlessRuntime(env?: NodeJS.ProcessEnv): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve embeddings backend.
|
|
6
|
+
*
|
|
7
|
+
* - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova), except:
|
|
8
|
+
* on serverless (Vercel/Lambda/…) with OPENAI_API_KEY, xenova → openai
|
|
9
|
+
* (Transformers.js / sharp cannot load in those runtimes).
|
|
10
|
+
* - openrouter is not an embeddings backend → xenova locally, openai on serverless+key.
|
|
11
|
+
* - If unset: ollama chat → ollama; serverless+OPENAI_API_KEY → openai; else → xenova.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveEmbeddingsProvider(env: NodeJS.ProcessEnv, chatProvider: LlmProvider): EmbeddingsProvider;
|
|
2
14
|
/**
|
|
3
15
|
* Build LlmConfig from process.env.
|
|
4
16
|
*
|
|
5
17
|
* Env knobs:
|
|
6
|
-
* - LLM_PROVIDER
|
|
18
|
+
* - LLM_PROVIDER — ollama | openai | openrouter
|
|
19
|
+
* - EMBEDDINGS_PROVIDER — ollama | openai | xenova
|
|
20
|
+
* (default: ollama if LLM is ollama; openai on Vercel/Lambda when OPENAI_API_KEY set; else xenova)
|
|
7
21
|
* - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
|
|
8
|
-
* -
|
|
9
|
-
* - OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
22
|
+
* - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
10
23
|
* - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
|
|
11
24
|
*/
|
|
12
25
|
export declare function llmConfigFromEnv(env?: NodeJS.ProcessEnv): LlmConfig;
|
package/dist/env-llm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-llm.d.ts","sourceRoot":"","sources":["../src/env-llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"env-llm.d.ts","sourceRoot":"","sources":["../src/env-llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqB7E,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAQT;AAMD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,YAAY,EAAE,WAAW,GACxB,kBAAkB,CAuBpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,CAuDX"}
|
package/dist/env-llm.js
CHANGED
|
@@ -1,45 +1,95 @@
|
|
|
1
|
-
const
|
|
1
|
+
const asChatProvider = (value, fallback) => {
|
|
2
2
|
const normalized = value?.trim().toLowerCase();
|
|
3
3
|
if (normalized === "openai" ||
|
|
4
4
|
normalized === "gpt" ||
|
|
5
5
|
normalized === "chatgpt") {
|
|
6
6
|
return "openai";
|
|
7
7
|
}
|
|
8
|
-
if (normalized === "openrouter" ||
|
|
9
|
-
normalized === "or") {
|
|
8
|
+
if (normalized === "openrouter" || normalized === "or") {
|
|
10
9
|
return "openrouter";
|
|
11
10
|
}
|
|
12
11
|
if (normalized === "ollama")
|
|
13
12
|
return "ollama";
|
|
14
13
|
return fallback;
|
|
15
14
|
};
|
|
15
|
+
/** Vercel / Lambda / Netlify — @xenova/transformers + sharp do not work here. */
|
|
16
|
+
export function isServerlessRuntime(env = process.env) {
|
|
17
|
+
return Boolean(env.VERCEL ||
|
|
18
|
+
env.VERCEL_ENV ||
|
|
19
|
+
env.AWS_LAMBDA_FUNCTION_NAME ||
|
|
20
|
+
env.NETLIFY ||
|
|
21
|
+
env.NETLIFY_DEV);
|
|
22
|
+
}
|
|
23
|
+
function preferOpenAiOnServerless(env) {
|
|
24
|
+
return isServerlessRuntime(env) && Boolean(env.OPENAI_API_KEY?.trim());
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve embeddings backend.
|
|
28
|
+
*
|
|
29
|
+
* - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova), except:
|
|
30
|
+
* on serverless (Vercel/Lambda/…) with OPENAI_API_KEY, xenova → openai
|
|
31
|
+
* (Transformers.js / sharp cannot load in those runtimes).
|
|
32
|
+
* - openrouter is not an embeddings backend → xenova locally, openai on serverless+key.
|
|
33
|
+
* - If unset: ollama chat → ollama; serverless+OPENAI_API_KEY → openai; else → xenova.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveEmbeddingsProvider(env, chatProvider) {
|
|
36
|
+
const raw = env.EMBEDDINGS_PROVIDER?.trim().toLowerCase();
|
|
37
|
+
const serverlessOpenAi = preferOpenAiOnServerless(env);
|
|
38
|
+
if (raw === "openai" || raw === "gpt" || raw === "chatgpt")
|
|
39
|
+
return "openai";
|
|
40
|
+
if (raw === "ollama")
|
|
41
|
+
return "ollama";
|
|
42
|
+
if (raw === "xenova" ||
|
|
43
|
+
raw === "transformers" ||
|
|
44
|
+
raw === "local" ||
|
|
45
|
+
raw === "minilm") {
|
|
46
|
+
return serverlessOpenAi ? "openai" : "xenova";
|
|
47
|
+
}
|
|
48
|
+
// OpenRouter has chat only — not an embeddings API.
|
|
49
|
+
if (raw === "openrouter" || raw === "or") {
|
|
50
|
+
return serverlessOpenAi ? "openai" : "xenova";
|
|
51
|
+
}
|
|
52
|
+
// Unset / unknown
|
|
53
|
+
if (chatProvider === "ollama")
|
|
54
|
+
return "ollama";
|
|
55
|
+
if (serverlessOpenAi)
|
|
56
|
+
return "openai";
|
|
57
|
+
return "xenova";
|
|
58
|
+
}
|
|
16
59
|
/**
|
|
17
60
|
* Build LlmConfig from process.env.
|
|
18
61
|
*
|
|
19
62
|
* Env knobs:
|
|
20
|
-
* - LLM_PROVIDER
|
|
63
|
+
* - LLM_PROVIDER — ollama | openai | openrouter
|
|
64
|
+
* - EMBEDDINGS_PROVIDER — ollama | openai | xenova
|
|
65
|
+
* (default: ollama if LLM is ollama; openai on Vercel/Lambda when OPENAI_API_KEY set; else xenova)
|
|
21
66
|
* - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
|
|
22
|
-
* -
|
|
23
|
-
* - OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
67
|
+
* - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
24
68
|
* - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
|
|
25
69
|
*/
|
|
26
70
|
export function llmConfigFromEnv(env = process.env) {
|
|
27
|
-
const provider =
|
|
28
|
-
const embeddingsProvider =
|
|
71
|
+
const provider = asChatProvider(env.LLM_PROVIDER, "ollama");
|
|
72
|
+
const embeddingsProvider = resolveEmbeddingsProvider(env, provider);
|
|
29
73
|
const openrouterBaseUrl = env.OPENROUTER_BASE_URL ?? "https://openrouter.ai/api/v1";
|
|
74
|
+
const ollamaBaseUrl = env.OLLAMA_BASE_URL ?? "http://localhost:11434";
|
|
75
|
+
const resolvedEmbeddingsModel = embeddingsProvider === "openai"
|
|
76
|
+
? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
|
|
77
|
+
: embeddingsProvider === "xenova"
|
|
78
|
+
? (env.XENOVA_EMBEDDINGS_MODEL ?? "Xenova/all-MiniLM-L6-v2")
|
|
79
|
+
: (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest");
|
|
30
80
|
if (provider === "openrouter") {
|
|
31
81
|
return {
|
|
32
82
|
provider,
|
|
33
|
-
embeddingsProvider
|
|
83
|
+
embeddingsProvider,
|
|
34
84
|
model: env.OPENROUTER_MODEL ?? "meta-llama/llama-4-scout",
|
|
35
85
|
intentRouterModel: env.OPENROUTER_INTENT_ROUTER_MODEL ??
|
|
36
86
|
env.OPENROUTER_MODEL ??
|
|
37
87
|
"meta-llama/llama-4-scout",
|
|
38
|
-
embeddingsModel:
|
|
39
|
-
? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
|
|
40
|
-
: (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest"),
|
|
88
|
+
embeddingsModel: resolvedEmbeddingsModel,
|
|
41
89
|
baseUrl: openrouterBaseUrl,
|
|
90
|
+
embeddingsBaseUrl: embeddingsProvider === "ollama" ? ollamaBaseUrl : undefined,
|
|
42
91
|
apiKey: env.OPENROUTER_API_KEY,
|
|
92
|
+
embeddingsApiKey: env.OPENAI_API_KEY,
|
|
43
93
|
};
|
|
44
94
|
}
|
|
45
95
|
return {
|
|
@@ -55,10 +105,10 @@ export function llmConfigFromEnv(env = process.env) {
|
|
|
55
105
|
: (env.INTENT_ROUTER_MODEL ??
|
|
56
106
|
env.OLLAMA_INTENT_ROUTER_MODEL ??
|
|
57
107
|
"qwen2.5:7b"),
|
|
58
|
-
embeddingsModel:
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
baseUrl: env.OLLAMA_BASE_URL,
|
|
108
|
+
embeddingsModel: resolvedEmbeddingsModel,
|
|
109
|
+
baseUrl: provider === "openai" ? undefined : ollamaBaseUrl,
|
|
110
|
+
embeddingsBaseUrl: embeddingsProvider === "ollama" ? ollamaBaseUrl : undefined,
|
|
62
111
|
apiKey: env.OPENAI_API_KEY,
|
|
112
|
+
embeddingsApiKey: env.OPENAI_API_KEY,
|
|
63
113
|
};
|
|
64
114
|
}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Thrown when `invoke` input fails validation (e.g. missing threadId). */
|
|
2
|
+
export declare class AgentRuntimeError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
constructor(code: string, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function assertInvokeInput(input: {
|
|
7
|
+
message?: unknown;
|
|
8
|
+
threadId?: unknown;
|
|
9
|
+
}): void;
|
|
10
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,IAAI,CAaP"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Thrown when `invoke` input fails validation (e.g. missing threadId). */
|
|
2
|
+
export class AgentRuntimeError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "AgentRuntimeError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function assertInvokeInput(input) {
|
|
11
|
+
if (typeof input.message !== "string" || !input.message.trim()) {
|
|
12
|
+
throw new AgentRuntimeError("INVALID_MESSAGE", 'invoke() requires a non-empty string "message".');
|
|
13
|
+
}
|
|
14
|
+
if (typeof input.threadId !== "string" || !input.threadId.trim()) {
|
|
15
|
+
throw new AgentRuntimeError("MISSING_THREAD_ID", 'invoke() requires a non-empty string "threadId" so the checkpointer can persist conversation state. Example: runtime.invoke({ message, threadId: "user-123" })');
|
|
16
|
+
}
|
|
17
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
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
|
+
export { llmConfigFromEnv, resolveEmbeddingsProvider, isServerlessRuntime, } from "./env-llm.js";
|
|
4
4
|
export { createRedis } from "./redis.js";
|
|
5
|
+
export { XenovaEmbeddings } from "./embeddings/xenova.js";
|
|
6
|
+
export { AgentRuntimeError, assertInvokeInput } from "./errors.js";
|
|
7
|
+
export { GENERAL_INTENT_NAME, createGeneralIntent, createGeneralIntentBinding, withGeneralIntent, } from "./intents/general.js";
|
|
8
|
+
export type { WithGeneralIntentOptions } from "./intents/general.js";
|
|
9
|
+
export { defineIntents, withGeneralIntents } from "./intents/define.js";
|
|
10
|
+
export type { UnifiedIntent } from "./intents/define.js";
|
|
11
|
+
export { ragSourcesFromEnv, resolveRagSource, resolveRagSources, isHttpUrl, loadRagDocument, loadRagDocuments, createSimpleRagStore, createSimpleRagFromSources, createSimpleRagFromEnv, getRagStore, getRagDocumentCount, resetRagStore, } from "./rag/index.js";
|
|
12
|
+
export type { RagSourceKind, ResolvedRagSource, LoadedRagDocument, RagChunk, SimpleRagStore, GetRagStoreOptions, } from "./rag/index.js";
|
|
5
13
|
export { extractRawToolOutputs, extractToolCallArgs, getToolCallsFromMessages, createToolOutputExtractor, } from "./services/extract.js";
|
|
6
14
|
export { toolOutputMapToExtractors, createCompleteOnFinalize, } from "./services/simple-config.js";
|
|
15
|
+
export { extractTokenUsageFromMessages, emptyTokenCounts, addTokenCounts, } from "./services/token-usage.js";
|
|
7
16
|
export { isWizardInput } from "./services/flow-router.js";
|
|
8
17
|
export { getLastMessageContent } from "./utils/message.js";
|
|
9
18
|
export { normalize } from "./utils/normalize.js";
|
|
10
|
-
export type { AgentRuntimeConfig, CacheConfig, ChatFlowState, DetectedIntentResult, FinalizeFlowInput, FinalizeFlowResult, FlowResolution, FlowState, IntentBinding, IntentDefinition, IntentRegistry, InvokeInput, InvokeResult, LlmConfig, LlmIntentResult, LlmProvider, PromptContext, ToolCall, ToolExtractor, ToolExtractorMap, ToolOutputMap, TracingConfig, } from "./types.js";
|
|
19
|
+
export type { AgentRuntimeConfig, CacheConfig, ChatFlowState, DetectedIntentResult, EmbeddingsProvider, FinalizeFlowInput, FinalizeFlowResult, FlowResolution, FlowState, FlowTokenUsage, IntentBinding, IntentDefinition, IntentRegistry, InvokeInput, InvokeResult, LlmConfig, LlmIntentResult, LlmProvider, PromptContext, TokenCounts, TokenUsageReport, ToolCall, ToolExtractor, ToolExtractorMap, ToolOutputMap, TracingConfig, } from "./types.js";
|
|
11
20
|
//# sourceMappingURL=index.d.ts.map
|
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,
|
|
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,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,sBAAsB,EACtB,WAAW,EACX,mBAAmB,EACnB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,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,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC"}
|