llm-agent-runtime 0.1.16 → 0.1.21
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/USAGE.md +14 -6
- package/dist/agent.d.ts +0 -1
- package/dist/agent.js +1 -69
- package/dist/create-runtime.d.ts +5 -3
- package/dist/create-runtime.js +1 -321
- package/dist/embeddings/xenova.d.ts +0 -1
- package/dist/embeddings/xenova.js +1 -69
- package/dist/env-llm.d.ts +8 -6
- package/dist/env-llm.js +1 -98
- package/dist/errors.d.ts +0 -1
- package/dist/errors.js +1 -17
- package/dist/index.d.ts +2 -3
- package/dist/index.js +1 -15
- package/dist/intents/define.d.ts +0 -1
- package/dist/intents/define.js +1 -52
- package/dist/intents/general.d.ts +0 -1
- package/dist/intents/general.js +1 -67
- package/dist/llm.d.ts +0 -1
- package/dist/llm.js +1 -112
- package/dist/rag/index.d.ts +0 -1
- package/dist/rag/index.js +1 -138
- package/dist/rag/loaders.d.ts +0 -1
- package/dist/rag/loaders.js +1 -80
- package/dist/rag/sources.d.ts +0 -1
- package/dist/rag/sources.js +1 -101
- package/dist/redis.d.ts +0 -1
- package/dist/redis.js +1 -18
- package/dist/services/agent-runner.d.ts +0 -1
- package/dist/services/agent-runner.js +1 -18
- package/dist/services/chat-cache.d.ts +0 -1
- package/dist/services/chat-cache.js +1 -70
- package/dist/services/conversation.d.ts +0 -1
- package/dist/services/conversation.js +1 -68
- package/dist/services/extract.d.ts +0 -1
- package/dist/services/extract.js +1 -64
- package/dist/services/flow-router.d.ts +0 -1
- package/dist/services/flow-router.js +1 -191
- package/dist/services/intent-embeddings.d.ts +0 -1
- package/dist/services/intent-embeddings.js +1 -45
- package/dist/services/intent-router.d.ts +0 -1
- package/dist/services/intent-router.js +1 -98
- package/dist/services/simple-config.d.ts +0 -1
- package/dist/services/simple-config.js +1 -70
- package/dist/services/token-usage.d.ts +10 -5
- package/dist/services/token-usage.js +1 -63
- package/dist/services/usage-store.d.ts +15 -3
- package/dist/services/usage-store.js +1 -92
- package/dist/types.d.ts +4 -4
- package/dist/types.js +1 -1
- package/dist/utils/message.d.ts +0 -1
- package/dist/utils/message.js +1 -13
- package/dist/utils/normalize.d.ts +0 -1
- package/dist/utils/normalize.js +1 -8
- package/package.json +6 -3
- package/dist/agent.d.ts.map +0 -1
- package/dist/create-runtime.d.ts.map +0 -1
- package/dist/embeddings/xenova.d.ts.map +0 -1
- package/dist/env-llm.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/intents/define.d.ts.map +0 -1
- package/dist/intents/general.d.ts.map +0 -1
- package/dist/llm.d.ts.map +0 -1
- package/dist/rag/index.d.ts.map +0 -1
- package/dist/rag/loaders.d.ts.map +0 -1
- package/dist/rag/sources.d.ts.map +0 -1
- package/dist/redis.d.ts.map +0 -1
- package/dist/services/agent-runner.d.ts.map +0 -1
- package/dist/services/chat-cache.d.ts.map +0 -1
- package/dist/services/conversation.d.ts.map +0 -1
- package/dist/services/extract.d.ts.map +0 -1
- package/dist/services/flow-router.d.ts.map +0 -1
- package/dist/services/intent-embeddings.d.ts.map +0 -1
- package/dist/services/intent-router.d.ts.map +0 -1
- package/dist/services/simple-config.d.ts.map +0 -1
- package/dist/services/token-usage.d.ts.map +0 -1
- package/dist/services/usage-store.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/message.d.ts.map +0 -1
- package/dist/utils/normalize.d.ts.map +0 -1
package/USAGE.md
CHANGED
|
@@ -48,10 +48,16 @@ OPENROUTER_API_KEY=sk-or-v1-...
|
|
|
48
48
|
OPENROUTER_MODEL=meta-llama/llama-3.1-70b-instruct
|
|
49
49
|
OPENROUTER_INTENT_ROUTER_MODEL=meta-llama/llama-3.1-70b-instruct
|
|
50
50
|
|
|
51
|
-
# Embeddings —
|
|
51
|
+
# Embeddings — local default for openrouter is xenova (free)
|
|
52
52
|
EMBEDDINGS_PROVIDER=xenova
|
|
53
53
|
# XENOVA_EMBEDDINGS_MODEL=Xenova/all-MiniLM-L6-v2
|
|
54
54
|
|
|
55
|
+
# Vercel / Lambda / Netlify: xenova will NOT load. Set:
|
|
56
|
+
# EMBEDDINGS_PROVIDER=openai
|
|
57
|
+
# OPENAI_API_KEY=sk-...
|
|
58
|
+
# (If OPENAI_API_KEY is set on those hosts, the package auto-selects openai
|
|
59
|
+
# even when EMBEDDINGS_PROVIDER is unset or xenova.)
|
|
60
|
+
|
|
55
61
|
# Optional Redis (flow state / cache). Plain Redis works for cache;
|
|
56
62
|
# Redis Stack (RedisJSON) needed for durable LangGraph checkpoints.
|
|
57
63
|
REDIS_URL=redis://localhost:6379
|
|
@@ -66,9 +72,9 @@ LANGSMITH_PROJECT=my-agent
|
|
|
66
72
|
|
|
67
73
|
| `EMBEDDINGS_PROVIDER` | Cost | When to use |
|
|
68
74
|
| --- | --- | --- |
|
|
69
|
-
| `xenova` | Free |
|
|
75
|
+
| `xenova` | Free | Local default for OpenRouter/OpenAI chat when unset |
|
|
70
76
|
| `ollama` | Free (self-host) | Default when `LLM_PROVIDER=ollama` |
|
|
71
|
-
| `openai` | Paid |
|
|
77
|
+
| `openai` | Paid | **Required on Vercel/serverless**; strongest cloud embeddings |
|
|
72
78
|
|
|
73
79
|
---
|
|
74
80
|
|
|
@@ -577,11 +583,12 @@ await runtime.invoke({
|
|
|
577
583
|
turn: { inputTokens, outputTokens, totalTokens } // this invoke
|
|
578
584
|
flow: { …, intent } // sticky flow bucket
|
|
579
585
|
total: { inputTokens, outputTokens, totalTokens } // whole thread
|
|
586
|
+
intents: Record<string, { inputTokens, outputTokens, totalTokens }> // every intent
|
|
580
587
|
}
|
|
581
588
|
}
|
|
582
589
|
```
|
|
583
590
|
|
|
584
|
-
Token totals are stored in **Redis** when `redisUrl` is set (`usage:thread:{id}`, `usage:flow:{id}:{intent}`), otherwise in memory.
|
|
591
|
+
Token totals are stored in **Redis** when `redisUrl` is set (`usage:thread:{id}`, `usage:flow:{id}:{intent}`, `usage:intent:{id}:{intent}`), otherwise in memory.
|
|
585
592
|
|
|
586
593
|
### Clear session (frontend)
|
|
587
594
|
|
|
@@ -589,7 +596,8 @@ Token totals are stored in **Redis** when `redisUrl` is set (`usage:thread:{id}`
|
|
|
589
596
|
// Clears checkpoint history + sticky flow + token usage for this threadId
|
|
590
597
|
await runtime.clearSession(threadId);
|
|
591
598
|
// aliases: clearThread(threadId) | clearFlow(threadId) only sticky state
|
|
592
|
-
const
|
|
599
|
+
const usage = await runtime.getUsage(threadId);
|
|
600
|
+
// usage.total / usage.flow / usage.intents
|
|
593
601
|
```
|
|
594
602
|
|
|
595
603
|
Example HTTP for the UI “New chat / Clear session” button:
|
|
@@ -684,4 +692,4 @@ import {
|
|
|
684
692
|
|
|
685
693
|
## Version
|
|
686
694
|
|
|
687
|
-
Current local package: **0.1.
|
|
695
|
+
Current local package: **0.1.19** (`TokenUsageReport` with `turn` / `flow` / `total` / `intents`, serverless OpenAI embeddings, `getRagStore`, unified intents).
|
package/dist/agent.d.ts
CHANGED
package/dist/agent.js
CHANGED
|
@@ -1,69 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { MemorySaver } from "@langchain/langgraph-checkpoint";
|
|
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
|
-
}
|
|
39
|
-
export async function createAgentFactory(options) {
|
|
40
|
-
const checkpointer = await createCheckpointer(options.redisUrl, options.checkpointer);
|
|
41
|
-
const fallbackTools = () => {
|
|
42
|
-
const first = Object.values(options.intentRegistry)[0];
|
|
43
|
-
return first?.tools("") ?? [];
|
|
44
|
-
};
|
|
45
|
-
const stateReader = createReactAgent({
|
|
46
|
-
llm: options.llm,
|
|
47
|
-
tools: fallbackTools(),
|
|
48
|
-
checkpointSaver: checkpointer,
|
|
49
|
-
});
|
|
50
|
-
return {
|
|
51
|
-
checkpointer,
|
|
52
|
-
createAgent: (phoneKey, intent) => {
|
|
53
|
-
const tools = intent
|
|
54
|
-
? (options.intentRegistry[intent]?.tools(phoneKey) ?? [])
|
|
55
|
-
: fallbackTools();
|
|
56
|
-
return createReactAgent({
|
|
57
|
-
llm: options.llm,
|
|
58
|
-
tools,
|
|
59
|
-
checkpointSaver: checkpointer,
|
|
60
|
-
});
|
|
61
|
-
},
|
|
62
|
-
getAgentState: async (threadId) => {
|
|
63
|
-
const state = await stateReader.getState({
|
|
64
|
-
configurable: { thread_id: threadId },
|
|
65
|
-
});
|
|
66
|
-
return state;
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
}
|
|
1
|
+
function a0_0x2798(_0x46626c,_0x3671ca){_0x46626c=_0x46626c-0xbf;const _0x27767b=a0_0x2776();let _0x279836=_0x27767b[_0x46626c];return _0x279836;}function a0_0x2776(){const _0x15919e=['268HUNDSt','2124916MfwNoy','jEnaW','QIekl','209511tnJlgA','cbJdr','values','1057220bTCxgu','getState','del','message','OYmgB','fromUrl','connect','[llm-agent-runtime]\x20RedisSaver.fromUrl\x20failed\x20—\x20using\x20in-memory\x20checkpointer:','redisUrl','80PfCQEv','17495ojsEax','now','sendCommand','djDBR','6997566UkwJrw','JSON.SET','Unset\x20REDIS_URL\x20for\x20faster\x20local\x20startup,\x20or\x20set\x20REDIS_ENABLED=true\x20with\x20a\x20reachable\x20Redis\x20Stack.','pcTGn','tools','warn','llm','10736348zeMcuZ','1196394laVHmC','__llm_agent_runtime_probe_','ZgrNd','catch','quit'];a0_0x2776=function(){return _0x15919e;};return a0_0x2776();}(function(_0x5855e3,_0xc72a04){const _0x314b41=a0_0x2798,_0x2a9d65=_0x5855e3();while(!![]){try{const _0x3eb0fc=-parseInt(_0x314b41(0xde))/0x1+parseInt(_0x314b41(0xd8))/0x2+parseInt(_0x314b41(0xd2))/0x3+-parseInt(_0x314b41(0xd7))/0x4*(-parseInt(_0x314b41(0xc6))/0x5)+-parseInt(_0x314b41(0xca))/0x6+parseInt(_0x314b41(0xd1))/0x7+parseInt(_0x314b41(0xc5))/0x8*(-parseInt(_0x314b41(0xdb))/0x9);if(_0x3eb0fc===_0xc72a04)break;else _0x2a9d65['push'](_0x2a9d65['shift']());}catch(_0x22de68){_0x2a9d65['push'](_0x2a9d65['shift']());}}}(a0_0x2776,0xbcc3e));import{createReactAgent}from'@langchain/langgraph/prebuilt';import{MemorySaver}from'@langchain/langgraph-checkpoint';import{RedisSaver}from'@langchain/langgraph-checkpoint-redis';import{createClient}from'redis';async function createCheckpointer(_0x29f934,_0x3b1593){const _0x2a0439=a0_0x2798,_0x18c381={'QIekl':'error','ZgrNd':_0x2a0439(0xcb),'djDBR':function(_0x11c180,_0x5840ef){return _0x11c180+_0x5840ef;},'jEnaW':_0x2a0439(0xcc)};if(_0x3b1593)return _0x3b1593;if(!_0x29f934)return new MemorySaver();const _0xc8078f=createClient({'url':_0x29f934,'socket':{'connectTimeout':0x1388}});_0xc8078f['on'](_0x18c381[_0x2a0439(0xda)],()=>{});try{await _0xc8078f[_0x2a0439(0xc2)]();const _0x5257a5=_0x2a0439(0xd3)+Date[_0x2a0439(0xc7)]();await _0xc8078f[_0x2a0439(0xc8)]([_0x18c381[_0x2a0439(0xd4)],_0x5257a5,'$','{}']),await _0xc8078f[_0x2a0439(0xe0)](_0x5257a5),await _0xc8078f[_0x2a0439(0xd6)]()[_0x2a0439(0xd5)](()=>undefined);}catch{return await _0xc8078f[_0x2a0439(0xd6)]()[_0x2a0439(0xd5)](()=>undefined),console[_0x2a0439(0xcf)](_0x18c381[_0x2a0439(0xc9)]('[llm-agent-runtime]\x20Redis\x20unreachable\x20or\x20missing\x20RedisJSON\x20—\x20using\x20in-memory\x20checkpointer.\x20',_0x18c381[_0x2a0439(0xd9)])),new MemorySaver();}try{return await RedisSaver[_0x2a0439(0xc1)](_0x29f934);}catch(_0x47962d){return console[_0x2a0439(0xcf)](_0x2a0439(0xc3),_0x47962d instanceof Error?_0x47962d[_0x2a0439(0xbf)]:_0x47962d),new MemorySaver();}}export async function createAgentFactory(_0x2c7f9b){const _0x42e45c=a0_0x2798,_0x581f66={'OYmgB':function(_0x254acd,_0x2e9bf5){return _0x254acd(_0x2e9bf5);},'pcTGn':function(_0xf0b3ed,_0x523610,_0x5e4527){return _0xf0b3ed(_0x523610,_0x5e4527);},'cbJdr':function(_0x14e109){return _0x14e109();}},_0x717be5=await _0x581f66[_0x42e45c(0xcd)](createCheckpointer,_0x2c7f9b[_0x42e45c(0xc4)],_0x2c7f9b['checkpointer']),_0x236621=()=>{const _0x1b8d93=_0x42e45c,_0x23453e=Object[_0x1b8d93(0xdd)](_0x2c7f9b['intentRegistry'])[0x0];return _0x23453e?.[_0x1b8d93(0xce)]('')??[];},_0x8fff0b=_0x581f66[_0x42e45c(0xc0)](createReactAgent,{'llm':_0x2c7f9b[_0x42e45c(0xd0)],'tools':_0x581f66[_0x42e45c(0xdc)](_0x236621),'checkpointSaver':_0x717be5});return{'checkpointer':_0x717be5,'createAgent':(_0x374733,_0x11a7e9)=>{const _0x2d666a=_0x42e45c,_0x11a00f=_0x11a7e9?_0x2c7f9b['intentRegistry'][_0x11a7e9]?.['tools'](_0x374733)??[]:_0x236621();return _0x581f66[_0x2d666a(0xc0)](createReactAgent,{'llm':_0x2c7f9b[_0x2d666a(0xd0)],'tools':_0x11a00f,'checkpointSaver':_0x717be5});},'getAgentState':async _0x2a6bf5=>{const _0x36d3e7=_0x42e45c,_0x535c37=await _0x8fff0b[_0x36d3e7(0xdf)]({'configurable':{'thread_id':_0x2a6bf5}});return _0x535c37;}};}
|
package/dist/create-runtime.d.ts
CHANGED
|
@@ -11,8 +11,11 @@ export type AgentRuntime<TContext = unknown> = {
|
|
|
11
11
|
* Same as clearThread + usage wipe.
|
|
12
12
|
*/
|
|
13
13
|
clearSession: (threadId: string) => Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Full token usage for a thread: `total`, sticky `flow`, and per-intent `intents`.
|
|
16
|
+
* `turn` is zeros here (only populated on `invoke`).
|
|
17
|
+
*/
|
|
18
|
+
getUsage: (threadId: string) => Promise<TokenUsageReport>;
|
|
16
19
|
getCachedAnswer: (message: string) => Promise<string | undefined>;
|
|
17
20
|
setCachedAnswer: (message: string, answer: string) => Promise<void>;
|
|
18
21
|
/** Invalidate embedding cache after changing intent examples at runtime. */
|
|
@@ -26,4 +29,3 @@ export type AgentRuntime<TContext = unknown> = {
|
|
|
26
29
|
* `createAgentRuntime<{ userInfo?: { name?: string } }>({ ... })`
|
|
27
30
|
*/
|
|
28
31
|
export declare function createAgentRuntime<TContext = unknown>(config: AgentRuntimeConfig<TContext>): Promise<AgentRuntime<TContext>>;
|
|
29
|
-
//# sourceMappingURL=create-runtime.d.ts.map
|
package/dist/create-runtime.js
CHANGED
|
@@ -1,321 +1 @@
|
|
|
1
|
-
import { createAgentFactory } from "./agent.js";
|
|
2
|
-
import { createModels } from "./llm.js";
|
|
3
|
-
import { llmConfigFromEnv } from "./env-llm.js";
|
|
4
|
-
import { createRedis } from "./redis.js";
|
|
5
|
-
import { createAgentRunner } from "./services/agent-runner.js";
|
|
6
|
-
import { createChatCache } from "./services/chat-cache.js";
|
|
7
|
-
import { createConversationService } from "./services/conversation.js";
|
|
8
|
-
import { createToolOutputExtractor, extractRawToolOutputs } from "./services/extract.js";
|
|
9
|
-
import { createCompleteOnFinalize, toolOutputMapToExtractors, } from "./services/simple-config.js";
|
|
10
|
-
import { createFlowRouter, stickySetFromIntents, } from "./services/flow-router.js";
|
|
11
|
-
import { createIntentEmbeddings } from "./services/intent-embeddings.js";
|
|
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";
|
|
16
|
-
import { getLastMessageContent } from "./utils/message.js";
|
|
17
|
-
/** Messages for this user turn only (used to extract tool outputs). */
|
|
18
|
-
const getTurnMessages = (allMessages, userMessage) => {
|
|
19
|
-
const normalized = userMessage.trim();
|
|
20
|
-
const list = allMessages;
|
|
21
|
-
for (let i = list.length - 1; i >= 0; i--) {
|
|
22
|
-
const content = String(list[i]?.content ?? "").trim();
|
|
23
|
-
if (content === normalized) {
|
|
24
|
-
return list.slice(i);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return list.slice(-6);
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Factory for a reusable agent runtime.
|
|
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 } }>({ ... })`
|
|
35
|
-
*/
|
|
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
|
-
}
|
|
61
|
-
const defaultIntent = config.defaultIntent ?? config.intents[0]?.name ?? "greetings";
|
|
62
|
-
const intentNames = new Set(config.intents.map((i) => i.name));
|
|
63
|
-
const aliases = config.intentAliases ?? {};
|
|
64
|
-
const normalizeIntent = (intent) => {
|
|
65
|
-
const key = intent
|
|
66
|
-
.trim()
|
|
67
|
-
.toLowerCase()
|
|
68
|
-
.replace(/[\s-]+/g, "_");
|
|
69
|
-
if (intentNames.has(key))
|
|
70
|
-
return key;
|
|
71
|
-
return aliases[key] ?? defaultIntent;
|
|
72
|
-
};
|
|
73
|
-
const stickyFlows = stickySetFromIntents(config.intents);
|
|
74
|
-
const menuMap = config.menuMap ?? {};
|
|
75
|
-
const llm = config.llm ?? llmConfigFromEnv();
|
|
76
|
-
const created = createModels(llm);
|
|
77
|
-
const chat = config.models?.chat ?? created.chat;
|
|
78
|
-
const intentRouterModel = config.models?.intentRouter ?? created.intentRouter;
|
|
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
|
-
});
|
|
89
|
-
const fromMap = config.toolOutputMap
|
|
90
|
-
? toolOutputMapToExtractors(config.toolOutputMap)
|
|
91
|
-
: null;
|
|
92
|
-
const toolExtractors = config.toolExtractors ?? fromMap?.toolExtractors;
|
|
93
|
-
const initialToolOutputs = config.initialToolOutputs ?? fromMap?.initialToolOutputs;
|
|
94
|
-
const completeOn = config.completeOn ??
|
|
95
|
-
(config.toolOutputMap ? Object.keys(config.toolOutputMap) : undefined);
|
|
96
|
-
const finalizeFlow = config.finalizeFlow ??
|
|
97
|
-
(completeOn?.length
|
|
98
|
-
? createCompleteOnFinalize({
|
|
99
|
-
completeOn,
|
|
100
|
-
toolOutputMap: config.toolOutputMap,
|
|
101
|
-
})
|
|
102
|
-
: undefined);
|
|
103
|
-
// Redis client when redisUrl is set (flow state + optional answer cache + usage)
|
|
104
|
-
const redis = config.redisUrl
|
|
105
|
-
? createRedis(config.redisUrl)
|
|
106
|
-
: undefined;
|
|
107
|
-
const chatCache = createChatCache({
|
|
108
|
-
redis: redis?.client,
|
|
109
|
-
config: {
|
|
110
|
-
enabled: config.cache?.enabled ?? false,
|
|
111
|
-
ttlSeconds: config.cache?.ttlSeconds,
|
|
112
|
-
flowTtlSeconds: config.cache?.flowTtlSeconds,
|
|
113
|
-
scope: config.cache?.scope,
|
|
114
|
-
},
|
|
115
|
-
});
|
|
116
|
-
const usageStore = createUsageStore({
|
|
117
|
-
redis: redis?.client,
|
|
118
|
-
ttlSeconds: config.cache?.ttlSeconds ?? 60 * 60 * 24 * 7,
|
|
119
|
-
});
|
|
120
|
-
const agentFactory = await createAgentFactory({
|
|
121
|
-
llm: chat,
|
|
122
|
-
intentRegistry: config.intentRegistry,
|
|
123
|
-
redisUrl: config.redisUrl,
|
|
124
|
-
checkpointer: config.checkpointer,
|
|
125
|
-
});
|
|
126
|
-
const conversation = createConversationService(agentFactory);
|
|
127
|
-
const { runAgent } = createAgentRunner({
|
|
128
|
-
agentFactory,
|
|
129
|
-
recursionLimit: config.recursionLimit,
|
|
130
|
-
});
|
|
131
|
-
const intentEmbeddings = createIntentEmbeddings({
|
|
132
|
-
embeddings,
|
|
133
|
-
intents: config.intents,
|
|
134
|
-
normalizeIntent,
|
|
135
|
-
});
|
|
136
|
-
const intentRouter = createIntentRouter({
|
|
137
|
-
model: intentRouterModel,
|
|
138
|
-
intents: config.intents,
|
|
139
|
-
normalizeIntent,
|
|
140
|
-
defaultIntent,
|
|
141
|
-
routerSystemPrompt: config.routerSystemPrompt,
|
|
142
|
-
llmConfidence: config.thresholds?.llmConfidence,
|
|
143
|
-
embeddingConfidence: config.thresholds?.embeddingConfidence,
|
|
144
|
-
});
|
|
145
|
-
const { resolveFlow, finalizeAgentFlow } = createFlowRouter({
|
|
146
|
-
stickyFlows,
|
|
147
|
-
menuMap,
|
|
148
|
-
normalizeIntent,
|
|
149
|
-
intents: config.intents,
|
|
150
|
-
getEmbeddedIntents: intentEmbeddings.getEmbeddedIntents,
|
|
151
|
-
scoreIntentsForMessage: intentEmbeddings.scoreIntentsForMessage,
|
|
152
|
-
classifyIntentWithLlm: intentRouter.classifyIntentWithLlm,
|
|
153
|
-
mergeIntentResults: intentRouter.mergeIntentResults,
|
|
154
|
-
chatCache,
|
|
155
|
-
finalizeFlow,
|
|
156
|
-
thresholds: config.thresholds,
|
|
157
|
-
});
|
|
158
|
-
const extractToolOutputs = config.extractToolOutputs ??
|
|
159
|
-
(toolExtractors
|
|
160
|
-
? createToolOutputExtractor(toolExtractors, initialToolOutputs, {
|
|
161
|
-
includeUnknown: config.includeUnknownToolOutputs ?? false,
|
|
162
|
-
})
|
|
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
|
-
};
|
|
178
|
-
const buildSystemPrompt = config.buildSystemPrompt ??
|
|
179
|
-
((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;
|
|
185
|
-
});
|
|
186
|
-
const resolvePhoneKey = config.resolvePhoneKey ??
|
|
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
|
-
};
|
|
196
|
-
const invoke = async (input) => {
|
|
197
|
-
assertInvokeInput(input);
|
|
198
|
-
if (chatCache.enabled) {
|
|
199
|
-
const cached = await chatCache.getCachedAnswer(input.message);
|
|
200
|
-
if (cached) {
|
|
201
|
-
const total = await usageStore.getThreadUsage(input.threadId);
|
|
202
|
-
return {
|
|
203
|
-
messages: [],
|
|
204
|
-
answer: cached,
|
|
205
|
-
intent: { intent: defaultIntent, score: 1 },
|
|
206
|
-
flow: { active: false, intent: null },
|
|
207
|
-
toolOutputs: {},
|
|
208
|
-
flowCompleted: false,
|
|
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
|
-
},
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
const cachedFlowState = await chatCache.getChatCacheFlowState(input.threadId);
|
|
224
|
-
const [messages, conversationContext] = await Promise.all([
|
|
225
|
-
conversation.getManagedConversationMessages(input.threadId),
|
|
226
|
-
conversation.getConversationContextForIntent(input.threadId),
|
|
227
|
-
]);
|
|
228
|
-
const { messageIntent, flow, promptIntent, llmResult } = await resolveFlow({
|
|
229
|
-
message: input.message,
|
|
230
|
-
explicitIntent: input.explicitIntent,
|
|
231
|
-
cachedFlowState,
|
|
232
|
-
conversationContext,
|
|
233
|
-
});
|
|
234
|
-
const phoneKey = resolvePhoneKey({
|
|
235
|
-
threadId: input.threadId,
|
|
236
|
-
phoneKey: input.phoneKey,
|
|
237
|
-
context: input.context,
|
|
238
|
-
});
|
|
239
|
-
const systemPrompt = buildSystemPrompt({
|
|
240
|
-
hasConversationHistory: messages.length > 0,
|
|
241
|
-
intent: promptIntent,
|
|
242
|
-
intentScore: flow.active ? 1 : messageIntent.score,
|
|
243
|
-
message: input.message,
|
|
244
|
-
context: input.context,
|
|
245
|
-
});
|
|
246
|
-
const result = await runAgent({
|
|
247
|
-
message: input.message,
|
|
248
|
-
threadId: input.threadId,
|
|
249
|
-
messages,
|
|
250
|
-
systemPrompt,
|
|
251
|
-
phoneKey,
|
|
252
|
-
intent: promptIntent,
|
|
253
|
-
});
|
|
254
|
-
const resultMessages = result.messages;
|
|
255
|
-
const turnMessages = getTurnMessages(resultMessages, input.message);
|
|
256
|
-
const toolOutputs = extractToolOutputs(turnMessages);
|
|
257
|
-
const finalized = await finalizeAgentFlow({
|
|
258
|
-
threadId: input.threadId,
|
|
259
|
-
promptIntent,
|
|
260
|
-
flow,
|
|
261
|
-
toolOutputs,
|
|
262
|
-
});
|
|
263
|
-
const answer = getLastMessageContent(resultMessages);
|
|
264
|
-
if (chatCache.enabled && answer) {
|
|
265
|
-
await chatCache.setCachedAnswer(input.message, answer);
|
|
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
|
-
};
|
|
291
|
-
return {
|
|
292
|
-
messages: resultMessages,
|
|
293
|
-
answer,
|
|
294
|
-
intent: messageIntent,
|
|
295
|
-
flow: finalized.flow,
|
|
296
|
-
toolOutputs,
|
|
297
|
-
flowCompleted: finalized.flowCompleted,
|
|
298
|
-
extras: finalized.extras,
|
|
299
|
-
usage,
|
|
300
|
-
...(llmResult
|
|
301
|
-
? { router: { action: llmResult.action, reason: llmResult.reason } }
|
|
302
|
-
: {}),
|
|
303
|
-
};
|
|
304
|
-
};
|
|
305
|
-
return {
|
|
306
|
-
invoke,
|
|
307
|
-
connect: async () => {
|
|
308
|
-
await redis?.connect();
|
|
309
|
-
},
|
|
310
|
-
disconnect: async () => {
|
|
311
|
-
await redis?.disconnect();
|
|
312
|
-
},
|
|
313
|
-
clearFlow: chatCache.clearChatCacheFlowState,
|
|
314
|
-
clearThread: clearSession,
|
|
315
|
-
clearSession,
|
|
316
|
-
getUsage: usageStore.getThreadUsage,
|
|
317
|
-
getCachedAnswer: chatCache.getCachedAnswer,
|
|
318
|
-
setCachedAnswer: chatCache.setCachedAnswer,
|
|
319
|
-
invalidateIntentEmbeddings: intentEmbeddings.invalidate,
|
|
320
|
-
};
|
|
321
|
-
}
|
|
1
|
+
(function(_0x37f28f,_0x1efeb1){const _0x2312bb=a1_0x26c0,_0xd94309=_0x37f28f();while(!![]){try{const _0x38301d=-parseInt(_0x2312bb(0x126))/0x1*(parseInt(_0x2312bb(0xf6))/0x2)+parseInt(_0x2312bb(0x134))/0x3+-parseInt(_0x2312bb(0xfc))/0x4+parseInt(_0x2312bb(0x125))/0x5+parseInt(_0x2312bb(0xc9))/0x6+-parseInt(_0x2312bb(0xdb))/0x7+parseInt(_0x2312bb(0x107))/0x8;if(_0x38301d===_0x1efeb1)break;else _0xd94309['push'](_0xd94309['shift']());}catch(_0x486d89){_0xd94309['push'](_0xd94309['shift']());}}}(a1_0xdce1,0x3b779));import{createAgentFactory}from'./agent.js';import{createModels}from'./llm.js';import{llmConfigFromEnv}from'./env-llm.js';function a1_0x26c0(_0x2dd741,_0x438f87){_0x2dd741=_0x2dd741-0xb3;const _0xdce16d=a1_0xdce1();let _0x26c02a=_0xdce16d[_0x2dd741];return _0x26c02a;}import{createRedis}from'./redis.js';import{createAgentRunner}from'./services/agent-runner.js';import{createChatCache}from'./services/chat-cache.js';import{createConversationService}from'./services/conversation.js';import{createToolOutputExtractor,extractRawToolOutputs}from'./services/extract.js';import{createCompleteOnFinalize,toolOutputMapToExtractors}from'./services/simple-config.js';import{createFlowRouter,stickySetFromIntents}from'./services/flow-router.js';import{createIntentEmbeddings}from'./services/intent-embeddings.js';import{createIntentRouter}from'./services/intent-router.js';function a1_0xdce1(){const _0x5aa009=['initialToolOutputs','phoneKey','vHCvy','config','6763376zhnpID','QXagV','provider','yufJG','GLhOT','getUsageReport','Gxuoi','BEBvA','all','keys','scope','reason','active','ZXWKW','LANGSMITH_PROJECT','YVMIP','xFldO','baseUrl','toolOutputMap','aAuDB','LANGCHAIN_TRACING_V2','uxFQj','llmConfidence','EECKM','intentRegistry','mergeIntentResults','xkeqP','score','jQeQk','intentRouterModel','620230WoxoDA','3799dCkoIe','MkDlt','sharedPrompt','slice','defaultIntent','rkNNI','embeddingsModel','QlqeD','VmghZ','toLowerCase','RhptV','intents','LANGSMITH_API_KEY','threadId','139398SgSPOd','nRfCR','embeddingsProvider','djvnR','length','fssOw','utjSj','getManagedConversationMessages','values','redisUrl','enjVU','embeddingConfidence','thresholds','cdvcu','LANGCHAIN_PROJECT','PCXYe','XHRnh','rPYWG','menuMap','message','getConversationContextForIntent','models','projectName','flow','has','recursionLimit','trim','scoreIntentsForMessage','name','910566LvEQQS','flowTtlSeconds','getCachedAnswer','checkpointer','llm-agent-runtime','messages','tracing','llm','UIxRp','GeWDw','Fhucx','function','nUekq','embeddings','content','buildSystemPrompt','bKhuW','[llm-agent-runtime]\x20models','2969064wsGfal','model','vhEuv','cNHEV','extras','ttlSeconds','log','toolExtractors','uipWy','uZhOM','cache','WJCkC','client','LANGCHAIN_API_KEY','completeOn','LANGSMITH_TRACING','warn','replace','deleteThread','BwQvj','[llm-agent-runtime]\x20LangSmith\x20tracing\x20on','context','iheci','enabled','intent','intentRouter','env','30nVUINe','setCachedAnswer','nOhCN','UIwOX','classifyIntentWithLlm','OtHgO','1771924JoYyHg','flowCompleted','fwBMf','extractToolOutputs','chat','prompt','tsdEE'];a1_0xdce1=function(){return _0x5aa009;};return a1_0xdce1();}import{extractTokenUsageFromMessages}from'./services/token-usage.js';import{createUsageStore}from'./services/usage-store.js';import{assertInvokeInput}from'./errors.js';import{getLastMessageContent}from'./utils/message.js';const getTurnMessages=(_0x4f4d26,_0x5f48a2)=>{const _0x3a9b7a=a1_0x26c0,_0x3b4b9d={'OtHgO':function(_0x2048da,_0x1db9e4){return _0x2048da-_0x1db9e4;},'RSoXj':function(_0x54c578,_0x34919b){return _0x54c578>=_0x34919b;},'YVMIP':function(_0x2d75ba,_0x2f7863){return _0x2d75ba(_0x2f7863);},'rkNNI':function(_0x5b6fba,_0x4a44b8){return _0x5b6fba!==_0x4a44b8;},'WoIvH':'LMUqd'},_0x17069e=_0x5f48a2[_0x3a9b7a(0xc6)](),_0x1799ef=_0x4f4d26;for(let _0x5b7efc=_0x3b4b9d[_0x3a9b7a(0xfb)](_0x1799ef[_0x3a9b7a(0x138)],0x1);_0x3b4b9d['RSoXj'](_0x5b7efc,0x0);_0x5b7efc--){const _0x16cd1f=_0x3b4b9d[_0x3a9b7a(0x116)](String,_0x1799ef[_0x5b7efc]?.[_0x3a9b7a(0xd7)]??'')[_0x3a9b7a(0xc6)]();if(_0x16cd1f===_0x17069e){if(_0x3b4b9d[_0x3a9b7a(0x12b)](_0x3b4b9d['WoIvH'],_0x3b4b9d['WoIvH'])){const _0x365287=_0x70732a[_0x3a9b7a(0xc6)]()['toLowerCase']()['replace'](/[\s-]+/g,'_');if(_0x533cca[_0x3a9b7a(0xc4)](_0x365287))return _0x365287;return _0x14b8c9[_0x365287]??_0x40f3c3;}else return _0x1799ef[_0x3a9b7a(0x129)](_0x5b7efc);}}return _0x1799ef[_0x3a9b7a(0x129)](-0x6);};export async function createAgentRuntime(_0x870a0d){const _0x1f35dc=a1_0x26c0,_0x27c671={'ZXWKW':function(_0x2c8e3e,_0x537387){return _0x2c8e3e!==_0x537387;},'rPYWG':_0x1f35dc(0x102),'BwQvj':function(_0x26769e,_0x130dc5){return _0x26769e===_0x130dc5;},'vHCvy':function(_0x149c72,_0x38b3ec){return _0x149c72(_0x38b3ec);},'WJCkC':_0x1f35dc(0xd4),'nRfCR':_0x1f35dc(0xcd),'nUekq':'true','yufJG':function(_0x490811,_0x1e5dd5){return _0x490811===_0x1e5dd5;},'QXagV':_0x1f35dc(0x11e),'uxFQj':function(_0x4764a1,_0x2b57e9){return _0x4764a1(_0x2b57e9);},'uZhOM':function(_0x15e9a4,_0x2f2eae){return _0x15e9a4||_0x2f2eae;},'GVCuO':function(_0x3c2cef,_0x362541){return _0x3c2cef(_0x362541);},'jwEZy':_0x1f35dc(0xe3),'PCZrp':function(_0x37b28c,_0x46392c){return _0x37b28c===_0x46392c;},'GeWDw':'aAuDB','xkeqP':'[llm-agent-runtime]\x20tracing.enabled\x20but\x20no\x20LANGSMITH_API_KEY\x20/\x20LANGCHAIN_API_KEY\x20set','BEBvA':function(_0x2e180a,_0x141cd){return _0x2e180a===_0x141cd;},'vUhaU':_0x1f35dc(0x13a),'bKhuW':function(_0x75c083,_0x2bd95b){return _0x75c083(_0x2bd95b);},'fwBMf':function(_0xeeb14d,_0x23cb24){return _0xeeb14d>_0x23cb24;},'vhEuv':function(_0x52ba7c,_0x2e35af){return _0x52ba7c(_0x2e35af);},'CDPBe':function(_0x3d4fb4,_0x5e2c23,_0x3de703){return _0x3d4fb4(_0x5e2c23,_0x3de703);},'nOhCN':function(_0x5ef1d0,_0x293ffc){return _0x5ef1d0(_0x293ffc);},'GLhOT':_0x1f35dc(0xd1),'iheci':function(_0x1028bc,_0x48f59f){return _0x1028bc(_0x48f59f);},'ivcyd':'TApWO','xFldO':'KxKKv','QlqeD':_0x1f35dc(0x139),'PjBUa':_0x1f35dc(0xef),'cNHEV':function(_0x263404){return _0x263404();},'UIwOX':function(_0x393dfa,_0x22d21a){return _0x393dfa(_0x22d21a);},'VmghZ':_0x1f35dc(0xda),'OCMTj':function(_0x2f154a,_0x2fba17){return _0x2f154a(_0x2fba17);},'enjVU':function(_0x1c06b6,_0x58a4b5){return _0x1c06b6(_0x58a4b5);},'MueHD':function(_0x13992c,_0x534e9d){return _0x13992c*_0x534e9d;},'cMRTi':function(_0x3bb74b,_0x16fbe0){return _0x3bb74b*_0x16fbe0;}},_0x4e521a=process[_0x1f35dc(0xf5)]['LANGSMITH_API_KEY']?.[_0x1f35dc(0xc6)]()||process[_0x1f35dc(0xf5)][_0x1f35dc(0xe8)]?.[_0x1f35dc(0xc6)]()||undefined,_0x110fe0=_0x870a0d['tracing']?.[_0x1f35dc(0xf2)]??_0x27c671[_0x1f35dc(0x11c)](Boolean,_0x4e521a);if(_0x110fe0){if(!_0x4e521a){if(_0x27c671[_0x1f35dc(0x114)](_0x27c671[_0x1f35dc(0x12d)],_0x1f35dc(0xbc)))console['warn'](_0x27c671['xkeqP']);else{const _0x278108=_0x516d35[_0x1f35dc(0x11f)][_0x43d1f6[_0x1f35dc(0xf3)]];if(!_0x278108){const _0x1f2ba5=_0x3793d4['values'](_0x2c978b['intentRegistry'])[0x0];return _0x1f2ba5?.[_0x1f35dc(0x101)](_0x474dc4)??'';}return _0x278108[_0x1f35dc(0x101)](_0x408eae);}}else{const _0x29fa14=_0x870a0d['tracing']?.[_0x1f35dc(0xc2)]?.[_0x1f35dc(0xc6)]()||process[_0x1f35dc(0xf5)][_0x1f35dc(0x115)]?.[_0x1f35dc(0xc6)]()||process[_0x1f35dc(0xf5)][_0x1f35dc(0xba)]?.[_0x1f35dc(0xc6)]()||_0x27c671[_0x1f35dc(0x135)];process[_0x1f35dc(0xf5)]['LANGCHAIN_TRACING_V2']=_0x27c671[_0x1f35dc(0xd5)],process[_0x1f35dc(0xf5)]['LANGSMITH_TRACING']=_0x27c671[_0x1f35dc(0xd5)],process['env'][_0x1f35dc(0xe8)]=_0x4e521a,process['env']['LANGSMITH_API_KEY']=_0x4e521a,process[_0x1f35dc(0xf5)][_0x1f35dc(0xba)]=_0x29fa14,process['env'][_0x1f35dc(0x115)]=_0x29fa14,console[_0x1f35dc(0xe1)](_0x27c671['PjBUa'],{'project':_0x29fa14});}}const _0x418274=_0x870a0d[_0x1f35dc(0x12a)]??_0x870a0d['intents'][0x0]?.[_0x1f35dc(0xc8)]??'greetings',_0xe8a64d=new Set(_0x870a0d[_0x1f35dc(0x131)]['map'](_0x58a94e=>_0x58a94e[_0x1f35dc(0xc8)])),_0x54f882=_0x870a0d['intentAliases']??{},_0x213fb9=_0x2b6594=>{const _0x39559a=_0x1f35dc,_0x24a50d=_0x2b6594[_0x39559a(0xc6)]()[_0x39559a(0x12f)]()[_0x39559a(0xec)](/[\s-]+/g,'_');if(_0xe8a64d[_0x39559a(0xc4)](_0x24a50d))return _0x24a50d;return _0x54f882[_0x24a50d]??_0x418274;},_0x2a3af8=_0x27c671['uxFQj'](stickySetFromIntents,_0x870a0d[_0x1f35dc(0x131)]),_0x2ad26c=_0x870a0d[_0x1f35dc(0xbe)]??{},_0x23c863=_0x870a0d[_0x1f35dc(0xd0)]??_0x27c671[_0x1f35dc(0xde)](llmConfigFromEnv),_0x316926=_0x27c671[_0x1f35dc(0xf9)](createModels,_0x23c863),_0x4260cf=_0x870a0d[_0x1f35dc(0xc1)]?.[_0x1f35dc(0x100)]??_0x316926[_0x1f35dc(0x100)],_0x202291=_0x870a0d['models']?.[_0x1f35dc(0xf4)]??_0x316926[_0x1f35dc(0xf4)],_0x51997c=_0x870a0d[_0x1f35dc(0xc1)]?.[_0x1f35dc(0xd6)]??_0x316926[_0x1f35dc(0xd6)];console[_0x1f35dc(0xe1)](_0x27c671[_0x1f35dc(0x12e)],{'provider':_0x316926[_0x1f35dc(0x106)][_0x1f35dc(0x109)],'chat':_0x316926[_0x1f35dc(0x106)][_0x1f35dc(0xdc)],'intentRouter':_0x316926['config'][_0x1f35dc(0x124)],'embeddingsProvider':_0x316926[_0x1f35dc(0x106)][_0x1f35dc(0x136)],'embeddings':_0x316926['config'][_0x1f35dc(0x12c)],'baseUrl':_0x23c863[_0x1f35dc(0x118)],'embeddingsBaseUrl':_0x23c863['embeddingsBaseUrl']});const _0x317fe7=_0x870a0d['toolOutputMap']?toolOutputMapToExtractors(_0x870a0d[_0x1f35dc(0x119)]):null,_0x2e2e82=_0x870a0d[_0x1f35dc(0xe2)]??_0x317fe7?.[_0x1f35dc(0xe2)],_0x2459b0=_0x870a0d[_0x1f35dc(0x103)]??_0x317fe7?.[_0x1f35dc(0x103)],_0x11a3ba=_0x870a0d[_0x1f35dc(0xe9)]??(_0x870a0d[_0x1f35dc(0x119)]?Object[_0x1f35dc(0x110)](_0x870a0d[_0x1f35dc(0x119)]):undefined),_0x1bbc8a=_0x870a0d['finalizeFlow']??(_0x11a3ba?.[_0x1f35dc(0x138)]?_0x27c671['OCMTj'](createCompleteOnFinalize,{'completeOn':_0x11a3ba,'toolOutputMap':_0x870a0d[_0x1f35dc(0x119)]}):undefined),_0x30e2de=_0x870a0d[_0x1f35dc(0xb5)]?createRedis(_0x870a0d['redisUrl']):undefined,_0x30f2b6=_0x27c671[_0x1f35dc(0xb6)](createChatCache,{'redis':_0x30e2de?.[_0x1f35dc(0xe7)],'config':{'enabled':_0x870a0d['cache']?.['enabled']??![],'ttlSeconds':_0x870a0d[_0x1f35dc(0xe5)]?.[_0x1f35dc(0xe0)],'flowTtlSeconds':_0x870a0d['cache']?.[_0x1f35dc(0xca)],'scope':_0x870a0d[_0x1f35dc(0xe5)]?.[_0x1f35dc(0x111)]}}),_0xe8ef51=createUsageStore({'redis':_0x30e2de?.[_0x1f35dc(0xe7)],'ttlSeconds':_0x870a0d['cache']?.[_0x1f35dc(0xe0)]??_0x27c671['MueHD'](_0x27c671['cMRTi'](_0x27c671['MueHD'](0x3c,0x3c),0x18),0x7)}),_0x366a80=await _0x27c671[_0x1f35dc(0x11c)](createAgentFactory,{'llm':_0x4260cf,'intentRegistry':_0x870a0d[_0x1f35dc(0x11f)],'redisUrl':_0x870a0d[_0x1f35dc(0xb5)],'checkpointer':_0x870a0d[_0x1f35dc(0xcc)]}),_0x600e73=_0x27c671[_0x1f35dc(0xd9)](createConversationService,_0x366a80),{runAgent:_0x265f80}=createAgentRunner({'agentFactory':_0x366a80,'recursionLimit':_0x870a0d[_0x1f35dc(0xc5)]}),_0x3b0e8b=createIntentEmbeddings({'embeddings':_0x51997c,'intents':_0x870a0d[_0x1f35dc(0x131)],'normalizeIntent':_0x213fb9}),_0x3911e2=_0x27c671[_0x1f35dc(0x11c)](createIntentRouter,{'model':_0x202291,'intents':_0x870a0d[_0x1f35dc(0x131)],'normalizeIntent':_0x213fb9,'defaultIntent':_0x418274,'routerSystemPrompt':_0x870a0d['routerSystemPrompt'],'llmConfidence':_0x870a0d[_0x1f35dc(0xb8)]?.[_0x1f35dc(0x11d)],'embeddingConfidence':_0x870a0d['thresholds']?.[_0x1f35dc(0xb7)]}),{resolveFlow:_0x48042f,finalizeAgentFlow:_0x3aeaee}=createFlowRouter({'stickyFlows':_0x2a3af8,'menuMap':_0x2ad26c,'normalizeIntent':_0x213fb9,'intents':_0x870a0d[_0x1f35dc(0x131)],'getEmbeddedIntents':_0x3b0e8b['getEmbeddedIntents'],'scoreIntentsForMessage':_0x3b0e8b[_0x1f35dc(0xc7)],'classifyIntentWithLlm':_0x3911e2[_0x1f35dc(0xfa)],'mergeIntentResults':_0x3911e2[_0x1f35dc(0x120)],'chatCache':_0x30f2b6,'finalizeFlow':_0x1bbc8a,'thresholds':_0x870a0d[_0x1f35dc(0xb8)]}),_0x2f8733=_0x870a0d[_0x1f35dc(0xff)]??(_0x2e2e82?createToolOutputExtractor(_0x2e2e82,_0x2459b0,{'includeUnknown':_0x870a0d['includeUnknownToolOutputs']??![]}):extractRawToolOutputs),_0x67fadb=_0x2890ff=>{const _0x1e682e=_0x1f35dc;if(_0x27c671[_0x1e682e(0x114)](_0x27c671['rPYWG'],_0x27c671[_0x1e682e(0xbd)]))return _0xa04e90['slice'](_0x599055);else{const _0x377b2f=_0x870a0d[_0x1e682e(0x128)];if(!_0x377b2f)return'';return _0x27c671[_0x1e682e(0xee)](typeof _0x377b2f,_0x1e682e(0xd4))?_0x27c671[_0x1e682e(0x105)](_0x377b2f,_0x2890ff):_0x377b2f;}},_0x21fd50=_0x23d23f=>{const _0x18a528=_0x1f35dc,_0x1d9b1e={'PCXYe':_0x27c671['nRfCR'],'cdvcu':_0x27c671[_0x18a528(0xd5)],'Fhucx':_0x18a528(0xef)};if(_0x27c671[_0x18a528(0x10a)](_0x27c671['QXagV'],_0x27c671[_0x18a528(0x108)])){const _0x25f7ca=_0x870a0d['intentRegistry'][_0x23d23f[_0x18a528(0xf3)]];if(!_0x25f7ca){if(_0x27c671['BwQvj'](_0x18a528(0x127),_0x18a528(0x137))){const _0xd2ac9b=_0x1ee463['sharedPrompt'];if(!_0xd2ac9b)return'';return typeof _0xd2ac9b===_0x27c671[_0x18a528(0xe6)]?_0x27c671[_0x18a528(0x105)](_0xd2ac9b,_0x1141a4):_0xd2ac9b;}else{const _0x5371d2=Object[_0x18a528(0xb4)](_0x870a0d['intentRegistry'])[0x0];return _0x5371d2?.[_0x18a528(0x101)](_0x23d23f)??'';}}return _0x25f7ca[_0x18a528(0x101)](_0x23d23f);}else{const _0x1dc4e5=_0x34b935['tracing']?.[_0x18a528(0xc2)]?.[_0x18a528(0xc6)]()||_0x2a642b['env'][_0x18a528(0x115)]?.['trim']()||_0x56f2f0[_0x18a528(0xf5)][_0x18a528(0xba)]?.[_0x18a528(0xc6)]()||_0x1d9b1e[_0x18a528(0xbb)];_0x4f61fd[_0x18a528(0xf5)][_0x18a528(0x11b)]=_0x1d9b1e[_0x18a528(0xb9)],_0x1e955b[_0x18a528(0xf5)][_0x18a528(0xea)]=_0x1d9b1e['cdvcu'],_0x56ee72['env'][_0x18a528(0xe8)]=_0x5b9e29,_0x35f8a3['env'][_0x18a528(0x132)]=_0xa5754,_0x25e463[_0x18a528(0xf5)]['LANGCHAIN_PROJECT']=_0x1dc4e5,_0x3f3fe8[_0x18a528(0xf5)][_0x18a528(0x115)]=_0x1dc4e5,_0x1f1fb1['log'](_0x1d9b1e[_0x18a528(0xd3)],{'project':_0x1dc4e5});}},_0x19fd33=_0x870a0d[_0x1f35dc(0xd8)]??(_0xd29617=>{const _0x256d8b=_0x1f35dc,_0x3576d5=_0x27c671[_0x256d8b(0x11c)](_0x67fadb,_0xd29617)[_0x256d8b(0xc6)](),_0xfcc4e=_0x27c671['uxFQj'](_0x21fd50,_0xd29617)[_0x256d8b(0xc6)]();if(_0x3576d5&&_0xfcc4e)return _0x3576d5+'\x0a\x0a'+_0xfcc4e;return _0x3576d5||_0xfcc4e;}),_0x5572e4=_0x870a0d['resolvePhoneKey']??(({threadId:_0x27a257,phoneKey:_0x124f33})=>_0x124f33??_0x27a257),_0x3d61e6=async _0x296a96=>{const _0x82b791=_0x1f35dc,_0x2fd116={'Gxuoi':function(_0x396c78,_0x45c789){return _0x27c671['GVCuO'](_0x396c78,_0x45c789);},'RhptV':function(_0x19e8a4,_0x3cfb1b){const _0x1297b6=a1_0x26c0;return _0x27c671[_0x1297b6(0x10a)](_0x19e8a4,_0x3cfb1b);}};if(_0x27c671['jwEZy']===_0x27c671['jwEZy']){const _0x9b4ed3=_0x366a80[_0x82b791(0xcc)];if(_0x27c671['PCZrp'](typeof _0x9b4ed3[_0x82b791(0xed)],_0x27c671[_0x82b791(0xe6)])){if(_0x82b791(0x11a)===_0x27c671[_0x82b791(0xd2)])await _0x9b4ed3['deleteThread'](_0x296a96);else{const _0x474fbf=_0x2fd116[_0x82b791(0x10d)](_0x402ccf,_0xc3c471[_0x2dc48b]?.[_0x82b791(0xd7)]??'')['trim']();if(_0x2fd116[_0x82b791(0x130)](_0x474fbf,_0x4d6e2d))return _0x24a118[_0x82b791(0x129)](_0x505274);}}await _0x30f2b6['clearChatCacheFlowState'](_0x296a96),await _0xe8ef51['clearThreadUsage'](_0x296a96);}else{const _0x40aaa3=_0x27c671[_0x82b791(0x11c)](_0x392684,_0x37c1b2)[_0x82b791(0xc6)](),_0x454f02=_0x4a3ac5(_0xa1535c)[_0x82b791(0xc6)]();if(_0x40aaa3&&_0x454f02)return _0x40aaa3+'\x0a\x0a'+_0x454f02;return _0x27c671[_0x82b791(0xe4)](_0x40aaa3,_0x454f02);}},_0xefbb6b=async _0x29f054=>{const _0x4a7c21=_0x1f35dc;_0x27c671['GVCuO'](assertInvokeInput,_0x29f054);if(_0x30f2b6[_0x4a7c21(0xf2)]){const _0x2026b6=await _0x30f2b6[_0x4a7c21(0xcb)](_0x29f054[_0x4a7c21(0xbf)]);if(_0x2026b6){if(_0x27c671[_0x4a7c21(0x10e)](_0x27c671['vUhaU'],'utjSj')){const _0x2f842c=await _0xe8ef51['getUsageReport'](_0x29f054[_0x4a7c21(0x133)]);return{'messages':[],'answer':_0x2026b6,'intent':{'intent':_0x418274,'score':0x1},'flow':{'active':![],'intent':null},'toolOutputs':{},'flowCompleted':![],'extras':{'cacheHit':!![]},'usage':_0x2f842c};}else _0x5a8939['warn'](_0x27c671[_0x4a7c21(0x121)]);}}const _0x32c514=await _0x30f2b6['getChatCacheFlowState'](_0x29f054[_0x4a7c21(0x133)]),[_0x4449ae,_0x1fed1d]=await Promise[_0x4a7c21(0x10f)]([_0x600e73[_0x4a7c21(0xb3)](_0x29f054['threadId']),_0x600e73[_0x4a7c21(0xc0)](_0x29f054[_0x4a7c21(0x133)])]),{messageIntent:_0x133fcc,flow:_0x33595b,promptIntent:_0x121dae,llmResult:_0x19ed74}=await _0x48042f({'message':_0x29f054[_0x4a7c21(0xbf)],'explicitIntent':_0x29f054['explicitIntent'],'cachedFlowState':_0x32c514,'conversationContext':_0x1fed1d}),_0xb646b6=_0x27c671['uxFQj'](_0x5572e4,{'threadId':_0x29f054[_0x4a7c21(0x133)],'phoneKey':_0x29f054[_0x4a7c21(0x104)],'context':_0x29f054[_0x4a7c21(0xf0)]}),_0x290034=_0x27c671['bKhuW'](_0x19fd33,{'hasConversationHistory':_0x27c671[_0x4a7c21(0xfe)](_0x4449ae[_0x4a7c21(0x138)],0x0),'intent':_0x121dae,'intentScore':_0x33595b[_0x4a7c21(0x113)]?0x1:_0x133fcc[_0x4a7c21(0x122)],'message':_0x29f054[_0x4a7c21(0xbf)],'context':_0x29f054['context']}),_0x538c35=await _0x27c671[_0x4a7c21(0xdd)](_0x265f80,{'message':_0x29f054[_0x4a7c21(0xbf)],'threadId':_0x29f054[_0x4a7c21(0x133)],'messages':_0x4449ae,'systemPrompt':_0x290034,'phoneKey':_0xb646b6,'intent':_0x121dae}),_0x3f14cc=_0x538c35[_0x4a7c21(0xce)],_0x144220=_0x27c671['CDPBe'](getTurnMessages,_0x3f14cc,_0x29f054[_0x4a7c21(0xbf)]),_0x3a6f63=_0x27c671[_0x4a7c21(0xf8)](_0x2f8733,_0x144220),_0x4a0ccc=await _0x3aeaee({'threadId':_0x29f054[_0x4a7c21(0x133)],'promptIntent':_0x121dae,'flow':_0x33595b,'toolOutputs':_0x3a6f63}),_0x59cdcb=getLastMessageContent(_0x3f14cc);if(_0x30f2b6[_0x4a7c21(0xf2)]&&_0x59cdcb){if(_0x27c671[_0x4a7c21(0x10b)]!==_0x4a7c21(0x123))await _0x30f2b6[_0x4a7c21(0xf7)](_0x29f054[_0x4a7c21(0xbf)],_0x59cdcb);else{if(!_0xd43cbd)_0x469bd4[_0x4a7c21(0xeb)](_0x27c671[_0x4a7c21(0x121)]);else{const _0x592a31=_0x108a96[_0x4a7c21(0xcf)]?.[_0x4a7c21(0xc2)]?.[_0x4a7c21(0xc6)]()||_0x448cdd['env'][_0x4a7c21(0x115)]?.[_0x4a7c21(0xc6)]()||_0x4ddd57[_0x4a7c21(0xf5)][_0x4a7c21(0xba)]?.[_0x4a7c21(0xc6)]()||_0x4a7c21(0xcd);_0x2592d5[_0x4a7c21(0xf5)][_0x4a7c21(0x11b)]=_0x27c671[_0x4a7c21(0xd5)],_0x2eaeb5['env'][_0x4a7c21(0xea)]=_0x27c671[_0x4a7c21(0xd5)],_0x1ea219[_0x4a7c21(0xf5)][_0x4a7c21(0xe8)]=_0x1e7498,_0x5cc36c[_0x4a7c21(0xf5)]['LANGSMITH_API_KEY']=_0x3afa23,_0x2f46dc['env']['LANGCHAIN_PROJECT']=_0x592a31,_0x20e6af[_0x4a7c21(0xf5)][_0x4a7c21(0x115)]=_0x592a31,_0x3273c1['log'](_0x4a7c21(0xef),{'project':_0x592a31});}}}const _0x523642=_0x27c671[_0x4a7c21(0xf1)](extractTokenUsageFromMessages,_0x144220),_0x35c8e5=_0x133fcc['intent']||_0x121dae||null,_0x33b048=_0x4a0ccc['flow'][_0x4a7c21(0x113)]&&_0x4a0ccc[_0x4a7c21(0xc3)][_0x4a7c21(0xf3)]?_0x4a0ccc['flow'][_0x4a7c21(0xf3)]:_0x2a3af8[_0x4a7c21(0xc4)](_0x121dae)?_0x121dae:null,{total:_0x20fa49,flow:_0x33201c,intents:_0x487877}=await _0xe8ef51['recordTurn']({'threadId':_0x29f054[_0x4a7c21(0x133)],'intent':_0x35c8e5,'flowIntent':_0x33b048,'turn':_0x523642});if(_0x4a0ccc[_0x4a7c21(0xfd)]&&_0x33b048){if(_0x27c671['ivcyd']===_0x27c671[_0x4a7c21(0x117)]){const _0x520e21=_0x373a34[_0x4a7c21(0xb4)](_0x3bf335['intentRegistry'])[0x0];return _0x520e21?.[_0x4a7c21(0x101)](_0x568617)??'';}else await _0xe8ef51['clearFlowUsage'](_0x29f054[_0x4a7c21(0x133)],_0x33b048);}const _0x42feee={'turn':_0x523642,'flow':{..._0x33201c,'intent':_0x33b048},'total':_0x20fa49,'intents':_0x487877};return{'messages':_0x3f14cc,'answer':_0x59cdcb,'intent':_0x133fcc,'flow':_0x4a0ccc[_0x4a7c21(0xc3)],'toolOutputs':_0x3a6f63,'flowCompleted':_0x4a0ccc[_0x4a7c21(0xfd)],'extras':_0x4a0ccc[_0x4a7c21(0xdf)],'usage':_0x42feee,..._0x19ed74?{'router':{'action':_0x19ed74['action'],'reason':_0x19ed74[_0x4a7c21(0x112)]}}:{}};};return{'invoke':_0xefbb6b,'connect':async()=>{await _0x30e2de?.['connect']();},'disconnect':async()=>{await _0x30e2de?.['disconnect']();},'clearFlow':_0x30f2b6['clearChatCacheFlowState'],'clearThread':_0x3d61e6,'clearSession':_0x3d61e6,'getUsage':_0x56ba1d=>_0xe8ef51[_0x1f35dc(0x10c)](_0x56ba1d),'getCachedAnswer':_0x30f2b6[_0x1f35dc(0xcb)],'setCachedAnswer':_0x30f2b6[_0x1f35dc(0xf7)],'invalidateIntentEmbeddings':_0x3b0e8b['invalidate']};}
|
|
@@ -1,69 +1 @@
|
|
|
1
|
-
|
|
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
|
-
}
|
|
1
|
+
const a2_0x418009=a2_0x1bd0;(function(_0xef6c1e,_0x58eba6){const _0x49f50e=a2_0x1bd0,_0x4f8f04=_0xef6c1e();while(!![]){try{const _0x15eae3=parseInt(_0x49f50e(0x17b))/0x1+-parseInt(_0x49f50e(0x167))/0x2+parseInt(_0x49f50e(0x166))/0x3+parseInt(_0x49f50e(0x177))/0x4*(parseInt(_0x49f50e(0x165))/0x5)+parseInt(_0x49f50e(0x16f))/0x6*(parseInt(_0x49f50e(0x181))/0x7)+-parseInt(_0x49f50e(0x15d))/0x8+-parseInt(_0x49f50e(0x16b))/0x9*(-parseInt(_0x49f50e(0x17c))/0xa);if(_0x15eae3===_0x58eba6)break;else _0x4f8f04['push'](_0x4f8f04['shift']());}catch(_0x50c3be){_0x4f8f04['push'](_0x4f8f04['shift']());}}}(a2_0x556a,0x3cc49));function a2_0x556a(){const _0x26ba90=['UgmyZ','mean','pasgn','HFWMn','onLnK','resolve','cwd\x20resolve:\x20','175OTQSvV','122283KvQmIY','945954tZudxN','package.json','map','push','1017zhReIA','\x20\x20-\x20','VSGBt','model','214836uIJLKh','pgwUy','feature-extraction','RsZRK','message','WNHLM','embedDocuments','embedQuery','37624DzsbbC','UqqHr','pipelinePromise','cwd','395121kuuECz','26830hUlRja','toVector','from','getPipeline','pipeline','7UGfRCB','@xenova/transformers','embeddingsProvider\x20\x22xenova\x22\x20could\x20not\x20load\x20@xenova/transformers.','LnHSo','data','join','tolist','3057560QoDMlJ'];a2_0x556a=function(){return _0x26ba90;};return a2_0x556a();}function a2_0x1bd0(_0x436b2c,_0x469d56){_0x436b2c=_0x436b2c-0x15a;const _0x556af0=a2_0x556a();let _0x1bd087=_0x556af0[_0x436b2c];return _0x1bd087;}import{Embeddings}from'@langchain/core/embeddings';import{createRequire}from'node:module';import a2_0x45d84b from'node:path';import{pathToFileURL}from'node:url';async function loadXenovaTransformers(){const _0x4ada97=a2_0x1bd0,_0x3c7e30={'UqqHr':function(_0xb981c4,_0x4be3b6){return _0xb981c4(_0x4be3b6);},'xJsFb':function(_0x39f74b,_0x2556e0){return _0x39f74b(_0x2556e0);},'pgwUy':_0x4ada97(0x168),'VSGBt':function(_0x4c0af3,_0x398cf2){return _0x4c0af3 instanceof _0x398cf2;},'EdEsv':function(_0x4242fb,_0x302326){return _0x4242fb(_0x302326);},'onLnK':_0x4ada97(0x183),'zNARI':'Install\x20in\x20your\x20app:\x20pnpm\x20add\x20@xenova/transformers','LnHSo':'If\x20you\x20see\x20a\x20sharp\x20error,\x20rebuild\x20native\x20deps:\x20pnpm\x20rebuild\x20sharp\x20--config.ignore-scripts=false'},_0x3d1820=[];try{return await import('@xenova/transformers');}catch(_0x3bf9de){_0x3d1820[_0x4ada97(0x16a)]('package\x20import:\x20'+(_0x3bf9de instanceof Error?_0x3bf9de[_0x4ada97(0x173)]:_0x3c7e30[_0x4ada97(0x178)](String,_0x3bf9de)));}try{const _0x4b52c3=_0x3c7e30['xJsFb'](createRequire,a2_0x45d84b['join'](process[_0x4ada97(0x17a)](),_0x3c7e30[_0x4ada97(0x170)])),_0x2b3984=_0x4b52c3[_0x4ada97(0x163)](_0x4ada97(0x182));return await import(pathToFileURL(_0x2b3984).href);}catch(_0x1880ac){_0x3d1820[_0x4ada97(0x16a)](_0x4ada97(0x164)+(_0x3c7e30[_0x4ada97(0x16d)](_0x1880ac,Error)?_0x1880ac[_0x4ada97(0x173)]:_0x3c7e30['EdEsv'](String,_0x1880ac)));}throw new Error([_0x3c7e30[_0x4ada97(0x162)],_0x3c7e30['zNARI'],_0x3c7e30[_0x4ada97(0x184)],..._0x3d1820[_0x4ada97(0x169)](_0x9da1f=>_0x4ada97(0x16c)+_0x9da1f['split']('\x0a')[0x0])][_0x4ada97(0x15b)]('\x0a'));}export class XenovaEmbeddings extends Embeddings{['model'];['pipelinePromise']=null;constructor(_0x1f14e7){const _0x3c88b5=a2_0x1bd0,_0x627dff={'IScun':function(_0x341864,_0xa81492){return _0x341864??_0xa81492;},'HFWMn':'Xenova/all-MiniLM-L6-v2'};super(_0x627dff['IScun'](_0x1f14e7,{})),this[_0x3c88b5(0x16e)]=_0x1f14e7?.[_0x3c88b5(0x16e)]??_0x627dff[_0x3c88b5(0x161)];}async[a2_0x418009(0x17f)](){const _0x33a176=a2_0x418009,_0x4edc4b={'pasgn':function(_0x5e5c45){return _0x5e5c45();}};return!this[_0x33a176(0x179)]&&(this[_0x33a176(0x179)]=((async()=>{const _0x10aa1f=_0x33a176,_0x39c720=await _0x4edc4b[_0x10aa1f(0x160)](loadXenovaTransformers);return _0x39c720[_0x10aa1f(0x180)](_0x10aa1f(0x171),this[_0x10aa1f(0x16e)]);})())),this[_0x33a176(0x179)];}[a2_0x418009(0x17d)](_0x24d61a){const _0x13861b=a2_0x418009,_0x242207={'EFJtL':function(_0x29c81a,_0x163bcb){return _0x29c81a===_0x163bcb;},'UgmyZ':'function'};if(_0x242207['EFJtL'](typeof _0x24d61a['tolist'],_0x242207[_0x13861b(0x15e)])){const _0x48f102=_0x24d61a[_0x13861b(0x15c)]();return Array['isArray'](_0x48f102[0x0])?_0x48f102[0x0]:_0x48f102;}return Array[_0x13861b(0x17e)](_0x24d61a[_0x13861b(0x15a)]);}async[a2_0x418009(0x175)](_0x5b80fc){const _0x827e1f=a2_0x418009,_0x4de9eb={'RsZRK':function(_0x107c71,_0x29ed2a,_0x3c6adb){return _0x107c71(_0x29ed2a,_0x3c6adb);},'WNHLM':_0x827e1f(0x15f)},_0x93075d=await this['getPipeline'](),_0x311ee9=[];for(const _0x3f939c of _0x5b80fc){const _0x443954=await _0x4de9eb[_0x827e1f(0x172)](_0x93075d,_0x3f939c,{'pooling':_0x4de9eb[_0x827e1f(0x174)],'normalize':!![]});_0x311ee9[_0x827e1f(0x16a)](this[_0x827e1f(0x17d)](_0x443954));}return _0x311ee9;}async[a2_0x418009(0x176)](_0xabf3d){const [_0x3c2aef]=await this['embedDocuments']([_0xabf3d]);return _0x3c2aef??[];}}
|
package/dist/env-llm.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
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;
|
|
2
4
|
/**
|
|
3
5
|
* Resolve embeddings backend.
|
|
4
6
|
*
|
|
5
|
-
* - Explicit EMBEDDINGS_PROVIDER wins (ollama | openai | xenova)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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.
|
|
9
12
|
*/
|
|
10
13
|
export declare function resolveEmbeddingsProvider(env: NodeJS.ProcessEnv, chatProvider: LlmProvider): EmbeddingsProvider;
|
|
11
14
|
/**
|
|
@@ -14,10 +17,9 @@ export declare function resolveEmbeddingsProvider(env: NodeJS.ProcessEnv, chatPr
|
|
|
14
17
|
* Env knobs:
|
|
15
18
|
* - LLM_PROVIDER — ollama | openai | openrouter
|
|
16
19
|
* - EMBEDDINGS_PROVIDER — ollama | openai | xenova
|
|
17
|
-
* (default: ollama if LLM is ollama
|
|
20
|
+
* (default: ollama if LLM is ollama; openai on Vercel/Lambda when OPENAI_API_KEY set; else xenova)
|
|
18
21
|
* - OLLAMA_MODEL / OPENAI_MODEL / OPENROUTER_MODEL
|
|
19
22
|
* - XENOVA_EMBEDDINGS_MODEL / OLLAMA_EMBEDDINGS_MODEL / OPENAI_EMBEDDINGS_MODEL
|
|
20
23
|
* - OLLAMA_BASE_URL / OPENAI_API_KEY / OPENROUTER_API_KEY / OPENROUTER_BASE_URL
|
|
21
24
|
*/
|
|
22
25
|
export declare function llmConfigFromEnv(env?: NodeJS.ProcessEnv): LlmConfig;
|
|
23
|
-
//# sourceMappingURL=env-llm.d.ts.map
|