@ag-ui/langgraph 0.0.1-alpha.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +46 -4
- package/dist/index.d.ts +46 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -6
package/dist/index.d.mts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { Subscriber, Observable } from 'rxjs';
|
|
2
|
-
import { Client, Config, Assistant, StreamMode, ThreadState
|
|
3
|
-
import {
|
|
4
|
-
import { AgentConfig, AbstractAgent } from '@ag-ui/client';
|
|
2
|
+
import { Message, Client, Config, Assistant, StreamMode, ThreadState } from '@langchain/langgraph-sdk';
|
|
3
|
+
import { MessageType } from '@langchain/core/messages';
|
|
4
|
+
import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput } from '@ag-ui/client';
|
|
5
5
|
import { RunsStreamPayload } from '@langchain/langgraph-sdk/dist/types';
|
|
6
6
|
|
|
7
|
+
declare enum LangGraphEventTypes {
|
|
8
|
+
OnChainStart = "on_chain_start",
|
|
9
|
+
OnChainStream = "on_chain_stream",
|
|
10
|
+
OnChainEnd = "on_chain_end",
|
|
11
|
+
OnChatModelStart = "on_chat_model_start",
|
|
12
|
+
OnChatModelStream = "on_chat_model_stream",
|
|
13
|
+
OnChatModelEnd = "on_chat_model_end",
|
|
14
|
+
OnToolStart = "on_tool_start",
|
|
15
|
+
OnToolEnd = "on_tool_end",
|
|
16
|
+
OnCustomEvent = "on_custom_event",
|
|
17
|
+
OnInterrupt = "on_interrupt"
|
|
18
|
+
}
|
|
7
19
|
type State = Record<string, any>;
|
|
8
20
|
type SchemaKeys = {
|
|
9
21
|
input: string[] | null;
|
|
@@ -25,6 +37,36 @@ interface RunMetadata {
|
|
|
25
37
|
threadId?: string;
|
|
26
38
|
}
|
|
27
39
|
type MessagesInProgressRecord = Record<string, MessageInProgress | null>;
|
|
40
|
+
interface ToolCall {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
args: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
type BaseLangGraphPlatformMessage = Omit<Message, "isResultMessage" | "isTextMessage" | "isImageMessage" | "isActionExecutionMessage" | "isAgentStateMessage" | "type" | "createdAt"> & {
|
|
46
|
+
content: string;
|
|
47
|
+
role: string;
|
|
48
|
+
additional_kwargs?: Record<string, unknown>;
|
|
49
|
+
type: MessageType;
|
|
50
|
+
};
|
|
51
|
+
interface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {
|
|
52
|
+
tool_call_id: string;
|
|
53
|
+
name: string;
|
|
54
|
+
}
|
|
55
|
+
interface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {
|
|
56
|
+
tool_calls: ToolCall[];
|
|
57
|
+
}
|
|
58
|
+
type LangGraphPlatformMessage = LangGraphPlatformActionExecutionMessage | LangGraphPlatformResultMessage | BaseLangGraphPlatformMessage;
|
|
59
|
+
declare enum CustomEventNames {
|
|
60
|
+
ManuallyEmitMessage = "manually_emit_message",
|
|
61
|
+
ManuallyEmitToolCall = "manually_emit_tool_call",
|
|
62
|
+
ManuallyEmitState = "manually_emit_state",
|
|
63
|
+
Exit = "exit"
|
|
64
|
+
}
|
|
65
|
+
interface PredictStateTool {
|
|
66
|
+
tool: string;
|
|
67
|
+
state_key: string;
|
|
68
|
+
tool_argument: string;
|
|
69
|
+
}
|
|
28
70
|
|
|
29
71
|
type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
|
|
30
72
|
type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = StreamMode, TSubgraphs extends boolean = false> = Omit<RunAgentInput, "forwardedProps"> & {
|
|
@@ -69,4 +111,4 @@ declare class LangGraphAgent extends AbstractAgent {
|
|
|
69
111
|
langGraphDefaultMergeState(state: State, messages: Message[], tools: any): State;
|
|
70
112
|
}
|
|
71
113
|
|
|
72
|
-
export { LangGraphAgent, type LangGraphAgentConfig, type ProcessedEvents };
|
|
114
|
+
export { CustomEventNames, LangGraphAgent, type LangGraphAgentConfig, LangGraphEventTypes, type LangGraphPlatformMessage, type MessageInProgress, type MessagesInProgressRecord, type PredictStateTool, type ProcessedEvents, type RunMetadata, type SchemaKeys, type State, type ToolCall };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { Subscriber, Observable } from 'rxjs';
|
|
2
|
-
import { Client, Config, Assistant, StreamMode, ThreadState
|
|
3
|
-
import {
|
|
4
|
-
import { AgentConfig, AbstractAgent } from '@ag-ui/client';
|
|
2
|
+
import { Message, Client, Config, Assistant, StreamMode, ThreadState } from '@langchain/langgraph-sdk';
|
|
3
|
+
import { MessageType } from '@langchain/core/messages';
|
|
4
|
+
import { TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, AgentConfig, AbstractAgent, RunAgentInput } from '@ag-ui/client';
|
|
5
5
|
import { RunsStreamPayload } from '@langchain/langgraph-sdk/dist/types';
|
|
6
6
|
|
|
7
|
+
declare enum LangGraphEventTypes {
|
|
8
|
+
OnChainStart = "on_chain_start",
|
|
9
|
+
OnChainStream = "on_chain_stream",
|
|
10
|
+
OnChainEnd = "on_chain_end",
|
|
11
|
+
OnChatModelStart = "on_chat_model_start",
|
|
12
|
+
OnChatModelStream = "on_chat_model_stream",
|
|
13
|
+
OnChatModelEnd = "on_chat_model_end",
|
|
14
|
+
OnToolStart = "on_tool_start",
|
|
15
|
+
OnToolEnd = "on_tool_end",
|
|
16
|
+
OnCustomEvent = "on_custom_event",
|
|
17
|
+
OnInterrupt = "on_interrupt"
|
|
18
|
+
}
|
|
7
19
|
type State = Record<string, any>;
|
|
8
20
|
type SchemaKeys = {
|
|
9
21
|
input: string[] | null;
|
|
@@ -25,6 +37,36 @@ interface RunMetadata {
|
|
|
25
37
|
threadId?: string;
|
|
26
38
|
}
|
|
27
39
|
type MessagesInProgressRecord = Record<string, MessageInProgress | null>;
|
|
40
|
+
interface ToolCall {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
args: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
type BaseLangGraphPlatformMessage = Omit<Message, "isResultMessage" | "isTextMessage" | "isImageMessage" | "isActionExecutionMessage" | "isAgentStateMessage" | "type" | "createdAt"> & {
|
|
46
|
+
content: string;
|
|
47
|
+
role: string;
|
|
48
|
+
additional_kwargs?: Record<string, unknown>;
|
|
49
|
+
type: MessageType;
|
|
50
|
+
};
|
|
51
|
+
interface LangGraphPlatformResultMessage extends BaseLangGraphPlatformMessage {
|
|
52
|
+
tool_call_id: string;
|
|
53
|
+
name: string;
|
|
54
|
+
}
|
|
55
|
+
interface LangGraphPlatformActionExecutionMessage extends BaseLangGraphPlatformMessage {
|
|
56
|
+
tool_calls: ToolCall[];
|
|
57
|
+
}
|
|
58
|
+
type LangGraphPlatformMessage = LangGraphPlatformActionExecutionMessage | LangGraphPlatformResultMessage | BaseLangGraphPlatformMessage;
|
|
59
|
+
declare enum CustomEventNames {
|
|
60
|
+
ManuallyEmitMessage = "manually_emit_message",
|
|
61
|
+
ManuallyEmitToolCall = "manually_emit_tool_call",
|
|
62
|
+
ManuallyEmitState = "manually_emit_state",
|
|
63
|
+
Exit = "exit"
|
|
64
|
+
}
|
|
65
|
+
interface PredictStateTool {
|
|
66
|
+
tool: string;
|
|
67
|
+
state_key: string;
|
|
68
|
+
tool_argument: string;
|
|
69
|
+
}
|
|
28
70
|
|
|
29
71
|
type ProcessedEvents = TextMessageStartEvent | TextMessageContentEvent | TextMessageEndEvent | ToolCallStartEvent | ToolCallArgsEvent | ToolCallEndEvent | StateSnapshotEvent | StateDeltaEvent | MessagesSnapshotEvent | RawEvent | CustomEvent | RunStartedEvent | RunFinishedEvent | RunErrorEvent | StepStartedEvent | StepFinishedEvent;
|
|
30
72
|
type RunAgentExtendedInput<TStreamMode extends StreamMode | StreamMode[] = StreamMode, TSubgraphs extends boolean = false> = Omit<RunAgentInput, "forwardedProps"> & {
|
|
@@ -69,4 +111,4 @@ declare class LangGraphAgent extends AbstractAgent {
|
|
|
69
111
|
langGraphDefaultMergeState(state: State, messages: Message[], tools: any): State;
|
|
70
112
|
}
|
|
71
113
|
|
|
72
|
-
export { LangGraphAgent, type LangGraphAgentConfig, type ProcessedEvents };
|
|
114
|
+
export { CustomEventNames, LangGraphAgent, type LangGraphAgentConfig, LangGraphEventTypes, type LangGraphPlatformMessage, type MessageInProgress, type MessagesInProgressRecord, type PredictStateTool, type ProcessedEvents, type RunMetadata, type SchemaKeys, type State, type ToolCall };
|
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
|
|
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
|
|
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
|
package/dist/index.mjs.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":["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,20 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ag-ui/langgraph",
|
|
3
|
-
"version": "0.0.1
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"sideEffects": false,
|
|
8
|
-
"private": false,
|
|
9
|
-
"publishConfig": {
|
|
10
|
-
"access": "public"
|
|
11
|
-
},
|
|
12
8
|
"files": [
|
|
13
9
|
"dist/**"
|
|
14
10
|
],
|
|
15
11
|
"dependencies": {
|
|
16
12
|
"partial-json": "^0.1.7",
|
|
17
|
-
"@ag-ui/core": "0.0.28",
|
|
18
13
|
"@ag-ui/client": "0.0.28"
|
|
19
14
|
},
|
|
20
15
|
"peerDependencies": {
|