@ag-ui/langgraph 0.0.22-next.0 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";var q=Object.defineProperty,yt=Object.defineProperties,vt=Object.getOwnPropertyDescriptor,_t=Object.getOwnPropertyDescriptors,Tt=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols;var Q=Object.prototype.hasOwnProperty,ot=Object.prototype.propertyIsEnumerable;var it=(s,n)=>(n=Symbol[s])?n:Symbol.for("Symbol."+s);var rt=(s,n,t)=>n in s?q(s,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[n]=t,E=(s,n)=>{for(var t in n||(n={}))Q.call(n,t)&&rt(s,t,n[t]);if(X)for(var t of X(n))ot.call(n,t)&&rt(s,t,n[t]);return s},T=(s,n)=>yt(s,_t(n));var lt=(s,n)=>{var t={};for(var e in s)Q.call(s,e)&&n.indexOf(e)<0&&(t[e]=s[e]);if(s!=null&&X)for(var e of X(s))n.indexOf(e)<0&&ot.call(s,e)&&(t[e]=s[e]);return t};var It=(s,n)=>{for(var t in n)q(s,t,{get:n[t],enumerable:!0})},Mt=(s,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of Tt(n))!Q.call(s,a)&&a!==t&&q(s,a,{get:()=>n[a],enumerable:!(e=vt(n,a))||e.enumerable});return s};var Rt=s=>Mt(q({},"__esModule",{value:!0}),s);var ht=(s,n,t)=>(n=s[it("asyncIterator")])?n.call(s):(s=s[it("iterator")](),n={},t=(e,a)=>(a=s[e])&&(n[e]=i=>new Promise((r,g,u)=>(i=a.call(s,i),u=i.done,Promise.resolve(i.value).then(l=>r({value:l,done:u}),g)))),t("next"),t("return"),n);var Nt={};It(Nt,{CustomEventNames:()=>ct,LangGraphAgent:()=>et,LangGraphEventTypes:()=>dt,LangGraphHttpAgent:()=>nt});module.exports=Rt(Nt);var Et=require("@ag-ui/client");var mt=require("rxjs"),ft=require("@langchain/langgraph-sdk"),B=require("@ag-ui/client");var dt=(h=>(h.OnChainStart="on_chain_start",h.OnChainStream="on_chain_stream",h.OnChainEnd="on_chain_end",h.OnChatModelStart="on_chat_model_start",h.OnChatModelStream="on_chat_model_stream",h.OnChatModelEnd="on_chat_model_end",h.OnToolStart="on_tool_start",h.OnToolEnd="on_tool_end",h.OnCustomEvent="on_custom_event",h.OnInterrupt="on_interrupt",h))(dt||{}),ct=(a=>(a.ManuallyEmitMessage="manually_emit_message",a.ManuallyEmitToolCall="manually_emit_tool_call",a.ManuallyEmitState="manually_emit_state",a.Exit="exit",a))(ct||{});var o=require("@ag-ui/client");var Z=["messages","tools"];function Y(s,n){return Object.fromEntries(Object.entries(s).filter(([t])=>n.includes(t)))}function gt({mode:s,state:n,schemaKeys:t}){let e=s==="start"?n:null;return e&&(t!=null&&t.input)&&(e=Y(e,[...Z,...t.input])),e}function Ct(s){var t;let n=[];for(let e of s)if(e.type==="text"&&e.text)n.push({type:"text",text:e.text});else if(e.type==="image_url"){let a=typeof e.image_url=="string"?e.image_url:(t=e.image_url)==null?void 0:t.url;if(!a)continue;if(a.startsWith("data:")){let[i,r]=a.split(",",2),g=i.includes(":")?i.split(":")[1].split(";")[0]:"image/png";n.push({type:"binary",mimeType:g,data:r||""})}else n.push({type:"binary",mimeType:"image/png",url:a})}return n}function xt(s){let n=[];for(let t of s)if(t.type==="text")n.push({type:"text",text:t.text});else if(t.type==="binary"){let e;if(t.url)e=t.url;else if(t.data)e=`data:${t.mimeType};base64,${t.data}`;else if(t.id)e=t.id;else continue;n.push({type:"image_url",image_url:{url:e}})}return n}function ut(s){return s.map(n=>{var t;switch(n.type){case"human":let e;return Array.isArray(n.content)?e=Ct(n.content):e=V(K(n.content)),{id:n.id,role:"user",content:e};case"ai":let a=K(n.content);return{id:n.id,role:"assistant",content:a?V(a):"",toolCalls:(t=n.tool_calls)==null?void 0:t.map(i=>({id:i.id,type:"function",function:{name:i.name,arguments:JSON.stringify(i.args)}}))};case"system":return{id:n.id,role:"system",content:V(K(n.content))};case"tool":return{id:n.id,role:"tool",content:V(K(n.content)),toolCallId:n.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function tt(s){return s.map((n,t)=>{var e,a;switch(n.role){case"user":let i;return typeof n.content=="string"?i=n.content:Array.isArray(n.content)?i=xt(n.content):i=String(n.content),{id:n.id,role:n.role,content:i,type:"human"};case"assistant":return{id:n.id,type:"ai",role:n.role,content:(e=n.content)!=null?e:"",tool_calls:((a=n.toolCalls)!=null?a:[]).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 V(s){return typeof s=="string"?s:JSON.stringify(s)}function pt(s){var t,e,a,i,r;let n=(t=s.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((i=(a=(e=s.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:a.summary)!=null&&i[0]){let g=(r=s.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 K(s){var n;if(!s)return null;if(typeof s=="string")return s;if(Array.isArray(s)&&s.length){let t=(n=s.find(e=>e.type==="text"))==null?void 0:n.text;return t!=null?t:null}return null}var et=class s extends o.AbstractAgent{constructor(t){var e,a;super(t);this.cancelRequested=!1;this.cancelSent=!1;this.constantSchemaKeys=Z;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(a=t==null?void 0:t.client)!=null?a:new ft.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:E({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new s(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new mt.Observable(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var g,u,l;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.cancelRequested=!1,this.cancelSent=!1,this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let a=(g=t.threadId)!=null?g:(0,B.randomUUID)(),i=(l=(u=t.forwardedProps)==null?void 0:u.streamMode)!=null?l:["events","values","updates"],r=await this.prepareStream(T(E({},t),{threadId:a}),i);if(!r)return e.error("No stream to regenerate");await this.handleStreamEvents(r,a,e,t,Array.isArray(i)?i:[i])}async prepareRegenerateStream(t,e){var l,h,c;let{threadId:a,messageCheckpoint:i}=t,r=await this.getCheckpointByMessage(i.id,a);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(a,{values:this.langGraphDefaultMergeState(r.values,[],t),checkpointId:r.checkpoint.checkpoint_id,asNode:(h=(l=r.next)==null?void 0:l[0])!=null?h:"__start__"}),u=T(E({},(c=t.forwardedProps)!=null?c:{}),{input:this.langGraphDefaultMergeState(r.values,[i],t),checkpointId:g.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(a,this.assistant.assistant_id,u),state:r,streamMode:e}}async prepareStream(t,e){var U,A,L,O,b,m,d,w,G,$;let{threadId:a,state:i,messages:r,tools:g,context:u,forwardedProps:l}=t;this.activeRun.manuallyEmittedState=null;let h=l==null?void 0:l.nodeName,c=a!=null?a:(0,B.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let S=await this.getOrCreateThread(c,l==null?void 0:l.threadMetadata);this.activeRun.threadId=S.thread_id;let y=(U=await this.client.threads.getState(S.thread_id))!=null?U:{values:{}},I=(A=y.values.messages)!=null?A:[],C=tt(r),R=this.langGraphDefaultMergeState(T(E({},i),{messages:I}),C,t),x=T(E({},y),{values:T(E({},R),{messages:[...I,...(L=R.messages)!=null?L:[]]})}),N=x.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((O=y.values.messages)!=null?O:[]).length>r.filter(v=>v.role!=="system").length){let v=null;for(let k=r.length-1;k>=0;k--)if(r[k].role==="user"){v=tt([r[k]])[0];break}return v?this.prepareRegenerateStream(T(E({},t),{messageCheckpoint:v}),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 p=!((b=l==null?void 0:l.command)!=null&&b.resume)&&c&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(p==="continue"){let v=this.activeRun.graphInfo.edges.find(k=>k.target===this.activeRun.nodeName);await this.client.threads.updateState(c,{values:i,asNode:v==null?void 0:v.source})}let M=gt({mode:p,state:N,schemaKeys:this.activeRun.schemaKeys}),f,J=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);J.length&&(f=await this.mergeConfigs({configs:J,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let W=T(E({},l),{streamMode:e,input:M,config:f,context:E(E({},u),(m=f==null?void 0:f.configurable)!=null?m:{})}),P=(G=(w=(d=y.tasks)==null?void 0:d[0])==null?void 0:w.interrupts)!=null?G:[];return P!=null&&P.length&&!(($=l==null?void 0:l.command)!=null&&$.resume)?(this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:c,runId:t.runId}),this.handleNodeChange(h),P.forEach(v=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof v.value=="string"?v.value:JSON.stringify(v.value),rawEvent:v})}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:c,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(c,this.assistant.assistant_id,W),state:x}}async handleStreamEvents(t,e,a,i,r){var I,C,R,x,N,p,M,f,A,L,O,b,m,d;let{forwardedProps:g}=i,u=g==null?void 0:g.nodeName;this.subscriber=a;let l=!1;if(!t)return;let{streamResponse:h,state:c}=t;this.activeRun.prevNodeName=null;let S={},y=c;try{this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(u);try{for(var J=ht(h),W,P,U;W=!(P=await J.next()).done;W=!1){let _=P.value;if(this.cancelRequested&&!this.cancelSent&&((I=this.activeRun)!=null&&I.threadId)&&((C=this.activeRun)!=null&&C.id)){try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch(j){}finally{this.cancelSent=!0}try{await((R=h==null?void 0:h.return)==null?void 0:R.call(h))}catch(j){}break}let at=(x=i.forwardedProps)==null?void 0:x.streamSubgraphs,St=at&&(_.event.startsWith("events")||_.event.startsWith("values"));if(!r.includes(_.event)&&!St&&_.event!=="error")continue;let F=_;if(_.event==="error"){this.dispatchEvent({type:o.EventType.RUN_ERROR,message:_.data.message,rawEvent:_});break}if(_.event==="updates")continue;if(_.event==="values"){S=F.data;continue}else if(at&&F.event.startsWith("values|")){S=E(E({},S),F.data);continue}let H=F.data,z=(N=H.metadata)!=null?N:{},D=z.langgraph_node,st=H.event;if(z.run_id&&(this.activeRun.id=z.run_id,this.activeRun.serverRunIdKnown=!0,this.cancelRequested&&!this.cancelSent&&((p=this.activeRun)!=null&&p.threadId)))try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch(j){}finally{this.cancelSent=!0}if(D&&D!==this.activeRun.nodeName&&this.handleNodeChange(D),l=l||st==="on_custom_event"&&H.name==="exit",st==="on_chain_end"&&this.activeRun.nodeName===D&&(this.activeRun.exitingNode=!0),this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(M=this.activeRun.graphInfo)!=null&&M.nodes.some(j=>j.id===D)&&this.handleNodeChange(D),y.values=(f=this.activeRun.manuallyEmittedState)!=null?f:S,!this.activeRun.nodeName)continue;(JSON.stringify(y)!==JSON.stringify(c)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(c=y,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(c),rawEvent:F})),this.dispatchEvent({type:o.EventType.RAW,event:H}),this.handleSingleEvent(H)}}catch(P){U=[P]}finally{try{W&&(P=J.return)&&await P.call(J)}finally{if(U)throw U[0]}}c=await this.client.threads.getState(e);let w=c.tasks,G=(L=(A=w==null?void 0:w[0])==null?void 0:A.interrupts)!=null?L:[],$=c.next.length===0,v=(b=(O=c.metadata)==null?void 0:O.writes)!=null?b:{},k=this.activeRun.nodeName;return G!=null&&G.length||(k=$?"__end__":(m=c.next[0])!=null?m:Object.keys(v)[0]),G.forEach(_=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof _.value=="string"?_.value:JSON.stringify(_.value),rawEvent:_})}),this.handleNodeChange(k),this.handleNodeChange(void 0),this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(c)}),this.dispatchEvent({type:o.EventType.MESSAGES_SNAPSHOT,messages:ut((d=c.values.messages)!=null?d:[])}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.cancelRequested=!1,this.cancelSent=!1,this.activeRun=void 0,a.complete()}catch(w){return a.error(w)}}handleSingleEvent(t){var e,a,i,r,g,u,l,h,c,S,y,I,C,R;switch(t.event){case"on_chat_model_stream":let x=(e=t.metadata["emit-messages"])!=null?e:!0,N=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let p=this.getMessageInProgress(this.activeRun.id),M=!!(p!=null&&p.id),f=(i=t.data.chunk.tool_call_chunks)==null?void 0:i[0],J=(r=t.metadata.predict_state)==null?void 0:r.some(d=>d.tool===(f==null?void 0:f.name)),W=!M&&(f==null?void 0:f.name),P=M&&(p==null?void 0:p.toolCallId)&&(f==null?void 0:f.args),U=M&&(p==null?void 0:p.toolCallId)&&!f;(U||P||W)&&(this.activeRun.hasFunctionStreaming=!0);let A=pt(t.data),L=K(t.data.chunk.content),O=!!(!f&&L),b=M&&!(p!=null&&p.toolCallId)&&!O;if(A){this.handleThinkingEvent(A);break}if(!A&&this.thinkingProcess&&(this.dispatchEvent({type:o.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.EventType.THINKING_END}),this.thinkingProcess=null),J&&this.dispatchEvent({type:o.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),U){this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:p==null?void 0:p.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(b){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:p.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(W&&N){this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:f.id,toolCallName:f.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:f.id,toolCallName:f.name});break}if(P&&N){this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:p==null?void 0:p.toolCallId,delta:f.args,rawEvent:t});break}if(O&&x){p||(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}),p=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_CONTENT,messageId:p.id,delta:L,rawEvent:t});break}break;case"on_chat_model_end":if((g=this.getMessageInProgress(this.activeRun.id))!=null&&g.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((u=this.getMessageInProgress(this.activeRun.id))!=null&&u.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 m=(l=t.data)==null?void 0:l.output;if(m&&!m.tool_call_id&&((c=(h=m.update)==null?void 0:h.messages)!=null&&c.find(d=>d.type==="tool"))&&(m=(y=(S=m.update)==null?void 0:S.messages)==null?void 0:y.find(d=>d.type==="tool")),m&&((C=(I=m.update)==null?void 0:I.messages)!=null&&C.length)){(R=m.update)==null||R.messages.filter(d=>d.type==="tool").forEach(d=>{!this.activeRun.hasFunctionStreaming&&d.tool_call_id&&d.name&&(this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:d.tool_call_id,toolCallName:d.name,parentMessageId:d.id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:d.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t})),d.tool_call_id&&this.dispatchEvent({type:o.EventType.TOOL_CALL_RESULT,toolCallId:d.tool_call_id,content:typeof(d==null?void 0:d.content)=="string"?d==null?void 0:d.content:JSON.stringify(d==null?void 0:d.content),messageId:(0,B.randomUUID)(),rawEvent:t,role:"tool"})});break}!this.activeRun.hasFunctionStreaming&&(m!=null&&m.tool_call_id)&&(m!=null&&m.name)&&(this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:m.tool_call_id,toolCallName:m.name,parentMessageId:m.id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:m.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:m.tool_call_id,rawEvent:t})),m!=null&&m.tool_call_id&&this.dispatchEvent({type:o.EventType.TOOL_CALL_RESULT,toolCallId:m.tool_call_id,content:m==null?void 0:m.content,messageId:(0,B.randomUUID)(),role:"tool",rawEvent:t});break}}abortRun(){var a,i;this.cancelRequested=!0;let t=(a=this.activeRun)==null?void 0:a.threadId,e=(i=this.activeRun)==null?void 0:i.id;t&&e&&!this.cancelSent&&this.client.runs.cancel(t,e).then(()=>{this.cancelSent=!0}).catch(()=>{}),super.abortRun()}handleThinkingEvent(t){var a;if(!t||!t.type||!t.text)return;let e=t.index;(a=this.thinkingProcess)!=null&&a.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,a=this.activeRun.schemaKeys;return a!=null&&a.output&&(e=Y(e,[...this.constantSchemaKeys,...a.output])),e}async getOrCreateThread(t,e){let a;try{try{a=await this.getThread(t)}catch(i){a=await this.createThread({threadId:t,metadata:e})}}catch(i){throw new Error(`Failed to create thread: ${i.message}`)}return a}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:a}){return t.reduce((i,r)=>{var S;let g=i.configurable;r.configurable&&(g=a!=null&&a.config?Y(r==null?void 0:r.configurable,[...this.constantSchemaKeys,...(S=a==null?void 0:a.config)!=null?S:[]]):r==null?void 0:r.configurable);let u=T(E(E({},i),r),{configurable:g}),l=i.recursion_limit==null&&r.recursion_limit===25,h=JSON.stringify(u)!==JSON.stringify(i),c=l&&JSON.stringify(T(E({},u),{recursion_limit:null}))===JSON.stringify(T(E({},i),{recursion_limit:null}));return h&&!c?E(E({},i),u):i},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=T(E({},this.messagesInProcess),{[t]:E(E({},this.messagesInProcess[t]),e)})}async getAssistant(){try{let t=await this.client.assistants.search(),e=t.find(a=>a.graph_id===this.graphId);if(!e){let a=`
1
+ "use strict";var Y=Object.defineProperty,yt=Object.defineProperties,vt=Object.getOwnPropertyDescriptor,_t=Object.getOwnPropertyDescriptors,Tt=Object.getOwnPropertyNames,V=Object.getOwnPropertySymbols;var tt=Object.prototype.hasOwnProperty,ht=Object.prototype.propertyIsEnumerable;var ot=(s,n)=>(n=Symbol[s])?n:Symbol.for("Symbol."+s);var lt=(s,n,t)=>n in s?Y(s,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[n]=t,f=(s,n)=>{for(var t in n||(n={}))tt.call(n,t)&&lt(s,t,n[t]);if(V)for(var t of V(n))ht.call(n,t)&&lt(s,t,n[t]);return s},T=(s,n)=>yt(s,_t(n));var et=(s,n)=>{var t={};for(var e in s)tt.call(s,e)&&n.indexOf(e)<0&&(t[e]=s[e]);if(s!=null&&V)for(var e of V(s))n.indexOf(e)<0&&ht.call(s,e)&&(t[e]=s[e]);return t};var It=(s,n)=>{for(var t in n)Y(s,t,{get:n[t],enumerable:!0})},Mt=(s,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of Tt(n))!tt.call(s,a)&&a!==t&&Y(s,a,{get:()=>n[a],enumerable:!(e=vt(n,a))||e.enumerable});return s};var Rt=s=>Mt(Y({},"__esModule",{value:!0}),s);var dt=(s,n,t)=>(n=s[ot("asyncIterator")])?n.call(s):(s=s[ot("iterator")](),n={},t=(e,a)=>(a=s[e])&&(n[e]=i=>new Promise((r,c,g)=>(i=a.call(s,i),g=i.done,Promise.resolve(i.value).then(l=>r({value:l,done:g}),c)))),t("next"),t("return"),n);var Nt={};It(Nt,{CustomEventNames:()=>ut,LangGraphAgent:()=>st,LangGraphEventTypes:()=>ct,LangGraphHttpAgent:()=>it});module.exports=Rt(Nt);var Et=require("@ag-ui/client");var ft=require("rxjs"),St=require("@langchain/langgraph-sdk"),B=require("@ag-ui/client");var ct=(h=>(h.OnChainStart="on_chain_start",h.OnChainStream="on_chain_stream",h.OnChainEnd="on_chain_end",h.OnChatModelStart="on_chat_model_start",h.OnChatModelStream="on_chat_model_stream",h.OnChatModelEnd="on_chat_model_end",h.OnToolStart="on_tool_start",h.OnToolEnd="on_tool_end",h.OnCustomEvent="on_custom_event",h.OnInterrupt="on_interrupt",h))(ct||{}),ut=(a=>(a.ManuallyEmitMessage="manually_emit_message",a.ManuallyEmitToolCall="manually_emit_tool_call",a.ManuallyEmitState="manually_emit_state",a.Exit="exit",a))(ut||{});var o=require("@ag-ui/client");var nt=["messages","tools"];function Q(s,n){return Object.fromEntries(Object.entries(s).filter(([t])=>n.includes(t)))}function gt({mode:s,state:n,schemaKeys:t}){let e=s==="start"?n:null;return e&&(t!=null&&t.input)&&(e=Q(e,[...nt,...t.input])),e}function Ct(s){var t;let n=[];for(let e of s)if(e.type==="text"&&e.text)n.push({type:"text",text:e.text});else if(e.type==="image_url"){let a=typeof e.image_url=="string"?e.image_url:(t=e.image_url)==null?void 0:t.url;if(!a)continue;if(a.startsWith("data:")){let[i,r]=a.split(",",2),c=i.includes(":")?i.split(":")[1].split(";")[0]:"image/png";n.push({type:"binary",mimeType:c,data:r||""})}else n.push({type:"binary",mimeType:"image/png",url:a})}return n}function xt(s){let n=[];for(let t of s)if(t.type==="text")n.push({type:"text",text:t.text});else if(t.type==="binary"){let e;if(t.url)e=t.url;else if(t.data)e=`data:${t.mimeType};base64,${t.data}`;else if(t.id)e=t.id;else continue;n.push({type:"image_url",image_url:{url:e}})}return n}function pt(s){return s.map(n=>{var t;switch(n.type){case"human":let e;return Array.isArray(n.content)?e=Ct(n.content):e=z(K(n.content)),{id:n.id,role:"user",content:e};case"ai":let a=K(n.content);return{id:n.id,role:"assistant",content:a?z(a):"",toolCalls:(t=n.tool_calls)==null?void 0:t.map(i=>({id:i.id,type:"function",function:{name:i.name,arguments:JSON.stringify(i.args)}}))};case"system":return{id:n.id,role:"system",content:z(K(n.content))};case"tool":return{id:n.id,role:"tool",content:z(K(n.content)),toolCallId:n.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function at(s){return s.map((n,t)=>{var e,a;switch(n.role){case"user":let i;return typeof n.content=="string"?i=n.content:Array.isArray(n.content)?i=xt(n.content):i=String(n.content),{id:n.id,role:n.role,content:i,type:"human"};case"assistant":return{id:n.id,type:"ai",role:n.role,content:(e=n.content)!=null?e:"",tool_calls:((a=n.toolCalls)!=null?a:[]).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 z(s){return typeof s=="string"?s:JSON.stringify(s)}function mt(s){var t,e,a,i,r;let n=(t=s.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((i=(a=(e=s.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:a.summary)!=null&&i[0]){let c=(r=s.chunk.additional_kwargs)==null?void 0:r.reasoning.summary[0];return!c||!c.text?null:{type:"text",text:c.text,index:c.index}}return null}function K(s){var n;if(!s)return null;if(typeof s=="string")return s;if(Array.isArray(s)&&s.length){let t=(n=s.find(e=>e.type==="text"))==null?void 0:n.text;return t!=null?t:null}return null}var st=class s extends o.AbstractAgent{constructor(t){var e,a;super(t);this.cancelRequested=!1;this.cancelSent=!1;this.constantSchemaKeys=nt;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(a=t==null?void 0:t.client)!=null?a:new St.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:f({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new s(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new ft.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.cancelRequested=!1,this.cancelSent=!1,this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let a=(c=t.threadId)!=null?c:(0,B.randomUUID)(),i=(l=(g=t.forwardedProps)==null?void 0:g.streamMode)!=null?l:["events","values","updates"],r=await this.prepareStream(T(f({},t),{threadId:a}),i);if(!r)return e.error("No stream to regenerate");await this.handleStreamEvents(r,a,e,t,Array.isArray(i)?i:[i])}async prepareRegenerateStream(t,e){var l,h,d;let{threadId:a,messageCheckpoint:i}=t,r=await this.getCheckpointByMessage(i.id,a);if(this.assistant||(this.assistant=await this.getAssistant()),!r)return this.subscriber.error("No checkpoint found for message");let c=await this.client.threads.updateState(a,{values:this.langGraphDefaultMergeState(r.values,[],t),checkpointId:r.checkpoint.checkpoint_id,asNode:(h=(l=r.next)==null?void 0:l[0])!=null?h:"__start__"}),g=T(f({},(d=t.forwardedProps)!=null?d:{}),{input:this.langGraphDefaultMergeState(r.values,[i],t),checkpointId:c.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(a,this.assistant.assistant_id,g),state:r,streamMode:e}}async prepareStream(t,e){var O,w,b,S,u,G,j,X,U,y;let{threadId:a,state:i,messages:r,tools:c,context:g,forwardedProps:l}=t;this.activeRun.manuallyEmittedState=null;let h=l==null?void 0:l.nodeName,d=a!=null?a:(0,B.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let E=await this.getOrCreateThread(d,l==null?void 0:l.threadMetadata);this.activeRun.threadId=E.thread_id;let _=(O=await this.client.threads.getState(E.thread_id))!=null?O:{values:{}},I=(w=_.values.messages)!=null?w:[],N=at(r),R=this.langGraphDefaultMergeState(T(f({},i),{messages:I}),N,t),A=T(f({},_),{values:T(f({},R),{messages:[...I,...(b=R.messages)!=null?b:[]]})}),k=A.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((S=_.values.messages)!=null?S:[]).length>r.filter(v=>v.role!=="system").length){let v=null;for(let P=r.length-1;P>=0;P--)if(r[P].role==="user"){v=at([r[P]])[0];break}return v?this.prepareRegenerateStream(T(f({},t),{messageCheckpoint:v}),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 p=!((u=l==null?void 0:l.command)!=null&&u.resume)&&d&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(p==="continue"){let v=this.activeRun.graphInfo.edges.find(P=>P.target===this.activeRun.nodeName);await this.client.threads.updateState(d,{values:i,asNode:v==null?void 0:v.source})}let M=gt({mode:p,state:k,schemaKeys:this.activeRun.schemaKeys}),m,J=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);J.length&&(m=await this.mergeConfigs({configs:J,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let x=l,{command:L}=x,W=et(x,["command"]);if(L!=null&&L.resume&&typeof L.resume=="string")try{L.resume=JSON.parse(L.resume)}catch(v){}let $=T(f({},W),{command:L,streamMode:e,input:M,config:m,context:f(f({},g),(G=m==null?void 0:m.configurable)!=null?G:{})}),C=(U=(X=(j=_.tasks)==null?void 0:j[0])==null?void 0:X.interrupts)!=null?U:[];return C!=null&&C.length&&!((y=l==null?void 0:l.command)!=null&&y.resume)?(this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:d,runId:t.runId}),this.handleNodeChange(h),C.forEach(v=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof v.value=="string"?v.value:JSON.stringify(v.value),rawEvent:v})}),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,$),state:A}}async handleStreamEvents(t,e,a,i,r){var I,N,R,A,k,p,M,m,C,O,w,b,S,u;let{forwardedProps:c}=i,g=c==null?void 0:c.nodeName;this.subscriber=a;let l=!1;if(!t)return;let{streamResponse:h,state:d}=t;this.activeRun.prevNodeName=null;let E={},_=d;try{this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(g);try{for(var J=dt(h),L,W,$;L=!(W=await J.next()).done;L=!1){let y=W.value;if(this.cancelRequested&&!this.cancelSent&&((I=this.activeRun)!=null&&I.threadId)&&((N=this.activeRun)!=null&&N.id)){try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch(q){}finally{this.cancelSent=!0}try{await((R=h==null?void 0:h.return)==null?void 0:R.call(h))}catch(q){}break}let v=(A=i.forwardedProps)==null?void 0:A.streamSubgraphs,P=v&&(y.event.startsWith("events")||y.event.startsWith("values"));if(!r.includes(y.event)&&!P&&y.event!=="error")continue;let F=y;if(y.event==="error"){this.dispatchEvent({type:o.EventType.RUN_ERROR,message:y.data.message,rawEvent:y});break}if(y.event==="updates")continue;if(y.event==="values"){E=F.data;continue}else if(v&&F.event.startsWith("values|")){E=f(f({},E),F.data);continue}let H=F.data,Z=(k=H.metadata)!=null?k:{},D=Z.langgraph_node,rt=H.event;if(Z.run_id&&(this.activeRun.id=Z.run_id,this.activeRun.serverRunIdKnown=!0,this.cancelRequested&&!this.cancelSent&&((p=this.activeRun)!=null&&p.threadId)))try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch(q){}finally{this.cancelSent=!0}if(D&&D!==this.activeRun.nodeName&&this.handleNodeChange(D),l=l||rt==="on_custom_event"&&H.name==="exit",rt==="on_chain_end"&&this.activeRun.nodeName===D&&(this.activeRun.exitingNode=!0),this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(M=this.activeRun.graphInfo)!=null&&M.nodes.some(q=>q.id===D)&&this.handleNodeChange(D),_.values=(m=this.activeRun.manuallyEmittedState)!=null?m:E,!this.activeRun.nodeName)continue;(JSON.stringify(_)!==JSON.stringify(d)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(d=_,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d),rawEvent:F})),this.dispatchEvent({type:o.EventType.RAW,event:H}),this.handleSingleEvent(H)}}catch(W){$=[W]}finally{try{L&&(W=J.return)&&await W.call(J)}finally{if($)throw $[0]}}d=await this.client.threads.getState(e);let x=d.tasks,G=(O=(C=x==null?void 0:x[0])==null?void 0:C.interrupts)!=null?O:[],j=d.next.length===0,X=(b=(w=d.metadata)==null?void 0:w.writes)!=null?b:{},U=this.activeRun.nodeName;return G!=null&&G.length||(U=j?"__end__":(S=d.next[0])!=null?S:Object.keys(X)[0]),G.forEach(y=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof y.value=="string"?y.value:JSON.stringify(y.value),rawEvent:y})}),this.handleNodeChange(U),this.handleNodeChange(void 0),this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d)}),this.dispatchEvent({type:o.EventType.MESSAGES_SNAPSHOT,messages:pt((u=d.values.messages)!=null?u:[])}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.cancelRequested=!1,this.cancelSent=!1,this.activeRun=void 0,a.complete()}catch(x){return a.error(x)}}handleSingleEvent(t){var e,a,i,r,c,g,l,h,d,E,_,I,N,R;switch(t.event){case"on_chat_model_stream":let A=(e=t.metadata["emit-messages"])!=null?e:!0,k=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let p=this.getMessageInProgress(this.activeRun.id),M=!!(p!=null&&p.id),m=(i=t.data.chunk.tool_call_chunks)==null?void 0:i[0],J=(r=t.metadata.predict_state)==null?void 0:r.some(u=>u.tool===(m==null?void 0:m.name)),L=!M&&(m==null?void 0:m.name),W=M&&(p==null?void 0:p.toolCallId)&&(m==null?void 0:m.args),$=M&&(p==null?void 0:p.toolCallId)&&!m;($||W||L)&&(this.activeRun.hasFunctionStreaming=!0);let C=mt(t.data),O=K(t.data.chunk.content),w=!!(!m&&O),b=M&&!(p!=null&&p.toolCallId)&&!w;if(C){this.handleThinkingEvent(C);break}if(!C&&this.thinkingProcess&&(this.dispatchEvent({type:o.EventType.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.EventType.THINKING_END}),this.thinkingProcess=null),J&&this.dispatchEvent({type:o.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),$){this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:p==null?void 0:p.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(b){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:p.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(L&&k){this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:m.id,toolCallName:m.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:m.id,toolCallName:m.name});break}if(W&&k){this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:p==null?void 0:p.toolCallId,delta:m.args,rawEvent:t});break}if(w&&A){p||(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}),p=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_CONTENT,messageId:p.id,delta:O,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 S=(l=t.data)==null?void 0:l.output;if(S&&!S.tool_call_id&&((d=(h=S.update)==null?void 0:h.messages)!=null&&d.find(u=>u.type==="tool"))&&(S=(_=(E=S.update)==null?void 0:E.messages)==null?void 0:_.find(u=>u.type==="tool")),S&&((N=(I=S.update)==null?void 0:I.messages)!=null&&N.length)){(R=S.update)==null||R.messages.filter(u=>u.type==="tool").forEach(u=>{var x;this.activeRun.hasFunctionStreaming||(this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:u.tool_call_id,toolCallName:(x=u.name)!=null?x:"",parentMessageId:u.id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:u.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t})),this.dispatchEvent({type:o.EventType.TOOL_CALL_RESULT,toolCallId:u.tool_call_id,content:typeof(u==null?void 0:u.content)=="string"?u==null?void 0:u.content:JSON.stringify(u==null?void 0:u.content),messageId:(0,B.randomUUID)(),rawEvent:t,role:"tool"})});break}this.activeRun.hasFunctionStreaming||(this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:S.tool_call_id,toolCallName:S.name,parentMessageId:S.id,rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:S.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:S.tool_call_id,rawEvent:t})),this.dispatchEvent({type:o.EventType.TOOL_CALL_RESULT,toolCallId:S.tool_call_id,content:S==null?void 0:S.content,messageId:(0,B.randomUUID)(),role:"tool",rawEvent:t});break}}abortRun(){var a,i;this.cancelRequested=!0;let t=(a=this.activeRun)==null?void 0:a.threadId,e=(i=this.activeRun)==null?void 0:i.id;t&&e&&!this.cancelSent&&this.client.runs.cancel(t,e).then(()=>{this.cancelSent=!0}).catch(()=>{}),super.abortRun()}handleThinkingEvent(t){var a;if(!t||!t.type||!t.text)return;let e=t.index;(a=this.thinkingProcess)!=null&&a.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,a=this.activeRun.schemaKeys;return a!=null&&a.output&&(e=Q(e,[...this.constantSchemaKeys,...a.output])),e}async getOrCreateThread(t,e){let a;try{try{a=await this.getThread(t)}catch(i){a=await this.createThread({threadId:t,metadata:e})}}catch(i){throw new Error(`Failed to create thread: ${i.message}`)}return a}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:a}){return t.reduce((i,r)=>{var E;let c=i.configurable;r.configurable&&(c=a!=null&&a.config?Q(r==null?void 0:r.configurable,[...this.constantSchemaKeys,...(E=a==null?void 0:a.config)!=null?E:[]]):r==null?void 0:r.configurable);let g=T(f(f({},i),r),{configurable:c}),l=i.recursion_limit==null&&r.recursion_limit===25,h=JSON.stringify(g)!==JSON.stringify(i),d=l&&JSON.stringify(T(f({},g),{recursion_limit:null}))===JSON.stringify(T(f({},i),{recursion_limit:null}));return h&&!d?f(f({},i),g):i},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=T(f({},this.messagesInProcess),{[t]:f(f({},this.messagesInProcess[t]),e)})}async getAssistant(){try{let t=await this.client.assistants.search(),e=t.find(a=>a.graph_id===this.graphId);if(!e){let a=`
2
2
  No agent found with graph ID ${this.graphId} found..
3
3
 
4
4
 
5
5
  These are the available agents: [${t.map(i=>`${i.graph_id} (ID: ${i.assistant_id})`).join(", ")}]
6
- `;throw console.error(a),new Error(a)}return e}catch(t){let e=new Error(`Failed to retrieve assistant: ${t.message}`);throw this.dispatchEvent({type:o.EventType.RUN_ERROR,message:e.message}),this.subscriber.error(),e}}async getSchemaKeys(){var t,e,a,i;try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),g=null,u=[];if("context_schema"in r&&((t=r.context_schema)!=null&&t.properties)&&(u=Object.keys(r.context_schema.properties)),(e=r.config_schema)!=null&&e.properties&&(g=Object.keys(r.config_schema.properties)),!((a=r.input_schema)!=null&&a.properties)||!((i=r.output_schema)!=null&&i.properties))return{config:[],input:null,output:null,context:u};let l=Object.keys(r.input_schema.properties),h=Object.keys(r.output_schema.properties);return{input:l&&l.length?[...l,...this.constantSchemaKeys]:null,output:h&&h.length?[...h,...this.constantSchemaKeys]:null,context:u,config:g}}catch(r){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys,context:[]}}}langGraphDefaultMergeState(t,e,a){var l,h;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let i=t.messages||[],r=new Set(i.map(c=>c.id)),g=e.filter(c=>!r.has(c.id)),u=[...(l=t.tools)!=null?l:[],...(h=a.tools)!=null?h:[]].reduce((c,S)=>{let y=S;return S.type||(y={type:"function",name:S.name,function:{name:S.name,description:S.description,parameters:S.parameters}}),c.find(I=>I.name===y.name||I.function.name===y.function.name)?c:[...c,y]},[]);return T(E({},t),{messages:g,tools:u,"ag-ui":{tools:u,context:a.context}})}handleNodeChange(t){var e,a;t==="__end__"&&(t=void 0),t!==((e=this.activeRun)==null?void 0:e.nodeName)&&((a=this.activeRun)!=null&&a.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,a){var R,N;let i=a!=null&&a.checkpoint_id?{checkpoint:{checkpoint_id:a.checkpoint_id}}:void 0,g=[...await this.client.threads.getHistory(e,i)].reverse(),u=g.find(p=>{var M;return(M=p.values.messages)==null?void 0:M.some(f=>f.id===t)});if(!u)throw new Error("Message not found");let l=(R=u.values.messages)!=null?R:[],h=l.findIndex(p=>p.id===t);if(l.slice(h+1).length)return this.getCheckpointByMessage(t,e,u.parent_checkpoint);let S=g.indexOf(u),x=u.values,{messages:y}=x,I=lt(x,["messages"]),C=(N=g[S-1])!=null?N:T(E({},u),{values:{}});return T(E({},C),{values:E(E({},C.values),I)})}};var nt=class extends Et.HttpAgent{};0&&(module.exports={CustomEventNames,LangGraphAgent,LangGraphEventTypes,LangGraphHttpAgent});
6
+ `;throw console.error(a),new Error(a)}return e}catch(t){let e=new Error(`Failed to retrieve assistant: ${t.message}`);throw this.dispatchEvent({type:o.EventType.RUN_ERROR,message:e.message}),this.subscriber.error(),e}}async getSchemaKeys(){var t,e,a,i;try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),c=null,g=[];if("context_schema"in r&&((t=r.context_schema)!=null&&t.properties)&&(g=Object.keys(r.context_schema.properties)),(e=r.config_schema)!=null&&e.properties&&(c=Object.keys(r.config_schema.properties)),!((a=r.input_schema)!=null&&a.properties)||!((i=r.output_schema)!=null&&i.properties))return{config:[],input:null,output:null,context:g};let l=Object.keys(r.input_schema.properties),h=Object.keys(r.output_schema.properties);return{input:l&&l.length?[...l,...this.constantSchemaKeys]:null,output:h&&h.length?[...h,...this.constantSchemaKeys]:null,context:g,config:c}}catch(r){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys,context:[]}}}langGraphDefaultMergeState(t,e,a){var l,h;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let i=t.messages||[],r=new Set(i.map(d=>d.id)),c=e.filter(d=>!r.has(d.id)),g=[...(l=t.tools)!=null?l:[],...(h=a.tools)!=null?h:[]].reduce((d,E)=>{let _=E;return E.type||(_={type:"function",name:E.name,function:{name:E.name,description:E.description,parameters:E.parameters}}),d.find(I=>I.name===_.name||I.function.name===_.function.name)?d:[...d,_]},[]);return T(f({},t),{messages:c,tools:g,"ag-ui":{tools:g,context:a.context}})}handleNodeChange(t){var e,a;t==="__end__"&&(t=void 0),t!==((e=this.activeRun)==null?void 0:e.nodeName)&&((a=this.activeRun)!=null&&a.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,a){var R,k;let i=a!=null&&a.checkpoint_id?{checkpoint:{checkpoint_id:a.checkpoint_id}}:void 0,c=[...await this.client.threads.getHistory(e,i)].reverse(),g=c.find(p=>{var M;return(M=p.values.messages)==null?void 0:M.some(m=>m.id===t)});if(!g)throw new Error("Message not found");let l=(R=g.values.messages)!=null?R:[],h=l.findIndex(p=>p.id===t);if(l.slice(h+1).length)return this.getCheckpointByMessage(t,e,g.parent_checkpoint);let E=c.indexOf(g),A=g.values,{messages:_}=A,I=et(A,["messages"]),N=(k=c[E-1])!=null?k:T(f({},g),{values:{}});return T(f({},N),{values:f(f({},N.values),I)})}};var it=class extends Et.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 \"@ag-ui/client\";\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\";\nimport { ToolMessage } from \"@langchain/core/messages\";\nimport { ToolMessageFieldsWithToolCallId } from \"@langchain/core/dist/messages/tool\";\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 // Stop control flags\n private cancelRequested: boolean = false;\n private cancelSent: boolean = false;\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 // Reset cancel flags for this run\n this.cancelRequested = false;\n this.cancelSent = false;\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 // If a cancel was requested and we haven't sent it yet, try now.\n if (\n this.cancelRequested &&\n !this.cancelSent &&\n this.activeRun?.threadId &&\n this.activeRun?.id\n ) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n // Best-effort: ask iterator to close early\n try {\n // Many async iterables used for streaming implement return()\n await (streamResponse as any)?.return?.();\n } catch (_) {}\n break;\n }\n\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 // Set server-assigned run id as soon as available\n if (metadata.run_id) {\n this.activeRun!.id = metadata.run_id;\n this.activeRun!.serverRunIdKnown = true;\n // If cancel was requested earlier (before server id was known), send it now.\n if (this.cancelRequested && !this.cancelSent && this.activeRun?.threadId) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId!, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n }\n }\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 if (eventType === LangGraphEventTypes.OnChainEnd && this.activeRun!.nodeName === currentNodeName) {\n this.activeRun!.exitingNode = true;\n }\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 // Reset cancel flags when run completes\n this.cancelRequested = false;\n this.cancelSent = false;\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 let toolCallOutput = event.data?.output\n\n // Command from within a tool. We need to grab result from the tool result message\n if (toolCallOutput && !toolCallOutput.tool_call_id && toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')) {\n toolCallOutput = toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')\n }\n\n if (toolCallOutput && toolCallOutput.update?.messages?.length) {\n type MessageFields = ToolMessageFieldsWithToolCallId & { type: string }\n toolCallOutput.update?.messages.filter((message: MessageFields) => message.type === 'tool').forEach((message: MessageFields) => {\n // Only emit tool call events if required fields exist\n if (!this.activeRun!.hasFunctionStreaming && message.tool_call_id && message.name) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: message.tool_call_id,\n toolCallName: message.name,\n parentMessageId: message.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: message.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n }\n\n // Only emit result if tool_call_id exists\n if (message.tool_call_id) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: message.tool_call_id,\n content: typeof message?.content === 'string' ? message?.content : JSON.stringify(message?.content),\n messageId: randomUUID(),\n rawEvent: event,\n role: \"tool\",\n })\n }\n })\n\n break;\n }\n\n // Only emit tool call events if required fields exist\n if (!this.activeRun!.hasFunctionStreaming && toolCallOutput?.tool_call_id && toolCallOutput?.name) {\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 // Only emit result if tool_call_id exists\n if (toolCallOutput?.tool_call_id) {\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 rawEvent: event,\n })\n }\n break;\n }\n }\n\n // Request cancellation of the current run via LangGraph Platform SDK\n public abortRun() {\n this.cancelRequested = true;\n const threadId = this.activeRun?.threadId;\n const runId = this.activeRun?.id;\n if (threadId && runId && !this.cancelSent) {\n void this.client.runs\n .cancel(threadId, runId)\n .then(() => {\n this.cancelSent = true;\n })\n .catch(() => {\n // Ignore cancellation errors; streaming loop will also check cancelRequested\n });\n }\n super.abortRun();\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 try {\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 const notFoundMessage = `\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 console.error(notFoundMessage);\n throw new Error(notFoundMessage);\n }\n\n return retrievedAssistant;\n } catch (error) {\n const redefinedError = new Error(`Failed to retrieve assistant: ${(error as Error).message}`)\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: redefinedError.message,\n });\n this.subscriber.error()\n throw redefinedError;\n }\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 // True once the platform-assigned run id is known (set from stream metadata)\n serverRunIdKnown?: 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, TextInputContent, BinaryInputContent, InputContent , UserMessage} 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\n/**\n * Convert LangChain's multimodal content to AG-UI format\n */\nfunction convertLangchainMultimodalToAgui(\n content: Array<{ type: string; text?: string; image_url?: any }>\n): InputContent[] {\n const aguiContent: InputContent[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n aguiContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"image_url\") {\n const imageUrl = typeof item.image_url === \"string\"\n ? item.image_url\n : item.image_url?.url;\n\n if (!imageUrl) continue;\n\n // Parse data URLs to extract base64 data\n if (imageUrl.startsWith(\"data:\")) {\n // Format: data:mime_type;base64,data\n const [header, data] = imageUrl.split(\",\", 2);\n const mimeType = header.includes(\":\")\n ? header.split(\":\")[1].split(\";\")[0]\n : \"image/png\";\n\n aguiContent.push({\n type: \"binary\",\n mimeType,\n data: data || \"\",\n });\n } else {\n // Regular URL or ID\n aguiContent.push({\n type: \"binary\",\n mimeType: \"image/png\", // Default MIME type\n url: imageUrl,\n });\n }\n }\n }\n\n return aguiContent;\n}\n\n/**\n * Convert AG-UI multimodal content to LangChain's format\n */\nfunction convertAguiMultimodalToLangchain(\n content: InputContent[]\n): Array<{ type: string; text?: string; image_url?: { url: string } }> {\n const langchainContent: Array<{ type: string; text?: string; image_url?: { url: string } }> = [];\n\n for (const item of content) {\n if (item.type === \"text\") {\n langchainContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"binary\") {\n // LangChain uses image_url format (OpenAI-style)\n let url: string;\n\n // Prioritize url, then data, then id\n if (item.url) {\n url = item.url;\n } else if (item.data) {\n // Construct data URL from base64 data\n url = `data:${item.mimeType};base64,${item.data}`;\n } else if (item.id) {\n // Use id as a reference\n url = item.id;\n } else {\n continue; // Skip if no source is provided\n }\n\n langchainContent.push({\n type: \"image_url\",\n image_url: { url },\n });\n }\n }\n\n return langchainContent;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n // Handle multimodal content\n let userContent: string | InputContent[];\n if (Array.isArray(message.content)) {\n userContent = convertLangchainMultimodalToAgui(message.content as any);\n } else {\n userContent = stringifyIfNeeded(resolveMessageContent(message.content));\n }\n\n return {\n id: message.id!,\n role: \"user\",\n content: userContent,\n };\n case \"ai\":\n const aiContent = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: aiContent ? stringifyIfNeeded(aiContent) : '',\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 // Handle multimodal content\n let content: UserMessage['content'];\n if (typeof message.content === \"string\") {\n content = message.content;\n } else if (Array.isArray(message.content)) {\n content = convertAguiMultimodalToLangchain(message.content) as any;\n } else {\n content = String(message.content);\n }\n\n return {\n id: message.id,\n role: message.role,\n content,\n type: \"human\",\n } as LangGraphMessage;\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\n/**\n * Flatten multimodal content into plain text.\n * Used for backwards compatibility or when multimodal is not supported.\n */\nfunction flattenUserContent(content: Message[\"content\"]): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && \"text\" in item) {\n if (item.text) {\n parts.push(item.text);\n }\n } else if (item.type === \"binary\" && \"mimeType\" in item) {\n // Add descriptive placeholder for binary content\n const binaryItem = item as BinaryInputContent;\n if (binaryItem.filename) {\n parts.push(`[Binary content: ${binaryItem.filename}]`);\n } else if (binaryItem.url) {\n parts.push(`[Binary content: ${binaryItem.url}]`);\n } else {\n parts.push(`[Binary content: ${binaryItem.mimeType}]`);\n }\n }\n }\n\n return parts.join(\"\\n\");\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_client","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","convertLangchainMultimodalToAgui","content","_a","aguiContent","item","imageUrl","header","data","mimeType","convertAguiMultimodalToLangchain","langchainContent","url","langchainMessagesToAgui","messages","message","userContent","stringifyIfNeeded","resolveMessageContent","aiContent","tc","aguiMessagesToLangChain","index","_b","resolveReasoningContent","eventData","_a","_b","_c","_d","_e","content","data","resolveMessageContent","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","_k","_l","_m","_n","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","message","runId","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","data","assistants","retrievedAssistant","searchResult","notFoundMessage","a","redefinedError","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","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 \"@ag-ui/client\";\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\";\nimport { ToolMessage } from \"@langchain/core/messages\";\nimport { ToolMessageFieldsWithToolCallId } from \"@langchain/core/dist/messages/tool\";\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 // Stop control flags\n private cancelRequested: boolean = false;\n private cancelSent: boolean = false;\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 // Reset cancel flags for this run\n this.cancelRequested = false;\n this.cancelSent = false;\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 // @ts-ignore\n const { command, ...restProps } = forwardedProps\n if (command?.resume && typeof command.resume === 'string') {\n try {\n command.resume = JSON.parse(command.resume);\n } catch {\n // Keep as string if not valid JSON\n }\n }\n const payload = {\n ...restProps,\n command,\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 // If a cancel was requested and we haven't sent it yet, try now.\n if (\n this.cancelRequested &&\n !this.cancelSent &&\n this.activeRun?.threadId &&\n this.activeRun?.id\n ) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n // Best-effort: ask iterator to close early\n try {\n // Many async iterables used for streaming implement return()\n await (streamResponse as any)?.return?.();\n } catch (_) {}\n break;\n }\n\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 // Set server-assigned run id as soon as available\n if (metadata.run_id) {\n this.activeRun!.id = metadata.run_id;\n this.activeRun!.serverRunIdKnown = true;\n // If cancel was requested earlier (before server id was known), send it now.\n if (this.cancelRequested && !this.cancelSent && this.activeRun?.threadId) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId!, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n }\n }\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 if (eventType === LangGraphEventTypes.OnChainEnd && this.activeRun!.nodeName === currentNodeName) {\n this.activeRun!.exitingNode = true;\n }\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 // Reset cancel flags when run completes\n this.cancelRequested = false;\n this.cancelSent = false;\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 let toolCallOutput = event.data?.output\n\n // Command from within a tool. We need to grab result from the tool result message\n if (toolCallOutput && !toolCallOutput.tool_call_id && toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')) {\n toolCallOutput = toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')\n }\n\n if (toolCallOutput && toolCallOutput.update?.messages?.length) {\n type MessageFields = ToolMessageFieldsWithToolCallId & { type: string }\n toolCallOutput.update?.messages.filter((message: MessageFields) => message.type === 'tool').forEach((message: MessageFields) => {\n if (!this.activeRun!.hasFunctionStreaming) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: message.tool_call_id,\n toolCallName: message.name ?? '',\n parentMessageId: message.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: message.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: message.tool_call_id,\n content: typeof message?.content === 'string' ? message?.content : JSON.stringify(message?.content),\n messageId: randomUUID(),\n rawEvent: event,\n role: \"tool\",\n })\n })\n\n break;\n }\n\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 rawEvent: event,\n })\n break;\n }\n }\n\n // Request cancellation of the current run via LangGraph Platform SDK\n public abortRun() {\n this.cancelRequested = true;\n const threadId = this.activeRun?.threadId;\n const runId = this.activeRun?.id;\n if (threadId && runId && !this.cancelSent) {\n void this.client.runs\n .cancel(threadId, runId)\n .then(() => {\n this.cancelSent = true;\n })\n .catch(() => {\n // Ignore cancellation errors; streaming loop will also check cancelRequested\n });\n }\n super.abortRun();\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 try {\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 const notFoundMessage = `\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 console.error(notFoundMessage);\n throw new Error(notFoundMessage);\n }\n\n return retrievedAssistant;\n } catch (error) {\n const redefinedError = new Error(`Failed to retrieve assistant: ${(error as Error).message}`)\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: redefinedError.message,\n });\n this.subscriber.error()\n throw redefinedError;\n }\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 // True once the platform-assigned run id is known (set from stream metadata)\n serverRunIdKnown?: 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, TextInputContent, BinaryInputContent, InputContent , UserMessage} 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\n/**\n * Convert LangChain's multimodal content to AG-UI format\n */\nfunction convertLangchainMultimodalToAgui(\n content: Array<{ type: string; text?: string; image_url?: any }>\n): InputContent[] {\n const aguiContent: InputContent[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n aguiContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"image_url\") {\n const imageUrl = typeof item.image_url === \"string\"\n ? item.image_url\n : item.image_url?.url;\n\n if (!imageUrl) continue;\n\n // Parse data URLs to extract base64 data\n if (imageUrl.startsWith(\"data:\")) {\n // Format: data:mime_type;base64,data\n const [header, data] = imageUrl.split(\",\", 2);\n const mimeType = header.includes(\":\")\n ? header.split(\":\")[1].split(\";\")[0]\n : \"image/png\";\n\n aguiContent.push({\n type: \"binary\",\n mimeType,\n data: data || \"\",\n });\n } else {\n // Regular URL or ID\n aguiContent.push({\n type: \"binary\",\n mimeType: \"image/png\", // Default MIME type\n url: imageUrl,\n });\n }\n }\n }\n\n return aguiContent;\n}\n\n/**\n * Convert AG-UI multimodal content to LangChain's format\n */\nfunction convertAguiMultimodalToLangchain(\n content: InputContent[]\n): Array<{ type: string; text?: string; image_url?: { url: string } }> {\n const langchainContent: Array<{ type: string; text?: string; image_url?: { url: string } }> = [];\n\n for (const item of content) {\n if (item.type === \"text\") {\n langchainContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"binary\") {\n // LangChain uses image_url format (OpenAI-style)\n let url: string;\n\n // Prioritize url, then data, then id\n if (item.url) {\n url = item.url;\n } else if (item.data) {\n // Construct data URL from base64 data\n url = `data:${item.mimeType};base64,${item.data}`;\n } else if (item.id) {\n // Use id as a reference\n url = item.id;\n } else {\n continue; // Skip if no source is provided\n }\n\n langchainContent.push({\n type: \"image_url\",\n image_url: { url },\n });\n }\n }\n\n return langchainContent;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n // Handle multimodal content\n let userContent: string | InputContent[];\n if (Array.isArray(message.content)) {\n userContent = convertLangchainMultimodalToAgui(message.content as any);\n } else {\n userContent = stringifyIfNeeded(resolveMessageContent(message.content));\n }\n\n return {\n id: message.id!,\n role: \"user\",\n content: userContent,\n };\n case \"ai\":\n const aiContent = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: aiContent ? stringifyIfNeeded(aiContent) : '',\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 // Handle multimodal content\n let content: UserMessage['content'];\n if (typeof message.content === \"string\") {\n content = message.content;\n } else if (Array.isArray(message.content)) {\n content = convertAguiMultimodalToLangchain(message.content) as any;\n } else {\n content = String(message.content);\n }\n\n return {\n id: message.id,\n role: message.role,\n content,\n type: \"human\",\n } as LangGraphMessage;\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\n/**\n * Flatten multimodal content into plain text.\n * Used for backwards compatibility or when multimodal is not supported.\n */\nfunction flattenUserContent(content: Message[\"content\"]): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && \"text\" in item) {\n if (item.text) {\n parts.push(item.text);\n }\n } else if (item.type === \"binary\" && \"mimeType\" in item) {\n // Add descriptive placeholder for binary content\n const binaryItem = item as BinaryInputContent;\n if (binaryItem.filename) {\n parts.push(`[Binary content: ${binaryItem.filename}]`);\n } else if (binaryItem.url) {\n parts.push(`[Binary content: ${binaryItem.url}]`);\n } else {\n parts.push(`[Binary content: ${binaryItem.mimeType}]`);\n }\n }\n }\n\n return parts.join(\"\\n\");\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_client","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","convertLangchainMultimodalToAgui","content","_a","aguiContent","item","imageUrl","header","data","mimeType","convertAguiMultimodalToLangchain","langchainContent","url","langchainMessagesToAgui","messages","message","userContent","stringifyIfNeeded","resolveMessageContent","aiContent","tc","aguiMessagesToLangChain","index","_b","resolveReasoningContent","eventData","_a","_b","_c","_d","_e","content","data","resolveMessageContent","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","_g","_h","_i","_j","_k","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","_f","command","restProps","__objRest","interrupts","interrupt","stream","streamModes","_l","_m","_n","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","message","runId","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","data","assistants","retrievedAssistant","searchResult","notFoundMessage","a","redefinedError","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","newMessages","langGraphTools","tool","mappedTool","t","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","selectedCheckpoint","LangGraphHttpAgent"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- var ut=Object.defineProperty,pt=Object.defineProperties;var mt=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var at=Object.prototype.hasOwnProperty,st=Object.prototype.propertyIsEnumerable;var et=(i,n)=>(n=Symbol[i])?n:Symbol.for("Symbol."+i);var nt=(i,n,t)=>n in i?ut(i,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[n]=t,E=(i,n)=>{for(var t in n||(n={}))at.call(n,t)&&nt(i,t,n[t]);if(j)for(var t of j(n))st.call(n,t)&&nt(i,t,n[t]);return i},T=(i,n)=>pt(i,mt(n));var it=(i,n)=>{var t={};for(var e in i)at.call(i,e)&&n.indexOf(e)<0&&(t[e]=i[e]);if(i!=null&&j)for(var e of j(i))n.indexOf(e)<0&&st.call(i,e)&&(t[e]=i[e]);return t};var rt=(i,n,t)=>(n=i[et("asyncIterator")])?n.call(i):(i=i[et("iterator")](),n={},t=(e,a)=>(a=i[e])&&(n[e]=s=>new Promise((r,g,u)=>(s=a.call(i,s),u=s.done,Promise.resolve(s.value).then(l=>r({value:l,done:u}),g)))),t("next"),t("return"),n);import{HttpAgent as It}from"@ag-ui/client";import{Observable as vt}from"rxjs";import{Client as _t}from"@langchain/langgraph-sdk";import{randomUUID as V}from"@ag-ui/client";var ft=(h=>(h.OnChainStart="on_chain_start",h.OnChainStream="on_chain_stream",h.OnChainEnd="on_chain_end",h.OnChatModelStart="on_chat_model_start",h.OnChatModelStream="on_chat_model_stream",h.OnChatModelEnd="on_chat_model_end",h.OnToolStart="on_tool_start",h.OnToolEnd="on_tool_end",h.OnCustomEvent="on_custom_event",h.OnInterrupt="on_interrupt",h))(ft||{}),Et=(a=>(a.ManuallyEmitMessage="manually_emit_message",a.ManuallyEmitToolCall="manually_emit_tool_call",a.ManuallyEmitState="manually_emit_state",a.Exit="exit",a))(Et||{});import{AbstractAgent as Tt,EventType as o}from"@ag-ui/client";var z=["messages","tools"];function q(i,n){return Object.fromEntries(Object.entries(i).filter(([t])=>n.includes(t)))}function ot({mode:i,state:n,schemaKeys:t}){let e=i==="start"?n:null;return e&&(t!=null&&t.input)&&(e=q(e,[...z,...t.input])),e}function St(i){var t;let n=[];for(let e of i)if(e.type==="text"&&e.text)n.push({type:"text",text:e.text});else if(e.type==="image_url"){let a=typeof e.image_url=="string"?e.image_url:(t=e.image_url)==null?void 0:t.url;if(!a)continue;if(a.startsWith("data:")){let[s,r]=a.split(",",2),g=s.includes(":")?s.split(":")[1].split(";")[0]:"image/png";n.push({type:"binary",mimeType:g,data:r||""})}else n.push({type:"binary",mimeType:"image/png",url:a})}return n}function yt(i){let n=[];for(let t of i)if(t.type==="text")n.push({type:"text",text:t.text});else if(t.type==="binary"){let e;if(t.url)e=t.url;else if(t.data)e=`data:${t.mimeType};base64,${t.data}`;else if(t.id)e=t.id;else continue;n.push({type:"image_url",image_url:{url:e}})}return n}function lt(i){return i.map(n=>{var t;switch(n.type){case"human":let e;return Array.isArray(n.content)?e=St(n.content):e=X(K(n.content)),{id:n.id,role:"user",content:e};case"ai":let a=K(n.content);return{id:n.id,role:"assistant",content:a?X(a):"",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(K(n.content))};case"tool":return{id:n.id,role:"tool",content:X(K(n.content)),toolCallId:n.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function Q(i){return i.map((n,t)=>{var e,a;switch(n.role){case"user":let s;return typeof n.content=="string"?s=n.content:Array.isArray(n.content)?s=yt(n.content):s=String(n.content),{id:n.id,role:n.role,content:s,type:"human"};case"assistant":return{id:n.id,type:"ai",role:n.role,content:(e=n.content)!=null?e:"",tool_calls:((a=n.toolCalls)!=null?a:[]).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(i){return typeof i=="string"?i:JSON.stringify(i)}function ht(i){var t,e,a,s,r;let n=(t=i.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((s=(a=(e=i.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:a.summary)!=null&&s[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 K(i){var n;if(!i)return null;if(typeof i=="string")return i;if(Array.isArray(i)&&i.length){let t=(n=i.find(e=>e.type==="text"))==null?void 0:n.text;return t!=null?t:null}return null}var dt=class i extends Tt{constructor(t){var e,a;super(t);this.cancelRequested=!1;this.cancelSent=!1;this.constantSchemaKeys=z;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(a=t==null?void 0:t.client)!=null?a:new _t({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:E({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new i(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new vt(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var g,u,l;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.cancelRequested=!1,this.cancelSent=!1,this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let a=(g=t.threadId)!=null?g:V(),s=(l=(u=t.forwardedProps)==null?void 0:u.streamMode)!=null?l:["events","values","updates"],r=await this.prepareStream(T(E({},t),{threadId:a}),s);if(!r)return e.error("No stream to regenerate");await this.handleStreamEvents(r,a,e,t,Array.isArray(s)?s:[s])}async prepareRegenerateStream(t,e){var l,h,c;let{threadId:a,messageCheckpoint:s}=t,r=await this.getCheckpointByMessage(s.id,a);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(a,{values:this.langGraphDefaultMergeState(r.values,[],t),checkpointId:r.checkpoint.checkpoint_id,asNode:(h=(l=r.next)==null?void 0:l[0])!=null?h:"__start__"}),u=T(E({},(c=t.forwardedProps)!=null?c:{}),{input:this.langGraphDefaultMergeState(r.values,[s],t),checkpointId:g.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(a,this.assistant.assistant_id,u),state:r,streamMode:e}}async prepareStream(t,e){var U,A,L,O,b,m,d,w,G,W;let{threadId:a,state:s,messages:r,tools:g,context:u,forwardedProps:l}=t;this.activeRun.manuallyEmittedState=null;let h=l==null?void 0:l.nodeName,c=a!=null?a:V();this.assistant||(this.assistant=await this.getAssistant());let S=await this.getOrCreateThread(c,l==null?void 0:l.threadMetadata);this.activeRun.threadId=S.thread_id;let y=(U=await this.client.threads.getState(S.thread_id))!=null?U:{values:{}},I=(A=y.values.messages)!=null?A:[],C=Q(r),R=this.langGraphDefaultMergeState(T(E({},s),{messages:I}),C,t),x=T(E({},y),{values:T(E({},R),{messages:[...I,...(L=R.messages)!=null?L:[]]})}),N=x.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((O=y.values.messages)!=null?O:[]).length>r.filter(v=>v.role!=="system").length){let v=null;for(let k=r.length-1;k>=0;k--)if(r[k].role==="user"){v=Q([r[k]])[0];break}return v?this.prepareRegenerateStream(T(E({},t),{messageCheckpoint:v}),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 p=!((b=l==null?void 0:l.command)!=null&&b.resume)&&c&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(p==="continue"){let v=this.activeRun.graphInfo.edges.find(k=>k.target===this.activeRun.nodeName);await this.client.threads.updateState(c,{values:s,asNode:v==null?void 0:v.source})}let M=ot({mode:p,state:N,schemaKeys:this.activeRun.schemaKeys}),f,B=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);B.length&&(f=await this.mergeConfigs({configs:B,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let J=T(E({},l),{streamMode:e,input:M,config:f,context:E(E({},u),(m=f==null?void 0:f.configurable)!=null?m:{})}),P=(G=(w=(d=y.tasks)==null?void 0:d[0])==null?void 0:w.interrupts)!=null?G:[];return P!=null&&P.length&&!((W=l==null?void 0:l.command)!=null&&W.resume)?(this.dispatchEvent({type:o.RUN_STARTED,threadId:c,runId:t.runId}),this.handleNodeChange(h),P.forEach(v=>{this.dispatchEvent({type:o.CUSTOM,name:"on_interrupt",value:typeof v.value=="string"?v.value:JSON.stringify(v.value),rawEvent:v})}),this.dispatchEvent({type:o.RUN_FINISHED,threadId:c,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(c,this.assistant.assistant_id,J),state:x}}async handleStreamEvents(t,e,a,s,r){var I,C,R,x,N,p,M,f,A,L,O,b,m,d;let{forwardedProps:g}=s,u=g==null?void 0:g.nodeName;this.subscriber=a;let l=!1;if(!t)return;let{streamResponse:h,state:c}=t;this.activeRun.prevNodeName=null;let S={},y=c;try{this.dispatchEvent({type:o.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(u);try{for(var B=rt(h),J,P,U;J=!(P=await B.next()).done;J=!1){let _=P.value;if(this.cancelRequested&&!this.cancelSent&&((I=this.activeRun)!=null&&I.threadId)&&((C=this.activeRun)!=null&&C.id)){try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch($){}finally{this.cancelSent=!0}try{await((R=h==null?void 0:h.return)==null?void 0:R.call(h))}catch($){}break}let Z=(x=s.forwardedProps)==null?void 0:x.streamSubgraphs,gt=Z&&(_.event.startsWith("events")||_.event.startsWith("values"));if(!r.includes(_.event)&&!gt&&_.event!=="error")continue;let F=_;if(_.event==="error"){this.dispatchEvent({type:o.RUN_ERROR,message:_.data.message,rawEvent:_});break}if(_.event==="updates")continue;if(_.event==="values"){S=F.data;continue}else if(Z&&F.event.startsWith("values|")){S=E(E({},S),F.data);continue}let H=F.data,Y=(N=H.metadata)!=null?N:{},D=Y.langgraph_node,tt=H.event;if(Y.run_id&&(this.activeRun.id=Y.run_id,this.activeRun.serverRunIdKnown=!0,this.cancelRequested&&!this.cancelSent&&((p=this.activeRun)!=null&&p.threadId)))try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch($){}finally{this.cancelSent=!0}if(D&&D!==this.activeRun.nodeName&&this.handleNodeChange(D),l=l||tt==="on_custom_event"&&H.name==="exit",tt==="on_chain_end"&&this.activeRun.nodeName===D&&(this.activeRun.exitingNode=!0),this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(M=this.activeRun.graphInfo)!=null&&M.nodes.some($=>$.id===D)&&this.handleNodeChange(D),y.values=(f=this.activeRun.manuallyEmittedState)!=null?f:S,!this.activeRun.nodeName)continue;(JSON.stringify(y)!==JSON.stringify(c)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(c=y,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(c),rawEvent:F})),this.dispatchEvent({type:o.RAW,event:H}),this.handleSingleEvent(H)}}catch(P){U=[P]}finally{try{J&&(P=B.return)&&await P.call(B)}finally{if(U)throw U[0]}}c=await this.client.threads.getState(e);let w=c.tasks,G=(L=(A=w==null?void 0:w[0])==null?void 0:A.interrupts)!=null?L:[],W=c.next.length===0,v=(b=(O=c.metadata)==null?void 0:O.writes)!=null?b:{},k=this.activeRun.nodeName;return G!=null&&G.length||(k=W?"__end__":(m=c.next[0])!=null?m:Object.keys(v)[0]),G.forEach(_=>{this.dispatchEvent({type:o.CUSTOM,name:"on_interrupt",value:typeof _.value=="string"?_.value:JSON.stringify(_.value),rawEvent:_})}),this.handleNodeChange(k),this.handleNodeChange(void 0),this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(c)}),this.dispatchEvent({type:o.MESSAGES_SNAPSHOT,messages:lt((d=c.values.messages)!=null?d:[])}),this.dispatchEvent({type:o.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.cancelRequested=!1,this.cancelSent=!1,this.activeRun=void 0,a.complete()}catch(w){return a.error(w)}}handleSingleEvent(t){var e,a,s,r,g,u,l,h,c,S,y,I,C,R;switch(t.event){case"on_chat_model_stream":let x=(e=t.metadata["emit-messages"])!=null?e:!0,N=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let p=this.getMessageInProgress(this.activeRun.id),M=!!(p!=null&&p.id),f=(s=t.data.chunk.tool_call_chunks)==null?void 0:s[0],B=(r=t.metadata.predict_state)==null?void 0:r.some(d=>d.tool===(f==null?void 0:f.name)),J=!M&&(f==null?void 0:f.name),P=M&&(p==null?void 0:p.toolCallId)&&(f==null?void 0:f.args),U=M&&(p==null?void 0:p.toolCallId)&&!f;(U||P||J)&&(this.activeRun.hasFunctionStreaming=!0);let A=ht(t.data),L=K(t.data.chunk.content),O=!!(!f&&L),b=M&&!(p!=null&&p.toolCallId)&&!O;if(A){this.handleThinkingEvent(A);break}if(!A&&this.thinkingProcess&&(this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.THINKING_END}),this.thinkingProcess=null),B&&this.dispatchEvent({type:o.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),U){this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:p==null?void 0:p.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(b){this.dispatchEvent({type:o.TEXT_MESSAGE_END,messageId:p.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(J&&N){this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:f.id,toolCallName:f.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:f.id,toolCallName:f.name});break}if(P&&N){this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:p==null?void 0:p.toolCallId,delta:f.args,rawEvent:t});break}if(O&&x){p||(this.dispatchEvent({type:o.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}),p=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:o.TEXT_MESSAGE_CONTENT,messageId:p.id,delta:L,rawEvent:t});break}break;case"on_chat_model_end":if((g=this.getMessageInProgress(this.activeRun.id))!=null&&g.toolCallId){this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((u=this.getMessageInProgress(this.activeRun.id))!=null&&u.id){this.dispatchEvent({type:o.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.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:o.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:o.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot({values:this.activeRun.manuallyEmittedState}),rawEvent:t})),this.dispatchEvent({type:o.CUSTOM,name:t.name,value:t.data,rawEvent:t});break;case"on_tool_end":let m=(l=t.data)==null?void 0:l.output;if(m&&!m.tool_call_id&&((c=(h=m.update)==null?void 0:h.messages)!=null&&c.find(d=>d.type==="tool"))&&(m=(y=(S=m.update)==null?void 0:S.messages)==null?void 0:y.find(d=>d.type==="tool")),m&&((C=(I=m.update)==null?void 0:I.messages)!=null&&C.length)){(R=m.update)==null||R.messages.filter(d=>d.type==="tool").forEach(d=>{!this.activeRun.hasFunctionStreaming&&d.tool_call_id&&d.name&&(this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:d.tool_call_id,toolCallName:d.name,parentMessageId:d.id,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:d.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t})),d.tool_call_id&&this.dispatchEvent({type:o.TOOL_CALL_RESULT,toolCallId:d.tool_call_id,content:typeof(d==null?void 0:d.content)=="string"?d==null?void 0:d.content:JSON.stringify(d==null?void 0:d.content),messageId:V(),rawEvent:t,role:"tool"})});break}!this.activeRun.hasFunctionStreaming&&(m!=null&&m.tool_call_id)&&(m!=null&&m.name)&&(this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:m.tool_call_id,toolCallName:m.name,parentMessageId:m.id,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:m.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:m.tool_call_id,rawEvent:t})),m!=null&&m.tool_call_id&&this.dispatchEvent({type:o.TOOL_CALL_RESULT,toolCallId:m.tool_call_id,content:m==null?void 0:m.content,messageId:V(),role:"tool",rawEvent:t});break}}abortRun(){var a,s;this.cancelRequested=!0;let t=(a=this.activeRun)==null?void 0:a.threadId,e=(s=this.activeRun)==null?void 0:s.id;t&&e&&!this.cancelSent&&this.client.runs.cancel(t,e).then(()=>{this.cancelSent=!0}).catch(()=>{}),super.abortRun()}handleThinkingEvent(t){var a;if(!t||!t.type||!t.text)return;let e=t.index;(a=this.thinkingProcess)!=null&&a.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:o.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=t.values,a=this.activeRun.schemaKeys;return a!=null&&a.output&&(e=q(e,[...this.constantSchemaKeys,...a.output])),e}async getOrCreateThread(t,e){let a;try{try{a=await this.getThread(t)}catch(s){a=await this.createThread({threadId:t,metadata:e})}}catch(s){throw new Error(`Failed to create thread: ${s.message}`)}return a}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:a}){return t.reduce((s,r)=>{var S;let g=s.configurable;r.configurable&&(g=a!=null&&a.config?q(r==null?void 0:r.configurable,[...this.constantSchemaKeys,...(S=a==null?void 0:a.config)!=null?S:[]]):r==null?void 0:r.configurable);let u=T(E(E({},s),r),{configurable:g}),l=s.recursion_limit==null&&r.recursion_limit===25,h=JSON.stringify(u)!==JSON.stringify(s),c=l&&JSON.stringify(T(E({},u),{recursion_limit:null}))===JSON.stringify(T(E({},s),{recursion_limit:null}));return h&&!c?E(E({},s),u):s},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=T(E({},this.messagesInProcess),{[t]:E(E({},this.messagesInProcess[t]),e)})}async getAssistant(){try{let t=await this.client.assistants.search(),e=t.find(a=>a.graph_id===this.graphId);if(!e){let a=`
1
+ var gt=Object.defineProperty,pt=Object.defineProperties;var mt=Object.getOwnPropertyDescriptors;var q=Object.getOwnPropertySymbols;var it=Object.prototype.hasOwnProperty,rt=Object.prototype.propertyIsEnumerable;var at=(i,n)=>(n=Symbol[i])?n:Symbol.for("Symbol."+i);var st=(i,n,t)=>n in i?gt(i,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[n]=t,f=(i,n)=>{for(var t in n||(n={}))it.call(n,t)&&st(i,t,n[t]);if(q)for(var t of q(n))rt.call(n,t)&&st(i,t,n[t]);return i},T=(i,n)=>pt(i,mt(n));var Z=(i,n)=>{var t={};for(var e in i)it.call(i,e)&&n.indexOf(e)<0&&(t[e]=i[e]);if(i!=null&&q)for(var e of q(i))n.indexOf(e)<0&&rt.call(i,e)&&(t[e]=i[e]);return t};var ot=(i,n,t)=>(n=i[at("asyncIterator")])?n.call(i):(i=i[at("iterator")](),n={},t=(e,a)=>(a=i[e])&&(n[e]=s=>new Promise((r,c,g)=>(s=a.call(i,s),g=s.done,Promise.resolve(s.value).then(l=>r({value:l,done:g}),c)))),t("next"),t("return"),n);import{HttpAgent as It}from"@ag-ui/client";import{Observable as vt}from"rxjs";import{Client as _t}from"@langchain/langgraph-sdk";import{randomUUID as z}from"@ag-ui/client";var ft=(h=>(h.OnChainStart="on_chain_start",h.OnChainStream="on_chain_stream",h.OnChainEnd="on_chain_end",h.OnChatModelStart="on_chat_model_start",h.OnChatModelStream="on_chat_model_stream",h.OnChatModelEnd="on_chat_model_end",h.OnToolStart="on_tool_start",h.OnToolEnd="on_tool_end",h.OnCustomEvent="on_custom_event",h.OnInterrupt="on_interrupt",h))(ft||{}),St=(a=>(a.ManuallyEmitMessage="manually_emit_message",a.ManuallyEmitToolCall="manually_emit_tool_call",a.ManuallyEmitState="manually_emit_state",a.Exit="exit",a))(St||{});import{AbstractAgent as Tt,EventType as o}from"@ag-ui/client";var tt=["messages","tools"];function Y(i,n){return Object.fromEntries(Object.entries(i).filter(([t])=>n.includes(t)))}function lt({mode:i,state:n,schemaKeys:t}){let e=i==="start"?n:null;return e&&(t!=null&&t.input)&&(e=Y(e,[...tt,...t.input])),e}function Et(i){var t;let n=[];for(let e of i)if(e.type==="text"&&e.text)n.push({type:"text",text:e.text});else if(e.type==="image_url"){let a=typeof e.image_url=="string"?e.image_url:(t=e.image_url)==null?void 0:t.url;if(!a)continue;if(a.startsWith("data:")){let[s,r]=a.split(",",2),c=s.includes(":")?s.split(":")[1].split(";")[0]:"image/png";n.push({type:"binary",mimeType:c,data:r||""})}else n.push({type:"binary",mimeType:"image/png",url:a})}return n}function yt(i){let n=[];for(let t of i)if(t.type==="text")n.push({type:"text",text:t.text});else if(t.type==="binary"){let e;if(t.url)e=t.url;else if(t.data)e=`data:${t.mimeType};base64,${t.data}`;else if(t.id)e=t.id;else continue;n.push({type:"image_url",image_url:{url:e}})}return n}function ht(i){return i.map(n=>{var t;switch(n.type){case"human":let e;return Array.isArray(n.content)?e=Et(n.content):e=V(K(n.content)),{id:n.id,role:"user",content:e};case"ai":let a=K(n.content);return{id:n.id,role:"assistant",content:a?V(a):"",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:V(K(n.content))};case"tool":return{id:n.id,role:"tool",content:V(K(n.content)),toolCallId:n.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function et(i){return i.map((n,t)=>{var e,a;switch(n.role){case"user":let s;return typeof n.content=="string"?s=n.content:Array.isArray(n.content)?s=yt(n.content):s=String(n.content),{id:n.id,role:n.role,content:s,type:"human"};case"assistant":return{id:n.id,type:"ai",role:n.role,content:(e=n.content)!=null?e:"",tool_calls:((a=n.toolCalls)!=null?a:[]).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 V(i){return typeof i=="string"?i:JSON.stringify(i)}function dt(i){var t,e,a,s,r;let n=(t=i.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((s=(a=(e=i.chunk.additional_kwargs)==null?void 0:e.reasoning)==null?void 0:a.summary)!=null&&s[0]){let c=(r=i.chunk.additional_kwargs)==null?void 0:r.reasoning.summary[0];return!c||!c.text?null:{type:"text",text:c.text,index:c.index}}return null}function K(i){var n;if(!i)return null;if(typeof i=="string")return i;if(Array.isArray(i)&&i.length){let t=(n=i.find(e=>e.type==="text"))==null?void 0:n.text;return t!=null?t:null}return null}var ct=class i extends Tt{constructor(t){var e,a;super(t);this.cancelRequested=!1;this.cancelSent=!1;this.constantSchemaKeys=tt;this.config=t,this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.thinkingProcess=null,this.client=(a=t==null?void 0:t.client)!=null?a:new _t({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:f({},(e=t.propertyHeaders)!=null?e:{})})}clone(){return new i(this.config)}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return new vt(e=>(this.runAgentStream(t,e),()=>{}))}async runAgentStream(t,e){var c,g,l;this.activeRun={id:t.runId,threadId:t.threadId,hasFunctionStreaming:!1},this.cancelRequested=!1,this.cancelSent=!1,this.subscriber=e,this.assistant||(this.assistant=await this.getAssistant());let a=(c=t.threadId)!=null?c:z(),s=(l=(g=t.forwardedProps)==null?void 0:g.streamMode)!=null?l:["events","values","updates"],r=await this.prepareStream(T(f({},t),{threadId:a}),s);if(!r)return e.error("No stream to regenerate");await this.handleStreamEvents(r,a,e,t,Array.isArray(s)?s:[s])}async prepareRegenerateStream(t,e){var l,h,d;let{threadId:a,messageCheckpoint:s}=t,r=await this.getCheckpointByMessage(s.id,a);if(this.assistant||(this.assistant=await this.getAssistant()),!r)return this.subscriber.error("No checkpoint found for message");let c=await this.client.threads.updateState(a,{values:this.langGraphDefaultMergeState(r.values,[],t),checkpointId:r.checkpoint.checkpoint_id,asNode:(h=(l=r.next)==null?void 0:l[0])!=null?h:"__start__"}),g=T(f({},(d=t.forwardedProps)!=null?d:{}),{input:this.langGraphDefaultMergeState(r.values,[s],t),checkpointId:c.checkpoint.checkpoint_id,streamMode:e});return{streamResponse:this.client.runs.stream(a,this.assistant.assistant_id,g),state:r,streamMode:e}}async prepareStream(t,e){var O,w,b,S,u,G,$,j,U,y;let{threadId:a,state:s,messages:r,tools:c,context:g,forwardedProps:l}=t;this.activeRun.manuallyEmittedState=null;let h=l==null?void 0:l.nodeName,d=a!=null?a:z();this.assistant||(this.assistant=await this.getAssistant());let E=await this.getOrCreateThread(d,l==null?void 0:l.threadMetadata);this.activeRun.threadId=E.thread_id;let _=(O=await this.client.threads.getState(E.thread_id))!=null?O:{values:{}},I=(w=_.values.messages)!=null?w:[],N=et(r),R=this.langGraphDefaultMergeState(T(f({},s),{messages:I}),N,t),A=T(f({},_),{values:T(f({},R),{messages:[...I,...(b=R.messages)!=null?b:[]]})}),k=A.values;if(this.activeRun.schemaKeys=await this.getSchemaKeys(),((S=_.values.messages)!=null?S:[]).length>r.filter(v=>v.role!=="system").length){let v=null;for(let P=r.length-1;P>=0;P--)if(r[P].role==="user"){v=et([r[P]])[0];break}return v?this.prepareRegenerateStream(T(f({},t),{messageCheckpoint:v}),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 p=!((u=l==null?void 0:l.command)!=null&&u.resume)&&d&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";if(p==="continue"){let v=this.activeRun.graphInfo.edges.find(P=>P.target===this.activeRun.nodeName);await this.client.threads.updateState(d,{values:s,asNode:v==null?void 0:v.source})}let M=lt({mode:p,state:k,schemaKeys:this.activeRun.schemaKeys}),m,B=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);B.length&&(m=await this.mergeConfigs({configs:B,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let x=l,{command:L}=x,J=Z(x,["command"]);if(L!=null&&L.resume&&typeof L.resume=="string")try{L.resume=JSON.parse(L.resume)}catch(v){}let W=T(f({},J),{command:L,streamMode:e,input:M,config:m,context:f(f({},g),(G=m==null?void 0:m.configurable)!=null?G:{})}),C=(U=(j=($=_.tasks)==null?void 0:$[0])==null?void 0:j.interrupts)!=null?U:[];return C!=null&&C.length&&!((y=l==null?void 0:l.command)!=null&&y.resume)?(this.dispatchEvent({type:o.RUN_STARTED,threadId:d,runId:t.runId}),this.handleNodeChange(h),C.forEach(v=>{this.dispatchEvent({type:o.CUSTOM,name:"on_interrupt",value:typeof v.value=="string"?v.value:JSON.stringify(v.value),rawEvent:v})}),this.dispatchEvent({type:o.RUN_FINISHED,threadId:d,runId:t.runId}),this.subscriber.complete()):{streamResponse:this.client.runs.stream(d,this.assistant.assistant_id,W),state:A}}async handleStreamEvents(t,e,a,s,r){var I,N,R,A,k,p,M,m,C,O,w,b,S,u;let{forwardedProps:c}=s,g=c==null?void 0:c.nodeName;this.subscriber=a;let l=!1;if(!t)return;let{streamResponse:h,state:d}=t;this.activeRun.prevNodeName=null;let E={},_=d;try{this.dispatchEvent({type:o.RUN_STARTED,threadId:e,runId:this.activeRun.id}),this.handleNodeChange(g);try{for(var B=ot(h),L,J,W;L=!(J=await B.next()).done;L=!1){let y=J.value;if(this.cancelRequested&&!this.cancelSent&&((I=this.activeRun)!=null&&I.threadId)&&((N=this.activeRun)!=null&&N.id)){try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch(X){}finally{this.cancelSent=!0}try{await((R=h==null?void 0:h.return)==null?void 0:R.call(h))}catch(X){}break}let v=(A=s.forwardedProps)==null?void 0:A.streamSubgraphs,P=v&&(y.event.startsWith("events")||y.event.startsWith("values"));if(!r.includes(y.event)&&!P&&y.event!=="error")continue;let F=y;if(y.event==="error"){this.dispatchEvent({type:o.RUN_ERROR,message:y.data.message,rawEvent:y});break}if(y.event==="updates")continue;if(y.event==="values"){E=F.data;continue}else if(v&&F.event.startsWith("values|")){E=f(f({},E),F.data);continue}let H=F.data,Q=(k=H.metadata)!=null?k:{},D=Q.langgraph_node,nt=H.event;if(Q.run_id&&(this.activeRun.id=Q.run_id,this.activeRun.serverRunIdKnown=!0,this.cancelRequested&&!this.cancelSent&&((p=this.activeRun)!=null&&p.threadId)))try{await this.client.runs.cancel(this.activeRun.threadId,this.activeRun.id)}catch(X){}finally{this.cancelSent=!0}if(D&&D!==this.activeRun.nodeName&&this.handleNodeChange(D),l=l||nt==="on_custom_event"&&H.name==="exit",nt==="on_chain_end"&&this.activeRun.nodeName===D&&(this.activeRun.exitingNode=!0),this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),(M=this.activeRun.graphInfo)!=null&&M.nodes.some(X=>X.id===D)&&this.handleNodeChange(D),_.values=(m=this.activeRun.manuallyEmittedState)!=null?m:E,!this.activeRun.nodeName)continue;(JSON.stringify(_)!==JSON.stringify(d)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(d=_,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d),rawEvent:F})),this.dispatchEvent({type:o.RAW,event:H}),this.handleSingleEvent(H)}}catch(J){W=[J]}finally{try{L&&(J=B.return)&&await J.call(B)}finally{if(W)throw W[0]}}d=await this.client.threads.getState(e);let x=d.tasks,G=(O=(C=x==null?void 0:x[0])==null?void 0:C.interrupts)!=null?O:[],$=d.next.length===0,j=(b=(w=d.metadata)==null?void 0:w.writes)!=null?b:{},U=this.activeRun.nodeName;return G!=null&&G.length||(U=$?"__end__":(S=d.next[0])!=null?S:Object.keys(j)[0]),G.forEach(y=>{this.dispatchEvent({type:o.CUSTOM,name:"on_interrupt",value:typeof y.value=="string"?y.value:JSON.stringify(y.value),rawEvent:y})}),this.handleNodeChange(U),this.handleNodeChange(void 0),this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(d)}),this.dispatchEvent({type:o.MESSAGES_SNAPSHOT,messages:ht((u=d.values.messages)!=null?u:[])}),this.dispatchEvent({type:o.RUN_FINISHED,threadId:e,runId:this.activeRun.id}),this.cancelRequested=!1,this.cancelSent=!1,this.activeRun=void 0,a.complete()}catch(x){return a.error(x)}}handleSingleEvent(t){var e,a,s,r,c,g,l,h,d,E,_,I,N,R;switch(t.event){case"on_chat_model_stream":let A=(e=t.metadata["emit-messages"])!=null?e:!0,k=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let p=this.getMessageInProgress(this.activeRun.id),M=!!(p!=null&&p.id),m=(s=t.data.chunk.tool_call_chunks)==null?void 0:s[0],B=(r=t.metadata.predict_state)==null?void 0:r.some(u=>u.tool===(m==null?void 0:m.name)),L=!M&&(m==null?void 0:m.name),J=M&&(p==null?void 0:p.toolCallId)&&(m==null?void 0:m.args),W=M&&(p==null?void 0:p.toolCallId)&&!m;(W||J||L)&&(this.activeRun.hasFunctionStreaming=!0);let C=dt(t.data),O=K(t.data.chunk.content),w=!!(!m&&O),b=M&&!(p!=null&&p.toolCallId)&&!w;if(C){this.handleThinkingEvent(C);break}if(!C&&this.thinkingProcess&&(this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.THINKING_END}),this.thinkingProcess=null),B&&this.dispatchEvent({type:o.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),W){this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:p==null?void 0:p.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(b){this.dispatchEvent({type:o.TEXT_MESSAGE_END,messageId:p.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(L&&k){this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:m.id,toolCallName:m.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:m.id,toolCallName:m.name});break}if(J&&k){this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:p==null?void 0:p.toolCallId,delta:m.args,rawEvent:t});break}if(w&&A){p||(this.dispatchEvent({type:o.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}),p=this.getMessageInProgress(this.activeRun.id)),this.dispatchEvent({type:o.TEXT_MESSAGE_CONTENT,messageId:p.id,delta:O,rawEvent:t});break}break;case"on_chat_model_end":if((c=this.getMessageInProgress(this.activeRun.id))!=null&&c.toolCallId){this.dispatchEvent({type:o.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.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.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:o.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:o.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot({values:this.activeRun.manuallyEmittedState}),rawEvent:t})),this.dispatchEvent({type:o.CUSTOM,name:t.name,value:t.data,rawEvent:t});break;case"on_tool_end":let S=(l=t.data)==null?void 0:l.output;if(S&&!S.tool_call_id&&((d=(h=S.update)==null?void 0:h.messages)!=null&&d.find(u=>u.type==="tool"))&&(S=(_=(E=S.update)==null?void 0:E.messages)==null?void 0:_.find(u=>u.type==="tool")),S&&((N=(I=S.update)==null?void 0:I.messages)!=null&&N.length)){(R=S.update)==null||R.messages.filter(u=>u.type==="tool").forEach(u=>{var x;this.activeRun.hasFunctionStreaming||(this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:u.tool_call_id,toolCallName:(x=u.name)!=null?x:"",parentMessageId:u.id,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:u.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t})),this.dispatchEvent({type:o.TOOL_CALL_RESULT,toolCallId:u.tool_call_id,content:typeof(u==null?void 0:u.content)=="string"?u==null?void 0:u.content:JSON.stringify(u==null?void 0:u.content),messageId:z(),rawEvent:t,role:"tool"})});break}this.activeRun.hasFunctionStreaming||(this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:S.tool_call_id,toolCallName:S.name,parentMessageId:S.id,rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:S.tool_call_id,delta:JSON.stringify(t.data.input),rawEvent:t}),this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:S.tool_call_id,rawEvent:t})),this.dispatchEvent({type:o.TOOL_CALL_RESULT,toolCallId:S.tool_call_id,content:S==null?void 0:S.content,messageId:z(),role:"tool",rawEvent:t});break}}abortRun(){var a,s;this.cancelRequested=!0;let t=(a=this.activeRun)==null?void 0:a.threadId,e=(s=this.activeRun)==null?void 0:s.id;t&&e&&!this.cancelSent&&this.client.runs.cancel(t,e).then(()=>{this.cancelSent=!0}).catch(()=>{}),super.abortRun()}handleThinkingEvent(t){var a;if(!t||!t.type||!t.text)return;let e=t.index;(a=this.thinkingProcess)!=null&&a.index&&this.thinkingProcess.index!==e&&(this.thinkingProcess.type&&this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_END}),this.dispatchEvent({type:o.THINKING_END}),this.thinkingProcess=null),this.thinkingProcess||(this.dispatchEvent({type:o.THINKING_START}),this.thinkingProcess={index:e}),this.thinkingProcess.type!==t.type&&(this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_START}),this.thinkingProcess.type=t.type),this.thinkingProcess.type&&this.dispatchEvent({type:o.THINKING_TEXT_MESSAGE_CONTENT,delta:t.text})}getStateSnapshot(t){let e=t.values,a=this.activeRun.schemaKeys;return a!=null&&a.output&&(e=Y(e,[...this.constantSchemaKeys,...a.output])),e}async getOrCreateThread(t,e){let a;try{try{a=await this.getThread(t)}catch(s){a=await this.createThread({threadId:t,metadata:e})}}catch(s){throw new Error(`Failed to create thread: ${s.message}`)}return a}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:a}){return t.reduce((s,r)=>{var E;let c=s.configurable;r.configurable&&(c=a!=null&&a.config?Y(r==null?void 0:r.configurable,[...this.constantSchemaKeys,...(E=a==null?void 0:a.config)!=null?E:[]]):r==null?void 0:r.configurable);let g=T(f(f({},s),r),{configurable:c}),l=s.recursion_limit==null&&r.recursion_limit===25,h=JSON.stringify(g)!==JSON.stringify(s),d=l&&JSON.stringify(T(f({},g),{recursion_limit:null}))===JSON.stringify(T(f({},s),{recursion_limit:null}));return h&&!d?f(f({},s),g):s},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=T(f({},this.messagesInProcess),{[t]:f(f({},this.messagesInProcess[t]),e)})}async getAssistant(){try{let t=await this.client.assistants.search(),e=t.find(a=>a.graph_id===this.graphId);if(!e){let a=`
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
- `;throw console.error(a),new Error(a)}return e}catch(t){let e=new Error(`Failed to retrieve assistant: ${t.message}`);throw this.dispatchEvent({type:o.RUN_ERROR,message:e.message}),this.subscriber.error(),e}}async getSchemaKeys(){var t,e,a,s;try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),g=null,u=[];if("context_schema"in r&&((t=r.context_schema)!=null&&t.properties)&&(u=Object.keys(r.context_schema.properties)),(e=r.config_schema)!=null&&e.properties&&(g=Object.keys(r.config_schema.properties)),!((a=r.input_schema)!=null&&a.properties)||!((s=r.output_schema)!=null&&s.properties))return{config:[],input:null,output:null,context:u};let l=Object.keys(r.input_schema.properties),h=Object.keys(r.output_schema.properties);return{input:l&&l.length?[...l,...this.constantSchemaKeys]:null,output:h&&h.length?[...h,...this.constantSchemaKeys]:null,context:u,config:g}}catch(r){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys,context:[]}}}langGraphDefaultMergeState(t,e,a){var l,h;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let s=t.messages||[],r=new Set(s.map(c=>c.id)),g=e.filter(c=>!r.has(c.id)),u=[...(l=t.tools)!=null?l:[],...(h=a.tools)!=null?h:[]].reduce((c,S)=>{let y=S;return S.type||(y={type:"function",name:S.name,function:{name:S.name,description:S.description,parameters:S.parameters}}),c.find(I=>I.name===y.name||I.function.name===y.function.name)?c:[...c,y]},[]);return T(E({},t),{messages:g,tools:u,"ag-ui":{tools:u,context:a.context}})}handleNodeChange(t){var e,a;t==="__end__"&&(t=void 0),t!==((e=this.activeRun)==null?void 0:e.nodeName)&&((a=this.activeRun)!=null&&a.nodeName&&this.endStep(),t&&this.startStep(t)),this.activeRun.nodeName=t}startStep(t){this.dispatchEvent({type:o.STEP_STARTED,stepName:t})}endStep(){this.dispatchEvent({type:o.STEP_FINISHED,stepName:this.activeRun.nodeName})}async getCheckpointByMessage(t,e,a){var R,N;let s=a!=null&&a.checkpoint_id?{checkpoint:{checkpoint_id:a.checkpoint_id}}:void 0,g=[...await this.client.threads.getHistory(e,s)].reverse(),u=g.find(p=>{var M;return(M=p.values.messages)==null?void 0:M.some(f=>f.id===t)});if(!u)throw new Error("Message not found");let l=(R=u.values.messages)!=null?R:[],h=l.findIndex(p=>p.id===t);if(l.slice(h+1).length)return this.getCheckpointByMessage(t,e,u.parent_checkpoint);let S=g.indexOf(u),x=u.values,{messages:y}=x,I=it(x,["messages"]),C=(N=g[S-1])!=null?N:T(E({},u),{values:{}});return T(E({},C),{values:E(E({},C.values),I)})}};var ct=class extends It{};export{Et as CustomEventNames,dt as LangGraphAgent,ft as LangGraphEventTypes,ct as LangGraphHttpAgent};
6
+ `;throw console.error(a),new Error(a)}return e}catch(t){let e=new Error(`Failed to retrieve assistant: ${t.message}`);throw this.dispatchEvent({type:o.RUN_ERROR,message:e.message}),this.subscriber.error(),e}}async getSchemaKeys(){var t,e,a,s;try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),c=null,g=[];if("context_schema"in r&&((t=r.context_schema)!=null&&t.properties)&&(g=Object.keys(r.context_schema.properties)),(e=r.config_schema)!=null&&e.properties&&(c=Object.keys(r.config_schema.properties)),!((a=r.input_schema)!=null&&a.properties)||!((s=r.output_schema)!=null&&s.properties))return{config:[],input:null,output:null,context:g};let l=Object.keys(r.input_schema.properties),h=Object.keys(r.output_schema.properties);return{input:l&&l.length?[...l,...this.constantSchemaKeys]:null,output:h&&h.length?[...h,...this.constantSchemaKeys]:null,context:g,config:c}}catch(r){return{config:[],input:this.constantSchemaKeys,output:this.constantSchemaKeys,context:[]}}}langGraphDefaultMergeState(t,e,a){var l,h;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let s=t.messages||[],r=new Set(s.map(d=>d.id)),c=e.filter(d=>!r.has(d.id)),g=[...(l=t.tools)!=null?l:[],...(h=a.tools)!=null?h:[]].reduce((d,E)=>{let _=E;return E.type||(_={type:"function",name:E.name,function:{name:E.name,description:E.description,parameters:E.parameters}}),d.find(I=>I.name===_.name||I.function.name===_.function.name)?d:[...d,_]},[]);return T(f({},t),{messages:c,tools:g,"ag-ui":{tools:g,context:a.context}})}handleNodeChange(t){var e,a;t==="__end__"&&(t=void 0),t!==((e=this.activeRun)==null?void 0:e.nodeName)&&((a=this.activeRun)!=null&&a.nodeName&&this.endStep(),t&&this.startStep(t)),this.activeRun.nodeName=t}startStep(t){this.dispatchEvent({type:o.STEP_STARTED,stepName:t})}endStep(){this.dispatchEvent({type:o.STEP_FINISHED,stepName:this.activeRun.nodeName})}async getCheckpointByMessage(t,e,a){var R,k;let s=a!=null&&a.checkpoint_id?{checkpoint:{checkpoint_id:a.checkpoint_id}}:void 0,c=[...await this.client.threads.getHistory(e,s)].reverse(),g=c.find(p=>{var M;return(M=p.values.messages)==null?void 0:M.some(m=>m.id===t)});if(!g)throw new Error("Message not found");let l=(R=g.values.messages)!=null?R:[],h=l.findIndex(p=>p.id===t);if(l.slice(h+1).length)return this.getCheckpointByMessage(t,e,g.parent_checkpoint);let E=c.indexOf(g),A=g.values,{messages:_}=A,I=Z(A,["messages"]),N=(k=c[E-1])!=null?k:T(f({},g),{values:{}});return T(f({},N),{values:f(f({},N.values),I)})}};var ut=class extends It{};export{St as CustomEventNames,ct as LangGraphAgent,ft as LangGraphEventTypes,ut as LangGraphHttpAgent};
7
7
  //# sourceMappingURL=index.mjs.map
@@ -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 \"@ag-ui/client\";\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\";\nimport { ToolMessage } from \"@langchain/core/messages\";\nimport { ToolMessageFieldsWithToolCallId } from \"@langchain/core/dist/messages/tool\";\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 // Stop control flags\n private cancelRequested: boolean = false;\n private cancelSent: boolean = false;\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 // Reset cancel flags for this run\n this.cancelRequested = false;\n this.cancelSent = false;\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 // If a cancel was requested and we haven't sent it yet, try now.\n if (\n this.cancelRequested &&\n !this.cancelSent &&\n this.activeRun?.threadId &&\n this.activeRun?.id\n ) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n // Best-effort: ask iterator to close early\n try {\n // Many async iterables used for streaming implement return()\n await (streamResponse as any)?.return?.();\n } catch (_) {}\n break;\n }\n\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 // Set server-assigned run id as soon as available\n if (metadata.run_id) {\n this.activeRun!.id = metadata.run_id;\n this.activeRun!.serverRunIdKnown = true;\n // If cancel was requested earlier (before server id was known), send it now.\n if (this.cancelRequested && !this.cancelSent && this.activeRun?.threadId) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId!, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n }\n }\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 if (eventType === LangGraphEventTypes.OnChainEnd && this.activeRun!.nodeName === currentNodeName) {\n this.activeRun!.exitingNode = true;\n }\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 // Reset cancel flags when run completes\n this.cancelRequested = false;\n this.cancelSent = false;\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 let toolCallOutput = event.data?.output\n\n // Command from within a tool. We need to grab result from the tool result message\n if (toolCallOutput && !toolCallOutput.tool_call_id && toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')) {\n toolCallOutput = toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')\n }\n\n if (toolCallOutput && toolCallOutput.update?.messages?.length) {\n type MessageFields = ToolMessageFieldsWithToolCallId & { type: string }\n toolCallOutput.update?.messages.filter((message: MessageFields) => message.type === 'tool').forEach((message: MessageFields) => {\n // Only emit tool call events if required fields exist\n if (!this.activeRun!.hasFunctionStreaming && message.tool_call_id && message.name) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: message.tool_call_id,\n toolCallName: message.name,\n parentMessageId: message.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: message.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n }\n\n // Only emit result if tool_call_id exists\n if (message.tool_call_id) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: message.tool_call_id,\n content: typeof message?.content === 'string' ? message?.content : JSON.stringify(message?.content),\n messageId: randomUUID(),\n rawEvent: event,\n role: \"tool\",\n })\n }\n })\n\n break;\n }\n\n // Only emit tool call events if required fields exist\n if (!this.activeRun!.hasFunctionStreaming && toolCallOutput?.tool_call_id && toolCallOutput?.name) {\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 // Only emit result if tool_call_id exists\n if (toolCallOutput?.tool_call_id) {\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 rawEvent: event,\n })\n }\n break;\n }\n }\n\n // Request cancellation of the current run via LangGraph Platform SDK\n public abortRun() {\n this.cancelRequested = true;\n const threadId = this.activeRun?.threadId;\n const runId = this.activeRun?.id;\n if (threadId && runId && !this.cancelSent) {\n void this.client.runs\n .cancel(threadId, runId)\n .then(() => {\n this.cancelSent = true;\n })\n .catch(() => {\n // Ignore cancellation errors; streaming loop will also check cancelRequested\n });\n }\n super.abortRun();\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 try {\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 const notFoundMessage = `\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 console.error(notFoundMessage);\n throw new Error(notFoundMessage);\n }\n\n return retrievedAssistant;\n } catch (error) {\n const redefinedError = new Error(`Failed to retrieve assistant: ${(error as Error).message}`)\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: redefinedError.message,\n });\n this.subscriber.error()\n throw redefinedError;\n }\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 // True once the platform-assigned run id is known (set from stream metadata)\n serverRunIdKnown?: 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, TextInputContent, BinaryInputContent, InputContent , UserMessage} 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\n/**\n * Convert LangChain's multimodal content to AG-UI format\n */\nfunction convertLangchainMultimodalToAgui(\n content: Array<{ type: string; text?: string; image_url?: any }>\n): InputContent[] {\n const aguiContent: InputContent[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n aguiContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"image_url\") {\n const imageUrl = typeof item.image_url === \"string\"\n ? item.image_url\n : item.image_url?.url;\n\n if (!imageUrl) continue;\n\n // Parse data URLs to extract base64 data\n if (imageUrl.startsWith(\"data:\")) {\n // Format: data:mime_type;base64,data\n const [header, data] = imageUrl.split(\",\", 2);\n const mimeType = header.includes(\":\")\n ? header.split(\":\")[1].split(\";\")[0]\n : \"image/png\";\n\n aguiContent.push({\n type: \"binary\",\n mimeType,\n data: data || \"\",\n });\n } else {\n // Regular URL or ID\n aguiContent.push({\n type: \"binary\",\n mimeType: \"image/png\", // Default MIME type\n url: imageUrl,\n });\n }\n }\n }\n\n return aguiContent;\n}\n\n/**\n * Convert AG-UI multimodal content to LangChain's format\n */\nfunction convertAguiMultimodalToLangchain(\n content: InputContent[]\n): Array<{ type: string; text?: string; image_url?: { url: string } }> {\n const langchainContent: Array<{ type: string; text?: string; image_url?: { url: string } }> = [];\n\n for (const item of content) {\n if (item.type === \"text\") {\n langchainContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"binary\") {\n // LangChain uses image_url format (OpenAI-style)\n let url: string;\n\n // Prioritize url, then data, then id\n if (item.url) {\n url = item.url;\n } else if (item.data) {\n // Construct data URL from base64 data\n url = `data:${item.mimeType};base64,${item.data}`;\n } else if (item.id) {\n // Use id as a reference\n url = item.id;\n } else {\n continue; // Skip if no source is provided\n }\n\n langchainContent.push({\n type: \"image_url\",\n image_url: { url },\n });\n }\n }\n\n return langchainContent;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n // Handle multimodal content\n let userContent: string | InputContent[];\n if (Array.isArray(message.content)) {\n userContent = convertLangchainMultimodalToAgui(message.content as any);\n } else {\n userContent = stringifyIfNeeded(resolveMessageContent(message.content));\n }\n\n return {\n id: message.id!,\n role: \"user\",\n content: userContent,\n };\n case \"ai\":\n const aiContent = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: aiContent ? stringifyIfNeeded(aiContent) : '',\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 // Handle multimodal content\n let content: UserMessage['content'];\n if (typeof message.content === \"string\") {\n content = message.content;\n } else if (Array.isArray(message.content)) {\n content = convertAguiMultimodalToLangchain(message.content) as any;\n } else {\n content = String(message.content);\n }\n\n return {\n id: message.id,\n role: message.role,\n content,\n type: \"human\",\n } as LangGraphMessage;\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\n/**\n * Flatten multimodal content into plain text.\n * Used for backwards compatibility or when multimodal is not supported.\n */\nfunction flattenUserContent(content: Message[\"content\"]): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && \"text\" in item) {\n if (item.text) {\n parts.push(item.text);\n }\n } else if (item.type === \"binary\" && \"mimeType\" in item) {\n // Add descriptive placeholder for binary content\n const binaryItem = item as BinaryInputContent;\n if (binaryItem.filename) {\n parts.push(`[Binary content: ${binaryItem.filename}]`);\n } else if (binaryItem.url) {\n parts.push(`[Binary content: ${binaryItem.url}]`);\n } else {\n parts.push(`[Binary content: ${binaryItem.mimeType}]`);\n }\n }\n }\n\n return parts.join(\"\\n\");\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","convertLangchainMultimodalToAgui","content","_a","aguiContent","item","imageUrl","header","data","mimeType","convertAguiMultimodalToLangchain","langchainContent","url","langchainMessagesToAgui","messages","message","userContent","stringifyIfNeeded","resolveMessageContent","aiContent","tc","aguiMessagesToLangChain","index","_b","resolveReasoningContent","eventData","_a","_b","_c","_d","_e","content","data","resolveMessageContent","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","_k","_l","_m","_n","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","message","runId","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","data","assistants","retrievedAssistant","searchResult","notFoundMessage","a","redefinedError","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","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 \"@ag-ui/client\";\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\";\nimport { ToolMessage } from \"@langchain/core/messages\";\nimport { ToolMessageFieldsWithToolCallId } from \"@langchain/core/dist/messages/tool\";\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 // Stop control flags\n private cancelRequested: boolean = false;\n private cancelSent: boolean = false;\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 // Reset cancel flags for this run\n this.cancelRequested = false;\n this.cancelSent = false;\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 // @ts-ignore\n const { command, ...restProps } = forwardedProps\n if (command?.resume && typeof command.resume === 'string') {\n try {\n command.resume = JSON.parse(command.resume);\n } catch {\n // Keep as string if not valid JSON\n }\n }\n const payload = {\n ...restProps,\n command,\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 // If a cancel was requested and we haven't sent it yet, try now.\n if (\n this.cancelRequested &&\n !this.cancelSent &&\n this.activeRun?.threadId &&\n this.activeRun?.id\n ) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n // Best-effort: ask iterator to close early\n try {\n // Many async iterables used for streaming implement return()\n await (streamResponse as any)?.return?.();\n } catch (_) {}\n break;\n }\n\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 // Set server-assigned run id as soon as available\n if (metadata.run_id) {\n this.activeRun!.id = metadata.run_id;\n this.activeRun!.serverRunIdKnown = true;\n // If cancel was requested earlier (before server id was known), send it now.\n if (this.cancelRequested && !this.cancelSent && this.activeRun?.threadId) {\n try {\n await this.client.runs.cancel(this.activeRun.threadId!, this.activeRun.id);\n } catch (_) {\n // Ignore cancellation errors\n } finally {\n this.cancelSent = true;\n }\n }\n }\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 if (eventType === LangGraphEventTypes.OnChainEnd && this.activeRun!.nodeName === currentNodeName) {\n this.activeRun!.exitingNode = true;\n }\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 // Reset cancel flags when run completes\n this.cancelRequested = false;\n this.cancelSent = false;\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 let toolCallOutput = event.data?.output\n\n // Command from within a tool. We need to grab result from the tool result message\n if (toolCallOutput && !toolCallOutput.tool_call_id && toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')) {\n toolCallOutput = toolCallOutput.update?.messages?.find((message: { type: string }) => message.type === 'tool')\n }\n\n if (toolCallOutput && toolCallOutput.update?.messages?.length) {\n type MessageFields = ToolMessageFieldsWithToolCallId & { type: string }\n toolCallOutput.update?.messages.filter((message: MessageFields) => message.type === 'tool').forEach((message: MessageFields) => {\n if (!this.activeRun!.hasFunctionStreaming) {\n this.dispatchEvent({\n type: EventType.TOOL_CALL_START,\n toolCallId: message.tool_call_id,\n toolCallName: message.name ?? '',\n parentMessageId: message.id,\n rawEvent: event,\n })\n this.dispatchEvent({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: message.tool_call_id,\n delta: JSON.stringify(event.data.input),\n rawEvent: event,\n });\n }\n\n this.dispatchEvent({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: message.tool_call_id,\n content: typeof message?.content === 'string' ? message?.content : JSON.stringify(message?.content),\n messageId: randomUUID(),\n rawEvent: event,\n role: \"tool\",\n })\n })\n\n break;\n }\n\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 rawEvent: event,\n })\n break;\n }\n }\n\n // Request cancellation of the current run via LangGraph Platform SDK\n public abortRun() {\n this.cancelRequested = true;\n const threadId = this.activeRun?.threadId;\n const runId = this.activeRun?.id;\n if (threadId && runId && !this.cancelSent) {\n void this.client.runs\n .cancel(threadId, runId)\n .then(() => {\n this.cancelSent = true;\n })\n .catch(() => {\n // Ignore cancellation errors; streaming loop will also check cancelRequested\n });\n }\n super.abortRun();\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 try {\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 const notFoundMessage = `\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 console.error(notFoundMessage);\n throw new Error(notFoundMessage);\n }\n\n return retrievedAssistant;\n } catch (error) {\n const redefinedError = new Error(`Failed to retrieve assistant: ${(error as Error).message}`)\n this.dispatchEvent({\n type: EventType.RUN_ERROR,\n message: redefinedError.message,\n });\n this.subscriber.error()\n throw redefinedError;\n }\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 // True once the platform-assigned run id is known (set from stream metadata)\n serverRunIdKnown?: 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, TextInputContent, BinaryInputContent, InputContent , UserMessage} 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\n/**\n * Convert LangChain's multimodal content to AG-UI format\n */\nfunction convertLangchainMultimodalToAgui(\n content: Array<{ type: string; text?: string; image_url?: any }>\n): InputContent[] {\n const aguiContent: InputContent[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n aguiContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"image_url\") {\n const imageUrl = typeof item.image_url === \"string\"\n ? item.image_url\n : item.image_url?.url;\n\n if (!imageUrl) continue;\n\n // Parse data URLs to extract base64 data\n if (imageUrl.startsWith(\"data:\")) {\n // Format: data:mime_type;base64,data\n const [header, data] = imageUrl.split(\",\", 2);\n const mimeType = header.includes(\":\")\n ? header.split(\":\")[1].split(\";\")[0]\n : \"image/png\";\n\n aguiContent.push({\n type: \"binary\",\n mimeType,\n data: data || \"\",\n });\n } else {\n // Regular URL or ID\n aguiContent.push({\n type: \"binary\",\n mimeType: \"image/png\", // Default MIME type\n url: imageUrl,\n });\n }\n }\n }\n\n return aguiContent;\n}\n\n/**\n * Convert AG-UI multimodal content to LangChain's format\n */\nfunction convertAguiMultimodalToLangchain(\n content: InputContent[]\n): Array<{ type: string; text?: string; image_url?: { url: string } }> {\n const langchainContent: Array<{ type: string; text?: string; image_url?: { url: string } }> = [];\n\n for (const item of content) {\n if (item.type === \"text\") {\n langchainContent.push({\n type: \"text\",\n text: item.text,\n });\n } else if (item.type === \"binary\") {\n // LangChain uses image_url format (OpenAI-style)\n let url: string;\n\n // Prioritize url, then data, then id\n if (item.url) {\n url = item.url;\n } else if (item.data) {\n // Construct data URL from base64 data\n url = `data:${item.mimeType};base64,${item.data}`;\n } else if (item.id) {\n // Use id as a reference\n url = item.id;\n } else {\n continue; // Skip if no source is provided\n }\n\n langchainContent.push({\n type: \"image_url\",\n image_url: { url },\n });\n }\n }\n\n return langchainContent;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n // Handle multimodal content\n let userContent: string | InputContent[];\n if (Array.isArray(message.content)) {\n userContent = convertLangchainMultimodalToAgui(message.content as any);\n } else {\n userContent = stringifyIfNeeded(resolveMessageContent(message.content));\n }\n\n return {\n id: message.id!,\n role: \"user\",\n content: userContent,\n };\n case \"ai\":\n const aiContent = resolveMessageContent(message.content)\n return {\n id: message.id!,\n role: \"assistant\",\n content: aiContent ? stringifyIfNeeded(aiContent) : '',\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 // Handle multimodal content\n let content: UserMessage['content'];\n if (typeof message.content === \"string\") {\n content = message.content;\n } else if (Array.isArray(message.content)) {\n content = convertAguiMultimodalToLangchain(message.content) as any;\n } else {\n content = String(message.content);\n }\n\n return {\n id: message.id,\n role: message.role,\n content,\n type: \"human\",\n } as LangGraphMessage;\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\n/**\n * Flatten multimodal content into plain text.\n * Used for backwards compatibility or when multimodal is not supported.\n */\nfunction flattenUserContent(content: Message[\"content\"]): string {\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n for (const item of content) {\n if (item.type === \"text\" && \"text\" in item) {\n if (item.text) {\n parts.push(item.text);\n }\n } else if (item.type === \"binary\" && \"mimeType\" in item) {\n // Add descriptive placeholder for binary content\n const binaryItem = item as BinaryInputContent;\n if (binaryItem.filename) {\n parts.push(`[Binary content: ${binaryItem.filename}]`);\n } else if (binaryItem.url) {\n parts.push(`[Binary content: ${binaryItem.url}]`);\n } else {\n parts.push(`[Binary content: ${binaryItem.mimeType}]`);\n }\n }\n }\n\n return parts.join(\"\\n\");\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","convertLangchainMultimodalToAgui","content","_a","aguiContent","item","imageUrl","header","data","mimeType","convertAguiMultimodalToLangchain","langchainContent","url","langchainMessagesToAgui","messages","message","userContent","stringifyIfNeeded","resolveMessageContent","aiContent","tc","aguiMessagesToLangChain","index","_b","resolveReasoningContent","eventData","_a","_b","_c","_d","_e","content","data","resolveMessageContent","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","_g","_h","_i","_j","_k","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","_f","command","restProps","__objRest","interrupts","EventType","interrupt","stream","streamModes","_l","_m","_n","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","message","runId","thinkingStepIndex","schemaKeys","filterObjectBySchemaKeys","threadMetadata","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","data","assistants","retrievedAssistant","searchResult","notFoundMessage","a","redefinedError","graphSchema","configSchema","contextSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","newMessages","langGraphTools","tool","mappedTool","t","nodeName","messageId","checkpoint","options","reversed","targetState","targetStateMessages","messageIndex","targetStateIndex","targetStateValuesWithoutMessages","selectedCheckpoint","LangGraphHttpAgent","HttpAgent"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ag-ui/langgraph",
3
- "version": "0.0.22-next.0",
3
+ "version": "0.0.22",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",