@librechat/agents 3.1.75 → 3.1.76
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/graphs/Graph.cjs +13 -3
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +3 -0
- package/dist/cjs/langchain/google-common.cjs.map +1 -0
- package/dist/cjs/langchain/index.cjs +86 -0
- package/dist/cjs/langchain/index.cjs.map +1 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
- package/dist/cjs/langchain/messages/tool.cjs +3 -0
- package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
- package/dist/cjs/langchain/messages.cjs +51 -0
- package/dist/cjs/langchain/messages.cjs.map +1 -0
- package/dist/cjs/langchain/openai.cjs +3 -0
- package/dist/cjs/langchain/openai.cjs.map +1 -0
- package/dist/cjs/langchain/prompts.cjs +11 -0
- package/dist/cjs/langchain/prompts.cjs.map +1 -0
- package/dist/cjs/langchain/runnables.cjs +19 -0
- package/dist/cjs/langchain/runnables.cjs.map +1 -0
- package/dist/cjs/langchain/tools.cjs +23 -0
- package/dist/cjs/langchain/tools.cjs.map +1 -0
- package/dist/cjs/langchain/utils/env.cjs +11 -0
- package/dist/cjs/langchain/utils/env.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs +145 -52
- 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 +21 -14
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +1 -1
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +5 -4
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +519 -655
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +20 -458
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +57 -175
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +5 -3
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +83 -3
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +2 -1
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +7 -6
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +73 -15
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/langchain.cjs +26 -0
- package/dist/cjs/messages/langchain.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +7 -6
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +5 -1
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +55 -66
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tavily-search.cjs +372 -0
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +26 -4
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +10 -3
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +13 -3
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +2 -0
- package/dist/esm/langchain/google-common.mjs.map +1 -0
- package/dist/esm/langchain/index.mjs +5 -0
- package/dist/esm/langchain/index.mjs.map +1 -0
- package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
- package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
- package/dist/esm/langchain/messages/tool.mjs +2 -0
- package/dist/esm/langchain/messages/tool.mjs.map +1 -0
- package/dist/esm/langchain/messages.mjs +2 -0
- package/dist/esm/langchain/messages.mjs.map +1 -0
- package/dist/esm/langchain/openai.mjs +2 -0
- package/dist/esm/langchain/openai.mjs.map +1 -0
- package/dist/esm/langchain/prompts.mjs +2 -0
- package/dist/esm/langchain/prompts.mjs.map +1 -0
- package/dist/esm/langchain/runnables.mjs +2 -0
- package/dist/esm/langchain/runnables.mjs.map +1 -0
- package/dist/esm/langchain/tools.mjs +2 -0
- package/dist/esm/langchain/tools.mjs.map +1 -0
- package/dist/esm/langchain/utils/env.mjs +2 -0
- package/dist/esm/langchain/utils/env.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs +146 -54
- 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 +21 -14
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +1 -1
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +5 -4
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +520 -656
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +23 -459
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +57 -175
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +5 -3
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +4 -0
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +2 -1
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +7 -6
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +73 -15
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/langchain.mjs +23 -0
- package/dist/esm/messages/langchain.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +7 -6
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +5 -1
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +55 -66
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tavily-search.mjs +370 -0
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +26 -4
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +10 -3
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/langchain/google-common.d.ts +1 -0
- package/dist/types/langchain/index.d.ts +8 -0
- package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
- package/dist/types/langchain/messages/tool.d.ts +1 -0
- package/dist/types/langchain/messages.d.ts +2 -0
- package/dist/types/langchain/openai.d.ts +1 -0
- package/dist/types/langchain/prompts.d.ts +1 -0
- package/dist/types/langchain/runnables.d.ts +2 -0
- package/dist/types/langchain/tools.d.ts +2 -0
- package/dist/types/langchain/utils/env.d.ts +1 -0
- package/dist/types/llm/anthropic/index.d.ts +22 -9
- package/dist/types/llm/anthropic/types.d.ts +5 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +21 -24
- package/dist/types/llm/openrouter/index.d.ts +11 -9
- package/dist/types/llm/vertexai/index.d.ts +1 -0
- package/dist/types/messages/cache.d.ts +4 -1
- package/dist/types/messages/format.d.ts +4 -1
- package/dist/types/messages/langchain.d.ts +27 -0
- package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
- package/dist/types/tools/search/tavily-search.d.ts +4 -0
- package/dist/types/tools/search/types.d.ts +99 -5
- package/dist/types/tools/search/utils.d.ts +2 -2
- package/dist/types/types/graph.d.ts +23 -37
- package/dist/types/types/llm.d.ts +3 -3
- package/dist/types/types/stream.d.ts +1 -1
- package/package.json +80 -17
- package/src/graphs/Graph.ts +24 -4
- package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
- package/src/index.ts +3 -0
- package/src/langchain/google-common.ts +1 -0
- package/src/langchain/index.ts +8 -0
- package/src/langchain/language_models/chat_models.ts +1 -0
- package/src/langchain/messages/tool.ts +5 -0
- package/src/langchain/messages.ts +21 -0
- package/src/langchain/openai.ts +1 -0
- package/src/langchain/prompts.ts +1 -0
- package/src/langchain/runnables.ts +7 -0
- package/src/langchain/tools.ts +8 -0
- package/src/langchain/utils/env.ts +1 -0
- package/src/llm/anthropic/index.ts +252 -84
- package/src/llm/anthropic/llm.spec.ts +751 -102
- package/src/llm/anthropic/types.ts +9 -1
- package/src/llm/anthropic/utils/message_inputs.ts +37 -19
- package/src/llm/anthropic/utils/message_outputs.ts +119 -101
- package/src/llm/bedrock/index.ts +2 -2
- package/src/llm/bedrock/llm.spec.ts +341 -0
- package/src/llm/bedrock/utils/message_inputs.ts +303 -4
- package/src/llm/bedrock/utils/message_outputs.ts +2 -1
- package/src/llm/custom-chat-models.smoke.test.ts +836 -0
- package/src/llm/google/llm.spec.ts +339 -57
- package/src/llm/google/utils/common.ts +53 -48
- package/src/llm/openai/contentBlocks.test.ts +346 -0
- package/src/llm/openai/index.ts +856 -833
- package/src/llm/openai/utils/index.ts +107 -78
- package/src/llm/openai/utils/messages.test.ts +159 -0
- package/src/llm/openrouter/index.ts +124 -247
- package/src/llm/openrouter/reasoning.test.ts +8 -1
- package/src/llm/vertexai/index.ts +11 -5
- package/src/llm/vertexai/llm.spec.ts +28 -1
- package/src/messages/cache.test.ts +4 -3
- package/src/messages/cache.ts +3 -2
- package/src/messages/core.ts +16 -9
- package/src/messages/format.ts +96 -16
- package/src/messages/formatAgentMessages.test.ts +166 -1
- package/src/messages/langchain.ts +39 -0
- package/src/messages/prune.ts +12 -8
- package/src/scripts/caching.ts +2 -3
- package/src/specs/summarization.test.ts +51 -58
- package/src/tools/ToolNode.ts +5 -1
- package/src/tools/search/search.ts +83 -73
- package/src/tools/search/tavily-scraper.ts +235 -0
- package/src/tools/search/tavily-search.ts +424 -0
- package/src/tools/search/tavily.test.ts +965 -0
- package/src/tools/search/tool.ts +36 -26
- package/src/tools/search/types.ts +134 -11
- package/src/tools/search/utils.ts +13 -5
- package/src/types/graph.ts +32 -87
- package/src/types/llm.ts +3 -3
- package/src/types/stream.ts +1 -1
- package/src/utils/llmConfig.ts +1 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { START,
|
|
1
|
+
import type { START, StateGraph, StateGraphArgs } from '@langchain/langgraph';
|
|
2
2
|
import type { BindToolsInput } from '@langchain/core/language_models/chat_models';
|
|
3
3
|
import type { BaseMessage, AIMessageChunk, SystemMessage } from '@langchain/core/messages';
|
|
4
4
|
import type { RunnableConfig, Runnable } from '@langchain/core/runnables';
|
|
@@ -51,51 +51,36 @@ export interface EventHandler {
|
|
|
51
51
|
}
|
|
52
52
|
export type GraphStateChannels<T extends BaseGraphState> = StateGraphArgs<T>['channels'];
|
|
53
53
|
export type Workflow<T extends BaseGraphState = BaseGraphState, U extends Partial<T> = Partial<T>, N extends string = string> = StateGraph<T, U, N>;
|
|
54
|
-
|
|
55
|
-
export type
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
messages: BinaryOperatorAggregate<BaseMessage[], BaseMessage[]>;
|
|
75
|
-
agentMessages: BinaryOperatorAggregate<BaseMessage[], BaseMessage[]>;
|
|
76
|
-
}, StateDefinition>;
|
|
77
|
-
export type CompiledAgentWorfklow = CompiledStateGraph<AgentSubgraphState, Partial<AgentSubgraphState>, '__start__' | `agent=${string}` | `tools=${string}` | `summarize=${string}`, {
|
|
78
|
-
messages: BinaryOperatorAggregate<BaseMessage[], BaseMessage[]>;
|
|
79
|
-
summarizationRequest: BinaryOperatorAggregate<SummarizationNodeInput | undefined, SummarizationNodeInput | undefined>;
|
|
80
|
-
}, {
|
|
81
|
-
messages: BinaryOperatorAggregate<BaseMessage[], BaseMessage[]>;
|
|
82
|
-
summarizationRequest: BinaryOperatorAggregate<SummarizationNodeInput | undefined, SummarizationNodeInput | undefined>;
|
|
83
|
-
}, StateDefinition, {
|
|
84
|
-
[x: `agent=${string}`]: Partial<BaseGraphState>;
|
|
85
|
-
[x: `tools=${string}`]: any;
|
|
86
|
-
[x: `summarize=${string}`]: any;
|
|
87
|
-
}>;
|
|
54
|
+
type LangChainEventStreamCallbackHandlerInput = NonNullable<Parameters<Runnable['streamEvents']>[2]>;
|
|
55
|
+
export type EventStreamCallbackHandlerInput = LangChainEventStreamCallbackHandlerInput & {
|
|
56
|
+
autoClose?: boolean;
|
|
57
|
+
raiseError?: boolean;
|
|
58
|
+
ignoreCustomEvent?: boolean;
|
|
59
|
+
};
|
|
60
|
+
export type WorkflowValuesStreamConfig = RunnableConfig & {
|
|
61
|
+
streamMode: 'values';
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* LangGraph stream output is mode-dependent (`values`, `updates`, SSE, etc.).
|
|
65
|
+
* Keep the base Runnable stream output as unknown and narrow at callsites that
|
|
66
|
+
* choose a concrete streamMode.
|
|
67
|
+
*/
|
|
68
|
+
export type CompiledWorkflow<TInput extends BaseGraphState = BaseGraphState, TOutput extends BaseGraphState = TInput> = Omit<Runnable<TInput, unknown>, 'invoke'> & {
|
|
69
|
+
invoke(input: TInput, config?: RunnableConfig): Promise<TOutput>;
|
|
70
|
+
};
|
|
71
|
+
export type CompiledStateWorkflow = CompiledWorkflow;
|
|
72
|
+
export type CompiledMultiAgentWorkflow = CompiledWorkflow<MultiAgentGraphState>;
|
|
73
|
+
export type CompiledAgentWorfklow = CompiledWorkflow<AgentSubgraphState, AgentSubgraphState>;
|
|
88
74
|
export type SystemRunnable = Runnable<BaseMessage[], (BaseMessage | SystemMessage)[], RunnableConfig<Record<string, unknown>>> | undefined;
|
|
89
75
|
/**
|
|
90
76
|
* Optional compile options passed to workflow.compile().
|
|
91
77
|
* These are intentionally untyped to avoid coupling to library internals.
|
|
92
78
|
*/
|
|
93
79
|
export type CompileOptions = {
|
|
94
|
-
checkpointer?:
|
|
80
|
+
checkpointer?: unknown;
|
|
95
81
|
interruptBefore?: string[];
|
|
96
82
|
interruptAfter?: string[];
|
|
97
83
|
};
|
|
98
|
-
export type EventStreamCallbackHandlerInput = Parameters<CompiledWorkflow['streamEvents']>[2] extends Omit<infer T, 'autoClose'> ? T : never;
|
|
99
84
|
export type StreamChunk = (ChatGenerationChunk & {
|
|
100
85
|
message: AIMessageChunk;
|
|
101
86
|
}) | AIMessageChunk;
|
|
@@ -372,3 +357,4 @@ export interface ContextPruningConfig {
|
|
|
372
357
|
placeholder?: string;
|
|
373
358
|
};
|
|
374
359
|
}
|
|
360
|
+
export {};
|
|
@@ -3,7 +3,7 @@ import type { BindToolsInput, BaseChatModelParams } from '@langchain/core/langua
|
|
|
3
3
|
import type { OpenAIChatInput, ChatOpenAIFields, AzureOpenAIInput, ClientOptions as OAIClientOptions } from '@langchain/openai';
|
|
4
4
|
import type { GoogleGenerativeAIChatInput } from '@langchain/google-genai';
|
|
5
5
|
import type { ChatVertexAIInput } from '@langchain/google-vertexai';
|
|
6
|
-
import type {
|
|
6
|
+
import type { ChatDeepSeekInput } from '@langchain/deepseek';
|
|
7
7
|
import type { ChatOpenRouterCallOptions } from '@/llm/openrouter';
|
|
8
8
|
import type { ChatBedrockConverseInput } from '@langchain/aws';
|
|
9
9
|
import type { ChatMistralAIInput } from '@langchain/mistralai';
|
|
@@ -49,7 +49,7 @@ export type AnthropicReasoning = {
|
|
|
49
49
|
export type GoogleThinkingConfig = {
|
|
50
50
|
thinkingBudget?: number;
|
|
51
51
|
includeThoughts?: boolean;
|
|
52
|
-
thinkingLevel?:
|
|
52
|
+
thinkingLevel?: 'THINKING_LEVEL_UNSPECIFIED' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
53
53
|
};
|
|
54
54
|
export type OpenAIClientOptions = ChatOpenAIFields;
|
|
55
55
|
export type AnthropicClientOptions = Omit<AnthropicInput, 'thinking'> & {
|
|
@@ -71,7 +71,7 @@ export type GoogleClientOptions = GoogleGenerativeAIChatInput & {
|
|
|
71
71
|
customHeaders?: RequestOptions['customHeaders'];
|
|
72
72
|
thinkingConfig?: GoogleThinkingConfig;
|
|
73
73
|
};
|
|
74
|
-
export type DeepSeekClientOptions =
|
|
74
|
+
export type DeepSeekClientOptions = Partial<ChatDeepSeekInput>;
|
|
75
75
|
export type XAIClientOptions = ChatXAIInput;
|
|
76
76
|
export type ClientOptions = OpenAIClientOptions | AzureClientOptions | AnthropicClientOptions | MistralAIClientOptions | VertexAIClientOptions | BedrockConverseClientOptions | GoogleClientOptions | DeepSeekClientOptions | XAIClientOptions;
|
|
77
77
|
export type SharedLLMConfig = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@librechat/agents",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.76",
|
|
4
4
|
"main": "./dist/cjs/main.cjs",
|
|
5
5
|
"module": "./dist/esm/main.mjs",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -9,6 +9,66 @@
|
|
|
9
9
|
"import": "./dist/esm/main.mjs",
|
|
10
10
|
"require": "./dist/cjs/main.cjs",
|
|
11
11
|
"types": "./dist/types/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./langchain": {
|
|
14
|
+
"import": "./dist/esm/langchain/index.mjs",
|
|
15
|
+
"require": "./dist/cjs/langchain/index.cjs",
|
|
16
|
+
"types": "./dist/types/langchain/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./langchain/language_models/chat_models": {
|
|
19
|
+
"import": "./dist/esm/langchain/language_models/chat_models.mjs",
|
|
20
|
+
"require": "./dist/cjs/langchain/language_models/chat_models.cjs",
|
|
21
|
+
"types": "./dist/types/langchain/language_models/chat_models.d.ts"
|
|
22
|
+
},
|
|
23
|
+
"./langchain/messages": {
|
|
24
|
+
"import": "./dist/esm/langchain/messages.mjs",
|
|
25
|
+
"require": "./dist/cjs/langchain/messages.cjs",
|
|
26
|
+
"types": "./dist/types/langchain/messages.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"./langchain/messages/tool": {
|
|
29
|
+
"import": "./dist/esm/langchain/messages/tool.mjs",
|
|
30
|
+
"require": "./dist/cjs/langchain/messages/tool.cjs",
|
|
31
|
+
"types": "./dist/types/langchain/messages/tool.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./langchain/google-common": {
|
|
34
|
+
"import": "./dist/esm/langchain/google-common.mjs",
|
|
35
|
+
"require": "./dist/cjs/langchain/google-common.cjs",
|
|
36
|
+
"types": "./dist/types/langchain/google-common.d.ts"
|
|
37
|
+
},
|
|
38
|
+
"./langchain/openai": {
|
|
39
|
+
"import": "./dist/esm/langchain/openai.mjs",
|
|
40
|
+
"require": "./dist/cjs/langchain/openai.cjs",
|
|
41
|
+
"types": "./dist/types/langchain/openai.d.ts"
|
|
42
|
+
},
|
|
43
|
+
"./langchain/prompts": {
|
|
44
|
+
"import": "./dist/esm/langchain/prompts.mjs",
|
|
45
|
+
"require": "./dist/cjs/langchain/prompts.cjs",
|
|
46
|
+
"types": "./dist/types/langchain/prompts.d.ts"
|
|
47
|
+
},
|
|
48
|
+
"./langchain/runnables": {
|
|
49
|
+
"import": "./dist/esm/langchain/runnables.mjs",
|
|
50
|
+
"require": "./dist/cjs/langchain/runnables.cjs",
|
|
51
|
+
"types": "./dist/types/langchain/runnables.d.ts"
|
|
52
|
+
},
|
|
53
|
+
"./langchain/tools": {
|
|
54
|
+
"import": "./dist/esm/langchain/tools.mjs",
|
|
55
|
+
"require": "./dist/cjs/langchain/tools.cjs",
|
|
56
|
+
"types": "./dist/types/langchain/tools.d.ts"
|
|
57
|
+
},
|
|
58
|
+
"./langchain/utils/env": {
|
|
59
|
+
"import": "./dist/esm/langchain/utils/env.mjs",
|
|
60
|
+
"require": "./dist/cjs/langchain/utils/env.cjs",
|
|
61
|
+
"types": "./dist/types/langchain/utils/env.d.ts"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"typesVersions": {
|
|
65
|
+
"*": {
|
|
66
|
+
"langchain": [
|
|
67
|
+
"dist/types/langchain/index.d.ts"
|
|
68
|
+
],
|
|
69
|
+
"langchain/*": [
|
|
70
|
+
"dist/types/langchain/*"
|
|
71
|
+
]
|
|
12
72
|
}
|
|
13
73
|
},
|
|
14
74
|
"type": "module",
|
|
@@ -27,7 +87,7 @@
|
|
|
27
87
|
],
|
|
28
88
|
"packageManager": "npm@10.5.2",
|
|
29
89
|
"engines": {
|
|
30
|
-
"node": ">=
|
|
90
|
+
"node": ">=20.0.0"
|
|
31
91
|
},
|
|
32
92
|
"files": [
|
|
33
93
|
"dist",
|
|
@@ -111,29 +171,31 @@
|
|
|
111
171
|
"format": "prettier --write ."
|
|
112
172
|
},
|
|
113
173
|
"overrides": {
|
|
114
|
-
"@langchain/openai": "
|
|
174
|
+
"@langchain/openai": "1.4.5",
|
|
115
175
|
"@anthropic-ai/sdk": "$@anthropic-ai/sdk",
|
|
116
176
|
"@browserbasehq/stagehand": {
|
|
117
177
|
"openai": "$openai"
|
|
118
178
|
},
|
|
119
|
-
"fast-xml-parser": "5.
|
|
179
|
+
"fast-xml-parser": "5.7.2",
|
|
120
180
|
"ajv": "6.14.0",
|
|
121
181
|
"minimatch": "3.1.4"
|
|
122
182
|
},
|
|
123
183
|
"dependencies": {
|
|
124
|
-
"@anthropic-ai/sdk": "^0.
|
|
184
|
+
"@anthropic-ai/sdk": "^0.92.0",
|
|
125
185
|
"@aws-sdk/client-bedrock-runtime": "^3.1013.0",
|
|
126
|
-
"@langchain/anthropic": "^
|
|
127
|
-
"@langchain/aws": "^
|
|
128
|
-
"@langchain/core": "
|
|
129
|
-
"@langchain/deepseek": "^
|
|
130
|
-
"@langchain/google-
|
|
131
|
-
"@langchain/google-
|
|
132
|
-
"@langchain/
|
|
133
|
-
"@langchain/
|
|
134
|
-
"@langchain/
|
|
135
|
-
"@langchain/
|
|
136
|
-
"@langchain/
|
|
186
|
+
"@langchain/anthropic": "^1.3.28",
|
|
187
|
+
"@langchain/aws": "^1.3.5",
|
|
188
|
+
"@langchain/core": "1.1.44",
|
|
189
|
+
"@langchain/deepseek": "^1.0.25",
|
|
190
|
+
"@langchain/google-common": "2.1.30",
|
|
191
|
+
"@langchain/google-gauth": "2.1.30",
|
|
192
|
+
"@langchain/google-genai": "2.1.30",
|
|
193
|
+
"@langchain/google-vertexai": "2.1.30",
|
|
194
|
+
"@langchain/langgraph": "^1.2.9",
|
|
195
|
+
"@langchain/mistralai": "^1.0.8",
|
|
196
|
+
"@langchain/openai": "1.4.5",
|
|
197
|
+
"@langchain/textsplitters": "^1.0.1",
|
|
198
|
+
"@langchain/xai": "^1.3.17",
|
|
137
199
|
"@langfuse/langchain": "^4.3.0",
|
|
138
200
|
"@langfuse/otel": "^4.3.0",
|
|
139
201
|
"@langfuse/tracing": "^4.3.0",
|
|
@@ -147,7 +209,8 @@
|
|
|
147
209
|
"mathjs": "^15.2.0",
|
|
148
210
|
"nanoid": "^3.3.7",
|
|
149
211
|
"okapibm25": "^1.4.1",
|
|
150
|
-
"openai": "
|
|
212
|
+
"openai": "^6.35.0",
|
|
213
|
+
"uuid": "^11.1.1"
|
|
151
214
|
},
|
|
152
215
|
"imports": {
|
|
153
216
|
"@/*": "./src/*",
|
package/src/graphs/Graph.ts
CHANGED
|
@@ -399,12 +399,25 @@ export class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {
|
|
|
399
399
|
): (string | number | undefined)[] {
|
|
400
400
|
if (!metadata) return [];
|
|
401
401
|
|
|
402
|
+
const configurable = this.config?.configurable;
|
|
403
|
+
const runId =
|
|
404
|
+
(metadata.run_id as string | undefined) ??
|
|
405
|
+
(configurable?.run_id as string | undefined) ??
|
|
406
|
+
this.runId;
|
|
407
|
+
const threadId =
|
|
408
|
+
(metadata.thread_id as string | undefined) ??
|
|
409
|
+
(configurable?.thread_id as string | undefined) ??
|
|
410
|
+
runId;
|
|
411
|
+
const checkpointNs =
|
|
412
|
+
(metadata.checkpoint_ns as string | undefined) ??
|
|
413
|
+
(metadata.langgraph_checkpoint_ns as string | undefined) ??
|
|
414
|
+
'';
|
|
402
415
|
const keyList = [
|
|
403
|
-
|
|
404
|
-
|
|
416
|
+
runId,
|
|
417
|
+
threadId,
|
|
405
418
|
metadata.langgraph_node as string,
|
|
406
419
|
metadata.langgraph_step as number,
|
|
407
|
-
|
|
420
|
+
checkpointNs,
|
|
408
421
|
];
|
|
409
422
|
|
|
410
423
|
const agentContext = this.getAgentContext(metadata);
|
|
@@ -1461,7 +1474,14 @@ export class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {
|
|
|
1461
1474
|
}),
|
|
1462
1475
|
});
|
|
1463
1476
|
const workflow = new StateGraph(StateAnnotation)
|
|
1464
|
-
.addNode(
|
|
1477
|
+
.addNode(
|
|
1478
|
+
this.defaultAgentId,
|
|
1479
|
+
agentNode as Runnable<
|
|
1480
|
+
t.AgentSubgraphState,
|
|
1481
|
+
Partial<t.AgentSubgraphState>
|
|
1482
|
+
>,
|
|
1483
|
+
{ ends: [END] }
|
|
1484
|
+
)
|
|
1465
1485
|
.addEdge(START, this.defaultAgentId)
|
|
1466
1486
|
// LangGraph compile() types are overly strict for opt-in options
|
|
1467
1487
|
.compile(this.compileOptions as unknown as never);
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { HumanMessage } from '@langchain/core/messages';
|
|
2
|
+
import type { ToolCall } from '@langchain/core/messages/tool';
|
|
3
|
+
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
4
|
+
import type * as t from '@/types';
|
|
5
|
+
import { MultiAgentGraph } from '../MultiAgentGraph';
|
|
6
|
+
import { Constants, Providers } from '@/common';
|
|
7
|
+
import { StandardGraph } from '../Graph';
|
|
8
|
+
|
|
9
|
+
const makeAgent = (agentId: string): t.AgentInputs => ({
|
|
10
|
+
agentId,
|
|
11
|
+
provider: Providers.OPENAI,
|
|
12
|
+
instructions: `You are ${agentId}.`,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const makeConfig = (threadId: string): RunnableConfig => ({
|
|
16
|
+
configurable: {
|
|
17
|
+
thread_id: threadId,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const makeStreamConfig = (threadId: string): t.WorkflowValuesStreamConfig => ({
|
|
22
|
+
...makeConfig(threadId),
|
|
23
|
+
streamMode: 'values' as const,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const getAiContents = (messages: t.BaseGraphState['messages']): string[] =>
|
|
27
|
+
messages
|
|
28
|
+
.filter((message) => message.getType() === 'ai')
|
|
29
|
+
.map((message) => message.content)
|
|
30
|
+
.filter((content): content is string => typeof content === 'string');
|
|
31
|
+
|
|
32
|
+
const expectCompiledWorkflow = (
|
|
33
|
+
workflow: t.CompiledWorkflow | t.CompiledMultiAgentWorkflow
|
|
34
|
+
): void => {
|
|
35
|
+
expect(typeof workflow.invoke).toBe('function');
|
|
36
|
+
expect(typeof workflow.stream).toBe('function');
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
describe('LangGraph composition smoke tests', () => {
|
|
40
|
+
it('compiles and invokes the standard single-agent graph', async () => {
|
|
41
|
+
const graph = new StandardGraph({
|
|
42
|
+
runId: 'standard-smoke',
|
|
43
|
+
agents: [makeAgent('agent')],
|
|
44
|
+
});
|
|
45
|
+
graph.overrideTestModel(['standard ok']);
|
|
46
|
+
|
|
47
|
+
const workflow = graph.createWorkflow();
|
|
48
|
+
expectCompiledWorkflow(workflow);
|
|
49
|
+
|
|
50
|
+
const result = await workflow.invoke(
|
|
51
|
+
{ messages: [new HumanMessage('hello')] },
|
|
52
|
+
makeConfig('standard-smoke')
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
expect(getAiContents(result.messages)).toEqual(['standard ok']);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('streams values from the standard single-agent graph', async () => {
|
|
59
|
+
const graph = new StandardGraph({
|
|
60
|
+
runId: 'standard-stream-smoke',
|
|
61
|
+
agents: [makeAgent('agent')],
|
|
62
|
+
});
|
|
63
|
+
graph.overrideTestModel(['standard stream ok']);
|
|
64
|
+
|
|
65
|
+
const workflow = graph.createWorkflow();
|
|
66
|
+
const stream = (await workflow.stream(
|
|
67
|
+
{ messages: [new HumanMessage('hello')] },
|
|
68
|
+
makeStreamConfig('standard-stream-smoke')
|
|
69
|
+
)) as AsyncIterable<t.BaseGraphState>;
|
|
70
|
+
const chunks: t.BaseGraphState[] = [];
|
|
71
|
+
|
|
72
|
+
for await (const chunk of stream) {
|
|
73
|
+
chunks.push(chunk);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
expect(chunks.length).toBeGreaterThan(0);
|
|
77
|
+
expect(
|
|
78
|
+
chunks.some((chunk) =>
|
|
79
|
+
getAiContents(chunk.messages).includes('standard stream ok')
|
|
80
|
+
)
|
|
81
|
+
).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('compiles and invokes a multi-agent graph with one agent and no edges', async () => {
|
|
85
|
+
const graph = new MultiAgentGraph({
|
|
86
|
+
runId: 'multi-single-smoke',
|
|
87
|
+
agents: [makeAgent('A')],
|
|
88
|
+
edges: [],
|
|
89
|
+
});
|
|
90
|
+
graph.overrideTestModel(['multi ok']);
|
|
91
|
+
|
|
92
|
+
const workflow = graph.createWorkflow();
|
|
93
|
+
expectCompiledWorkflow(workflow);
|
|
94
|
+
|
|
95
|
+
const result = await workflow.invoke(
|
|
96
|
+
{ messages: [new HumanMessage('hello')] },
|
|
97
|
+
makeConfig('multi-single-smoke')
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
expect(getAiContents(result.messages)).toEqual(['multi ok']);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('compiles and invokes direct sequential edges', async () => {
|
|
104
|
+
const graph = new MultiAgentGraph({
|
|
105
|
+
runId: 'direct-chain-smoke',
|
|
106
|
+
agents: [makeAgent('A'), makeAgent('B')],
|
|
107
|
+
edges: [{ from: 'A', to: 'B', edgeType: 'direct' }],
|
|
108
|
+
});
|
|
109
|
+
graph.overrideTestModel(['from A', 'from B']);
|
|
110
|
+
|
|
111
|
+
const workflow = graph.createWorkflow();
|
|
112
|
+
expectCompiledWorkflow(workflow);
|
|
113
|
+
|
|
114
|
+
const result = await workflow.invoke(
|
|
115
|
+
{ messages: [new HumanMessage('start')] },
|
|
116
|
+
makeConfig('direct-chain-smoke')
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
expect(getAiContents(result.messages)).toEqual(['from A', 'from B']);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('compiles and invokes a handoff edge using graph-managed transfer tools', async () => {
|
|
123
|
+
const transferToolCall: ToolCall = {
|
|
124
|
+
id: 'call_transfer_to_B',
|
|
125
|
+
name: `${Constants.LC_TRANSFER_TO_}B`,
|
|
126
|
+
args: { instructions: 'Take over from here.' },
|
|
127
|
+
type: 'tool_call',
|
|
128
|
+
};
|
|
129
|
+
const graph = new MultiAgentGraph({
|
|
130
|
+
runId: 'handoff-smoke',
|
|
131
|
+
agents: [makeAgent('A'), makeAgent('B')],
|
|
132
|
+
edges: [{ from: 'A', to: 'B', edgeType: 'handoff' }],
|
|
133
|
+
});
|
|
134
|
+
graph.overrideTestModel(['routing to B', 'handoff complete'], undefined, [
|
|
135
|
+
transferToolCall,
|
|
136
|
+
]);
|
|
137
|
+
|
|
138
|
+
const workflow = graph.createWorkflow();
|
|
139
|
+
expectCompiledWorkflow(workflow);
|
|
140
|
+
|
|
141
|
+
const result = await workflow.invoke(
|
|
142
|
+
{ messages: [new HumanMessage('start')] },
|
|
143
|
+
makeConfig('handoff-smoke')
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
expect(getAiContents(result.messages)).toContain('handoff complete');
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('compiles fan-out/fan-in direct composition with prompt wrapping', () => {
|
|
150
|
+
const graph = new MultiAgentGraph({
|
|
151
|
+
runId: 'fan-in-smoke',
|
|
152
|
+
agents: [
|
|
153
|
+
makeAgent('root'),
|
|
154
|
+
makeAgent('left'),
|
|
155
|
+
makeAgent('right'),
|
|
156
|
+
makeAgent('final'),
|
|
157
|
+
],
|
|
158
|
+
edges: [
|
|
159
|
+
{ from: 'root', to: ['left', 'right'], edgeType: 'direct' },
|
|
160
|
+
{
|
|
161
|
+
from: ['left', 'right'],
|
|
162
|
+
to: 'final',
|
|
163
|
+
edgeType: 'direct',
|
|
164
|
+
prompt: 'Summarize these results:\n{results}',
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
expectCompiledWorkflow(graph.createWorkflow());
|
|
170
|
+
expect(graph.getParallelGroupId('root')).toBeUndefined();
|
|
171
|
+
expect(graph.getParallelGroupId('left')).toBe(1);
|
|
172
|
+
expect(graph.getParallelGroupId('right')).toBe(1);
|
|
173
|
+
expect(graph.getParallelGroupId('final')).toBeUndefined();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('compiles mixed handoff and direct routing from the same agent', () => {
|
|
177
|
+
const graph = new MultiAgentGraph({
|
|
178
|
+
runId: 'mixed-routing-smoke',
|
|
179
|
+
agents: [makeAgent('router'), makeAgent('handoff'), makeAgent('direct')],
|
|
180
|
+
edges: [
|
|
181
|
+
{ from: 'router', to: 'handoff', edgeType: 'handoff' },
|
|
182
|
+
{ from: 'router', to: 'direct', edgeType: 'direct' },
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
expectCompiledWorkflow(graph.createWorkflow());
|
|
187
|
+
});
|
|
188
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -38,6 +38,9 @@ export * from './hooks';
|
|
|
38
38
|
/* Types */
|
|
39
39
|
export type * from './types';
|
|
40
40
|
|
|
41
|
+
/* LangChain compatibility facade */
|
|
42
|
+
export * from './langchain';
|
|
43
|
+
|
|
41
44
|
/* LLM */
|
|
42
45
|
export { CustomOpenAIClient } from './llm/openai';
|
|
43
46
|
export { ChatOpenRouter } from './llm/openrouter';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { GoogleAIToolType } from '@langchain/google-common';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { BindToolsInput } from '@langchain/core/language_models/chat_models';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export {
|
|
2
|
+
AIMessage,
|
|
3
|
+
AIMessageChunk,
|
|
4
|
+
BaseMessage,
|
|
5
|
+
BaseMessageChunk,
|
|
6
|
+
HumanMessage,
|
|
7
|
+
SystemMessage,
|
|
8
|
+
ToolMessage,
|
|
9
|
+
getBufferString,
|
|
10
|
+
isAIMessage,
|
|
11
|
+
isBaseMessage,
|
|
12
|
+
isToolMessage,
|
|
13
|
+
} from '@langchain/core/messages';
|
|
14
|
+
|
|
15
|
+
export type {
|
|
16
|
+
BaseMessageFields,
|
|
17
|
+
MessageContent,
|
|
18
|
+
MessageContentText,
|
|
19
|
+
MessageContentImageUrl,
|
|
20
|
+
UsageMetadata,
|
|
21
|
+
} from '@langchain/core/messages';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { AzureOpenAIInput } from '@langchain/openai';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PromptTemplate } from '@langchain/core/prompts';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getEnvironmentVariable } from '@langchain/core/utils/env';
|