Skip to content

Commit 8a4a5a4

Browse files
authored
🤖 feat: Agent Handoffs (Routing) (danny-avila#10176)
* feat: Add support for agent handoffs with edges in agent forms and schemas chore: Mark `agent_ids` field as deprecated in favor of edges across various schemas and types chore: Update dependencies for @langchain/core and @librechat/agents to latest versions chore: Update peer dependency for @librechat/agents to version 3.0.0-rc2 in package.json chore: Update @librechat/agents dependency to version 3.0.0-rc3 in package.json and package-lock.json feat: first pass, multi-agent handoffs fix: update output type to ToolMessage in memory handling functions fix: improve type checking for graphConfig in createRun function refactor: remove unused content filtering logic in AgentClient chore: update @librechat/agents dependency to version 3.0.0-rc4 in package.json and package-lock.json fix: update @langchain/core peer dependency version to ^0.3.72 in package.json and package-lock.json fix: update @librechat/agents dependency to version 3.0.0-rc6 in package.json and package-lock.json; refactor stream rate handling in various endpoints feat: Agent handoff UI chore: update @librechat/agents dependency to version 3.0.0-rc8 in package.json and package-lock.json fix: improve hasInfo condition and adjust UI element classes in AgentHandoff component refactor: remove current fixed agent display from AgentHandoffs component due to redundancy feat: enhance AgentHandoffs UI with localized beta label and improved layout chore: update @librechat/agents dependency to version 3.0.0-rc10 in package.json and package-lock.json feat: add `createSequentialChainEdges` function to add back agent chaining via multi-agents feat: update `createSequentialChainEdges` call to only provide conversation context between agents feat: deprecate Agent Chain functionality and update related methods for improved clarity * chore: update @librechat/agents dependency to version 3.0.0-rc11 in package.json and package-lock.json * refactor: remove unused addCacheControl function and related imports and import from @librechat/agents * chore: remove unused i18n keys * refactor: remove unused format export from index.ts * chore: update @librechat/agents to v3.0.0-rc13 * chore: remove BEDROCK_LEGACY provider from Providers enum * chore: update @librechat/agents to version 3.0.2 in package.json
1 parent 958a6c7 commit 8a4a5a4

41 files changed

Lines changed: 12927 additions & 15629 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/app/clients/AnthropicClient.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const {
1010
getResponseSender,
1111
validateVisionModel,
1212
} = require('librechat-data-provider');
13-
const { sleep, SplitStreamHandler: _Handler } = require('@librechat/agents');
13+
const { sleep, SplitStreamHandler: _Handler, addCacheControl } = require('@librechat/agents');
1414
const {
1515
Tokenizer,
1616
createFetch,
@@ -25,7 +25,6 @@ const {
2525
const {
2626
truncateText,
2727
formatMessage,
28-
addCacheControl,
2928
titleFunctionPrompt,
3029
parseParamFromPrompt,
3130
createContextHandlers,

api/app/clients/prompts/addCacheControl.js

Lines changed: 0 additions & 45 deletions
This file was deleted.

api/app/clients/prompts/addCacheControl.spec.js

Lines changed: 0 additions & 227 deletions
This file was deleted.

api/app/clients/prompts/index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const addCacheControl = require('./addCacheControl');
21
const formatMessages = require('./formatMessages');
32
const summaryPrompts = require('./summaryPrompts');
43
const handleInputs = require('./handleInputs');
@@ -9,7 +8,6 @@ const createVisionPrompt = require('./createVisionPrompt');
98
const createContextHandlers = require('./createContextHandlers');
109

1110
module.exports = {
12-
addCacheControl,
1311
...formatMessages,
1412
...summaryPrompts,
1513
...handleInputs,

api/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444
"@googleapis/youtube": "^20.0.0",
4545
"@keyv/redis": "^4.3.3",
4646
"@langchain/community": "^0.3.47",
47-
"@langchain/core": "^0.3.62",
47+
"@langchain/core": "^0.3.72",
4848
"@langchain/google-genai": "^0.2.13",
4949
"@langchain/google-vertexai": "^0.2.13",
5050
"@langchain/textsplitters": "^0.1.0",
51-
"@librechat/agents": "^2.4.90",
51+
"@librechat/agents": "^3.0.2",
5252
"@librechat/api": "*",
5353
"@librechat/data-schemas": "*",
5454
"@microsoft/microsoft-graph-client": "^3.0.7",

api/server/controllers/agents/callbacks.js

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ class ModelEndHandler {
9595
}
9696
}
9797

98+
/**
99+
* @deprecated Agent Chain helper
100+
* @param {string | undefined} [last_agent_id]
101+
* @param {string | undefined} [langgraph_node]
102+
* @returns {boolean}
103+
*/
104+
function checkIfLastAgent(last_agent_id, langgraph_node) {
105+
if (!last_agent_id || !langgraph_node) {
106+
return false;
107+
}
108+
return langgraph_node?.endsWith(last_agent_id);
109+
}
110+
98111
/**
99112
* Get default handlers for stream events.
100113
* @param {Object} options - The options object.
@@ -125,7 +138,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU
125138
handle: (event, data, metadata) => {
126139
if (data?.stepDetails.type === StepTypes.TOOL_CALLS) {
127140
sendEvent(res, { event, data });
128-
} else if (metadata?.last_agent_index === metadata?.agent_index) {
141+
} else if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) {
129142
sendEvent(res, { event, data });
130143
} else if (!metadata?.hide_sequential_outputs) {
131144
sendEvent(res, { event, data });
@@ -154,7 +167,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU
154167
handle: (event, data, metadata) => {
155168
if (data?.delta.type === StepTypes.TOOL_CALLS) {
156169
sendEvent(res, { event, data });
157-
} else if (metadata?.last_agent_index === metadata?.agent_index) {
170+
} else if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) {
158171
sendEvent(res, { event, data });
159172
} else if (!metadata?.hide_sequential_outputs) {
160173
sendEvent(res, { event, data });
@@ -172,7 +185,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU
172185
handle: (event, data, metadata) => {
173186
if (data?.result != null) {
174187
sendEvent(res, { event, data });
175-
} else if (metadata?.last_agent_index === metadata?.agent_index) {
188+
} else if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) {
176189
sendEvent(res, { event, data });
177190
} else if (!metadata?.hide_sequential_outputs) {
178191
sendEvent(res, { event, data });
@@ -188,7 +201,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU
188201
* @param {GraphRunnableConfig['configurable']} [metadata] The runnable metadata.
189202
*/
190203
handle: (event, data, metadata) => {
191-
if (metadata?.last_agent_index === metadata?.agent_index) {
204+
if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) {
192205
sendEvent(res, { event, data });
193206
} else if (!metadata?.hide_sequential_outputs) {
194207
sendEvent(res, { event, data });
@@ -204,7 +217,7 @@ function getDefaultHandlers({ res, aggregateContent, toolEndCallback, collectedU
204217
* @param {GraphRunnableConfig['configurable']} [metadata] The runnable metadata.
205218
*/
206219
handle: (event, data, metadata) => {
207-
if (metadata?.last_agent_index === metadata?.agent_index) {
220+
if (checkIfLastAgent(metadata?.last_agent_id, metadata?.langgraph_node)) {
208221
sendEvent(res, { event, data });
209222
} else if (!metadata?.hide_sequential_outputs) {
210223
sendEvent(res, { event, data });

0 commit comments

Comments
 (0)