llm-agent-runtime 0.1.5 → 0.1.16
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 +530 -234
- 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 +112 -14
- 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 -7
- package/dist/env-llm.d.ts.map +1 -1
- package/dist/env-llm.js +67 -13
- 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 +60 -13
- package/dist/rag/index.d.ts +67 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +138 -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/flow-router.d.ts +1 -0
- package/dist/services/flow-router.d.ts.map +1 -1
- package/dist/services/flow-router.js +12 -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 +50 -16
- 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,8 +29,35 @@ 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) {
|
|
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);
|
|
43
|
+
if (tracingEnabled) {
|
|
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";
|
|
54
|
+
process.env.LANGCHAIN_API_KEY = langsmithKey;
|
|
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
|
+
}
|
|
60
|
+
}
|
|
31
61
|
const defaultIntent = config.defaultIntent ?? config.intents[0]?.name ?? "greetings";
|
|
32
62
|
const intentNames = new Set(config.intents.map((i) => i.name));
|
|
33
63
|
const aliases = config.intentAliases ?? {};
|
|
@@ -47,6 +77,15 @@ export async function createAgentRuntime(config) {
|
|
|
47
77
|
const chat = config.models?.chat ?? created.chat;
|
|
48
78
|
const intentRouterModel = config.models?.intentRouter ?? created.intentRouter;
|
|
49
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
|
+
});
|
|
50
89
|
const fromMap = config.toolOutputMap
|
|
51
90
|
? toolOutputMapToExtractors(config.toolOutputMap)
|
|
52
91
|
: null;
|
|
@@ -61,7 +100,7 @@ export async function createAgentRuntime(config) {
|
|
|
61
100
|
toolOutputMap: config.toolOutputMap,
|
|
62
101
|
})
|
|
63
102
|
: undefined);
|
|
64
|
-
// Redis client when redisUrl is set (flow state + optional answer cache)
|
|
103
|
+
// Redis client when redisUrl is set (flow state + optional answer cache + usage)
|
|
65
104
|
const redis = config.redisUrl
|
|
66
105
|
? createRedis(config.redisUrl)
|
|
67
106
|
: undefined;
|
|
@@ -74,6 +113,10 @@ export async function createAgentRuntime(config) {
|
|
|
74
113
|
scope: config.cache?.scope,
|
|
75
114
|
},
|
|
76
115
|
});
|
|
116
|
+
const usageStore = createUsageStore({
|
|
117
|
+
redis: redis?.client,
|
|
118
|
+
ttlSeconds: config.cache?.ttlSeconds ?? 60 * 60 * 24 * 7,
|
|
119
|
+
});
|
|
77
120
|
const agentFactory = await createAgentFactory({
|
|
78
121
|
llm: chat,
|
|
79
122
|
intentRegistry: config.intentRegistry,
|
|
@@ -103,6 +146,7 @@ export async function createAgentRuntime(config) {
|
|
|
103
146
|
stickyFlows,
|
|
104
147
|
menuMap,
|
|
105
148
|
normalizeIntent,
|
|
149
|
+
intents: config.intents,
|
|
106
150
|
getEmbeddedIntents: intentEmbeddings.getEmbeddedIntents,
|
|
107
151
|
scoreIntentsForMessage: intentEmbeddings.scoreIntentsForMessage,
|
|
108
152
|
classifyIntentWithLlm: intentRouter.classifyIntentWithLlm,
|
|
@@ -117,21 +161,44 @@ export async function createAgentRuntime(config) {
|
|
|
117
161
|
includeUnknown: config.includeUnknownToolOutputs ?? false,
|
|
118
162
|
})
|
|
119
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
|
+
};
|
|
120
178
|
const buildSystemPrompt = config.buildSystemPrompt ??
|
|
121
179
|
((ctx) => {
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return
|
|
126
|
-
|
|
127
|
-
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;
|
|
128
185
|
});
|
|
129
186
|
const resolvePhoneKey = config.resolvePhoneKey ??
|
|
130
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
|
+
};
|
|
131
196
|
const invoke = async (input) => {
|
|
197
|
+
assertInvokeInput(input);
|
|
132
198
|
if (chatCache.enabled) {
|
|
133
199
|
const cached = await chatCache.getCachedAnswer(input.message);
|
|
134
200
|
if (cached) {
|
|
201
|
+
const total = await usageStore.getThreadUsage(input.threadId);
|
|
135
202
|
return {
|
|
136
203
|
messages: [],
|
|
137
204
|
answer: cached,
|
|
@@ -140,6 +207,16 @@ export async function createAgentRuntime(config) {
|
|
|
140
207
|
toolOutputs: {},
|
|
141
208
|
flowCompleted: false,
|
|
142
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
|
+
},
|
|
143
220
|
};
|
|
144
221
|
}
|
|
145
222
|
}
|
|
@@ -187,6 +264,30 @@ export async function createAgentRuntime(config) {
|
|
|
187
264
|
if (chatCache.enabled && answer) {
|
|
188
265
|
await chatCache.setCachedAnswer(input.message, answer);
|
|
189
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
|
+
};
|
|
190
291
|
return {
|
|
191
292
|
messages: resultMessages,
|
|
192
293
|
answer,
|
|
@@ -195,6 +296,7 @@ export async function createAgentRuntime(config) {
|
|
|
195
296
|
toolOutputs,
|
|
196
297
|
flowCompleted: finalized.flowCompleted,
|
|
197
298
|
extras: finalized.extras,
|
|
299
|
+
usage,
|
|
198
300
|
...(llmResult
|
|
199
301
|
? { router: { action: llmResult.action, reason: llmResult.reason } }
|
|
200
302
|
: {}),
|
|
@@ -209,13 +311,9 @@ export async function createAgentRuntime(config) {
|
|
|
209
311
|
await redis?.disconnect();
|
|
210
312
|
},
|
|
211
313
|
clearFlow: chatCache.clearChatCacheFlowState,
|
|
212
|
-
clearThread:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
await saver.deleteThread(threadId);
|
|
216
|
-
}
|
|
217
|
-
await chatCache.clearChatCacheFlowState(threadId);
|
|
218
|
-
},
|
|
314
|
+
clearThread: clearSession,
|
|
315
|
+
clearSession,
|
|
316
|
+
getUsage: usageStore.getThreadUsage,
|
|
219
317
|
getCachedAnswer: chatCache.getCachedAnswer,
|
|
220
318
|
setCachedAnswer: chatCache.setCachedAnswer,
|
|
221
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,13 +1,23 @@
|
|
|
1
|
-
import type { LlmConfig } from "./types.js";
|
|
1
|
+
import type { EmbeddingsProvider, LlmConfig, LlmProvider } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Resolve embeddings backend.
|
|
4
|
+
*
|
|
5
|
+
* - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova).
|
|
6
|
+
* - openrouter is not an embeddings backend → xenova (free).
|
|
7
|
+
* - If unset: ollama chat → ollama embeddings; otherwise → xenova
|
|
8
|
+
* (so OpenRouter/OpenAI chat works in production without local Ollama).
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveEmbeddingsProvider(env: NodeJS.ProcessEnv, chatProvider: LlmProvider): EmbeddingsProvider;
|
|
11
|
+
/**
|
|
12
|
+
* Build LlmConfig from process.env.
|
|
4
13
|
*
|
|
5
14
|
* Env knobs:
|
|
6
|
-
* - LLM_PROVIDER
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
15
|
+
* - LLM_PROVIDER — ollama | openai | openrouter
|
|
16
|
+
* - EMBEDDINGS_PROVIDER — ollama | openai | xenova
|
|
17
|
+
* (default: ollama if LLM is ollama, else xenova)
|
|
18
|
+
* - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
|
|
19
|
+
* - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
20
|
+
* - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
|
|
11
21
|
*/
|
|
12
22
|
export declare function llmConfigFromEnv(env?: NodeJS.ProcessEnv): LlmConfig;
|
|
13
23
|
//# sourceMappingURL=env-llm.d.ts.map
|
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;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,YAAY,EAAE,WAAW,GACxB,kBAAkB,CAmBpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,CAuDX"}
|
package/dist/env-llm.js
CHANGED
|
@@ -1,27 +1,81 @@
|
|
|
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" || normalized === "or") {
|
|
9
|
+
return "openrouter";
|
|
10
|
+
}
|
|
8
11
|
if (normalized === "ollama")
|
|
9
12
|
return "ollama";
|
|
10
13
|
return fallback;
|
|
11
14
|
};
|
|
12
15
|
/**
|
|
13
|
-
*
|
|
16
|
+
* Resolve embeddings backend.
|
|
17
|
+
*
|
|
18
|
+
* - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova).
|
|
19
|
+
* - openrouter is not an embeddings backend → xenova (free).
|
|
20
|
+
* - If unset: ollama chat → ollama embeddings; otherwise → xenova
|
|
21
|
+
* (so OpenRouter/OpenAI chat works in production without local Ollama).
|
|
22
|
+
*/
|
|
23
|
+
export function resolveEmbeddingsProvider(env, chatProvider) {
|
|
24
|
+
const raw = env.EMBEDDINGS_PROVIDER?.trim().toLowerCase();
|
|
25
|
+
if (raw === "openai" || raw === "gpt" || raw === "chatgpt")
|
|
26
|
+
return "openai";
|
|
27
|
+
if (raw === "ollama")
|
|
28
|
+
return "ollama";
|
|
29
|
+
if (raw === "xenova" ||
|
|
30
|
+
raw === "transformers" ||
|
|
31
|
+
raw === "local" ||
|
|
32
|
+
raw === "minilm") {
|
|
33
|
+
return "xenova";
|
|
34
|
+
}
|
|
35
|
+
// OpenRouter has chat only — use free in-process embeddings.
|
|
36
|
+
if (raw === "openrouter" || raw === "or")
|
|
37
|
+
return "xenova";
|
|
38
|
+
// Unset / unknown: prefer ollama only when chat is already ollama.
|
|
39
|
+
if (chatProvider === "ollama")
|
|
40
|
+
return "ollama";
|
|
41
|
+
return "xenova";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Build LlmConfig from process.env.
|
|
14
45
|
*
|
|
15
46
|
* Env knobs:
|
|
16
|
-
* - LLM_PROVIDER
|
|
17
|
-
* -
|
|
18
|
-
*
|
|
19
|
-
* -
|
|
20
|
-
* -
|
|
47
|
+
* - LLM_PROVIDER — ollama | openai | openrouter
|
|
48
|
+
* - EMBEDDINGS_PROVIDER — ollama | openai | xenova
|
|
49
|
+
* (default: ollama if LLM is ollama, else xenova)
|
|
50
|
+
* - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
|
|
51
|
+
* - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
52
|
+
* - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
|
|
21
53
|
*/
|
|
22
54
|
export function llmConfigFromEnv(env = process.env) {
|
|
23
|
-
const provider =
|
|
24
|
-
const embeddingsProvider =
|
|
55
|
+
const provider = asChatProvider(env.LLM_PROVIDER, "ollama");
|
|
56
|
+
const embeddingsProvider = resolveEmbeddingsProvider(env, provider);
|
|
57
|
+
const openrouterBaseUrl = env.OPENROUTER_BASE_URL ?? "https://openrouter.ai/api/v1";
|
|
58
|
+
const ollamaBaseUrl = env.OLLAMA_BASE_URL ?? "http://localhost:11434";
|
|
59
|
+
const resolvedEmbeddingsModel = embeddingsProvider === "openai"
|
|
60
|
+
? (env.OPENAI_EMBEDDINGS_MODEL ?? "text-embedding-3-small")
|
|
61
|
+
: embeddingsProvider === "xenova"
|
|
62
|
+
? (env.XENOVA_EMBEDDINGS_MODEL ?? "Xenova/all-MiniLM-L6-v2")
|
|
63
|
+
: (env.OLLAMA_EMBEDDINGS_MODEL ?? "mxbai-embed-large:latest");
|
|
64
|
+
if (provider === "openrouter") {
|
|
65
|
+
return {
|
|
66
|
+
provider,
|
|
67
|
+
embeddingsProvider,
|
|
68
|
+
model: env.OPENROUTER_MODEL ?? "meta-llama/llama-4-scout",
|
|
69
|
+
intentRouterModel: env.OPENROUTER_INTENT_ROUTER_MODEL ??
|
|
70
|
+
env.OPENROUTER_MODEL ??
|
|
71
|
+
"meta-llama/llama-4-scout",
|
|
72
|
+
embeddingsModel: resolvedEmbeddingsModel,
|
|
73
|
+
baseUrl: openrouterBaseUrl,
|
|
74
|
+
embeddingsBaseUrl: embeddingsProvider === "ollama" ? ollamaBaseUrl : undefined,
|
|
75
|
+
apiKey: env.OPENROUTER_API_KEY,
|
|
76
|
+
embeddingsApiKey: env.OPENAI_API_KEY,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
25
79
|
return {
|
|
26
80
|
provider,
|
|
27
81
|
embeddingsProvider,
|
|
@@ -35,10 +89,10 @@ export function llmConfigFromEnv(env = process.env) {
|
|
|
35
89
|
: (env.INTENT_ROUTER_MODEL ??
|
|
36
90
|
env.OLLAMA_INTENT_ROUTER_MODEL ??
|
|
37
91
|
"qwen2.5:7b"),
|
|
38
|
-
embeddingsModel:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
baseUrl: env.OLLAMA_BASE_URL,
|
|
92
|
+
embeddingsModel: resolvedEmbeddingsModel,
|
|
93
|
+
baseUrl: provider === "openai" ? undefined : ollamaBaseUrl,
|
|
94
|
+
embeddingsBaseUrl: embeddingsProvider === "ollama" ? ollamaBaseUrl : undefined,
|
|
42
95
|
apiKey: env.OPENAI_API_KEY,
|
|
96
|
+
embeddingsApiKey: env.OPENAI_API_KEY,
|
|
43
97
|
};
|
|
44
98
|
}
|
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 } 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,EAAE,gBAAgB,EAAE,MAAM,cAAc,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,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC3E,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"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
export { createAgentRuntime } from "./create-runtime.js";
|
|
2
2
|
export { createModels } from "./llm.js";
|
|
3
|
-
export { llmConfigFromEnv } from "./env-llm.js";
|
|
3
|
+
export { llmConfigFromEnv, resolveEmbeddingsProvider } 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 { defineIntents, withGeneralIntents } from "./intents/define.js";
|
|
9
|
+
export { ragSourcesFromEnv, resolveRagSource, resolveRagSources, isHttpUrl, loadRagDocument, loadRagDocuments, createSimpleRagStore, createSimpleRagFromSources, createSimpleRagFromEnv, getRagStore, getRagDocumentCount, resetRagStore, } from "./rag/index.js";
|
|
5
10
|
export { extractRawToolOutputs, extractToolCallArgs, getToolCallsFromMessages, createToolOutputExtractor, } from "./services/extract.js";
|
|
6
11
|
export { toolOutputMapToExtractors, createCompleteOnFinalize, } from "./services/simple-config.js";
|
|
12
|
+
export { extractTokenUsageFromMessages, emptyTokenCounts, addTokenCounts, } from "./services/token-usage.js";
|
|
7
13
|
export { isWizardInput } from "./services/flow-router.js";
|
|
8
14
|
export { getLastMessageContent } from "./utils/message.js";
|
|
9
15
|
export { normalize } from "./utils/normalize.js";
|