@langchain/langgraph-api 0.0.51 → 0.0.52

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @langchain/langgraph-api
2
2
 
3
+ ## 0.0.52
4
+
5
+ ### Patch Changes
6
+
7
+ - 030698f: feat(api): add support for injecting `langgraph_node` in structured logs, expose structlog
8
+ - @langchain/langgraph-ui@0.0.52
9
+
3
10
  ## 0.0.51
4
11
 
5
12
  ### Patch Changes
@@ -1,5 +1,8 @@
1
+ import { type Logger } from "winston";
1
2
  import type { MiddlewareHandler } from "hono";
2
- export declare const logger: import("winston").Logger;
3
+ export declare const logger: Logger;
4
+ export declare function registerSdkLogger(): void;
5
+ export declare function registerRuntimeLogFormatter(formatter: (info: Record<string, unknown>) => Record<string, unknown>): Promise<void>;
3
6
  export declare const logError: (error: unknown, options?: {
4
7
  context?: Record<string, unknown>;
5
8
  prefix?: string;
package/dist/logging.mjs CHANGED
@@ -7,9 +7,15 @@ import { codeFrameColumns } from "@babel/code-frame";
7
7
  import path from "node:path";
8
8
  const LOG_JSON = process.env.LOG_JSON === "true";
9
9
  const LOG_LEVEL = process.env.LOG_LEVEL || "debug";
10
+ let RUNTIME_LOG_FORMATTER;
11
+ const applyRuntimeFormatter = format((info) => {
12
+ if (!RUNTIME_LOG_FORMATTER)
13
+ return info;
14
+ return RUNTIME_LOG_FORMATTER(info);
15
+ });
10
16
  export const logger = createLogger({
11
17
  level: LOG_LEVEL,
12
- format: format.combine(format.errors({ stack: true }), format.timestamp(), format.json(), ...(!LOG_JSON
18
+ format: format.combine(applyRuntimeFormatter(), format.errors({ stack: true }), format.timestamp(), format.json(), ...(!LOG_JSON
13
19
  ? [
14
20
  format.colorize({ all: true }),
15
21
  format.padLevels(),
@@ -44,6 +50,15 @@ export const logger = createLogger({
44
50
  ])),
45
51
  transports: [new transports.Console()],
46
52
  });
53
+ // Expose the logger to be consumed by `getLogger`
54
+ export function registerSdkLogger() {
55
+ const GLOBAL_LOGGER = Symbol.for("langgraph.api.sdk-logger");
56
+ const maybeGlobal = globalThis;
57
+ maybeGlobal[GLOBAL_LOGGER] = logger;
58
+ }
59
+ export async function registerRuntimeLogFormatter(formatter) {
60
+ RUNTIME_LOG_FORMATTER = formatter;
61
+ }
47
62
  const formatStack = (stack) => {
48
63
  if (!stack)
49
64
  return stack;
package/dist/server.mjs CHANGED
@@ -10,7 +10,7 @@ import { truncate, conn as opsConn } from "./storage/ops.mjs";
10
10
  import { zValidator } from "@hono/zod-validator";
11
11
  import { z } from "zod";
12
12
  import { queue } from "./queue.mjs";
13
- import { logger, requestLogger } from "./logging.mjs";
13
+ import { logger, requestLogger, registerRuntimeLogFormatter, registerSdkLogger, } from "./logging.mjs";
14
14
  import { checkpointer } from "./storage/checkpoint.mjs";
15
15
  import { store as graphStore } from "./storage/store.mjs";
16
16
  import { auth } from "./auth/custom.mjs";
@@ -74,8 +74,23 @@ export async function startServer(options) {
74
74
  logger.info(`Flushing to persistent storage, exiting...`);
75
75
  await Promise.all(callbacks.map((c) => c.flush()));
76
76
  };
77
+ // Register global logger that can be consumed via SDK
78
+ // We need to do this before we load the graphs in-case the logger is obtained at top-level.
79
+ registerSdkLogger();
77
80
  logger.info(`Registering graphs from ${options.cwd}`);
78
81
  await registerFromEnv(options.graphs, { cwd: options.cwd });
82
+ // Make sure to register the runtime formatter after we've loaded the graphs
83
+ // to ensure that we're not loading `@langchain/langgraph` from different path.
84
+ const { getConfig } = await import("@langchain/langgraph");
85
+ registerRuntimeLogFormatter((info) => {
86
+ const config = getConfig();
87
+ if (config == null)
88
+ return info;
89
+ const node = config.metadata?.["langgraph_node"];
90
+ if (node != null)
91
+ info.langgraph_node = node;
92
+ return info;
93
+ });
79
94
  const app = new Hono();
80
95
  // Loopback fetch used by webhooks and custom routes
81
96
  bindLoopbackFetch(app);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/langgraph-api",
3
- "version": "0.0.51",
3
+ "version": "0.0.52",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": "^18.19.0 || >=20.16.0"
@@ -52,7 +52,7 @@
52
52
  "@babel/code-frame": "^7.26.2",
53
53
  "@hono/node-server": "^1.12.0",
54
54
  "@hono/zod-validator": "^0.2.2",
55
- "@langchain/langgraph-ui": "0.0.51",
55
+ "@langchain/langgraph-ui": "0.0.52",
56
56
  "@types/json-schema": "^7.0.15",
57
57
  "@typescript/vfs": "^1.6.0",
58
58
  "dedent": "^1.5.3",
@@ -86,7 +86,7 @@
86
86
  "@langchain/core": "^0.3.59",
87
87
  "@langchain/langgraph": "0.3.11",
88
88
  "@langchain/langgraph-checkpoint": "0.0.18",
89
- "@langchain/langgraph-sdk": "0.0.101",
89
+ "@langchain/langgraph-sdk": "0.0.102",
90
90
  "@types/babel__code-frame": "^7.0.6",
91
91
  "@types/node": "^18.15.11",
92
92
  "@types/react": "^19.0.8",