@delofarag/ai-utils 1.0.1 → 1.0.3

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 (50) hide show
  1. package/README.md +1 -0
  2. package/dist/heart/agent.d.ts +68 -0
  3. package/dist/heart/agent.d.ts.map +1 -0
  4. package/dist/heart/agent.js +140 -0
  5. package/dist/heart/agent.js.map +1 -0
  6. package/dist/heart/chain.d.ts +42 -0
  7. package/dist/heart/chain.d.ts.map +1 -0
  8. package/dist/heart/chain.js +152 -0
  9. package/dist/heart/chain.js.map +1 -0
  10. package/dist/heart/chatbot.d.ts +27 -0
  11. package/dist/heart/chatbot.d.ts.map +1 -0
  12. package/dist/heart/chatbot.js +100 -0
  13. package/dist/heart/chatbot.js.map +1 -0
  14. package/dist/heart/memorychain.d.ts +59 -0
  15. package/dist/heart/memorychain.d.ts.map +1 -0
  16. package/dist/heart/memorychain.js +165 -0
  17. package/dist/heart/memorychain.js.map +1 -0
  18. package/dist/heart/tools/BasicToolRegistry.d.ts +22 -0
  19. package/dist/heart/tools/BasicToolRegistry.d.ts.map +1 -0
  20. package/dist/heart/tools/BasicToolRegistry.js +45 -0
  21. package/dist/heart/tools/BasicToolRegistry.js.map +1 -0
  22. package/dist/heart/tools/CombinedRegistry.d.ts +41 -0
  23. package/dist/heart/tools/CombinedRegistry.d.ts.map +1 -0
  24. package/dist/heart/tools/CombinedRegistry.js +46 -0
  25. package/dist/heart/tools/CombinedRegistry.js.map +1 -0
  26. package/dist/heart/tools/ZodiosToolRegistry.d.ts +22 -0
  27. package/dist/heart/tools/ZodiosToolRegistry.d.ts.map +1 -0
  28. package/dist/heart/tools/ZodiosToolRegistry.js +80 -0
  29. package/dist/heart/tools/ZodiosToolRegistry.js.map +1 -0
  30. package/dist/helpers.d.ts +31 -0
  31. package/dist/helpers.d.ts.map +1 -0
  32. package/dist/helpers.js +105 -0
  33. package/dist/helpers.js.map +1 -0
  34. package/dist/imports.d.ts +44 -0
  35. package/dist/imports.d.ts.map +1 -0
  36. package/dist/imports.js +56 -0
  37. package/dist/imports.js.map +1 -0
  38. package/dist/index.d.ts +11 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +11 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/memory.d.ts +78 -0
  43. package/dist/memory.d.ts.map +1 -0
  44. package/dist/memory.js +282 -0
  45. package/dist/memory.js.map +1 -0
  46. package/dist/rag.d.ts +38 -0
  47. package/dist/rag.d.ts.map +1 -0
  48. package/dist/rag.js +72 -0
  49. package/dist/rag.js.map +1 -0
  50. package/package.json +9 -9
@@ -0,0 +1,165 @@
1
+ import { HumanMessage, AIMessage } from "../imports";
2
+ import { SmartCheckpointSaver } from "../memory";
3
+ import { Chain, DEFAULT_SCHEMA } from "./chain";
4
+ import { MemorySaver } from "../imports";
5
+ /**
6
+ * CONSTRUCTOR
7
+ * @example constructor({memory, ...rest}: MemoryChainProps<T> = {}){
8
+ this.memory = memory ?? new SmartCheckpointSaver(new MemorySaver())
9
+ if ("chain" in rest){
10
+ this.chain = rest.chain
11
+ } else {
12
+ this.chain = new Chain<T>({
13
+ llm: rest.llm ?? getLLM("groq"),
14
+ prompt: rest.prompt ?? [["system", "Du bist ein hilfreicher Chatbot der mit dem User ein höffliches und hilfreiches Gespräch führt"]],
15
+ schema: (rest.schema ?? DEFAULT_SCHEMA) as unknown as T
16
+ })
17
+ }
18
+ }
19
+ *
20
+ * @example entweder gibst du direkt eine chain + memory:
21
+ * @param props.memory
22
+ * @param props.chain
23
+ *
24
+ * @example oder eine chain wird anhand deines llms, schemas oder prompts erstellt + memory:
25
+ * @param props.memory
26
+ * @param props.llm
27
+ * @param props.prompt
28
+ * @param props.schema
29
+ */
30
+ export class MemoryChain {
31
+ memory;
32
+ chain;
33
+ constructor({ memory, ...rest }) {
34
+ // @ts-expect-error - Type incompatibility due to duplicate LangChain versions in monorepo
35
+ this.memory = memory ?? new SmartCheckpointSaver(new MemorySaver(), { llm: rest.llm });
36
+ if ("chain" in rest) {
37
+ this.chain = rest.chain;
38
+ }
39
+ else {
40
+ this.chain = new Chain({
41
+ llm: rest.llm,
42
+ prompt: rest.prompt ?? [["system", "Du bist ein hilfreicher Chatbot der mit dem User ein höffliches und hilfreiches Gespräch führt"]],
43
+ schema: (rest.schema ?? DEFAULT_SCHEMA)
44
+ });
45
+ }
46
+ }
47
+ async invoke(input) {
48
+ const config = {
49
+ configurable: { thread_id: input.thread_id }
50
+ };
51
+ const checkpoint = await this.memory.get(config);
52
+ let historyMessages = [];
53
+ if (checkpoint && checkpoint.channel_values && checkpoint.channel_values.messages) {
54
+ historyMessages = checkpoint.channel_values.messages;
55
+ }
56
+ const historyText = this.messagesToHistoryText(historyMessages);
57
+ const { thread_id, ...restInput } = input;
58
+ const invokeInput = {};
59
+ for (const key in restInput) {
60
+ if (key === "debug")
61
+ continue;
62
+ invokeInput[key] = restInput[key];
63
+ }
64
+ // Unterstütze sowohl 'input' als auch 'message' als Key
65
+ if (invokeInput.input && !invokeInput.message) {
66
+ invokeInput.message = invokeInput.input;
67
+ delete invokeInput.input;
68
+ }
69
+ if (historyText && invokeInput.message) {
70
+ invokeInput.message = `${historyText}\n\nUser: ${invokeInput.message}`;
71
+ }
72
+ const response = await this.chain.invoke(invokeInput);
73
+ const responseText = typeof response === 'object' && 'output' in response
74
+ ? response.output
75
+ : typeof response === 'string'
76
+ ? response
77
+ : JSON.stringify(response);
78
+ const userInputText = invokeInput.message || input.input || JSON.stringify(restInput);
79
+ await this.saveResponse(thread_id, userInputText, responseText, historyMessages);
80
+ return response;
81
+ }
82
+ async *stream({ input, thread_id }) {
83
+ const config = {
84
+ configurable: { thread_id }
85
+ };
86
+ const checkpoint = await this.memory.get(config);
87
+ let historyMessages = [];
88
+ if (checkpoint && checkpoint.channel_values && checkpoint.channel_values.messages) {
89
+ historyMessages = checkpoint.channel_values.messages;
90
+ }
91
+ const userMessage = new HumanMessage(input);
92
+ const allMessages = [...historyMessages, userMessage];
93
+ const historyText = this.messagesToHistoryText(allMessages);
94
+ const chunks = [];
95
+ try {
96
+ for await (const chunk of this.chain.stream({
97
+ message: `${historyText}\n\nUser: ${input}`
98
+ })) {
99
+ chunks.push(chunk);
100
+ yield chunk;
101
+ }
102
+ }
103
+ finally {
104
+ // Memory-Speicherung wird IMMER ausgeführt, auch wenn der Stream fehlschlägt
105
+ const responseText = chunks.join('');
106
+ await this.saveResponse(thread_id, input, responseText, historyMessages);
107
+ }
108
+ return chunks.join('');
109
+ }
110
+ async addContext(data) {
111
+ this.chain.addContext(data);
112
+ }
113
+ async setContext(vectorStore) {
114
+ this.chain.setContext(vectorStore);
115
+ }
116
+ async clearContext() {
117
+ this.chain.clearContext();
118
+ }
119
+ messagesToHistoryText(messages) {
120
+ return messages.map(msg => {
121
+ if (msg instanceof HumanMessage) {
122
+ return `User: ${typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)}`;
123
+ }
124
+ else if (msg instanceof AIMessage) {
125
+ return `Assistant: ${typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)}`;
126
+ }
127
+ else {
128
+ return `System: ${typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)}`;
129
+ }
130
+ }).join('\n\n');
131
+ }
132
+ async saveResponse(thread_id, userInputText, responseText, historyMessages) {
133
+ if (!responseText || responseText.length === 0)
134
+ return;
135
+ const config = {
136
+ configurable: { thread_id }
137
+ };
138
+ const checkpoint = await this.memory.get(config);
139
+ const userMessage = new HumanMessage(userInputText);
140
+ const aiMessage = new AIMessage(responseText);
141
+ const newMessages = [...historyMessages, userMessage, aiMessage];
142
+ const newCheckpoint = {
143
+ ...checkpoint,
144
+ channel_values: {
145
+ ...(checkpoint?.channel_values || {}),
146
+ messages: newMessages
147
+ },
148
+ channel_versions: {
149
+ ...(checkpoint?.channel_versions || {}),
150
+ messages: newMessages.length
151
+ },
152
+ versions_seen: checkpoint?.versions_seen || {},
153
+ v: (checkpoint?.v || 0) + 1,
154
+ id: checkpoint?.id || `${thread_id}-${Date.now()}`,
155
+ ts: checkpoint?.ts || new Date().toISOString()
156
+ };
157
+ const metadata = {
158
+ source: "input",
159
+ step: (checkpoint?.v || 0) + 1,
160
+ parents: {}
161
+ };
162
+ await this.memory.put(config, newCheckpoint, metadata, { messages: newMessages.length });
163
+ }
164
+ }
165
+ //# sourceMappingURL=memorychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memorychain.js","sourceRoot":"","sources":["../../src/heart/memorychain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { DynamicStructuredTool } from "@langchain/core/tools";
2
+ import type { ExtractToolNames } from "./CombinedRegistry";
3
+ import { z } from "zod/v3";
4
+ export interface Tool {
5
+ name: string;
6
+ description: string;
7
+ schema: z.AnyZodObject;
8
+ func: (...args: any[]) => any;
9
+ }
10
+ /**
11
+ * vergiss nicht 'as const' am ende des input-arrays zu verwenden für perekten autocomplete!!!
12
+ */
13
+ export declare class ToolRegistry<T extends Tool[]> {
14
+ private tools;
15
+ constructor(tools: T);
16
+ getTool(name: ExtractToolNames<T>): DynamicStructuredTool | undefined;
17
+ getTools(...names: ExtractToolNames<T>[]): (DynamicStructuredTool<import("@langchain/core/tools").ToolSchemaBase, any, any, any> | undefined)[];
18
+ private turnToTool;
19
+ private checkDuplicatedTools;
20
+ get allTools(): DynamicStructuredTool[];
21
+ }
22
+ //# sourceMappingURL=BasicToolRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasicToolRegistry.d.ts","sourceRoot":"","sources":["../../../src/heart/tools/BasicToolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE1B,MAAM,WAAW,IAAI;IACjB,IAAI,EAAC,MAAM,CAAA;IACX,WAAW,EAAC,MAAM,CAAA;IAClB,MAAM,EAAC,CAAC,CAAC,YAAY,CAAA;IACrB,IAAI,EAAC,CAAC,GAAG,IAAI,EAAC,GAAG,EAAE,KAAK,GAAG,CAAA;CAC9B;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE;IACtC,OAAO,CAAC,KAAK,CAAwB;gBACzB,KAAK,EAAC,CAAC;IAOZ,OAAO,CAAC,IAAI,EAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,qBAAqB,GAAG,SAAS;IAYpE,QAAQ,CAAC,GAAG,KAAK,EAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;IAI9C,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,oBAAoB;IAO5B,IAAW,QAAQ,IAAG,qBAAqB,EAAE,CAE5C;CACJ"}
@@ -0,0 +1,45 @@
1
+ import { DynamicStructuredTool } from "@langchain/core/tools";
2
+ /**
3
+ * vergiss nicht 'as const' am ende des input-arrays zu verwenden für perekten autocomplete!!!
4
+ */
5
+ export class ToolRegistry {
6
+ tools;
7
+ constructor(tools) {
8
+ this.tools = tools.map(tool => tool instanceof DynamicStructuredTool ? tool : this.turnToTool(tool));
9
+ if (this.checkDuplicatedTools()) {
10
+ throw new Error(`Error! mehrere tools wurden unter den gleichen Namen registriert!`);
11
+ }
12
+ }
13
+ getTool(name) {
14
+ const tools = this.tools.filter(tool => tool.name.toLowerCase() === name.toLowerCase());
15
+ if (tools.length > 1) {
16
+ throw new Error(`Error! mehrere tools wurden unter den gleichen Namen ${name} registriert!`);
17
+ }
18
+ if (tools.length !== 1) {
19
+ console.error(`unter ${name} wurde kein Tool gefunden`);
20
+ return;
21
+ }
22
+ return tools[0];
23
+ }
24
+ getTools(...names) {
25
+ return names.map(name => this.getTool(name));
26
+ }
27
+ turnToTool(tool) {
28
+ return new DynamicStructuredTool({
29
+ name: tool.name,
30
+ description: tool.description,
31
+ schema: tool.schema,
32
+ func: tool.func
33
+ });
34
+ }
35
+ checkDuplicatedTools() {
36
+ const dublikaes = this.tools.filter((tool, index) => {
37
+ return this.tools.indexOf(tool) !== index;
38
+ });
39
+ return dublikaes.length > 0 ? true : false;
40
+ }
41
+ get allTools() {
42
+ return this.tools;
43
+ }
44
+ }
45
+ //# sourceMappingURL=BasicToolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasicToolRegistry.js","sourceRoot":"","sources":["../../../src/heart/tools/BasicToolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAW7D;;GAEG;AACH,MAAM,OAAO,YAAY;IACb,KAAK,CAAwB;IACrC,YAAY,KAAO;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,YAAY,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACpG,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAC,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;QACxF,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,IAAwB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACvF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,IAAI,eAAe,CAAC,CAAA;QAChG,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,2BAA2B,CAAC,CAAA;YACvD,OAAM;QACV,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IAEM,QAAQ,CAAC,GAAG,KAA2B;QAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChD,CAAC;IAEO,UAAU,CAAC,IAAS;QACxB,OAAO,IAAI,qBAAqB,CAAC;YAC7B,IAAI,EAAC,IAAI,CAAC,IAAI;YACd,WAAW,EAAC,IAAI,CAAC,WAAW;YAC5B,MAAM,EAAC,IAAI,CAAC,MAAM;YAClB,IAAI,EAAC,IAAI,CAAC,IAAI;SACjB,CAAC,CAAA;IAEN,CAAC;IAEO,oBAAoB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAC,KAAK,EAAC,EAAE;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;CACJ"}
@@ -0,0 +1,41 @@
1
+ import { type Tool } from "./BasicToolRegistry";
2
+ import type { DynamicStructuredTool } from "@langchain/core/tools";
3
+ import { Zodios, type ApiOf } from "zodios";
4
+ export type ExtractToolNames<T extends readonly {
5
+ name: string;
6
+ }[]> = {
7
+ [K in keyof T]: T[K] extends {
8
+ name: string;
9
+ } ? T[K]['name'] : never;
10
+ }[number];
11
+ type ExtractToolNamesFromZodiosApi<Api extends readonly any[]> = {
12
+ [K in keyof Api]: Api[K] extends {
13
+ name: infer N;
14
+ } ? N extends string ? N : Api[K] extends {
15
+ method: infer M;
16
+ path: infer P;
17
+ } ? `call api ${M & string} ${P & string}` : never : Api[K] extends {
18
+ method: infer M;
19
+ path: infer P;
20
+ } ? `call api ${M & string} ${P & string}` : never;
21
+ }[number];
22
+ type ExtractToolNamesFromInput<T extends readonly (Tool | Zodios<any>)[]> = {
23
+ [K in keyof T]: T[K] extends Tool ? T[K]['name'] : T[K] extends Zodios<infer Api> ? ExtractToolNamesFromZodiosApi<ApiOf<T[K]>> : never;
24
+ }[number];
25
+ /**
26
+ * needs testing!!!
27
+ */
28
+ /**
29
+ * vergiss nicht 'as const' am ende des input-arrays zu verwenden für perekten autocomplete!!!
30
+ */
31
+ export declare class CombinedToolRegistry<T extends readonly (Tool | Zodios<any>)[]> {
32
+ private BaseToolRegistry;
33
+ private ZodiosToolRegistry;
34
+ private tools;
35
+ constructor(input: T);
36
+ getTool(name: ExtractToolNamesFromInput<T>): DynamicStructuredTool | undefined;
37
+ getTools(...names: ExtractToolNamesFromInput<T>[]): DynamicStructuredTool[];
38
+ get allTools(): DynamicStructuredTool[];
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=CombinedRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombinedRegistry.d.ts","sourceRoot":"","sources":["../../../src/heart/tools/CombinedRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAG7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AAG3C,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,SAAS;IAAC,IAAI,EAAC,MAAM,CAAA;CAAC,EAAE,IAAI;KAC9D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAC,IAAI,EAAC,MAAM,CAAA;KAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK;CACpE,CAAC,MAAM,CAAC,CAAA;AAET,KAAK,6BAA6B,CAAC,GAAG,SAAS,SAAS,GAAG,EAAE,IAAI;KAC5D,CAAC,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;QAAC,IAAI,EAAE,MAAM,CAAC,CAAA;KAAC,GAC1C,CAAC,SAAS,MAAM,GACZ,CAAC,GACD,GAAG,CAAC,CAAC,CAAC,SAAS;QAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,CAAA;KAAC,GAC/C,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,GACtC,KAAK,GACT,GAAG,CAAC,CAAC,CAAC,SAAS;QAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,CAAA;KAAC,GAC/C,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,GACtC,KAAK;CACd,CAAC,MAAM,CAAC,CAAA;AAET,KAAK,yBAAyB,CAAC,CAAC,SAAS,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI;KACvE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAC3B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GACZ,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,CAAC,GAC9B,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC1C,KAAK;CACd,CAAC,MAAM,CAAC,CAAA;AAET;;GAEG;AACH;;GAEG;AACH,qBAAa,oBAAoB,CAAC,CAAC,SAAS,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;IACvE,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,kBAAkB,CAA4C;IACtE,OAAO,CAAC,KAAK,CAAwB;gBAEzB,KAAK,EAAE,CAAC;IAyBpB,OAAO,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,qBAAqB,GAAG,SAAS;IAI9E,QAAQ,CAAC,GAAG,KAAK,EAAE,yBAAyB,CAAC,CAAC,CAAC,EAAE,GAAG,qBAAqB,EAAE;IAI3E,IAAI,QAAQ,IAAI,qBAAqB,EAAE,CAEtC;CACJ"}
@@ -0,0 +1,46 @@
1
+ import { ToolRegistry } from "./BasicToolRegistry";
2
+ import { ZodiosToolRegistry } from "./ZodiosToolRegistry";
3
+ import { Zodios } from "zodios";
4
+ /**
5
+ * needs testing!!!
6
+ */
7
+ /**
8
+ * vergiss nicht 'as const' am ende des input-arrays zu verwenden für perekten autocomplete!!!
9
+ */
10
+ export class CombinedToolRegistry {
11
+ BaseToolRegistry;
12
+ ZodiosToolRegistry;
13
+ tools;
14
+ constructor(input) {
15
+ //getting and checking the tools
16
+ const baseTools = input.filter((tool) => {
17
+ return typeof tool === "object" && tool !== null && "name" in tool && "description" in tool && "schema" in tool && "func" in tool;
18
+ });
19
+ if (baseTools.length > 0) {
20
+ this.BaseToolRegistry = new ToolRegistry(baseTools);
21
+ }
22
+ //getting and checking the zodios clients
23
+ const zodiosClients = input.filter((item) => {
24
+ return item instanceof Zodios;
25
+ });
26
+ if (zodiosClients.length > 1) {
27
+ throw new Error("Only one Zodios client can be registered");
28
+ }
29
+ const zodiosClient = zodiosClients[0];
30
+ if (zodiosClient) {
31
+ this.ZodiosToolRegistry = new ZodiosToolRegistry(zodiosClient);
32
+ }
33
+ //combining the tools
34
+ this.tools = [...(this.BaseToolRegistry?.allTools || []), ...(this.ZodiosToolRegistry?.allTools || [])];
35
+ }
36
+ getTool(name) {
37
+ return this.tools.find((tool) => tool.name === name);
38
+ }
39
+ getTools(...names) {
40
+ return names.map((name) => this.getTool(name)).filter((tool) => tool !== undefined);
41
+ }
42
+ get allTools() {
43
+ return this.tools;
44
+ }
45
+ }
46
+ //# sourceMappingURL=CombinedRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombinedRegistry.js","sourceRoot":"","sources":["../../../src/heart/tools/CombinedRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAa,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAGzD,OAAO,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAA;AA2B3C;;GAEG;AACH;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACrB,gBAAgB,CAAiC;IACjD,kBAAkB,CAA4C;IAC9D,KAAK,CAAwB;IAErC,YAAY,KAAQ;QAChB,gCAAgC;QAChC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAC,EAAE;YACnC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,aAAa,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAA;QACrI,CAAC,CAAC,CAAA;QACF,IAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAC,CAAC;YACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAA;QACvD,CAAC;QAED,yCAAyC;QACzC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACxC,OAAO,IAAI,YAAY,MAAM,CAAA;QACjC,CAAC,CAAC,CAAA;QACF,IAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAC,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QACrC,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAA;QAClE,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAA;IAC3G,CAAC;IAED,OAAO,CAAC,IAAkC;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,QAAQ,CAAC,GAAG,KAAqC;QAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAiC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IACtH,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;CACJ"}
@@ -0,0 +1,22 @@
1
+ import type { Zodios, ZodiosEndpointDescription, ApiOf } from "zodios";
2
+ import { DynamicStructuredTool } from "../../imports";
3
+ import { Prettify } from "../../helpers";
4
+ import type { ExtractToolNames } from "./CombinedRegistry";
5
+ export type ZodiosEndpointWithAlias<R> = Prettify<ZodiosEndpointDescription<R> & {
6
+ name?: string;
7
+ }>;
8
+ /**
9
+ * needs testing!!!
10
+ */
11
+ export declare class ZodiosToolRegistry<Z extends Zodios<any>> {
12
+ private apiSchema;
13
+ private tools;
14
+ private zodiosClient;
15
+ constructor(zodiosClient: Z);
16
+ getTool(name: ExtractToolNames<ApiOf<Z>>): DynamicStructuredTool | undefined;
17
+ getTools(...names: ExtractToolNames<ApiOf<Z>>[]): (DynamicStructuredTool | undefined)[];
18
+ get allTools(): DynamicStructuredTool[];
19
+ private turnApiIntoTools;
20
+ private buildToolSchema;
21
+ }
22
+ //# sourceMappingURL=ZodiosToolRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZodiosToolRegistry.d.ts","sourceRoot":"","sources":["../../../src/heart/tools/ZodiosToolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,MAAM,MAAM,uBAAuB,CAAC,CAAC,IAAI,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC,CAAA;AAEF;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC;IACjD,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAG;gBACX,YAAY,EAAE,CAAC;IAMpB,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,qBAAqB,GAAG,SAAS;IAa5E,QAAQ,CAAC,GAAG,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,qBAAqB,GAAG,SAAS,CAAC,EAAE;IAI9F,IAAI,QAAQ,IAAI,qBAAqB,EAAE,CAEtC;IAED,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,eAAe;CAkC1B"}
@@ -0,0 +1,80 @@
1
+ import { DynamicStructuredTool } from "../../imports";
2
+ import { z } from 'zod/v3';
3
+ /**
4
+ * needs testing!!!
5
+ */
6
+ export class ZodiosToolRegistry {
7
+ apiSchema;
8
+ tools;
9
+ zodiosClient;
10
+ constructor(zodiosClient) {
11
+ this.zodiosClient = zodiosClient;
12
+ this.apiSchema = zodiosClient.api;
13
+ this.tools = this.turnApiIntoTools();
14
+ }
15
+ getTool(name) {
16
+ const tools = this.tools.filter((tool) => tool.name?.toLowerCase() === name.toLowerCase());
17
+ if (tools.length > 1) {
18
+ throw new Error(`Error! es wurden unter dem gleichen namen ${name} mehrere tools registriert!`);
19
+ }
20
+ const tool = tools[0];
21
+ if (!tool) {
22
+ console.error(`Tool ${name} not found`);
23
+ return undefined;
24
+ }
25
+ return tool;
26
+ }
27
+ getTools(...names) {
28
+ return names.map(name => this.getTool(name));
29
+ }
30
+ get allTools() {
31
+ return this.tools;
32
+ }
33
+ turnApiIntoTools() {
34
+ return this.apiSchema.map((endpoint) => {
35
+ return new DynamicStructuredTool({
36
+ name: endpoint.name || `call api ${endpoint.method} ${endpoint.path}`,
37
+ description: endpoint.description || `calls the api ${endpoint.method} ${endpoint.path}`,
38
+ schema: this.buildToolSchema(endpoint),
39
+ func: async (input) => {
40
+ return this.zodiosClient.request({
41
+ method: endpoint.method,
42
+ url: endpoint.path,
43
+ params: input?.params,
44
+ queries: input?.queries,
45
+ headers: input?.headers,
46
+ data: input?.body,
47
+ });
48
+ },
49
+ });
50
+ });
51
+ }
52
+ buildToolSchema(endpoint) {
53
+ const queries = {};
54
+ const headers = {};
55
+ let body;
56
+ for (const param of endpoint.parameters ?? []) {
57
+ if (param.type === "Query") {
58
+ queries[param.name] = param.schema;
59
+ }
60
+ if (param.type === "Header") {
61
+ headers[param.name] = param.schema;
62
+ }
63
+ if (param.type === "Body") {
64
+ body = param.schema;
65
+ }
66
+ }
67
+ const schemaShape = {};
68
+ if (Object.keys(queries).length > 0) {
69
+ schemaShape.queries = z.object(queries).optional();
70
+ }
71
+ if (Object.keys(headers).length > 0) {
72
+ schemaShape.headers = z.object(headers).optional();
73
+ }
74
+ if (body) {
75
+ schemaShape.body = body.optional();
76
+ }
77
+ return z.object(schemaShape);
78
+ }
79
+ }
80
+ //# sourceMappingURL=ZodiosToolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZodiosToolRegistry.js","sourceRoot":"","sources":["../../../src/heart/tools/ZodiosToolRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { BaseChatModel, BaseOutputParser, ChatPromptTemplate } from "./imports";
2
+ import { z } from "zod/v3";
3
+ export type LLMKind = "groq" | "localOllama" | "vision";
4
+ export type Prettify<T> = {
5
+ [K in keyof T]: T[K];
6
+ } & {};
7
+ export declare function logChunk(chunk: string): void;
8
+ export declare function createChain(prompt: ChatPromptTemplate, llm: BaseChatModel, parser?: BaseOutputParser | null): import("@langchain/core/dist/runnables/base").Runnable<any, unknown, import("@langchain/core/dist/runnables/types").RunnableConfig<Record<string, any>>>;
9
+ export declare function wait(ms: number): Promise<unknown>;
10
+ export declare function stream(text: string | Array<any>, wait_in_between?: number): AsyncGenerator<string, void, unknown>;
11
+ export type LLMConfig = {
12
+ chatgroqApiKey?: string;
13
+ openrouterApiKey?: string;
14
+ };
15
+ export declare function getLLM(kind?: LLMKind, config?: LLMConfig): any;
16
+ export declare function structure<T extends z.ZodObject<any, any>>({ data, into, llm, retries }: {
17
+ data: any;
18
+ into: T;
19
+ llm: BaseChatModel;
20
+ retries?: number;
21
+ }): Promise<z.infer<T>>;
22
+ /**
23
+ * fasst eine Chat-Konversation zwischen User und Assistant zusammen
24
+ */
25
+ export declare function summarize({ conversation, fokuss, llm, maxWords }: {
26
+ conversation: string;
27
+ fokuss?: string;
28
+ llm: BaseChatModel;
29
+ maxWords?: number;
30
+ }): Promise<string>;
31
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAoC,kBAAkB,EAA8C,MAAM,WAAW,CAAC;AAC9J,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAA;AAEvD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,EAAE,CAAC;AAEP,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,QAQrC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAE,gBAAgB,GAAG,IAAW,4JAEjH;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAC,MAAM,oBAEnC;AAED,wBAAuB,MAAM,CAAC,IAAI,EAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAC,eAAe,GAAC,MAAY,yCAKlF;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,wBAAgB,MAAM,CAAC,IAAI,GAAE,OAAgB,EAAE,MAAM,CAAC,EAAE,SAAS,OA+BhE;AAED,wBAAsB,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC7D,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,OAAW,EACd,EAAC;IACE,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,EAAE,aAAa,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CA4BtB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,EAC5B,YAAY,EACZ,MAAM,EACN,GAAG,EACH,QAAc,EACjB,EAAE;IACC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBlB"}
@@ -0,0 +1,105 @@
1
+ import { ChatGroq, ChatOllama, ChatOpenAI, ChatPromptTemplate, StringOutputParser, StructuredOutputParser } from "./imports";
2
+ export function logChunk(chunk) {
3
+ const flushed = process.stdout.write(chunk);
4
+ if (!flushed) {
5
+ process.stdout.once('drain', () => { });
6
+ }
7
+ else {
8
+ // Explizit flushen, damit Output sofort sichtbar ist
9
+ process.stdout.write('', () => { });
10
+ }
11
+ }
12
+ export function createChain(prompt, llm, parser = null) {
13
+ return parser ? prompt.pipe(llm).pipe(parser) : prompt.pipe(llm);
14
+ }
15
+ export async function wait(ms) {
16
+ return new Promise(resolve => setTimeout(resolve, ms));
17
+ }
18
+ export async function* stream(text, wait_in_between = 100) {
19
+ for (const chunk of text) {
20
+ yield chunk + " ";
21
+ await wait(wait_in_between);
22
+ }
23
+ }
24
+ export function getLLM(kind = "groq", config) {
25
+ switch (kind) {
26
+ case "groq":
27
+ if (!config?.chatgroqApiKey) {
28
+ throw new Error("chatgroqApiKey is required in config for groq LLM");
29
+ }
30
+ return new ChatGroq({
31
+ apiKey: config.chatgroqApiKey,
32
+ model: "llama-3.3-70b-versatile"
33
+ });
34
+ case "vision":
35
+ if (!config?.openrouterApiKey) {
36
+ throw new Error("openrouterApiKey is required in config for vision LLM");
37
+ }
38
+ return new ChatOpenAI({
39
+ apiKey: config.openrouterApiKey,
40
+ configuration: {
41
+ baseURL: "https://openrouter.ai/api/v1",
42
+ },
43
+ model: "openai/gpt-4o-mini"
44
+ });
45
+ case "localOllama":
46
+ return new ChatOllama({
47
+ model: "llama3.2:3b"
48
+ });
49
+ default:
50
+ throw new Error("Unknown LLM kind");
51
+ }
52
+ }
53
+ export async function structure({ data, into, llm, retries = 2 }) {
54
+ const inputString = typeof data === "string" ? data : JSON.stringify(data, null, 2);
55
+ const jsonParser = StructuredOutputParser.fromZodSchema(into);
56
+ const prompt = await ChatPromptTemplate.fromMessages([
57
+ ["system", `Du bist ein JSON-Formatierer.
58
+ REGELN:
59
+ - Gib NUR valides JSON zurück, KEIN anderer Text
60
+ - Keine Markdown Code-Blöcke (\`\`\`json)
61
+ - Halte dich EXAKT an das Schema
62
+
63
+ Schema:
64
+ {format_instructions}`],
65
+ ["human", "{input}"]
66
+ ]).partial({ format_instructions: jsonParser.getFormatInstructions() });
67
+ const chain = createChain(prompt, llm, jsonParser);
68
+ let lastError = null;
69
+ for (let i = 0; i <= retries; i++) {
70
+ try {
71
+ const result = await chain.invoke({ input: inputString });
72
+ return into.parse(result);
73
+ }
74
+ catch (error) {
75
+ lastError = error;
76
+ if (i < retries) {
77
+ console.warn(`structure() Versuch ${i + 1} fehlgeschlagen, retry...`);
78
+ }
79
+ }
80
+ }
81
+ throw new Error(`structure() failed after ${retries + 1} attempts, Error: ${lastError?.message}`);
82
+ }
83
+ /**
84
+ * fasst eine Chat-Konversation zwischen User und Assistant zusammen
85
+ */
86
+ export async function summarize({ conversation, fokuss, llm, maxWords = 150 }) {
87
+ const focusMessage = fokuss
88
+ ? [["system", `Fokussiere dich besonders auf die folgenden Themen:\n${fokuss}`]]
89
+ : [];
90
+ const prompt = ChatPromptTemplate.fromMessages([
91
+ ["system", `Du fasst eine Chat-Konversation zwischen User und Assistant zusammen.
92
+ WICHTIG:
93
+ - Behalte ALLE wichtigen Fakten: Namen, Präferenzen, Entscheidungen, Vereinbarungen
94
+ - Behalte chronologischen Kontext wo relevant für Verständnis
95
+ - Fasse auf max. ${maxWords} Wörter zusammen
96
+ - Format: Kurze, prägnante Zusammenfassung ohne Bullet-Points
97
+ - Ignoriere Small-Talk, fokussiere auf inhaltliche Punkte`],
98
+ ...focusMessage,
99
+ ["human", "{conversation}"]
100
+ ]);
101
+ const chain = createChain(prompt, llm, new StringOutputParser());
102
+ const result = await chain.invoke({ conversation });
103
+ return typeof result === "string" ? result : String(result);
104
+ }
105
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}