@ag-ui/langgraph 0.0.1-alpha.0 → 0.0.2-alpha.0

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 N=Object.defineProperty,ct=Object.defineProperties,ut=Object.getOwnPropertyDescriptor,gt=Object.getOwnPropertyDescriptors,pt=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols;var Z=Object.prototype.hasOwnProperty,mt=Object.prototype.propertyIsEnumerable;var z=(n,t)=>(t=Symbol[n])?t:Symbol.for("Symbol."+n);var Q=(n,t,e)=>t in n?N(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,g=(n,t)=>{for(var e in t||(t={}))Z.call(t,e)&&Q(n,e,t[e]);if(q)for(var e of q(t))mt.call(t,e)&&Q(n,e,t[e]);return n},y=(n,t)=>ct(n,gt(t));var Et=(n,t)=>{for(var e in t)N(n,e,{get:t[e],enumerable:!0})},vt=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of pt(t))!Z.call(n,a)&&a!==e&&N(n,a,{get:()=>t[a],enumerable:!(s=ut(t,a))||s.enumerable});return n};var St=n=>vt(N({},"__esModule",{value:!0}),n);var tt=(n,t,e)=>(t=n[z("asyncIterator")])?t.call(n):(n=n[z("iterator")](),t={},e=(s,a)=>(a=n[s])&&(t[s]=i=>new Promise((u,c,r)=>(i=a.call(n,i),r=i.done,Promise.resolve(i.value).then(p=>u({value:p,done:r}),c)))),e("next"),e("return"),t);var ft={};Et(ft,{LangGraphAgent:()=>G});module.exports=St(ft);var nt=require("rxjs"),it=require("@langchain/langgraph-sdk"),ot=require("crypto"),rt=require("@langchain/core/messages");var o=require("@ag-ui/core"),lt=require("@ag-ui/client");var O=["tools"];function w(n,t){return Object.fromEntries(Object.entries(n).filter(([e])=>t.includes(e)))}function et({mode:n,state:t,schemaKeys:e}){let s=n==="start"?t:null;return s&&(e!=null&&e.input)&&(s=w(s,[...O,...e.input])),s}function st(n){return n.map(t=>{var e;switch(t.type){case"human":return{id:t.id,role:"user",content:A(t.content)};case"ai":return{id:t.id,role:"assistant",content:A(t.content),toolCalls:(e=t.tool_calls)==null?void 0:e.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:t.id,role:"system",content:A(t.content)};case"tool":return{id:t.id,role:"tool",content:A(t.content),toolCallId:t.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function at(n){return n.map((t,e)=>{var s,a;switch(t.role){case"user":return{id:t.id,role:t.role,content:t.content,type:"human"};case"assistant":return{id:t.id,type:"ai",role:t.role,content:(s=t.content)!=null?s:"",tool_calls:((a=t.toolCalls)!=null?a:[]).map(i=>({id:i.id,name:i.function.name,args:JSON.parse(i.function.arguments),type:"tool_call"}))};case"system":return{id:t.id,role:t.role,content:t.content,type:"system"};case"tool":return{content:t.content,role:t.role,type:t.role,tool_call_id:t.toolCallId,id:t.id};default:throw console.error(`Message role ${t.role} is not implemented`),new Error("message role is not supported.")}})}function A(n){return typeof n=="string"?n:JSON.stringify(n)}var G=class extends lt.AbstractAgent{constructor(t){var e,s;super(t),this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.client=(s=t==null?void 0:t.client)!=null?s:new it.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:g({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return this.activeRun={id:t.runId,threadId:t.threadId},new nt.Observable(e=>(this.handleStreamEvents(t,e),()=>{}))}async handleStreamEvents(t,e){var D,U,H,J,F,j,K,X,$,B,Y,V;let{threadId:s,state:a,messages:i,tools:u,context:c,forwardedProps:r}=t;this.subscriber=e;let p=!1;this.activeRun.manuallyEmittedState=null,this.activeRun.nodeName=(D=t.forwardedProps)==null?void 0:D.nodeName;let l=s!=null?s:(0,ot.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let d=await this.getOrCreateThreadAndReturnState(l),S=d.values,h=at(i);a.messages=S.messages,a=this.langGraphDefaultMergeState(a,h,u);let R=l&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";R==="continue"&&!((U=r==null?void 0:r.command)!=null&&U.resume)&&await this.client.threads.updateState(l,{values:a,asNode:this.activeRun.nodeName}),this.activeRun.schemaKeys=await this.getSchemaKeys();let L=et({mode:R,state:a,schemaKeys:this.activeRun.schemaKeys}),P=await this.client.assistants.getGraph(this.assistant.assistant_id),M,_=[this.assistantConfig,r==null?void 0:r.config].filter(Boolean);_.length&&(M=await this.mergeConfigs({configs:_,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let I=y(g({},r),{streamMode:(H=r==null?void 0:r.streamMode)!=null?H:["events","values","updates"],input:L,config:M}),T=(j=(F=(J=d.tasks)==null?void 0:J[0])==null?void 0:F.interrupts)!=null?j:[];if(T!=null&&T.length&&!((K=r==null?void 0:r.command)!=null&&K.resume))return this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:l,runId:t.runId}),T.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:l,runId:t.runId}),e.complete();let E=this.client.runs.stream(l,this.assistant.assistant_id,I);this.activeRun.prevNodeName=null;let x={},b=a;try{this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:l,runId:this.activeRun.id});try{for(var Qt=tt(E),Zt,te,ee;Zt=!(te=await Qt.next()).done;Zt=!1){let m=te.value;if(!I.streamMode.includes(m.event))continue;let k=m;if(m.event==="error"){this.dispatchEvent({type:o.EventType.RUN_ERROR,message:m.data.message,rawEvent:m});break}if(m.event==="updates")continue;if(m.event==="values"){x=k.data;continue}let C=k.data,f=C.metadata.langgraph_node,W=C.event,dt=C.metadata;if(this.activeRun.id=dt.run_id,f&&f!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.dispatchEvent({type:o.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName}),f&&(this.dispatchEvent({type:o.EventType.STEP_STARTED,stepName:f}),this.activeRun.nodeName=f)),p=p||W==="on_custom_event"&&C.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===f&&W==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),P.nodes.some(ht=>ht.id===f)&&(this.activeRun.nodeName=f),b=(X=this.activeRun.manuallyEmittedState)!=null?X:x,!this.activeRun.nodeName)continue;(JSON.stringify(b)!==JSON.stringify(a)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(a=b,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a),rawEvent:k})),this.dispatchEvent({type:o.EventType.RAW,event:C}),this.handleSingleEvent(C,a)}}catch(te){ee=[te]}finally{try{Zt&&(te=Qt.return)&&await te.call(Qt)}finally{if(ee)throw ee[0]}}a=await this.client.threads.getState(l);let v=(Y=(B=($=a.tasks)==null?void 0:$[0])==null?void 0:B.interrupts)!=null?Y:[];return this.activeRun.nodeName=v?this.activeRun.nodeName:Object.keys(a.metadata.writes)[0],v.forEach(m=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof m.value=="string"?m.value:JSON.stringify(m.value),rawEvent:m})}),this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a.values)}),this.dispatchEvent({type:o.EventType.MESSAGES_SNAPSHOT,messages:st((V=a.values.messages)!=null?V:[])}),this.activeRun.nodeName&&this.dispatchEvent({type:o.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:l,runId:this.activeRun.id}),e.complete()}catch(v){return e.error(v)}}handleSingleEvent(t,e){var s,a,i,u,c,r;switch(t.event){case"on_chat_model_stream":let p=(s=t.metadata["emit-messages"])!=null?s:!0,l=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let d=this.getMessageInProgress(this.activeRun.id),S=!!(d!=null&&d.id),h=(i=t.data.chunk.tool_call_chunks)==null?void 0:i[0],R=(u=t.metadata.predict_state)==null?void 0:u.some(E=>E.tool===(h==null?void 0:h.name)),L=!S&&(h==null?void 0:h.name),P=S&&(d==null?void 0:d.toolCallId)&&h.args,M=S&&(d==null?void 0:d.toolCallId)&&!h,_=!S&&!h,I=S&&!h,T=S&&!(d!=null&&d.toolCallId)&&!I;if(R&&this.dispatchEvent({type:o.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),M){this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:d.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(T){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:d.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(L&&l){this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:h.id,toolCallName:h.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:h.id,toolCallName:h.name});break}if(P&&l){this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:d.toolCallId,delta:h.args,rawEvent:t});break}if(_&&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});break}if(I&&p){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_CONTENT,messageId:d.id,delta:t.data.chunk.content,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((r=this.getMessageInProgress(this.activeRun.id))!=null&&r.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(e),rawEvent:t})),this.dispatchEvent({type:o.EventType.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=w(t,[...O,...e.output])),t}async getOrCreateThreadAndReturnState(t){let e={values:{}};try{await this.client.threads.get(t),e=await this.client.threads.getState(t)}catch(s){await this.client.threads.create({threadId:t})}return e}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((a,i)=>{var d;let u=a.configurable;i.configurable&&(u=s!=null&&s.config?w(i==null?void 0:i.configurable,[...O,...(d=s==null?void 0:s.config)!=null?d:[]]):i==null?void 0:i.configurable);let c=y(g(g({},a),i),{configurable:u}),r=a.recursion_limit==null&&i.recursion_limit===25,p=JSON.stringify(c)!==JSON.stringify(a),l=r&&JSON.stringify(y(g({},c),{recursion_limit:null}))===JSON.stringify(y(g({},a),{recursion_limit:null}));return p&&!l?g(g({},a),c):a},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=y(g({},this.messagesInProcess),{[t]:g(g({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.assistant_id===this.agentId||s.graph_id===this.graphId);if(!e)throw console.error(`
1
+ "use strict";var N=Object.defineProperty,gt=Object.defineProperties,ut=Object.getOwnPropertyDescriptor,pt=Object.getOwnPropertyDescriptors,mt=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols;var Z=Object.prototype.hasOwnProperty,Et=Object.prototype.propertyIsEnumerable;var z=(n,t)=>(t=Symbol[n])?t:Symbol.for("Symbol."+n);var Q=(n,t,e)=>t in n?N(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,u=(n,t)=>{for(var e in t||(t={}))Z.call(t,e)&&Q(n,e,t[e]);if(q)for(var e of q(t))Et.call(t,e)&&Q(n,e,t[e]);return n},_=(n,t)=>gt(n,pt(t));var St=(n,t)=>{for(var e in t)N(n,e,{get:t[e],enumerable:!0})},ft=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of mt(t))!Z.call(n,a)&&a!==e&&N(n,a,{get:()=>t[a],enumerable:!(s=ut(t,a))||s.enumerable});return n};var vt=n=>ft(N({},"__esModule",{value:!0}),n);var tt=(n,t,e)=>(t=n[z("asyncIterator")])?t.call(n):(n=n[z("iterator")](),t={},e=(s,a)=>(a=n[s])&&(t[s]=r=>new Promise((g,c,l)=>(r=a.call(n,r),l=r.done,Promise.resolve(r.value).then(p=>g({value:p,done:l}),c)))),e("next"),e("return"),t);var _t={};St(_t,{CustomEventNames:()=>at,LangGraphAgent:()=>k,LangGraphEventTypes:()=>et});module.exports=vt(_t);var ot=require("rxjs"),rt=require("@langchain/langgraph-sdk"),lt=require("crypto"),dt=require("@langchain/core/messages");var et=(i=>(i.OnChainStart="on_chain_start",i.OnChainStream="on_chain_stream",i.OnChainEnd="on_chain_end",i.OnChatModelStart="on_chat_model_start",i.OnChatModelStream="on_chat_model_stream",i.OnChatModelEnd="on_chat_model_end",i.OnToolStart="on_tool_start",i.OnToolEnd="on_tool_end",i.OnCustomEvent="on_custom_event",i.OnInterrupt="on_interrupt",i))(et||{}),at=(a=>(a.ManuallyEmitMessage="manually_emit_message",a.ManuallyEmitToolCall="manually_emit_tool_call",a.ManuallyEmitState="manually_emit_state",a.Exit="exit",a))(at||{});var o=require("@ag-ui/client");var O=["tools"];function P(n,t){return Object.fromEntries(Object.entries(n).filter(([e])=>t.includes(e)))}function st({mode:n,state:t,schemaKeys:e}){let s=n==="start"?t:null;return s&&(e!=null&&e.input)&&(s=P(s,[...O,...e.input])),s}function nt(n){return n.map(t=>{var e;switch(t.type){case"human":return{id:t.id,role:"user",content:A(t.content)};case"ai":return{id:t.id,role:"assistant",content:A(t.content),toolCalls:(e=t.tool_calls)==null?void 0:e.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:t.id,role:"system",content:A(t.content)};case"tool":return{id:t.id,role:"tool",content:A(t.content),toolCallId:t.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function it(n){return n.map((t,e)=>{var s,a;switch(t.role){case"user":return{id:t.id,role:t.role,content:t.content,type:"human"};case"assistant":return{id:t.id,type:"ai",role:t.role,content:(s=t.content)!=null?s:"",tool_calls:((a=t.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:t.id,role:t.role,content:t.content,type:"system"};case"tool":return{content:t.content,role:t.role,type:t.role,tool_call_id:t.toolCallId,id:t.id};default:throw console.error(`Message role ${t.role} is not implemented`),new Error("message role is not supported.")}})}function A(n){return typeof n=="string"?n:JSON.stringify(n)}var k=class extends o.AbstractAgent{constructor(t){var e,s;super(t),this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.client=(s=t==null?void 0:t.client)!=null?s:new rt.Client({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:u({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return this.activeRun={id:t.runId,threadId:t.threadId},new ot.Observable(e=>(this.handleStreamEvents(t,e),()=>{}))}async handleStreamEvents(t,e){var D,U,H,J,K,F,j,B,X,$,Y,V;let{threadId:s,state:a,messages:r,tools:g,context:c,forwardedProps:l}=t;this.subscriber=e;let p=!1;this.activeRun.manuallyEmittedState=null,this.activeRun.nodeName=(D=t.forwardedProps)==null?void 0:D.nodeName;let i=s!=null?s:(0,lt.randomUUID)();this.assistant||(this.assistant=await this.getAssistant());let d=await this.getOrCreateThreadAndReturnState(i),f=d.values,h=it(r);a.messages=f.messages,a=this.langGraphDefaultMergeState(a,h,g);let R=i&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";R==="continue"&&!((U=l==null?void 0:l.command)!=null&&U.resume)&&await this.client.threads.updateState(i,{values:a,asNode:this.activeRun.nodeName}),this.activeRun.schemaKeys=await this.getSchemaKeys();let w=st({mode:R,state:a,schemaKeys:this.activeRun.schemaKeys}),x=await this.client.assistants.getGraph(this.assistant.assistant_id),I,T=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);T.length&&(I=await this.mergeConfigs({configs:T,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let C=_(u({},l),{streamMode:(H=l==null?void 0:l.streamMode)!=null?H:["events","values","updates"],input:w,config:I}),y=(F=(K=(J=d.tasks)==null?void 0:J[0])==null?void 0:K.interrupts)!=null?F:[];if(y!=null&&y.length&&!((j=l==null?void 0:l.command)!=null&&j.resume))return this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:i,runId:t.runId}),y.forEach(S=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof S.value=="string"?S.value:JSON.stringify(S.value),rawEvent:S})}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:i,runId:t.runId}),e.complete();let E=this.client.runs.stream(i,this.assistant.assistant_id,C);this.activeRun.prevNodeName=null;let G={},L=a;try{this.dispatchEvent({type:o.EventType.RUN_STARTED,threadId:i,runId:this.activeRun.id});try{for(var ee=tt(E),ae,se,ne;ae=!(se=await ee.next()).done;ae=!1){let m=se.value;if(!C.streamMode.includes(m.event))continue;let b=m;if(m.event==="error"){this.dispatchEvent({type:o.EventType.RUN_ERROR,message:m.data.message,rawEvent:m});break}if(m.event==="updates")continue;if(m.event==="values"){G=b.data;continue}let M=b.data,v=M.metadata.langgraph_node,W=M.event,ht=M.metadata;if(this.activeRun.id=ht.run_id,v&&v!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.dispatchEvent({type:o.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName}),v&&(this.dispatchEvent({type:o.EventType.STEP_STARTED,stepName:v}),this.activeRun.nodeName=v)),p=p||W==="on_custom_event"&&M.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===v&&W==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),x.nodes.some(ct=>ct.id===v)&&(this.activeRun.nodeName=v),L=(B=this.activeRun.manuallyEmittedState)!=null?B:G,!this.activeRun.nodeName)continue;(JSON.stringify(L)!==JSON.stringify(a)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(a=L,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a),rawEvent:b})),this.dispatchEvent({type:o.EventType.RAW,event:M}),this.handleSingleEvent(M,a)}}catch(se){ne=[se]}finally{try{ae&&(se=ee.return)&&await se.call(ee)}finally{if(ne)throw ne[0]}}a=await this.client.threads.getState(i);let S=(Y=($=(X=a.tasks)==null?void 0:X[0])==null?void 0:$.interrupts)!=null?Y:[];return this.activeRun.nodeName=S?this.activeRun.nodeName:Object.keys(a.metadata.writes)[0],S.forEach(m=>{this.dispatchEvent({type:o.EventType.CUSTOM,name:"on_interrupt",value:typeof m.value=="string"?m.value:JSON.stringify(m.value),rawEvent:m})}),this.dispatchEvent({type:o.EventType.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a.values)}),this.dispatchEvent({type:o.EventType.MESSAGES_SNAPSHOT,messages:nt((V=a.values.messages)!=null?V:[])}),this.activeRun.nodeName&&this.dispatchEvent({type:o.EventType.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.dispatchEvent({type:o.EventType.RUN_FINISHED,threadId:i,runId:this.activeRun.id}),e.complete()}catch(S){return e.error(S)}}handleSingleEvent(t,e){var s,a,r,g,c,l;switch(t.event){case"on_chat_model_stream":let p=(s=t.metadata["emit-messages"])!=null?s:!0,i=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let d=this.getMessageInProgress(this.activeRun.id),f=!!(d!=null&&d.id),h=(r=t.data.chunk.tool_call_chunks)==null?void 0:r[0],R=(g=t.metadata.predict_state)==null?void 0:g.some(E=>E.tool===(h==null?void 0:h.name)),w=!f&&(h==null?void 0:h.name),x=f&&(d==null?void 0:d.toolCallId)&&h.args,I=f&&(d==null?void 0:d.toolCallId)&&!h,T=!f&&!h,C=f&&!h,y=f&&!(d!=null&&d.toolCallId)&&!C;if(R&&this.dispatchEvent({type:o.EventType.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),I){this.dispatchEvent({type:o.EventType.TOOL_CALL_END,toolCallId:d.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(y){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_END,messageId:d.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(w&&i){this.dispatchEvent({type:o.EventType.TOOL_CALL_START,toolCallId:h.id,toolCallName:h.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:h.id,toolCallName:h.name});break}if(x&&i){this.dispatchEvent({type:o.EventType.TOOL_CALL_ARGS,toolCallId:d.toolCallId,delta:h.args,rawEvent:t});break}if(T&&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});break}if(C&&p){this.dispatchEvent({type:o.EventType.TEXT_MESSAGE_CONTENT,messageId:d.id,delta:t.data.chunk.content,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((l=this.getMessageInProgress(this.activeRun.id))!=null&&l.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(e),rawEvent:t})),this.dispatchEvent({type:o.EventType.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=P(t,[...O,...e.output])),t}async getOrCreateThreadAndReturnState(t){let e={values:{}};try{await this.client.threads.get(t),e=await this.client.threads.getState(t)}catch(s){await this.client.threads.create({threadId:t})}return e}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((a,r)=>{var d;let g=a.configurable;r.configurable&&(g=s!=null&&s.config?P(r==null?void 0:r.configurable,[...O,...(d=s==null?void 0:s.config)!=null?d:[]]):r==null?void 0:r.configurable);let c=_(u(u({},a),r),{configurable:g}),l=a.recursion_limit==null&&r.recursion_limit===25,p=JSON.stringify(c)!==JSON.stringify(a),i=l&&JSON.stringify(_(u({},c),{recursion_limit:null}))===JSON.stringify(_(u({},a),{recursion_limit:null}));return p&&!i?u(u({},a),c):a},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=_(u({},this.messagesInProcess),{[t]:u(u({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.assistant_id===this.agentId||s.graph_id===this.graphId);if(!e)throw console.error(`
2
2
  No agent found with graph ID ${this.graphId} or agent ID ${this.agentId} found..
3
3
 
4
4
 
5
5
  These are the available agents: [${t.map(s=>`${s.graph_id} (ID: ${s.assistant_id})`).join(", ")}]
6
- `),new Error("No agent id found");return e}async getSchemaKeys(){var e,s,a;let t=["messages"];try{let i=await this.client.assistants.getSchemas(this.assistant.assistant_id),u=null;if((e=i.config_schema)!=null&&e.properties&&(u=Object.keys(i.config_schema.properties)),!((s=i.input_schema)!=null&&s.properties)||!((a=i.output_schema)!=null&&a.properties))return{config:[],input:t,output:t};let c=Object.keys(i.input_schema.properties),r=Object.keys(i.output_schema.properties);return{input:c&&c.length?[...c,...t]:null,output:r&&r.length?[...r,...t]:null,config:u}}catch(i){return{config:[],input:t,output:t}}}langGraphDefaultMergeState(t,e,s){var p;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let a=t.messages||[],i=new Set(a.map(l=>l.id)),u=new Set(e.map(l=>l.id)),c=[];e.length<a.length&&(c=a.filter(l=>!u.has(l.id)).map(l=>new rt.RemoveMessage({id:l.id})));let r=e.filter(l=>!i.has(l.id));return y(g({},t),{messages:[...c,...r],tools:[...(p=t.tools)!=null?p:[],...s]})}};0&&(module.exports={LangGraphAgent});
6
+ `),new Error("No agent id found");return e}async getSchemaKeys(){var e,s,a;let t=["messages"];try{let r=await this.client.assistants.getSchemas(this.assistant.assistant_id),g=null;if((e=r.config_schema)!=null&&e.properties&&(g=Object.keys(r.config_schema.properties)),!((s=r.input_schema)!=null&&s.properties)||!((a=r.output_schema)!=null&&a.properties))return{config:[],input:t,output:t};let c=Object.keys(r.input_schema.properties),l=Object.keys(r.output_schema.properties);return{input:c&&c.length?[...c,...t]:null,output:l&&l.length?[...l,...t]:null,config:g}}catch(r){return{config:[],input:t,output:t}}}langGraphDefaultMergeState(t,e,s){var p;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let a=t.messages||[],r=new Set(a.map(i=>i.id)),g=new Set(e.map(i=>i.id)),c=[];e.length<a.length&&(c=a.filter(i=>!g.has(i.id)).map(i=>new dt.RemoveMessage({id:i.id})));let l=e.filter(i=>!r.has(i.id));return _(u({},t),{messages:[...c,...l],tools:[...(p=t.tools)!=null?p:[],...s]})}};0&&(module.exports={CustomEventNames,LangGraphAgent,LangGraphEventTypes});
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["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} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n} from \"./types\";\nimport {\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} from \"@ag-ui/core\";\nimport { AbstractAgent, AgentConfig } 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} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\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 };\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 activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\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 dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n return new Observable<ProcessedEvents>((subscriber) => {\n this.handleStreamEvents(input, subscriber);\n return () => {};\n });\n }\n\n async handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n let { threadId: inputThreadId, state, messages, tools, context, forwardedProps } = input;\n this.subscriber = subscriber;\n let shouldExit = false;\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 this.activeRun!.nodeName = input.forwardedProps?.nodeName;\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n let agentState = await this.getOrCreateThreadAndReturnState(threadId);\n\n const agentStateValues = agentState.values as State;\n const aguiToLangChainMessage = aguiMessagesToLangChain(messages);\n\n state.messages = agentStateValues.messages;\n state = this.langGraphDefaultMergeState(state, aguiToLangChainMessage, tools);\n\n const mode =\n threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\" && !forwardedProps?.command?.resume) {\n await this.client.threads.updateState(threadId, {\n values: state,\n asNode: this.activeRun!.nodeName,\n });\n }\n\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n const graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\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 forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]),\n input: payloadInput,\n config: payloadConfig,\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\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 subscriber.complete();\n }\n const streamResponse = this.client.runs.stream(threadId, this.assistant.assistant_id, payload);\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {};\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!payload.streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\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\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const currentNodeName = chunkData.metadata.langgraph_node;\n const eventType = chunkData.event;\n const metadata = chunkData.metadata;\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName,\n });\n }\n\n if (currentNodeName) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: currentNodeName,\n });\n this.activeRun!.nodeName = currentNodeName;\n }\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (graphInfo[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName;\n }\n\n updatedState = 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, state);\n }\n\n state = await this.client.threads.getState(threadId);\n const interrupts = (state.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n this.activeRun!.nodeName = interrupts\n ? this.activeRun!.nodeName\n : Object.keys(state.metadata.writes)[0];\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.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui(state.values.messages ?? []),\n });\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any, state: State): 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 const 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 const isMessageStartEvent = !hasCurrentStream && !toolCallData;\n const isMessageContentEvent = hasCurrentStream && !toolCallData;\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\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 started: emit TextMessageStart\n if (isMessageStartEvent && shouldEmitMessages) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: 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: null,\n toolCallName: null,\n });\n }\n break;\n }\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: event.data.chunk.content,\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(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 }\n }\n\n getStateSnapshot(state: State) {\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, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThreadAndReturnState(threadId: string): Promise<ThreadState<{}>> {\n let agentState = { values: {} } as ThreadState;\n try {\n await this.client.threads.get(threadId);\n agentState = await this.client.threads.getState(threadId);\n } catch (error) {\n await this.client.threads.create({ threadId });\n }\n\n return agentState;\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 ...DEFAULT_SCHEMA_KEYS,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.assistant_id === this.agentId || searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} or agent ID ${this.agentId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"messages\"];\n\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\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: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...CONSTANT_KEYS] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...CONSTANT_KEYS] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\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 const messageIds = new Set(messages.map((message) => message.id));\n\n let removedMessages: RemoveMessage[] = [];\n if (messages.length < existingMessages.length) {\n // Messages were removed\n removedMessages = existingMessages\n .filter((m) => !messageIds.has(m.id))\n .map((m) => new RemoveMessage({ id: m.id! }));\n }\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n return {\n ...state,\n messages: [...removedMessages, ...newMessages],\n tools: [...(state.tools ?? []), ...tools],\n };\n }\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/core\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(message.content),\n };\n case \"ai\":\n return {\n id: message.id!,\n role: \"assistant\",\n content: stringifyIfNeeded(message.content),\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(message.content),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(message.content),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n"],"mappings":"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","names":["index_exports","__export","LangGraphAgent","__toCommonJS","import_rxjs","import_langgraph_sdk","import_node_crypto","import_messages","import_core","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","tc","aguiMessagesToLangChain","index","_b","item","LangGraphAgent","config","_a","_b","LangGraphClient","__spreadValues","event","input","subscriber","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","inputThreadId","state","messages","tools","context","forwardedProps","shouldExit","threadId","agentState","agentStateValues","aguiToLangChainMessage","aguiMessagesToLangChain","mode","payloadInput","getStreamPayloadInput","graphInfo","payloadConfig","configsToMerge","payload","__spreadProps","interrupts","interrupt","streamResponse","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","currentNodeName","eventType","metadata","node","langchainMessagesToAgui","e","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","isMessageStartEvent","isMessageContentEvent","isMessageEndEvent","schemaKeys","filterObjectBySchemaKeys","DEFAULT_SCHEMA_KEYS","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","CONSTANT_KEYS","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","messageIds","removedMessages","m","newMessages"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["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} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\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} 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} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\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 };\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 activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\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 dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n return new Observable<ProcessedEvents>((subscriber) => {\n this.handleStreamEvents(input, subscriber);\n return () => {};\n });\n }\n\n async handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n let { threadId: inputThreadId, state, messages, tools, context, forwardedProps } = input;\n this.subscriber = subscriber;\n let shouldExit = false;\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 this.activeRun!.nodeName = input.forwardedProps?.nodeName;\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n let agentState = await this.getOrCreateThreadAndReturnState(threadId);\n\n const agentStateValues = agentState.values as State;\n const aguiToLangChainMessage = aguiMessagesToLangChain(messages);\n\n state.messages = agentStateValues.messages;\n state = this.langGraphDefaultMergeState(state, aguiToLangChainMessage, tools);\n\n const mode =\n threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\" && !forwardedProps?.command?.resume) {\n await this.client.threads.updateState(threadId, {\n values: state,\n asNode: this.activeRun!.nodeName,\n });\n }\n\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n const graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\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 forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]),\n input: payloadInput,\n config: payloadConfig,\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\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 subscriber.complete();\n }\n const streamResponse = this.client.runs.stream(threadId, this.assistant.assistant_id, payload);\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {};\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!payload.streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\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\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const currentNodeName = chunkData.metadata.langgraph_node;\n const eventType = chunkData.event;\n const metadata = chunkData.metadata;\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName,\n });\n }\n\n if (currentNodeName) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: currentNodeName,\n });\n this.activeRun!.nodeName = currentNodeName;\n }\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (graphInfo[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName;\n }\n\n updatedState = 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, state);\n }\n\n state = await this.client.threads.getState(threadId);\n const interrupts = (state.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n this.activeRun!.nodeName = interrupts\n ? this.activeRun!.nodeName\n : Object.keys(state.metadata.writes)[0];\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.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui(state.values.messages ?? []),\n });\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any, state: State): 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 const 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 const isMessageStartEvent = !hasCurrentStream && !toolCallData;\n const isMessageContentEvent = hasCurrentStream && !toolCallData;\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\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 started: emit TextMessageStart\n if (isMessageStartEvent && shouldEmitMessages) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: 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: null,\n toolCallName: null,\n });\n }\n break;\n }\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: event.data.chunk.content,\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(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 }\n }\n\n getStateSnapshot(state: State) {\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, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThreadAndReturnState(threadId: string): Promise<ThreadState<{}>> {\n let agentState = { values: {} } as ThreadState;\n try {\n await this.client.threads.get(threadId);\n agentState = await this.client.threads.getState(threadId);\n } catch (error) {\n await this.client.threads.create({ threadId });\n }\n\n return agentState;\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 ...DEFAULT_SCHEMA_KEYS,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.assistant_id === this.agentId || searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} or agent ID ${this.agentId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"messages\"];\n\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\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: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...CONSTANT_KEYS] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...CONSTANT_KEYS] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\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 const messageIds = new Set(messages.map((message) => message.id));\n\n let removedMessages: RemoveMessage[] = [];\n if (messages.length < existingMessages.length) {\n // Messages were removed\n removedMessages = existingMessages\n .filter((m) => !messageIds.has(m.id))\n .map((m) => new RemoveMessage({ id: m.id! }));\n }\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n return {\n ...state,\n messages: [...removedMessages, ...newMessages],\n tools: [...(state.tools ?? []), ...tools],\n };\n }\n}\n\nexport * from \"./types\";\n","import { Message } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\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 State = Record<string, any>;\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: 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 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}\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 Message,\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","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(message.content),\n };\n case \"ai\":\n return {\n id: message.id!,\n role: \"assistant\",\n content: stringifyIfNeeded(message.content),\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(message.content),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(message.content),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n"],"mappings":"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","names":["index_exports","__export","CustomEventNames","LangGraphAgent","LangGraphEventTypes","__toCommonJS","import_rxjs","import_langgraph_sdk","import_node_crypto","import_messages","LangGraphEventTypes","CustomEventNames","import_client","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","tc","aguiMessagesToLangChain","index","_b","item","LangGraphAgent","config","_a","_b","LangGraphClient","__spreadValues","event","input","subscriber","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","inputThreadId","state","messages","tools","context","forwardedProps","shouldExit","threadId","agentState","agentStateValues","aguiToLangChainMessage","aguiMessagesToLangChain","mode","payloadInput","getStreamPayloadInput","graphInfo","payloadConfig","configsToMerge","payload","__spreadProps","interrupts","interrupt","streamResponse","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","currentNodeName","eventType","metadata","node","langchainMessagesToAgui","e","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","isMessageStartEvent","isMessageContentEvent","isMessageEndEvent","schemaKeys","filterObjectBySchemaKeys","DEFAULT_SCHEMA_KEYS","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","CONSTANT_KEYS","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","messageIds","removedMessages","m","newMessages"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- var nt=Object.defineProperty,it=Object.defineProperties;var ot=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var rt=Object.prototype.hasOwnProperty,lt=Object.prototype.propertyIsEnumerable;var W=(i,t)=>(t=Symbol[i])?t:Symbol.for("Symbol."+i);var q=(i,t,e)=>t in i?nt(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,g=(i,t)=>{for(var e in t||(t={}))rt.call(t,e)&&q(i,e,t[e]);if(V)for(var e of V(t))lt.call(t,e)&&q(i,e,t[e]);return i},y=(i,t)=>it(i,ot(t));var z=(i,t,e)=>(t=i[W("asyncIterator")])?t.call(i):(i=i[W("iterator")](),t={},e=(s,a)=>(a=i[s])&&(t[s]=n=>new Promise((u,c,r)=>(n=a.call(i,n),r=n.done,Promise.resolve(n.value).then(p=>u({value:p,done:r}),c)))),e("next"),e("return"),t);import{Observable as dt}from"rxjs";import{Client as ht}from"@langchain/langgraph-sdk";import{randomUUID as ct}from"crypto";import{RemoveMessage as ut}from"@langchain/core/messages";import{EventType as o}from"@ag-ui/core";import{AbstractAgent as gt}from"@ag-ui/client";var A=["tools"];function O(i,t){return Object.fromEntries(Object.entries(i).filter(([e])=>t.includes(e)))}function Q({mode:i,state:t,schemaKeys:e}){let s=i==="start"?t:null;return s&&(e!=null&&e.input)&&(s=O(s,[...A,...e.input])),s}function Z(i){return i.map(t=>{var e;switch(t.type){case"human":return{id:t.id,role:"user",content:N(t.content)};case"ai":return{id:t.id,role:"assistant",content:N(t.content),toolCalls:(e=t.tool_calls)==null?void 0:e.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:t.id,role:"system",content:N(t.content)};case"tool":return{id:t.id,role:"tool",content:N(t.content),toolCallId:t.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function tt(i){return i.map((t,e)=>{var s,a;switch(t.role){case"user":return{id:t.id,role:t.role,content:t.content,type:"human"};case"assistant":return{id:t.id,type:"ai",role:t.role,content:(s=t.content)!=null?s:"",tool_calls:((a=t.toolCalls)!=null?a:[]).map(n=>({id:n.id,name:n.function.name,args:JSON.parse(n.function.arguments),type:"tool_call"}))};case"system":return{id:t.id,role:t.role,content:t.content,type:"system"};case"tool":return{content:t.content,role:t.role,type:t.role,tool_call_id:t.toolCallId,id:t.id};default:throw console.error(`Message role ${t.role} is not implemented`),new Error("message role is not supported.")}})}function N(i){return typeof i=="string"?i:JSON.stringify(i)}var et=class extends gt{constructor(t){var e,s;super(t),this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.client=(s=t==null?void 0:t.client)!=null?s:new ht({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:g({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return this.activeRun={id:t.runId,threadId:t.threadId},new dt(e=>(this.handleStreamEvents(t,e),()=>{}))}async handleStreamEvents(t,e){var G,x,D,U,H,J,F,j,K,X,$,B;let{threadId:s,state:a,messages:n,tools:u,context:c,forwardedProps:r}=t;this.subscriber=e;let p=!1;this.activeRun.manuallyEmittedState=null,this.activeRun.nodeName=(G=t.forwardedProps)==null?void 0:G.nodeName;let l=s!=null?s:ct();this.assistant||(this.assistant=await this.getAssistant());let d=await this.getOrCreateThreadAndReturnState(l),S=d.values,h=tt(n);a.messages=S.messages,a=this.langGraphDefaultMergeState(a,h,u);let R=l&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";R==="continue"&&!((x=r==null?void 0:r.command)!=null&&x.resume)&&await this.client.threads.updateState(l,{values:a,asNode:this.activeRun.nodeName}),this.activeRun.schemaKeys=await this.getSchemaKeys();let w=Q({mode:R,state:a,schemaKeys:this.activeRun.schemaKeys}),L=await this.client.assistants.getGraph(this.assistant.assistant_id),M,_=[this.assistantConfig,r==null?void 0:r.config].filter(Boolean);_.length&&(M=await this.mergeConfigs({configs:_,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let I=y(g({},r),{streamMode:(D=r==null?void 0:r.streamMode)!=null?D:["events","values","updates"],input:w,config:M}),T=(J=(H=(U=d.tasks)==null?void 0:U[0])==null?void 0:H.interrupts)!=null?J:[];if(T!=null&&T.length&&!((F=r==null?void 0:r.command)!=null&&F.resume))return this.dispatchEvent({type:o.RUN_STARTED,threadId:l,runId:t.runId}),T.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:l,runId:t.runId}),e.complete();let E=this.client.runs.stream(l,this.assistant.assistant_id,I);this.activeRun.prevNodeName=null;let k={},P=a;try{this.dispatchEvent({type:o.RUN_STARTED,threadId:l,runId:this.activeRun.id});try{for(var Zt=z(E),te,ee,se;te=!(ee=await Zt.next()).done;te=!1){let m=ee.value;if(!I.streamMode.includes(m.event))continue;let b=m;if(m.event==="error"){this.dispatchEvent({type:o.RUN_ERROR,message:m.data.message,rawEvent:m});break}if(m.event==="updates")continue;if(m.event==="values"){k=b.data;continue}let C=b.data,f=C.metadata.langgraph_node,Y=C.event,st=C.metadata;if(this.activeRun.id=st.run_id,f&&f!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.dispatchEvent({type:o.STEP_FINISHED,stepName:this.activeRun.nodeName}),f&&(this.dispatchEvent({type:o.STEP_STARTED,stepName:f}),this.activeRun.nodeName=f)),p=p||Y==="on_custom_event"&&C.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===f&&Y==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),L.nodes.some(at=>at.id===f)&&(this.activeRun.nodeName=f),P=(j=this.activeRun.manuallyEmittedState)!=null?j:k,!this.activeRun.nodeName)continue;(JSON.stringify(P)!==JSON.stringify(a)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(a=P,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a),rawEvent:b})),this.dispatchEvent({type:o.RAW,event:C}),this.handleSingleEvent(C,a)}}catch(ee){se=[ee]}finally{try{te&&(ee=Zt.return)&&await ee.call(Zt)}finally{if(se)throw se[0]}}a=await this.client.threads.getState(l);let v=($=(X=(K=a.tasks)==null?void 0:K[0])==null?void 0:X.interrupts)!=null?$:[];return this.activeRun.nodeName=v?this.activeRun.nodeName:Object.keys(a.metadata.writes)[0],v.forEach(m=>{this.dispatchEvent({type:o.CUSTOM,name:"on_interrupt",value:typeof m.value=="string"?m.value:JSON.stringify(m.value),rawEvent:m})}),this.dispatchEvent({type:o.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a.values)}),this.dispatchEvent({type:o.MESSAGES_SNAPSHOT,messages:Z((B=a.values.messages)!=null?B:[])}),this.activeRun.nodeName&&this.dispatchEvent({type:o.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.dispatchEvent({type:o.RUN_FINISHED,threadId:l,runId:this.activeRun.id}),e.complete()}catch(v){return e.error(v)}}handleSingleEvent(t,e){var s,a,n,u,c,r;switch(t.event){case"on_chat_model_stream":let p=(s=t.metadata["emit-messages"])!=null?s:!0,l=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let d=this.getMessageInProgress(this.activeRun.id),S=!!(d!=null&&d.id),h=(n=t.data.chunk.tool_call_chunks)==null?void 0:n[0],R=(u=t.metadata.predict_state)==null?void 0:u.some(E=>E.tool===(h==null?void 0:h.name)),w=!S&&(h==null?void 0:h.name),L=S&&(d==null?void 0:d.toolCallId)&&h.args,M=S&&(d==null?void 0:d.toolCallId)&&!h,_=!S&&!h,I=S&&!h,T=S&&!(d!=null&&d.toolCallId)&&!I;if(R&&this.dispatchEvent({type:o.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),M){this.dispatchEvent({type:o.TOOL_CALL_END,toolCallId:d.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(T){this.dispatchEvent({type:o.TEXT_MESSAGE_END,messageId:d.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(w&&l){this.dispatchEvent({type:o.TOOL_CALL_START,toolCallId:h.id,toolCallName:h.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:h.id,toolCallName:h.name});break}if(L&&l){this.dispatchEvent({type:o.TOOL_CALL_ARGS,toolCallId:d.toolCallId,delta:h.args,rawEvent:t});break}if(_&&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});break}if(I&&p){this.dispatchEvent({type:o.TEXT_MESSAGE_CONTENT,messageId:d.id,delta:t.data.chunk.content,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((r=this.getMessageInProgress(this.activeRun.id))!=null&&r.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(e),rawEvent:t})),this.dispatchEvent({type:o.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=O(t,[...A,...e.output])),t}async getOrCreateThreadAndReturnState(t){let e={values:{}};try{await this.client.threads.get(t),e=await this.client.threads.getState(t)}catch(s){await this.client.threads.create({threadId:t})}return e}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((a,n)=>{var d;let u=a.configurable;n.configurable&&(u=s!=null&&s.config?O(n==null?void 0:n.configurable,[...A,...(d=s==null?void 0:s.config)!=null?d:[]]):n==null?void 0:n.configurable);let c=y(g(g({},a),n),{configurable:u}),r=a.recursion_limit==null&&n.recursion_limit===25,p=JSON.stringify(c)!==JSON.stringify(a),l=r&&JSON.stringify(y(g({},c),{recursion_limit:null}))===JSON.stringify(y(g({},a),{recursion_limit:null}));return p&&!l?g(g({},a),c):a},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=y(g({},this.messagesInProcess),{[t]:g(g({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.assistant_id===this.agentId||s.graph_id===this.graphId);if(!e)throw console.error(`
1
+ var nt=Object.defineProperty,it=Object.defineProperties;var ot=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var rt=Object.prototype.hasOwnProperty,lt=Object.prototype.propertyIsEnumerable;var W=(o,t)=>(t=Symbol[o])?t:Symbol.for("Symbol."+o);var q=(o,t,e)=>t in o?nt(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e,u=(o,t)=>{for(var e in t||(t={}))rt.call(t,e)&&q(o,e,t[e]);if(V)for(var e of V(t))lt.call(t,e)&&q(o,e,t[e]);return o},_=(o,t)=>it(o,ot(t));var z=(o,t,e)=>(t=o[W("asyncIterator")])?t.call(o):(o=o[W("iterator")](),t={},e=(s,a)=>(a=o[s])&&(t[s]=i=>new Promise((g,c,l)=>(i=a.call(o,i),l=i.done,Promise.resolve(i.value).then(p=>g({value:p,done:l}),c)))),e("next"),e("return"),t);import{Observable as ct}from"rxjs";import{Client as gt}from"@langchain/langgraph-sdk";import{randomUUID as ut}from"crypto";import{RemoveMessage as pt}from"@langchain/core/messages";var dt=(n=>(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))(dt||{}),ht=(a=>(a.ManuallyEmitMessage="manually_emit_message",a.ManuallyEmitToolCall="manually_emit_tool_call",a.ManuallyEmitState="manually_emit_state",a.Exit="exit",a))(ht||{});import{AbstractAgent as mt,EventType as r}from"@ag-ui/client";var A=["tools"];function O(o,t){return Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))}function Q({mode:o,state:t,schemaKeys:e}){let s=o==="start"?t:null;return s&&(e!=null&&e.input)&&(s=O(s,[...A,...e.input])),s}function Z(o){return o.map(t=>{var e;switch(t.type){case"human":return{id:t.id,role:"user",content:N(t.content)};case"ai":return{id:t.id,role:"assistant",content:N(t.content),toolCalls:(e=t.tool_calls)==null?void 0:e.map(s=>({id:s.id,type:"function",function:{name:s.name,arguments:JSON.stringify(s.args)}}))};case"system":return{id:t.id,role:"system",content:N(t.content)};case"tool":return{id:t.id,role:"tool",content:N(t.content),toolCallId:t.tool_call_id};default:throw new Error("message type returned from LangGraph is not supported.")}})}function tt(o){return o.map((t,e)=>{var s,a;switch(t.role){case"user":return{id:t.id,role:t.role,content:t.content,type:"human"};case"assistant":return{id:t.id,type:"ai",role:t.role,content:(s=t.content)!=null?s:"",tool_calls:((a=t.toolCalls)!=null?a:[]).map(i=>({id:i.id,name:i.function.name,args:JSON.parse(i.function.arguments),type:"tool_call"}))};case"system":return{id:t.id,role:t.role,content:t.content,type:"system"};case"tool":return{content:t.content,role:t.role,type:t.role,tool_call_id:t.toolCallId,id:t.id};default:throw console.error(`Message role ${t.role} is not implemented`),new Error("message role is not supported.")}})}function N(o){return typeof o=="string"?o:JSON.stringify(o)}var et=class extends mt{constructor(t){var e,s;super(t),this.messagesInProcess={},this.agentName=t.agentName,this.graphId=t.graphId,this.assistantConfig=t.assistantConfig,this.client=(s=t==null?void 0:t.client)!=null?s:new gt({apiUrl:t.deploymentUrl,apiKey:t.langsmithApiKey,defaultHeaders:u({},(e=t.propertyHeaders)!=null?e:{})})}dispatchEvent(t){return this.subscriber.next(t),!0}run(t){return this.activeRun={id:t.runId,threadId:t.threadId},new ct(e=>(this.handleStreamEvents(t,e),()=>{}))}async handleStreamEvents(t,e){var k,G,D,U,H,J,K,F,j,B,X,$;let{threadId:s,state:a,messages:i,tools:g,context:c,forwardedProps:l}=t;this.subscriber=e;let p=!1;this.activeRun.manuallyEmittedState=null,this.activeRun.nodeName=(k=t.forwardedProps)==null?void 0:k.nodeName;let n=s!=null?s:ut();this.assistant||(this.assistant=await this.getAssistant());let d=await this.getOrCreateThreadAndReturnState(n),f=d.values,h=tt(i);a.messages=f.messages,a=this.langGraphDefaultMergeState(a,h,g);let R=n&&this.activeRun.nodeName!="__end__"&&this.activeRun.nodeName?"continue":"start";R==="continue"&&!((G=l==null?void 0:l.command)!=null&&G.resume)&&await this.client.threads.updateState(n,{values:a,asNode:this.activeRun.nodeName}),this.activeRun.schemaKeys=await this.getSchemaKeys();let P=Q({mode:R,state:a,schemaKeys:this.activeRun.schemaKeys}),w=await this.client.assistants.getGraph(this.assistant.assistant_id),I,T=[this.assistantConfig,l==null?void 0:l.config].filter(Boolean);T.length&&(I=await this.mergeConfigs({configs:T,assistant:this.assistant,schemaKeys:this.activeRun.schemaKeys}));let C=_(u({},l),{streamMode:(D=l==null?void 0:l.streamMode)!=null?D:["events","values","updates"],input:P,config:I}),y=(J=(H=(U=d.tasks)==null?void 0:U[0])==null?void 0:H.interrupts)!=null?J:[];if(y!=null&&y.length&&!((K=l==null?void 0:l.command)!=null&&K.resume))return this.dispatchEvent({type:r.RUN_STARTED,threadId:n,runId:t.runId}),y.forEach(S=>{this.dispatchEvent({type:r.CUSTOM,name:"on_interrupt",value:typeof S.value=="string"?S.value:JSON.stringify(S.value),rawEvent:S})}),this.dispatchEvent({type:r.RUN_FINISHED,threadId:n,runId:t.runId}),e.complete();let E=this.client.runs.stream(n,this.assistant.assistant_id,C);this.activeRun.prevNodeName=null;let b={},x=a;try{this.dispatchEvent({type:r.RUN_STARTED,threadId:n,runId:this.activeRun.id});try{for(var ae=z(E),se,ne,ie;se=!(ne=await ae.next()).done;se=!1){let m=ne.value;if(!C.streamMode.includes(m.event))continue;let L=m;if(m.event==="error"){this.dispatchEvent({type:r.RUN_ERROR,message:m.data.message,rawEvent:m});break}if(m.event==="updates")continue;if(m.event==="values"){b=L.data;continue}let M=L.data,v=M.metadata.langgraph_node,Y=M.event,at=M.metadata;if(this.activeRun.id=at.run_id,v&&v!==this.activeRun.nodeName&&(this.activeRun.nodeName&&this.dispatchEvent({type:r.STEP_FINISHED,stepName:this.activeRun.nodeName}),v&&(this.dispatchEvent({type:r.STEP_STARTED,stepName:v}),this.activeRun.nodeName=v)),p=p||Y==="on_custom_event"&&M.name==="exit",this.activeRun.exitingNode=this.activeRun.nodeName===v&&Y==="on_chain_end",this.activeRun.exitingNode&&(this.activeRun.manuallyEmittedState=null),w.nodes.some(st=>st.id===v)&&(this.activeRun.nodeName=v),x=(F=this.activeRun.manuallyEmittedState)!=null?F:b,!this.activeRun.nodeName)continue;(JSON.stringify(x)!==JSON.stringify(a)||this.activeRun.prevNodeName!=this.activeRun.nodeName||this.activeRun.exitingNode)&&!this.getMessageInProgress(this.activeRun.id)&&(a=x,this.activeRun.prevNodeName=this.activeRun.nodeName,this.dispatchEvent({type:r.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a),rawEvent:L})),this.dispatchEvent({type:r.RAW,event:M}),this.handleSingleEvent(M,a)}}catch(ne){ie=[ne]}finally{try{se&&(ne=ae.return)&&await ne.call(ae)}finally{if(ie)throw ie[0]}}a=await this.client.threads.getState(n);let S=(X=(B=(j=a.tasks)==null?void 0:j[0])==null?void 0:B.interrupts)!=null?X:[];return this.activeRun.nodeName=S?this.activeRun.nodeName:Object.keys(a.metadata.writes)[0],S.forEach(m=>{this.dispatchEvent({type:r.CUSTOM,name:"on_interrupt",value:typeof m.value=="string"?m.value:JSON.stringify(m.value),rawEvent:m})}),this.dispatchEvent({type:r.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(a.values)}),this.dispatchEvent({type:r.MESSAGES_SNAPSHOT,messages:Z(($=a.values.messages)!=null?$:[])}),this.activeRun.nodeName&&this.dispatchEvent({type:r.STEP_FINISHED,stepName:this.activeRun.nodeName}),this.dispatchEvent({type:r.RUN_FINISHED,threadId:n,runId:this.activeRun.id}),e.complete()}catch(S){return e.error(S)}}handleSingleEvent(t,e){var s,a,i,g,c,l;switch(t.event){case"on_chat_model_stream":let p=(s=t.metadata["emit-messages"])!=null?s:!0,n=(a=t.metadata["emit-tool-calls"])!=null?a:!0;if(t.data.chunk.response_metadata.finish_reason)return;let d=this.getMessageInProgress(this.activeRun.id),f=!!(d!=null&&d.id),h=(i=t.data.chunk.tool_call_chunks)==null?void 0:i[0],R=(g=t.metadata.predict_state)==null?void 0:g.some(E=>E.tool===(h==null?void 0:h.name)),P=!f&&(h==null?void 0:h.name),w=f&&(d==null?void 0:d.toolCallId)&&h.args,I=f&&(d==null?void 0:d.toolCallId)&&!h,T=!f&&!h,C=f&&!h,y=f&&!(d!=null&&d.toolCallId)&&!C;if(R&&this.dispatchEvent({type:r.CUSTOM,name:"PredictState",value:t.metadata.predict_state}),I){this.dispatchEvent({type:r.TOOL_CALL_END,toolCallId:d.toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(y){this.dispatchEvent({type:r.TEXT_MESSAGE_END,messageId:d.id,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if(P&&n){this.dispatchEvent({type:r.TOOL_CALL_START,toolCallId:h.id,toolCallName:h.name,parentMessageId:t.data.chunk.id,rawEvent:t})&&this.setMessageInProgress(this.activeRun.id,{id:t.data.chunk.id,toolCallId:h.id,toolCallName:h.name});break}if(w&&n){this.dispatchEvent({type:r.TOOL_CALL_ARGS,toolCallId:d.toolCallId,delta:h.args,rawEvent:t});break}if(T&&p){this.dispatchEvent({type:r.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});break}if(C&&p){this.dispatchEvent({type:r.TEXT_MESSAGE_CONTENT,messageId:d.id,delta:t.data.chunk.content,rawEvent:t});break}break;case"on_chat_model_end":if((c=this.getMessageInProgress(this.activeRun.id))!=null&&c.toolCallId){this.dispatchEvent({type:r.TOOL_CALL_END,toolCallId:this.getMessageInProgress(this.activeRun.id).toolCallId,rawEvent:t})&&(this.messagesInProcess[this.activeRun.id]=null);break}if((l=this.getMessageInProgress(this.activeRun.id))!=null&&l.id){this.dispatchEvent({type:r.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:r.TEXT_MESSAGE_START,role:"assistant",messageId:t.data.message_id,rawEvent:t}),this.dispatchEvent({type:r.TEXT_MESSAGE_CONTENT,messageId:t.data.message_id,delta:t.data.message,rawEvent:t}),this.dispatchEvent({type:r.TEXT_MESSAGE_END,messageId:t.data.message_id,rawEvent:t});break}if(t.name==="manually_emit_tool_call"){this.dispatchEvent({type:r.TOOL_CALL_START,toolCallId:t.data.id,toolCallName:t.data.name,parentMessageId:t.data.id,rawEvent:t}),this.dispatchEvent({type:r.TOOL_CALL_ARGS,toolCallId:t.data.id,delta:t.data.args,rawEvent:t}),this.dispatchEvent({type:r.TOOL_CALL_END,toolCallId:t.data.id,rawEvent:t});break}t.name==="manually_emit_state"&&(this.activeRun.manuallyEmittedState=t.data,this.dispatchEvent({type:r.STATE_SNAPSHOT,snapshot:this.getStateSnapshot(e),rawEvent:t})),this.dispatchEvent({type:r.CUSTOM,name:t.name,value:t.data,rawEvent:t});break}}getStateSnapshot(t){let e=this.activeRun.schemaKeys;return e!=null&&e.output&&(t=O(t,[...A,...e.output])),t}async getOrCreateThreadAndReturnState(t){let e={values:{}};try{await this.client.threads.get(t),e=await this.client.threads.getState(t)}catch(s){await this.client.threads.create({threadId:t})}return e}async mergeConfigs({configs:t,assistant:e,schemaKeys:s}){return t.reduce((a,i)=>{var d;let g=a.configurable;i.configurable&&(g=s!=null&&s.config?O(i==null?void 0:i.configurable,[...A,...(d=s==null?void 0:s.config)!=null?d:[]]):i==null?void 0:i.configurable);let c=_(u(u({},a),i),{configurable:g}),l=a.recursion_limit==null&&i.recursion_limit===25,p=JSON.stringify(c)!==JSON.stringify(a),n=l&&JSON.stringify(_(u({},c),{recursion_limit:null}))===JSON.stringify(_(u({},a),{recursion_limit:null}));return p&&!n?u(u({},a),c):a},e.config)}getMessageInProgress(t){return this.messagesInProcess[t]}setMessageInProgress(t,e){this.messagesInProcess=_(u({},this.messagesInProcess),{[t]:u(u({},this.messagesInProcess[t]),e)})}async getAssistant(){let t=await this.client.assistants.search(),e=t.find(s=>s.assistant_id===this.agentId||s.graph_id===this.graphId);if(!e)throw console.error(`
2
2
  No agent found with graph ID ${this.graphId} or agent ID ${this.agentId} found..
3
3
 
4
4
 
5
5
  These are the available agents: [${t.map(s=>`${s.graph_id} (ID: ${s.assistant_id})`).join(", ")}]
6
- `),new Error("No agent id found");return e}async getSchemaKeys(){var e,s,a;let t=["messages"];try{let n=await this.client.assistants.getSchemas(this.assistant.assistant_id),u=null;if((e=n.config_schema)!=null&&e.properties&&(u=Object.keys(n.config_schema.properties)),!((s=n.input_schema)!=null&&s.properties)||!((a=n.output_schema)!=null&&a.properties))return{config:[],input:t,output:t};let c=Object.keys(n.input_schema.properties),r=Object.keys(n.output_schema.properties);return{input:c&&c.length?[...c,...t]:null,output:r&&r.length?[...r,...t]:null,config:u}}catch(n){return{config:[],input:t,output:t}}}langGraphDefaultMergeState(t,e,s){var p;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let a=t.messages||[],n=new Set(a.map(l=>l.id)),u=new Set(e.map(l=>l.id)),c=[];e.length<a.length&&(c=a.filter(l=>!u.has(l.id)).map(l=>new ut({id:l.id})));let r=e.filter(l=>!n.has(l.id));return y(g({},t),{messages:[...c,...r],tools:[...(p=t.tools)!=null?p:[],...s]})}};export{et as LangGraphAgent};
6
+ `),new Error("No agent id found");return e}async getSchemaKeys(){var e,s,a;let t=["messages"];try{let i=await this.client.assistants.getSchemas(this.assistant.assistant_id),g=null;if((e=i.config_schema)!=null&&e.properties&&(g=Object.keys(i.config_schema.properties)),!((s=i.input_schema)!=null&&s.properties)||!((a=i.output_schema)!=null&&a.properties))return{config:[],input:t,output:t};let c=Object.keys(i.input_schema.properties),l=Object.keys(i.output_schema.properties);return{input:c&&c.length?[...c,...t]:null,output:l&&l.length?[...l,...t]:null,config:g}}catch(i){return{config:[],input:t,output:t}}}langGraphDefaultMergeState(t,e,s){var p;e.length>0&&"role"in e[0]&&e[0].role==="system"&&(e=e.slice(1));let a=t.messages||[],i=new Set(a.map(n=>n.id)),g=new Set(e.map(n=>n.id)),c=[];e.length<a.length&&(c=a.filter(n=>!g.has(n.id)).map(n=>new pt({id:n.id})));let l=e.filter(n=>!i.has(n.id));return _(u({},t),{messages:[...c,...l],tools:[...(p=t.tools)!=null?p:[],...s]})}};export{ht as CustomEventNames,et as LangGraphAgent,dt as LangGraphEventTypes};
7
7
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts"],"sourcesContent":["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} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\n} from \"./types\";\nimport {\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} from \"@ag-ui/core\";\nimport { AbstractAgent, AgentConfig } 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} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\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 };\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 activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\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 dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n return new Observable<ProcessedEvents>((subscriber) => {\n this.handleStreamEvents(input, subscriber);\n return () => {};\n });\n }\n\n async handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n let { threadId: inputThreadId, state, messages, tools, context, forwardedProps } = input;\n this.subscriber = subscriber;\n let shouldExit = false;\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 this.activeRun!.nodeName = input.forwardedProps?.nodeName;\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n let agentState = await this.getOrCreateThreadAndReturnState(threadId);\n\n const agentStateValues = agentState.values as State;\n const aguiToLangChainMessage = aguiMessagesToLangChain(messages);\n\n state.messages = agentStateValues.messages;\n state = this.langGraphDefaultMergeState(state, aguiToLangChainMessage, tools);\n\n const mode =\n threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\" && !forwardedProps?.command?.resume) {\n await this.client.threads.updateState(threadId, {\n values: state,\n asNode: this.activeRun!.nodeName,\n });\n }\n\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n const graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\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 forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]),\n input: payloadInput,\n config: payloadConfig,\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\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 subscriber.complete();\n }\n const streamResponse = this.client.runs.stream(threadId, this.assistant.assistant_id, payload);\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {};\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!payload.streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\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\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const currentNodeName = chunkData.metadata.langgraph_node;\n const eventType = chunkData.event;\n const metadata = chunkData.metadata;\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName,\n });\n }\n\n if (currentNodeName) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: currentNodeName,\n });\n this.activeRun!.nodeName = currentNodeName;\n }\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (graphInfo[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName;\n }\n\n updatedState = 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, state);\n }\n\n state = await this.client.threads.getState(threadId);\n const interrupts = (state.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n this.activeRun!.nodeName = interrupts\n ? this.activeRun!.nodeName\n : Object.keys(state.metadata.writes)[0];\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.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui(state.values.messages ?? []),\n });\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any, state: State): 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 const 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 const isMessageStartEvent = !hasCurrentStream && !toolCallData;\n const isMessageContentEvent = hasCurrentStream && !toolCallData;\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\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 started: emit TextMessageStart\n if (isMessageStartEvent && shouldEmitMessages) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: 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: null,\n toolCallName: null,\n });\n }\n break;\n }\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: event.data.chunk.content,\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(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 }\n }\n\n getStateSnapshot(state: State) {\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, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThreadAndReturnState(threadId: string): Promise<ThreadState<{}>> {\n let agentState = { values: {} } as ThreadState;\n try {\n await this.client.threads.get(threadId);\n agentState = await this.client.threads.getState(threadId);\n } catch (error) {\n await this.client.threads.create({ threadId });\n }\n\n return agentState;\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 ...DEFAULT_SCHEMA_KEYS,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.assistant_id === this.agentId || searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} or agent ID ${this.agentId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"messages\"];\n\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\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: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...CONSTANT_KEYS] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...CONSTANT_KEYS] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\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 const messageIds = new Set(messages.map((message) => message.id));\n\n let removedMessages: RemoveMessage[] = [];\n if (messages.length < existingMessages.length) {\n // Messages were removed\n removedMessages = existingMessages\n .filter((m) => !messageIds.has(m.id))\n .map((m) => new RemoveMessage({ id: m.id! }));\n }\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n return {\n ...state,\n messages: [...removedMessages, ...newMessages],\n tools: [...(state.tools ?? []), ...tools],\n };\n }\n}\n","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/core\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(message.content),\n };\n case \"ai\":\n return {\n id: message.id!,\n role: \"assistant\",\n content: stringifyIfNeeded(message.content),\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(message.content),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(message.content),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n"],"mappings":"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","names":["Observable","LangGraphClient","randomUUID","RemoveMessage","EventType","AbstractAgent","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","tc","aguiMessagesToLangChain","index","_b","item","LangGraphAgent","AbstractAgent","config","_a","_b","LangGraphClient","__spreadValues","event","input","Observable","subscriber","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","inputThreadId","state","messages","tools","context","forwardedProps","shouldExit","threadId","randomUUID","agentState","agentStateValues","aguiToLangChainMessage","aguiMessagesToLangChain","mode","payloadInput","getStreamPayloadInput","graphInfo","payloadConfig","configsToMerge","payload","__spreadProps","interrupts","EventType","interrupt","streamResponse","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","currentNodeName","eventType","metadata","node","langchainMessagesToAgui","e","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","isMessageStartEvent","isMessageContentEvent","isMessageEndEvent","schemaKeys","filterObjectBySchemaKeys","DEFAULT_SCHEMA_KEYS","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","CONSTANT_KEYS","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","messageIds","removedMessages","m","RemoveMessage","newMessages"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types.ts","../src/utils.ts"],"sourcesContent":["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} from \"@langchain/langgraph-sdk\";\nimport { randomUUID } from \"node:crypto\";\nimport { RemoveMessage } from \"@langchain/core/messages\";\nimport {\n LangGraphPlatformMessage,\n CustomEventNames,\n LangGraphEventTypes,\n State,\n MessagesInProgressRecord,\n SchemaKeys,\n MessageInProgress,\n RunMetadata,\n PredictStateTool,\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} 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} from \"@/utils\";\n\nexport type ProcessedEvents =\n | TextMessageStartEvent\n | TextMessageContentEvent\n | TextMessageEndEvent\n | ToolCallStartEvent\n | ToolCallArgsEvent\n | ToolCallEndEvent\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 };\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 activeRun?: RunMetadata;\n // @ts-expect-error no need to initialize subscriber right now\n subscriber: Subscriber<ProcessedEvents>;\n\n constructor(config: LangGraphAgentConfig) {\n super(config);\n this.messagesInProcess = {};\n this.agentName = config.agentName;\n this.graphId = config.graphId;\n this.assistantConfig = config.assistantConfig;\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 dispatchEvent(event: ProcessedEvents) {\n this.subscriber.next(event);\n return true;\n }\n\n run(input: RunAgentInput) {\n this.activeRun = {\n id: input.runId,\n threadId: input.threadId,\n };\n return new Observable<ProcessedEvents>((subscriber) => {\n this.handleStreamEvents(input, subscriber);\n return () => {};\n });\n }\n\n async handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>) {\n let { threadId: inputThreadId, state, messages, tools, context, forwardedProps } = input;\n this.subscriber = subscriber;\n let shouldExit = false;\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 this.activeRun!.nodeName = input.forwardedProps?.nodeName;\n\n const threadId = inputThreadId ?? randomUUID();\n\n if (!this.assistant) {\n this.assistant = await this.getAssistant();\n }\n\n let agentState = await this.getOrCreateThreadAndReturnState(threadId);\n\n const agentStateValues = agentState.values as State;\n const aguiToLangChainMessage = aguiMessagesToLangChain(messages);\n\n state.messages = agentStateValues.messages;\n state = this.langGraphDefaultMergeState(state, aguiToLangChainMessage, tools);\n\n const mode =\n threadId && this.activeRun!.nodeName != \"__end__\" && this.activeRun!.nodeName\n ? \"continue\"\n : \"start\";\n\n if (mode === \"continue\" && !forwardedProps?.command?.resume) {\n await this.client.threads.updateState(threadId, {\n values: state,\n asNode: this.activeRun!.nodeName,\n });\n }\n\n this.activeRun!.schemaKeys = await this.getSchemaKeys();\n\n const payloadInput = getStreamPayloadInput({\n mode,\n state,\n schemaKeys: this.activeRun!.schemaKeys,\n });\n\n const graphInfo = await this.client.assistants.getGraph(this.assistant.assistant_id);\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 forwardedProps?.streamMode ?? ([\"events\", \"values\", \"updates\"] satisfies StreamMode[]),\n input: payloadInput,\n config: payloadConfig,\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\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 subscriber.complete();\n }\n const streamResponse = this.client.runs.stream(threadId, this.assistant.assistant_id, payload);\n\n this.activeRun!.prevNodeName = null;\n let latestStateValues = {};\n let updatedState = state;\n\n try {\n this.dispatchEvent({\n type: EventType.RUN_STARTED,\n threadId,\n runId: this.activeRun!.id,\n });\n\n for await (let streamResponseChunk of streamResponse) {\n // @ts-ignore\n if (!payload.streamMode.includes(streamResponseChunk.event as StreamMode)) {\n continue;\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\") continue;\n\n if (streamResponseChunk.event === \"values\") {\n latestStateValues = chunk.data;\n continue;\n }\n\n const chunkData = chunk.data;\n const currentNodeName = chunkData.metadata.langgraph_node;\n const eventType = chunkData.event;\n const metadata = chunkData.metadata;\n this.activeRun!.id = metadata.run_id;\n\n if (currentNodeName && currentNodeName !== this.activeRun!.nodeName) {\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName,\n });\n }\n\n if (currentNodeName) {\n this.dispatchEvent({\n type: EventType.STEP_STARTED,\n stepName: currentNodeName,\n });\n this.activeRun!.nodeName = currentNodeName;\n }\n }\n\n shouldExit =\n shouldExit ||\n (eventType === LangGraphEventTypes.OnCustomEvent &&\n chunkData.name === CustomEventNames.Exit);\n\n this.activeRun!.exitingNode =\n this.activeRun!.nodeName === currentNodeName &&\n eventType === LangGraphEventTypes.OnChainEnd;\n if (this.activeRun!.exitingNode) {\n this.activeRun!.manuallyEmittedState = null;\n }\n\n // we only want to update the node name under certain conditions\n // since we don't need any internal node names to be sent to the frontend\n if (graphInfo[\"nodes\"].some((node) => node.id === currentNodeName)) {\n this.activeRun!.nodeName = currentNodeName;\n }\n\n updatedState = 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, state);\n }\n\n state = await this.client.threads.getState(threadId);\n const interrupts = (state.tasks?.[0]?.interrupts ?? []) as Interrupt[];\n this.activeRun!.nodeName = interrupts\n ? this.activeRun!.nodeName\n : Object.keys(state.metadata.writes)[0];\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.STATE_SNAPSHOT,\n snapshot: this.getStateSnapshot(state.values),\n });\n this.dispatchEvent({\n type: EventType.MESSAGES_SNAPSHOT,\n messages: langchainMessagesToAgui(state.values.messages ?? []),\n });\n if (this.activeRun!.nodeName) {\n this.dispatchEvent({\n type: EventType.STEP_FINISHED,\n stepName: this.activeRun!.nodeName!,\n });\n }\n this.dispatchEvent({\n type: EventType.RUN_FINISHED,\n threadId,\n runId: this.activeRun!.id,\n });\n return subscriber.complete();\n } catch (e) {\n return subscriber.error(e);\n }\n }\n\n handleSingleEvent(event: any, state: State): 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 const 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 const isMessageStartEvent = !hasCurrentStream && !toolCallData;\n const isMessageContentEvent = hasCurrentStream && !toolCallData;\n const isMessageEndEvent =\n hasCurrentStream && !currentStream?.toolCallId && !isMessageContentEvent;\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 started: emit TextMessageStart\n if (isMessageStartEvent && shouldEmitMessages) {\n const resolved = this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_START,\n role: \"assistant\",\n messageId: 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: null,\n toolCallName: null,\n });\n }\n break;\n }\n // Message content: emit TextMessageContent\n if (isMessageContentEvent && shouldEmitMessages) {\n this.dispatchEvent({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: currentStream!.id,\n delta: event.data.chunk.content,\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(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 }\n }\n\n getStateSnapshot(state: State) {\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, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.output]);\n }\n // return state\n return state;\n }\n\n async getOrCreateThreadAndReturnState(threadId: string): Promise<ThreadState<{}>> {\n let agentState = { values: {} } as ThreadState;\n try {\n await this.client.threads.get(threadId);\n agentState = await this.client.threads.getState(threadId);\n } catch (error) {\n await this.client.threads.create({ threadId });\n }\n\n return agentState;\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 ...DEFAULT_SCHEMA_KEYS,\n ...(schemaKeys?.config ?? []),\n ])\n : cfg?.configurable;\n }\n\n const newConfig = {\n ...acc,\n ...cfg,\n configurable: filteredConfigurable,\n };\n\n // LG does not return recursion limit if it's the default, therefore we check: if no recursion limit is currently set, and the user asked for 25, there is no change.\n const isRecursionLimitSetToDefault =\n acc.recursion_limit == null && cfg.recursion_limit === 25;\n // Deep compare configs to avoid unnecessary update calls\n const configsAreDifferent = JSON.stringify(newConfig) !== JSON.stringify(acc);\n\n // Check if the only difference is the recursion_limit being set to default\n const isOnlyRecursionLimitDifferent =\n isRecursionLimitSetToDefault &&\n JSON.stringify({ ...newConfig, recursion_limit: null }) ===\n JSON.stringify({ ...acc, recursion_limit: null });\n\n if (configsAreDifferent && !isOnlyRecursionLimitDifferent) {\n return {\n ...acc,\n ...newConfig,\n };\n }\n\n return acc;\n }, assistant.config);\n }\n\n getMessageInProgress(runId: string) {\n return this.messagesInProcess[runId];\n }\n\n setMessageInProgress(runId: string, data: MessageInProgress) {\n this.messagesInProcess = {\n ...this.messagesInProcess,\n [runId]: {\n ...(this.messagesInProcess[runId] as MessageInProgress),\n ...data,\n },\n };\n }\n\n async getAssistant(): Promise<Assistant> {\n const assistants = await this.client.assistants.search();\n const retrievedAssistant = assistants.find(\n (searchResult) =>\n searchResult.assistant_id === this.agentId || searchResult.graph_id === this.graphId,\n );\n if (!retrievedAssistant) {\n console.error(`\n No agent found with graph ID ${this.graphId} or agent ID ${this.agentId} found..\\n\n \n These are the available agents: [${assistants.map((a) => `${a.graph_id} (ID: ${a.assistant_id})`).join(\", \")}]\n `);\n throw new Error(\"No agent id found\");\n }\n\n return retrievedAssistant;\n }\n\n async getSchemaKeys(): Promise<SchemaKeys> {\n const CONSTANT_KEYS = [\"messages\"];\n\n try {\n const graphSchema = await this.client.assistants.getSchemas(this.assistant!.assistant_id);\n let configSchema = null;\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: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n const inputSchema = Object.keys(graphSchema.input_schema.properties);\n const outputSchema = Object.keys(graphSchema.output_schema.properties);\n\n return {\n input: inputSchema && inputSchema.length ? [...inputSchema, ...CONSTANT_KEYS] : null,\n output: outputSchema && outputSchema.length ? [...outputSchema, ...CONSTANT_KEYS] : null,\n config: configSchema,\n };\n } catch (e) {\n return { config: [], input: CONSTANT_KEYS, output: CONSTANT_KEYS };\n }\n }\n\n langGraphDefaultMergeState(state: State, messages: LangGraphMessage[], tools: any): State {\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 const messageIds = new Set(messages.map((message) => message.id));\n\n let removedMessages: RemoveMessage[] = [];\n if (messages.length < existingMessages.length) {\n // Messages were removed\n removedMessages = existingMessages\n .filter((m) => !messageIds.has(m.id))\n .map((m) => new RemoveMessage({ id: m.id! }));\n }\n\n const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));\n\n return {\n ...state,\n messages: [...removedMessages, ...newMessages],\n tools: [...(state.tools ?? []), ...tools],\n };\n }\n}\n\nexport * from \"./types\";\n","import { Message } from \"@langchain/langgraph-sdk\";\nimport { MessageType } from \"@langchain/core/messages\";\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 State = Record<string, any>;\n\nexport type SchemaKeys = {\n input: string[] | null;\n output: 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 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}\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 Message,\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","import { Message as LangGraphMessage } from \"@langchain/langgraph-sdk\";\nimport { State, SchemaKeys } from \"./types\";\nimport { Message, ToolCall } from \"@ag-ui/client\";\n\nexport const DEFAULT_SCHEMA_KEYS = [\"tools\"];\n\nexport function filterObjectBySchemaKeys(obj: Record<string, any>, schemaKeys: string[]) {\n return Object.fromEntries(Object.entries(obj).filter(([key]) => schemaKeys.includes(key)));\n}\n\nexport function getStreamPayloadInput({\n mode,\n state,\n schemaKeys,\n}: {\n mode: \"start\" | \"continue\";\n state: State;\n schemaKeys: SchemaKeys;\n}) {\n let input = mode === \"start\" ? state : null;\n // Do not input keys that are not part of the input schema\n if (input && schemaKeys?.input) {\n input = filterObjectBySchemaKeys(input, [...DEFAULT_SCHEMA_KEYS, ...schemaKeys.input]);\n }\n\n return input;\n}\n\nexport function langchainMessagesToAgui(messages: LangGraphMessage[]): Message[] {\n return messages.map((message) => {\n switch (message.type) {\n case \"human\":\n return {\n id: message.id!,\n role: \"user\",\n content: stringifyIfNeeded(message.content),\n };\n case \"ai\":\n return {\n id: message.id!,\n role: \"assistant\",\n content: stringifyIfNeeded(message.content),\n toolCalls: message.tool_calls?.map((tc) => ({\n id: tc.id!,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n case \"system\":\n return {\n id: message.id!,\n role: \"system\",\n content: stringifyIfNeeded(message.content),\n };\n case \"tool\":\n return {\n id: message.id!,\n role: \"tool\",\n content: stringifyIfNeeded(message.content),\n toolCallId: message.tool_call_id,\n };\n default:\n throw new Error(\"message type returned from LangGraph is not supported.\");\n }\n });\n}\n\nexport function aguiMessagesToLangChain(messages: Message[]): LangGraphMessage[] {\n return messages.map((message, index) => {\n switch (message.role) {\n case \"user\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"human\",\n };\n case \"assistant\":\n return {\n id: message.id,\n type: \"ai\",\n role: message.role,\n content: message.content ?? \"\",\n tool_calls: (message.toolCalls ?? []).map((tc: ToolCall) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments),\n type: \"tool_call\",\n })),\n };\n case \"system\":\n return {\n id: message.id,\n role: message.role,\n content: message.content,\n type: \"system\",\n };\n case \"tool\":\n return {\n content: message.content,\n role: message.role,\n type: message.role,\n tool_call_id: message.toolCallId,\n id: message.id,\n };\n default:\n console.error(`Message role ${message.role} is not implemented`);\n throw new Error(\"message role is not supported.\");\n }\n });\n}\n\nfunction stringifyIfNeeded(item: any) {\n if (typeof item === \"string\") return item;\n return JSON.stringify(item);\n}\n"],"mappings":"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","names":["Observable","LangGraphClient","randomUUID","RemoveMessage","LangGraphEventTypes","CustomEventNames","AbstractAgent","EventType","DEFAULT_SCHEMA_KEYS","filterObjectBySchemaKeys","obj","schemaKeys","key","getStreamPayloadInput","mode","state","input","langchainMessagesToAgui","messages","message","_a","stringifyIfNeeded","tc","aguiMessagesToLangChain","index","_b","item","LangGraphAgent","AbstractAgent","config","_a","_b","LangGraphClient","__spreadValues","event","input","Observable","subscriber","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","inputThreadId","state","messages","tools","context","forwardedProps","shouldExit","threadId","randomUUID","agentState","agentStateValues","aguiToLangChainMessage","aguiMessagesToLangChain","mode","payloadInput","getStreamPayloadInput","graphInfo","payloadConfig","configsToMerge","payload","__spreadProps","interrupts","EventType","interrupt","streamResponse","latestStateValues","updatedState","iter","__forAwait","more","temp","error","streamResponseChunk","chunk","chunkData","currentNodeName","eventType","metadata","node","langchainMessagesToAgui","e","shouldEmitMessages","shouldEmitToolCalls","currentStream","hasCurrentStream","toolCallData","toolCallUsedToPredictState","predictStateTool","isToolCallStartEvent","isToolCallArgsEvent","isToolCallEndEvent","isMessageStartEvent","isMessageContentEvent","isMessageEndEvent","schemaKeys","filterObjectBySchemaKeys","DEFAULT_SCHEMA_KEYS","configs","assistant","acc","cfg","filteredConfigurable","newConfig","isRecursionLimitSetToDefault","configsAreDifferent","isOnlyRecursionLimitDifferent","runId","data","assistants","retrievedAssistant","searchResult","a","CONSTANT_KEYS","graphSchema","configSchema","inputSchema","outputSchema","existingMessages","existingMessageIds","message","messageIds","removedMessages","m","RemoveMessage","newMessages"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ag-ui/langgraph",
3
- "version": "0.0.1-alpha.0",
3
+ "version": "0.0.2-alpha.0",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -13,14 +13,11 @@
13
13
  "dist/**"
14
14
  ],
15
15
  "dependencies": {
16
- "partial-json": "^0.1.7",
17
- "@ag-ui/core": "0.0.28",
18
- "@ag-ui/client": "0.0.28"
19
- },
20
- "peerDependencies": {
21
16
  "@langchain/core": "^0.3.38",
22
17
  "@langchain/langgraph-sdk": "^0.0.78",
23
- "rxjs": "7.8.1"
18
+ "partial-json": "^0.1.7",
19
+ "rxjs": "7.8.1",
20
+ "@ag-ui/client": "0.0.28"
24
21
  },
25
22
  "devDependencies": {
26
23
  "@types/jest": "^29.5.14",
package/dist/index.d.mts DELETED
@@ -1,72 +0,0 @@
1
- import { Subscriber, Observable } from 'rxjs';
2
- import { Client, Config, Assistant, StreamMode, ThreadState, Message } from '@langchain/langgraph-sdk';
3
- import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, RunAgentInput } from '@ag-ui/core';
4
- import { AgentConfig, AbstractAgent } from '@ag-ui/client';
5
- import { RunsStreamPayload } from '@langchain/langgraph-sdk/dist/types';
6
-
7
- type State = Record<string, any>;
8
- type SchemaKeys = {
9
- input: string[] | null;
10
- output: string[] | null;
11
- config: string[] | null;
12
- } | null;
13
- type MessageInProgress = {
14
- id: string;
15
- toolCallId?: string | null;
16
- toolCallName?: string | null;
17
- };
18
- interface RunMetadata {
19
- id: string;
20
- schemaKeys?: SchemaKeys;
21
- nodeName?: string;
22
- prevNodeName?: string | null;
23
- exitingNode?: boolean;
24
- manuallyEmittedState?: State | null;
25
- threadId?: string;
26
- }
27
- type MessagesInProgressRecord = Record<string, MessageInProgress | null>;
28
-
29
- type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
30
- type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = StreamMode, TSubgraphs extends boolean = false> = Omit<RunAgentInput, "forwardedProps"> & {
31
- forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, "input"> & {
32
- nodeName?: string;
33
- };
34
- };
35
- interface LangGraphAgentConfig extends AgentConfig {
36
- client?: Client;
37
- deploymentUrl: string;
38
- langsmithApiKey?: string;
39
- propertyHeaders?: Record<string, string>;
40
- assistantConfig?: Config;
41
- agentName?: string;
42
- graphId: string;
43
- }
44
- declare class LangGraphAgent extends AbstractAgent {
45
- client: Client;
46
- assistantConfig?: Config;
47
- agentName?: string;
48
- graphId: string;
49
- assistant?: Assistant;
50
- messagesInProcess: MessagesInProgressRecord;
51
- activeRun?: RunMetadata;
52
- subscriber: Subscriber<ProcessedEvents>;
53
- constructor(config: LangGraphAgentConfig);
54
- dispatchEvent(event: ProcessedEvents): boolean;
55
- run(input: RunAgentInput): Observable<ProcessedEvents>;
56
- handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>): Promise<void>;
57
- handleSingleEvent(event: any, state: State): void;
58
- getStateSnapshot(state: State): State;
59
- getOrCreateThreadAndReturnState(threadId: string): Promise<ThreadState<{}>>;
60
- mergeConfigs({ configs, assistant, schemaKeys, }: {
61
- configs: Config[];
62
- assistant: Assistant;
63
- schemaKeys: SchemaKeys;
64
- }): Promise<Config>;
65
- getMessageInProgress(runId: string): MessageInProgress | null;
66
- setMessageInProgress(runId: string, data: MessageInProgress): void;
67
- getAssistant(): Promise<Assistant>;
68
- getSchemaKeys(): Promise<SchemaKeys>;
69
- langGraphDefaultMergeState(state: State, messages: Message[], tools: any): State;
70
- }
71
-
72
- export { LangGraphAgent, type LangGraphAgentConfig, type ProcessedEvents };
package/dist/index.d.ts DELETED
@@ -1,72 +0,0 @@
1
- import { Subscriber, Observable } from 'rxjs';
2
- import { Client, Config, Assistant, StreamMode, ThreadState, Message } from '@langchain/langgraph-sdk';
3
- import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, RunAgentInput } from '@ag-ui/core';
4
- import { AgentConfig, AbstractAgent } from '@ag-ui/client';
5
- import { RunsStreamPayload } from '@langchain/langgraph-sdk/dist/types';
6
-
7
- type State = Record<string, any>;
8
- type SchemaKeys = {
9
- input: string[] | null;
10
- output: string[] | null;
11
- config: string[] | null;
12
- } | null;
13
- type MessageInProgress = {
14
- id: string;
15
- toolCallId?: string | null;
16
- toolCallName?: string | null;
17
- };
18
- interface RunMetadata {
19
- id: string;
20
- schemaKeys?: SchemaKeys;
21
- nodeName?: string;
22
- prevNodeName?: string | null;
23
- exitingNode?: boolean;
24
- manuallyEmittedState?: State | null;
25
- threadId?: string;
26
- }
27
- type MessagesInProgressRecord = Record<string, MessageInProgress | null>;
28
-
29
- type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
30
- type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = StreamMode, TSubgraphs extends boolean = false> = Omit<RunAgentInput, "forwardedProps"> & {
31
- forwardedProps?: Omit<RunsStreamPayload<TStreamMode, TSubgraphs>, "input"> & {
32
- nodeName?: string;
33
- };
34
- };
35
- interface LangGraphAgentConfig extends AgentConfig {
36
- client?: Client;
37
- deploymentUrl: string;
38
- langsmithApiKey?: string;
39
- propertyHeaders?: Record<string, string>;
40
- assistantConfig?: Config;
41
- agentName?: string;
42
- graphId: string;
43
- }
44
- declare class LangGraphAgent extends AbstractAgent {
45
- client: Client;
46
- assistantConfig?: Config;
47
- agentName?: string;
48
- graphId: string;
49
- assistant?: Assistant;
50
- messagesInProcess: MessagesInProgressRecord;
51
- activeRun?: RunMetadata;
52
- subscriber: Subscriber<ProcessedEvents>;
53
- constructor(config: LangGraphAgentConfig);
54
- dispatchEvent(event: ProcessedEvents): boolean;
55
- run(input: RunAgentInput): Observable<ProcessedEvents>;
56
- handleStreamEvents(input: RunAgentExtendedInput, subscriber: Subscriber<ProcessedEvents>): Promise<void>;
57
- handleSingleEvent(event: any, state: State): void;
58
- getStateSnapshot(state: State): State;
59
- getOrCreateThreadAndReturnState(threadId: string): Promise<ThreadState<{}>>;
60
- mergeConfigs({ configs, assistant, schemaKeys, }: {
61
- configs: Config[];
62
- assistant: Assistant;
63
- schemaKeys: SchemaKeys;
64
- }): Promise<Config>;
65
- getMessageInProgress(runId: string): MessageInProgress | null;
66
- setMessageInProgress(runId: string, data: MessageInProgress): void;
67
- getAssistant(): Promise<Assistant>;
68
- getSchemaKeys(): Promise<SchemaKeys>;
69
- langGraphDefaultMergeState(state: State, messages: Message[], tools: any): State;
70
- }
71
-
72
- export { LangGraphAgent, type LangGraphAgentConfig, type ProcessedEvents };