@loopman/langchain-sdk 1.8.0 → 1.12.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.
Files changed (49) hide show
  1. package/README.md +7 -1
  2. package/dist/agents/loopman-agent.d.ts.map +1 -1
  3. package/dist/agents/loopman-agent.js.map +1 -1
  4. package/dist/helpers/template-generator-static.d.ts +27 -0
  5. package/dist/helpers/template-generator-static.d.ts.map +1 -0
  6. package/dist/helpers/template-generator-static.js +52 -0
  7. package/dist/helpers/template-generator-static.js.map +1 -0
  8. package/dist/helpers/template-generator.d.ts +50 -0
  9. package/dist/helpers/template-generator.d.ts.map +1 -0
  10. package/dist/helpers/template-generator.js +85 -0
  11. package/dist/helpers/template-generator.js.map +1 -0
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +4 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/langgraph/loopman-context-node.d.ts +2 -2
  17. package/dist/langgraph/loopman-context-node.d.ts.map +1 -1
  18. package/dist/langgraph/loopman-context-node.js +32 -20
  19. package/dist/langgraph/loopman-context-node.js.map +1 -1
  20. package/dist/langgraph/loopman-validation-node.d.ts +45 -15
  21. package/dist/langgraph/loopman-validation-node.d.ts.map +1 -1
  22. package/dist/langgraph/loopman-validation-node.js +144 -21
  23. package/dist/langgraph/loopman-validation-node.js.map +1 -1
  24. package/dist/mcp/loopman-mcp-client.d.ts.map +1 -1
  25. package/dist/mcp/loopman-mcp-client.js +5 -0
  26. package/dist/mcp/loopman-mcp-client.js.map +1 -1
  27. package/dist/services/loopman.service.d.ts +11 -2
  28. package/dist/services/loopman.service.d.ts.map +1 -1
  29. package/dist/services/loopman.service.js +26 -9
  30. package/dist/services/loopman.service.js.map +1 -1
  31. package/dist/templates.json +20 -0
  32. package/examples/README.md +346 -0
  33. package/examples/templates/README.md +285 -0
  34. package/examples/templates/langchain-full-review/.env.example +3 -0
  35. package/examples/templates/langchain-full-review/README.md +165 -0
  36. package/examples/templates/langchain-full-review/index.ts +54 -0
  37. package/examples/templates/langchain-full-review/package.json +29 -0
  38. package/examples/templates/langchain-full-review/tsconfig.json +22 -0
  39. package/examples/templates/langchain-tool-validation/.env.example +3 -0
  40. package/examples/templates/langchain-tool-validation/README.md +137 -0
  41. package/examples/templates/langchain-tool-validation/index.ts +65 -0
  42. package/examples/templates/langchain-tool-validation/package.json +29 -0
  43. package/examples/templates/langchain-tool-validation/tsconfig.json +22 -0
  44. package/examples/templates/langgraph-hello-world/.env.example +3 -0
  45. package/examples/templates/langgraph-hello-world/README.md +71 -0
  46. package/examples/templates/langgraph-hello-world/index.ts +147 -0
  47. package/examples/templates/langgraph-hello-world/package.json +27 -0
  48. package/examples/templates/langgraph-hello-world/tsconfig.json +22 -0
  49. package/package.json +7 -4
@@ -0,0 +1,147 @@
1
+ import { HumanMessage, ToolMessage } from "@langchain/core/messages";
2
+ import { END, MemorySaver, START, StateGraph } from "@langchain/langgraph";
3
+ import { ChatOpenAI } from "@langchain/openai";
4
+ import { config } from "dotenv";
5
+ import { tool } from "langchain";
6
+ import * as z from "zod";
7
+
8
+ import {
9
+ LoopmanGraphState,
10
+ createLoopmanConditionalEdge,
11
+ createLoopmanContextNode,
12
+ createLoopmanValidationNode,
13
+ enrichSystemPrompt,
14
+ } from "@loopman/langchain-sdk";
15
+
16
+ config();
17
+
18
+ // Define your tools
19
+ const sayHello = tool(
20
+ ({ name }) => {
21
+ console.log(`Hello, ${name}!`);
22
+ return `Hello, ${name}! Welcome to Loopman.`;
23
+ },
24
+ {
25
+ name: "say_hello",
26
+ description: "Say hello to someone",
27
+ schema: z.object({
28
+ name: z.string().describe("The name of the person to greet"),
29
+ }),
30
+ }
31
+ );
32
+
33
+ // Agent node with context enrichment
34
+ async function agentNode(state: any) {
35
+ const { messages, guidelines, decisionContext } = state;
36
+
37
+ // Enrich system prompt with guidelines and decision history
38
+ const systemPrompt = enrichSystemPrompt(
39
+ "You are a helpful assistant that greets people ....",
40
+ { guidelines, decisionContext },
41
+ { maxDecisions: 3 }
42
+ );
43
+
44
+ const model = new ChatOpenAI({ model: "gpt-4o-mini" });
45
+ const modelWithTools = model.bindTools([sayHello]);
46
+
47
+ const messagesWithContext =
48
+ (guidelines && guidelines.length > 0) ||
49
+ (decisionContext && decisionContext.length > 0)
50
+ ? [{ role: "system", content: systemPrompt }, ...messages]
51
+ : messages;
52
+
53
+ const response = await modelWithTools.invoke(messagesWithContext);
54
+
55
+ return {
56
+ messages: [response],
57
+ requiresValidation: response.tool_calls && response.tool_calls.length > 0,
58
+ };
59
+ }
60
+
61
+ // Tool execution node
62
+ async function toolNode(state: any) {
63
+ const { messages } = state;
64
+ const lastMessage = messages[messages.length - 1];
65
+
66
+ if (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0) {
67
+ return {};
68
+ }
69
+
70
+ const toolCall = lastMessage.tool_calls[0];
71
+ const result = await sayHello.invoke(toolCall.args);
72
+
73
+ return {
74
+ messages: [
75
+ new ToolMessage({
76
+ content: result,
77
+ tool_call_id: toolCall.id,
78
+ }),
79
+ ],
80
+ };
81
+ }
82
+
83
+ // Build the graph with context loading
84
+ const workflow = new StateGraph(LoopmanGraphState)
85
+ .addNode(
86
+ "load_context",
87
+ createLoopmanContextNode({
88
+ apiKey: process.env.LOOPMAN_API_KEY!,
89
+ workflowId: process.env.LOOPMAN_WORKFLOW_ID!,
90
+ category: "hello-world",
91
+ debug: true,
92
+ })
93
+ )
94
+ .addNode("agent", agentNode)
95
+ .addNode(
96
+ "loopman_validation",
97
+ createLoopmanValidationNode({
98
+ apiKey: process.env.LOOPMAN_API_KEY!,
99
+ workflowId: process.env.LOOPMAN_WORKFLOW_ID!,
100
+ debug: true,
101
+ })
102
+ )
103
+ .addNode("tools", toolNode)
104
+ .addEdge(START, "load_context")
105
+ .addEdge("load_context", "agent")
106
+ .addEdge("agent", "loopman_validation")
107
+ .addConditionalEdges(
108
+ "loopman_validation",
109
+ createLoopmanConditionalEdge({ debug: true }),
110
+ {
111
+ execute: "tools",
112
+ rejected: END,
113
+ retry: "agent",
114
+ timeout: END,
115
+ error: END,
116
+ }
117
+ )
118
+ .addEdge("tools", END);
119
+
120
+ // Compile and run
121
+ const checkpointer = new MemorySaver();
122
+ const app = workflow.compile({ checkpointer });
123
+
124
+ async function main() {
125
+ const config = { configurable: { thread_id: "hello-world-thread" } };
126
+ const inputs = {
127
+ messages: [new HumanMessage("Say hello to Alice")],
128
+ };
129
+
130
+ console.log("Starting LangGraph workflow with context enrichment...");
131
+
132
+ for await (const output of await app.stream(inputs, config)) {
133
+ const nodeName = Object.keys(output)[0];
134
+ console.log(`Step: ${nodeName}`);
135
+ }
136
+
137
+ const finalState = await app.getState(config);
138
+ console.log("Final status:", finalState.values.loopmanTaskStatus);
139
+ console.log("Guidelines loaded:", finalState.values.guidelines?.length || 0);
140
+ console.log(
141
+ "Decision context loaded:",
142
+ finalState.values.decisionContext?.length || 0
143
+ );
144
+ console.log("Workflow completed!");
145
+ }
146
+
147
+ main().catch(console.error);
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "loopman-langgraph-hello-world",
3
+ "version": "1.0.0",
4
+ "description": "Loopman LangGraph Hello World Example",
5
+ "main": "index.ts",
6
+ "type": "module",
7
+ "scripts": {
8
+ "start": "tsx index.ts",
9
+ "dev": "tsx index.ts",
10
+ "build": "tsc",
11
+ "run": "node dist/index.js"
12
+ },
13
+ "dependencies": {
14
+ "@langchain/core": "^1.0.2",
15
+ "@langchain/langgraph": "^1.0.1",
16
+ "@langchain/openai": "^1.0.0",
17
+ "@loopman/langchain-sdk": "^1.12.1",
18
+ "dotenv": "^17.2.3",
19
+ "langchain": "^1.0.2",
20
+ "tsx": "^4.20.6",
21
+ "typescript": "^5.9.3",
22
+ "zod": "^3.25.76"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^24.9.2"
26
+ }
27
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ES2022",
5
+ "lib": ["ES2022"],
6
+ "moduleResolution": "bundler",
7
+ "resolveJsonModule": true,
8
+ "allowJs": true,
9
+ "outDir": "./dist",
10
+ "rootDir": "./",
11
+ "strict": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "declaration": true,
16
+ "declarationMap": true,
17
+ "sourceMap": true
18
+ },
19
+ "include": ["**/*.ts"],
20
+ "exclude": ["node_modules", "dist"]
21
+ }
22
+
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "@loopman/langchain-sdk",
3
- "version": "1.8.0",
3
+ "version": "1.12.1",
4
4
  "description": "LangChain TypeScript SDK - Human-in-the-Loop validation via Loopman platform",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
- "build": "tsc",
8
+ "build": "npm run export-templates && tsc",
9
9
  "clean": "rm -rf dist",
10
- "release": "./scripts/release.sh"
10
+ "release": "./scripts/release.sh",
11
+ "export-templates": "mkdir -p dist && node scripts/export-templates.js",
12
+ "example:langgraph-full-state": "tsx examples/5-langgraph-integration/full-state-example.ts"
11
13
  },
12
14
  "keywords": [
13
15
  "langchain",
@@ -41,7 +43,8 @@
41
43
  "files": [
42
44
  "dist",
43
45
  "README.md",
44
- "LICENSE"
46
+ "LICENSE",
47
+ "examples/templates"
45
48
  ],
46
49
  "dependencies": {
47
50
  "@langchain/core": "^1.0.2",