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.
Files changed (52) hide show
  1. package/README.md +8 -2
  2. package/USAGE.md +530 -234
  3. package/dist/agent.d.ts +2 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +36 -4
  6. package/dist/create-runtime.d.ts +14 -4
  7. package/dist/create-runtime.d.ts.map +1 -1
  8. package/dist/create-runtime.js +112 -14
  9. package/dist/embeddings/xenova.d.ts +19 -0
  10. package/dist/embeddings/xenova.d.ts.map +1 -0
  11. package/dist/embeddings/xenova.js +69 -0
  12. package/dist/env-llm.d.ts +17 -7
  13. package/dist/env-llm.d.ts.map +1 -1
  14. package/dist/env-llm.js +67 -13
  15. package/dist/errors.d.ts +10 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +17 -0
  18. package/dist/index.d.ts +11 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +7 -1
  21. package/dist/intents/define.d.ts +35 -0
  22. package/dist/intents/define.d.ts.map +1 -0
  23. package/dist/intents/define.js +52 -0
  24. package/dist/intents/general.d.ts +37 -0
  25. package/dist/intents/general.d.ts.map +1 -0
  26. package/dist/intents/general.js +67 -0
  27. package/dist/llm.d.ts +2 -2
  28. package/dist/llm.d.ts.map +1 -1
  29. package/dist/llm.js +60 -13
  30. package/dist/rag/index.d.ts +67 -0
  31. package/dist/rag/index.d.ts.map +1 -0
  32. package/dist/rag/index.js +138 -0
  33. package/dist/rag/loaders.d.ts +11 -0
  34. package/dist/rag/loaders.d.ts.map +1 -0
  35. package/dist/rag/loaders.js +80 -0
  36. package/dist/rag/sources.d.ts +29 -0
  37. package/dist/rag/sources.d.ts.map +1 -0
  38. package/dist/rag/sources.js +101 -0
  39. package/dist/services/flow-router.d.ts +1 -0
  40. package/dist/services/flow-router.d.ts.map +1 -1
  41. package/dist/services/flow-router.js +12 -0
  42. package/dist/services/intent-embeddings.d.ts.map +1 -1
  43. package/dist/services/intent-embeddings.js +5 -6
  44. package/dist/services/token-usage.d.ts +26 -0
  45. package/dist/services/token-usage.d.ts.map +1 -0
  46. package/dist/services/token-usage.js +63 -0
  47. package/dist/services/usage-store.d.ts +24 -0
  48. package/dist/services/usage-store.d.ts.map +1 -0
  49. package/dist/services/usage-store.js +92 -0
  50. package/dist/types.d.ts +50 -16
  51. package/dist/types.d.ts.map +1 -1
  52. 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
- intentRegistry: IntentRegistry;
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>;
@@ -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;AAGjE,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;AAEF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,GAAG,EAAE,aAAa,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,GAAG,OAAO,CAAC,YAAY,CAAC,CAsCxB"}
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("") ?? [];
@@ -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":"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,CA0OvB"}
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"}
@@ -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 binding = config.intentRegistry[ctx.intent];
123
- if (!binding) {
124
- const fallback = Object.values(config.intentRegistry)[0];
125
- return fallback?.prompt(ctx) ?? "";
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: async (threadId) => {
213
- const saver = agentFactory.checkpointer;
214
- if (typeof saver.deleteThread === "function") {
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
- * Build LlmConfig from process.env (Xel / recharge defaults).
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 / 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
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
@@ -1 +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"}
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 asProvider = (value, fallback) => {
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
- * Build LlmConfig from process.env (Xel / recharge defaults).
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 / 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
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 = asProvider(env.LLM_PROVIDER, "ollama");
24
- const embeddingsProvider = asProvider(env.EMBEDDINGS_PROVIDER ?? env.LLM_PROVIDER, provider);
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: 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,
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
  }
@@ -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
@@ -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;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,GACzB,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,EACb,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,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";