illuma-agents 1.0.7 → 1.0.9
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/LICENSE +1 -5
- package/dist/cjs/common/enum.cjs +1 -2
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -2
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +99 -0
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +78 -9
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +185 -28
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +13 -16
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +14 -14
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs +10 -1
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +4 -1
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +163 -55
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +29 -25
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs +25 -25
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +6 -1
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +162 -35
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/llm.cjs +0 -1
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs +7 -7
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/esm/common/enum.mjs +1 -2
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -2
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +97 -0
- package/dist/esm/llm/bedrock/index.mjs.map +1 -0
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +79 -10
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +184 -30
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +2 -5
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +14 -14
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs +10 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +4 -1
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +164 -56
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +30 -26
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/search/anthropic.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs +25 -25
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +6 -1
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +162 -35
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/llm.mjs +0 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/title.mjs +7 -7
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/types/common/enum.d.ts +1 -2
- package/dist/types/llm/bedrock/index.d.ts +36 -0
- package/dist/types/llm/google/index.d.ts +10 -0
- package/dist/types/llm/google/types.d.ts +11 -1
- package/dist/types/llm/google/utils/common.d.ts +17 -2
- package/dist/types/tools/ToolNode.d.ts +9 -1
- package/dist/types/tools/search/types.d.ts +2 -0
- package/dist/types/types/llm.d.ts +3 -8
- package/dist/types/types/tools.d.ts +1 -1
- package/package.json +15 -11
- package/src/common/enum.ts +1 -2
- package/src/common/index.ts +1 -1
- package/src/instrumentation.ts +22 -22
- package/src/llm/anthropic/llm.spec.ts +1442 -1442
- package/src/llm/anthropic/types.ts +140 -140
- package/src/llm/anthropic/utils/message_inputs.ts +757 -660
- package/src/llm/anthropic/utils/output_parsers.ts +133 -133
- package/src/llm/anthropic/utils/tools.ts +29 -29
- package/src/llm/bedrock/index.ts +128 -0
- package/src/llm/fake.ts +133 -133
- package/src/llm/google/data/gettysburg10.wav +0 -0
- package/src/llm/google/data/hotdog.jpg +0 -0
- package/src/llm/google/index.ts +129 -14
- package/src/llm/google/llm.spec.ts +932 -0
- package/src/llm/google/types.ts +56 -43
- package/src/llm/google/utils/common.ts +873 -660
- package/src/llm/google/utils/tools.ts +160 -160
- package/src/llm/openai/types.ts +24 -24
- package/src/llm/openai/utils/isReasoningModel.test.ts +90 -90
- package/src/llm/providers.ts +2 -7
- package/src/llm/text.ts +94 -94
- package/src/messages/core.ts +463 -463
- package/src/messages/formatAgentMessages.tools.test.ts +400 -400
- package/src/messages/formatMessage.test.ts +693 -693
- package/src/messages/ids.ts +26 -26
- package/src/messages/prune.ts +567 -567
- package/src/messages/shiftIndexTokenCountMap.test.ts +81 -81
- package/src/mockStream.ts +98 -98
- package/src/prompts/collab.ts +5 -5
- package/src/prompts/index.ts +1 -1
- package/src/prompts/taskmanager.ts +61 -61
- package/src/run.ts +13 -4
- package/src/scripts/ant_web_search_edge_case.ts +162 -0
- package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
- package/src/scripts/args.ts +48 -48
- package/src/scripts/caching.ts +123 -123
- package/src/scripts/code_exec_files.ts +193 -193
- package/src/scripts/empty_input.ts +137 -137
- package/src/scripts/image.ts +178 -178
- package/src/scripts/memory.ts +97 -97
- package/src/scripts/thinking.ts +149 -149
- package/src/specs/anthropic.simple.test.ts +67 -0
- package/src/specs/spec.utils.ts +3 -3
- package/src/specs/token-distribution-edge-case.test.ts +316 -316
- package/src/specs/tool-error.test.ts +193 -193
- package/src/splitStream.test.ts +691 -691
- package/src/splitStream.ts +234 -234
- package/src/stream.test.ts +94 -94
- package/src/stream.ts +4 -1
- package/src/tools/ToolNode.ts +206 -64
- package/src/tools/handlers.ts +32 -28
- package/src/tools/search/anthropic.ts +51 -51
- package/src/tools/search/content.test.ts +173 -173
- package/src/tools/search/content.ts +147 -147
- package/src/tools/search/direct-url.test.ts +530 -0
- package/src/tools/search/firecrawl.ts +210 -210
- package/src/tools/search/format.ts +250 -250
- package/src/tools/search/highlights.ts +320 -320
- package/src/tools/search/index.ts +2 -2
- package/src/tools/search/jina-reranker.test.ts +126 -126
- package/src/tools/search/output.md +2775 -2775
- package/src/tools/search/rerankers.ts +242 -242
- package/src/tools/search/schema.ts +63 -63
- package/src/tools/search/search.ts +766 -759
- package/src/tools/search/serper-scraper.ts +155 -155
- package/src/tools/search/test.html +883 -883
- package/src/tools/search/test.md +642 -642
- package/src/tools/search/test.ts +159 -159
- package/src/tools/search/tool.ts +619 -471
- package/src/tools/search/types.ts +689 -687
- package/src/tools/search/utils.ts +79 -79
- package/src/types/index.ts +6 -6
- package/src/types/llm.ts +2 -8
- package/src/types/tools.ts +80 -80
- package/src/utils/graph.ts +10 -10
- package/src/utils/llm.ts +26 -27
- package/src/utils/llmConfig.ts +5 -3
- package/src/utils/logging.ts +48 -48
- package/src/utils/misc.ts +57 -57
- package/src/utils/run.ts +100 -100
- package/src/utils/title.ts +165 -165
- package/dist/cjs/llm/ollama/index.cjs +0 -70
- package/dist/cjs/llm/ollama/index.cjs.map +0 -1
- package/dist/cjs/llm/ollama/utils.cjs +0 -158
- package/dist/cjs/llm/ollama/utils.cjs.map +0 -1
- package/dist/esm/llm/ollama/index.mjs +0 -68
- package/dist/esm/llm/ollama/index.mjs.map +0 -1
- package/dist/esm/llm/ollama/utils.mjs +0 -155
- package/dist/esm/llm/ollama/utils.mjs.map +0 -1
- package/dist/types/llm/ollama/index.d.ts +0 -8
- package/dist/types/llm/ollama/utils.d.ts +0 -7
- package/src/llm/ollama/index.ts +0 -92
- package/src/llm/ollama/utils.ts +0 -193
- package/src/proto/CollabGraph.ts +0 -269
- package/src/proto/TaskManager.ts +0 -243
- package/src/proto/collab.ts +0 -200
- package/src/proto/collab_design.ts +0 -184
- package/src/proto/collab_design_v2.ts +0 -224
- package/src/proto/collab_design_v3.ts +0 -255
- package/src/proto/collab_design_v4.ts +0 -220
- package/src/proto/collab_design_v5.ts +0 -251
- package/src/proto/collab_graph.ts +0 -181
- package/src/proto/collab_original.ts +0 -123
- package/src/proto/example.ts +0 -93
- package/src/proto/example_new.ts +0 -68
- package/src/proto/example_old.ts +0 -201
- package/src/proto/example_test.ts +0 -152
- package/src/proto/example_test_anthropic.ts +0 -100
- package/src/proto/log_stream.ts +0 -202
- package/src/proto/main_collab_community_event.ts +0 -133
- package/src/proto/main_collab_design_v2.ts +0 -96
- package/src/proto/main_collab_design_v4.ts +0 -100
- package/src/proto/main_collab_design_v5.ts +0 -135
- package/src/proto/main_collab_global_analysis.ts +0 -122
- package/src/proto/main_collab_hackathon_event.ts +0 -153
- package/src/proto/main_collab_space_mission.ts +0 -153
- package/src/proto/main_philosophy.ts +0 -210
- package/src/proto/original_script.ts +0 -126
- package/src/proto/standard.ts +0 -100
- package/src/proto/stream.ts +0 -56
- package/src/proto/tasks.ts +0 -118
- package/src/proto/tools/global_analysis_tools.ts +0 -86
- package/src/proto/tools/space_mission_tools.ts +0 -60
- package/src/proto/vertexai.ts +0 -54
package/src/utils/misc.ts
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
export function isPresent(value: string | null | undefined): value is string {
|
|
2
|
-
return value != null && value !== '';
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Unescapes a c-escaped string
|
|
7
|
-
* @param str The string to unescape
|
|
8
|
-
* @returns The unescaped string
|
|
9
|
-
*/
|
|
10
|
-
const unescapeString = (string: string): string =>
|
|
11
|
-
string.replace(/\\(.)/g, (_, char) => {
|
|
12
|
-
switch (char) {
|
|
13
|
-
case 'n':
|
|
14
|
-
return '\n';
|
|
15
|
-
case 't':
|
|
16
|
-
return '\t';
|
|
17
|
-
case 'r':
|
|
18
|
-
return '\r';
|
|
19
|
-
case '"':
|
|
20
|
-
return '"';
|
|
21
|
-
case '\'':
|
|
22
|
-
return '\'';
|
|
23
|
-
case '\\':
|
|
24
|
-
return '\\';
|
|
25
|
-
default:
|
|
26
|
-
return char;
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Recursively unescapes all string values in an object
|
|
32
|
-
* @param obj The object to unescape
|
|
33
|
-
* @returns The unescaped object
|
|
34
|
-
*/
|
|
35
|
-
export function unescapeObject(obj: unknown, key?: string): unknown {
|
|
36
|
-
if (typeof obj === 'string') {
|
|
37
|
-
let unescaped = unescapeString(obj);
|
|
38
|
-
if (key === 'filePath' && unescaped.match(/^"(.+)"$/)) {
|
|
39
|
-
unescaped = unescaped.substring(1, unescaped.length - 1);
|
|
40
|
-
}
|
|
41
|
-
return unescaped;
|
|
42
|
-
}
|
|
43
|
-
if (Array.isArray(obj)) {
|
|
44
|
-
return obj.map((value) =>
|
|
45
|
-
unescapeObject(value, key === 'contextPaths' ? 'filePath' : '')
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
if (typeof obj === 'object' && obj !== null) {
|
|
49
|
-
return Object.fromEntries(
|
|
50
|
-
Object.entries(obj).map(([key, value]) => [
|
|
51
|
-
key,
|
|
52
|
-
unescapeObject(value, key),
|
|
53
|
-
])
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
return obj;
|
|
57
|
-
}
|
|
1
|
+
export function isPresent(value: string | null | undefined): value is string {
|
|
2
|
+
return value != null && value !== '';
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Unescapes a c-escaped string
|
|
7
|
+
* @param str The string to unescape
|
|
8
|
+
* @returns The unescaped string
|
|
9
|
+
*/
|
|
10
|
+
const unescapeString = (string: string): string =>
|
|
11
|
+
string.replace(/\\(.)/g, (_, char) => {
|
|
12
|
+
switch (char) {
|
|
13
|
+
case 'n':
|
|
14
|
+
return '\n';
|
|
15
|
+
case 't':
|
|
16
|
+
return '\t';
|
|
17
|
+
case 'r':
|
|
18
|
+
return '\r';
|
|
19
|
+
case '"':
|
|
20
|
+
return '"';
|
|
21
|
+
case '\'':
|
|
22
|
+
return '\'';
|
|
23
|
+
case '\\':
|
|
24
|
+
return '\\';
|
|
25
|
+
default:
|
|
26
|
+
return char;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Recursively unescapes all string values in an object
|
|
32
|
+
* @param obj The object to unescape
|
|
33
|
+
* @returns The unescaped object
|
|
34
|
+
*/
|
|
35
|
+
export function unescapeObject(obj: unknown, key?: string): unknown {
|
|
36
|
+
if (typeof obj === 'string') {
|
|
37
|
+
let unescaped = unescapeString(obj);
|
|
38
|
+
if (key === 'filePath' && unescaped.match(/^"(.+)"$/)) {
|
|
39
|
+
unescaped = unescaped.substring(1, unescaped.length - 1);
|
|
40
|
+
}
|
|
41
|
+
return unescaped;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(obj)) {
|
|
44
|
+
return obj.map((value) =>
|
|
45
|
+
unescapeObject(value, key === 'contextPaths' ? 'filePath' : '')
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
if (typeof obj === 'object' && obj !== null) {
|
|
49
|
+
return Object.fromEntries(
|
|
50
|
+
Object.entries(obj).map(([key, value]) => [
|
|
51
|
+
key,
|
|
52
|
+
unescapeObject(value, key),
|
|
53
|
+
])
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return obj;
|
|
57
|
+
}
|
package/src/utils/run.ts
CHANGED
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';
|
|
2
|
-
import {
|
|
3
|
-
mergeConfigs,
|
|
4
|
-
patchConfig,
|
|
5
|
-
Runnable,
|
|
6
|
-
RunnableConfig,
|
|
7
|
-
} from '@langchain/core/runnables';
|
|
8
|
-
import { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Delays the execution for a specified number of milliseconds.
|
|
12
|
-
*
|
|
13
|
-
* @param {number} ms - The number of milliseconds to delay.
|
|
14
|
-
* @return {Promise<void>} A promise that resolves after the specified delay.
|
|
15
|
-
*/
|
|
16
|
-
export function sleep(ms: number): Promise<void> {
|
|
17
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
-
export interface RunnableCallableArgs extends Partial<any> {
|
|
22
|
-
name?: string;
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
-
func: (...args: any[]) => any;
|
|
25
|
-
tags?: string[];
|
|
26
|
-
trace?: boolean;
|
|
27
|
-
recurse?: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class RunnableCallable<I = unknown, O = unknown> extends Runnable<I, O> {
|
|
31
|
-
lc_namespace: string[] = ['langgraph'];
|
|
32
|
-
|
|
33
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
-
func: (...args: any[]) => any;
|
|
35
|
-
|
|
36
|
-
tags?: string[];
|
|
37
|
-
|
|
38
|
-
config?: RunnableConfig;
|
|
39
|
-
|
|
40
|
-
trace: boolean = true;
|
|
41
|
-
|
|
42
|
-
recurse: boolean = true;
|
|
43
|
-
|
|
44
|
-
constructor(fields: RunnableCallableArgs) {
|
|
45
|
-
super();
|
|
46
|
-
this.name = fields.name ?? fields.func.name;
|
|
47
|
-
this.func = fields.func;
|
|
48
|
-
this.config = fields.tags ? { tags: fields.tags } : undefined;
|
|
49
|
-
this.trace = fields.trace ?? this.trace;
|
|
50
|
-
this.recurse = fields.recurse ?? this.recurse;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
protected async _tracedInvoke(
|
|
54
|
-
input: I,
|
|
55
|
-
config?: Partial<RunnableConfig>,
|
|
56
|
-
runManager?: CallbackManagerForChainRun
|
|
57
|
-
): Promise<O> {
|
|
58
|
-
return new Promise<O>((resolve, reject) => {
|
|
59
|
-
const childConfig = patchConfig(config, {
|
|
60
|
-
callbacks: runManager?.getChild(),
|
|
61
|
-
});
|
|
62
|
-
void AsyncLocalStorageProviderSingleton.runWithConfig(
|
|
63
|
-
childConfig,
|
|
64
|
-
async () => {
|
|
65
|
-
try {
|
|
66
|
-
const output = await this.func(input, childConfig);
|
|
67
|
-
resolve(output);
|
|
68
|
-
} catch (e) {
|
|
69
|
-
reject(e);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
);
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async invoke(
|
|
77
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
-
input: any,
|
|
79
|
-
options?: Partial<RunnableConfig> | undefined
|
|
80
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
-
): Promise<any> {
|
|
82
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
-
let returnValue: any;
|
|
84
|
-
|
|
85
|
-
if (this.trace) {
|
|
86
|
-
returnValue = await this._callWithConfig(
|
|
87
|
-
this._tracedInvoke,
|
|
88
|
-
input,
|
|
89
|
-
mergeConfigs(this.config, options)
|
|
90
|
-
);
|
|
91
|
-
} else {
|
|
92
|
-
returnValue = await this.func(input, mergeConfigs(this.config, options));
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (Runnable.isRunnable(returnValue) && this.recurse) {
|
|
96
|
-
return await returnValue.invoke(input, options);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return returnValue;
|
|
100
|
-
}
|
|
1
|
+
import { CallbackManagerForChainRun } from '@langchain/core/callbacks/manager';
|
|
2
|
+
import {
|
|
3
|
+
mergeConfigs,
|
|
4
|
+
patchConfig,
|
|
5
|
+
Runnable,
|
|
6
|
+
RunnableConfig,
|
|
7
|
+
} from '@langchain/core/runnables';
|
|
8
|
+
import { AsyncLocalStorageProviderSingleton } from '@langchain/core/singletons';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Delays the execution for a specified number of milliseconds.
|
|
12
|
+
*
|
|
13
|
+
* @param {number} ms - The number of milliseconds to delay.
|
|
14
|
+
* @return {Promise<void>} A promise that resolves after the specified delay.
|
|
15
|
+
*/
|
|
16
|
+
export function sleep(ms: number): Promise<void> {
|
|
17
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
export interface RunnableCallableArgs extends Partial<any> {
|
|
22
|
+
name?: string;
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
func: (...args: any[]) => any;
|
|
25
|
+
tags?: string[];
|
|
26
|
+
trace?: boolean;
|
|
27
|
+
recurse?: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class RunnableCallable<I = unknown, O = unknown> extends Runnable<I, O> {
|
|
31
|
+
lc_namespace: string[] = ['langgraph'];
|
|
32
|
+
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
func: (...args: any[]) => any;
|
|
35
|
+
|
|
36
|
+
tags?: string[];
|
|
37
|
+
|
|
38
|
+
config?: RunnableConfig;
|
|
39
|
+
|
|
40
|
+
trace: boolean = true;
|
|
41
|
+
|
|
42
|
+
recurse: boolean = true;
|
|
43
|
+
|
|
44
|
+
constructor(fields: RunnableCallableArgs) {
|
|
45
|
+
super();
|
|
46
|
+
this.name = fields.name ?? fields.func.name;
|
|
47
|
+
this.func = fields.func;
|
|
48
|
+
this.config = fields.tags ? { tags: fields.tags } : undefined;
|
|
49
|
+
this.trace = fields.trace ?? this.trace;
|
|
50
|
+
this.recurse = fields.recurse ?? this.recurse;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected async _tracedInvoke(
|
|
54
|
+
input: I,
|
|
55
|
+
config?: Partial<RunnableConfig>,
|
|
56
|
+
runManager?: CallbackManagerForChainRun
|
|
57
|
+
): Promise<O> {
|
|
58
|
+
return new Promise<O>((resolve, reject) => {
|
|
59
|
+
const childConfig = patchConfig(config, {
|
|
60
|
+
callbacks: runManager?.getChild(),
|
|
61
|
+
});
|
|
62
|
+
void AsyncLocalStorageProviderSingleton.runWithConfig(
|
|
63
|
+
childConfig,
|
|
64
|
+
async () => {
|
|
65
|
+
try {
|
|
66
|
+
const output = await this.func(input, childConfig);
|
|
67
|
+
resolve(output);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
reject(e);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async invoke(
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
input: any,
|
|
79
|
+
options?: Partial<RunnableConfig> | undefined
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
): Promise<any> {
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
let returnValue: any;
|
|
84
|
+
|
|
85
|
+
if (this.trace) {
|
|
86
|
+
returnValue = await this._callWithConfig(
|
|
87
|
+
this._tracedInvoke,
|
|
88
|
+
input,
|
|
89
|
+
mergeConfigs(this.config, options)
|
|
90
|
+
);
|
|
91
|
+
} else {
|
|
92
|
+
returnValue = await this.func(input, mergeConfigs(this.config, options));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (Runnable.isRunnable(returnValue) && this.recurse) {
|
|
96
|
+
return await returnValue.invoke(input, options);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return returnValue;
|
|
100
|
+
}
|
|
101
101
|
}
|
package/src/utils/title.ts
CHANGED
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ChatPromptTemplate } from '@langchain/core/prompts';
|
|
3
|
-
import { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';
|
|
4
|
-
import type { Runnable, RunnableConfig } from '@langchain/core/runnables';
|
|
5
|
-
import type { AIMessage } from '@langchain/core/messages';
|
|
6
|
-
import type * as t from '@/types';
|
|
7
|
-
import { ContentTypes } from '@/common';
|
|
8
|
-
|
|
9
|
-
const defaultTitlePrompt = `Analyze this conversation and provide:
|
|
10
|
-
1. The detected language of the conversation
|
|
11
|
-
2. A concise title in the detected language (5 words or less, no punctuation or quotation)
|
|
12
|
-
|
|
13
|
-
{convo}`;
|
|
14
|
-
|
|
15
|
-
const titleSchema = z.object({
|
|
16
|
-
title: z
|
|
17
|
-
.string()
|
|
18
|
-
.describe(
|
|
19
|
-
'A concise title for the conversation in 5 words or less, without punctuation or quotation'
|
|
20
|
-
),
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const combinedSchema = z.object({
|
|
24
|
-
language: z.string().describe('The detected language of the conversation'),
|
|
25
|
-
title: z
|
|
26
|
-
.string()
|
|
27
|
-
.describe(
|
|
28
|
-
'A concise title for the conversation in 5 words or less, without punctuation or quotation'
|
|
29
|
-
),
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
export const createTitleRunnable = async (
|
|
33
|
-
model: t.ChatModelInstance,
|
|
34
|
-
_titlePrompt?: string
|
|
35
|
-
): Promise<Runnable> => {
|
|
36
|
-
// Disabled since this works fine
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
38
|
-
/* @ts-ignore */
|
|
39
|
-
const titleLLM = model.withStructuredOutput(titleSchema);
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
41
|
-
/* @ts-ignore */
|
|
42
|
-
const combinedLLM = model.withStructuredOutput(combinedSchema);
|
|
43
|
-
|
|
44
|
-
const titlePrompt = ChatPromptTemplate.fromTemplate(
|
|
45
|
-
_titlePrompt ?? defaultTitlePrompt
|
|
46
|
-
).withConfig({ runName: 'TitlePrompt' });
|
|
47
|
-
|
|
48
|
-
const titleOnlyInnerChain = RunnableSequence.from([titlePrompt, titleLLM]);
|
|
49
|
-
const combinedInnerChain = RunnableSequence.from([titlePrompt, combinedLLM]);
|
|
50
|
-
|
|
51
|
-
/** Wrap titleOnlyChain in RunnableLambda to create parent span */
|
|
52
|
-
const titleOnlyChain = new RunnableLambda({
|
|
53
|
-
func: async (
|
|
54
|
-
input: { convo: string },
|
|
55
|
-
config?: Partial<RunnableConfig>
|
|
56
|
-
): Promise<{ title: string }> => {
|
|
57
|
-
return await titleOnlyInnerChain.invoke(input, config);
|
|
58
|
-
},
|
|
59
|
-
}).withConfig({ runName: 'TitleOnlyChain' });
|
|
60
|
-
|
|
61
|
-
/** Wrap combinedChain in RunnableLambda to create parent span */
|
|
62
|
-
const combinedChain = new RunnableLambda({
|
|
63
|
-
func: async (
|
|
64
|
-
input: { convo: string },
|
|
65
|
-
config?: Partial<RunnableConfig>
|
|
66
|
-
): Promise<{ language: string; title: string }> => {
|
|
67
|
-
return await combinedInnerChain.invoke(input, config);
|
|
68
|
-
},
|
|
69
|
-
}).withConfig({ runName: 'TitleLanguageChain' });
|
|
70
|
-
|
|
71
|
-
/** Runnable to add default values if needed */
|
|
72
|
-
const addDefaults = new RunnableLambda({
|
|
73
|
-
func: (
|
|
74
|
-
result: { language: string; title: string } | undefined
|
|
75
|
-
): { language: string; title: string } => ({
|
|
76
|
-
language: result?.language ?? 'English',
|
|
77
|
-
title: result?.title ?? '',
|
|
78
|
-
}),
|
|
79
|
-
}).withConfig({ runName: 'AddDefaults' });
|
|
80
|
-
|
|
81
|
-
const combinedChainInner = RunnableSequence.from([
|
|
82
|
-
combinedChain,
|
|
83
|
-
addDefaults,
|
|
84
|
-
]);
|
|
85
|
-
|
|
86
|
-
/** Wrap combinedChainWithDefaults in RunnableLambda to create parent span */
|
|
87
|
-
const combinedChainWithDefaults = new RunnableLambda({
|
|
88
|
-
func: async (
|
|
89
|
-
input: { convo: string },
|
|
90
|
-
config?: Partial<RunnableConfig>
|
|
91
|
-
): Promise<{ language: string; title: string }> => {
|
|
92
|
-
return await combinedChainInner.invoke(input, config);
|
|
93
|
-
},
|
|
94
|
-
}).withConfig({ runName: 'CombinedChainWithDefaults' });
|
|
95
|
-
|
|
96
|
-
return new RunnableLambda({
|
|
97
|
-
func: async (
|
|
98
|
-
input: {
|
|
99
|
-
convo: string;
|
|
100
|
-
inputText: string;
|
|
101
|
-
skipLanguage: boolean;
|
|
102
|
-
},
|
|
103
|
-
config?: Partial<RunnableConfig>
|
|
104
|
-
): Promise<{ language: string; title: string } | { title: string }> => {
|
|
105
|
-
const invokeInput = { convo: input.convo };
|
|
106
|
-
|
|
107
|
-
if (input.skipLanguage) {
|
|
108
|
-
return (await titleOnlyChain.invoke(invokeInput, config)) as {
|
|
109
|
-
title: string;
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return await combinedChainWithDefaults.invoke(invokeInput, config);
|
|
114
|
-
},
|
|
115
|
-
}).withConfig({ runName: 'TitleGenerator' });
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.
|
|
119
|
-
|
|
120
|
-
Conversation:
|
|
121
|
-
{convo}`;
|
|
122
|
-
|
|
123
|
-
export const createCompletionTitleRunnable = async (
|
|
124
|
-
model: t.ChatModelInstance,
|
|
125
|
-
titlePrompt?: string
|
|
126
|
-
): Promise<Runnable> => {
|
|
127
|
-
const completionPrompt = ChatPromptTemplate.fromTemplate(
|
|
128
|
-
titlePrompt ?? defaultCompletionPrompt
|
|
129
|
-
).withConfig({ runName: 'CompletionTitlePrompt' });
|
|
130
|
-
|
|
131
|
-
/** Runnable to extract content from model response */
|
|
132
|
-
const extractContent = new RunnableLambda({
|
|
133
|
-
func: (response: AIMessage): { title: string } => {
|
|
134
|
-
let content = '';
|
|
135
|
-
if (typeof response.content === 'string') {
|
|
136
|
-
content = response.content;
|
|
137
|
-
} else if (Array.isArray(response.content)) {
|
|
138
|
-
content = response.content
|
|
139
|
-
.filter(
|
|
140
|
-
(part): part is { type: ContentTypes.TEXT; text: string } =>
|
|
141
|
-
part.type === ContentTypes.TEXT
|
|
142
|
-
)
|
|
143
|
-
.map((part) => part.text)
|
|
144
|
-
.join('');
|
|
145
|
-
}
|
|
146
|
-
return { title: content.trim() };
|
|
147
|
-
},
|
|
148
|
-
}).withConfig({ runName: 'ExtractTitle' });
|
|
149
|
-
|
|
150
|
-
const innerChain = RunnableSequence.from([
|
|
151
|
-
completionPrompt,
|
|
152
|
-
model,
|
|
153
|
-
extractContent,
|
|
154
|
-
]);
|
|
155
|
-
|
|
156
|
-
/** Wrap in RunnableLambda to create a parent span for LangFuse */
|
|
157
|
-
return new RunnableLambda({
|
|
158
|
-
func: async (
|
|
159
|
-
input: { convo: string },
|
|
160
|
-
config?: Partial<RunnableConfig>
|
|
161
|
-
): Promise<{ title: string }> => {
|
|
162
|
-
return await innerChain.invoke(input, config);
|
|
163
|
-
},
|
|
164
|
-
}).withConfig({ runName: 'CompletionTitleChain' });
|
|
165
|
-
};
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ChatPromptTemplate } from '@langchain/core/prompts';
|
|
3
|
+
import { RunnableLambda, RunnableSequence } from '@langchain/core/runnables';
|
|
4
|
+
import type { Runnable, RunnableConfig } from '@langchain/core/runnables';
|
|
5
|
+
import type { AIMessage } from '@langchain/core/messages';
|
|
6
|
+
import type * as t from '@/types';
|
|
7
|
+
import { ContentTypes } from '@/common';
|
|
8
|
+
|
|
9
|
+
const defaultTitlePrompt = `Analyze this conversation and provide:
|
|
10
|
+
1. The detected language of the conversation
|
|
11
|
+
2. A concise title in the detected language (5 words or less, no punctuation or quotation)
|
|
12
|
+
|
|
13
|
+
{convo}`;
|
|
14
|
+
|
|
15
|
+
const titleSchema = z.object({
|
|
16
|
+
title: z
|
|
17
|
+
.string()
|
|
18
|
+
.describe(
|
|
19
|
+
'A concise title for the conversation in 5 words or less, without punctuation or quotation'
|
|
20
|
+
),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const combinedSchema = z.object({
|
|
24
|
+
language: z.string().describe('The detected language of the conversation'),
|
|
25
|
+
title: z
|
|
26
|
+
.string()
|
|
27
|
+
.describe(
|
|
28
|
+
'A concise title for the conversation in 5 words or less, without punctuation or quotation'
|
|
29
|
+
),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const createTitleRunnable = async (
|
|
33
|
+
model: t.ChatModelInstance,
|
|
34
|
+
_titlePrompt?: string
|
|
35
|
+
): Promise<Runnable> => {
|
|
36
|
+
// Disabled since this works fine
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
38
|
+
/* @ts-ignore */
|
|
39
|
+
const titleLLM = model.withStructuredOutput(titleSchema);
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
41
|
+
/* @ts-ignore */
|
|
42
|
+
const combinedLLM = model.withStructuredOutput(combinedSchema);
|
|
43
|
+
|
|
44
|
+
const titlePrompt = ChatPromptTemplate.fromTemplate(
|
|
45
|
+
_titlePrompt ?? defaultTitlePrompt
|
|
46
|
+
).withConfig({ runName: 'TitlePrompt' });
|
|
47
|
+
|
|
48
|
+
const titleOnlyInnerChain = RunnableSequence.from([titlePrompt, titleLLM]);
|
|
49
|
+
const combinedInnerChain = RunnableSequence.from([titlePrompt, combinedLLM]);
|
|
50
|
+
|
|
51
|
+
/** Wrap titleOnlyChain in RunnableLambda to create parent span */
|
|
52
|
+
const titleOnlyChain = new RunnableLambda({
|
|
53
|
+
func: async (
|
|
54
|
+
input: { convo: string },
|
|
55
|
+
config?: Partial<RunnableConfig>
|
|
56
|
+
): Promise<{ title: string }> => {
|
|
57
|
+
return await titleOnlyInnerChain.invoke(input, config);
|
|
58
|
+
},
|
|
59
|
+
}).withConfig({ runName: 'TitleOnlyChain' });
|
|
60
|
+
|
|
61
|
+
/** Wrap combinedChain in RunnableLambda to create parent span */
|
|
62
|
+
const combinedChain = new RunnableLambda({
|
|
63
|
+
func: async (
|
|
64
|
+
input: { convo: string },
|
|
65
|
+
config?: Partial<RunnableConfig>
|
|
66
|
+
): Promise<{ language: string; title: string }> => {
|
|
67
|
+
return await combinedInnerChain.invoke(input, config);
|
|
68
|
+
},
|
|
69
|
+
}).withConfig({ runName: 'TitleLanguageChain' });
|
|
70
|
+
|
|
71
|
+
/** Runnable to add default values if needed */
|
|
72
|
+
const addDefaults = new RunnableLambda({
|
|
73
|
+
func: (
|
|
74
|
+
result: { language: string; title: string } | undefined
|
|
75
|
+
): { language: string; title: string } => ({
|
|
76
|
+
language: result?.language ?? 'English',
|
|
77
|
+
title: result?.title ?? '',
|
|
78
|
+
}),
|
|
79
|
+
}).withConfig({ runName: 'AddDefaults' });
|
|
80
|
+
|
|
81
|
+
const combinedChainInner = RunnableSequence.from([
|
|
82
|
+
combinedChain,
|
|
83
|
+
addDefaults,
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
/** Wrap combinedChainWithDefaults in RunnableLambda to create parent span */
|
|
87
|
+
const combinedChainWithDefaults = new RunnableLambda({
|
|
88
|
+
func: async (
|
|
89
|
+
input: { convo: string },
|
|
90
|
+
config?: Partial<RunnableConfig>
|
|
91
|
+
): Promise<{ language: string; title: string }> => {
|
|
92
|
+
return await combinedChainInner.invoke(input, config);
|
|
93
|
+
},
|
|
94
|
+
}).withConfig({ runName: 'CombinedChainWithDefaults' });
|
|
95
|
+
|
|
96
|
+
return new RunnableLambda({
|
|
97
|
+
func: async (
|
|
98
|
+
input: {
|
|
99
|
+
convo: string;
|
|
100
|
+
inputText: string;
|
|
101
|
+
skipLanguage: boolean;
|
|
102
|
+
},
|
|
103
|
+
config?: Partial<RunnableConfig>
|
|
104
|
+
): Promise<{ language: string; title: string } | { title: string }> => {
|
|
105
|
+
const invokeInput = { convo: input.convo };
|
|
106
|
+
|
|
107
|
+
if (input.skipLanguage) {
|
|
108
|
+
return (await titleOnlyChain.invoke(invokeInput, config)) as {
|
|
109
|
+
title: string;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return await combinedChainWithDefaults.invoke(invokeInput, config);
|
|
114
|
+
},
|
|
115
|
+
}).withConfig({ runName: 'TitleGenerator' });
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const defaultCompletionPrompt = `Provide a concise, 5-word-or-less title for the conversation, using title case conventions. Only return the title itself.
|
|
119
|
+
|
|
120
|
+
Conversation:
|
|
121
|
+
{convo}`;
|
|
122
|
+
|
|
123
|
+
export const createCompletionTitleRunnable = async (
|
|
124
|
+
model: t.ChatModelInstance,
|
|
125
|
+
titlePrompt?: string
|
|
126
|
+
): Promise<Runnable> => {
|
|
127
|
+
const completionPrompt = ChatPromptTemplate.fromTemplate(
|
|
128
|
+
titlePrompt ?? defaultCompletionPrompt
|
|
129
|
+
).withConfig({ runName: 'CompletionTitlePrompt' });
|
|
130
|
+
|
|
131
|
+
/** Runnable to extract content from model response */
|
|
132
|
+
const extractContent = new RunnableLambda({
|
|
133
|
+
func: (response: AIMessage): { title: string } => {
|
|
134
|
+
let content = '';
|
|
135
|
+
if (typeof response.content === 'string') {
|
|
136
|
+
content = response.content;
|
|
137
|
+
} else if (Array.isArray(response.content)) {
|
|
138
|
+
content = response.content
|
|
139
|
+
.filter(
|
|
140
|
+
(part): part is { type: ContentTypes.TEXT; text: string } =>
|
|
141
|
+
part.type === ContentTypes.TEXT
|
|
142
|
+
)
|
|
143
|
+
.map((part) => part.text)
|
|
144
|
+
.join('');
|
|
145
|
+
}
|
|
146
|
+
return { title: content.trim() };
|
|
147
|
+
},
|
|
148
|
+
}).withConfig({ runName: 'ExtractTitle' });
|
|
149
|
+
|
|
150
|
+
const innerChain = RunnableSequence.from([
|
|
151
|
+
completionPrompt,
|
|
152
|
+
model,
|
|
153
|
+
extractContent,
|
|
154
|
+
]);
|
|
155
|
+
|
|
156
|
+
/** Wrap in RunnableLambda to create a parent span for LangFuse */
|
|
157
|
+
return new RunnableLambda({
|
|
158
|
+
func: async (
|
|
159
|
+
input: { convo: string },
|
|
160
|
+
config?: Partial<RunnableConfig>
|
|
161
|
+
): Promise<{ title: string }> => {
|
|
162
|
+
return await innerChain.invoke(input, config);
|
|
163
|
+
},
|
|
164
|
+
}).withConfig({ runName: 'CompletionTitleChain' });
|
|
165
|
+
};
|