@langgraph-js/sdk 4.6.1 → 4.6.3
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/LangGraphClient.d.ts +3 -1
- package/dist/MessageProcessor.js +5 -2
- package/dist/react/ChatContext.d.ts +2 -0
- package/dist/react/ChatContext.js +3 -2
- package/dist/solid/ChatContext.d.ts +2 -0
- package/dist/solid/ChatContext.js +1 -0
- package/dist/ui-store/createChatStore.d.ts +2 -0
- package/dist/ui-store/createChatStore.js +9 -11
- package/dist/vue/ChatContext.d.ts +11 -0
- package/dist/vue/ChatContext.js +5 -0
- package/package.json +1 -1
- package/src/LangGraphClient.ts +3 -1
- package/src/MessageProcessor.ts +5 -2
- package/src/react/ChatContext.ts +5 -1
- package/src/solid/ChatContext.ts +3 -0
- package/src/ui-store/createChatStore.ts +12 -11
- package/src/vue/ChatContext.ts +7 -0
|
@@ -35,6 +35,8 @@ export type RenderMessage = Message & {
|
|
|
35
35
|
unique_id?: string;
|
|
36
36
|
/** 工具调用是否完成 */
|
|
37
37
|
done?: boolean;
|
|
38
|
+
/** 标记工具消息的原始 ai 消息 */
|
|
39
|
+
source_ai_message_id?: string;
|
|
38
40
|
};
|
|
39
41
|
export type SendMessageOptions = {
|
|
40
42
|
extraParams?: Record<string, any>;
|
|
@@ -157,7 +159,7 @@ export declare class LangGraphClient<TStateType = unknown> extends EventEmitter<
|
|
|
157
159
|
}): Promise<Thread<TStateType, unknown>>;
|
|
158
160
|
search(query?: {
|
|
159
161
|
metadata?: import("@langchain/langgraph-sdk").Metadata;
|
|
160
|
-
limit
|
|
162
|
+
limit?: number;
|
|
161
163
|
offset?: number;
|
|
162
164
|
status?: import("@langchain/langgraph-sdk").ThreadStatus;
|
|
163
165
|
sortBy?: import("@langgraph-js/pure-graph/dist/types.js").ThreadSortBy;
|
package/dist/MessageProcessor.js
CHANGED
|
@@ -162,6 +162,8 @@ export class MessageProcessor {
|
|
|
162
162
|
if (parentMessage) {
|
|
163
163
|
message.usage_metadata = parentMessage.usage_metadata;
|
|
164
164
|
message.node_name = parentMessage.name;
|
|
165
|
+
/** @ts-ignore 用于标记原始的 AI message 的id */
|
|
166
|
+
message.source_ai_message_id = parentMessage.id;
|
|
165
167
|
// 修补特殊情况下,tool name 丢失的问题
|
|
166
168
|
if (!message.name) {
|
|
167
169
|
message.name = parentMessage.tool_calls.find((i) => i.id === message.tool_call_id)?.name;
|
|
@@ -251,10 +253,11 @@ export class MessageProcessor {
|
|
|
251
253
|
const childrenMap = state_sub_messages_map;
|
|
252
254
|
const rootMessages = [];
|
|
253
255
|
for (const message of messages) {
|
|
254
|
-
const
|
|
256
|
+
const sourceId = message.source_ai_message_id || message.id;
|
|
257
|
+
const isRoot = !nonRootMessageId.has(sourceId);
|
|
255
258
|
if (!isRoot) {
|
|
256
259
|
// 处理子消息
|
|
257
|
-
const parentId = parentPointer.get(
|
|
260
|
+
const parentId = parentPointer.get(sourceId);
|
|
258
261
|
const children = childrenMap.get(parentId);
|
|
259
262
|
if (children) {
|
|
260
263
|
children.push(message);
|
|
@@ -85,6 +85,8 @@ interface ChatProviderProps {
|
|
|
85
85
|
onInitError?: (error: any, currentAgent: string) => void;
|
|
86
86
|
client?: ILangGraphClient;
|
|
87
87
|
legacyMode?: boolean;
|
|
88
|
+
/** 历史记录筛选的默认参数 */
|
|
89
|
+
historyFilter?: import("../ui-store/createChatStore.js").HistoryFilter;
|
|
88
90
|
}
|
|
89
91
|
export declare const ChatProvider: React.FC<ChatProviderProps>;
|
|
90
92
|
export {};
|
|
@@ -9,7 +9,7 @@ export const useChat = () => {
|
|
|
9
9
|
}
|
|
10
10
|
return context;
|
|
11
11
|
};
|
|
12
|
-
export const ChatProvider = ({ children, defaultAgent = "", apiUrl = "http://localhost:8123", defaultHeaders, withCredentials = false, fetch, showHistory = false, showGraph = false, fallbackToAvailableAssistants = false, autoRestoreLastSession = false, onInitError, client, legacyMode = false, }) => {
|
|
12
|
+
export const ChatProvider = ({ children, defaultAgent = "", apiUrl = "http://localhost:8123", defaultHeaders, withCredentials = false, fetch, showHistory = false, showGraph = false, fallbackToAvailableAssistants = false, autoRestoreLastSession = false, onInitError, client, legacyMode = false, historyFilter, }) => {
|
|
13
13
|
// 使用 useMemo 稳定 defaultHeaders 的引用
|
|
14
14
|
const stableHeaders = useMemo(() => defaultHeaders || {}, [defaultHeaders]);
|
|
15
15
|
// 使用 useRef 保存 onInitError 的最新引用
|
|
@@ -42,8 +42,9 @@ export const ChatProvider = ({ children, defaultAgent = "", apiUrl = "http://loc
|
|
|
42
42
|
showGraph,
|
|
43
43
|
fallbackToAvailableAssistants,
|
|
44
44
|
autoRestoreLastSession,
|
|
45
|
+
historyFilter,
|
|
45
46
|
});
|
|
46
|
-
}, [defaultAgent, apiUrl, stableHeaders, withCredentials, fetch, showHistory, showGraph, fallbackToAvailableAssistants, autoRestoreLastSession]);
|
|
47
|
+
}, [defaultAgent, apiUrl, stableHeaders, withCredentials, fetch, showHistory, showGraph, fallbackToAvailableAssistants, autoRestoreLastSession, client, legacyMode, historyFilter]);
|
|
47
48
|
const unionStore = useUnionStore(store, useStore);
|
|
48
49
|
// 使用 ref 标记是否已初始化
|
|
49
50
|
const initializedRef = useRef(false);
|
|
@@ -85,6 +85,8 @@ interface ChatProviderProps {
|
|
|
85
85
|
onInitError?: (error: any, currentAgent: string) => void;
|
|
86
86
|
client?: ILangGraphClient;
|
|
87
87
|
legacyMode?: boolean;
|
|
88
|
+
/** 历史记录筛选的默认参数 */
|
|
89
|
+
historyFilter?: import("../ui-store/createChatStore.js").HistoryFilter;
|
|
88
90
|
}
|
|
89
91
|
/**
|
|
90
92
|
* @zh UnionStore 类型用于合并 store 的 data 和 mutations,使其可以直接访问。
|
|
@@ -53,6 +53,7 @@ export const ChatProvider = (props) => {
|
|
|
53
53
|
showGraph: props.showGraph || false,
|
|
54
54
|
fallbackToAvailableAssistants: props.fallbackToAvailableAssistants || false,
|
|
55
55
|
autoRestoreLastSession: props.autoRestoreLastSession || false,
|
|
56
|
+
historyFilter: props.historyFilter,
|
|
56
57
|
});
|
|
57
58
|
});
|
|
58
59
|
const unionStore = useUnionStoreSolid(store(), useStore);
|
|
@@ -16,6 +16,8 @@ interface ChatStoreContext {
|
|
|
16
16
|
onInit?: (client: LangGraphClient) => void;
|
|
17
17
|
/** 初始化时是否自动激活最近的历史会话(默认 false,创建新会话) */
|
|
18
18
|
autoRestoreLastSession?: boolean;
|
|
19
|
+
/** 历史记录筛选的默认参数 */
|
|
20
|
+
historyFilter?: Partial<HistoryFilter>;
|
|
19
21
|
}
|
|
20
22
|
export interface HistoryPagination {
|
|
21
23
|
page: number;
|
|
@@ -76,13 +76,14 @@ export const createChatStore = (initClientName, config, context = {}) => {
|
|
|
76
76
|
pageSize: 10,
|
|
77
77
|
total: 0,
|
|
78
78
|
});
|
|
79
|
-
// 历史记录筛选状态
|
|
80
|
-
const
|
|
81
|
-
metadata: null,
|
|
82
|
-
status: null,
|
|
83
|
-
sortBy: "updated_at",
|
|
84
|
-
sortOrder: "desc",
|
|
85
|
-
}
|
|
79
|
+
// 历史记录筛选状态 - 使用 context 中的默认值
|
|
80
|
+
const defaultHistoryFilter = {
|
|
81
|
+
metadata: context.historyFilter?.metadata ?? null,
|
|
82
|
+
status: context.historyFilter?.status ?? null,
|
|
83
|
+
sortBy: context.historyFilter?.sortBy ?? "updated_at",
|
|
84
|
+
sortOrder: context.historyFilter?.sortOrder ?? "desc",
|
|
85
|
+
};
|
|
86
|
+
const historyFilter = atom(defaultHistoryFilter);
|
|
86
87
|
// ============ 内部状态 ============
|
|
87
88
|
let cleanupCurrentClient = null;
|
|
88
89
|
// ============ 计算属性 ============
|
|
@@ -513,10 +514,7 @@ export const createChatStore = (initClientName, config, context = {}) => {
|
|
|
513
514
|
},
|
|
514
515
|
resetHistoryFilter() {
|
|
515
516
|
historyFilter.set({
|
|
516
|
-
|
|
517
|
-
status: null,
|
|
518
|
-
sortBy: "updated_at",
|
|
519
|
-
sortOrder: "desc",
|
|
517
|
+
...defaultHistoryFilter,
|
|
520
518
|
});
|
|
521
519
|
historyPagination.set({
|
|
522
520
|
...historyPagination.get(),
|
|
@@ -39,6 +39,8 @@ export interface ChatProviderProps {
|
|
|
39
39
|
onInitError?: (error: any, currentAgent: string) => void;
|
|
40
40
|
client?: ILangGraphClient;
|
|
41
41
|
legacyMode?: boolean;
|
|
42
|
+
/** 历史记录筛选的默认参数 */
|
|
43
|
+
historyFilter?: import("../ui-store/createChatStore.js").HistoryFilter;
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
44
46
|
* @zh Chat Provider Hook,用于在 setup 中直接使用
|
|
@@ -156,6 +158,10 @@ export declare const ChatProvider: import("vue").DefineComponent<import("vue").E
|
|
|
156
158
|
type: PropType<(error: any, currentAgent: string) => void>;
|
|
157
159
|
default: undefined;
|
|
158
160
|
};
|
|
161
|
+
historyFilter: {
|
|
162
|
+
type: PropType<any>;
|
|
163
|
+
default: undefined;
|
|
164
|
+
};
|
|
159
165
|
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
160
166
|
[key: string]: any;
|
|
161
167
|
}>[] | undefined, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
@@ -195,11 +201,16 @@ export declare const ChatProvider: import("vue").DefineComponent<import("vue").E
|
|
|
195
201
|
type: PropType<(error: any, currentAgent: string) => void>;
|
|
196
202
|
default: undefined;
|
|
197
203
|
};
|
|
204
|
+
historyFilter: {
|
|
205
|
+
type: PropType<any>;
|
|
206
|
+
default: undefined;
|
|
207
|
+
};
|
|
198
208
|
}>> & Readonly<{}>, {
|
|
199
209
|
apiUrl: string;
|
|
200
210
|
defaultHeaders: Record<string, string>;
|
|
201
211
|
showGraph: boolean;
|
|
202
212
|
showHistory: boolean;
|
|
213
|
+
historyFilter: any;
|
|
203
214
|
defaultAgent: string;
|
|
204
215
|
withCredentials: boolean;
|
|
205
216
|
fetch: typeof fetch;
|
package/dist/vue/ChatContext.js
CHANGED
|
@@ -53,6 +53,7 @@ export const useChatProvider = (props) => {
|
|
|
53
53
|
showGraph: props.showGraph,
|
|
54
54
|
fallbackToAvailableAssistants: props.fallbackToAvailableAssistants,
|
|
55
55
|
autoRestoreLastSession: props.autoRestoreLastSession,
|
|
56
|
+
historyFilter: props.historyFilter,
|
|
56
57
|
});
|
|
57
58
|
const unionStore = useUnionStoreVue(store, useStore);
|
|
58
59
|
// 提供 store 给子组件
|
|
@@ -113,6 +114,10 @@ export const ChatProvider = defineComponent({
|
|
|
113
114
|
type: Function,
|
|
114
115
|
default: undefined,
|
|
115
116
|
},
|
|
117
|
+
historyFilter: {
|
|
118
|
+
type: Object,
|
|
119
|
+
default: undefined,
|
|
120
|
+
},
|
|
116
121
|
},
|
|
117
122
|
setup(props, { slots }) {
|
|
118
123
|
const { unionStore } = useChatProvider(props);
|
package/package.json
CHANGED
package/src/LangGraphClient.ts
CHANGED
|
@@ -40,6 +40,8 @@ export type RenderMessage = Message & {
|
|
|
40
40
|
unique_id?: string;
|
|
41
41
|
/** 工具调用是否完成 */
|
|
42
42
|
done?: boolean;
|
|
43
|
+
/** 标记工具消息的原始 ai 消息 */
|
|
44
|
+
source_ai_message_id?: string;
|
|
43
45
|
};
|
|
44
46
|
export type SendMessageOptions = {
|
|
45
47
|
extraParams?: Record<string, any>;
|
|
@@ -370,7 +372,7 @@ export class LangGraphClient<TStateType = unknown> extends EventEmitter<LangGrap
|
|
|
370
372
|
throw new Error("Thread or Assistant not initialized");
|
|
371
373
|
}
|
|
372
374
|
if (!this.currentThread) {
|
|
373
|
-
await this.createThread({
|
|
375
|
+
await this.createThread({
|
|
374
376
|
graphId: this.currentAssistant!.graph_id!,
|
|
375
377
|
metadata,
|
|
376
378
|
});
|
package/src/MessageProcessor.ts
CHANGED
|
@@ -184,6 +184,8 @@ export class MessageProcessor {
|
|
|
184
184
|
if (parentMessage) {
|
|
185
185
|
message.usage_metadata = parentMessage.usage_metadata;
|
|
186
186
|
message.node_name = parentMessage.name;
|
|
187
|
+
/** @ts-ignore 用于标记原始的 AI message 的id */
|
|
188
|
+
message.source_ai_message_id = parentMessage.id;
|
|
187
189
|
// 修补特殊情况下,tool name 丢失的问题
|
|
188
190
|
if (!message.name) {
|
|
189
191
|
message.name = (parentMessage as AIMessage).tool_calls!.find((i) => i.id === message.tool_call_id)?.name;
|
|
@@ -294,10 +296,11 @@ export class MessageProcessor {
|
|
|
294
296
|
const rootMessages: RenderMessage[] = [];
|
|
295
297
|
|
|
296
298
|
for (const message of messages) {
|
|
297
|
-
const
|
|
299
|
+
const sourceId = message.source_ai_message_id || message.id!;
|
|
300
|
+
const isRoot = !nonRootMessageId.has(sourceId!);
|
|
298
301
|
if (!isRoot) {
|
|
299
302
|
// 处理子消息
|
|
300
|
-
const parentId = parentPointer.get(
|
|
303
|
+
const parentId = parentPointer.get(sourceId)!;
|
|
301
304
|
const children = childrenMap.get(parentId);
|
|
302
305
|
if (children) {
|
|
303
306
|
children.push(message);
|
package/src/react/ChatContext.ts
CHANGED
|
@@ -29,6 +29,8 @@ interface ChatProviderProps {
|
|
|
29
29
|
onInitError?: (error: any, currentAgent: string) => void;
|
|
30
30
|
client?: ILangGraphClient;
|
|
31
31
|
legacyMode?: boolean;
|
|
32
|
+
/** 历史记录筛选的默认参数 */
|
|
33
|
+
historyFilter?: import("../ui-store/createChatStore.js").HistoryFilter;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
@@ -45,6 +47,7 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
|
45
47
|
onInitError,
|
|
46
48
|
client,
|
|
47
49
|
legacyMode = false,
|
|
50
|
+
historyFilter,
|
|
48
51
|
}) => {
|
|
49
52
|
// 使用 useMemo 稳定 defaultHeaders 的引用
|
|
50
53
|
const stableHeaders = useMemo(() => defaultHeaders || {}, [defaultHeaders]);
|
|
@@ -80,8 +83,9 @@ export const ChatProvider: React.FC<ChatProviderProps> = ({
|
|
|
80
83
|
showGraph,
|
|
81
84
|
fallbackToAvailableAssistants,
|
|
82
85
|
autoRestoreLastSession,
|
|
86
|
+
historyFilter,
|
|
83
87
|
});
|
|
84
|
-
}, [defaultAgent, apiUrl, stableHeaders, withCredentials, fetch, showHistory, showGraph, fallbackToAvailableAssistants, autoRestoreLastSession]);
|
|
88
|
+
}, [defaultAgent, apiUrl, stableHeaders, withCredentials, fetch, showHistory, showGraph, fallbackToAvailableAssistants, autoRestoreLastSession, client, legacyMode, historyFilter]);
|
|
85
89
|
|
|
86
90
|
const unionStore = useUnionStore(store, useStore);
|
|
87
91
|
|
package/src/solid/ChatContext.ts
CHANGED
|
@@ -29,6 +29,8 @@ interface ChatProviderProps {
|
|
|
29
29
|
onInitError?: (error: any, currentAgent: string) => void;
|
|
30
30
|
client?: ILangGraphClient;
|
|
31
31
|
legacyMode?: boolean;
|
|
32
|
+
/** 历史记录筛选的默认参数 */
|
|
33
|
+
historyFilter?: import("../ui-store/createChatStore.js").HistoryFilter;
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
36
|
* @zh UnionStore 类型用于合并 store 的 data 和 mutations,使其可以直接访问。
|
|
@@ -90,6 +92,7 @@ export const ChatProvider = (props: ChatProviderProps) => {
|
|
|
90
92
|
showGraph: props.showGraph || false,
|
|
91
93
|
fallbackToAvailableAssistants: props.fallbackToAvailableAssistants || false,
|
|
92
94
|
autoRestoreLastSession: props.autoRestoreLastSession || false,
|
|
95
|
+
historyFilter: props.historyFilter,
|
|
93
96
|
});
|
|
94
97
|
});
|
|
95
98
|
|
|
@@ -59,6 +59,8 @@ interface ChatStoreContext {
|
|
|
59
59
|
onInit?: (client: LangGraphClient) => void;
|
|
60
60
|
/** 初始化时是否自动激活最近的历史会话(默认 false,创建新会话) */
|
|
61
61
|
autoRestoreLastSession?: boolean;
|
|
62
|
+
/** 历史记录筛选的默认参数 */
|
|
63
|
+
historyFilter?: Partial<HistoryFilter>;
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
// 分页状态类型
|
|
@@ -113,13 +115,15 @@ export const createChatStore = (initClientName: string, config: Partial<LangGrap
|
|
|
113
115
|
total: 0,
|
|
114
116
|
});
|
|
115
117
|
|
|
116
|
-
// 历史记录筛选状态
|
|
117
|
-
const
|
|
118
|
-
metadata: null,
|
|
119
|
-
status: null,
|
|
120
|
-
sortBy: "updated_at",
|
|
121
|
-
sortOrder: "desc",
|
|
122
|
-
}
|
|
118
|
+
// 历史记录筛选状态 - 使用 context 中的默认值
|
|
119
|
+
const defaultHistoryFilter: HistoryFilter = {
|
|
120
|
+
metadata: context.historyFilter?.metadata ?? null,
|
|
121
|
+
status: context.historyFilter?.status ?? null,
|
|
122
|
+
sortBy: context.historyFilter?.sortBy ?? "updated_at",
|
|
123
|
+
sortOrder: context.historyFilter?.sortOrder ?? "desc",
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const historyFilter = atom<HistoryFilter>(defaultHistoryFilter);
|
|
123
127
|
|
|
124
128
|
// ============ 内部状态 ============
|
|
125
129
|
|
|
@@ -611,10 +615,7 @@ export const createChatStore = (initClientName: string, config: Partial<LangGrap
|
|
|
611
615
|
},
|
|
612
616
|
resetHistoryFilter() {
|
|
613
617
|
historyFilter.set({
|
|
614
|
-
|
|
615
|
-
status: null,
|
|
616
|
-
sortBy: "updated_at",
|
|
617
|
-
sortOrder: "desc",
|
|
618
|
+
...defaultHistoryFilter,
|
|
618
619
|
});
|
|
619
620
|
historyPagination.set({
|
|
620
621
|
...historyPagination.get(),
|
package/src/vue/ChatContext.ts
CHANGED
|
@@ -61,6 +61,8 @@ export interface ChatProviderProps {
|
|
|
61
61
|
onInitError?: (error: any, currentAgent: string) => void;
|
|
62
62
|
client?: ILangGraphClient;
|
|
63
63
|
legacyMode?: boolean;
|
|
64
|
+
/** 历史记录筛选的默认参数 */
|
|
65
|
+
historyFilter?: import("../ui-store/createChatStore.js").HistoryFilter;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
/**
|
|
@@ -93,6 +95,7 @@ export const useChatProvider = (props: ChatProviderProps) => {
|
|
|
93
95
|
showGraph: props.showGraph,
|
|
94
96
|
fallbackToAvailableAssistants: props.fallbackToAvailableAssistants,
|
|
95
97
|
autoRestoreLastSession: props.autoRestoreLastSession,
|
|
98
|
+
historyFilter: props.historyFilter,
|
|
96
99
|
}
|
|
97
100
|
);
|
|
98
101
|
|
|
@@ -159,6 +162,10 @@ export const ChatProvider = defineComponent({
|
|
|
159
162
|
type: Function as PropType<(error: any, currentAgent: string) => void>,
|
|
160
163
|
default: undefined,
|
|
161
164
|
},
|
|
165
|
+
historyFilter: {
|
|
166
|
+
type: Object as PropType<any>,
|
|
167
|
+
default: undefined,
|
|
168
|
+
},
|
|
162
169
|
},
|
|
163
170
|
setup(props, { slots }) {
|
|
164
171
|
const { unionStore } = useChatProvider(props);
|