@ag-ui/langgraph 0.0.18-alpha.0 → 0.0.18
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 +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ThinkingTextMessageStartEvent, ThinkingTextMessageContentEvent, ThinkingTextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ThinkingStartEvent, ThinkingEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput as RunAgentInput$1, HttpAgent } from '@ag-ui/client';
|
|
1
|
+
import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ThinkingTextMessageStartEvent, ThinkingTextMessageContentEvent, ThinkingTextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolCallResultEvent, ThinkingStartEvent, ThinkingEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput as RunAgentInput$1, HttpAgent } from '@ag-ui/client';
|
|
2
2
|
import * as _langchain_langgraph_sdk_dist_types_stream from '@langchain/langgraph-sdk/dist/types.stream';
|
|
3
3
|
import * as _langchain_langgraph_sdk from '@langchain/langgraph-sdk';
|
|
4
4
|
import { Message, AssistantGraph, Client, Config, Assistant, StreamMode, ThreadState, Thread } from '@langchain/langgraph-sdk';
|
|
@@ -102,7 +102,7 @@ interface LangGraphReasoning {
|
|
|
102
102
|
index: number;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ThinkingTextMessageStartEvent | ThinkingTextMessageContentEvent | ThinkingTextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | ThinkingStartEvent | ThinkingEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
|
|
105
|
+
type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ThinkingTextMessageStartEvent | ThinkingTextMessageContentEvent | ThinkingTextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | ToolCallResultEvent | ThinkingStartEvent | ThinkingEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
|
|
106
106
|
type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = StreamMode, TSubgraphs extends boolean = false> = Omit<RunAgentInput$1, "forwardedProps"> & {
|
|
107
107
|
forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, "input"> & {
|
|
108
108
|
nodeName?: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ThinkingTextMessageStartEvent, ThinkingTextMessageContentEvent, ThinkingTextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ThinkingStartEvent, ThinkingEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput as RunAgentInput$1, HttpAgent } from '@ag-ui/client';
|
|
1
|
+
import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ThinkingTextMessageStartEvent, ThinkingTextMessageContentEvent, ThinkingTextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolCallResultEvent, ThinkingStartEvent, ThinkingEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput as RunAgentInput$1, HttpAgent } from '@ag-ui/client';
|
|
2
2
|
import * as _langchain_langgraph_sdk_dist_types_stream from '@langchain/langgraph-sdk/dist/types.stream';
|
|
3
3
|
import * as _langchain_langgraph_sdk from '@langchain/langgraph-sdk';
|
|
4
4
|
import { Message, AssistantGraph, Client, Config, Assistant, StreamMode, ThreadState, Thread } from '@langchain/langgraph-sdk';
|
|
@@ -102,7 +102,7 @@ interface LangGraphReasoning {
|
|
|
102
102
|
index: number;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ThinkingTextMessageStartEvent | ThinkingTextMessageContentEvent | ThinkingTextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | ThinkingStartEvent | ThinkingEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
|
|
105
|
+
type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ThinkingTextMessageStartEvent | ThinkingTextMessageContentEvent | ThinkingTextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | ToolCallResultEvent | ThinkingStartEvent | ThinkingEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
|
|
106
106
|
type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = StreamMode, TSubgraphs extends boolean = false> = Omit<RunAgentInput$1, "forwardedProps"> & {
|
|
107
107
|
forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, "input"> & {
|
|
108
108
|
nodeName?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";var J=Object.defineProperty,mt=Object.defineProperties,Et=Object.getOwnPropertyDescriptor,St=Object.getOwnPropertyDescriptors,ft=Object.getOwnPropertyNames,B=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,at=Object.prototype.propertyIsEnumerable;var et=(n,a)=>(a=Symbol[n])?a:Symbol.for("Symbol."+n);var st=(n,a,t)=>a in n?J(n,a,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[a]=t,p=(n,a)=>{for(var t in a||(a={}))$.call(a,t)&&st(n,t,a[t]);if(B)for(var t of B(a))at.call(a,t)&&st(n,t,a[t]);return n},f=(n,a)=>mt(n,St(a));var nt=(n,a)=>{var t={};for(var e in n)$.call(n,e)&&a.indexOf(e)<0&&(t[e]=n[e]);if(n!=null&&B)for(var e of B(n))a.indexOf(e)<0&&at.call(n,e)&&(t[e]=n[e]);return t};var vt=(n,a)=>{for(var t in a)J(n,t,{get:a[t],enumerable:!0})},yt=(n,a,t,e)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of ft(a))!$.call(n,s)&&s!==t&&J(n,s,{get:()=>a[s],enumerable:!(e=Et(a,s))||e.enumerable});return n};var Tt=n=>yt(J({},"__esModule",{value:!0}),n);var it=(n,a,t)=>(a=n[et("asyncIterator")])?a.call(n):(n=n[et("iterator")](),a={},t=(e,s)=>(s=n[e])&&(a[e]=o=>new Promise((r,g,d)=>(o=s.call(n,o),d=o.done,Promise.resolve(o.value).then(h=>r({value:h,done:d}),g)))),t("next"),t("return"),a);var _t={};vt(_t,{CustomEventNames:()=>ot,LangGraphAgent:()=>z,LangGraphEventTypes:()=>rt,LangGraphHttpAgent:()=>Q});module.exports=Tt(_t);var ut=require("@ag-ui/client");var gt=require("rxjs"),ct=require("@langchain/langgraph-sdk"),q=require("crypto");var rt=(c=>(c.OnChainStart="on_chain_start",c.OnChainStream="on_chain_stream",c.OnChainEnd="on_chain_end",c.OnChatModelStart="on_chat_model_start",c.OnChatModelStream="on_chat_model_stream",c.OnChatModelEnd="on_chat_model_end",c.OnToolStart="on_tool_start",c.OnToolEnd="on_tool_end",c.OnCustomEvent="on_custom_event",c.OnInterrupt="on_interrupt",c))(rt||{}),ot=(s=>(s.ManuallyEmitMessage="manually_emit_message",s.ManuallyEmitToolCall="manually_emit_tool_call",s.ManuallyEmitState="manually_emit_state",s.Exit="exit",s))(ot||{});var l=require("@ag-ui/client");var V=["messages","tools"];function j(n,a){return Object.fromEntries(Object.entries(n).filter(([t])=>a.includes(t)))}function lt({mode:n,state:a,schemaKeys:t}){let e=n==="start"?a:null;return e&&(t!=null&&t.input)&&(e=j(e,[...V,...t.input])),e}function ht(n){return n.map(a=>{var t;switch(a.type){case"human":return{id:a.id,role:"user",content:W(L(a.content))};case"ai":let e=L(a.content);return{id:a.id,role:"assistant",content:e?W(e):"",toolCalls:(t=a.tool_calls)==null?void 0:t.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:a.id,role:"system",content:W(L(a.content))};case"tool":return{id:a.id,role:"tool",content:W(L(a.content)),toolCallId:a.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function Y(n){return n.map((a,t)=>{var e,s;switch(a.role){case"user":return{id:a.id,role:a.role,content:a.content,type:"human"};case"assistant":return{id:a.id,type:"ai",role:a.role,content:(e=a.content)!=null?e:"",tool_calls:((s=a.toolCalls)!=null?s:[]).map(o=>({id:o.id,name:o.function.name,args:JSON.parse(o.function.arguments),type:"tool_call"}))};case"system":return{id:a.id,role:a.role,content:a.content,type:"system"};case"tool":return{content:a.content,role:a.role,type:a.role,tool_call_id:a.toolCallId,id:a.id};default:throw console.error(`Message role ${a.role} is not implemented`),new Error("message role is not supported.")}})}function W(n){return typeof n=="string"?n:JSON.stringify(n)}function dt(n){var t,e,s,o,r;let a=(t=n.chunk)==null?void 0:t.content;if(a&&Array.isArray(a)&&a.length&&a[0])return a[0].thinking?{text:a[0].thinking,type:"text",index:a[0].index}:null;if((o=(s=(e=n.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:s.summary)!=null&&o[0]){let g=(r=n.chunk.additional_kwargs)==null?void 0:r.reasoning.summary[0];return!g||!g.text?null:{type:"text",text:g.text,index:g.index}}return null}function L(n){var a;if(!n)return null;if(typeof n=="string")return n;if(Array.isArray(n)&&n.length){let t=(a=n.find(e=>e.type==="text"))==null?void 0:a.text;return t!=null?t:null}return null}var z=class n extends l.AbstractAgent{constructor(t){var e,s;super(t);this.constantSchemaKeys=V;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(s=t==null?void 0:t.client)!=null?s:new ct.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:p({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new n(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new gt.Observable(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var g,d,h;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let s=(g=t.threadId)!=null?g:(0,q.randomUUID)(),o=(h=(d=t.forwardedProps)==null?void 0:d.streamMode)!=null?h:["events","values","updates"],r=await this.prepareStream(f(p({},t),{threadId:s}),o);if(!r)return e.error("No stream to regenerate");await this.handleStreamEvents(r,s,e,t,Array.isArray(o)?o:[o])}async prepareRegenerateStream(t,e){var h,c,i;let{threadId:s,messageCheckpoint:o}=t,r=await this.getCheckpointByMessage(o.id,s);if(this.assistant||(this.assistant=await this.getAssistant()),!r)return this.subscriber.error("No checkpoint found for message");let g=await this.client.threads.updateState(s,{values:this.langGraphDefaultMergeState(r.values,[],t),checkpointId:r.checkpoint.checkpoint_id,asNode:(c=(h=r.next)==null?void 0:h[0])!=null?c:"__start__"}),d=f(p({},(i=t.forwardedProps)!=null?i:{}),{input:this.langGraphDefaultMergeState(r.values,[o],t),checkpointId:g.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(s,this.assistant.assistant_id,d),state:r,streamMode:e}}async prepareStream(t,e){var G,b,D,A,P,F,X,K,E,H;let{threadId:s,state:o,messages:r,tools:g,context:d,forwardedProps:h}=t;this.activeRun.manuallyEmittedState=null;let c=h==null?void 0:h.nodeName,i=s!=null?s:(0,q.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let m=await this.getOrCreateThread(i,h==null?void 0:h.threadMetadata);this.activeRun.threadId=m.thread_id;let u=(G=await this.client.threads.getState(m.thread_id))!=null?G:{values:{}},v=(b=u.values.messages)!=null?b:[],C=Y(r),T=this.langGraphDefaultMergeState(f(p({},o),{messages:v}),C,t),_=f(p({},u),{values:f(p({},T),{messages:[...v,...(D=T.messages)!=null?D:[]]})}),x=_.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((A=u.values.messages)!=null?A:[]).length>r.filter(S=>S.role!=="system").length){let S=null;for(let y=r.length-1;y>=0;y--)if(r[y].role==="user"){S=Y([r[y]])[0];break}return S?this.prepareRegenerateStream(f(p({},t),{messageCheckpoint:S}),e):this.subscriber.error("No user message found in messages to regenerate")}this.activeRun.graphInfo=await this.client.assistants.getGraph(this.assistant.assistant_id);let M=!((P=h==null?void 0:h.command)!=null&&P.resume)&&i&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(M==="continue"){let S=this.activeRun.graphInfo.edges.find(y=>y.target===this.activeRun.nodeName);await this.client.threads.updateState(i,{values:o,asNode:S==null?void 0:S.source})}let k=lt({mode:M,state:x,schemaKeys:this.activeRun.schemaKeys}),N,I=[this.assistantConfig,h==null?void 0:h.config].filter(Boolean);I.length&&(N=await this.mergeConfigs({configs:I,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let R=f(p({},h),{streamMode:e,input:k,config:N,context:p(p({},d),(F=N==null?void 0:N.configurable)!=null?F:{})}),O=(E=(K=(X=u.tasks)==null?void 0:X[0])==null?void 0:K.interrupts)!=null?E:[];return O!=null&&O.length&&!((H=h==null?void 0:h.command)!=null&&H.resume)?(this.dispatchEvent({type:l.EventType.RUN_STARTED,threadId:i,runId:t.runId}),this.handleNodeChange(c),O.forEach(S=>{this.dispatchEvent({type:l.EventType.CUSTOM,name:"on_interrupt",value:typeof S.value=="string"?S.value:JSON.stringify(S.value),rawEvent:S})}),this.dispatchEvent({type:l.EventType.RUN_FINISHED,threadId:i,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(i,this.assistant.assistant_id,R),state:_}}async handleStreamEvents(t,e,s,o,r){var v,C,T,_,I,R,O,G,b,D;let{forwardedProps:g}=o,d=g==null?void 0:g.nodeName;this.subscriber=s;let h=!1;if(!t)return;let{streamResponse:c,state:i}=t;this.activeRun.prevNodeName=null;let m={},u=i;try{this.dispatchEvent({type:l.EventType.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(d);try{for(var x=it(c),M,k,N;M=!(k=await x.next()).done;M=!1){let E=k.value;let H=(v=o.forwardedProps)==null?void 0:v.streamSubgraphs,S=H&&(E.event.startsWith("events")||E.event.startsWith("values"));if(!r.includes(E.event)&&!S&&E.event!=="error")continue;let y=E;if(E.event==="error"){this.dispatchEvent({type:l.EventType.RUN_ERROR,message:E.data.message,rawEvent:E});break}if(E.event==="updates")continue;if(E.event==="values"){m=y.data;continue}else if(H&&y.event.startsWith("values|")){m=p(p({},m),y.data);continue}let U=y.data,Z=(C=U.metadata)!=null?C:{},w=Z.langgraph_node,tt=U.event;if(this.activeRun.id=Z.run_id,w&&w!==this.activeRun.nodeName&&this.handleNodeChange(w),h=h||tt==="on_custom_event"&&U.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===w&&tt==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(T=this.activeRun.graphInfo)!=null&&T.nodes.some(pt=>pt.id===w)&&this.handleNodeChange(w),u.values=(_=this.activeRun.manuallyEmittedState)!=null?_:m,!this.activeRun.nodeName)continue;(JSON.stringify(u)!==JSON.stringify(i)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(i=u,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:l.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(i),rawEvent:y})),this.dispatchEvent({type:l.EventType.RAW,event:U}),this.handleSingleEvent(U)}}catch(k){N=[k]}finally{try{M&&(k=x.return)&&await k.call(x)}finally{if(N)throw N[0]}}i=await this.client.threads.getState(e);let A=i.tasks,P=(R=(I=A==null?void 0:A[0])==null?void 0:I.interrupts)!=null?R:[],F=i.next.length===0,X=(G=(O=i.metadata)==null?void 0:O.writes)!=null?G:{},K=this.activeRun.nodeName;return P!=null&&P.length||(K=F?"__end__":(b=i.next[0])!=null?b:Object.keys(X)[0]),P.forEach(E=>{this.dispatchEvent({type:l.EventType.CUSTOM,name:"on_interrupt",value:typeof E.value=="string"?E.value:JSON.stringify(E.value),rawEvent:E})}),this.handleNodeChange(K),this.handleNodeChange(void 0),this.dispatchEvent({type:l.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(i)}),this.dispatchEvent({type:l.EventType.MESSAGES_SNAPSHOT,messages:ht((D=i.values.messages)!=null?D:[])}),this.dispatchEvent({type:l.EventType.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.activeRun=void 0,s.complete()}catch(A){return s.error(A)}}handleSingleEvent(t){var e,s,o,r,g,d;switch(t.event){case"on_chat_model_stream":let h=(e=t.metadata["emit-messages"])!=null?e:!0,c=(s=t.metadata["emit-tool-calls"])!=null?s:!0;if(t.data.chunk.response_metadata.finish_reason)return;let i=this.getMessageInProgress(this.activeRun.id),m=!!(i!=null&&i.id),u=(o=t.data.chunk.tool_call_chunks)==null?void 0:o[0],v=(r=t.metadata.predict_state)==null?void 0:r.some(R=>R.tool===(u==null?void 0:u.name)),C=!m&&(u==null?void 0:u.name),T=m&&(i==null?void 0:i.toolCallId)&&(u==null?void 0:u.args),_=m&&(i==null?void 0:i.toolCallId)&&!u;(_||T||C)&&(this.activeRun.hasFunctionStreaming=!0);let x=dt(t.data),M=L(t.data.chunk.content),k=!!(!u&&M),N=m&&!(i!=null&&i.toolCallId)&&!k;if(x){this.handleThinkingEvent(x);break}if(!x&&this.thinkingProcess&&(this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:l.EventType.THINKING_END}),this.thinkingProcess=null),v&&this.dispatchEvent({type:l.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),_){this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:i==null?void 0:i.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(N){this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:i.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(C&&c){M&&(this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_CONTENT,messageId:t.data.chunk.id,delta:M,rawEvent:t}),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:t.data.chunk.id,rawEvent:t})),this.dispatchEvent({type:l.EventType.TOOL_CALL_START,toolCallId:u.id,toolCallName:u.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:u.id,toolCallName:u.name});break}if(T&&c){this.dispatchEvent({type:l.EventType.TOOL_CALL_ARGS,toolCallId:i==null?void 0:i.toolCallId,delta:u.args,rawEvent:t});break}if(k&&h){i||(this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),i=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_CONTENT,messageId:i.id,delta:M,rawEvent:t});break}break;case"on_chat_model_end":if((g=this.getMessageInProgress(this.activeRun.id))!=null&&g.toolCallId){this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((d=this.getMessageInProgress(this.activeRun.id))!=null&&d.id){this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:l.EventType.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:l.EventType.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:l.EventType.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:l.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot({values:this.activeRun.manuallyEmittedState}),rawEvent:t})),this.dispatchEvent({type:l.EventType.CUSTOM,name:t.name,value:t.data,rawEvent:t});break;case"on_tool_end":if(this.activeRun.hasFunctionStreaming)break;let I=t.data.output;this.dispatchEvent({type:l.EventType.TOOL_CALL_START,toolCallId:I.tool_call_id,toolCallName:I.name,parentMessageId:I.id,rawEvent:t}),this.dispatchEvent({type:l.EventType.TOOL_CALL_ARGS,toolCallId:I.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:l.EventType.TOOL_CALL_END,toolCallId:I.tool_call_id,rawEvent:t})}}handleThinkingEvent(t){var s;if(!t||!t.type||!t.text)return;let e=t.index;(s=this.thinkingProcess)!=null&&s.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:l.EventType.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:l.EventType.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:l.EventType.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=t.values,s=this.activeRun.schemaKeys;return s!=null&&s.output&&(e=j(e,[...this.constantSchemaKeys,...s.output])),e}async getOrCreateThread(t,e){let s;try{try{s=await this.getThread(t)}catch(o){s=await this.createThread({threadId:t,metadata:e})}}catch(o){throw new Error(`Failed to create thread: ${o.message}`)}return s}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((o,r)=>{var m;let g=o.configurable;r.configurable&&(g=s!=null&&s.config?j(r==null?void 0:r.configurable,[...this.constantSchemaKeys,...(m=s==null?void 0:s.config)!=null?m:[]]):r==null?void 0:r.configurable);let d=f(p(p({},o),r),{configurable:g}),h=o.recursion_limit==null&&r.recursion_limit===25,c=JSON.stringify(d)!==JSON.stringify(o),i=h&&JSON.stringify(f(p({},d),{recursion_limit:null}))===JSON.stringify(f(p({},o),{recursion_limit:null}));return c&&!i?p(p({},o),d):o},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=f(p({},this.messagesInProcess),{[t]:p(p({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.graph_id===this.graphId);if(!e)throw console.error(`
|
|
1
|
+
"use strict";var W=Object.defineProperty,mt=Object.defineProperties,Et=Object.getOwnPropertyDescriptor,St=Object.getOwnPropertyDescriptors,ft=Object.getOwnPropertyNames,J=Object.getOwnPropertySymbols;var V=Object.prototype.hasOwnProperty,nt=Object.prototype.propertyIsEnumerable;var et=(a,n)=>(n=Symbol[a])?n:Symbol.for("Symbol."+a);var st=(a,n,t)=>n in a?W(a,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[n]=t,m=(a,n)=>{for(var t in n||(n={}))V.call(n,t)&&st(a,t,n[t]);if(J)for(var t of J(n))nt.call(n,t)&&st(a,t,n[t]);return a},v=(a,n)=>mt(a,St(n));var at=(a,n)=>{var t={};for(var e in a)V.call(a,e)&&n.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&J)for(var e of J(a))n.indexOf(e)<0&&nt.call(a,e)&&(t[e]=a[e]);return t};var vt=(a,n)=>{for(var t in n)W(a,t,{get:n[t],enumerable:!0})},yt=(a,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of ft(n))!V.call(a,s)&&s!==t&&W(a,s,{get:()=>n[s],enumerable:!(e=Et(n,s))||e.enumerable});return a};var _t=a=>yt(W({},"__esModule",{value:!0}),a);var it=(a,n,t)=>(n=a[et("asyncIterator")])?n.call(a):(a=a[et("iterator")](),n={},t=(e,s)=>(s=a[e])&&(n[e]=r=>new Promise((i,c,g)=>(r=s.call(a,r),g=r.done,Promise.resolve(r.value).then(l=>i({value:l,done:g}),c)))),t("next"),t("return"),n);var Tt={};vt(Tt,{CustomEventNames:()=>ot,LangGraphAgent:()=>z,LangGraphEventTypes:()=>rt,LangGraphHttpAgent:()=>Q});module.exports=_t(Tt);var ut=require("@ag-ui/client");var gt=require("rxjs"),ct=require("@langchain/langgraph-sdk"),$=require("crypto");var rt=(u=>(u.OnChainStart="on_chain_start",u.OnChainStream="on_chain_stream",u.OnChainEnd="on_chain_end",u.OnChatModelStart="on_chat_model_start",u.OnChatModelStream="on_chat_model_stream",u.OnChatModelEnd="on_chat_model_end",u.OnToolStart="on_tool_start",u.OnToolEnd="on_tool_end",u.OnCustomEvent="on_custom_event",u.OnInterrupt="on_interrupt",u))(rt||{}),ot=(s=>(s.ManuallyEmitMessage="manually_emit_message",s.ManuallyEmitToolCall="manually_emit_tool_call",s.ManuallyEmitState="manually_emit_state",s.Exit="exit",s))(ot||{});var o=require("@ag-ui/client");var Y=["messages","tools"];function j(a,n){return Object.fromEntries(Object.entries(a).filter(([t])=>n.includes(t)))}function lt({mode:a,state:n,schemaKeys:t}){let e=a==="start"?n:null;return e&&(t!=null&&t.input)&&(e=j(e,[...Y,...t.input])),e}function ht(a){return a.map(n=>{var t;switch(n.type){case"human":return{id:n.id,role:"user",content:X(w(n.content))};case"ai":let e=w(n.content);return{id:n.id,role:"assistant",content:e?X(e):"",toolCalls:(t=n.tool_calls)==null?void 0:t.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:n.id,role:"system",content:X(w(n.content))};case"tool":return{id:n.id,role:"tool",content:X(w(n.content)),toolCallId:n.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function q(a){return a.map((n,t)=>{var e,s;switch(n.role){case"user":return{id:n.id,role:n.role,content:n.content,type:"human"};case"assistant":return{id:n.id,type:"ai",role:n.role,content:(e=n.content)!=null?e:"",tool_calls:((s=n.toolCalls)!=null?s:[]).map(r=>({id:r.id,name:r.function.name,args:JSON.parse(r.function.arguments),type:"tool_call"}))};case"system":return{id:n.id,role:n.role,content:n.content,type:"system"};case"tool":return{content:n.content,role:n.role,type:n.role,tool_call_id:n.toolCallId,id:n.id};default:throw console.error(`Message role ${n.role} is not implemented`),new Error("message role is not supported.")}})}function X(a){return typeof a=="string"?a:JSON.stringify(a)}function dt(a){var t,e,s,r,i;let n=(t=a.chunk)==null?void 0:t.content;if(n&&Array.isArray(n)&&n.length&&n[0])return n[0].thinking?{text:n[0].thinking,type:"text",index:n[0].index}:null;if((r=(s=(e=a.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:s.summary)!=null&&r[0]){let c=(i=a.chunk.additional_kwargs)==null?void 0:i.reasoning.summary[0];return!c||!c.text?null:{type:"text",text:c.text,index:c.index}}return null}function w(a){var n;if(!a)return null;if(typeof a=="string")return a;if(Array.isArray(a)&&a.length){let t=(n=a.find(e=>e.type==="text"))==null?void 0:n.text;return t!=null?t:null}return null}var z=class a extends o.AbstractAgent{constructor(t){var e,s;super(t);this.constantSchemaKeys=Y;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(s=t==null?void 0:t.client)!=null?s:new ct.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:m({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new a(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new gt.Observable(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var c,g,l;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let s=(c=t.threadId)!=null?c:(0,$.randomUUID)(),r=(l=(g=t.forwardedProps)==null?void 0:g.streamMode)!=null?l:["events","values","updates"],i=await this.prepareStream(v(m({},t),{threadId:s}),r);if(!i)return e.error("No stream to regenerate");await this.handleStreamEvents(i,s,e,t,Array.isArray(r)?r:[r])}async prepareRegenerateStream(t,e){var l,u,d;let{threadId:s,messageCheckpoint:r}=t,i=await this.getCheckpointByMessage(r.id,s);if(this.assistant||(this.assistant=await this.getAssistant()),!i)return this.subscriber.error("No checkpoint found for message");let c=await this.client.threads.updateState(s,{values:this.langGraphDefaultMergeState(i.values,[],t),checkpointId:i.checkpoint.checkpoint_id,asNode:(u=(l=i.next)==null?void 0:l[0])!=null?u:"__start__"}),g=v(m({},(d=t.forwardedProps)!=null?d:{}),{input:this.langGraphDefaultMergeState(i.values,[r],t),checkpointId:c.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(s,this.assistant.assistant_id,g),state:i,streamMode:e}}async prepareStream(t,e){var G,b,D,x,P,F,B,K,S,H;let{threadId:s,state:r,messages:i,tools:c,context:g,forwardedProps:l}=t;this.activeRun.manuallyEmittedState=null;let u=l==null?void 0:l.nodeName,d=s!=null?s:(0,$.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let h=await this.getOrCreateThread(d,l==null?void 0:l.threadMetadata);this.activeRun.threadId=h.thread_id;let E=(G=await this.client.threads.getState(h.thread_id))!=null?G:{values:{}},p=(b=E.values.messages)!=null?b:[],N=q(i),M=this.langGraphDefaultMergeState(v(m({},r),{messages:p}),N,t),I=v(m({},E),{values:v(m({},M),{messages:[...p,...(D=M.messages)!=null?D:[]]})}),A=I.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((x=E.values.messages)!=null?x:[]).length>i.filter(f=>f.role!=="system").length){let f=null;for(let T=i.length-1;T>=0;T--)if(i[T].role==="user"){f=q([i[T]])[0];break}return f?this.prepareRegenerateStream(v(m({},t),{messageCheckpoint:f}),e):this.subscriber.error("No user message found in messages to regenerate")}this.activeRun.graphInfo=await this.client.assistants.getGraph(this.assistant.assistant_id);let R=!((P=l==null?void 0:l.command)!=null&&P.resume)&&d&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(R==="continue"){let f=this.activeRun.graphInfo.edges.find(T=>T.target===this.activeRun.nodeName);await this.client.threads.updateState(d,{values:r,asNode:f==null?void 0:f.source})}let k=lt({mode:R,state:A,schemaKeys:this.activeRun.schemaKeys}),C,O=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);O.length&&(C=await this.mergeConfigs({configs:O,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let y=v(m({},l),{streamMode:e,input:k,config:C,context:m(m({},g),(F=C==null?void 0:C.configurable)!=null?F:{})}),_=(S=(K=(B=E.tasks)==null?void 0:B[0])==null?void 0:K.interrupts)!=null?S:[];return _!=null&&_.length&&!((H=l==null?void 0:l.command)!=null&&H.resume)?(this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:d,runId:t.runId}),this.handleNodeChange(u),_.forEach(f=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof f.value=="string"?f.value:JSON.stringify(f.value),rawEvent:f})}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:d,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(d,this.assistant.assistant_id,y),state:I}}async handleStreamEvents(t,e,s,r,i){var p,N,M,I,O,y,_,G,b,D;let{forwardedProps:c}=r,g=c==null?void 0:c.nodeName;this.subscriber=s;let l=!1;if(!t)return;let{streamResponse:u,state:d}=t;this.activeRun.prevNodeName=null;let h={},E=d;try{this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(g);try{for(var A=it(u),R,k,C;R=!(k=await A.next()).done;R=!1){let S=k.value;let H=(p=r.forwardedProps)==null?void 0:p.streamSubgraphs,f=H&&(S.event.startsWith("events")||S.event.startsWith("values"));if(!i.includes(S.event)&&!f&&S.event!=="error")continue;let T=S;if(S.event==="error"){this.dispatchEvent({type:o.EventType.RUN_ERROR,message:S.data.message,rawEvent:S});break}if(S.event==="updates")continue;if(S.event==="values"){h=T.data;continue}else if(H&&T.event.startsWith("values|")){h=m(m({},h),T.data);continue}let U=T.data,Z=(N=U.metadata)!=null?N:{},L=Z.langgraph_node,tt=U.event;if(this.activeRun.id=Z.run_id,L&&L!==this.activeRun.nodeName&&this.handleNodeChange(L),l=l||tt==="on_custom_event"&&U.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===L&&tt==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(M=this.activeRun.graphInfo)!=null&&M.nodes.some(pt=>pt.id===L)&&this.handleNodeChange(L),E.values=(I=this.activeRun.manuallyEmittedState)!=null?I:h,!this.activeRun.nodeName)continue;(JSON.stringify(E)!==JSON.stringify(d)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(d=E,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d),rawEvent:T})),this.dispatchEvent({type:o.EventType.RAW,event:U}),this.handleSingleEvent(U)}}catch(k){C=[k]}finally{try{R&&(k=A.return)&&await k.call(A)}finally{if(C)throw C[0]}}d=await this.client.threads.getState(e);let x=d.tasks,P=(y=(O=x==null?void 0:x[0])==null?void 0:O.interrupts)!=null?y:[],F=d.next.length===0,B=(G=(_=d.metadata)==null?void 0:_.writes)!=null?G:{},K=this.activeRun.nodeName;return P!=null&&P.length||(K=F?"__end__":(b=d.next[0])!=null?b:Object.keys(B)[0]),P.forEach(S=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof S.value=="string"?S.value:JSON.stringify(S.value),rawEvent:S})}),this.handleNodeChange(K),this.handleNodeChange(void 0),this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d)}),this.dispatchEvent({type:o.EventType.MESSAGES_SNAPSHOT,messages:ht((D=d.values.messages)!=null?D:[])}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.activeRun=void 0,s.complete()}catch(x){return s.error(x)}}handleSingleEvent(t){var e,s,r,i,c,g,l;switch(t.event){case"on_chat_model_stream":let u=(e=t.metadata["emit-messages"])!=null?e:!0,d=(s=t.metadata["emit-tool-calls"])!=null?s:!0;if(t.data.chunk.response_metadata.finish_reason)return;let h=this.getMessageInProgress(this.activeRun.id),E=!!(h!=null&&h.id),p=(r=t.data.chunk.tool_call_chunks)==null?void 0:r[0],N=(i=t.metadata.predict_state)==null?void 0:i.some(_=>_.tool===(p==null?void 0:p.name)),M=!E&&(p==null?void 0:p.name),I=E&&(h==null?void 0:h.toolCallId)&&(p==null?void 0:p.args),A=E&&(h==null?void 0:h.toolCallId)&&!p;(A||I||M)&&(this.activeRun.hasFunctionStreaming=!0);let R=dt(t.data),k=w(t.data.chunk.content),C=!!(!p&&k),O=E&&!(h!=null&&h.toolCallId)&&!C;if(R){this.handleThinkingEvent(R);break}if(!R&&this.thinkingProcess&&(this.dispatchEvent({type:o.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.EventType.THINKING_END}),this.thinkingProcess=null),N&&this.dispatchEvent({type:o.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),A){this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:h==null?void 0:h.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(O){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:h.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(M&&d){this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:p.id,toolCallName:p.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:p.id,toolCallName:p.name});break}if(I&&d){this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:h==null?void 0:h.toolCallId,delta:p.args,rawEvent:t});break}if(C&&u){h||(this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),h=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_CONTENT,messageId:h.id,delta:k,rawEvent:t});break}break;case"on_chat_model_end":if((c=this.getMessageInProgress(this.activeRun.id))!=null&&c.toolCallId){this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((g=this.getMessageInProgress(this.activeRun.id))!=null&&g.id){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot({values:this.activeRun.manuallyEmittedState}),rawEvent:t})),this.dispatchEvent({type:o.EventType.CUSTOM,name:t.name,value:t.data,rawEvent:t});break;case"on_tool_end":let y=(l=t.data)==null?void 0:l.output;this.activeRun.hasFunctionStreaming||(this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:y.tool_call_id,toolCallName:y.name,parentMessageId:y.id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:y.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:y.tool_call_id,rawEvent:t})),this.dispatchEvent({type:o.EventType.TOOL_CALL_RESULT,toolCallId:y.tool_call_id,content:y==null?void 0:y.content,messageId:(0,$.randomUUID)(),role:"tool"});break}}handleThinkingEvent(t){var s;if(!t||!t.type||!t.text)return;let e=t.index;(s=this.thinkingProcess)!=null&&s.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:o.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.EventType.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:o.EventType.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:o.EventType.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:o.EventType.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=t.values,s=this.activeRun.schemaKeys;return s!=null&&s.output&&(e=j(e,[...this.constantSchemaKeys,...s.output])),e}async getOrCreateThread(t,e){let s;try{try{s=await this.getThread(t)}catch(r){s=await this.createThread({threadId:t,metadata:e})}}catch(r){throw new Error(`Failed to create thread: ${r.message}`)}return s}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((r,i)=>{var h;let c=r.configurable;i.configurable&&(c=s!=null&&s.config?j(i==null?void 0:i.configurable,[...this.constantSchemaKeys,...(h=s==null?void 0:s.config)!=null?h:[]]):i==null?void 0:i.configurable);let g=v(m(m({},r),i),{configurable:c}),l=r.recursion_limit==null&&i.recursion_limit===25,u=JSON.stringify(g)!==JSON.stringify(r),d=l&&JSON.stringify(v(m({},g),{recursion_limit:null}))===JSON.stringify(v(m({},r),{recursion_limit:null}));return u&&!d?m(m({},r),g):r},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=v(m({},this.messagesInProcess),{[t]:m(m({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.graph_id===this.graphId);if(!e)throw console.error(`
|
|
2
2
|
No agent found with graph ID ${this.graphId} found..
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
These are the available agents: [${t.map(s=>`${s.graph_id} (ID: ${s.assistant_id})`).join(", ")}]
|
|
6
|
-
`),new Error("No agent id found");return e}async getSchemaKeys(){var t,e,s,
|
|
6
|
+
`),new Error("No agent id found");return e}async getSchemaKeys(){var t,e,s,r;try{let i=await this.client.assistants.getSchemas(this.assistant.assistant_id),c=null,g=[];if("context_schema"in i&&((t=i.context_schema)!=null&&t.properties)&&(g=Object.keys(i.context_schema.properties)),(e=i.config_schema)!=null&&e.properties&&(c=Object.keys(i.config_schema.properties)),!((s=i.input_schema)!=null&&s.properties)||!((r=i.output_schema)!=null&&r.properties))return{config:[],input:null,output:null,context:g};let l=Object.keys(i.input_schema.properties),u=Object.keys(i.output_schema.properties);return{input:l&&l.length?[...l,...this.constantSchemaKeys]:null,output:u&&u.length?[...u,...this.constantSchemaKeys]:null,context:g,config:c}}catch(i){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys,context:[]}}}langGraphDefaultMergeState(t,e,s){var l,u;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let r=t.messages||[],i=new Set(r.map(d=>d.id)),c=e.filter(d=>!i.has(d.id)),g=[...(l=t.tools)!=null?l:[],...(u=s.tools)!=null?u:[]].reduce((d,h)=>{let E=h;return h.type||(E={type:"function",name:h.name,function:{name:h.name,description:h.description,parameters:h.parameters}}),d.find(p=>p.name===E.name||p.function.name===E.function.name)?d:[...d,E]},[]);return v(m({},t),{messages:c,tools:g,"ag-ui":{tools:g,context:s.context}})}handleNodeChange(t){var e,s;t==="__end__"&&(t=void 0),t!==((e=this.activeRun)==null?void 0:e.nodeName)&&((s=this.activeRun)!=null&&s.nodeName&&this.endStep(),t&&this.startStep(t)),this.activeRun.nodeName=t}startStep(t){this.dispatchEvent({type:o.EventType.STEP_STARTED,stepName:t})}endStep(){this.dispatchEvent({type:o.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName})}async getCheckpointByMessage(t,e,s){var M,A;let r=s!=null&&s.checkpoint_id?{checkpoint:{checkpoint_id:s.checkpoint_id}}:void 0,c=[...await this.client.threads.getHistory(e,r)].reverse(),g=c.find(R=>{var k;return(k=R.values.messages)==null?void 0:k.some(C=>C.id===t)});if(!g)throw new Error("Message not found");let l=(M=g.values.messages)!=null?M:[],u=l.findIndex(R=>R.id===t);if(l.slice(u+1).length)return this.getCheckpointByMessage(t,e,g.parent_checkpoint);let h=c.indexOf(g),I=g.values,{messages:E}=I,p=at(I,["messages"]),N=(A=c[h-1])!=null?A:v(m({},g),{values:{}});return v(m({},N),{values:m(m({},N.values),p)})}};var Q=class extends ut.HttpAgent{};0&&(module.exports={CustomEventNames,LangGraphAgent,LangGraphEventTypes,LangGraphHttpAgent});
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread,\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning,\n StateEnrichment,\n LangGraphToolWithName,\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n Message as AGUIMessage,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent,\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\ninterface RegenerateInput extends RunAgentExtendedInput {\n messageCheckpoint: LangGraphMessage;\n}\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n constantSchemaKeys: string[] = DEFAULT_SCHEMA_KEYS;\n config: LangGraphAgentConfig;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.config = config;\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null;\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n public clone() {\n return new LangGraphAgent(this.config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n return new Observable<ProcessedEvents>((subscriber) => {\n this.runAgentStream(input, subscriber);\n return () => {};\n });\n }\n\n async runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n hasFunctionStreaming: false,\n };\n this.subscriber = subscriber;\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n const threadId = input.threadId ?? randomUUID();\n const streamMode =\n input.forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]);\n const preparedStream = await this.prepareStream({ ...input, threadId }, streamMode);\n\n if (!preparedStream) {\n return subscriber.error(\"No stream to regenerate\");\n }\n\n await this.handleStreamEvents(preparedStream, threadId, subscriber, input, Array.isArray(streamMode) ? streamMode : [streamMode]);\n }\n\n async prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]) {\n const { threadId, messageCheckpoint } = input;\n\n const timeTravelCheckpoint = await this.getCheckpointByMessage(\n messageCheckpoint!.id!,\n threadId,\n );\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n if (!timeTravelCheckpoint) {\n return this.subscriber.error(\"No checkpoint found for message\");\n }\n\n const fork = await this.client.threads.updateState(threadId, {\n values: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [], input),\n checkpointId: timeTravelCheckpoint.checkpoint.checkpoint_id!,\n asNode: timeTravelCheckpoint.next?.[0] ?? \"__start__\",\n });\n\n const payload = {\n ...(input.forwardedProps ?? {}),\n input: this.langGraphDefaultMergeState(\n timeTravelCheckpoint.values,\n [messageCheckpoint],\n input,\n ),\n // @ts-ignore\n checkpointId: fork.checkpoint.checkpoint_id!,\n streamMode,\n };\n return {\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: timeTravelCheckpoint as ThreadState<State>,\n streamMode,\n };\n }\n\n async prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]) {\n let {\n threadId: inputThreadId,\n state: inputState,\n messages,\n tools,\n context,\n forwardedProps,\n } = input;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n\n const agentState: ThreadState<State> =\n (await this.client.threads.getState(thread.thread_id)) ??\n ({ values: {} } as ThreadState<State>);\n const agentStateMessages = agentState.values.messages ?? [];\n const inputMessagesToLangchain = aguiMessagesToLangChain(messages);\n const stateValuesDiff = this.langGraphDefaultMergeState(\n { ...inputState, messages: agentStateMessages },\n inputMessagesToLangchain,\n input,\n );\n // Messages are a combination of existing messages in state + everything that was newly sent\n let threadState = {\n ...agentState,\n values: {\n ...stateValuesDiff,\n messages: [...agentStateMessages, ...(stateValuesDiff.messages ?? [])],\n },\n };\n let stateValues = threadState.values;\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n if (\n (agentState.values.messages ?? []).length > messages.filter((m) => m.role !== \"system\").length\n ) {\n let lastUserMessage: LangGraphMessage | null = null;\n // Find the first user message by working backwards from the last message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n lastUserMessage = aguiMessagesToLangChain([messages[i]])[0];\n break;\n }\n }\n\n if (!lastUserMessage) {\n return this.subscriber.error(\"No user message found in messages to regenerate\");\n }\n\n return this.prepareRegenerateStream(\n { ...input, messageCheckpoint: lastUserMessage },\n streamMode,\n );\n }\n this.activeRun!.graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n !forwardedProps?.command?.resume &&\n threadId &&\n this.activeRun!.nodeName != \"__end__\" &&\n this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\") {\n const nodeBefore = this.activeRun!.graphInfo.edges.find(\n (e) => e.target === this.activeRun!.nodeName,\n );\n await this.client.threads.updateState(threadId, {\n values: inputState,\n asNode: nodeBefore?.source,\n });\n }\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state: stateValues,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode,\n input: payloadInput,\n config: payloadConfig,\n context: {\n ...context,\n ...(payloadConfig?.configurable ?? {}),\n }\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n this.handleNodeChange(nodeNameInput)\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return this.subscriber.complete();\n }\n\n return {\n // @ts-ignore\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: threadState as ThreadState<State>,\n };\n }\n\n async handleStreamEvents(\n stream: Awaited<\n ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>\n >,\n threadId: string,\n subscriber: Subscriber<ProcessedEvents>,\n input: RunAgentExtendedInput,\n streamModes: StreamMode | StreamMode[],\n ) {\n const { forwardedProps } = input;\n const nodeNameInput = forwardedProps?.nodeName;\n this.subscriber = subscriber;\n let shouldExit = false;\n if (!stream) return;\n\n let { streamResponse, state } = stream;\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {} as ThreadState<State>[\"values\"];\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.handleNodeChange(nodeNameInput)\n\n for await (let streamResponseChunk of streamResponse) {\n const subgraphsStreamEnabled = input.forwardedProps?.streamSubgraphs;\n const isSubgraphStream =\n subgraphsStreamEnabled &&\n (streamResponseChunk.event.startsWith(\"events\") ||\n streamResponseChunk.event.startsWith(\"values\"));\n\n // @ts-ignore\n if (!streamModes.includes(streamResponseChunk.event as StreamMode) && !isSubgraphStream && streamResponseChunk.event !== 'error') {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") {\n continue;\n }\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n } else if (subgraphsStreamEnabled && chunk.event.startsWith(\"values|\")) {\n latestStateValues = {\n ...latestStateValues,\n ...chunk.data,\n };\n continue;\n }\n\n const chunkData = chunk.data;\n const metadata = chunkData.metadata ?? {};\n const currentNodeName = metadata.langgraph_node;\n const eventType = chunkData.event;\n\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n this.handleNodeChange(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (this.activeRun!.graphInfo?.[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.handleNodeChange(currentNodeName)\n }\n\n updatedState.values = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks;\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0;\n const writes = state.metadata?.writes ?? {};\n\n // Initialize a new node name to use in the next if block\n let newNodeName = this.activeRun!.nodeName!;\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? \"__end__\" : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.handleNodeChange(newNodeName);\n // Immediately turn off new step\n this.handleNodeChange(undefined);\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui((state.values as { messages: any[] }).messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n if (isToolCallEndEvent || isToolCallArgsEvent || isToolCallStartEvent) {\n this.activeRun!.hasFunctionStreaming = true;\n }\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData);\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n if (messageContent) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.chunk.id,\n delta: messageContent,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n }\n\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun!.manuallyEmittedState!,\n } as ThreadState<State>),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n case LangGraphEventTypes.OnToolEnd:\n if (this.activeRun!.hasFunctionStreaming) break;\n const toolCallOutput = event.data.output\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallOutput.tool_call_id,\n toolCallName: toolCallOutput.name,\n parentMessageId: toolCallOutput.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCallOutput.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCallOutput.tool_call_id,\n rawEvent: event,\n });\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n });\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n });\n this.thinkingProcess.type = reasoningData.type;\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text,\n });\n }\n }\n\n getStateSnapshot(threadState: ThreadState<State>) {\n let state = threadState.values;\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...this.constantSchemaKeys, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata,\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...this.constantSchemaKeys,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) => searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n let contextSchema: string[] = []\n if ('context_schema' in graphSchema && graphSchema.context_schema?.properties) {\n contextSchema = Object.keys(graphSchema.context_schema.properties);\n }\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: null, output: null, context: contextSchema };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input:\n inputSchema && inputSchema.length ? [...inputSchema, ...this.constantSchemaKeys] : null,\n output:\n outputSchema && outputSchema.length\n ? [...outputSchema, ...this.constantSchemaKeys]\n : null,\n context: contextSchema,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: this.constantSchemaKeys, output: this.constantSchemaKeys, context: [] };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], input: RunAgentExtendedInput): State<StateEnrichment> {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n const langGraphTools: LangGraphToolWithName[] = [...(state.tools ?? []), ...(input.tools ?? [])].reduce((acc, tool) => {\n let mappedTool = tool;\n if (!tool.type) {\n mappedTool = {\n type: \"function\",\n name: tool.name,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }\n }\n\n // Verify no duplicated\n if (acc.find((t: LangGraphToolWithName) => (t.name === mappedTool.name) || t.function.name === mappedTool.function.name)) return acc;\n\n return [...acc, mappedTool];\n }, []);\n\n return {\n ...state,\n messages: newMessages,\n tools: langGraphTools,\n 'ag-ui': {\n tools: langGraphTools,\n context: input.context,\n }\n };\n }\n\n handleNodeChange(nodeName: string | undefined) {\n if (nodeName === \"__end__\") {\n nodeName = undefined;\n }\n if (nodeName !== this.activeRun?.nodeName) {\n // End current step\n if (this.activeRun?.nodeName) {\n this.endStep();\n }\n // If we actually got a node name, start a new step\n if (nodeName) {\n this.startStep(nodeName);\n }\n }\n this.activeRun!.nodeName = nodeName;\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n }\n\n endStep() {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n\n async getCheckpointByMessage(\n messageId: string,\n threadId: string,\n checkpoint?: null | {\n checkpoint_id?: null | string;\n checkpoint_ns: string;\n },\n ): Promise<ThreadState> {\n const options = checkpoint?.checkpoint_id\n ? {\n checkpoint: { checkpoint_id: checkpoint.checkpoint_id },\n }\n : undefined;\n const history = await this.client.threads.getHistory(threadId, options);\n const reversed = [...history].reverse(); // oldest → newest\n\n let targetState = reversed.find((state) =>\n (state.values as State).messages?.some((m: LangGraphPlatformMessage) => m.id === messageId),\n );\n\n if (!targetState) throw new Error(\"Message not found\");\n\n const targetStateMessages = (targetState.values as State).messages ?? [];\n const messageIndex = targetStateMessages.findIndex(\n (m: LangGraphPlatformMessage) => m.id === messageId,\n );\n const messagesAfter = targetStateMessages.slice(messageIndex + 1);\n if (messagesAfter.length) {\n return this.getCheckpointByMessage(messageId, threadId, targetState.parent_checkpoint);\n }\n\n const targetStateIndex = reversed.indexOf(targetState);\n\n const { messages, ...targetStateValuesWithoutMessages } = targetState.values as State;\n const selectedCheckpoint = reversed[targetStateIndex - 1] ?? { ...targetState, values: {} };\n return {\n ...selectedCheckpoint,\n values: { ...selectedCheckpoint.values, ...targetStateValuesWithoutMessages },\n };\n }\n}\n\nexport * from \"./types\";\n","import { AssistantGraph, Message as LangGraphMessage, } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\nimport { RunAgentInput } from \"@ag-ui/core\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type LangGraphToolWithName = {\n type: \"function\";\n name?: string;\n function: {\n name: string;\n description: string;\n parameters: any;\n },\n}\n\nexport type State<TDefinedState = Record<string, any>> = {\n [k in keyof TDefinedState]: TDefinedState[k] | null;\n} & Record<string, any>;\nexport interface StateEnrichment {\n messages: LangGraphMessage[];\n tools: LangGraphToolWithName[];\n 'ag-ui': {\n tools: LangGraphToolWithName[];\n context: RunAgentInput['context']\n }\n}\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n context: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n graphInfo?: AssistantGraph\n hasFunctionStreaming?: boolean;\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n LangGraphMessage,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"messages\", \"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"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","names":["index_exports","__export","CustomEventNames","LangGraphAgent","LangGraphEventTypes","LangGraphHttpAgent","__toCommonJS","import_client","import_rxjs","import_langgraph_sdk","import_node_crypto","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","_LangGraphAgent","config","_a","_b","DEFAULT_SCHEMA_KEYS","LangGraphClient","__spreadValues","event","input","subscriber","_c","threadId","streamMode","preparedStream","__spreadProps","messageCheckpoint","timeTravelCheckpoint","fork","payload","_d","_e","_f","_g","_h","_i","_j","inputThreadId","inputState","messages","tools","context","forwardedProps","nodeNameInput","thread","agentState","agentStateMessages","inputMessagesToLangchain","aguiMessagesToLangChain","stateValuesDiff","threadState","stateValues","m","lastUserMessage","i","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","interrupts","interrupt","stream","streamModes","shouldExit","streamResponse","state","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","subgraphsStreamEnabled","isSubgraphStream","chunk","chunkData","metadata","currentNodeName","eventType","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","toolCallOutput","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","newMessages","langGraphTools","tool","mappedTool","t","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","__objRest","selectedCheckpoint","LangGraphHttpAgent"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread,\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning,\n StateEnrichment,\n LangGraphToolWithName,\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ToolCallResultEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent,\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ToolCallResultEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\ninterface RegenerateInput extends RunAgentExtendedInput {\n messageCheckpoint: LangGraphMessage;\n}\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n constantSchemaKeys: string[] = DEFAULT_SCHEMA_KEYS;\n config: LangGraphAgentConfig;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.config = config;\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null;\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n public clone() {\n return new LangGraphAgent(this.config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n return new Observable<ProcessedEvents>((subscriber) => {\n this.runAgentStream(input, subscriber);\n return () => {};\n });\n }\n\n async runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n hasFunctionStreaming: false,\n };\n this.subscriber = subscriber;\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n const threadId = input.threadId ?? randomUUID();\n const streamMode =\n input.forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]);\n const preparedStream = await this.prepareStream({ ...input, threadId }, streamMode);\n\n if (!preparedStream) {\n return subscriber.error(\"No stream to regenerate\");\n }\n\n await this.handleStreamEvents(preparedStream, threadId, subscriber, input, Array.isArray(streamMode) ? streamMode : [streamMode]);\n }\n\n async prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]) {\n const { threadId, messageCheckpoint } = input;\n\n const timeTravelCheckpoint = await this.getCheckpointByMessage(\n messageCheckpoint!.id!,\n threadId,\n );\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n if (!timeTravelCheckpoint) {\n return this.subscriber.error(\"No checkpoint found for message\");\n }\n\n const fork = await this.client.threads.updateState(threadId, {\n values: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [], input),\n checkpointId: timeTravelCheckpoint.checkpoint.checkpoint_id!,\n asNode: timeTravelCheckpoint.next?.[0] ?? \"__start__\",\n });\n\n const payload = {\n ...(input.forwardedProps ?? {}),\n input: this.langGraphDefaultMergeState(\n timeTravelCheckpoint.values,\n [messageCheckpoint],\n input,\n ),\n // @ts-ignore\n checkpointId: fork.checkpoint.checkpoint_id!,\n streamMode,\n };\n return {\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: timeTravelCheckpoint as ThreadState<State>,\n streamMode,\n };\n }\n\n async prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]) {\n let {\n threadId: inputThreadId,\n state: inputState,\n messages,\n tools,\n context,\n forwardedProps,\n } = input;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n\n const agentState: ThreadState<State> =\n (await this.client.threads.getState(thread.thread_id)) ??\n ({ values: {} } as ThreadState<State>);\n const agentStateMessages = agentState.values.messages ?? [];\n const inputMessagesToLangchain = aguiMessagesToLangChain(messages);\n const stateValuesDiff = this.langGraphDefaultMergeState(\n { ...inputState, messages: agentStateMessages },\n inputMessagesToLangchain,\n input,\n );\n // Messages are a combination of existing messages in state + everything that was newly sent\n let threadState = {\n ...agentState,\n values: {\n ...stateValuesDiff,\n messages: [...agentStateMessages, ...(stateValuesDiff.messages ?? [])],\n },\n };\n let stateValues = threadState.values;\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n if (\n (agentState.values.messages ?? []).length > messages.filter((m) => m.role !== \"system\").length\n ) {\n let lastUserMessage: LangGraphMessage | null = null;\n // Find the first user message by working backwards from the last message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n lastUserMessage = aguiMessagesToLangChain([messages[i]])[0];\n break;\n }\n }\n\n if (!lastUserMessage) {\n return this.subscriber.error(\"No user message found in messages to regenerate\");\n }\n\n return this.prepareRegenerateStream(\n { ...input, messageCheckpoint: lastUserMessage },\n streamMode,\n );\n }\n this.activeRun!.graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n !forwardedProps?.command?.resume &&\n threadId &&\n this.activeRun!.nodeName != \"__end__\" &&\n this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\") {\n const nodeBefore = this.activeRun!.graphInfo.edges.find(\n (e) => e.target === this.activeRun!.nodeName,\n );\n await this.client.threads.updateState(threadId, {\n values: inputState,\n asNode: nodeBefore?.source,\n });\n }\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state: stateValues,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode,\n input: payloadInput,\n config: payloadConfig,\n context: {\n ...context,\n ...(payloadConfig?.configurable ?? {}),\n }\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n this.handleNodeChange(nodeNameInput)\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return this.subscriber.complete();\n }\n\n return {\n // @ts-ignore\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: threadState as ThreadState<State>,\n };\n }\n\n async handleStreamEvents(\n stream: Awaited<\n ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>\n >,\n threadId: string,\n subscriber: Subscriber<ProcessedEvents>,\n input: RunAgentExtendedInput,\n streamModes: StreamMode | StreamMode[],\n ) {\n const { forwardedProps } = input;\n const nodeNameInput = forwardedProps?.nodeName;\n this.subscriber = subscriber;\n let shouldExit = false;\n if (!stream) return;\n\n let { streamResponse, state } = stream;\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {} as ThreadState<State>[\"values\"];\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.handleNodeChange(nodeNameInput)\n\n for await (let streamResponseChunk of streamResponse) {\n const subgraphsStreamEnabled = input.forwardedProps?.streamSubgraphs;\n const isSubgraphStream =\n subgraphsStreamEnabled &&\n (streamResponseChunk.event.startsWith(\"events\") ||\n streamResponseChunk.event.startsWith(\"values\"));\n\n // @ts-ignore\n if (!streamModes.includes(streamResponseChunk.event as StreamMode) && !isSubgraphStream && streamResponseChunk.event !== 'error') {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") {\n continue;\n }\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n } else if (subgraphsStreamEnabled && chunk.event.startsWith(\"values|\")) {\n latestStateValues = {\n ...latestStateValues,\n ...chunk.data,\n };\n continue;\n }\n\n const chunkData = chunk.data;\n const metadata = chunkData.metadata ?? {};\n const currentNodeName = metadata.langgraph_node;\n const eventType = chunkData.event;\n\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n this.handleNodeChange(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (this.activeRun!.graphInfo?.[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.handleNodeChange(currentNodeName)\n }\n\n updatedState.values = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks;\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0;\n const writes = state.metadata?.writes ?? {};\n\n // Initialize a new node name to use in the next if block\n let newNodeName = this.activeRun!.nodeName!;\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? \"__end__\" : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.handleNodeChange(newNodeName);\n // Immediately turn off new step\n this.handleNodeChange(undefined);\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui((state.values as { messages: any[] }).messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n if (isToolCallEndEvent || isToolCallArgsEvent || isToolCallStartEvent) {\n this.activeRun!.hasFunctionStreaming = true;\n }\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData);\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun!.manuallyEmittedState!,\n } as ThreadState<State>),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n case LangGraphEventTypes.OnToolEnd:\n const toolCallOutput = event.data?.output\n if (!this.activeRun!.hasFunctionStreaming) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallOutput.tool_call_id,\n toolCallName: toolCallOutput.name,\n parentMessageId: toolCallOutput.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCallOutput.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCallOutput.tool_call_id,\n rawEvent: event,\n });\n }\n this.dispatchEvent({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: toolCallOutput.tool_call_id,\n content: toolCallOutput?.content,\n messageId: randomUUID(),\n role: \"tool\",\n })\n break;\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n });\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n });\n this.thinkingProcess.type = reasoningData.type;\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text,\n });\n }\n }\n\n getStateSnapshot(threadState: ThreadState<State>) {\n let state = threadState.values;\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...this.constantSchemaKeys, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata,\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...this.constantSchemaKeys,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) => searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n let contextSchema: string[] = []\n if ('context_schema' in graphSchema && graphSchema.context_schema?.properties) {\n contextSchema = Object.keys(graphSchema.context_schema.properties);\n }\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: null, output: null, context: contextSchema };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input:\n inputSchema && inputSchema.length ? [...inputSchema, ...this.constantSchemaKeys] : null,\n output:\n outputSchema && outputSchema.length\n ? [...outputSchema, ...this.constantSchemaKeys]\n : null,\n context: contextSchema,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: this.constantSchemaKeys, output: this.constantSchemaKeys, context: [] };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], input: RunAgentExtendedInput): State<StateEnrichment> {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n const langGraphTools: LangGraphToolWithName[] = [...(state.tools ?? []), ...(input.tools ?? [])].reduce((acc, tool) => {\n let mappedTool = tool;\n if (!tool.type) {\n mappedTool = {\n type: \"function\",\n name: tool.name,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }\n }\n\n // Verify no duplicated\n if (acc.find((t: LangGraphToolWithName) => (t.name === mappedTool.name) || t.function.name === mappedTool.function.name)) return acc;\n\n return [...acc, mappedTool];\n }, []);\n\n return {\n ...state,\n messages: newMessages,\n tools: langGraphTools,\n 'ag-ui': {\n tools: langGraphTools,\n context: input.context,\n }\n };\n }\n\n handleNodeChange(nodeName: string | undefined) {\n if (nodeName === \"__end__\") {\n nodeName = undefined;\n }\n if (nodeName !== this.activeRun?.nodeName) {\n // End current step\n if (this.activeRun?.nodeName) {\n this.endStep();\n }\n // If we actually got a node name, start a new step\n if (nodeName) {\n this.startStep(nodeName);\n }\n }\n this.activeRun!.nodeName = nodeName;\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n }\n\n endStep() {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n\n async getCheckpointByMessage(\n messageId: string,\n threadId: string,\n checkpoint?: null | {\n checkpoint_id?: null | string;\n checkpoint_ns: string;\n },\n ): Promise<ThreadState> {\n const options = checkpoint?.checkpoint_id\n ? {\n checkpoint: { checkpoint_id: checkpoint.checkpoint_id },\n }\n : undefined;\n const history = await this.client.threads.getHistory(threadId, options);\n const reversed = [...history].reverse(); // oldest → newest\n\n let targetState = reversed.find((state) =>\n (state.values as State).messages?.some((m: LangGraphPlatformMessage) => m.id === messageId),\n );\n\n if (!targetState) throw new Error(\"Message not found\");\n\n const targetStateMessages = (targetState.values as State).messages ?? [];\n const messageIndex = targetStateMessages.findIndex(\n (m: LangGraphPlatformMessage) => m.id === messageId,\n );\n const messagesAfter = targetStateMessages.slice(messageIndex + 1);\n if (messagesAfter.length) {\n return this.getCheckpointByMessage(messageId, threadId, targetState.parent_checkpoint);\n }\n\n const targetStateIndex = reversed.indexOf(targetState);\n\n const { messages, ...targetStateValuesWithoutMessages } = targetState.values as State;\n const selectedCheckpoint = reversed[targetStateIndex - 1] ?? { ...targetState, values: {} };\n return {\n ...selectedCheckpoint,\n values: { ...selectedCheckpoint.values, ...targetStateValuesWithoutMessages },\n };\n }\n}\n\nexport * from \"./types\";\n","import { AssistantGraph, Message as LangGraphMessage, } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\nimport { RunAgentInput } from \"@ag-ui/core\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type LangGraphToolWithName = {\n type: \"function\";\n name?: string;\n function: {\n name: string;\n description: string;\n parameters: any;\n },\n}\n\nexport type State<TDefinedState = Record<string, any>> = {\n [k in keyof TDefinedState]: TDefinedState[k] | null;\n} & Record<string, any>;\nexport interface StateEnrichment {\n messages: LangGraphMessage[];\n tools: LangGraphToolWithName[];\n 'ag-ui': {\n tools: LangGraphToolWithName[];\n context: RunAgentInput['context']\n }\n}\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n context: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n graphInfo?: AssistantGraph\n hasFunctionStreaming?: boolean;\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n LangGraphMessage,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"messages\", \"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"6tCAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,sBAAAE,GAAA,mBAAAC,EAAA,wBAAAC,GAAA,uBAAAC,IAAA,eAAAC,GAAAN,IAAA,IAAAO,GAA0B,yBCA1B,IAAAC,GAAuC,gBACvCC,GAWO,oCACPC,EAA2B,kBCTpB,IAAKC,QACVA,EAAA,aAAe,iBACfA,EAAA,cAAgB,kBAChBA,EAAA,WAAa,eACbA,EAAA,iBAAmB,sBACnBA,EAAA,kBAAoB,uBACpBA,EAAA,eAAiB,oBACjBA,EAAA,YAAc,gBACdA,EAAA,UAAY,cACZA,EAAA,cAAgB,kBAChBA,EAAA,YAAc,eAVJA,QAAA,IAwGAC,QACVA,EAAA,oBAAsB,wBACtBA,EAAA,qBAAuB,0BACvBA,EAAA,kBAAoB,sBACpBA,EAAA,KAAO,OAJGA,QAAA,ID/EZ,IAAAC,EA2BO,yBEpDA,IAAMC,EAAsB,CAAC,WAAY,OAAO,EAEhD,SAASC,EAAyBC,EAA0BC,EAAsB,CACvF,OAAO,OAAO,YAAY,OAAO,QAAQD,CAAG,EAAE,OAAO,CAAC,CAACE,CAAG,IAAMD,EAAW,SAASC,CAAG,CAAC,CAAC,CAC3F,CAEO,SAASC,GAAsB,CACpC,KAAAC,EACA,MAAAC,EACA,WAAAJ,CACF,EAIG,CACD,IAAIK,EAAQF,IAAS,QAAUC,EAAQ,KAEvC,OAAIC,IAASL,GAAA,MAAAA,EAAY,SACvBK,EAAQP,EAAyBO,EAAO,CAAC,GAAGR,EAAqB,GAAGG,EAAW,KAAK,CAAC,GAGhFK,CACT,CAEO,SAASC,GAAwBC,EAAyC,CAC/E,OAAOA,EAAS,IAAKC,GAAY,CA7BnC,IAAAC,EA8BI,OAAQD,EAAQ,KAAM,CACpB,IAAK,QACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,OACN,QAASE,EAAkBC,EAAsBH,EAAQ,OAAO,CAAC,CACnE,EACF,IAAK,KACH,IAAMI,EAAUD,EAAsBH,EAAQ,OAAO,EACrD,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,YACN,QAASI,EAAUF,EAAkBE,CAAO,EAAI,GAChD,WAAWH,EAAAD,EAAQ,aAAR,YAAAC,EAAoB,IAAKI,IAAQ,CAC1C,GAAIA,EAAG,GACP,KAAM,WACN,SAAU,CACR,KAAMA,EAAG,KACT,UAAW,KAAK,UAAUA,EAAG,IAAI,CACnC,CACF,GACF,EACF,IAAK,SACH,MAAO,CACL,GAAIL,EAAQ,GACZ,KAAM,SACN,QAASE,EAAkBC,EAAsBH,EAAQ,OAAO,CAAC,CACnE,EACF,IAAK,OACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,OACN,QAASE,EAAkBC,EAAsBH,EAAQ,OAAO,CAAC,EACjE,WAAYA,EAAQ,YACtB,EACF,QACE,MAAM,IAAI,MAAM,wDAAwD,CAC5E,CACF,CAAC,CACH,CAEO,SAASM,EAAwBP,EAAyC,CAC/E,OAAOA,EAAS,IAAI,CAACC,EAASO,IAAU,CAxE1C,IAAAN,EAAAO,EAyEI,OAAQR,EAAQ,KAAM,CACpB,IAAK,OACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAMA,EAAQ,KACd,QAASA,EAAQ,QACjB,KAAM,OACR,EACF,IAAK,YACH,MAAO,CACL,GAAIA,EAAQ,GACZ,KAAM,KACN,KAAMA,EAAQ,KACd,SAASC,EAAAD,EAAQ,UAAR,KAAAC,EAAmB,GAC5B,aAAaO,EAAAR,EAAQ,YAAR,KAAAQ,EAAqB,CAAC,GAAG,IAAKH,IAAkB,CAC3D,GAAIA,EAAG,GACP,KAAMA,EAAG,SAAS,KAClB,KAAM,KAAK,MAAMA,EAAG,SAAS,SAAS,EACtC,KAAM,WACR,EAAE,CACJ,EACF,IAAK,SACH,MAAO,CACL,GAAIL,EAAQ,GACZ,KAAMA,EAAQ,KACd,QAASA,EAAQ,QACjB,KAAM,QACR,EACF,IAAK,OACH,MAAO,CACL,QAASA,EAAQ,QACjB,KAAMA,EAAQ,KACd,KAAMA,EAAQ,KACd,aAAcA,EAAQ,WACtB,GAAIA,EAAQ,EACd,EACF,QACE,cAAQ,MAAM,gBAAgBA,EAAQ,IAAI,qBAAqB,EACzD,IAAI,MAAM,gCAAgC,CACpD,CACF,CAAC,CACH,CAEA,SAASE,EAAkBO,EAAW,CACpC,OAAI,OAAOA,GAAS,SAAiBA,EAC9B,KAAK,UAAUA,CAAI,CAC5B,CAEO,SAASC,GAAwBC,EAA2C,CAzHnF,IAAAV,EAAAO,EAAAI,EAAAC,EAAAC,EA0HE,IAAMV,GAAUH,EAAAU,EAAU,QAAV,YAAAV,EAAiB,QAGjC,GAAIG,GAAW,MAAM,QAAQA,CAAO,GAAKA,EAAQ,QAAUA,EAAQ,CAAC,EAClE,OAAKA,EAAQ,CAAC,EAAE,SACT,CACL,KAAMA,EAAQ,CAAC,EAAE,SACjB,KAAM,OACN,MAAOA,EAAQ,CAAC,EAAE,KACpB,EALiC,KASnC,IAAIS,GAAAD,GAAAJ,EAAAG,EAAU,MAAM,oBAAhB,YAAAH,EAAmC,YAAnC,YAAAI,EAA8C,UAA9C,MAAAC,EAAwD,GAAI,CAC9D,IAAME,GAAOD,EAAAH,EAAU,MAAM,oBAAhB,YAAAG,EAAmC,UAAU,QAAQ,GAClE,MAAI,CAACC,GAAQ,CAACA,EAAK,KAAa,KACzB,CACL,KAAM,OACN,KAAMA,EAAK,KACX,MAAOA,EAAK,KACd,CACF,CAEA,OAAO,IACT,CAEO,SAASZ,EAAsBC,EAAsD,CApJ5F,IAAAH,EAqJE,GAAI,CAACG,EAAS,OAAO,KAErB,GAAI,OAAOA,GAAY,SACrB,OAAOA,EAGT,GAAI,MAAM,QAAQA,CAAO,GAAKA,EAAQ,OAAQ,CAC5C,IAAMY,GAAcf,EAAAG,EAAQ,KAAKa,GAAKA,EAAE,OAAS,MAAM,IAAnC,YAAAhB,EAAsC,KAC1D,OAAOe,GAAA,KAAAA,EAAe,IACxB,CAEA,OAAO,IACT,CF7CO,IAAME,EAAN,MAAMC,UAAuB,eAAc,CAchD,YAAYC,EAA8B,CAlI5C,IAAAC,EAAAC,EAmII,MAAMF,CAAM,EAJd,wBAA+BG,EAK7B,KAAK,OAASH,EACd,KAAK,kBAAoB,CAAC,EAC1B,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUA,EAAO,QACtB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,gBAAkB,KACvB,KAAK,QACHE,EAAAF,GAAA,YAAAA,EAAQ,SAAR,KAAAE,EACA,IAAI,GAAAE,OAAgB,CAClB,OAAQJ,EAAO,cACf,OAAQA,EAAO,gBACf,eAAgBK,EAAA,IAAMJ,EAAAD,EAAO,kBAAP,KAAAC,EAA0B,CAAC,EACnD,CAAC,CACL,CAEO,OAAQ,CACb,OAAO,IAAIF,EAAe,KAAK,MAAM,CACvC,CAEA,cAAcO,EAAwB,CACpC,YAAK,WAAW,KAAKA,CAAK,EACnB,EACT,CAEA,IAAIC,EAAsB,CACxB,OAAO,IAAI,cAA6BC,IACtC,KAAK,eAAeD,EAAOC,CAAU,EAC9B,IAAM,CAAC,EACf,CACH,CAEA,MAAM,eAAeD,EAA8BC,EAAyC,CAnK9F,IAAAP,EAAAC,EAAAO,EAoKI,KAAK,UAAY,CACf,GAAIF,EAAM,MACV,SAAUA,EAAM,SAChB,qBAAsB,EACxB,EACA,KAAK,WAAaC,EACb,KAAK,YACR,KAAK,UAAY,MAAM,KAAK,aAAa,GAE3C,IAAME,GAAWT,EAAAM,EAAM,WAAN,KAAAN,KAAkB,cAAW,EACxCU,GACJF,GAAAP,EAAAK,EAAM,iBAAN,YAAAL,EAAsB,aAAtB,KAAAO,EAAqC,CAAC,SAAU,SAAU,SAAS,EAC/DG,EAAiB,MAAM,KAAK,cAAcC,EAAAR,EAAA,GAAKE,GAAL,CAAY,SAAAG,CAAS,GAAGC,CAAU,EAElF,GAAI,CAACC,EACH,OAAOJ,EAAW,MAAM,yBAAyB,EAGnD,MAAM,KAAK,mBAAmBI,EAAgBF,EAAUF,EAAYD,EAAO,MAAM,QAAQI,CAAU,EAAIA,EAAa,CAACA,CAAU,CAAC,CAClI,CAEA,MAAM,wBAAwBJ,EAAwBI,EAAuC,CAzL/F,IAAAV,EAAAC,EAAAO,EA0LI,GAAM,CAAE,SAAAC,EAAU,kBAAAI,CAAkB,EAAIP,EAElCQ,EAAuB,MAAM,KAAK,uBACtCD,EAAmB,GACnBJ,CACF,EAKA,GAJK,KAAK,YACR,KAAK,UAAY,MAAM,KAAK,aAAa,GAGvC,CAACK,EACH,OAAO,KAAK,WAAW,MAAM,iCAAiC,EAGhE,IAAMC,EAAO,MAAM,KAAK,OAAO,QAAQ,YAAYN,EAAU,CAC3D,OAAQ,KAAK,2BAA2BK,EAAqB,OAAQ,CAAC,EAAGR,CAAK,EAC9E,aAAcQ,EAAqB,WAAW,cAC9C,QAAQb,GAAAD,EAAAc,EAAqB,OAArB,YAAAd,EAA4B,KAA5B,KAAAC,EAAkC,WAC5C,CAAC,EAEKe,EAAUJ,EAAAR,EAAA,IACVI,EAAAF,EAAM,iBAAN,KAAAE,EAAwB,CAAC,GADf,CAEd,MAAO,KAAK,2BACVM,EAAqB,OACrB,CAACD,CAAiB,EAClBP,CACF,EAEA,aAAcS,EAAK,WAAW,cAC9B,WAAAL,CACF,GACA,MAAO,CACL,eAAgB,KAAK,OAAO,KAAK,OAAOD,EAAU,KAAK,UAAU,aAAcO,CAAO,EACtF,MAAOF,EACP,WAAAJ,CACF,CACF,CAEA,MAAM,cAAcJ,EAA8BI,EAAuC,CAhO3F,IAAAV,EAAAC,EAAAO,EAAAS,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAiOI,GAAI,CACF,SAAUC,EACV,MAAOC,EACP,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,eAAAC,CACF,EAAIvB,EAGJ,KAAK,UAAW,qBAAuB,KAEvC,IAAMwB,EAAgBD,GAAA,YAAAA,EAAgB,SAChCpB,EAAWe,GAAA,KAAAA,KAAiB,cAAW,EAExC,KAAK,YACR,KAAK,UAAY,MAAM,KAAK,aAAa,GAG3C,IAAMO,EAAS,MAAM,KAAK,kBAAkBtB,EAAUoB,GAAA,YAAAA,EAAgB,cAAc,EACpF,KAAK,UAAW,SAAWE,EAAO,UAElC,IAAMC,GACHhC,EAAA,MAAM,KAAK,OAAO,QAAQ,SAAS+B,EAAO,SAAS,IAAnD,KAAA/B,EACA,CAAE,OAAQ,CAAC,CAAE,EACViC,GAAqBhC,EAAA+B,EAAW,OAAO,WAAlB,KAAA/B,EAA8B,CAAC,EACpDiC,EAA2BC,EAAwBT,CAAQ,EAC3DU,EAAkB,KAAK,2BAC3BxB,EAAAR,EAAA,GAAKqB,GAAL,CAAiB,SAAUQ,CAAmB,GAC9CC,EACA5B,CACF,EAEI+B,EAAczB,EAAAR,EAAA,GACb4B,GADa,CAEhB,OAAQpB,EAAAR,EAAA,GACHgC,GADG,CAEN,SAAU,CAAC,GAAGH,EAAoB,IAAIzB,EAAA4B,EAAgB,WAAhB,KAAA5B,EAA4B,CAAC,CAAE,CACvE,EACF,GACI8B,EAAcD,EAAY,OAG9B,GAFA,KAAK,UAAW,WAAa,MAAM,KAAK,cAAc,IAGnDpB,EAAAe,EAAW,OAAO,WAAlB,KAAAf,EAA8B,CAAC,GAAG,OAASS,EAAS,OAAQa,GAAMA,EAAE,OAAS,QAAQ,EAAE,OACxF,CACA,IAAIC,EAA2C,KAE/C,QAASC,EAAIf,EAAS,OAAS,EAAGe,GAAK,EAAGA,IACxC,GAAIf,EAASe,CAAC,EAAE,OAAS,OAAQ,CAC/BD,EAAkBL,EAAwB,CAACT,EAASe,CAAC,CAAC,CAAC,EAAE,CAAC,EAC1D,KACF,CAGF,OAAKD,EAIE,KAAK,wBACV5B,EAAAR,EAAA,GAAKE,GAAL,CAAY,kBAAmBkC,CAAgB,GAC/C9B,CACF,EANS,KAAK,WAAW,MAAM,iDAAiD,CAOlF,CACA,KAAK,UAAW,UAAY,MAAM,KAAK,OAAO,WAAW,SAAS,KAAK,UAAU,YAAY,EAE7F,IAAMgC,EACJ,GAACxB,EAAAW,GAAA,YAAAA,EAAgB,UAAhB,MAAAX,EAAyB,SAC1BT,GACA,KAAK,UAAW,UAAY,WAC5B,KAAK,UAAW,SACZ,WACA,QAEN,GAAIiC,IAAS,WAAY,CACvB,IAAMC,EAAa,KAAK,UAAW,UAAU,MAAM,KAChDC,GAAMA,EAAE,SAAW,KAAK,UAAW,QACtC,EACA,MAAM,KAAK,OAAO,QAAQ,YAAYnC,EAAU,CAC9C,OAAQgB,EACR,OAAQkB,GAAA,YAAAA,EAAY,MACtB,CAAC,CACH,CAEA,IAAME,EAAeC,GAAsB,CACzC,KAAAJ,EACA,MAAOJ,EACP,WAAY,KAAK,UAAW,UAC9B,CAAC,EAEGS,EACEC,EAAiB,CAAC,KAAK,gBAAiBnB,GAAA,YAAAA,EAAgB,MAAM,EAAE,OACpE,OACF,EACImB,EAAe,SACjBD,EAAgB,MAAM,KAAK,aAAa,CACtC,QAASC,EACT,UAAW,KAAK,UAChB,WAAY,KAAK,UAAW,UAC9B,CAAC,GAEH,IAAMhC,EAAUJ,EAAAR,EAAA,GACXyB,GADW,CAEd,WAAAnB,EACA,MAAOmC,EACP,OAAQE,EACR,QAAS3C,IAAA,GACJwB,IACCT,EAAA4B,GAAA,YAAAA,EAAe,eAAf,KAAA5B,EAA+B,CAAC,EAExC,GAGM8B,GAAc3B,GAAAD,GAAAD,EAAAY,EAAW,QAAX,YAAAZ,EAAmB,KAAnB,YAAAC,EAAuB,aAAvB,KAAAC,EAAqC,CAAC,EAC1D,OAAI2B,GAAA,MAAAA,EAAY,QAAU,GAAC1B,EAAAM,GAAA,YAAAA,EAAgB,UAAhB,MAAAN,EAAyB,SAClD,KAAK,cAAc,CACjB,KAAM,YAAU,YAChB,SAAAd,EACA,MAAOH,EAAM,KACf,CAAC,EACD,KAAK,iBAAiBwB,CAAa,EAEnCmB,EAAW,QAASC,GAAc,CAChC,KAAK,cAAc,CACjB,KAAM,YAAU,OAChB,oBACA,MACE,OAAOA,EAAU,OAAU,SAAWA,EAAU,MAAQ,KAAK,UAAUA,EAAU,KAAK,EACxF,SAAUA,CACZ,CAAC,CACH,CAAC,EAED,KAAK,cAAc,CACjB,KAAM,YAAU,aAChB,SAAAzC,EACA,MAAOH,EAAM,KACf,CAAC,EACM,KAAK,WAAW,SAAS,GAG3B,CAEL,eAAgB,KAAK,OAAO,KAAK,OAAOG,EAAU,KAAK,UAAU,aAAcO,CAAO,EACtF,MAAOqB,CACT,CACF,CAEA,MAAM,mBACJc,EAGA1C,EACAF,EACAD,EACA8C,EACA,CA5XJ,IAAApD,EAAAC,EAAAO,EAAAS,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA6XI,GAAM,CAAE,eAAAM,CAAe,EAAIvB,EACrBwB,EAAgBD,GAAA,YAAAA,EAAgB,SACtC,KAAK,WAAatB,EAClB,IAAI8C,EAAa,GACjB,GAAI,CAACF,EAAQ,OAEb,GAAI,CAAE,eAAAG,EAAgB,MAAAC,CAAM,EAAIJ,EAEhC,KAAK,UAAW,aAAe,KAC/B,IAAIK,EAAoB,CAAC,EACrBC,EAAeF,EAEnB,GAAI,CACF,KAAK,cAAc,CACjB,KAAM,YAAU,YAChB,SAAA9C,EACA,MAAO,KAAK,UAAW,EACzB,CAAC,EACD,KAAK,iBAAiBqB,CAAa,EAEnC,YAAA4B,EAAAC,GAAsCL,GAAtCM,EAAAC,EAAAC,EAAAF,EAAA,EAAAC,EAAA,MAAAH,EAAA,aAAAE,EAAA,GAAsD,CAA3C,IAAIG,EAAfF,EAAA,MACE,IAAMG,GAAyBhE,EAAAM,EAAM,iBAAN,YAAAN,EAAsB,gBAC/CiE,EACJD,IACCD,EAAoB,MAAM,WAAW,QAAQ,GAC5CA,EAAoB,MAAM,WAAW,QAAQ,GAGjD,GAAI,CAACX,EAAY,SAASW,EAAoB,KAAmB,GAAK,CAACE,GAAoBF,EAAoB,QAAU,QACvH,SAWF,IAAMG,EAAQH,EAEd,GAAIA,EAAoB,QAAU,QAAS,CACzC,KAAK,cAAc,CACjB,KAAM,YAAU,UAChB,QAASA,EAAoB,KAAK,QAClC,SAAUA,CACZ,CAAC,EACD,KACF,CAEA,GAAIA,EAAoB,QAAU,UAChC,SAGF,GAAIA,EAAoB,QAAU,SAAU,CAC1CP,EAAoBU,EAAM,KAC1B,QACF,SAAWF,GAA0BE,EAAM,MAAM,WAAW,SAAS,EAAG,CACtEV,EAAoBpD,IAAA,GACfoD,GACAU,EAAM,MAEX,QACF,CAEA,IAAMC,EAAYD,EAAM,KAClBE,GAAWnE,EAAAkE,EAAU,WAAV,KAAAlE,EAAsB,CAAC,EAClCoE,EAAkBD,EAAS,eAC3BE,GAAYH,EAAU,MA4B5B,GA1BA,KAAK,UAAW,GAAKC,EAAS,OAE1BC,GAAmBA,IAAoB,KAAK,UAAW,UACzD,KAAK,iBAAiBA,CAAe,EAGvChB,EACEA,GACCiB,KAAc,mBACbH,EAAU,OAAS,OAEvB,KAAK,UAAW,YACd,KAAK,UAAW,WAAaE,GAC7BC,KAAc,eACZ,KAAK,UAAW,cAClB,KAAK,UAAW,qBAAuB,OAKrC9D,EAAA,KAAK,UAAW,YAAhB,MAAAA,EAA4B,MAAS,KAAM+D,IAASA,GAAK,KAAOF,IAClE,KAAK,iBAAiBA,CAAe,EAGvCZ,EAAa,QAASxC,EAAA,KAAK,UAAW,uBAAhB,KAAAA,EAAwCuC,EAE1D,CAAC,KAAK,UAAW,SACnB,UAGmB,KAAK,UAAUC,CAAY,IAAM,KAAK,UAAUF,CAAK,GAItE,KAAK,UAAW,cAAgB,KAAK,UAAW,UAChD,KAAK,UAAW,cAClB,CAAS,KAAK,qBAAqB,KAAK,UAAW,EAAE,IAErDA,EAAQE,EACR,KAAK,UAAW,aAAe,KAAK,UAAW,SAE/C,KAAK,cAAc,CACjB,KAAM,YAAU,eAChB,SAAU,KAAK,iBAAiBF,CAAK,EACrC,SAAUW,CACZ,CAAC,GAGH,KAAK,cAAc,CACjB,KAAM,YAAU,IAChB,MAAOC,CACT,CAAC,EAED,KAAK,kBAAkBA,CAAS,CAClC,QAzGAN,EAjZN,CAiZMC,EAAA,CAAAD,UAAA,KAAAD,IAAAC,EAAAH,EAAA,eAAAG,EAAA,KAAAH,UAAA,IAAAI,EAAA,MAAAA,EAAA,IA2GAP,EAAQ,MAAM,KAAK,OAAO,QAAQ,SAAS9C,CAAQ,EACnD,IAAM+D,EAAQjB,EAAM,MACdN,GAAc9B,GAAAD,EAAAsD,GAAA,YAAAA,EAAQ,KAAR,YAAAtD,EAAY,aAAZ,KAAAC,EAA0B,CAAC,EACzCsD,EAAYlB,EAAM,KAAK,SAAW,EAClCmB,GAASrD,GAAAD,EAAAmC,EAAM,WAAN,YAAAnC,EAAgB,SAAhB,KAAAC,EAA0B,CAAC,EAGtCsD,EAAc,KAAK,UAAW,SAElC,OAAK1B,GAAA,MAAAA,EAAY,SACf0B,EAAcF,EAAY,WAAanD,EAAAiC,EAAM,KAAK,CAAC,IAAZ,KAAAjC,EAAiB,OAAO,KAAKoD,CAAM,EAAE,CAAC,GAG/EzB,EAAW,QAASC,GAAc,CAChC,KAAK,cAAc,CACjB,KAAM,YAAU,OAChB,oBACA,MACE,OAAOA,EAAU,OAAU,SAAWA,EAAU,MAAQ,KAAK,UAAUA,EAAU,KAAK,EACxF,SAAUA,CACZ,CAAC,CACH,CAAC,EAED,KAAK,iBAAiByB,CAAW,EAEjC,KAAK,iBAAiB,MAAS,EAE/B,KAAK,cAAc,CACjB,KAAM,YAAU,eAChB,SAAU,KAAK,iBAAiBpB,CAAK,CACvC,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,kBAChB,SAAUqB,IAAyBrD,EAAAgC,EAAM,OAA+B,WAArC,KAAAhC,EAAiD,CAAC,CAAC,CACxF,CAAC,EAED,KAAK,cAAc,CACjB,KAAM,YAAU,aAChB,SAAAd,EACA,MAAO,KAAK,UAAW,EACzB,CAAC,EACD,KAAK,UAAY,OACVF,EAAW,SAAS,CAC7B,OAASqC,EAAG,CACV,OAAOrC,EAAW,MAAMqC,CAAC,CAC3B,CACF,CAEA,kBAAkBvC,EAAkB,CA5iBtC,IAAAL,EAAAC,EAAAO,EAAAS,EAAAC,EAAAC,EAAAC,EA6iBI,OAAQf,EAAM,MAAO,CACnB,2BACE,IAAIwE,GAAqB7E,EAAAK,EAAM,SAAS,eAAe,IAA9B,KAAAL,EAAmC,GACxD8E,GAAsB7E,EAAAI,EAAM,SAAS,iBAAiB,IAAhC,KAAAJ,EAAqC,GAE/D,GAAII,EAAM,KAAK,MAAM,kBAAkB,cAAe,OACtD,IAAI0E,EAAgB,KAAK,qBAAqB,KAAK,UAAW,EAAE,EAC1DC,EAAmB,GAAQD,GAAA,MAAAA,EAAe,IAC1CE,GAAezE,EAAAH,EAAM,KAAK,MAAM,mBAAjB,YAAAG,EAAoC,GACnD0E,GAA6BjE,EAAAZ,EAAM,SAAS,gBAAf,YAAAY,EAAiC,KACjEkE,GAAuCA,EAAiB,QAASF,GAAA,YAAAA,EAAc,OAG5EG,EAAuB,CAACJ,IAAoBC,GAAA,YAAAA,EAAc,MAC1DI,EACJL,IAAoBD,GAAA,YAAAA,EAAe,cAAcE,GAAA,YAAAA,EAAc,MAC3DK,EAAqBN,IAAoBD,GAAA,YAAAA,EAAe,aAAc,CAACE,GAEzEK,GAAsBD,GAAuBD,KAC/C,KAAK,UAAW,qBAAuB,IAGzC,IAAMG,EAAgBC,GAAwBnF,EAAM,IAAI,EAClDoF,EAAiBC,EAAsBrF,EAAM,KAAK,MAAM,OAAO,EAC/DsF,EAAwB,GAAQ,CAACV,GAAgBQ,GAEjDG,EACJZ,GAAoB,EAACD,GAAA,MAAAA,EAAe,aAAc,CAACY,EAErD,GAAIJ,EAAe,CACjB,KAAK,oBAAoBA,CAAa,EACtC,KACF,CAoBA,GAlBI,CAACA,GAAiB,KAAK,kBACzB,KAAK,cAAc,CACjB,KAAM,YAAU,yBAClB,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,YAClB,CAAC,EACD,KAAK,gBAAkB,MAGrBL,GACF,KAAK,cAAc,CACjB,KAAM,YAAU,OAChB,KAAM,eACN,MAAO7E,EAAM,SAAS,aACxB,CAAC,EAGCiF,EAAoB,CACL,KAAK,cAAc,CAClC,KAAM,YAAU,cAChB,WAAYP,GAAA,YAAAA,EAAe,WAC3B,SAAU1E,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CAEA,GAAIuF,EAAmB,CACJ,KAAK,cAAc,CAClC,KAAM,YAAU,iBAChB,UAAWb,EAAe,GAC1B,SAAU1E,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CAEA,GAAI+E,GAAwBN,EAAqB,CAC9B,KAAK,cAAc,CAClC,KAAM,YAAU,gBAChB,WAAYG,EAAa,GACzB,aAAcA,EAAa,KAC3B,gBAAiB5E,EAAM,KAAK,MAAM,GAClC,SAAUA,CACZ,CAAC,GAEC,KAAK,qBAAqB,KAAK,UAAW,GAAI,CAC5C,GAAIA,EAAM,KAAK,MAAM,GACrB,WAAY4E,EAAa,GACzB,aAAcA,EAAa,IAC7B,CAAC,EAEH,KACF,CAGA,GAAII,GAAuBP,EAAqB,CAC9C,KAAK,cAAc,CACjB,KAAM,YAAU,eAChB,WAAYC,GAAA,YAAAA,EAAe,WAC3B,MAAOE,EAAa,KACpB,SAAU5E,CACZ,CAAC,EACD,KACF,CAGA,GAAIsF,GAAyBd,EAAoB,CAE1CE,IACH,KAAK,cAAc,CACjB,KAAM,YAAU,mBAChB,KAAM,YACN,UAAW1E,EAAM,KAAK,MAAM,GAC5B,SAAUA,CACZ,CAAC,EACD,KAAK,qBAAqB,KAAK,UAAW,GAAI,CAC5C,GAAIA,EAAM,KAAK,MAAM,GACrB,WAAY,KACZ,aAAc,IAChB,CAAC,EACD0E,EAAgB,KAAK,qBAAqB,KAAK,UAAW,EAAE,GAG9D,KAAK,cAAc,CACjB,KAAM,YAAU,qBAChB,UAAWA,EAAe,GAC1B,MAAOU,EACP,SAAUpF,CACZ,CAAC,EACD,KACF,CAEA,MACF,wBACE,IAAIa,EAAA,KAAK,qBAAqB,KAAK,UAAW,EAAE,IAA5C,MAAAA,EAA+C,WAAY,CAC5C,KAAK,cAAc,CAClC,KAAM,YAAU,cAChB,WAAY,KAAK,qBAAqB,KAAK,UAAW,EAAE,EAAG,WAC3D,SAAUb,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CACA,IAAIc,EAAA,KAAK,qBAAqB,KAAK,UAAW,EAAE,IAA5C,MAAAA,EAA+C,GAAI,CACpC,KAAK,cAAc,CAClC,KAAM,YAAU,iBAChB,UAAW,KAAK,qBAAqB,KAAK,UAAW,EAAE,EAAG,GAC1D,SAAUd,CACZ,CAAC,IAEC,KAAK,kBAAkB,KAAK,UAAW,EAAE,EAAI,MAE/C,KACF,CACA,MACF,sBACE,GAAIA,EAAM,OAAS,wBAAsC,CACvD,KAAK,cAAc,CACjB,KAAM,YAAU,mBAChB,KAAM,YACN,UAAWA,EAAM,KAAK,WACtB,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,qBAChB,UAAWA,EAAM,KAAK,WACtB,MAAOA,EAAM,KAAK,QAClB,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,iBAChB,UAAWA,EAAM,KAAK,WACtB,SAAUA,CACZ,CAAC,EACD,KACF,CAEA,GAAIA,EAAM,OAAS,0BAAuC,CACxD,KAAK,cAAc,CACjB,KAAM,YAAU,gBAChB,WAAYA,EAAM,KAAK,GACvB,aAAcA,EAAM,KAAK,KACzB,gBAAiBA,EAAM,KAAK,GAC5B,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,eAChB,WAAYA,EAAM,KAAK,GACvB,MAAOA,EAAM,KAAK,KAClB,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,cAChB,WAAYA,EAAM,KAAK,GACvB,SAAUA,CACZ,CAAC,EACD,KACF,CAEIA,EAAM,OAAS,wBACjB,KAAK,UAAW,qBAAuBA,EAAM,KAC7C,KAAK,cAAc,CACjB,KAAM,YAAU,eAChB,SAAU,KAAK,iBAAiB,CAC9B,OAAQ,KAAK,UAAW,oBAC1B,CAAuB,EACvB,SAAUA,CACZ,CAAC,GAGH,KAAK,cAAc,CACjB,KAAM,YAAU,OAChB,KAAMA,EAAM,KACZ,MAAOA,EAAM,KACb,SAAUA,CACZ,CAAC,EACD,MACF,kBACE,IAAMwF,GAAiBzE,EAAAf,EAAM,OAAN,YAAAe,EAAY,OAC9B,KAAK,UAAW,uBACnB,KAAK,cAAc,CACjB,KAAM,YAAU,gBAChB,WAAYyE,EAAe,aAC3B,aAAcA,EAAe,KAC7B,gBAAiBA,EAAe,GAChC,SAAUxF,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,eAChB,WAAYwF,EAAe,aAC3B,MAAO,KAAK,UAAUxF,EAAM,KAAK,KAAK,EACtC,SAAUA,CACZ,CAAC,EACD,KAAK,cAAc,CACjB,KAAM,YAAU,cAChB,WAAYwF,EAAe,aAC3B,SAAUxF,CACZ,CAAC,GAEH,KAAK,cAAc,CACjB,KAAM,YAAU,iBAChB,WAAYwF,EAAe,aAC3B,QAASA,GAAA,YAAAA,EAAgB,QACzB,aAAW,cAAW,EACtB,KAAM,MACR,CAAC,EACD,KACJ,CACF,CAEA,oBAAoBN,EAAmC,CAzyBzD,IAAAvF,EA0yBI,GAAI,CAACuF,GAAiB,CAACA,EAAc,MAAQ,CAACA,EAAc,KAC1D,OAGF,IAAMO,EAAoBP,EAAc,OAEpCvF,EAAA,KAAK,kBAAL,MAAAA,EAAsB,OAAS,KAAK,gBAAgB,QAAU8F,IAC5D,KAAK,gBAAgB,MACvB,KAAK,cAAc,CACjB,KAAM,YAAU,yBAClB,CAAC,EAEH,KAAK,cAAc,CACjB,KAAM,YAAU,YAClB,CAAC,EACD,KAAK,gBAAkB,MAGpB,KAAK,kBAER,KAAK,cAAc,CACjB,KAAM,YAAU,cAClB,CAAC,EACD,KAAK,gBAAkB,CACrB,MAAOA,CACT,GAGE,KAAK,gBAAgB,OAASP,EAAc,OAC9C,KAAK,cAAc,CACjB,KAAM,YAAU,2BAClB,CAAC,EACD,KAAK,gBAAgB,KAAOA,EAAc,MAGxC,KAAK,gBAAgB,MACvB,KAAK,cAAc,CACjB,KAAM,YAAU,8BAChB,MAAOA,EAAc,IACvB,CAAC,CAEL,CAEA,iBAAiBlD,EAAiC,CAChD,IAAIkB,EAAQlB,EAAY,OAClB0D,EAAa,KAAK,UAAW,WAEnC,OAAIA,GAAA,MAAAA,EAAY,SACdxC,EAAQyC,EAAyBzC,EAAO,CAAC,GAAG,KAAK,mBAAoB,GAAGwC,EAAW,MAAM,CAAC,GAGrFxC,CACT,CAEA,MAAM,kBAAkB9C,EAAkBwF,EAAuD,CAC/F,IAAIlE,EACJ,GAAI,CACF,GAAI,CACFA,EAAS,MAAM,KAAK,UAAUtB,CAAQ,CACxC,OAASqD,EAAO,CACd/B,EAAS,MAAM,KAAK,aAAa,CAC/B,SAAAtB,EACA,SAAUwF,CACZ,CAAC,CACH,CACF,OAASnC,EAAgB,CACvB,MAAM,IAAI,MAAM,4BAA6BA,EAAgB,OAAO,EAAE,CACxE,CAEA,OAAO/B,CACT,CAEA,MAAM,UAAUtB,EAAkB,CAChC,OAAO,KAAK,OAAO,QAAQ,IAAIA,CAAQ,CACzC,CAEA,MAAM,aAAaO,EAA4D,CAC7E,OAAO,KAAK,OAAO,QAAQ,OAAOA,CAAO,CAC3C,CAEA,MAAM,aAAa,CACjB,QAAAkF,EACA,UAAAC,EACA,WAAAJ,CACF,EAIG,CACD,OAAOG,EAAQ,OAAO,CAACE,EAAKC,IAAQ,CAn4BxC,IAAArG,EAo4BM,IAAIsG,EAAuBF,EAAI,aAE3BC,EAAI,eACNC,EAAuBP,GAAA,MAAAA,EAAY,OAC/BC,EAAyBK,GAAA,YAAAA,EAAK,aAAc,CAC1C,GAAG,KAAK,mBACR,IAAIrG,EAAA+F,GAAA,YAAAA,EAAY,SAAZ,KAAA/F,EAAsB,CAAC,CAC7B,CAAC,EACDqG,GAAA,YAAAA,EAAK,cAGX,IAAME,EAAY3F,EAAAR,IAAA,GACbgG,GACAC,GAFa,CAGhB,aAAcC,CAChB,GAGME,EACJJ,EAAI,iBAAmB,MAAQC,EAAI,kBAAoB,GAEnDI,EAAsB,KAAK,UAAUF,CAAS,IAAM,KAAK,UAAUH,CAAG,EAGtEM,EACJF,GACA,KAAK,UAAU5F,EAAAR,EAAA,GAAKmG,GAAL,CAAgB,gBAAiB,IAAK,EAAC,IACpD,KAAK,UAAU3F,EAAAR,EAAA,GAAKgG,GAAL,CAAU,gBAAiB,IAAK,EAAC,EAEpD,OAAIK,GAAuB,CAACC,EACnBtG,IAAA,GACFgG,GACAG,GAIAH,CACT,EAAGD,EAAU,MAAM,CACrB,CAEA,qBAAqBQ,EAAe,CAClC,OAAO,KAAK,kBAAkBA,CAAK,CACrC,CAEA,qBAAqBA,EAAeC,EAAyB,CAC3D,KAAK,kBAAoBhG,EAAAR,EAAA,GACpB,KAAK,mBADe,CAEvB,CAACuG,CAAK,EAAGvG,IAAA,GACH,KAAK,kBAAkBuG,CAAK,GAC7BC,EAEP,EACF,CAEA,MAAM,cAAmC,CACvC,IAAMC,EAAa,MAAM,KAAK,OAAO,WAAW,OAAO,EACjDC,EAAqBD,EAAW,KACnCE,GAAiBA,EAAa,WAAa,KAAK,OACnD,EACA,GAAI,CAACD,EACH,cAAQ,MAAM;AAAA,qCACiB,KAAK,OAAO;AAAA;AAAA;AAAA,yCAERD,EAAW,IAAKG,GAAM,GAAGA,EAAE,QAAQ,SAASA,EAAE,YAAY,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,OAC3G,EACK,IAAI,MAAM,mBAAmB,EAGrC,OAAOF,CACT,CAEA,MAAM,eAAqC,CA38B7C,IAAA9G,EAAAC,EAAAO,EAAAS,EA48BI,GAAI,CACF,IAAMgG,EAAc,MAAM,KAAK,OAAO,WAAW,WAAW,KAAK,UAAW,YAAY,EACpFC,EAAe,KACfC,EAA0B,CAAC,EAO/B,GANI,mBAAoBF,KAAejH,EAAAiH,EAAY,iBAAZ,MAAAjH,EAA4B,cACjEmH,EAAgB,OAAO,KAAKF,EAAY,eAAe,UAAU,IAE/DhH,EAAAgH,EAAY,gBAAZ,MAAAhH,EAA2B,aAC7BiH,EAAe,OAAO,KAAKD,EAAY,cAAc,UAAU,GAE7D,GAACzG,EAAAyG,EAAY,eAAZ,MAAAzG,EAA0B,aAAc,GAACS,EAAAgG,EAAY,gBAAZ,MAAAhG,EAA2B,YACvE,MAAO,CAAE,OAAQ,CAAC,EAAG,MAAO,KAAM,OAAQ,KAAM,QAASkG,CAAc,EAEzE,IAAMC,EAAc,OAAO,KAAKH,EAAY,aAAa,UAAU,EAC7DI,EAAe,OAAO,KAAKJ,EAAY,cAAc,UAAU,EAErE,MAAO,CACL,MACEG,GAAeA,EAAY,OAAS,CAAC,GAAGA,EAAa,GAAG,KAAK,kBAAkB,EAAI,KACrF,OACEC,GAAgBA,EAAa,OACzB,CAAC,GAAGA,EAAc,GAAG,KAAK,kBAAkB,EAC5C,KACN,QAASF,EACT,OAAQD,CACV,CACF,OAAStE,EAAG,CACV,MAAO,CAAE,OAAQ,CAAC,EAAG,MAAO,KAAK,mBAAoB,OAAQ,KAAK,mBAAoB,QAAS,CAAC,CAAE,CACpG,CACF,CAEA,2BAA2BW,EAAc7B,EAA8BpB,EAAsD,CA3+B/H,IAAAN,EAAAC,EA4+BQyB,EAAS,OAAS,GAAK,SAAUA,EAAS,CAAC,GAAKA,EAAS,CAAC,EAAE,OAAS,WAEvEA,EAAWA,EAAS,MAAM,CAAC,GAI7B,IAAM4F,EAA+C/D,EAAM,UAAY,CAAC,EAClEgE,EAAqB,IAAI,IAAID,EAAiB,IAAKE,GAAYA,EAAQ,EAAE,CAAC,EAE1EC,EAAc/F,EAAS,OAAQ8F,GAAY,CAACD,EAAmB,IAAIC,EAAQ,EAAE,CAAC,EAE9EE,EAA0C,CAAC,IAAI1H,EAAAuD,EAAM,QAAN,KAAAvD,EAAe,CAAC,EAAI,IAAIC,EAAAK,EAAM,QAAN,KAAAL,EAAe,CAAC,CAAE,EAAE,OAAO,CAACmG,EAAKuB,IAAS,CACrH,IAAIC,EAAaD,EAcjB,OAbKA,EAAK,OACRC,EAAa,CACT,KAAM,WACN,KAAMD,EAAK,KACX,SAAU,CACN,KAAMA,EAAK,KACX,YAAaA,EAAK,YAClB,WAAYA,EAAK,UACrB,CACJ,GAIEvB,EAAI,KAAMyB,GAA8BA,EAAE,OAASD,EAAW,MAASC,EAAE,SAAS,OAASD,EAAW,SAAS,IAAI,EAAUxB,EAE1H,CAAC,GAAGA,EAAKwB,CAAU,CAC5B,EAAG,CAAC,CAAC,EAEL,OAAOhH,EAAAR,EAAA,GACFmD,GADE,CAEL,SAAUkE,EACV,MAAOC,EACP,QAAS,CACP,MAAOA,EACP,QAASpH,EAAM,OACjB,CACF,EACF,CAEA,iBAAiBwH,EAA8B,CAthCjD,IAAA9H,EAAAC,EAuhCQ6H,IAAa,YACfA,EAAW,QAETA,MAAa9H,EAAA,KAAK,YAAL,YAAAA,EAAgB,aAE3BC,EAAA,KAAK,YAAL,MAAAA,EAAgB,UAClB,KAAK,QAAQ,EAGX6H,GACF,KAAK,UAAUA,CAAQ,GAG3B,KAAK,UAAW,SAAWA,CAC7B,CAEA,UAAUA,EAAkB,CAC1B,KAAK,cAAc,CACjB,KAAM,YAAU,aAChB,SAAUA,CACZ,CAAC,CACH,CAEA,SAAU,CACR,KAAK,cAAc,CACjB,KAAM,YAAU,cAChB,SAAU,KAAK,UAAW,QAC5B,CAAC,CACH,CAEA,MAAM,uBACJC,EACAtH,EACAuH,EAIsB,CA5jC1B,IAAAhI,EAAAQ,EA6jCI,IAAMyH,EAAUD,GAAA,MAAAA,EAAY,cACxB,CACE,WAAY,CAAE,cAAeA,EAAW,aAAc,CACxD,EACA,OAEEE,EAAW,CAAC,GADF,MAAM,KAAK,OAAO,QAAQ,WAAWzH,EAAUwH,CAAO,CAC1C,EAAE,QAAQ,EAElCE,EAAcD,EAAS,KAAM3E,GAAO,CArkC5C,IAAAvD,EAskCO,OAAAA,EAAAuD,EAAM,OAAiB,WAAvB,YAAAvD,EAAiC,KAAMuC,GAAgCA,EAAE,KAAOwF,GACnF,EAEA,GAAI,CAACI,EAAa,MAAM,IAAI,MAAM,mBAAmB,EAErD,IAAMC,GAAuBpI,EAAAmI,EAAY,OAAiB,WAA7B,KAAAnI,EAAyC,CAAC,EACjEqI,EAAeD,EAAoB,UACtC7F,GAAgCA,EAAE,KAAOwF,CAC5C,EAEA,GADsBK,EAAoB,MAAMC,EAAe,CAAC,EAC9C,OAChB,OAAO,KAAK,uBAAuBN,EAAWtH,EAAU0H,EAAY,iBAAiB,EAGvF,IAAMG,EAAmBJ,EAAS,QAAQC,CAAW,EAEKlI,EAAAkI,EAAY,OAA9D,UAAAzG,CAtlCZ,EAslC8DzB,EAArCsI,EAAAC,GAAqCvI,EAArC,CAAb,aACFwI,GAAqBjI,EAAA0H,EAASI,EAAmB,CAAC,IAA7B,KAAA9H,EAAkCI,EAAAR,EAAA,GAAK+H,GAAL,CAAkB,OAAQ,CAAC,CAAE,GAC1F,OAAOvH,EAAAR,EAAA,GACFqI,GADE,CAEL,OAAQrI,IAAA,GAAKqI,EAAmB,QAAWF,EAC7C,EACF,CACF,ED1lCO,IAAMG,EAAN,cAAiC,YAAU,CAAC","names":["index_exports","__export","CustomEventNames","LangGraphAgent","LangGraphEventTypes","LangGraphHttpAgent","__toCommonJS","import_client","import_rxjs","import_langgraph_sdk","import_node_crypto","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","_LangGraphAgent","config","_a","_b","DEFAULT_SCHEMA_KEYS","LangGraphClient","__spreadValues","event","input","subscriber","_c","threadId","streamMode","preparedStream","__spreadProps","messageCheckpoint","timeTravelCheckpoint","fork","payload","_d","_e","_f","_g","_h","_i","_j","inputThreadId","inputState","messages","tools","context","forwardedProps","nodeNameInput","thread","agentState","agentStateMessages","inputMessagesToLangchain","aguiMessagesToLangChain","stateValuesDiff","threadState","stateValues","m","lastUserMessage","i","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","interrupts","interrupt","stream","streamModes","shouldExit","streamResponse","state","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","subgraphsStreamEnabled","isSubgraphStream","chunk","chunkData","metadata","currentNodeName","eventType","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","toolCallOutput","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","newMessages","langGraphTools","tool","mappedTool","t","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","__objRest","selectedCheckpoint","LangGraphHttpAgent"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var ht=Object.defineProperty,dt=Object.defineProperties;var gt=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var Q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var q=(i,a)=>(a=Symbol[i])?a:Symbol.for("Symbol."+i);var z=(i,a,t)=>a in i?ht(i,a,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[a]=t,p=(i,a)=>{for(var t in a||(a={}))Q.call(a,t)&&z(i,t,a[t]);if(B)for(var t of B(a))Z.call(a,t)&&z(i,t,a[t]);return i},f=(i,a)=>dt(i,gt(a));var tt=(i,a)=>{var t={};for(var e in i)Q.call(i,e)&&a.indexOf(e)<0&&(t[e]=i[e]);if(i!=null&&B)for(var e of B(i))a.indexOf(e)<0&&Z.call(i,e)&&(t[e]=i[e]);return t};var et=(i,a,t)=>(a=i[q("asyncIterator")])?a.call(i):(i=i[q("iterator")](),a={},t=(e,s)=>(s=i[e])&&(a[e]=o=>new Promise((r,g,d)=>(o=s.call(i,o),d=o.done,Promise.resolve(o.value).then(h=>r({value:h,done:d}),g)))),t("next"),t("return"),a);import{HttpAgent as St}from"@ag-ui/client";import{Observable as pt}from"rxjs";import{Client as mt}from"@langchain/langgraph-sdk";import{randomUUID as it}from"crypto";var ct=(c=>(c.OnChainStart="on_chain_start",c.OnChainStream="on_chain_stream",c.OnChainEnd="on_chain_end",c.OnChatModelStart="on_chat_model_start",c.OnChatModelStream="on_chat_model_stream",c.OnChatModelEnd="on_chat_model_end",c.OnToolStart="on_tool_start",c.OnToolEnd="on_tool_end",c.OnCustomEvent="on_custom_event",c.OnInterrupt="on_interrupt",c))(ct||{}),ut=(s=>(s.ManuallyEmitMessage="manually_emit_message",s.ManuallyEmitToolCall="manually_emit_tool_call",s.ManuallyEmitState="manually_emit_state",s.Exit="exit",s))(ut||{});import{AbstractAgent as Et,EventType as l}from"@ag-ui/client";var j=["messages","tools"];function W(i,a){return Object.fromEntries(Object.entries(i).filter(([t])=>a.includes(t)))}function st({mode:i,state:a,schemaKeys:t}){let e=i==="start"?a:null;return e&&(t!=null&&t.input)&&(e=W(e,[...j,...t.input])),e}function at(i){return i.map(a=>{var t;switch(a.type){case"human":return{id:a.id,role:"user",content:J(L(a.content))};case"ai":let e=L(a.content);return{id:a.id,role:"assistant",content:e?J(e):"",toolCalls:(t=a.tool_calls)==null?void 0:t.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:a.id,role:"system",content:J(L(a.content))};case"tool":return{id:a.id,role:"tool",content:J(L(a.content)),toolCallId:a.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function $(i){return i.map((a,t)=>{var e,s;switch(a.role){case"user":return{id:a.id,role:a.role,content:a.content,type:"human"};case"assistant":return{id:a.id,type:"ai",role:a.role,content:(e=a.content)!=null?e:"",tool_calls:((s=a.toolCalls)!=null?s:[]).map(o=>({id:o.id,name:o.function.name,args:JSON.parse(o.function.arguments),type:"tool_call"}))};case"system":return{id:a.id,role:a.role,content:a.content,type:"system"};case"tool":return{content:a.content,role:a.role,type:a.role,tool_call_id:a.toolCallId,id:a.id};default:throw console.error(`Message role ${a.role} is not implemented`),new Error("message role is not supported.")}})}function J(i){return typeof i=="string"?i:JSON.stringify(i)}function nt(i){var t,e,s,o,r;let a=(t=i.chunk)==null?void 0:t.content;if(a&&Array.isArray(a)&&a.length&&a[0])return a[0].thinking?{text:a[0].thinking,type:"text",index:a[0].index}:null;if((o=(s=(e=i.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:s.summary)!=null&&o[0]){let g=(r=i.chunk.additional_kwargs)==null?void 0:r.reasoning.summary[0];return!g||!g.text?null:{type:"text",text:g.text,index:g.index}}return null}function L(i){var a;if(!i)return null;if(typeof i=="string")return i;if(Array.isArray(i)&&i.length){let t=(a=i.find(e=>e.type==="text"))==null?void 0:a.text;return t!=null?t:null}return null}var rt=class i extends Et{constructor(t){var e,s;super(t);this.constantSchemaKeys=j;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(s=t==null?void 0:t.client)!=null?s:new mt({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:p({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new i(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new pt(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var g,d,h;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let s=(g=t.threadId)!=null?g:it(),o=(h=(d=t.forwardedProps)==null?void 0:d.streamMode)!=null?h:["events","values","updates"],r=await this.prepareStream(f(p({},t),{threadId:s}),o);if(!r)return e.error("No stream to regenerate");await this.handleStreamEvents(r,s,e,t,Array.isArray(o)?o:[o])}async prepareRegenerateStream(t,e){var h,c,n;let{threadId:s,messageCheckpoint:o}=t,r=await this.getCheckpointByMessage(o.id,s);if(this.assistant||(this.assistant=await this.getAssistant()),!r)return this.subscriber.error("No checkpoint found for message");let g=await this.client.threads.updateState(s,{values:this.langGraphDefaultMergeState(r.values,[],t),checkpointId:r.checkpoint.checkpoint_id,asNode:(c=(h=r.next)==null?void 0:h[0])!=null?c:"__start__"}),d=f(p({},(n=t.forwardedProps)!=null?n:{}),{input:this.langGraphDefaultMergeState(r.values,[o],t),checkpointId:g.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(s,this.assistant.assistant_id,d),state:r,streamMode:e}}async prepareStream(t,e){var G,b,D,A,P,F,X,K,E,H;let{threadId:s,state:o,messages:r,tools:g,context:d,forwardedProps:h}=t;this.activeRun.manuallyEmittedState=null;let c=h==null?void 0:h.nodeName,n=s!=null?s:it();this.assistant||(this.assistant=await this.getAssistant());let m=await this.getOrCreateThread(n,h==null?void 0:h.threadMetadata);this.activeRun.threadId=m.thread_id;let u=(G=await this.client.threads.getState(m.thread_id))!=null?G:{values:{}},v=(b=u.values.messages)!=null?b:[],C=$(r),T=this.langGraphDefaultMergeState(f(p({},o),{messages:v}),C,t),_=f(p({},u),{values:f(p({},T),{messages:[...v,...(D=T.messages)!=null?D:[]]})}),x=_.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((A=u.values.messages)!=null?A:[]).length>r.filter(S=>S.role!=="system").length){let S=null;for(let y=r.length-1;y>=0;y--)if(r[y].role==="user"){S=$([r[y]])[0];break}return S?this.prepareRegenerateStream(f(p({},t),{messageCheckpoint:S}),e):this.subscriber.error("No user message found in messages to regenerate")}this.activeRun.graphInfo=await this.client.assistants.getGraph(this.assistant.assistant_id);let M=!((P=h==null?void 0:h.command)!=null&&P.resume)&&n&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(M==="continue"){let S=this.activeRun.graphInfo.edges.find(y=>y.target===this.activeRun.nodeName);await this.client.threads.updateState(n,{values:o,asNode:S==null?void 0:S.source})}let k=st({mode:M,state:x,schemaKeys:this.activeRun.schemaKeys}),N,I=[this.assistantConfig,h==null?void 0:h.config].filter(Boolean);I.length&&(N=await this.mergeConfigs({configs:I,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let R=f(p({},h),{streamMode:e,input:k,config:N,context:p(p({},d),(F=N==null?void 0:N.configurable)!=null?F:{})}),O=(E=(K=(X=u.tasks)==null?void 0:X[0])==null?void 0:K.interrupts)!=null?E:[];return O!=null&&O.length&&!((H=h==null?void 0:h.command)!=null&&H.resume)?(this.dispatchEvent({type:l.RUN_STARTED,threadId:n,runId:t.runId}),this.handleNodeChange(c),O.forEach(S=>{this.dispatchEvent({type:l.CUSTOM,name:"on_interrupt",value:typeof S.value=="string"?S.value:JSON.stringify(S.value),rawEvent:S})}),this.dispatchEvent({type:l.RUN_FINISHED,threadId:n,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(n,this.assistant.assistant_id,R),state:_}}async handleStreamEvents(t,e,s,o,r){var v,C,T,_,I,R,O,G,b,D;let{forwardedProps:g}=o,d=g==null?void 0:g.nodeName;this.subscriber=s;let h=!1;if(!t)return;let{streamResponse:c,state:n}=t;this.activeRun.prevNodeName=null;let m={},u=n;try{this.dispatchEvent({type:l.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(d);try{for(var x=et(c),M,k,N;M=!(k=await x.next()).done;M=!1){let E=k.value;let H=(v=o.forwardedProps)==null?void 0:v.streamSubgraphs,S=H&&(E.event.startsWith("events")||E.event.startsWith("values"));if(!r.includes(E.event)&&!S&&E.event!=="error")continue;let y=E;if(E.event==="error"){this.dispatchEvent({type:l.RUN_ERROR,message:E.data.message,rawEvent:E});break}if(E.event==="updates")continue;if(E.event==="values"){m=y.data;continue}else if(H&&y.event.startsWith("values|")){m=p(p({},m),y.data);continue}let U=y.data,V=(C=U.metadata)!=null?C:{},w=V.langgraph_node,Y=U.event;if(this.activeRun.id=V.run_id,w&&w!==this.activeRun.nodeName&&this.handleNodeChange(w),h=h||Y==="on_custom_event"&&U.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===w&&Y==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(T=this.activeRun.graphInfo)!=null&&T.nodes.some(lt=>lt.id===w)&&this.handleNodeChange(w),u.values=(_=this.activeRun.manuallyEmittedState)!=null?_:m,!this.activeRun.nodeName)continue;(JSON.stringify(u)!==JSON.stringify(n)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(n=u,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:l.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(n),rawEvent:y})),this.dispatchEvent({type:l.RAW,event:U}),this.handleSingleEvent(U)}}catch(k){N=[k]}finally{try{M&&(k=x.return)&&await k.call(x)}finally{if(N)throw N[0]}}n=await this.client.threads.getState(e);let A=n.tasks,P=(R=(I=A==null?void 0:A[0])==null?void 0:I.interrupts)!=null?R:[],F=n.next.length===0,X=(G=(O=n.metadata)==null?void 0:O.writes)!=null?G:{},K=this.activeRun.nodeName;return P!=null&&P.length||(K=F?"__end__":(b=n.next[0])!=null?b:Object.keys(X)[0]),P.forEach(E=>{this.dispatchEvent({type:l.CUSTOM,name:"on_interrupt",value:typeof E.value=="string"?E.value:JSON.stringify(E.value),rawEvent:E})}),this.handleNodeChange(K),this.handleNodeChange(void 0),this.dispatchEvent({type:l.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(n)}),this.dispatchEvent({type:l.MESSAGES_SNAPSHOT,messages:at((D=n.values.messages)!=null?D:[])}),this.dispatchEvent({type:l.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.activeRun=void 0,s.complete()}catch(A){return s.error(A)}}handleSingleEvent(t){var e,s,o,r,g,d;switch(t.event){case"on_chat_model_stream":let h=(e=t.metadata["emit-messages"])!=null?e:!0,c=(s=t.metadata["emit-tool-calls"])!=null?s:!0;if(t.data.chunk.response_metadata.finish_reason)return;let n=this.getMessageInProgress(this.activeRun.id),m=!!(n!=null&&n.id),u=(o=t.data.chunk.tool_call_chunks)==null?void 0:o[0],v=(r=t.metadata.predict_state)==null?void 0:r.some(R=>R.tool===(u==null?void 0:u.name)),C=!m&&(u==null?void 0:u.name),T=m&&(n==null?void 0:n.toolCallId)&&(u==null?void 0:u.args),_=m&&(n==null?void 0:n.toolCallId)&&!u;(_||T||C)&&(this.activeRun.hasFunctionStreaming=!0);let x=nt(t.data),M=L(t.data.chunk.content),k=!!(!u&&M),N=m&&!(n!=null&&n.toolCallId)&&!k;if(x){this.handleThinkingEvent(x);break}if(!x&&this.thinkingProcess&&(this.dispatchEvent({type:l.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:l.THINKING_END}),this.thinkingProcess=null),v&&this.dispatchEvent({type:l.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),_){this.dispatchEvent({type:l.TOOL_CALL_END,toolCallId:n==null?void 0:n.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(N){this.dispatchEvent({type:l.TEXT_MESSAGE_END,messageId:n.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(C&&c){M&&(this.dispatchEvent({type:l.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.dispatchEvent({type:l.TEXT_MESSAGE_CONTENT,messageId:t.data.chunk.id,delta:M,rawEvent:t}),this.dispatchEvent({type:l.TEXT_MESSAGE_END,messageId:t.data.chunk.id,rawEvent:t})),this.dispatchEvent({type:l.TOOL_CALL_START,toolCallId:u.id,toolCallName:u.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:u.id,toolCallName:u.name});break}if(T&&c){this.dispatchEvent({type:l.TOOL_CALL_ARGS,toolCallId:n==null?void 0:n.toolCallId,delta:u.args,rawEvent:t});break}if(k&&h){n||(this.dispatchEvent({type:l.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),n=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:l.TEXT_MESSAGE_CONTENT,messageId:n.id,delta:M,rawEvent:t});break}break;case"on_chat_model_end":if((g=this.getMessageInProgress(this.activeRun.id))!=null&&g.toolCallId){this.dispatchEvent({type:l.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((d=this.getMessageInProgress(this.activeRun.id))!=null&&d.id){this.dispatchEvent({type:l.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:l.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:l.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:l.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:l.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:l.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:l.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:l.STATE_SNAPSHOT,snapshot:this.getStateSnapshot({values:this.activeRun.manuallyEmittedState}),rawEvent:t})),this.dispatchEvent({type:l.CUSTOM,name:t.name,value:t.data,rawEvent:t});break;case"on_tool_end":if(this.activeRun.hasFunctionStreaming)break;let I=t.data.output;this.dispatchEvent({type:l.TOOL_CALL_START,toolCallId:I.tool_call_id,toolCallName:I.name,parentMessageId:I.id,rawEvent:t}),this.dispatchEvent({type:l.TOOL_CALL_ARGS,toolCallId:I.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:l.TOOL_CALL_END,toolCallId:I.tool_call_id,rawEvent:t})}}handleThinkingEvent(t){var s;if(!t||!t.type||!t.text)return;let e=t.index;(s=this.thinkingProcess)!=null&&s.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:l.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:l.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:l.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:l.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:l.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=t.values,s=this.activeRun.schemaKeys;return s!=null&&s.output&&(e=W(e,[...this.constantSchemaKeys,...s.output])),e}async getOrCreateThread(t,e){let s;try{try{s=await this.getThread(t)}catch(o){s=await this.createThread({threadId:t,metadata:e})}}catch(o){throw new Error(`Failed to create thread: ${o.message}`)}return s}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((o,r)=>{var m;let g=o.configurable;r.configurable&&(g=s!=null&&s.config?W(r==null?void 0:r.configurable,[...this.constantSchemaKeys,...(m=s==null?void 0:s.config)!=null?m:[]]):r==null?void 0:r.configurable);let d=f(p(p({},o),r),{configurable:g}),h=o.recursion_limit==null&&r.recursion_limit===25,c=JSON.stringify(d)!==JSON.stringify(o),n=h&&JSON.stringify(f(p({},d),{recursion_limit:null}))===JSON.stringify(f(p({},o),{recursion_limit:null}));return c&&!n?p(p({},o),d):o},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=f(p({},this.messagesInProcess),{[t]:p(p({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.graph_id===this.graphId);if(!e)throw console.error(`
|
|
1
|
+
var ht=Object.defineProperty,dt=Object.defineProperties;var gt=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var Z=Object.prototype.hasOwnProperty,tt=Object.prototype.propertyIsEnumerable;var z=(a,n)=>(n=Symbol[a])?n:Symbol.for("Symbol."+a);var Q=(a,n,t)=>n in a?ht(a,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[n]=t,m=(a,n)=>{for(var t in n||(n={}))Z.call(n,t)&&Q(a,t,n[t]);if(J)for(var t of J(n))tt.call(n,t)&&Q(a,t,n[t]);return a},v=(a,n)=>dt(a,gt(n));var et=(a,n)=>{var t={};for(var e in a)Z.call(a,e)&&n.indexOf(e)<0&&(t[e]=a[e]);if(a!=null&&J)for(var e of J(a))n.indexOf(e)<0&&tt.call(a,e)&&(t[e]=a[e]);return t};var st=(a,n,t)=>(n=a[z("asyncIterator")])?n.call(a):(a=a[z("iterator")](),n={},t=(e,s)=>(s=a[e])&&(n[e]=r=>new Promise((i,c,g)=>(r=s.call(a,r),g=r.done,Promise.resolve(r.value).then(o=>i({value:o,done:g}),c)))),t("next"),t("return"),n);import{HttpAgent as St}from"@ag-ui/client";import{Observable as pt}from"rxjs";import{Client as mt}from"@langchain/langgraph-sdk";import{randomUUID as V}from"crypto";var ct=(u=>(u.OnChainStart="on_chain_start",u.OnChainStream="on_chain_stream",u.OnChainEnd="on_chain_end",u.OnChatModelStart="on_chat_model_start",u.OnChatModelStream="on_chat_model_stream",u.OnChatModelEnd="on_chat_model_end",u.OnToolStart="on_tool_start",u.OnToolEnd="on_tool_end",u.OnCustomEvent="on_custom_event",u.OnInterrupt="on_interrupt",u))(ct||{}),ut=(s=>(s.ManuallyEmitMessage="manually_emit_message",s.ManuallyEmitToolCall="manually_emit_tool_call",s.ManuallyEmitState="manually_emit_state",s.Exit="exit",s))(ut||{});import{AbstractAgent as Et,EventType as h}from"@ag-ui/client";var j=["messages","tools"];function X(a,n){return Object.fromEntries(Object.entries(a).filter(([t])=>n.includes(t)))}function nt({mode:a,state:n,schemaKeys:t}){let e=a==="start"?n:null;return e&&(t!=null&&t.input)&&(e=X(e,[...j,...t.input])),e}function at(a){return a.map(n=>{var t;switch(n.type){case"human":return{id:n.id,role:"user",content:W(w(n.content))};case"ai":let e=w(n.content);return{id:n.id,role:"assistant",content:e?W(e):"",toolCalls:(t=n.tool_calls)==null?void 0:t.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:n.id,role:"system",content:W(w(n.content))};case"tool":return{id:n.id,role:"tool",content:W(w(n.content)),toolCallId:n.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function $(a){return a.map((n,t)=>{var e,s;switch(n.role){case"user":return{id:n.id,role:n.role,content:n.content,type:"human"};case"assistant":return{id:n.id,type:"ai",role:n.role,content:(e=n.content)!=null?e:"",tool_calls:((s=n.toolCalls)!=null?s:[]).map(r=>({id:r.id,name:r.function.name,args:JSON.parse(r.function.arguments),type:"tool_call"}))};case"system":return{id:n.id,role:n.role,content:n.content,type:"system"};case"tool":return{content:n.content,role:n.role,type:n.role,tool_call_id:n.toolCallId,id:n.id};default:throw console.error(`Message role ${n.role} is not implemented`),new Error("message role is not supported.")}})}function W(a){return typeof a=="string"?a:JSON.stringify(a)}function it(a){var t,e,s,r,i;let n=(t=a.chunk)==null?void 0:t.content;if(n&&Array.isArray(n)&&n.length&&n[0])return n[0].thinking?{text:n[0].thinking,type:"text",index:n[0].index}:null;if((r=(s=(e=a.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:s.summary)!=null&&r[0]){let c=(i=a.chunk.additional_kwargs)==null?void 0:i.reasoning.summary[0];return!c||!c.text?null:{type:"text",text:c.text,index:c.index}}return null}function w(a){var n;if(!a)return null;if(typeof a=="string")return a;if(Array.isArray(a)&&a.length){let t=(n=a.find(e=>e.type==="text"))==null?void 0:n.text;return t!=null?t:null}return null}var rt=class a extends Et{constructor(t){var e,s;super(t);this.constantSchemaKeys=j;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(s=t==null?void 0:t.client)!=null?s:new mt({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:m({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new a(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new pt(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var c,g,o;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let s=(c=t.threadId)!=null?c:V(),r=(o=(g=t.forwardedProps)==null?void 0:g.streamMode)!=null?o:["events","values","updates"],i=await this.prepareStream(v(m({},t),{threadId:s}),r);if(!i)return e.error("No stream to regenerate");await this.handleStreamEvents(i,s,e,t,Array.isArray(r)?r:[r])}async prepareRegenerateStream(t,e){var o,u,d;let{threadId:s,messageCheckpoint:r}=t,i=await this.getCheckpointByMessage(r.id,s);if(this.assistant||(this.assistant=await this.getAssistant()),!i)return this.subscriber.error("No checkpoint found for message");let c=await this.client.threads.updateState(s,{values:this.langGraphDefaultMergeState(i.values,[],t),checkpointId:i.checkpoint.checkpoint_id,asNode:(u=(o=i.next)==null?void 0:o[0])!=null?u:"__start__"}),g=v(m({},(d=t.forwardedProps)!=null?d:{}),{input:this.langGraphDefaultMergeState(i.values,[r],t),checkpointId:c.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(s,this.assistant.assistant_id,g),state:i,streamMode:e}}async prepareStream(t,e){var G,b,D,x,P,F,B,K,S,H;let{threadId:s,state:r,messages:i,tools:c,context:g,forwardedProps:o}=t;this.activeRun.manuallyEmittedState=null;let u=o==null?void 0:o.nodeName,d=s!=null?s:V();this.assistant||(this.assistant=await this.getAssistant());let l=await this.getOrCreateThread(d,o==null?void 0:o.threadMetadata);this.activeRun.threadId=l.thread_id;let E=(G=await this.client.threads.getState(l.thread_id))!=null?G:{values:{}},p=(b=E.values.messages)!=null?b:[],N=$(i),M=this.langGraphDefaultMergeState(v(m({},r),{messages:p}),N,t),I=v(m({},E),{values:v(m({},M),{messages:[...p,...(D=M.messages)!=null?D:[]]})}),A=I.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((x=E.values.messages)!=null?x:[]).length>i.filter(f=>f.role!=="system").length){let f=null;for(let T=i.length-1;T>=0;T--)if(i[T].role==="user"){f=$([i[T]])[0];break}return f?this.prepareRegenerateStream(v(m({},t),{messageCheckpoint:f}),e):this.subscriber.error("No user message found in messages to regenerate")}this.activeRun.graphInfo=await this.client.assistants.getGraph(this.assistant.assistant_id);let R=!((P=o==null?void 0:o.command)!=null&&P.resume)&&d&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(R==="continue"){let f=this.activeRun.graphInfo.edges.find(T=>T.target===this.activeRun.nodeName);await this.client.threads.updateState(d,{values:r,asNode:f==null?void 0:f.source})}let k=nt({mode:R,state:A,schemaKeys:this.activeRun.schemaKeys}),C,O=[this.assistantConfig,o==null?void 0:o.config].filter(Boolean);O.length&&(C=await this.mergeConfigs({configs:O,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let y=v(m({},o),{streamMode:e,input:k,config:C,context:m(m({},g),(F=C==null?void 0:C.configurable)!=null?F:{})}),_=(S=(K=(B=E.tasks)==null?void 0:B[0])==null?void 0:K.interrupts)!=null?S:[];return _!=null&&_.length&&!((H=o==null?void 0:o.command)!=null&&H.resume)?(this.dispatchEvent({type:h.RUN_STARTED,threadId:d,runId:t.runId}),this.handleNodeChange(u),_.forEach(f=>{this.dispatchEvent({type:h.CUSTOM,name:"on_interrupt",value:typeof f.value=="string"?f.value:JSON.stringify(f.value),rawEvent:f})}),this.dispatchEvent({type:h.RUN_FINISHED,threadId:d,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(d,this.assistant.assistant_id,y),state:I}}async handleStreamEvents(t,e,s,r,i){var p,N,M,I,O,y,_,G,b,D;let{forwardedProps:c}=r,g=c==null?void 0:c.nodeName;this.subscriber=s;let o=!1;if(!t)return;let{streamResponse:u,state:d}=t;this.activeRun.prevNodeName=null;let l={},E=d;try{this.dispatchEvent({type:h.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(g);try{for(var A=st(u),R,k,C;R=!(k=await A.next()).done;R=!1){let S=k.value;let H=(p=r.forwardedProps)==null?void 0:p.streamSubgraphs,f=H&&(S.event.startsWith("events")||S.event.startsWith("values"));if(!i.includes(S.event)&&!f&&S.event!=="error")continue;let T=S;if(S.event==="error"){this.dispatchEvent({type:h.RUN_ERROR,message:S.data.message,rawEvent:S});break}if(S.event==="updates")continue;if(S.event==="values"){l=T.data;continue}else if(H&&T.event.startsWith("values|")){l=m(m({},l),T.data);continue}let U=T.data,Y=(N=U.metadata)!=null?N:{},L=Y.langgraph_node,q=U.event;if(this.activeRun.id=Y.run_id,L&&L!==this.activeRun.nodeName&&this.handleNodeChange(L),o=o||q==="on_custom_event"&&U.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===L&&q==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(M=this.activeRun.graphInfo)!=null&&M.nodes.some(lt=>lt.id===L)&&this.handleNodeChange(L),E.values=(I=this.activeRun.manuallyEmittedState)!=null?I:l,!this.activeRun.nodeName)continue;(JSON.stringify(E)!==JSON.stringify(d)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(d=E,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:h.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d),rawEvent:T})),this.dispatchEvent({type:h.RAW,event:U}),this.handleSingleEvent(U)}}catch(k){C=[k]}finally{try{R&&(k=A.return)&&await k.call(A)}finally{if(C)throw C[0]}}d=await this.client.threads.getState(e);let x=d.tasks,P=(y=(O=x==null?void 0:x[0])==null?void 0:O.interrupts)!=null?y:[],F=d.next.length===0,B=(G=(_=d.metadata)==null?void 0:_.writes)!=null?G:{},K=this.activeRun.nodeName;return P!=null&&P.length||(K=F?"__end__":(b=d.next[0])!=null?b:Object.keys(B)[0]),P.forEach(S=>{this.dispatchEvent({type:h.CUSTOM,name:"on_interrupt",value:typeof S.value=="string"?S.value:JSON.stringify(S.value),rawEvent:S})}),this.handleNodeChange(K),this.handleNodeChange(void 0),this.dispatchEvent({type:h.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d)}),this.dispatchEvent({type:h.MESSAGES_SNAPSHOT,messages:at((D=d.values.messages)!=null?D:[])}),this.dispatchEvent({type:h.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.activeRun=void 0,s.complete()}catch(x){return s.error(x)}}handleSingleEvent(t){var e,s,r,i,c,g,o;switch(t.event){case"on_chat_model_stream":let u=(e=t.metadata["emit-messages"])!=null?e:!0,d=(s=t.metadata["emit-tool-calls"])!=null?s:!0;if(t.data.chunk.response_metadata.finish_reason)return;let l=this.getMessageInProgress(this.activeRun.id),E=!!(l!=null&&l.id),p=(r=t.data.chunk.tool_call_chunks)==null?void 0:r[0],N=(i=t.metadata.predict_state)==null?void 0:i.some(_=>_.tool===(p==null?void 0:p.name)),M=!E&&(p==null?void 0:p.name),I=E&&(l==null?void 0:l.toolCallId)&&(p==null?void 0:p.args),A=E&&(l==null?void 0:l.toolCallId)&&!p;(A||I||M)&&(this.activeRun.hasFunctionStreaming=!0);let R=it(t.data),k=w(t.data.chunk.content),C=!!(!p&&k),O=E&&!(l!=null&&l.toolCallId)&&!C;if(R){this.handleThinkingEvent(R);break}if(!R&&this.thinkingProcess&&(this.dispatchEvent({type:h.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:h.THINKING_END}),this.thinkingProcess=null),N&&this.dispatchEvent({type:h.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),A){this.dispatchEvent({type:h.TOOL_CALL_END,toolCallId:l==null?void 0:l.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(O){this.dispatchEvent({type:h.TEXT_MESSAGE_END,messageId:l.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(M&&d){this.dispatchEvent({type:h.TOOL_CALL_START,toolCallId:p.id,toolCallName:p.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:p.id,toolCallName:p.name});break}if(I&&d){this.dispatchEvent({type:h.TOOL_CALL_ARGS,toolCallId:l==null?void 0:l.toolCallId,delta:p.args,rawEvent:t});break}if(C&&u){l||(this.dispatchEvent({type:h.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.chunk.id,rawEvent:t}),this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:null,toolCallName:null}),l=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:h.TEXT_MESSAGE_CONTENT,messageId:l.id,delta:k,rawEvent:t});break}break;case"on_chat_model_end":if((c=this.getMessageInProgress(this.activeRun.id))!=null&&c.toolCallId){this.dispatchEvent({type:h.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((g=this.getMessageInProgress(this.activeRun.id))!=null&&g.id){this.dispatchEvent({type:h.TEXT_MESSAGE_END,messageId:this.getMessageInProgress(this.activeRun.id).id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}break;case"on_custom_event":if(t.name==="manually_emit_message"){this.dispatchEvent({type:h.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:h.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:h.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:h.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:h.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:h.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:h.STATE_SNAPSHOT,snapshot:this.getStateSnapshot({values:this.activeRun.manuallyEmittedState}),rawEvent:t})),this.dispatchEvent({type:h.CUSTOM,name:t.name,value:t.data,rawEvent:t});break;case"on_tool_end":let y=(o=t.data)==null?void 0:o.output;this.activeRun.hasFunctionStreaming||(this.dispatchEvent({type:h.TOOL_CALL_START,toolCallId:y.tool_call_id,toolCallName:y.name,parentMessageId:y.id,rawEvent:t}),this.dispatchEvent({type:h.TOOL_CALL_ARGS,toolCallId:y.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:h.TOOL_CALL_END,toolCallId:y.tool_call_id,rawEvent:t})),this.dispatchEvent({type:h.TOOL_CALL_RESULT,toolCallId:y.tool_call_id,content:y==null?void 0:y.content,messageId:V(),role:"tool"});break}}handleThinkingEvent(t){var s;if(!t||!t.type||!t.text)return;let e=t.index;(s=this.thinkingProcess)!=null&&s.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:h.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:h.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:h.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:h.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:h.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=t.values,s=this.activeRun.schemaKeys;return s!=null&&s.output&&(e=X(e,[...this.constantSchemaKeys,...s.output])),e}async getOrCreateThread(t,e){let s;try{try{s=await this.getThread(t)}catch(r){s=await this.createThread({threadId:t,metadata:e})}}catch(r){throw new Error(`Failed to create thread: ${r.message}`)}return s}async getThread(t){return this.client.threads.get(t)}async createThread(t){return this.client.threads.create(t)}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((r,i)=>{var l;let c=r.configurable;i.configurable&&(c=s!=null&&s.config?X(i==null?void 0:i.configurable,[...this.constantSchemaKeys,...(l=s==null?void 0:s.config)!=null?l:[]]):i==null?void 0:i.configurable);let g=v(m(m({},r),i),{configurable:c}),o=r.recursion_limit==null&&i.recursion_limit===25,u=JSON.stringify(g)!==JSON.stringify(r),d=o&&JSON.stringify(v(m({},g),{recursion_limit:null}))===JSON.stringify(v(m({},r),{recursion_limit:null}));return u&&!d?m(m({},r),g):r},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=v(m({},this.messagesInProcess),{[t]:m(m({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.graph_id===this.graphId);if(!e)throw console.error(`
|
|
2
2
|
No agent found with graph ID ${this.graphId} found..
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
These are the available agents: [${t.map(s=>`${s.graph_id} (ID: ${s.assistant_id})`).join(", ")}]
|
|
6
|
-
`),new Error("No agent id found");return e}async getSchemaKeys(){var t,e,s,
|
|
6
|
+
`),new Error("No agent id found");return e}async getSchemaKeys(){var t,e,s,r;try{let i=await this.client.assistants.getSchemas(this.assistant.assistant_id),c=null,g=[];if("context_schema"in i&&((t=i.context_schema)!=null&&t.properties)&&(g=Object.keys(i.context_schema.properties)),(e=i.config_schema)!=null&&e.properties&&(c=Object.keys(i.config_schema.properties)),!((s=i.input_schema)!=null&&s.properties)||!((r=i.output_schema)!=null&&r.properties))return{config:[],input:null,output:null,context:g};let o=Object.keys(i.input_schema.properties),u=Object.keys(i.output_schema.properties);return{input:o&&o.length?[...o,...this.constantSchemaKeys]:null,output:u&&u.length?[...u,...this.constantSchemaKeys]:null,context:g,config:c}}catch(i){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys,context:[]}}}langGraphDefaultMergeState(t,e,s){var o,u;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let r=t.messages||[],i=new Set(r.map(d=>d.id)),c=e.filter(d=>!i.has(d.id)),g=[...(o=t.tools)!=null?o:[],...(u=s.tools)!=null?u:[]].reduce((d,l)=>{let E=l;return l.type||(E={type:"function",name:l.name,function:{name:l.name,description:l.description,parameters:l.parameters}}),d.find(p=>p.name===E.name||p.function.name===E.function.name)?d:[...d,E]},[]);return v(m({},t),{messages:c,tools:g,"ag-ui":{tools:g,context:s.context}})}handleNodeChange(t){var e,s;t==="__end__"&&(t=void 0),t!==((e=this.activeRun)==null?void 0:e.nodeName)&&((s=this.activeRun)!=null&&s.nodeName&&this.endStep(),t&&this.startStep(t)),this.activeRun.nodeName=t}startStep(t){this.dispatchEvent({type:h.STEP_STARTED,stepName:t})}endStep(){this.dispatchEvent({type:h.STEP_FINISHED,stepName:this.activeRun.nodeName})}async getCheckpointByMessage(t,e,s){var M,A;let r=s!=null&&s.checkpoint_id?{checkpoint:{checkpoint_id:s.checkpoint_id}}:void 0,c=[...await this.client.threads.getHistory(e,r)].reverse(),g=c.find(R=>{var k;return(k=R.values.messages)==null?void 0:k.some(C=>C.id===t)});if(!g)throw new Error("Message not found");let o=(M=g.values.messages)!=null?M:[],u=o.findIndex(R=>R.id===t);if(o.slice(u+1).length)return this.getCheckpointByMessage(t,e,g.parent_checkpoint);let l=c.indexOf(g),I=g.values,{messages:E}=I,p=et(I,["messages"]),N=(A=c[l-1])!=null?A:v(m({},g),{values:{}});return v(m({},N),{values:m(m({},N.values),p)})}};var ot=class extends St{};export{ut as CustomEventNames,rt as LangGraphAgent,ct as LangGraphEventTypes,ot as LangGraphHttpAgent};
|
|
7
7
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread,\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning,\n StateEnrichment,\n LangGraphToolWithName,\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n Message as AGUIMessage,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent,\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\ninterface RegenerateInput extends RunAgentExtendedInput {\n messageCheckpoint: LangGraphMessage;\n}\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n constantSchemaKeys: string[] = DEFAULT_SCHEMA_KEYS;\n config: LangGraphAgentConfig;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.config = config;\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null;\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n public clone() {\n return new LangGraphAgent(this.config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n return new Observable<ProcessedEvents>((subscriber) => {\n this.runAgentStream(input, subscriber);\n return () => {};\n });\n }\n\n async runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n hasFunctionStreaming: false,\n };\n this.subscriber = subscriber;\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n const threadId = input.threadId ?? randomUUID();\n const streamMode =\n input.forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]);\n const preparedStream = await this.prepareStream({ ...input, threadId }, streamMode);\n\n if (!preparedStream) {\n return subscriber.error(\"No stream to regenerate\");\n }\n\n await this.handleStreamEvents(preparedStream, threadId, subscriber, input, Array.isArray(streamMode) ? streamMode : [streamMode]);\n }\n\n async prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]) {\n const { threadId, messageCheckpoint } = input;\n\n const timeTravelCheckpoint = await this.getCheckpointByMessage(\n messageCheckpoint!.id!,\n threadId,\n );\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n if (!timeTravelCheckpoint) {\n return this.subscriber.error(\"No checkpoint found for message\");\n }\n\n const fork = await this.client.threads.updateState(threadId, {\n values: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [], input),\n checkpointId: timeTravelCheckpoint.checkpoint.checkpoint_id!,\n asNode: timeTravelCheckpoint.next?.[0] ?? \"__start__\",\n });\n\n const payload = {\n ...(input.forwardedProps ?? {}),\n input: this.langGraphDefaultMergeState(\n timeTravelCheckpoint.values,\n [messageCheckpoint],\n input,\n ),\n // @ts-ignore\n checkpointId: fork.checkpoint.checkpoint_id!,\n streamMode,\n };\n return {\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: timeTravelCheckpoint as ThreadState<State>,\n streamMode,\n };\n }\n\n async prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]) {\n let {\n threadId: inputThreadId,\n state: inputState,\n messages,\n tools,\n context,\n forwardedProps,\n } = input;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n\n const agentState: ThreadState<State> =\n (await this.client.threads.getState(thread.thread_id)) ??\n ({ values: {} } as ThreadState<State>);\n const agentStateMessages = agentState.values.messages ?? [];\n const inputMessagesToLangchain = aguiMessagesToLangChain(messages);\n const stateValuesDiff = this.langGraphDefaultMergeState(\n { ...inputState, messages: agentStateMessages },\n inputMessagesToLangchain,\n input,\n );\n // Messages are a combination of existing messages in state + everything that was newly sent\n let threadState = {\n ...agentState,\n values: {\n ...stateValuesDiff,\n messages: [...agentStateMessages, ...(stateValuesDiff.messages ?? [])],\n },\n };\n let stateValues = threadState.values;\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n if (\n (agentState.values.messages ?? []).length > messages.filter((m) => m.role !== \"system\").length\n ) {\n let lastUserMessage: LangGraphMessage | null = null;\n // Find the first user message by working backwards from the last message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n lastUserMessage = aguiMessagesToLangChain([messages[i]])[0];\n break;\n }\n }\n\n if (!lastUserMessage) {\n return this.subscriber.error(\"No user message found in messages to regenerate\");\n }\n\n return this.prepareRegenerateStream(\n { ...input, messageCheckpoint: lastUserMessage },\n streamMode,\n );\n }\n this.activeRun!.graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n !forwardedProps?.command?.resume &&\n threadId &&\n this.activeRun!.nodeName != \"__end__\" &&\n this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\") {\n const nodeBefore = this.activeRun!.graphInfo.edges.find(\n (e) => e.target === this.activeRun!.nodeName,\n );\n await this.client.threads.updateState(threadId, {\n values: inputState,\n asNode: nodeBefore?.source,\n });\n }\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state: stateValues,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode,\n input: payloadInput,\n config: payloadConfig,\n context: {\n ...context,\n ...(payloadConfig?.configurable ?? {}),\n }\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n this.handleNodeChange(nodeNameInput)\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return this.subscriber.complete();\n }\n\n return {\n // @ts-ignore\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: threadState as ThreadState<State>,\n };\n }\n\n async handleStreamEvents(\n stream: Awaited<\n ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>\n >,\n threadId: string,\n subscriber: Subscriber<ProcessedEvents>,\n input: RunAgentExtendedInput,\n streamModes: StreamMode | StreamMode[],\n ) {\n const { forwardedProps } = input;\n const nodeNameInput = forwardedProps?.nodeName;\n this.subscriber = subscriber;\n let shouldExit = false;\n if (!stream) return;\n\n let { streamResponse, state } = stream;\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {} as ThreadState<State>[\"values\"];\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.handleNodeChange(nodeNameInput)\n\n for await (let streamResponseChunk of streamResponse) {\n const subgraphsStreamEnabled = input.forwardedProps?.streamSubgraphs;\n const isSubgraphStream =\n subgraphsStreamEnabled &&\n (streamResponseChunk.event.startsWith(\"events\") ||\n streamResponseChunk.event.startsWith(\"values\"));\n\n // @ts-ignore\n if (!streamModes.includes(streamResponseChunk.event as StreamMode) && !isSubgraphStream && streamResponseChunk.event !== 'error') {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") {\n continue;\n }\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n } else if (subgraphsStreamEnabled && chunk.event.startsWith(\"values|\")) {\n latestStateValues = {\n ...latestStateValues,\n ...chunk.data,\n };\n continue;\n }\n\n const chunkData = chunk.data;\n const metadata = chunkData.metadata ?? {};\n const currentNodeName = metadata.langgraph_node;\n const eventType = chunkData.event;\n\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n this.handleNodeChange(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (this.activeRun!.graphInfo?.[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.handleNodeChange(currentNodeName)\n }\n\n updatedState.values = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks;\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0;\n const writes = state.metadata?.writes ?? {};\n\n // Initialize a new node name to use in the next if block\n let newNodeName = this.activeRun!.nodeName!;\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? \"__end__\" : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.handleNodeChange(newNodeName);\n // Immediately turn off new step\n this.handleNodeChange(undefined);\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui((state.values as { messages: any[] }).messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n if (isToolCallEndEvent || isToolCallArgsEvent || isToolCallStartEvent) {\n this.activeRun!.hasFunctionStreaming = true;\n }\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData);\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n if (messageContent) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.chunk.id,\n delta: messageContent,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n }\n\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun!.manuallyEmittedState!,\n } as ThreadState<State>),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n case LangGraphEventTypes.OnToolEnd:\n if (this.activeRun!.hasFunctionStreaming) break;\n const toolCallOutput = event.data.output\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallOutput.tool_call_id,\n toolCallName: toolCallOutput.name,\n parentMessageId: toolCallOutput.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCallOutput.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCallOutput.tool_call_id,\n rawEvent: event,\n });\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n });\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n });\n this.thinkingProcess.type = reasoningData.type;\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text,\n });\n }\n }\n\n getStateSnapshot(threadState: ThreadState<State>) {\n let state = threadState.values;\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...this.constantSchemaKeys, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata,\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...this.constantSchemaKeys,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) => searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n let contextSchema: string[] = []\n if ('context_schema' in graphSchema && graphSchema.context_schema?.properties) {\n contextSchema = Object.keys(graphSchema.context_schema.properties);\n }\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: null, output: null, context: contextSchema };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input:\n inputSchema && inputSchema.length ? [...inputSchema, ...this.constantSchemaKeys] : null,\n output:\n outputSchema && outputSchema.length\n ? [...outputSchema, ...this.constantSchemaKeys]\n : null,\n context: contextSchema,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: this.constantSchemaKeys, output: this.constantSchemaKeys, context: [] };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], input: RunAgentExtendedInput): State<StateEnrichment> {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n const langGraphTools: LangGraphToolWithName[] = [...(state.tools ?? []), ...(input.tools ?? [])].reduce((acc, tool) => {\n let mappedTool = tool;\n if (!tool.type) {\n mappedTool = {\n type: \"function\",\n name: tool.name,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }\n }\n\n // Verify no duplicated\n if (acc.find((t: LangGraphToolWithName) => (t.name === mappedTool.name) || t.function.name === mappedTool.function.name)) return acc;\n\n return [...acc, mappedTool];\n }, []);\n\n return {\n ...state,\n messages: newMessages,\n tools: langGraphTools,\n 'ag-ui': {\n tools: langGraphTools,\n context: input.context,\n }\n };\n }\n\n handleNodeChange(nodeName: string | undefined) {\n if (nodeName === \"__end__\") {\n nodeName = undefined;\n }\n if (nodeName !== this.activeRun?.nodeName) {\n // End current step\n if (this.activeRun?.nodeName) {\n this.endStep();\n }\n // If we actually got a node name, start a new step\n if (nodeName) {\n this.startStep(nodeName);\n }\n }\n this.activeRun!.nodeName = nodeName;\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n }\n\n endStep() {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n\n async getCheckpointByMessage(\n messageId: string,\n threadId: string,\n checkpoint?: null | {\n checkpoint_id?: null | string;\n checkpoint_ns: string;\n },\n ): Promise<ThreadState> {\n const options = checkpoint?.checkpoint_id\n ? {\n checkpoint: { checkpoint_id: checkpoint.checkpoint_id },\n }\n : undefined;\n const history = await this.client.threads.getHistory(threadId, options);\n const reversed = [...history].reverse(); // oldest → newest\n\n let targetState = reversed.find((state) =>\n (state.values as State).messages?.some((m: LangGraphPlatformMessage) => m.id === messageId),\n );\n\n if (!targetState) throw new Error(\"Message not found\");\n\n const targetStateMessages = (targetState.values as State).messages ?? [];\n const messageIndex = targetStateMessages.findIndex(\n (m: LangGraphPlatformMessage) => m.id === messageId,\n );\n const messagesAfter = targetStateMessages.slice(messageIndex + 1);\n if (messagesAfter.length) {\n return this.getCheckpointByMessage(messageId, threadId, targetState.parent_checkpoint);\n }\n\n const targetStateIndex = reversed.indexOf(targetState);\n\n const { messages, ...targetStateValuesWithoutMessages } = targetState.values as State;\n const selectedCheckpoint = reversed[targetStateIndex - 1] ?? { ...targetState, values: {} };\n return {\n ...selectedCheckpoint,\n values: { ...selectedCheckpoint.values, ...targetStateValuesWithoutMessages },\n };\n }\n}\n\nexport * from \"./types\";\n","import { AssistantGraph, Message as LangGraphMessage, } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\nimport { RunAgentInput } from \"@ag-ui/core\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type LangGraphToolWithName = {\n type: \"function\";\n name?: string;\n function: {\n name: string;\n description: string;\n parameters: any;\n },\n}\n\nexport type State<TDefinedState = Record<string, any>> = {\n [k in keyof TDefinedState]: TDefinedState[k] | null;\n} & Record<string, any>;\nexport interface StateEnrichment {\n messages: LangGraphMessage[];\n tools: LangGraphToolWithName[];\n 'ag-ui': {\n tools: LangGraphToolWithName[];\n context: RunAgentInput['context']\n }\n}\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n context: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n graphInfo?: AssistantGraph\n hasFunctionStreaming?: boolean;\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n LangGraphMessage,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"messages\", \"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"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","names":["HttpAgent","Observable","LangGraphClient","randomUUID","LangGraphEventTypes","CustomEventNames","AbstractAgent","EventType","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","_LangGraphAgent","AbstractAgent","config","_a","_b","DEFAULT_SCHEMA_KEYS","LangGraphClient","__spreadValues","event","input","Observable","subscriber","_c","threadId","randomUUID","streamMode","preparedStream","__spreadProps","messageCheckpoint","timeTravelCheckpoint","fork","payload","_d","_e","_f","_g","_h","_i","_j","inputThreadId","inputState","messages","tools","context","forwardedProps","nodeNameInput","thread","agentState","agentStateMessages","inputMessagesToLangchain","aguiMessagesToLangChain","stateValuesDiff","threadState","stateValues","m","lastUserMessage","i","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","interrupts","EventType","interrupt","stream","streamModes","shouldExit","streamResponse","state","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","subgraphsStreamEnabled","isSubgraphStream","chunk","chunkData","metadata","currentNodeName","eventType","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","toolCallOutput","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","newMessages","langGraphTools","tool","mappedTool","t","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","__objRest","selectedCheckpoint","LangGraphHttpAgent","HttpAgent"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["import { HttpAgent } from \"@ag-ui/client\";\n\nexport * from './agent'\nexport class LangGraphHttpAgent extends HttpAgent {}","import { Observable, Subscriber } from \"rxjs\";\nimport {\n Client as LangGraphClient,\n EventsStreamEvent,\n StreamMode,\n Config as LangGraphConfig,\n ThreadState,\n Assistant,\n Message as LangGraphMessage,\n Config,\n Interrupt,\n Thread,\n} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n ThinkingInProgress,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n LangGraphReasoning,\n StateEnrichment,\n LangGraphToolWithName,\n} from \"./types\";\nimport {\n AbstractAgent,\n AgentConfig,\n CustomEvent,\n EventType,\n MessagesSnapshotEvent,\n RawEvent,\n RunAgentInput,\n RunErrorEvent,\n RunFinishedEvent,\n RunStartedEvent,\n StateDeltaEvent,\n StateSnapshotEvent,\n StepFinishedEvent,\n StepStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ToolCallResultEvent,\n ThinkingTextMessageStartEvent,\n ThinkingTextMessageContentEvent,\n ThinkingTextMessageEndEvent,\n ThinkingStartEvent,\n ThinkingEndEvent,\n} from \"@ag-ui/client\";\nimport { RunsStreamPayload } from \"@langchain/langgraph-sdk/dist/types\";\nimport {\n aguiMessagesToLangChain,\n DEFAULT_SCHEMA_KEYS,\n filterObjectBySchemaKeys,\n getStreamPayloadInput,\n langchainMessagesToAgui,\n resolveMessageContent,\n resolveReasoningContent,\n} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ThinkingTextMessageStartEvent\n | ThinkingTextMessageContentEvent\n | ThinkingTextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\n | ToolCallResultEvent\n | ThinkingStartEvent\n | ThinkingEndEvent\n | StateSnapshotEvent\n | StateDeltaEvent\n | MessagesSnapshotEvent\n | RawEvent\n | CustomEvent\n | RunStartedEvent\n | RunFinishedEvent\n | RunErrorEvent\n | StepStartedEvent\n | StepFinishedEvent;\n\ntype RunAgentExtendedInput<\n TStreamMode extends StreamMode | StreamMode[] = StreamMode,\n TSubgraphs extends boolean = false,\n> = Omit<RunAgentInput, \"forwardedProps\"> & {\n forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, \"input\"> & {\n nodeName?: string;\n threadMetadata?: Record<string, any>;\n };\n};\n\ninterface RegenerateInput extends RunAgentExtendedInput {\n messageCheckpoint: LangGraphMessage;\n}\n\nexport interface LangGraphAgentConfig extends AgentConfig {\n client?: LangGraphClient;\n deploymentUrl: string;\n langsmithApiKey?: string;\n propertyHeaders?: Record<string, string>;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n}\n\nexport class LangGraphAgent extends AbstractAgent {\n client: LangGraphClient;\n assistantConfig?: LangGraphConfig;\n agentName?: string;\n graphId: string;\n assistant?: Assistant;\n messagesInProcess: MessagesInProgressRecord;\n thinkingProcess: null | ThinkingInProgress;\n activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n constantSchemaKeys: string[] = DEFAULT_SCHEMA_KEYS;\n config: LangGraphAgentConfig;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.config = config;\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\n this.thinkingProcess = null;\n this.client =\n config?.client ??\n new LangGraphClient({\n apiUrl: config.deploymentUrl,\n apiKey: config.langsmithApiKey,\n defaultHeaders: { ...(config.propertyHeaders ?? {}) },\n });\n }\n\n public clone() {\n return new LangGraphAgent(this.config);\n }\n\n dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n return new Observable<ProcessedEvents>((subscriber) => {\n this.runAgentStream(input, subscriber);\n return () => {};\n });\n }\n\n async runAgentStream(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n hasFunctionStreaming: false,\n };\n this.subscriber = subscriber;\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n const threadId = input.threadId ?? randomUUID();\n const streamMode =\n input.forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]);\n const preparedStream = await this.prepareStream({ ...input, threadId }, streamMode);\n\n if (!preparedStream) {\n return subscriber.error(\"No stream to regenerate\");\n }\n\n await this.handleStreamEvents(preparedStream, threadId, subscriber, input, Array.isArray(streamMode) ? streamMode : [streamMode]);\n }\n\n async prepareRegenerateStream(input: RegenerateInput, streamMode: StreamMode | StreamMode[]) {\n const { threadId, messageCheckpoint } = input;\n\n const timeTravelCheckpoint = await this.getCheckpointByMessage(\n messageCheckpoint!.id!,\n threadId,\n );\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n if (!timeTravelCheckpoint) {\n return this.subscriber.error(\"No checkpoint found for message\");\n }\n\n const fork = await this.client.threads.updateState(threadId, {\n values: this.langGraphDefaultMergeState(timeTravelCheckpoint.values, [], input),\n checkpointId: timeTravelCheckpoint.checkpoint.checkpoint_id!,\n asNode: timeTravelCheckpoint.next?.[0] ?? \"__start__\",\n });\n\n const payload = {\n ...(input.forwardedProps ?? {}),\n input: this.langGraphDefaultMergeState(\n timeTravelCheckpoint.values,\n [messageCheckpoint],\n input,\n ),\n // @ts-ignore\n checkpointId: fork.checkpoint.checkpoint_id!,\n streamMode,\n };\n return {\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: timeTravelCheckpoint as ThreadState<State>,\n streamMode,\n };\n }\n\n async prepareStream(input: RunAgentExtendedInput, streamMode: StreamMode | StreamMode[]) {\n let {\n threadId: inputThreadId,\n state: inputState,\n messages,\n tools,\n context,\n forwardedProps,\n } = input;\n // If a manual emittance happens, it is the ultimate source of truth of state, unless a node has exited.\n // Therefore, this value should either hold null, or the only edition of state that should be used.\n this.activeRun!.manuallyEmittedState = null;\n\n const nodeNameInput = forwardedProps?.nodeName;\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n const thread = await this.getOrCreateThread(threadId, forwardedProps?.threadMetadata);\n this.activeRun!.threadId = thread.thread_id;\n\n const agentState: ThreadState<State> =\n (await this.client.threads.getState(thread.thread_id)) ??\n ({ values: {} } as ThreadState<State>);\n const agentStateMessages = agentState.values.messages ?? [];\n const inputMessagesToLangchain = aguiMessagesToLangChain(messages);\n const stateValuesDiff = this.langGraphDefaultMergeState(\n { ...inputState, messages: agentStateMessages },\n inputMessagesToLangchain,\n input,\n );\n // Messages are a combination of existing messages in state + everything that was newly sent\n let threadState = {\n ...agentState,\n values: {\n ...stateValuesDiff,\n messages: [...agentStateMessages, ...(stateValuesDiff.messages ?? [])],\n },\n };\n let stateValues = threadState.values;\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n if (\n (agentState.values.messages ?? []).length > messages.filter((m) => m.role !== \"system\").length\n ) {\n let lastUserMessage: LangGraphMessage | null = null;\n // Find the first user message by working backwards from the last message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n lastUserMessage = aguiMessagesToLangChain([messages[i]])[0];\n break;\n }\n }\n\n if (!lastUserMessage) {\n return this.subscriber.error(\"No user message found in messages to regenerate\");\n }\n\n return this.prepareRegenerateStream(\n { ...input, messageCheckpoint: lastUserMessage },\n streamMode,\n );\n }\n this.activeRun!.graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\n\n const mode =\n !forwardedProps?.command?.resume &&\n threadId &&\n this.activeRun!.nodeName != \"__end__\" &&\n this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\") {\n const nodeBefore = this.activeRun!.graphInfo.edges.find(\n (e) => e.target === this.activeRun!.nodeName,\n );\n await this.client.threads.updateState(threadId, {\n values: inputState,\n asNode: nodeBefore?.source,\n });\n }\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state: stateValues,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n let payloadConfig: LangGraphConfig | undefined;\n const configsToMerge = [this.assistantConfig, forwardedProps?.config].filter(\n Boolean,\n ) as LangGraphConfig[];\n if (configsToMerge.length) {\n payloadConfig = await this.mergeConfigs({\n configs: configsToMerge,\n assistant: this.assistant,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n }\n const payload = {\n ...forwardedProps,\n streamMode,\n input: payloadInput,\n config: payloadConfig,\n context: {\n ...context,\n ...(payloadConfig?.configurable ?? {}),\n }\n };\n\n // If there are still outstanding unresolved interrupts, we must force resolution of them before moving forward\n const interrupts = (agentState.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n if (interrupts?.length && !forwardedProps?.command?.resume) {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: input.runId,\n });\n this.handleNodeChange(nodeNameInput)\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: input.runId,\n });\n return this.subscriber.complete();\n }\n\n return {\n // @ts-ignore\n streamResponse: this.client.runs.stream(threadId, this.assistant.assistant_id, payload),\n state: threadState as ThreadState<State>,\n };\n }\n\n async handleStreamEvents(\n stream: Awaited<\n ReturnType<typeof this.prepareStream> | ReturnType<typeof this.prepareRegenerateStream>\n >,\n threadId: string,\n subscriber: Subscriber<ProcessedEvents>,\n input: RunAgentExtendedInput,\n streamModes: StreamMode | StreamMode[],\n ) {\n const { forwardedProps } = input;\n const nodeNameInput = forwardedProps?.nodeName;\n this.subscriber = subscriber;\n let shouldExit = false;\n if (!stream) return;\n\n let { streamResponse, state } = stream;\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {} as ThreadState<State>[\"values\"];\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.handleNodeChange(nodeNameInput)\n\n for await (let streamResponseChunk of streamResponse) {\n const subgraphsStreamEnabled = input.forwardedProps?.streamSubgraphs;\n const isSubgraphStream =\n subgraphsStreamEnabled &&\n (streamResponseChunk.event.startsWith(\"events\") ||\n streamResponseChunk.event.startsWith(\"values\"));\n\n // @ts-ignore\n if (!streamModes.includes(streamResponseChunk.event as StreamMode) && !isSubgraphStream && streamResponseChunk.event !== 'error') {\n continue;\n }\n\n // Force event type, as data is not properly defined on the LG side.\n type EventsChunkData = {\n __interrupt__?: any;\n metadata: Record<string, any>;\n event: string;\n data: any;\n [key: string]: unknown;\n };\n const chunk = streamResponseChunk as EventsStreamEvent & { data: EventsChunkData };\n\n if (streamResponseChunk.event === \"error\") {\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: streamResponseChunk.data.message,\n rawEvent: streamResponseChunk,\n });\n break;\n }\n\n if (streamResponseChunk.event === \"updates\") {\n continue;\n }\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n } else if (subgraphsStreamEnabled && chunk.event.startsWith(\"values|\")) {\n latestStateValues = {\n ...latestStateValues,\n ...chunk.data,\n };\n continue;\n }\n\n const chunkData = chunk.data;\n const metadata = chunkData.metadata ?? {};\n const currentNodeName = metadata.langgraph_node;\n const eventType = chunkData.event;\n\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n this.handleNodeChange(currentNodeName)\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (this.activeRun!.graphInfo?.[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.handleNodeChange(currentNodeName)\n }\n\n updatedState.values = this.activeRun!.manuallyEmittedState ?? latestStateValues;\n\n if (!this.activeRun!.nodeName) {\n continue;\n }\n\n const hasStateDiff = JSON.stringify(updatedState) !== JSON.stringify(state);\n // We should not update snapshot while a message is in progress.\n if (\n (hasStateDiff ||\n this.activeRun!.prevNodeName != this.activeRun!.nodeName ||\n this.activeRun!.exitingNode) &&\n !Boolean(this.getMessageInProgress(this.activeRun!.id))\n ) {\n state = updatedState;\n this.activeRun!.prevNodeName = this.activeRun!.nodeName;\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n rawEvent: chunk,\n });\n }\n\n this.dispatchEvent({\n type: EventType.RAW,\n event: chunkData,\n });\n\n this.handleSingleEvent(chunkData);\n }\n\n state = await this.client.threads.getState(threadId);\n const tasks = state.tasks;\n const interrupts = (tasks?.[0]?.interrupts ?? []) as Interrupt[];\n const isEndNode = state.next.length === 0;\n const writes = state.metadata?.writes ?? {};\n\n // Initialize a new node name to use in the next if block\n let newNodeName = this.activeRun!.nodeName!;\n\n if (!interrupts?.length) {\n newNodeName = isEndNode ? \"__end__\" : (state.next[0] ?? Object.keys(writes)[0]);\n }\n\n interrupts.forEach((interrupt) => {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: LangGraphEventTypes.OnInterrupt,\n value:\n typeof interrupt.value === \"string\" ? interrupt.value : JSON.stringify(interrupt.value),\n rawEvent: interrupt,\n });\n });\n\n this.handleNodeChange(newNodeName);\n // Immediately turn off new step\n this.handleNodeChange(undefined);\n\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui((state.values as { messages: any[] }).messages ?? []),\n });\n\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n this.activeRun = undefined;\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any): void {\n switch (event.event) {\n case LangGraphEventTypes.OnChatModelStream:\n let shouldEmitMessages = event.metadata[\"emit-messages\"] ?? true;\n let shouldEmitToolCalls = event.metadata[\"emit-tool-calls\"] ?? true;\n\n if (event.data.chunk.response_metadata.finish_reason) return;\n let currentStream = this.getMessageInProgress(this.activeRun!.id);\n const hasCurrentStream = Boolean(currentStream?.id);\n const toolCallData = event.data.chunk.tool_call_chunks?.[0];\n const toolCallUsedToPredictState = event.metadata[\"predict_state\"]?.some(\n (predictStateTool: PredictStateTool) => predictStateTool.tool === toolCallData?.name,\n );\n\n const isToolCallStartEvent = !hasCurrentStream && toolCallData?.name;\n const isToolCallArgsEvent =\n hasCurrentStream && currentStream?.toolCallId && toolCallData?.args;\n const isToolCallEndEvent = hasCurrentStream && currentStream?.toolCallId && !toolCallData;\n\n if (isToolCallEndEvent || isToolCallArgsEvent || isToolCallStartEvent) {\n this.activeRun!.hasFunctionStreaming = true;\n }\n\n const reasoningData = resolveReasoningContent(event.data);\n const messageContent = resolveMessageContent(event.data.chunk.content);\n const isMessageContentEvent = Boolean(!toolCallData && messageContent);\n\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\n\n if (reasoningData) {\n this.handleThinkingEvent(reasoningData);\n break;\n }\n\n if (!reasoningData && this.thinkingProcess) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (toolCallUsedToPredictState) {\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: \"PredictState\",\n value: event.metadata[\"predict_state\"],\n });\n }\n\n if (isToolCallEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: currentStream?.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isMessageEndEvent) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: currentStream!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n\n if (isToolCallStartEvent && shouldEmitToolCalls) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n parentMessageId: event.data.chunk.id,\n rawEvent: event,\n });\n if (resolved) {\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: toolCallData.id,\n toolCallName: toolCallData.name,\n });\n }\n break;\n }\n\n // Tool call args: emit ActionExecutionArgs\n if (isToolCallArgsEvent && shouldEmitToolCalls) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: currentStream?.toolCallId!,\n delta: toolCallData.args,\n rawEvent: event,\n });\n break;\n }\n\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n // No existing message yet, also init the message\n if (!currentStream) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.chunk.id,\n rawEvent: event,\n });\n this.setMessageInProgress(this.activeRun!.id, {\n id: event.data.chunk.id,\n toolCallId: null,\n toolCallName: null,\n });\n currentStream = this.getMessageInProgress(this.activeRun!.id);\n }\n\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: messageContent!,\n rawEvent: event,\n });\n break;\n }\n\n break;\n case LangGraphEventTypes.OnChatModelEnd:\n if (this.getMessageInProgress(this.activeRun!.id)?.toolCallId) {\n const resolved = this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: this.getMessageInProgress(this.activeRun!.id)!.toolCallId!,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n if (this.getMessageInProgress(this.activeRun!.id)?.id) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: this.getMessageInProgress(this.activeRun!.id)!.id,\n rawEvent: event,\n });\n if (resolved) {\n this.messagesInProcess[this.activeRun!.id] = null;\n }\n break;\n }\n break;\n case LangGraphEventTypes.OnCustomEvent:\n if (event.name === CustomEventNames.ManuallyEmitMessage) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: event.data.message_id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.data.message_id,\n delta: event.data.message,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.data.message_id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitToolCall) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.data.id,\n toolCallName: event.data.name,\n parentMessageId: event.data.id,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.data.id,\n delta: event.data.args,\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.data.id,\n rawEvent: event,\n });\n break;\n }\n\n if (event.name === CustomEventNames.ManuallyEmitState) {\n this.activeRun!.manuallyEmittedState = event.data;\n this.dispatchEvent({\n type: EventType.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot({\n values: this.activeRun!.manuallyEmittedState!,\n } as ThreadState<State>),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.CUSTOM,\n name: event.name,\n value: event.data,\n rawEvent: event,\n });\n break;\n case LangGraphEventTypes.OnToolEnd:\n const toolCallOutput = event.data?.output\n if (!this.activeRun!.hasFunctionStreaming) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCallOutput.tool_call_id,\n toolCallName: toolCallOutput.name,\n parentMessageId: toolCallOutput.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCallOutput.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n this.dispatchEvent({\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCallOutput.tool_call_id,\n rawEvent: event,\n });\n }\n this.dispatchEvent({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: toolCallOutput.tool_call_id,\n content: toolCallOutput?.content,\n messageId: randomUUID(),\n role: \"tool\",\n })\n break;\n }\n }\n\n handleThinkingEvent(reasoningData: LangGraphReasoning) {\n if (!reasoningData || !reasoningData.type || !reasoningData.text) {\n return;\n }\n\n const thinkingStepIndex = reasoningData.index;\n\n if (this.thinkingProcess?.index && this.thinkingProcess.index !== thinkingStepIndex) {\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_END,\n });\n }\n this.dispatchEvent({\n type: EventType.THINKING_END,\n });\n this.thinkingProcess = null;\n }\n\n if (!this.thinkingProcess) {\n // No thinking step yet. Start a new one\n this.dispatchEvent({\n type: EventType.THINKING_START,\n });\n this.thinkingProcess = {\n index: thinkingStepIndex,\n };\n }\n\n if (this.thinkingProcess.type !== reasoningData.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_START,\n });\n this.thinkingProcess.type = reasoningData.type;\n }\n\n if (this.thinkingProcess.type) {\n this.dispatchEvent({\n type: EventType.THINKING_TEXT_MESSAGE_CONTENT,\n delta: reasoningData.text,\n });\n }\n }\n\n getStateSnapshot(threadState: ThreadState<State>) {\n let state = threadState.values;\n const schemaKeys = this.activeRun!.schemaKeys!;\n // Do not emit state keys that are not part of the output schema\n if (schemaKeys?.output) {\n state = filterObjectBySchemaKeys(state, [...this.constantSchemaKeys, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThread(threadId: string, threadMetadata?: Record<string, any>): Promise<Thread> {\n let thread: Thread;\n try {\n try {\n thread = await this.getThread(threadId);\n } catch (error) {\n thread = await this.createThread({\n threadId,\n metadata: threadMetadata,\n });\n }\n } catch (error: unknown) {\n throw new Error(`Failed to create thread: ${(error as Error).message}`);\n }\n\n return thread;\n }\n\n async getThread(threadId: string) {\n return this.client.threads.get(threadId);\n }\n\n async createThread(payload?: Parameters<typeof this.client.threads.create>[0]) {\n return this.client.threads.create(payload);\n }\n\n async mergeConfigs({\n configs,\n assistant,\n schemaKeys,\n }: {\n configs: Config[];\n assistant: Assistant;\n schemaKeys: SchemaKeys;\n }) {\n return configs.reduce((acc, cfg) => {\n let filteredConfigurable = acc.configurable;\n\n if (cfg.configurable) {\n filteredConfigurable = schemaKeys?.config\n ? filterObjectBySchemaKeys(cfg?.configurable, [\n ...this.constantSchemaKeys,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) => searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\n let contextSchema: string[] = []\n if ('context_schema' in graphSchema && graphSchema.context_schema?.properties) {\n contextSchema = Object.keys(graphSchema.context_schema.properties);\n }\n if (graphSchema.config_schema?.properties) {\n configSchema = Object.keys(graphSchema.config_schema.properties);\n }\n if (!graphSchema.input_schema?.properties || !graphSchema.output_schema?.properties) {\n return { config: [], input: null, output: null, context: contextSchema };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input:\n inputSchema && inputSchema.length ? [...inputSchema, ...this.constantSchemaKeys] : null,\n output:\n outputSchema && outputSchema.length\n ? [...outputSchema, ...this.constantSchemaKeys]\n : null,\n context: contextSchema,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: this.constantSchemaKeys, output: this.constantSchemaKeys, context: [] };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], input: RunAgentExtendedInput): State<StateEnrichment> {\n if (messages.length > 0 && \"role\" in messages[0] && messages[0].role === \"system\") {\n // remove system message\n messages = messages.slice(1);\n }\n\n // merge with existing messages\n const existingMessages: LangGraphPlatformMessage[] = state.messages || [];\n const existingMessageIds = new Set(existingMessages.map((message) => message.id));\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n const langGraphTools: LangGraphToolWithName[] = [...(state.tools ?? []), ...(input.tools ?? [])].reduce((acc, tool) => {\n let mappedTool = tool;\n if (!tool.type) {\n mappedTool = {\n type: \"function\",\n name: tool.name,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }\n }\n\n // Verify no duplicated\n if (acc.find((t: LangGraphToolWithName) => (t.name === mappedTool.name) || t.function.name === mappedTool.function.name)) return acc;\n\n return [...acc, mappedTool];\n }, []);\n\n return {\n ...state,\n messages: newMessages,\n tools: langGraphTools,\n 'ag-ui': {\n tools: langGraphTools,\n context: input.context,\n }\n };\n }\n\n handleNodeChange(nodeName: string | undefined) {\n if (nodeName === \"__end__\") {\n nodeName = undefined;\n }\n if (nodeName !== this.activeRun?.nodeName) {\n // End current step\n if (this.activeRun?.nodeName) {\n this.endStep();\n }\n // If we actually got a node name, start a new step\n if (nodeName) {\n this.startStep(nodeName);\n }\n }\n this.activeRun!.nodeName = nodeName;\n }\n\n startStep(nodeName: string) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: nodeName,\n });\n }\n\n endStep() {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n\n async getCheckpointByMessage(\n messageId: string,\n threadId: string,\n checkpoint?: null | {\n checkpoint_id?: null | string;\n checkpoint_ns: string;\n },\n ): Promise<ThreadState> {\n const options = checkpoint?.checkpoint_id\n ? {\n checkpoint: { checkpoint_id: checkpoint.checkpoint_id },\n }\n : undefined;\n const history = await this.client.threads.getHistory(threadId, options);\n const reversed = [...history].reverse(); // oldest → newest\n\n let targetState = reversed.find((state) =>\n (state.values as State).messages?.some((m: LangGraphPlatformMessage) => m.id === messageId),\n );\n\n if (!targetState) throw new Error(\"Message not found\");\n\n const targetStateMessages = (targetState.values as State).messages ?? [];\n const messageIndex = targetStateMessages.findIndex(\n (m: LangGraphPlatformMessage) => m.id === messageId,\n );\n const messagesAfter = targetStateMessages.slice(messageIndex + 1);\n if (messagesAfter.length) {\n return this.getCheckpointByMessage(messageId, threadId, targetState.parent_checkpoint);\n }\n\n const targetStateIndex = reversed.indexOf(targetState);\n\n const { messages, ...targetStateValuesWithoutMessages } = targetState.values as State;\n const selectedCheckpoint = reversed[targetStateIndex - 1] ?? { ...targetState, values: {} };\n return {\n ...selectedCheckpoint,\n values: { ...selectedCheckpoint.values, ...targetStateValuesWithoutMessages },\n };\n }\n}\n\nexport * from \"./types\";\n","import { AssistantGraph, Message as LangGraphMessage, } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\nimport { RunAgentInput } from \"@ag-ui/core\";\n\nexport enum LangGraphEventTypes {\n OnChainStart = \"on_chain_start\",\n OnChainStream = \"on_chain_stream\",\n OnChainEnd = \"on_chain_end\",\n OnChatModelStart = \"on_chat_model_start\",\n OnChatModelStream = \"on_chat_model_stream\",\n OnChatModelEnd = \"on_chat_model_end\",\n OnToolStart = \"on_tool_start\",\n OnToolEnd = \"on_tool_end\",\n OnCustomEvent = \"on_custom_event\",\n OnInterrupt = \"on_interrupt\",\n}\n\nexport type LangGraphToolWithName = {\n type: \"function\";\n name?: string;\n function: {\n name: string;\n description: string;\n parameters: any;\n },\n}\n\nexport type State<TDefinedState = Record<string, any>> = {\n [k in keyof TDefinedState]: TDefinedState[k] | null;\n} & Record<string, any>;\nexport interface StateEnrichment {\n messages: LangGraphMessage[];\n tools: LangGraphToolWithName[];\n 'ag-ui': {\n tools: LangGraphToolWithName[];\n context: RunAgentInput['context']\n }\n}\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: string[] | null;\n context: string[] | null;\n config: string[] | null;\n} | null;\n\nexport type MessageInProgress = {\n id: string;\n toolCallId?: string | null;\n toolCallName?: string | null;\n};\n\nexport type ThinkingInProgress = {\n index: number;\n type?: LangGraphReasoning['type'];\n}\n\nexport interface RunMetadata {\n id: string;\n schemaKeys?: SchemaKeys;\n nodeName?: string;\n prevNodeName?: string | null;\n exitingNode?: boolean;\n manuallyEmittedState?: State | null;\n threadId?: string;\n graphInfo?: AssistantGraph\n hasFunctionStreaming?: boolean;\n}\n\nexport type MessagesInProgressRecord = Record<string, MessageInProgress | null>;\n\n// The following types are our own definition to the messages accepted by LangGraph Platform, enhanced with some of our extra data.\nexport interface ToolCall {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\ntype BaseLangGraphPlatformMessage = Omit<\n LangGraphMessage,\n | \"isResultMessage\"\n | \"isTextMessage\"\n | \"isImageMessage\"\n | \"isActionExecutionMessage\"\n | \"isAgentStateMessage\"\n | \"type\"\n | \"createdAt\"\n> & {\n content: string;\n role: string;\n additional_kwargs?: Record<string, unknown>;\n type: MessageType;\n};\n\ninterface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {\n tool_call_id: string;\n name: string;\n}\n\ninterface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {\n tool_calls: ToolCall[];\n}\n\nexport type LangGraphPlatformMessage =\n | LangGraphPlatformActionExecutionMessage\n | LangGraphPlatformResultMessage\n | BaseLangGraphPlatformMessage;\n\nexport enum CustomEventNames {\n ManuallyEmitMessage = \"manually_emit_message\",\n ManuallyEmitToolCall = \"manually_emit_tool_call\",\n ManuallyEmitState = \"manually_emit_state\",\n Exit = \"exit\",\n}\n\nexport interface PredictStateTool {\n tool: string;\n state_key: string;\n tool_argument: string;\n}\n\nexport interface LangGraphReasoning {\n type: 'text';\n text: string;\n index: number\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys, LangGraphReasoning } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"messages\", \"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"ai\":\n const content = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: content ? stringifyIfNeeded(content) : '',\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(resolveMessageContent(message.content)),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n\nexport function resolveReasoningContent(eventData: any): LangGraphReasoning | null {\n const content = eventData.chunk?.content\n\n // Anthropic reasoning response\n if (content && Array.isArray(content) && content.length && content[0]) {\n if (!content[0].thinking) return null\n return {\n text: content[0].thinking,\n type: 'text',\n index: content[0].index,\n }\n }\n\n /// OpenAI reasoning response\n if (eventData.chunk.additional_kwargs?.reasoning?.summary?.[0]) {\n const data = eventData.chunk.additional_kwargs?.reasoning.summary[0]\n if (!data || !data.text) return null\n return {\n type: 'text',\n text: data.text,\n index: data.index,\n }\n }\n\n return null\n}\n\nexport function resolveMessageContent(content?: LangGraphMessage['content']): string | null {\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content) && content.length) {\n const contentText = content.find(c => c.type === 'text')?.text\n return contentText ?? null;\n }\n\n return null\n}\n"],"mappings":"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","names":["HttpAgent","Observable","LangGraphClient","randomUUID","LangGraphEventTypes","CustomEventNames","AbstractAgent","EventType","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","resolveMessageContent","content","tc","aguiMessagesToLangChain","index","_b","item","resolveReasoningContent","eventData","_c","_d","_e","data","contentText","c","LangGraphAgent","_LangGraphAgent","AbstractAgent","config","_a","_b","DEFAULT_SCHEMA_KEYS","LangGraphClient","__spreadValues","event","input","Observable","subscriber","_c","threadId","randomUUID","streamMode","preparedStream","__spreadProps","messageCheckpoint","timeTravelCheckpoint","fork","payload","_d","_e","_f","_g","_h","_i","_j","inputThreadId","inputState","messages","tools","context","forwardedProps","nodeNameInput","thread","agentState","agentStateMessages","inputMessagesToLangchain","aguiMessagesToLangChain","stateValuesDiff","threadState","stateValues","m","lastUserMessage","i","mode","nodeBefore","e","payloadInput","getStreamPayloadInput","payloadConfig","configsToMerge","interrupts","EventType","interrupt","stream","streamModes","shouldExit","streamResponse","state","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","subgraphsStreamEnabled","isSubgraphStream","chunk","chunkData","metadata","currentNodeName","eventType","node","tasks","isEndNode","writes","newNodeName","langchainMessagesToAgui","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","reasoningData","resolveReasoningContent","messageContent","resolveMessageContent","isMessageContentEvent","isMessageEndEvent","toolCallOutput","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","newMessages","langGraphTools","tool","mappedTool","t","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","__objRest","selectedCheckpoint","LangGraphHttpAgent","HttpAgent"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ag-ui/langgraph",
|
|
3
|
-
"version": "0.0.18
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"ts-jest": "^29.1.2",
|
|
31
31
|
"tsup": "^8.0.2",
|
|
32
32
|
"typescript": "^5.3.3",
|
|
33
|
-
"@ag-ui/
|
|
34
|
-
"@ag-ui/
|
|
33
|
+
"@ag-ui/client": "0.0.40",
|
|
34
|
+
"@ag-ui/core": "0.0.39"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "tsup",
|