@langgraph-js/pure-graph 2.7.2 → 2.7.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/index.js CHANGED
@@ -2,6 +2,7 @@ export { A as AssistantEndpoint, c as createEndpoint } from './createEndpoint-BE
2
2
  export { L as LangGraphGlobal, r as registerGraph } from './stream-Blquv56P.js';
3
3
  import { StateGraph, entrypoint, getPreviousState, getConfig } from '@langchain/langgraph';
4
4
  import { schemaMetaRegistry } from '@langchain/langgraph/zod';
5
+ import { getDefaultsForSchema } from 'zod-defaults';
5
6
 
6
7
  const createEntrypointGraph = ({
7
8
  stateSchema,
@@ -18,7 +19,7 @@ const createEntrypointGraph = ({
18
19
 
19
20
  const composeWithState = (oldState, newState, stateSchema) => {
20
21
  const channels = schemaMetaRegistry.getChannelsForSchema(stateSchema);
21
- const previewState = stateSchema.parse(oldState || {});
22
+ const previewState = stateSchema.parse(oldState || getDefaultsForSchema(stateSchema));
22
23
  const mergedState = { ...previewState };
23
24
  for (const [channelName, _] of Object.entries(channels)) {
24
25
  const currentValue = previewState[channelName];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/createEntrypointGraph.ts","../src/utils/createStateEntrypoint.ts"],"sourcesContent":["import { InteropZodObject } from '@langchain/core/utils/types';\nimport { BaseCheckpointSaver, CompiledStateGraph, Pregel, StateDefinition, StateGraph } from '@langchain/langgraph';\nexport const createEntrypointGraph = <S extends InteropZodObject, C extends InteropZodObject>({\n stateSchema,\n config,\n graph,\n checkpointer,\n}: {\n stateSchema: S;\n config?: C;\n graph: Pregel<any, any>;\n checkpointer?: BaseCheckpointSaver;\n}): CompiledStateGraph<\n {},\n {},\n string,\n StateDefinition,\n StateDefinition,\n StateDefinition,\n {\n [x: string]: any;\n },\n unknown,\n unknown\n> => {\n const name = graph.getName();\n /** @ts-ignore */\n return new StateGraph(stateSchema, config)\n .addNode(name, (state, config) => graph.invoke(state, config))\n .addEdge('__start__', name)\n .addEdge(name, '__end__')\n .compile({\n name,\n checkpointer,\n });\n};\n","import {\n CompiledGraph,\n entrypoint,\n EntrypointOptions,\n getConfig,\n getPreviousState,\n LangGraphRunnableConfig,\n} from '@langchain/langgraph';\nimport { schemaMetaRegistry } from '@langchain/langgraph/zod';\nimport z from 'zod';\n\nconst composeWithState = <T>(oldState: T, newState: T, stateSchema: any) => {\n const channels = schemaMetaRegistry.getChannelsForSchema(stateSchema);\n\n const previewState = stateSchema.parse(oldState || {});\n // 使用 channels 的 reducer 来合并 state\n const mergedState = { ...previewState };\n for (const [channelName, _] of Object.entries(channels)) {\n const currentValue = (previewState as any)[channelName];\n const newValue = (newState as any)[channelName];\n\n // 只有当 update 中包含该 channel 的值时才处理\n if (newValue !== undefined) {\n let reducer;\n // 尝试从 schema 中查找 reducer\n // 需要解包 ZodDefault, ZodOptional 等包装器\n let currentSchema = stateSchema.shape[channelName];\n while (currentSchema) {\n const meta = schemaMetaRegistry.get(currentSchema);\n if (meta?.reducer?.fn) {\n reducer = meta.reducer.fn;\n break;\n }\n if (currentSchema._def?.innerType) {\n currentSchema = currentSchema._def.innerType;\n } else if (currentSchema._def?.schema) {\n currentSchema = currentSchema._def.schema;\n } else {\n break;\n }\n }\n\n if (reducer && typeof reducer === 'function') {\n // 使用 reducer 函数合并值\n (mergedState as any)[channelName] = reducer(currentValue, newValue);\n } else {\n // 如果没有 reducer,直接使用新值覆盖\n (mergedState as any)[channelName] = newValue;\n }\n }\n }\n\n return mergedState;\n};\nexport const createStateEntrypoint = <ZType extends z.ZodType>(\n options: EntrypointOptions & { stateSchema: ZType },\n mainLogic: (state: z.infer<ZType>, config: LangGraphRunnableConfig) => Promise<any>,\n): CompiledGraph<any, any, any, any, any, any, any, any, any> => {\n const res = entrypoint(options, async (state, ...args) => {\n state = composeWithState(getPreviousState<ZType>(), state, options.stateSchema);\n // 更新 state 并保证 state 被推送\n getConfig()?.configurable?.__pregel_stream?.push([[], 'values', state]);\n const newState = await mainLogic(state as z.infer<ZType>, ...args);\n return entrypoint.final({\n value: newState,\n save: newState,\n });\n });\n // entrypoint 的 state 更新逻辑不一样\n const updateState = res.updateState;\n res.updateState = async function (config: any, state: any, ...args) {\n state = composeWithState((await res.getState(config)).values, state, options.stateSchema);\n return updateState.bind(this)(config, state, ...args);\n };\n return res as any;\n};\n"],"names":["config"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/createEntrypointGraph.ts","../src/utils/createStateEntrypoint.ts"],"sourcesContent":["import { InteropZodObject } from '@langchain/core/utils/types';\nimport { BaseCheckpointSaver, CompiledStateGraph, Pregel, StateDefinition, StateGraph } from '@langchain/langgraph';\nexport const createEntrypointGraph = <S extends InteropZodObject, C extends InteropZodObject>({\n stateSchema,\n config,\n graph,\n checkpointer,\n}: {\n stateSchema: S;\n config?: C;\n graph: Pregel<any, any>;\n checkpointer?: BaseCheckpointSaver;\n}): CompiledStateGraph<\n {},\n {},\n string,\n StateDefinition,\n StateDefinition,\n StateDefinition,\n {\n [x: string]: any;\n },\n unknown,\n unknown\n> => {\n const name = graph.getName();\n /** @ts-ignore */\n return new StateGraph(stateSchema, config)\n .addNode(name, (state, config) => graph.invoke(state, config))\n .addEdge('__start__', name)\n .addEdge(name, '__end__')\n .compile({\n name,\n checkpointer,\n });\n};\n","import {\n CompiledGraph,\n entrypoint,\n EntrypointOptions,\n getConfig,\n getPreviousState,\n LangGraphRunnableConfig,\n} from '@langchain/langgraph';\nimport { schemaMetaRegistry } from '@langchain/langgraph/zod';\nimport z from 'zod';\nimport { getDefaultsForSchema } from 'zod-defaults';\nconst composeWithState = <T>(oldState: T, newState: T, stateSchema: any) => {\n const channels = schemaMetaRegistry.getChannelsForSchema(stateSchema);\n\n const previewState = stateSchema.parse(oldState || getDefaultsForSchema(stateSchema));\n // 使用 channels 的 reducer 来合并 state\n const mergedState = { ...previewState };\n for (const [channelName, _] of Object.entries(channels)) {\n const currentValue = (previewState as any)[channelName];\n const newValue = (newState as any)[channelName];\n\n // 只有当 update 中包含该 channel 的值时才处理\n if (newValue !== undefined) {\n let reducer;\n // 尝试从 schema 中查找 reducer\n // 需要解包 ZodDefault, ZodOptional 等包装器\n let currentSchema = stateSchema.shape[channelName];\n while (currentSchema) {\n const meta = schemaMetaRegistry.get(currentSchema);\n if (meta?.reducer?.fn) {\n reducer = meta.reducer.fn;\n break;\n }\n if (currentSchema._def?.innerType) {\n currentSchema = currentSchema._def.innerType;\n } else if (currentSchema._def?.schema) {\n currentSchema = currentSchema._def.schema;\n } else {\n break;\n }\n }\n\n if (reducer && typeof reducer === 'function') {\n // 使用 reducer 函数合并值\n (mergedState as any)[channelName] = reducer(currentValue, newValue);\n } else {\n // 如果没有 reducer,直接使用新值覆盖\n (mergedState as any)[channelName] = newValue;\n }\n }\n }\n\n return mergedState;\n};\nexport const createStateEntrypoint = <ZType extends z.ZodType>(\n options: EntrypointOptions & { stateSchema: ZType },\n mainLogic: (state: z.infer<ZType>, config: LangGraphRunnableConfig) => Promise<any>,\n): CompiledGraph<any, any, any, any, any, any, any, any, any> => {\n const res = entrypoint(options, async (state, ...args) => {\n state = composeWithState(getPreviousState<ZType>(), state, options.stateSchema);\n // 更新 state 并保证 state 被推送\n getConfig()?.configurable?.__pregel_stream?.push([[], 'values', state]);\n const newState = await mainLogic(state as z.infer<ZType>, ...args);\n return entrypoint.final({\n value: newState,\n save: newState,\n });\n });\n // entrypoint 的 state 更新逻辑不一样\n const updateState = res.updateState;\n res.updateState = async function (config: any, state: any, ...args) {\n state = composeWithState((await res.getState(config)).values, state, options.stateSchema);\n return updateState.bind(this)(config, state, ...args);\n };\n return res as any;\n};\n"],"names":["config"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langgraph-js/pure-graph",
3
- "version": "2.7.2",
3
+ "version": "2.7.3",
4
4
  "description": "A library that provides a standard LangGraph endpoint for integrating into various frameworks like Next.js and Hono.js, with support for multiple storage backends (SQLite, PostgreSQL, Redis) and message queues.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -46,15 +46,16 @@
46
46
  "eventemitter3": "^5.0.1",
47
47
  "kysely": "^0.28.8",
48
48
  "langchain": "^1.0.6",
49
- "zod": "^4"
49
+ "zod": "^4",
50
+ "zod-defaults": "^0.2.3"
50
51
  },
51
52
  "optionalDependencies": {
52
- "kysely-wasm": "^1.2.1",
53
53
  "@hono/zod-validator": "^0.7.3",
54
54
  "@langchain/langgraph-checkpoint-postgres": "^1.0.0",
55
55
  "@langchain/langgraph-checkpoint-redis": "^1.0.0",
56
56
  "hono": "^4.9.9",
57
57
  "kysely-bun-worker": "^1.2.1",
58
+ "kysely-wasm": "^1.2.1",
58
59
  "node-sqlite3-wasm": "^0.8.51",
59
60
  "pg": "^8.16.3",
60
61
  "redis": "^5.8.3"