@cloudbase/agent-adapter-langgraph 1.0.1-alpha.27 → 1.0.1-alpha.29

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.d.mts CHANGED
@@ -82,6 +82,12 @@ declare class LanggraphAgent extends AbstractAgent {
82
82
  }>;
83
83
  _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput): Promise<void>;
84
84
  clone(): LanggraphAgent;
85
+ /**
86
+ * Setup observability for agent execution.
87
+ * Lazy loads observability callback, restores server context from forwardedProps,
88
+ * and configures the callback for graph execution.
89
+ */
90
+ private setupObservability;
85
91
  }
86
92
 
87
93
  type PendingWrite = [string, any];
package/dist/index.d.ts CHANGED
@@ -82,6 +82,12 @@ declare class LanggraphAgent extends AbstractAgent {
82
82
  }>;
83
83
  _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput): Promise<void>;
84
84
  clone(): LanggraphAgent;
85
+ /**
86
+ * Setup observability for agent execution.
87
+ * Lazy loads observability callback, restores server context from forwardedProps,
88
+ * and configures the callback for graph execution.
89
+ */
90
+ private setupObservability;
85
91
  }
86
92
 
87
93
  type PendingWrite = [string, any];
package/dist/index.js CHANGED
@@ -120,46 +120,7 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
120
120
  const { messages, runId, threadId } = input;
121
121
  const logger = this.logger.child?.({ runId, threadId }) ?? this.logger;
122
122
  logger.info?.("Run started");
123
- if (!LangChainCallbackHandler) {
124
- try {
125
- logger.debug?.("Attempting to load observability...");
126
- const obsModule = await import("@cloudbase/agent-observability/langchain");
127
- LangChainCallbackHandler = obsModule.CallbackHandler;
128
- logger.debug?.("\u2713 Observability handler loaded");
129
- } catch (e) {
130
- logger.debug?.(
131
- "\u2717 Observability not available:",
132
- e instanceof Error ? e.message : String(e)
133
- );
134
- }
135
- }
136
- this.observabilityCallback = LangChainCallbackHandler ? new LangChainCallbackHandler({
137
- adapterName: this.adapterName,
138
- logger
139
- }) : void 0;
140
- if (this.observabilityCallback && input.forwardedProps?.__agui_server_context) {
141
- try {
142
- const serverContextData = input.forwardedProps.__agui_server_context;
143
- const serverSpanContext = {
144
- traceId: serverContextData.traceId,
145
- spanId: serverContextData.spanId,
146
- traceFlags: serverContextData.traceFlags,
147
- isRemote: false
148
- };
149
- this.observabilityCallback.setExternalParentContext(serverSpanContext, {
150
- threadId: input.threadId,
151
- runId: input.runId
152
- });
153
- logger.debug?.("\u2713 Server context restored:", {
154
- traceId: serverSpanContext.traceId,
155
- spanId: serverSpanContext.spanId,
156
- threadId: input.threadId,
157
- runId: input.runId
158
- });
159
- } catch (e) {
160
- logger.debug?.("Failed to restore server context:", e);
161
- }
162
- }
123
+ await this.setupObservability(input, logger);
163
124
  const runStartedEvent = {
164
125
  type: import_client.EventType.RUN_STARTED,
165
126
  threadId,
@@ -178,7 +139,7 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
178
139
  "Preparing stream input"
179
140
  );
180
141
  logger.trace?.({ messages, tools: input.tools }, "Full input messages");
181
- const langChainMessages = aguiMessagesToLangChain(messages);
142
+ const langChainMessages = aguiMessagesToLangChain(messages, logger);
182
143
  logger.trace?.(
183
144
  {
184
145
  langChainMessages,
@@ -585,8 +546,55 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
585
546
  cloned.logger = logger;
586
547
  return cloned;
587
548
  }
549
+ /**
550
+ * Setup observability for agent execution.
551
+ * Lazy loads observability callback, restores server context from forwardedProps,
552
+ * and configures the callback for graph execution.
553
+ */
554
+ async setupObservability(input, logger) {
555
+ if (!LangChainCallbackHandler) {
556
+ try {
557
+ logger.debug?.("Attempting to load observability...");
558
+ const obsModule = await import("@cloudbase/agent-observability/langchain");
559
+ LangChainCallbackHandler = obsModule.CallbackHandler;
560
+ logger.debug?.("\u2713 Observability handler loaded");
561
+ } catch (e) {
562
+ logger.debug?.(
563
+ "\u2717 Observability not available:",
564
+ e instanceof Error ? e.message : String(e)
565
+ );
566
+ }
567
+ }
568
+ this.observabilityCallback = LangChainCallbackHandler ? new LangChainCallbackHandler({
569
+ adapterName: this.adapterName,
570
+ logger
571
+ }) : void 0;
572
+ if (this.observabilityCallback && input.forwardedProps?.__agui_server_context) {
573
+ try {
574
+ const serverContextData = input.forwardedProps.__agui_server_context;
575
+ const serverSpanContext = {
576
+ traceId: serverContextData.traceId,
577
+ spanId: serverContextData.spanId,
578
+ traceFlags: serverContextData.traceFlags,
579
+ isRemote: true
580
+ };
581
+ this.observabilityCallback.setExternalParentContext(serverSpanContext, {
582
+ threadId: input.threadId,
583
+ runId: input.runId
584
+ });
585
+ logger.debug?.("\u2713 Server context restored:", {
586
+ traceId: serverSpanContext.traceId,
587
+ spanId: serverSpanContext.spanId,
588
+ threadId: input.threadId,
589
+ runId: input.runId
590
+ });
591
+ } catch (e) {
592
+ logger.debug?.("Failed to restore server context:", e);
593
+ }
594
+ }
595
+ }
588
596
  };
589
- function aguiMessagesToLangChain(messages) {
597
+ function aguiMessagesToLangChain(messages, logger) {
590
598
  return messages.map((message) => {
591
599
  switch (message.role) {
592
600
  case "user":
@@ -598,10 +606,34 @@ function aguiMessagesToLangChain(messages) {
598
606
  type: "human"
599
607
  };
600
608
  } else {
609
+ const langChainContent = [];
610
+ for (const part of message.content) {
611
+ if (part.type === "text") {
612
+ langChainContent.push({ type: "text", text: part.text });
613
+ } else if (part.type === "binary") {
614
+ const imageUrl = convertBinaryToImageUrl(
615
+ part,
616
+ message.id,
617
+ logger
618
+ );
619
+ if (imageUrl) {
620
+ langChainContent.push({
621
+ type: "image_url",
622
+ image_url: { url: imageUrl }
623
+ });
624
+ }
625
+ }
626
+ }
627
+ if (langChainContent.length === 0) {
628
+ logger?.warn?.(
629
+ { messageId: message.id },
630
+ "User message content array resulted in empty LangChain content"
631
+ );
632
+ }
601
633
  return {
602
634
  id: message.id,
603
635
  role: message.role,
604
- content: message.content.filter((m) => m.type === "text"),
636
+ content: langChainContent,
605
637
  type: "human"
606
638
  };
607
639
  }
@@ -646,6 +678,22 @@ function isValidJson(json) {
646
678
  return false;
647
679
  }
648
680
  }
681
+ function convertBinaryToImageUrl(part, messageId, logger) {
682
+ if (!part.mimeType.startsWith("image/")) {
683
+ logger?.debug?.(
684
+ { mimeType: part.mimeType, messageId },
685
+ "Skipping non-image binary content"
686
+ );
687
+ return void 0;
688
+ }
689
+ if (part.url) {
690
+ return part.url;
691
+ }
692
+ if (part.data) {
693
+ return `data:${part.mimeType};base64,${part.data}`;
694
+ }
695
+ return void 0;
696
+ }
649
697
 
650
698
  // src/checkpoint.ts
651
699
  var import_langgraph2 = require("@langchain/langgraph");