@librechat/agents 2.4.322 → 3.0.0-rc2
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/dist/cjs/agents/AgentContext.cjs +218 -0
- package/dist/cjs/agents/AgentContext.cjs.map +1 -0
- package/dist/cjs/common/enum.cjs +14 -5
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/events.cjs +10 -6
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +309 -212
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +422 -0
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs +54 -9
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +52 -6
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +22 -2
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
- package/dist/cjs/llm/google/index.cjs +144 -0
- package/dist/cjs/llm/google/index.cjs.map +1 -0
- package/dist/cjs/llm/google/utils/common.cjs +477 -0
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
- package/dist/cjs/llm/ollama/index.cjs +67 -0
- package/dist/cjs/llm/ollama/index.cjs.map +1 -0
- package/dist/cjs/llm/ollama/utils.cjs +158 -0
- package/dist/cjs/llm/ollama/utils.cjs.map +1 -0
- package/dist/cjs/llm/openai/index.cjs +389 -3
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +672 -0
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
- package/dist/cjs/llm/providers.cjs +15 -15
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs +14 -3
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +330 -0
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
- package/dist/cjs/main.cjs +11 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/run.cjs +120 -81
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +85 -51
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +10 -4
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +119 -13
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/search/anthropic.cjs +40 -0
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
- package/dist/cjs/tools/search/firecrawl.cjs +55 -9
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs +6 -6
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs +7 -29
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +86 -16
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -2
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs +31 -0
- package/dist/cjs/utils/events.cjs.map +1 -0
- package/dist/cjs/utils/title.cjs +57 -21
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +54 -7
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +216 -0
- package/dist/esm/agents/AgentContext.mjs.map +1 -0
- package/dist/esm/common/enum.mjs +15 -6
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/events.mjs +10 -6
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +311 -214
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +420 -0
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs +54 -9
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +52 -6
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +22 -2
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
- package/dist/esm/llm/google/index.mjs +142 -0
- package/dist/esm/llm/google/index.mjs.map +1 -0
- package/dist/esm/llm/google/utils/common.mjs +471 -0
- package/dist/esm/llm/google/utils/common.mjs.map +1 -0
- package/dist/esm/llm/ollama/index.mjs +65 -0
- package/dist/esm/llm/ollama/index.mjs.map +1 -0
- package/dist/esm/llm/ollama/utils.mjs +155 -0
- package/dist/esm/llm/ollama/utils.mjs.map +1 -0
- package/dist/esm/llm/openai/index.mjs +388 -4
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +666 -0
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
- package/dist/esm/llm/providers.mjs +5 -5
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/text.mjs +14 -3
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +328 -0
- package/dist/esm/llm/vertexai/index.mjs.map +1 -0
- package/dist/esm/main.mjs +6 -5
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/run.mjs +121 -83
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +87 -54
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +10 -4
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +119 -15
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/search/anthropic.mjs +37 -0
- package/dist/esm/tools/search/anthropic.mjs.map +1 -0
- package/dist/esm/tools/search/firecrawl.mjs +55 -9
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +7 -7
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs +7 -29
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +86 -16
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -2
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/utils/events.mjs +29 -0
- package/dist/esm/utils/events.mjs.map +1 -0
- package/dist/esm/utils/title.mjs +57 -22
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +54 -8
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +91 -0
- package/dist/types/common/enum.d.ts +15 -6
- package/dist/types/events.d.ts +5 -4
- package/dist/types/graphs/Graph.d.ts +64 -67
- package/dist/types/graphs/MultiAgentGraph.d.ts +37 -0
- package/dist/types/graphs/index.d.ts +1 -0
- package/dist/types/llm/anthropic/index.d.ts +11 -0
- package/dist/types/llm/anthropic/types.d.ts +9 -3
- package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +4 -4
- package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
- package/dist/types/llm/google/index.d.ts +13 -0
- package/dist/types/llm/google/types.d.ts +32 -0
- package/dist/types/llm/google/utils/common.d.ts +19 -0
- package/dist/types/llm/google/utils/tools.d.ts +10 -0
- package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
- package/dist/types/llm/ollama/index.d.ts +7 -0
- package/dist/types/llm/ollama/utils.d.ts +7 -0
- package/dist/types/llm/openai/index.d.ts +72 -3
- package/dist/types/llm/openai/types.d.ts +10 -0
- package/dist/types/llm/openai/utils/index.d.ts +20 -0
- package/dist/types/llm/text.d.ts +1 -1
- package/dist/types/llm/vertexai/index.d.ts +293 -0
- package/dist/types/messages/reducer.d.ts +9 -0
- package/dist/types/run.d.ts +19 -12
- package/dist/types/scripts/ant_web_search.d.ts +1 -0
- package/dist/types/scripts/args.d.ts +2 -1
- package/dist/types/scripts/handoff-test.d.ts +1 -0
- package/dist/types/scripts/multi-agent-conditional.d.ts +1 -0
- package/dist/types/scripts/multi-agent-parallel.d.ts +1 -0
- package/dist/types/scripts/multi-agent-sequence.d.ts +1 -0
- package/dist/types/scripts/multi-agent-supervisor.d.ts +1 -0
- package/dist/types/scripts/multi-agent-test.d.ts +1 -0
- package/dist/types/scripts/test-custom-prompt-key.d.ts +2 -0
- package/dist/types/scripts/test-handoff-input.d.ts +2 -0
- package/dist/types/scripts/test-multi-agent-list-handoff.d.ts +2 -0
- package/dist/types/stream.d.ts +10 -3
- package/dist/types/tools/CodeExecutor.d.ts +2 -2
- package/dist/types/tools/ToolNode.d.ts +1 -1
- package/dist/types/tools/handlers.d.ts +17 -4
- package/dist/types/tools/search/anthropic.d.ts +16 -0
- package/dist/types/tools/search/firecrawl.d.ts +15 -0
- package/dist/types/tools/search/rerankers.d.ts +0 -1
- package/dist/types/tools/search/types.d.ts +30 -9
- package/dist/types/types/graph.d.ts +129 -15
- package/dist/types/types/llm.d.ts +24 -10
- package/dist/types/types/run.d.ts +46 -8
- package/dist/types/types/stream.d.ts +16 -2
- package/dist/types/types/tools.d.ts +1 -1
- package/dist/types/utils/events.d.ts +6 -0
- package/dist/types/utils/title.d.ts +2 -1
- package/dist/types/utils/tokens.d.ts +24 -0
- package/package.json +37 -17
- package/src/agents/AgentContext.ts +315 -0
- package/src/common/enum.ts +14 -5
- package/src/events.ts +24 -13
- package/src/graphs/Graph.ts +495 -312
- package/src/graphs/MultiAgentGraph.ts +498 -0
- package/src/graphs/index.ts +2 -1
- package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
- package/src/llm/anthropic/index.ts +78 -13
- package/src/llm/anthropic/llm.spec.ts +491 -115
- package/src/llm/anthropic/types.ts +39 -3
- package/src/llm/anthropic/utils/message_inputs.ts +67 -11
- package/src/llm/anthropic/utils/message_outputs.ts +21 -2
- package/src/llm/anthropic/utils/output_parsers.ts +25 -6
- package/src/llm/anthropic/utils/tools.ts +29 -0
- package/src/llm/google/index.ts +218 -0
- package/src/llm/google/types.ts +43 -0
- package/src/llm/google/utils/common.ts +646 -0
- package/src/llm/google/utils/tools.ts +160 -0
- package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
- package/src/llm/ollama/index.ts +89 -0
- package/src/llm/ollama/utils.ts +193 -0
- package/src/llm/openai/index.ts +600 -14
- package/src/llm/openai/types.ts +24 -0
- package/src/llm/openai/utils/index.ts +912 -0
- package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
- package/src/llm/providers.ts +10 -9
- package/src/llm/text.ts +26 -7
- package/src/llm/vertexai/index.ts +360 -0
- package/src/messages/reducer.ts +80 -0
- package/src/run.ts +181 -112
- package/src/scripts/ant_web_search.ts +158 -0
- package/src/scripts/args.ts +12 -8
- package/src/scripts/cli4.ts +29 -21
- package/src/scripts/cli5.ts +29 -21
- package/src/scripts/code_exec.ts +54 -23
- package/src/scripts/code_exec_files.ts +48 -17
- package/src/scripts/code_exec_simple.ts +46 -27
- package/src/scripts/handoff-test.ts +135 -0
- package/src/scripts/image.ts +52 -20
- package/src/scripts/multi-agent-conditional.ts +220 -0
- package/src/scripts/multi-agent-example-output.md +110 -0
- package/src/scripts/multi-agent-parallel.ts +341 -0
- package/src/scripts/multi-agent-sequence.ts +212 -0
- package/src/scripts/multi-agent-supervisor.ts +361 -0
- package/src/scripts/multi-agent-test.ts +186 -0
- package/src/scripts/search.ts +1 -9
- package/src/scripts/simple.ts +25 -10
- package/src/scripts/test-custom-prompt-key.ts +145 -0
- package/src/scripts/test-handoff-input.ts +110 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +258 -0
- package/src/scripts/tools.ts +48 -18
- package/src/specs/anthropic.simple.test.ts +150 -34
- package/src/specs/azure.simple.test.ts +325 -0
- package/src/specs/openai.simple.test.ts +140 -33
- package/src/specs/openrouter.simple.test.ts +107 -0
- package/src/specs/prune.test.ts +4 -9
- package/src/specs/reasoning.test.ts +80 -44
- package/src/specs/token-memoization.test.ts +39 -0
- package/src/stream.test.ts +94 -0
- package/src/stream.ts +139 -60
- package/src/tools/ToolNode.ts +21 -7
- package/src/tools/handlers.ts +192 -18
- package/src/tools/search/anthropic.ts +51 -0
- package/src/tools/search/firecrawl.ts +69 -20
- package/src/tools/search/format.ts +6 -8
- package/src/tools/search/rerankers.ts +7 -40
- package/src/tools/search/search.ts +97 -16
- package/src/tools/search/tool.ts +5 -2
- package/src/tools/search/types.ts +30 -10
- package/src/tools/search/utils.ts +1 -1
- package/src/types/graph.ts +315 -103
- package/src/types/llm.ts +25 -12
- package/src/types/run.ts +51 -13
- package/src/types/stream.ts +22 -1
- package/src/types/tools.ts +16 -10
- package/src/utils/events.ts +32 -0
- package/src/utils/llmConfig.ts +19 -7
- package/src/utils/title.ts +104 -30
- package/src/utils/tokens.ts +69 -10
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
// src/agents/AgentContext.ts
|
|
3
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
4
|
+
import { SystemMessage } from '@langchain/core/messages';
|
|
5
|
+
import { RunnableLambda } from '@langchain/core/runnables';
|
|
6
|
+
import type {
|
|
7
|
+
UsageMetadata,
|
|
8
|
+
BaseMessage,
|
|
9
|
+
BaseMessageFields,
|
|
10
|
+
} from '@langchain/core/messages';
|
|
11
|
+
import type { RunnableConfig, Runnable } from '@langchain/core/runnables';
|
|
12
|
+
import type * as t from '@/types';
|
|
13
|
+
import type { createPruneMessages } from '@/messages';
|
|
14
|
+
import { ContentTypes, Providers } from '@/common';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Encapsulates agent-specific state that can vary between agents in a multi-agent system
|
|
18
|
+
*/
|
|
19
|
+
export class AgentContext {
|
|
20
|
+
/**
|
|
21
|
+
* Create an AgentContext from configuration with token accounting initialization
|
|
22
|
+
*/
|
|
23
|
+
static fromConfig(
|
|
24
|
+
agentConfig: t.AgentInputs,
|
|
25
|
+
tokenCounter?: t.TokenCounter,
|
|
26
|
+
indexTokenCountMap?: Record<string, number>
|
|
27
|
+
): AgentContext {
|
|
28
|
+
const {
|
|
29
|
+
agentId,
|
|
30
|
+
provider,
|
|
31
|
+
clientOptions,
|
|
32
|
+
tools,
|
|
33
|
+
toolMap,
|
|
34
|
+
toolEnd,
|
|
35
|
+
instructions,
|
|
36
|
+
additional_instructions,
|
|
37
|
+
streamBuffer,
|
|
38
|
+
maxContextTokens,
|
|
39
|
+
reasoningKey,
|
|
40
|
+
} = agentConfig;
|
|
41
|
+
|
|
42
|
+
const agentContext = new AgentContext({
|
|
43
|
+
agentId,
|
|
44
|
+
provider,
|
|
45
|
+
clientOptions,
|
|
46
|
+
maxContextTokens,
|
|
47
|
+
streamBuffer,
|
|
48
|
+
tools,
|
|
49
|
+
toolMap,
|
|
50
|
+
instructions,
|
|
51
|
+
additionalInstructions: additional_instructions,
|
|
52
|
+
reasoningKey,
|
|
53
|
+
toolEnd,
|
|
54
|
+
instructionTokens: 0,
|
|
55
|
+
tokenCounter,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (tokenCounter) {
|
|
59
|
+
const tokenMap = indexTokenCountMap || {};
|
|
60
|
+
agentContext.indexTokenCountMap = tokenMap;
|
|
61
|
+
agentContext.tokenCalculationPromise = agentContext
|
|
62
|
+
.calculateInstructionTokens(tokenCounter)
|
|
63
|
+
.then(() => {
|
|
64
|
+
// Update token map with instruction tokens
|
|
65
|
+
agentContext.updateTokenMapWithInstructions(tokenMap);
|
|
66
|
+
})
|
|
67
|
+
.catch((err) => {
|
|
68
|
+
console.error('Error calculating instruction tokens:', err);
|
|
69
|
+
});
|
|
70
|
+
} else if (indexTokenCountMap) {
|
|
71
|
+
agentContext.indexTokenCountMap = indexTokenCountMap;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return agentContext;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Agent identifier */
|
|
78
|
+
agentId: string;
|
|
79
|
+
/** Provider for this specific agent */
|
|
80
|
+
provider: Providers;
|
|
81
|
+
/** Client options for this agent */
|
|
82
|
+
clientOptions?: t.ClientOptions;
|
|
83
|
+
/** Token count map indexed by message position */
|
|
84
|
+
indexTokenCountMap: Record<string, number | undefined> = {};
|
|
85
|
+
/** Maximum context tokens for this agent */
|
|
86
|
+
maxContextTokens?: number;
|
|
87
|
+
/** Current usage metadata for this agent */
|
|
88
|
+
currentUsage?: Partial<UsageMetadata>;
|
|
89
|
+
/** Prune messages function configured for this agent */
|
|
90
|
+
pruneMessages?: ReturnType<typeof createPruneMessages>;
|
|
91
|
+
/** Token counter function for this agent */
|
|
92
|
+
tokenCounter?: t.TokenCounter;
|
|
93
|
+
/** Instructions/system message token count */
|
|
94
|
+
instructionTokens: number = 0;
|
|
95
|
+
/** The amount of time that should pass before another consecutive API call */
|
|
96
|
+
streamBuffer?: number;
|
|
97
|
+
/** Last stream call timestamp for rate limiting */
|
|
98
|
+
lastStreamCall?: number;
|
|
99
|
+
/** Tools available to this agent */
|
|
100
|
+
tools?: t.GraphTools;
|
|
101
|
+
/** Tool map for this agent */
|
|
102
|
+
toolMap?: t.ToolMap;
|
|
103
|
+
/** Instructions for this agent */
|
|
104
|
+
instructions?: string;
|
|
105
|
+
/** Additional instructions for this agent */
|
|
106
|
+
additionalInstructions?: string;
|
|
107
|
+
/** Reasoning key for this agent */
|
|
108
|
+
reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';
|
|
109
|
+
/** Last token for reasoning detection */
|
|
110
|
+
lastToken?: string;
|
|
111
|
+
/** Token type switch state */
|
|
112
|
+
tokenTypeSwitch?: 'reasoning' | 'content';
|
|
113
|
+
/** Current token type being processed */
|
|
114
|
+
currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text' =
|
|
115
|
+
ContentTypes.TEXT;
|
|
116
|
+
/** Whether tools should end the workflow */
|
|
117
|
+
toolEnd: boolean = false;
|
|
118
|
+
/** System runnable for this agent */
|
|
119
|
+
systemRunnable?: Runnable<
|
|
120
|
+
BaseMessage[],
|
|
121
|
+
(BaseMessage | SystemMessage)[],
|
|
122
|
+
RunnableConfig<Record<string, unknown>>
|
|
123
|
+
>;
|
|
124
|
+
/** Promise for token calculation initialization */
|
|
125
|
+
tokenCalculationPromise?: Promise<void>;
|
|
126
|
+
|
|
127
|
+
constructor({
|
|
128
|
+
agentId,
|
|
129
|
+
provider,
|
|
130
|
+
clientOptions,
|
|
131
|
+
maxContextTokens,
|
|
132
|
+
streamBuffer,
|
|
133
|
+
tokenCounter,
|
|
134
|
+
tools,
|
|
135
|
+
toolMap,
|
|
136
|
+
instructions,
|
|
137
|
+
additionalInstructions,
|
|
138
|
+
reasoningKey,
|
|
139
|
+
toolEnd,
|
|
140
|
+
instructionTokens,
|
|
141
|
+
}: {
|
|
142
|
+
agentId: string;
|
|
143
|
+
provider: Providers;
|
|
144
|
+
clientOptions?: t.ClientOptions;
|
|
145
|
+
maxContextTokens?: number;
|
|
146
|
+
streamBuffer?: number;
|
|
147
|
+
tokenCounter?: t.TokenCounter;
|
|
148
|
+
tools?: t.GraphTools;
|
|
149
|
+
toolMap?: t.ToolMap;
|
|
150
|
+
instructions?: string;
|
|
151
|
+
additionalInstructions?: string;
|
|
152
|
+
reasoningKey?: 'reasoning_content' | 'reasoning';
|
|
153
|
+
toolEnd?: boolean;
|
|
154
|
+
instructionTokens?: number;
|
|
155
|
+
}) {
|
|
156
|
+
this.agentId = agentId;
|
|
157
|
+
this.provider = provider;
|
|
158
|
+
this.clientOptions = clientOptions;
|
|
159
|
+
this.maxContextTokens = maxContextTokens;
|
|
160
|
+
this.streamBuffer = streamBuffer;
|
|
161
|
+
this.tokenCounter = tokenCounter;
|
|
162
|
+
this.tools = tools;
|
|
163
|
+
this.toolMap = toolMap;
|
|
164
|
+
this.instructions = instructions;
|
|
165
|
+
this.additionalInstructions = additionalInstructions;
|
|
166
|
+
if (reasoningKey) {
|
|
167
|
+
this.reasoningKey = reasoningKey;
|
|
168
|
+
}
|
|
169
|
+
if (toolEnd !== undefined) {
|
|
170
|
+
this.toolEnd = toolEnd;
|
|
171
|
+
}
|
|
172
|
+
if (instructionTokens !== undefined) {
|
|
173
|
+
this.instructionTokens = instructionTokens;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
this.systemRunnable = this.createSystemRunnable();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Create system runnable from instructions and calculate tokens if tokenCounter is available
|
|
181
|
+
*/
|
|
182
|
+
private createSystemRunnable():
|
|
183
|
+
| Runnable<
|
|
184
|
+
BaseMessage[],
|
|
185
|
+
(BaseMessage | SystemMessage)[],
|
|
186
|
+
RunnableConfig<Record<string, unknown>>
|
|
187
|
+
>
|
|
188
|
+
| undefined {
|
|
189
|
+
let finalInstructions: string | BaseMessageFields | undefined =
|
|
190
|
+
this.instructions;
|
|
191
|
+
|
|
192
|
+
if (
|
|
193
|
+
this.additionalInstructions != null &&
|
|
194
|
+
this.additionalInstructions !== ''
|
|
195
|
+
) {
|
|
196
|
+
finalInstructions =
|
|
197
|
+
finalInstructions != null && finalInstructions
|
|
198
|
+
? `${finalInstructions}\n\n${this.additionalInstructions}`
|
|
199
|
+
: this.additionalInstructions;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Handle Anthropic prompt caching
|
|
203
|
+
if (
|
|
204
|
+
finalInstructions != null &&
|
|
205
|
+
finalInstructions !== '' &&
|
|
206
|
+
this.provider === Providers.ANTHROPIC
|
|
207
|
+
) {
|
|
208
|
+
const anthropicOptions = this.clientOptions as
|
|
209
|
+
| t.AnthropicClientOptions
|
|
210
|
+
| undefined;
|
|
211
|
+
const defaultHeaders = anthropicOptions?.clientOptions?.defaultHeaders as
|
|
212
|
+
| Record<string, string>
|
|
213
|
+
| undefined;
|
|
214
|
+
const anthropicBeta = defaultHeaders?.['anthropic-beta'];
|
|
215
|
+
if (
|
|
216
|
+
typeof anthropicBeta === 'string' &&
|
|
217
|
+
anthropicBeta.includes('prompt-caching')
|
|
218
|
+
) {
|
|
219
|
+
finalInstructions = {
|
|
220
|
+
content: [
|
|
221
|
+
{
|
|
222
|
+
type: 'text',
|
|
223
|
+
text: this.instructions,
|
|
224
|
+
cache_control: { type: 'ephemeral' },
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (finalInstructions != null && finalInstructions !== '') {
|
|
232
|
+
const systemMessage = new SystemMessage(finalInstructions);
|
|
233
|
+
|
|
234
|
+
if (this.tokenCounter) {
|
|
235
|
+
this.instructionTokens += this.tokenCounter(systemMessage);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return RunnableLambda.from((messages: BaseMessage[]) => {
|
|
239
|
+
return [systemMessage, ...messages];
|
|
240
|
+
}).withConfig({ runName: 'prompt' });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Reset context for a new run
|
|
248
|
+
*/
|
|
249
|
+
reset(): void {
|
|
250
|
+
this.instructionTokens = 0;
|
|
251
|
+
this.lastToken = undefined;
|
|
252
|
+
this.indexTokenCountMap = {};
|
|
253
|
+
this.currentUsage = undefined;
|
|
254
|
+
this.pruneMessages = undefined;
|
|
255
|
+
this.lastStreamCall = undefined;
|
|
256
|
+
this.tokenTypeSwitch = undefined;
|
|
257
|
+
this.currentTokenType = ContentTypes.TEXT;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Update the token count map with instruction tokens
|
|
262
|
+
*/
|
|
263
|
+
updateTokenMapWithInstructions(baseTokenMap: Record<string, number>): void {
|
|
264
|
+
if (this.instructionTokens > 0) {
|
|
265
|
+
// Shift all indices by the instruction token count
|
|
266
|
+
const shiftedMap: Record<string, number> = {};
|
|
267
|
+
for (const [key, value] of Object.entries(baseTokenMap)) {
|
|
268
|
+
const index = parseInt(key, 10);
|
|
269
|
+
if (!isNaN(index)) {
|
|
270
|
+
shiftedMap[String(index)] =
|
|
271
|
+
value + (index === 0 ? this.instructionTokens : 0);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
this.indexTokenCountMap = shiftedMap;
|
|
275
|
+
} else {
|
|
276
|
+
this.indexTokenCountMap = { ...baseTokenMap };
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Calculate tool tokens and add to instruction tokens
|
|
282
|
+
* Note: System message tokens are calculated during systemRunnable creation
|
|
283
|
+
*/
|
|
284
|
+
async calculateInstructionTokens(
|
|
285
|
+
tokenCounter: t.TokenCounter
|
|
286
|
+
): Promise<void> {
|
|
287
|
+
let toolTokens = 0;
|
|
288
|
+
if (this.tools && this.tools.length > 0) {
|
|
289
|
+
for (const tool of this.tools) {
|
|
290
|
+
const genericTool = tool as Record<string, unknown>;
|
|
291
|
+
if (
|
|
292
|
+
genericTool.schema != null &&
|
|
293
|
+
typeof genericTool.schema === 'object'
|
|
294
|
+
) {
|
|
295
|
+
const schema = genericTool.schema as {
|
|
296
|
+
describe: (desc: string) => unknown;
|
|
297
|
+
};
|
|
298
|
+
const describedSchema = schema.describe(
|
|
299
|
+
(genericTool.description as string) || ''
|
|
300
|
+
);
|
|
301
|
+
const jsonSchema = zodToJsonSchema(
|
|
302
|
+
describedSchema as Parameters<typeof zodToJsonSchema>[0],
|
|
303
|
+
(genericTool.name as string) || ''
|
|
304
|
+
);
|
|
305
|
+
toolTokens += tokenCounter(
|
|
306
|
+
new SystemMessage(JSON.stringify(jsonSchema))
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Add tool tokens to existing instruction tokens (which may already include system message tokens)
|
|
313
|
+
this.instructionTokens += toolTokens;
|
|
314
|
+
}
|
|
315
|
+
}
|
package/src/common/enum.ts
CHANGED
|
@@ -87,8 +87,9 @@ export enum Providers {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
export enum GraphNodeKeys {
|
|
90
|
-
TOOLS = 'tools',
|
|
91
|
-
AGENT = 'agent',
|
|
90
|
+
TOOLS = 'tools=',
|
|
91
|
+
AGENT = 'agent=',
|
|
92
|
+
ROUTER = 'router',
|
|
92
93
|
PRE_TOOLS = 'pre_tools',
|
|
93
94
|
POST_TOOLS = 'post_tools',
|
|
94
95
|
}
|
|
@@ -117,10 +118,12 @@ export enum ContentTypes {
|
|
|
117
118
|
IMAGE_FILE = 'image_file',
|
|
118
119
|
/** Anthropic */
|
|
119
120
|
THINKING = 'thinking',
|
|
120
|
-
/**
|
|
121
|
-
|
|
121
|
+
/** Vertex AI / Google Common */
|
|
122
|
+
REASONING = 'reasoning',
|
|
122
123
|
/** Multi-Agent Switch */
|
|
123
124
|
AGENT_UPDATE = 'agent_update',
|
|
125
|
+
/** Bedrock */
|
|
126
|
+
REASONING_CONTENT = 'reasoning_content',
|
|
124
127
|
}
|
|
125
128
|
|
|
126
129
|
export enum ToolCallTypes {
|
|
@@ -136,6 +139,7 @@ export enum Callback {
|
|
|
136
139
|
TOOL_ERROR = 'handleToolError',
|
|
137
140
|
TOOL_START = 'handleToolStart',
|
|
138
141
|
TOOL_END = 'handleToolEnd',
|
|
142
|
+
CUSTOM_EVENT = 'handleCustomEvent',
|
|
139
143
|
/*
|
|
140
144
|
LLM_START = 'handleLLMStart',
|
|
141
145
|
LLM_NEW_TOKEN = 'handleLLMNewToken',
|
|
@@ -151,7 +155,6 @@ export enum Callback {
|
|
|
151
155
|
RETRIEVER_START = 'handleRetrieverStart',
|
|
152
156
|
RETRIEVER_END = 'handleRetrieverEnd',
|
|
153
157
|
RETRIEVER_ERROR = 'handleRetrieverError',
|
|
154
|
-
CUSTOM_EVENT = 'handleCustomEvent'
|
|
155
158
|
*/
|
|
156
159
|
}
|
|
157
160
|
|
|
@@ -162,6 +165,12 @@ export enum Constants {
|
|
|
162
165
|
CONTENT_AND_ARTIFACT = 'content_and_artifact',
|
|
163
166
|
}
|
|
164
167
|
|
|
168
|
+
export enum TitleMethod {
|
|
169
|
+
STRUCTURED = 'structured',
|
|
170
|
+
FUNCTIONS = 'functions',
|
|
171
|
+
COMPLETION = 'completion',
|
|
172
|
+
}
|
|
173
|
+
|
|
165
174
|
export enum EnvVar {
|
|
166
175
|
CODE_API_KEY = 'LIBRECHAT_CODE_API_KEY',
|
|
167
176
|
CODE_BASEURL = 'LIBRECHAT_CODE_BASEURL',
|
package/src/events.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
// src/events.ts
|
|
3
3
|
import type {
|
|
4
|
+
ToolMessage,
|
|
4
5
|
UsageMetadata,
|
|
5
6
|
BaseMessageFields,
|
|
6
7
|
} from '@langchain/core/messages';
|
|
7
|
-
import type {
|
|
8
|
+
import type { MultiAgentGraph, StandardGraph } from '@/graphs';
|
|
8
9
|
import type * as t from '@/types';
|
|
9
10
|
import { handleToolCalls } from '@/tools/handlers';
|
|
10
11
|
import { Providers } from '@/common';
|
|
@@ -30,12 +31,12 @@ export class ModelEndHandler implements t.EventHandler {
|
|
|
30
31
|
this.collectedUsage = collectedUsage;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
handle(
|
|
34
|
+
async handle(
|
|
34
35
|
event: string,
|
|
35
36
|
data: t.ModelEndData,
|
|
36
37
|
metadata?: Record<string, unknown>,
|
|
37
|
-
graph?:
|
|
38
|
-
): void {
|
|
38
|
+
graph?: StandardGraph | MultiAgentGraph
|
|
39
|
+
): Promise<void> {
|
|
39
40
|
if (!graph || !metadata) {
|
|
40
41
|
console.warn(`Graph or metadata not found in ${event} event`);
|
|
41
42
|
return;
|
|
@@ -58,25 +59,35 @@ export class ModelEndHandler implements t.EventHandler {
|
|
|
58
59
|
{ depth: null }
|
|
59
60
|
);
|
|
60
61
|
|
|
61
|
-
|
|
62
|
+
const agentContext = graph.getAgentContext(metadata);
|
|
63
|
+
|
|
64
|
+
if (
|
|
65
|
+
agentContext.provider !== Providers.GOOGLE &&
|
|
66
|
+
agentContext.provider !== Providers.BEDROCK
|
|
67
|
+
) {
|
|
62
68
|
return;
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
handleToolCalls(data?.output?.tool_calls, metadata, graph);
|
|
71
|
+
await handleToolCalls(data?.output?.tool_calls, metadata, graph);
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
74
|
|
|
69
75
|
export class ToolEndHandler implements t.EventHandler {
|
|
70
76
|
private callback?: t.ToolEndCallback;
|
|
71
|
-
|
|
77
|
+
private omitOutput?: (name?: string) => boolean;
|
|
78
|
+
constructor(
|
|
79
|
+
callback?: t.ToolEndCallback,
|
|
80
|
+
omitOutput?: (name?: string) => boolean
|
|
81
|
+
) {
|
|
72
82
|
this.callback = callback;
|
|
83
|
+
this.omitOutput = omitOutput;
|
|
73
84
|
}
|
|
74
|
-
handle(
|
|
85
|
+
async handle(
|
|
75
86
|
event: string,
|
|
76
87
|
data: t.StreamEventData | undefined,
|
|
77
88
|
metadata?: Record<string, unknown>,
|
|
78
|
-
graph?:
|
|
79
|
-
): void {
|
|
89
|
+
graph?: StandardGraph | MultiAgentGraph
|
|
90
|
+
): Promise<void> {
|
|
80
91
|
if (!graph || !metadata) {
|
|
81
92
|
console.warn(`Graph or metadata not found in ${event} event`);
|
|
82
93
|
return;
|
|
@@ -89,10 +100,10 @@ export class ToolEndHandler implements t.EventHandler {
|
|
|
89
100
|
}
|
|
90
101
|
|
|
91
102
|
this.callback?.(toolEndData, metadata);
|
|
92
|
-
|
|
93
|
-
graph.handleToolCallCompleted(
|
|
103
|
+
await graph.handleToolCallCompleted(
|
|
94
104
|
{ input: toolEndData.input, output: toolEndData.output },
|
|
95
|
-
metadata
|
|
105
|
+
metadata,
|
|
106
|
+
this.omitOutput?.((toolEndData.output as ToolMessage | undefined)?.name)
|
|
96
107
|
);
|
|
97
108
|
}
|
|
98
109
|
}
|