Skip to content

Commit a1d2c2a

Browse files
chore(deps): upgrade langchain dependencies to v1.x and fix compatibility
Upgrade 13 langchain packages from 0.3.x/0.4.x to latest 1.x versions: - @langchain/core, @langchain/community, @langchain/langgraph, langchain - All provider packages (@langchain/openai, @Anthropic, @aws, etc) - @langfuse packages to v5.x Fix type compatibility in chat graph nodes: - Change MemoryVectorStore import path to @langchain/classic/vectorstores/memory - Update message type handling to use SavedMessage union instead of BaseMessage - Adjust trimMessages tokenCounter signature - Export LangGraphRunnableConfig from graphs/types.ts - Fix run-tool.node optional chaining for tool_calls check Co-authored-by: opencode <opencode-agent[bot]@users.noreply.github.com>
1 parent 374d283 commit a1d2c2a

10 files changed

Lines changed: 832 additions & 2301 deletions

File tree

package-lock.json

Lines changed: 796 additions & 2265 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,15 @@
127127
"@loopback/core": "^6.1.11"
128128
},
129129
"dependencies": {
130-
"@langchain/community": "^0.3.50",
131-
"@langchain/core": "^0.3.80",
132-
"@langchain/langgraph": "^0.4.4",
130+
"@langchain/community": "^1.1.27",
131+
"@langchain/core": "^1.1.39",
132+
"@langchain/langgraph": "^1.2.8",
133133
"@loopback/repository": "^7.0.14",
134134
"@loopback/sequelize": "^0.6.14",
135135
"@sourceloop/chat-service": "15.0.3",
136136
"@sourceloop/core": "17.0.3",
137137
"@sourceloop/file-utils": "^0.5.0",
138-
"langchain": "^0.3.37",
138+
"langchain": "^1.3.1",
139139
"loopback4-authentication": "^12.2.0",
140140
"loopback4-authorization": "^7.0.3",
141141
"tslib": "^2.8.1",
@@ -146,15 +146,15 @@
146146
"@commitlint/config-conventional": "^16.2.1",
147147
"@google/generative-ai": "^0.24.1",
148148
"@istanbuljs/nyc-config-typescript": "^1.0.2",
149-
"@langchain/anthropic": "^0.3.26",
150-
"@langchain/aws": "^0.1.13",
151-
"@langchain/cerebras": "^0.0.2",
152-
"@langchain/google-genai": "^0.2.16",
153-
"@langchain/groq": "^0.2.3",
154-
"@langchain/ollama": "^0.2.3",
155-
"@langchain/openai": "^0.6.11",
156-
"@langfuse/core": "^4.4.2",
157-
"@langfuse/langchain": "^4.4.2",
149+
"@langchain/anthropic": "^1.3.26",
150+
"@langchain/aws": "^1.3.4",
151+
"@langchain/cerebras": "^1.0.4",
152+
"@langchain/google-genai": "^2.1.26",
153+
"@langchain/groq": "^1.2.0",
154+
"@langchain/ollama": "^1.2.6",
155+
"@langchain/openai": "^1.4.4",
156+
"@langfuse/core": "^5.1.0",
157+
"@langfuse/langchain": "^5.1.0",
158158
"@loopback/build": "^11.0.9",
159159
"@loopback/eslint-config": "^15.0.5",
160160
"@loopback/testlab": "^7.0.9",

src/components/db-query/providers/datasets.retriever.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import {Document} from '@langchain/core/documents';
12
import {BaseRetriever} from '@langchain/core/retrievers';
23
import {VectorStore} from '@langchain/core/vectorstores';
34
import {inject, Provider, ValueOrPromise} from '@loopback/core';
45
import {AnyObject} from '@loopback/repository';
5-
import {MemoryVectorStore} from 'langchain/vectorstores/memory';
6+
import {MemoryVectorStore} from '@langchain/classic/vectorstores/memory';
67
import {AiIntegrationBindings} from '../../../keys';
78
import {DbQueryStoredTypes} from '../types';
89
import {AuthenticationBindings} from 'loopback4-authentication';
@@ -19,7 +20,7 @@ export class DatasetRetriever implements Provider<BaseRetriever> {
1920
if (this.vectorStore instanceof MemoryVectorStore) {
2021
return this.vectorStore.asRetriever({
2122
k: 5,
22-
filter: doc =>
23+
filter: (doc: Document) =>
2324
doc.metadata.type === DbQueryStoredTypes.DataSet &&
2425
doc.metadata.tenantId === this.user.tenantId,
2526
searchType: 'similarity',

src/components/db-query/providers/templates.retriever.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import {Document} from '@langchain/core/documents';
12
import {BaseRetriever} from '@langchain/core/retrievers';
23
import {VectorStore} from '@langchain/core/vectorstores';
34
import {inject, Provider, ValueOrPromise} from '@loopback/core';
45
import {AnyObject} from '@loopback/repository';
5-
import {MemoryVectorStore} from 'langchain/vectorstores/memory';
6+
import {MemoryVectorStore} from '@langchain/classic/vectorstores/memory';
67
import {AiIntegrationBindings} from '../../../keys';
78
import {DbQueryStoredTypes} from '../types';
89
import {AuthenticationBindings} from 'loopback4-authentication';
@@ -19,7 +20,7 @@ export class TemplateRetriever implements Provider<BaseRetriever> {
1920
if (this.vectorStore instanceof MemoryVectorStore) {
2021
return this.vectorStore.asRetriever({
2122
k: 5,
22-
filter: doc =>
23+
filter: (doc: Document) =>
2324
doc.metadata.type === DbQueryStoredTypes.Template &&
2425
doc.metadata.tenantId === this.user.tenantId,
2526
searchType: 'similarity',

src/graphs/chat/nodes/context-compression.node.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {trimMessages} from '@langchain/core/messages';
1+
import {BaseMessage, trimMessages} from '@langchain/core/messages';
22
import {inject} from '@loopback/core';
33
import {DEFAULT_MAX_TOKEN_COUNT} from '../../../constant';
44
import {graphNode} from '../../../decorators';
@@ -36,7 +36,11 @@ export class ContextCompressionNode implements IGraphNode<ChatState> {
3636
const trimmed = await trimMessages(state.messages, {
3737
maxTokens: maxTokenCount,
3838
strategy: 'last',
39-
tokenCounter: approxTokenCounter,
39+
tokenCounter: (messages: BaseMessage[]) =>
40+
messages.reduce(
41+
(count, message) => count + approxTokenCounter(message.content),
42+
0,
43+
),
4044
includeSystem: true,
4145
});
4246
return {

src/graphs/chat/nodes/init-session.node.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import {
2-
BaseMessage,
3-
HumanMessage,
4-
SystemMessage,
5-
} from '@langchain/core/messages';
1+
import {HumanMessage, SystemMessage} from '@langchain/core/messages';
2+
import {SavedMessage} from '../../types';
63
import {LangGraphRunnableConfig} from '@langchain/langgraph';
74
import {inject, service} from '@loopback/core';
85
import {graphNode} from '../../../decorators';
@@ -67,15 +64,15 @@ export class InitSessionNode implements IGraphNode<ChatState> {
6764
};
6865
}
6966

70-
private async _formatMessage(messages: Message[]): Promise<BaseMessage[]> {
67+
private async _formatMessage(messages: Message[]): Promise<SavedMessage[]> {
7168
if (!messages) {
7269
return [];
7370
}
7471
const graphMessages = await Promise.all(
7572
messages.map(message => this.chatStore.toMessage(message)),
7673
);
7774
return graphMessages.filter(
78-
(message): message is BaseMessage => message !== undefined,
75+
(message): message is SavedMessage => message !== undefined,
7976
);
8077
}
8178
}

src/graphs/chat/nodes/run-tool.node.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,8 @@ export class RunToolNode implements IGraphNode<ChatState> {
3333
}
3434
const newMessages: ToolMessage[] = [];
3535
const tools = this.tools.map;
36-
const lastMessage = state.messages[state.messages.length - 1] as AIMessage &
37-
ToolMessage;
38-
if (
39-
!lastMessage ||
40-
lastMessage.tool_call_id ||
41-
!lastMessage.tool_calls?.length
42-
) {
36+
const lastMessage = state.messages[state.messages.length - 1] as AIMessage;
37+
if (!lastMessage?.tool_calls?.length) {
4338
return state;
4439
}
4540
const toolCalls = lastMessage.tool_calls!;

src/graphs/chat/nodes/summarise-file.node.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {HumanMessage} from '@langchain/core/messages';
1+
import {ContentBlock, HumanMessage} from '@langchain/core/messages';
22
import {PromptTemplate} from '@langchain/core/prompts';
33
import {RunnableSequence} from '@langchain/core/runnables';
44
import {LangGraphRunnableConfig, Messages} from '@langchain/langgraph';
@@ -76,7 +76,7 @@ export class SummariseFileNode implements IGraphNode<ChatState> {
7676
type: 'text',
7777
text: state.prompt,
7878
},
79-
fileContent,
79+
fileContent as unknown as ContentBlock,
8080
],
8181
},
8282
];

src/graphs/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {LangGraphRunnableConfig} from '@langchain/langgraph';
55
import {AnyObject, Command} from '@loopback/repository';
66
import {LLMStreamEvent} from './event.types';
77

8+
export type {LangGraphRunnableConfig};
9+
810
export type RunnableConfig = LangGraphRunnableConfig & {
911
writer?: (event: LLMStreamEvent) => void;
1012
};

src/providers/vector-stores/inmemory.vector.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {inject, Provider, ValueOrPromise} from '@loopback/core';
2-
import {MemoryVectorStore} from 'langchain/vectorstores/memory';
2+
import {MemoryVectorStore} from '@langchain/classic/vectorstores/memory';
33
import {AiIntegrationBindings} from '../../keys';
44
import {EmbeddingProvider} from '../../types';
55
import {AnyObject} from '@loopback/repository';

0 commit comments

Comments
 (0)