@delofarag/ai-utils 1.3.5 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -30
- package/dist/heart/agent.d.ts +24 -29
- package/dist/heart/agent.d.ts.map +1 -1
- package/dist/heart/agent.js +62 -70
- package/dist/heart/agent.js.map +1 -1
- package/dist/heart/chain.d.ts +29 -15
- package/dist/heart/chain.d.ts.map +1 -1
- package/dist/heart/chain.js +33 -27
- package/dist/heart/chain.js.map +1 -1
- package/dist/heart/chatbot.d.ts +22 -18
- package/dist/heart/chatbot.d.ts.map +1 -1
- package/dist/heart/chatbot.js +30 -56
- package/dist/heart/chatbot.js.map +1 -1
- package/dist/heart/memorychain.d.ts +16 -13
- package/dist/heart/memorychain.d.ts.map +1 -1
- package/dist/heart/memorychain.js +26 -15
- package/dist/heart/memorychain.js.map +1 -1
- package/dist/heart/tools/RAGTool 2.d.ts +1 -0
- package/dist/heart/tools/RAGTool 2.d.ts.map +1 -0
- package/dist/heart/tools/RAGTool 2.js +2 -0
- package/dist/heart/tools/RAGTool 2.js.map +1 -0
- package/dist/heart/tools/RAGTool.d.ts +20 -0
- package/dist/heart/tools/RAGTool.d.ts.map +1 -0
- package/dist/heart/tools/RAGTool.js +15 -0
- package/dist/heart/tools/RAGTool.js.map +1 -0
- package/dist/heart/tools/Tavily.d.ts.map +1 -1
- package/dist/heart/tools/Tavily.js.map +1 -1
- package/dist/heart/tools/ToolRegistry.d.ts +19 -0
- package/dist/heart/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/heart/tools/ToolRegistry.js +64 -0
- package/dist/heart/tools/ToolRegistry.js.map +1 -0
- package/dist/heart/tools/zodios/CombinedRegistry.d.ts +41 -0
- package/dist/heart/tools/zodios/CombinedRegistry.d.ts.map +1 -0
- package/dist/heart/tools/zodios/CombinedRegistry.js +58 -0
- package/dist/heart/tools/zodios/CombinedRegistry.js.map +1 -0
- package/dist/heart/tools/zodios/ZodiosToolRegistry.d.ts +22 -0
- package/dist/heart/tools/zodios/ZodiosToolRegistry.d.ts.map +1 -0
- package/dist/heart/tools/zodios/ZodiosToolRegistry.js +80 -0
- package/dist/heart/tools/zodios/ZodiosToolRegistry.js.map +1 -0
- package/dist/helpers.d.ts +10 -6
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +3 -3
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/magic-funcs/decide.d.ts +1 -0
- package/dist/magic-funcs/decide.d.ts.map +1 -0
- package/dist/magic-funcs/decide.js +2 -0
- package/dist/magic-funcs/decide.js.map +1 -0
- package/dist/magic-funcs/extract.d.ts +1 -0
- package/dist/magic-funcs/extract.d.ts.map +1 -0
- package/dist/magic-funcs/extract.js +2 -0
- package/dist/magic-funcs/extract.js.map +1 -0
- package/dist/magic-funcs/parsers/structure.d.ts +2 -1
- package/dist/magic-funcs/parsers/structure.d.ts.map +1 -1
- package/dist/magic-funcs/parsers/structure.js.map +1 -1
- package/dist/magic-funcs/structure.d.ts +1 -0
- package/dist/magic-funcs/structure.d.ts.map +1 -0
- package/dist/magic-funcs/structure.js +2 -0
- package/dist/magic-funcs/structure.js.map +1 -0
- package/dist/magic-funcs/summarize.d.ts +1 -0
- package/dist/magic-funcs/summarize.d.ts.map +1 -0
- package/dist/magic-funcs/summarize.js +2 -0
- package/dist/magic-funcs/summarize.js.map +1 -0
- package/dist/memory.d.ts +4 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +11 -9
- package/dist/memory.js.map +1 -1
- package/dist/rag.d.ts +7 -27
- package/dist/rag.d.ts.map +1 -1
- package/dist/rag.js +6 -18
- package/dist/rag.js.map +1 -1
- package/package.json +8 -7
package/README.md
CHANGED
|
@@ -29,25 +29,26 @@ Du kannst jederzeit ein eigenes LLM übergeben (z.B. anderes Modell, anderer Pro
|
|
|
29
29
|
|
|
30
30
|
### 1. Chain
|
|
31
31
|
|
|
32
|
-
**Was:** Stateless LLM-Chain mit strukturiertem Output (Zod-Schema) und optionalem RAG.
|
|
32
|
+
**Was:** Stateless LLM-Chain mit strukturiertem Output (Zod-Schema) und optionalem RAG. Für `output` (Zod v3) kannst du **z.object()** oder **z.record()** verwenden.
|
|
33
33
|
|
|
34
34
|
**Wann:** Einmalige Abfragen ohne Konversationsgedächtnis. Ideal für formularähnliche Eingabe → strukturierte Ausgabe.
|
|
35
35
|
|
|
36
36
|
**Initialisierung:**
|
|
37
37
|
|
|
38
38
|
```ts
|
|
39
|
-
import { Chain,
|
|
39
|
+
import { Chain, DEFAULT_OUTPUT_SCHEMA } from "@delofarag/ai-utils"
|
|
40
40
|
import { z } from "zod/v3"
|
|
41
41
|
|
|
42
|
-
const
|
|
42
|
+
const output = z.object({
|
|
43
43
|
output: z.string().describe("Deine Antwort"),
|
|
44
44
|
score: z.number().optional()
|
|
45
45
|
})
|
|
46
|
+
// alternativ: z.record(z.string()) für beliebige Key-Value-Struktur
|
|
46
47
|
|
|
47
48
|
const chain = new Chain({
|
|
48
49
|
prompt: "Du bist ein hilfreicher Assistent.",
|
|
49
50
|
// llm optional – Default: Groq
|
|
50
|
-
|
|
51
|
+
output
|
|
51
52
|
})
|
|
52
53
|
|
|
53
54
|
const result = await chain.invoke({ input: "Was ist die Hauptstadt von Frankreich?" })
|
|
@@ -56,7 +57,7 @@ const result = await chain.invoke({ input: "Was ist die Hauptstadt von Frankreic
|
|
|
56
57
|
|
|
57
58
|
**RAG:** Mit `chain.setContext(vectorStore)` und `chain.addContext(["Text 1", "Text 2"])` wird automatisch Retrieval vor dem LLM-Call eingebaut.
|
|
58
59
|
|
|
59
|
-
**Warum so:** Chain ist die kleinste Einheit – nur Prompt + LLM + Schema. Kein Memory, keine Tools. Einfach zu testen und zu komponieren.
|
|
60
|
+
**Warum so:** Chain ist die kleinste Einheit – nur Prompt + LLM + Output (Zod-Schema für .invoke()). Kein Memory, keine Tools. Einfach zu testen und zu komponieren.
|
|
60
61
|
|
|
61
62
|
---
|
|
62
63
|
|
|
@@ -98,24 +99,32 @@ const result2 = await memoryChain.invoke({
|
|
|
98
99
|
|
|
99
100
|
### 3. Agent
|
|
100
101
|
|
|
101
|
-
**Was:** LLM mit Tools (z.B. Web-Suche, API-Calls). Nutzt LangGraphs `createReactAgent` unter der Haube.
|
|
102
|
+
**Was:** LLM mit Tools (z.B. Web-Suche, API-Calls, RAG). Nutzt LangGraphs `createReactAgent` unter der Haube.
|
|
102
103
|
|
|
103
104
|
**Wann:** Wenn das LLM externe Aktionen ausführen soll (Suche, Rechner, Datenbank, etc.).
|
|
104
105
|
|
|
105
106
|
**Initialisierung:**
|
|
106
107
|
|
|
107
108
|
```ts
|
|
108
|
-
import { Agent, ToolRegistry, tavilySearchTool, getLLM } from "@delofarag/ai-utils"
|
|
109
|
+
import { Agent, ToolRegistry, createRAGTool, createFaissStore, tavilySearchTool, getLLM } from "@delofarag/ai-utils"
|
|
110
|
+
|
|
111
|
+
const vectorStore = await createFaissStore(["Dokumenteninhalt..."])
|
|
112
|
+
const ragTool = createRAGTool({
|
|
113
|
+
vectorStore,
|
|
114
|
+
name: "search_context",
|
|
115
|
+
description: "Durchsucht den Kontext nach relevanten Informationen"
|
|
116
|
+
})
|
|
109
117
|
|
|
110
118
|
const registry = new ToolRegistry([
|
|
111
119
|
{ name: "calculator", description: "...", schema: z.object({ a: z.number(), b: z.number() }), func: ({ a, b }) => a + b },
|
|
112
|
-
tavilySearchTool
|
|
113
|
-
|
|
120
|
+
tavilySearchTool,
|
|
121
|
+
ragTool
|
|
122
|
+
])
|
|
114
123
|
|
|
115
124
|
const agent = new Agent({
|
|
116
125
|
prompt: "Du bist ein hilfreicher Assistent mit Zugang zu Tools.",
|
|
117
126
|
tools: registry.allTools,
|
|
118
|
-
llm: getLLM({ type: "groq"
|
|
127
|
+
llm: getLLM({ type: "groq" }),
|
|
119
128
|
memory: new SmartCheckpointSaver(new MemorySaver(), { llm }) // optional
|
|
120
129
|
})
|
|
121
130
|
|
|
@@ -123,35 +132,42 @@ const result = await agent.invoke({
|
|
|
123
132
|
thread_id: "session-1", // nötig wenn memory gesetzt
|
|
124
133
|
input: "Was steht heute in den Nachrichten zu KI?"
|
|
125
134
|
})
|
|
135
|
+
|
|
136
|
+
agent.addTool(weiteresTool) // Tools nachträglich hinzufügen
|
|
126
137
|
```
|
|
127
138
|
|
|
128
|
-
**RAG:** `
|
|
139
|
+
**RAG:** RAG ist ein normales Tool – nutze `createRAGTool({ vectorStore, name, description })` und füge es zu `tools` hinzu oder via `agent.addTool()`.
|
|
129
140
|
|
|
130
|
-
**Warum so:** Der Agent entscheidet selbst, wann er Tools nutzt.
|
|
141
|
+
**Warum so:** Der Agent entscheidet selbst, wann er Tools nutzt. RAG wird wie jedes andere Tool behandelt (kein setContext/addContext mehr).
|
|
131
142
|
|
|
132
143
|
---
|
|
133
144
|
|
|
134
145
|
### 4. Chatbot
|
|
135
146
|
|
|
136
|
-
**Was:** High-Level Wrapper – je nach Konfiguration entweder ein `MemoryChain` oder ein `Agent`.
|
|
147
|
+
**Was:** High-Level Wrapper – je nach Konfiguration entweder ein `MemoryChain` oder ein `Agent`. Discriminated Union: `tools` → Agent, `vectorStore` → MemoryChain.
|
|
137
148
|
|
|
138
149
|
**Wann:** Schnell einen chatbasierten Assistenten bauen, mit oder ohne Tools.
|
|
139
150
|
|
|
140
151
|
**Initialisierung:**
|
|
141
152
|
|
|
142
153
|
```ts
|
|
143
|
-
import { Chatbot, tavilySearchTool, getLLM } from "@delofarag/ai-utils"
|
|
154
|
+
import { Chatbot, createRAGTool, createFaissStore, tavilySearchTool, getLLM } from "@delofarag/ai-utils"
|
|
144
155
|
|
|
145
|
-
// Ohne Tools →
|
|
156
|
+
// Ohne Tools, mit RAG → MemoryChain + vectorStore
|
|
157
|
+
const vectorStore = await createFaissStore(["Kontextdaten..."])
|
|
146
158
|
const simpleChatbot = new Chatbot({
|
|
147
|
-
llm: getLLM({ type: "groq"
|
|
148
|
-
prompt: "Du bist ein freundlicher Assistent."
|
|
159
|
+
llm: getLLM({ type: "groq" }),
|
|
160
|
+
prompt: "Du bist ein freundlicher Assistent.",
|
|
161
|
+
vectorStore
|
|
149
162
|
})
|
|
150
163
|
|
|
151
|
-
// Mit Tools →
|
|
164
|
+
// Mit Tools → Agent (RAG als Tool möglich)
|
|
152
165
|
const toolChatbot = new Chatbot({
|
|
153
|
-
llm: getLLM({ type: "groq"
|
|
154
|
-
tools: [
|
|
166
|
+
llm: getLLM({ type: "groq" }),
|
|
167
|
+
tools: [
|
|
168
|
+
tavilySearchTool,
|
|
169
|
+
createRAGTool({ vectorStore, name: "search", description: "Durchsucht den Kontext" })
|
|
170
|
+
],
|
|
155
171
|
prompt: "Du bist ein Assistent mit Webzugang."
|
|
156
172
|
})
|
|
157
173
|
|
|
@@ -185,7 +201,7 @@ const registry = new ToolRegistry([
|
|
|
185
201
|
schema: z.object({ name: z.string() }),
|
|
186
202
|
func: ({ name }) => `Hallo, ${name}!`
|
|
187
203
|
}
|
|
188
|
-
]
|
|
204
|
+
])
|
|
189
205
|
|
|
190
206
|
const tool = registry.getTool("greet")
|
|
191
207
|
const allTools = registry.allTools
|
|
@@ -256,22 +272,28 @@ const kurz = await summarize({ data: langerText, maxWords: 50 })
|
|
|
256
272
|
|
|
257
273
|
## RAG-Implementierungen
|
|
258
274
|
|
|
259
|
-
|
|
275
|
+
**Vector Stores** (in `rag.ts`):
|
|
260
276
|
|
|
261
277
|
- **turn_to_docs(data)** – Wandelt Strings/Objekte in LangChain-`Document[]` um
|
|
262
278
|
- **createSupabaseVectoreStore({ supabase, data, table_name?, RPC_function? })** – Supabase Vector Store aus Daten
|
|
263
279
|
- **getSupabaseVectorStore({ supabase, table_name?, RPC_function? })** – Bestehenden Store holen
|
|
264
280
|
- **createFaissStore({ data, save_path?, embeddings? })** – FAISS-Store (lokal, speicherbar)
|
|
265
281
|
- **loadFaissStore({ path, embeddings? })** – FAISS-Store laden
|
|
282
|
+
|
|
283
|
+
**RAG als Tool** (für Agent):
|
|
284
|
+
|
|
285
|
+
- **createRAGTool({ vectorStore, name, description })** – Erzeugt ein Tool, mit dem der Agent den Vector Store durchsucht. In `tools` übergeben oder via `agent.addTool()`.
|
|
286
|
+
|
|
287
|
+
**Retrieval-Chains** (in `rag.ts`):
|
|
288
|
+
|
|
266
289
|
- **createRAGChain({ vectorStore, llm, prompt?, num_of_results_from_vdb? })** – Retrieval-Chain
|
|
267
290
|
- **createRAGChainFromRetriever({ retriever, llm, prompt? })** – Alternative mit eigenem Retriever
|
|
268
291
|
|
|
269
292
|
**Typischer Ablauf:**
|
|
270
293
|
|
|
271
|
-
1.
|
|
272
|
-
2.
|
|
273
|
-
3. `
|
|
274
|
-
4. Optional: `addContext(docs)` für weitere Dokumente
|
|
294
|
+
1. Vector Store erstellen: `createFaissStore({ data })` oder `createSupabaseVectoreStore({ data })`
|
|
295
|
+
2. **Chain/MemoryChain:** `chain.setContext(vectorStore)` – RAG wird automatisch eingebaut. Optional `chain.addContext(weitereDaten)` für weitere Docs
|
|
296
|
+
3. **Agent/Chatbot:** `createRAGTool({ vectorStore, name, description })` als Tool übergeben
|
|
275
297
|
|
|
276
298
|
---
|
|
277
299
|
|
|
@@ -325,14 +347,14 @@ const chatbot = new Chatbot({ llm, memory })
|
|
|
325
347
|
|
|
326
348
|
| Util | Zweck |
|
|
327
349
|
|------|-------|
|
|
328
|
-
| **Chain** | Stateless LLM + Schema, optional RAG |
|
|
350
|
+
| **Chain** | Stateless LLM + Schema, optional RAG (setContext/addContext) |
|
|
329
351
|
| **MemoryChain** | Chain + Konversations-Memory pro thread_id, optional RAG |
|
|
330
|
-
| **Agent** | LLM + Tools, optional Memory +
|
|
331
|
-
| **Chatbot** |
|
|
352
|
+
| **Agent** | LLM + Tools, optional Memory. RAG via createRAGTool + addTool |
|
|
353
|
+
| **Chatbot** | Discriminated Union: tools → Agent, vectorStore → MemoryChain |
|
|
332
354
|
| **ToolRegistry** | Tools registrieren (empfohlen) |
|
|
333
355
|
| **tavilySearchTool** | Web-Suche (TAVILY_API_KEY) |
|
|
334
356
|
| **Magic-Funcs** | ask, websearch, classify, decide, extract, structure, rewrite, summarize, promptify, ragify |
|
|
335
|
-
| **RAG** | Supabase/FAISS Vector Stores, createRAGChain |
|
|
357
|
+
| **RAG** | createRAGTool, Supabase/FAISS Vector Stores, createRAGChain |
|
|
336
358
|
| **SupabaseCheckpointSaver** | Persistente Memory in Supabase |
|
|
337
359
|
| **SmartCheckpointSaver** | Memory mit Auto-Summarization |
|
|
338
360
|
| **getLLM()** | LLM aus Groq, OpenRouter oder Ollama |
|
package/dist/heart/agent.d.ts
CHANGED
|
@@ -1,26 +1,31 @@
|
|
|
1
1
|
import { z } from "zod/v3";
|
|
2
|
+
import type { InvokeInputBase, OutputSchema } from "./chain";
|
|
2
3
|
import { DynamicStructuredTool } from "../imports";
|
|
3
4
|
import { BaseChatModel } from "../imports";
|
|
4
5
|
import { BaseCheckpointSaver } from "../imports";
|
|
5
|
-
|
|
6
|
-
interface AgentProps<T extends z.ZodType<any, any, any>> {
|
|
7
|
-
prompt?: string | Array<string>;
|
|
6
|
+
interface AgentProps<T extends OutputSchema> {
|
|
8
7
|
tools: DynamicStructuredTool[];
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
prompt?: string | Array<string>;
|
|
9
|
+
llm?: BaseChatModel;
|
|
10
|
+
output?: T;
|
|
11
11
|
memory?: BaseCheckpointSaver;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* CONSTRUCTOR:
|
|
15
|
-
* @example
|
|
15
|
+
* @example
|
|
16
|
+
* constructor({
|
|
16
17
|
prompt = `Du bist ein hilfreicher Assistent.`,
|
|
17
|
-
llm = getLLM({type:"groq"
|
|
18
|
+
llm = getLLM({ type:"groq" }),
|
|
18
19
|
tools,
|
|
19
|
-
|
|
20
|
-
memory
|
|
20
|
+
output,
|
|
21
|
+
memory,
|
|
21
22
|
}: AgentProps<T>) {
|
|
22
23
|
this.prompt = typeof prompt === "string" ? [["system", prompt]] : Array.isArray(prompt) ? prompt.map((p:string)=>{
|
|
23
|
-
|
|
24
|
+
if(typeof p === "string"){
|
|
25
|
+
return ["system", p]
|
|
26
|
+
} else {
|
|
27
|
+
return p // weil wenn es kein string ist muss es ein MessagePlaceholder sein
|
|
28
|
+
}
|
|
24
29
|
}) : []
|
|
25
30
|
this.prompt.push(["system",`WICHTIG:
|
|
26
31
|
- Nutze Tools NUR wenn nötig
|
|
@@ -29,38 +34,28 @@ interface AgentProps<T extends z.ZodType<any, any, any>> {
|
|
|
29
34
|
- Vermeide unnötige Tool-Calls, die dem user nichts bringen`])
|
|
30
35
|
this.tools = tools
|
|
31
36
|
this.llm = llm
|
|
32
|
-
this.
|
|
37
|
+
this.output = output
|
|
33
38
|
this.memory = memory
|
|
34
39
|
}
|
|
40
|
+
* @param output - Zod-Schema: beschreibt die Struktur des Rückgabewerts von .invoke()
|
|
35
41
|
*/
|
|
36
|
-
export declare class Agent<T extends
|
|
42
|
+
export declare class Agent<T extends OutputSchema> {
|
|
37
43
|
private prompt;
|
|
38
44
|
private tools;
|
|
39
45
|
private llm;
|
|
40
|
-
private
|
|
46
|
+
private output;
|
|
41
47
|
private agent;
|
|
42
48
|
private memory;
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
private should_use_schema;
|
|
47
|
-
constructor({ prompt, llm, tools, schema, memory }: AgentProps<T>);
|
|
48
|
-
invoke(invokeInput: Record<string, any> & {
|
|
49
|
+
private should_use_output;
|
|
50
|
+
constructor({ prompt, llm, tools, output, memory, }: AgentProps<T>);
|
|
51
|
+
invoke(invokeInput: InvokeInputBase & {
|
|
49
52
|
thread_id?: string;
|
|
50
|
-
debug?: boolean;
|
|
51
53
|
}): Promise<T extends undefined ? string : z.infer<T>>;
|
|
52
|
-
stream(
|
|
54
|
+
/** bro nutzt später vielleicht intern mal die native .stream() von createReactAgent */
|
|
55
|
+
stream(invokeInput: InvokeInputBase & {
|
|
53
56
|
thread_id?: string;
|
|
54
|
-
debug?: boolean;
|
|
55
57
|
stream_delay?: number;
|
|
56
58
|
}): AsyncGenerator<string, void, unknown>;
|
|
57
|
-
setContext(vectorStore: VectorStore, metadata?: {
|
|
58
|
-
name?: string;
|
|
59
|
-
description?: string;
|
|
60
|
-
}): void;
|
|
61
|
-
addContext(data: Array<any>): Promise<void>;
|
|
62
|
-
clearContext(): void;
|
|
63
|
-
hasContext(): boolean;
|
|
64
59
|
addTool(tool: DynamicStructuredTool): void;
|
|
65
60
|
get currentTools(): string[];
|
|
66
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/heart/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/heart/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE1B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAC,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAiChD,UAAU,UAAU,CAAC,CAAC,SAAS,YAAY;IACvC,KAAK,EAAE,qBAAqB,EAAE,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IAC/B,GAAG,CAAC,EAAE,aAAa,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,CAAA;IACV,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,YAAY;IACrC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,iBAAiB,CAAgB;gBAE7B,EACR,MAA6C,EAC7C,GAA6B,EAC7B,KAAK,EACL,MAAM,EACN,MAAM,GACT,EAAE,UAAU,CAAC,CAAC,CAAC;IAmBH,MAAM,CAAC,WAAW,EAAE,eAAe,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAqC9H,uFAAuF;IACzE,MAAM,CAAC,WAAW,EAAE,eAAe,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAelI,OAAO,CAAC,IAAI,EAAC,qBAAqB;IAIzC,IAAW,YAAY,IAAI,MAAM,EAAE,CAElC;CACJ"}
|
package/dist/heart/agent.js
CHANGED
|
@@ -1,21 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DynamicStructuredTool } from "../imports";
|
|
3
|
-
import { turn_to_docs } from "../rag";
|
|
1
|
+
import { PromptTemplate } from "@langchain/core/prompts";
|
|
4
2
|
import { createReactAgent } from "../imports";
|
|
5
3
|
import { HumanMessage } from "../imports";
|
|
6
4
|
import { getLLM, stream } from "../helpers";
|
|
7
5
|
import { structure } from "../magic-funcs/parsers/structure";
|
|
6
|
+
/*
|
|
7
|
+
KOMPLETTER REWRITTE: lösch die ganze rag scheisse beim init und behandle die wie normale tools du pic, erstell einfach eine
|
|
8
|
+
"createRAGTool" func oder so ein scheiss und gib den einfach beim init ein. mach sogar die "setContext()" func weg, wenn man
|
|
9
|
+
rag eingeben will dann soll man die "addTool()" func aufrufen mit dem RAGTool amk. entfern alles "...Context()" relatete!
|
|
10
|
+
*/
|
|
11
|
+
async function resolveSystemPromptBlocks(blocks, promptVars) {
|
|
12
|
+
if (!promptVars || Object.keys(promptVars).length === 0) {
|
|
13
|
+
return blocks;
|
|
14
|
+
}
|
|
15
|
+
const out = [];
|
|
16
|
+
for (const [role, text] of blocks) {
|
|
17
|
+
try {
|
|
18
|
+
const formatted = await PromptTemplate.fromTemplate(text).format(promptVars);
|
|
19
|
+
out.push([role, formatted]);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
out.push([role, text]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
8
27
|
/**
|
|
9
28
|
* CONSTRUCTOR:
|
|
10
|
-
* @example
|
|
29
|
+
* @example
|
|
30
|
+
* constructor({
|
|
11
31
|
prompt = `Du bist ein hilfreicher Assistent.`,
|
|
12
|
-
llm = getLLM({type:"groq"
|
|
32
|
+
llm = getLLM({ type:"groq" }),
|
|
13
33
|
tools,
|
|
14
|
-
|
|
15
|
-
memory
|
|
34
|
+
output,
|
|
35
|
+
memory,
|
|
16
36
|
}: AgentProps<T>) {
|
|
17
37
|
this.prompt = typeof prompt === "string" ? [["system", prompt]] : Array.isArray(prompt) ? prompt.map((p:string)=>{
|
|
18
|
-
|
|
38
|
+
if(typeof p === "string"){
|
|
39
|
+
return ["system", p]
|
|
40
|
+
} else {
|
|
41
|
+
return p // weil wenn es kein string ist muss es ein MessagePlaceholder sein
|
|
42
|
+
}
|
|
19
43
|
}) : []
|
|
20
44
|
this.prompt.push(["system",`WICHTIG:
|
|
21
45
|
- Nutze Tools NUR wenn nötig
|
|
@@ -24,24 +48,27 @@ import { structure } from "../magic-funcs/parsers/structure";
|
|
|
24
48
|
- Vermeide unnötige Tool-Calls, die dem user nichts bringen`])
|
|
25
49
|
this.tools = tools
|
|
26
50
|
this.llm = llm
|
|
27
|
-
this.
|
|
51
|
+
this.output = output
|
|
28
52
|
this.memory = memory
|
|
29
53
|
}
|
|
54
|
+
* @param output - Zod-Schema: beschreibt die Struktur des Rückgabewerts von .invoke()
|
|
30
55
|
*/
|
|
31
56
|
export class Agent {
|
|
32
57
|
prompt;
|
|
33
58
|
tools;
|
|
34
59
|
llm;
|
|
35
|
-
|
|
60
|
+
output;
|
|
36
61
|
agent;
|
|
37
62
|
memory;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
times_of_added_context = 0;
|
|
41
|
-
should_use_schema = true;
|
|
42
|
-
constructor({ prompt = `Du bist ein hilfreicher Assistent.`, llm = getLLM({ type: "groq", apikey: process.env.CHATGROQ_API_KEY ?? "" }), tools, schema, memory }) {
|
|
63
|
+
should_use_output = true;
|
|
64
|
+
constructor({ prompt = `Du bist ein hilfreicher Assistent.`, llm = getLLM({ type: "groq" }), tools, output, memory, }) {
|
|
43
65
|
this.prompt = typeof prompt === "string" ? [["system", prompt]] : Array.isArray(prompt) ? prompt.map((p) => {
|
|
44
|
-
|
|
66
|
+
if (typeof p === "string") {
|
|
67
|
+
return ["system", p];
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return p; // weil wenn es kein string ist muss es ein MessagePlaceholder sein
|
|
71
|
+
}
|
|
45
72
|
}) : [];
|
|
46
73
|
this.prompt.push(["system", `WICHTIG:
|
|
47
74
|
- Nutze Tools NUR wenn nötig
|
|
@@ -50,44 +77,47 @@ export class Agent {
|
|
|
50
77
|
- Vermeide unnötige Tool-Calls, die dem user nichts bringen`]);
|
|
51
78
|
this.tools = tools;
|
|
52
79
|
this.llm = llm;
|
|
53
|
-
this.
|
|
80
|
+
this.output = output;
|
|
54
81
|
this.memory = memory;
|
|
55
82
|
}
|
|
56
83
|
async invoke(invokeInput) {
|
|
57
|
-
const { thread_id, debug, ...variables } = invokeInput;
|
|
84
|
+
const { thread_id, debug, promptVars, ...variables } = invokeInput;
|
|
58
85
|
if (this.memory && !thread_id)
|
|
59
86
|
throw new Error("thread_id is required when using memory, else no memory is stored");
|
|
60
87
|
if (!this.memory && thread_id)
|
|
61
88
|
console.warn("WARN: thread_id is provided but no memory is set, so no memory is stored");
|
|
62
89
|
const humanMessages = Object.entries(variables).map(([key, value]) => new HumanMessage(`${key}: ${typeof value === "object" ? JSON.stringify(value) : value}`));
|
|
63
|
-
|
|
64
|
-
const activeTools = this.rag_tool
|
|
65
|
-
? [...this.tools, this.rag_tool]
|
|
66
|
-
: this.tools;
|
|
90
|
+
const resolvedPrompt = await resolveSystemPromptBlocks(this.prompt, promptVars);
|
|
67
91
|
this.agent = createReactAgent({
|
|
68
92
|
llm: this.llm,
|
|
69
|
-
tools:
|
|
93
|
+
tools: this.tools,
|
|
70
94
|
checkpointSaver: this.memory,
|
|
71
95
|
prompt: (state) => [
|
|
72
|
-
...
|
|
96
|
+
...resolvedPrompt,
|
|
73
97
|
...state.messages
|
|
74
98
|
]
|
|
75
99
|
});
|
|
76
100
|
const config = thread_id && this.memory ? { configurable: { thread_id } } : undefined;
|
|
101
|
+
if (thread_id && !this.memory)
|
|
102
|
+
console.warn("thread_id wurde beim invoke des agenten mitgegeben aber keine memory, somit wird nichts gespeichert und die thread_id ist gleichgültig");
|
|
77
103
|
const result = await this.agent.invoke({ messages: humanMessages }, config);
|
|
78
104
|
if (debug)
|
|
79
105
|
return result;
|
|
80
106
|
const lastMessage = result.messages[result.messages.length - 1];
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
107
|
+
const raw = lastMessage?.content;
|
|
108
|
+
const content = typeof raw === "string" ? raw : (Array.isArray(raw) ? raw.map((c) => c?.text ?? c).join("") : String(raw ?? ""));
|
|
109
|
+
if (this.output && this.should_use_output) {
|
|
110
|
+
return await structure({ data: content, into: this.output, llm: this.llm });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
return content;
|
|
84
114
|
}
|
|
85
|
-
return content;
|
|
86
115
|
}
|
|
116
|
+
/** bro nutzt später vielleicht intern mal die native .stream() von createReactAgent */
|
|
87
117
|
async *stream(invokeInput) {
|
|
88
|
-
this.
|
|
118
|
+
this.should_use_output = false;
|
|
89
119
|
try {
|
|
90
|
-
const { stream_delay =
|
|
120
|
+
const { stream_delay = 50, ...rest } = invokeInput;
|
|
91
121
|
const response = await this.invoke(rest);
|
|
92
122
|
const responseStr = typeof response === "string" ? response : JSON.stringify(response);
|
|
93
123
|
const words = responseStr.split(" ");
|
|
@@ -96,52 +126,14 @@ export class Agent {
|
|
|
96
126
|
}
|
|
97
127
|
}
|
|
98
128
|
finally {
|
|
99
|
-
this.
|
|
129
|
+
this.should_use_output = true;
|
|
100
130
|
}
|
|
101
131
|
}
|
|
102
|
-
setContext(vectorStore, metadata = {}) {
|
|
103
|
-
this.vectorStore = vectorStore;
|
|
104
|
-
this.rag_tool = new DynamicStructuredTool({
|
|
105
|
-
name: metadata.name ?? "search_context",
|
|
106
|
-
description: metadata.description ?? "Search the knowledge base for relevant information",
|
|
107
|
-
schema: z.object({
|
|
108
|
-
query: z.string().describe("The search query")
|
|
109
|
-
}),
|
|
110
|
-
func: async ({ query }) => {
|
|
111
|
-
const docs = await this.vectorStore?.similaritySearch(query, 3);
|
|
112
|
-
if (!docs || docs.length === 0)
|
|
113
|
-
return "No relevant information found.";
|
|
114
|
-
return docs.map(doc => doc.pageContent).join("\n\n---\n\n");
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
async addContext(data) {
|
|
119
|
-
if (!this.vectorStore) {
|
|
120
|
-
throw new Error("Cant add context, no vector store set");
|
|
121
|
-
}
|
|
122
|
-
this.times_of_added_context++;
|
|
123
|
-
const docs = turn_to_docs(data);
|
|
124
|
-
await this.vectorStore.addDocuments(docs);
|
|
125
|
-
console.log(`Added context ${this.times_of_added_context} ${this.times_of_added_context === 1 ? "time" : "times"}`);
|
|
126
|
-
}
|
|
127
|
-
clearContext() {
|
|
128
|
-
this.rag_tool = undefined;
|
|
129
|
-
this.vectorStore = undefined;
|
|
130
|
-
this.times_of_added_context = 0;
|
|
131
|
-
console.log("Context cleared");
|
|
132
|
-
}
|
|
133
|
-
hasContext() {
|
|
134
|
-
return this.vectorStore !== undefined && this.rag_tool !== undefined;
|
|
135
|
-
}
|
|
136
132
|
addTool(tool) {
|
|
137
133
|
this.tools.push(tool);
|
|
138
134
|
}
|
|
139
135
|
get currentTools() {
|
|
140
|
-
|
|
141
|
-
if (this.rag_tool) {
|
|
142
|
-
tools.push(this.rag_tool);
|
|
143
|
-
}
|
|
144
|
-
return tools.map(tool => tool.name);
|
|
136
|
+
return this.tools.map(tool => tool.name);
|
|
145
137
|
}
|
|
146
138
|
}
|
|
147
139
|
//# sourceMappingURL=agent.js.map
|
package/dist/heart/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/heart/agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/heart/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/heart/chain.d.ts
CHANGED
|
@@ -1,53 +1,67 @@
|
|
|
1
1
|
import { BaseChatModel, MessagesPlaceholder, VectorStore } from "../imports";
|
|
2
2
|
import { z } from "zod/v3";
|
|
3
|
-
|
|
3
|
+
/** Output-Schema für .invoke(): z.object() oder z.record() (Zod v3). */
|
|
4
|
+
export type OutputSchema = z.ZodObject<any, any, any> | z.ZodRecord<any, any>;
|
|
5
|
+
export declare const DEFAULT_OUTPUT_SCHEMA: z.ZodObject<{
|
|
4
6
|
output: z.ZodString;
|
|
5
7
|
}, "strip", z.ZodTypeAny, {
|
|
6
8
|
output: string;
|
|
7
9
|
}, {
|
|
8
10
|
output: string;
|
|
9
11
|
}>;
|
|
10
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Input für .invoke() / .stream(): beliebige dynamische Keys + optionale Steuerfelder.
|
|
14
|
+
* Bekannte Keys zuerst + Index-Signature — so schlagen IDEs `debug` / `promptVars` zuverlässig vor (reines `Record<string, any> & { debug? }` nicht).
|
|
15
|
+
*/
|
|
16
|
+
export interface InvokeInputBase {
|
|
17
|
+
debug?: boolean;
|
|
18
|
+
promptVars?: Record<string, any>;
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
}
|
|
21
|
+
interface ChainProps<T extends OutputSchema> {
|
|
11
22
|
prompt?: string | Array<string | MessagesPlaceholder<any>>;
|
|
12
23
|
llm?: BaseChatModel;
|
|
13
|
-
|
|
24
|
+
output?: T;
|
|
25
|
+
vectorStore?: VectorStore;
|
|
14
26
|
}
|
|
15
27
|
/**
|
|
16
28
|
* CONSTRUCTOR:
|
|
17
|
-
* @example
|
|
29
|
+
* @example
|
|
30
|
+
* constructor({
|
|
18
31
|
prompt = "du bist ein hilfreicher Assistent",
|
|
19
32
|
llm = getLLM({type:"groq", apikey: process.env.CHATGROQ_API_KEY ?? ""}),
|
|
20
|
-
|
|
33
|
+
output = DEFAULT_OUTPUT_SCHEMA as unknown as T as T
|
|
34
|
+
vectorStore = undefined
|
|
21
35
|
}:ChainProps<T>){
|
|
22
36
|
this.prompt = typeof prompt === "string" ? [["system", prompt]] : Array.isArray(prompt) ? prompt.map((p:string | MessagesPlaceholder<any>)=>{
|
|
23
37
|
if(typeof p === "string"){
|
|
24
38
|
return ["system", p]
|
|
25
39
|
} else {
|
|
26
|
-
return p
|
|
40
|
+
return p // weil wenn es kein string ist dann ist es ein MessagePlaceholder
|
|
27
41
|
}
|
|
28
42
|
}) : []
|
|
29
43
|
this.llm = llm
|
|
30
|
-
this.
|
|
31
|
-
this.
|
|
44
|
+
this.vectorStore = vectorStore
|
|
45
|
+
this.output = output
|
|
46
|
+
this.parser = StructuredOutputParser.fromZodSchema(this.output)
|
|
32
47
|
}
|
|
48
|
+
* @param output - Zod-Schema: beschreibt die Struktur des Rückgabewerts von .invoke()
|
|
33
49
|
*/
|
|
34
|
-
export declare class Chain<T extends
|
|
50
|
+
export declare class Chain<T extends OutputSchema = typeof DEFAULT_OUTPUT_SCHEMA> {
|
|
35
51
|
private prompt;
|
|
36
52
|
private vectorStore;
|
|
37
53
|
private times_of_added_context;
|
|
38
54
|
private parser;
|
|
39
55
|
private llm;
|
|
40
|
-
private
|
|
41
|
-
constructor({ prompt, llm,
|
|
42
|
-
invoke(input:
|
|
43
|
-
debug?: boolean;
|
|
44
|
-
}): Promise<z.infer<T>>;
|
|
56
|
+
private output;
|
|
57
|
+
constructor({ prompt, llm, output, vectorStore }?: ChainProps<T>);
|
|
58
|
+
invoke(input: InvokeInputBase): Promise<z.infer<T>>;
|
|
45
59
|
stream(input: Record<string, any> & {
|
|
46
60
|
debug?: boolean;
|
|
47
61
|
}): AsyncGenerator<string, void, unknown>;
|
|
48
62
|
/** Fügt RAG-Kontext hinzu. Docs werden EINMAL zum VectorStore hinzugefügt. */
|
|
49
63
|
addContext(data: Array<any>): Promise<void>;
|
|
50
|
-
setContext(vectorStore: VectorStore):
|
|
64
|
+
setContext(vectorStore: VectorStore): void;
|
|
51
65
|
clearContext(): void;
|
|
52
66
|
}
|
|
53
67
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/heart/chain.ts"],"names":[],"mappings":"AACA,OAAO,EACH,aAAa,EAGb,mBAAmB,EACnB,WAAW,EAGd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE1B,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/heart/chain.ts"],"names":[],"mappings":"AACA,OAAO,EACH,aAAa,EAGb,mBAAmB,EACnB,WAAW,EAGd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE1B,wEAAwE;AACxE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAE7E,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAA;AAEF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB;AAED,UAAU,UAAU,CAAC,CAAC,SAAS,YAAY;IACvC,MAAM,CAAC,EAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,GAAG,CAAC,EAAC,aAAa,CAAA;IAClB,MAAM,CAAC,EAAC,CAAC,CAAC;IACV,WAAW,CAAC,EAAE,WAAW,CAAA;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,YAAY,GAAG,OAAO,qBAAqB;IACpE,OAAO,CAAC,MAAM,CAA+D;IAC7E,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,MAAM,CAAE;gBAEJ,EACR,MAA4C,EAC5C,GAA6B,EAC7B,MAAmD,EACnD,WAAuB,EAC1B,GAAC,UAAU,CAAC,CAAC,CAAM;IAcP,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IA4ClD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAuD7G,8EAA8E;IACjE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IAWjC,UAAU,CAAC,WAAW,EAAE,WAAW;IAKnC,YAAY;CAKtB"}
|