type Message = { role: string; content: string };
type State = { messages: Message[] };
const llm = async (s: State): Promise<State> => ({
messages: [...s.messages, { role: "ai", content: "Hello from LangGraph JS!" }],
});
class StateGraph<S> {
private nodes = new Map<string, (s: S) => Promise<S> | S>();
private edges: Array<[string, string]> = [];
addNode(name: string, fn: (s: S) => Promise<S> | S) { this.nodes.set(name, fn); }
addEdge(from: string, to: string) { this.edges.push([from, to]); }
compile() {
const edges = this.edges.slice();
return {
invoke: async (initial: S) => {
let curr = "START";
let state = initial;
while (true) {
const next = edges.find(e => e[0] === curr)?.[1];
if (!next || next === "END") break;
const fn = this.nodes.get(next)!;
state = await fn(state);
curr = next;
}
return state;
}
};
}
}
const g = new StateGraph<State>();
g.addNode("llm", llm);
g.addEdge("START", "llm");
g.addEdge("llm", "END");
const app = g.compile();
const res = await app.invoke({ messages: [{ role: "user", content: "Hi" }] });