@loopman/langchain-sdk 1.17.1 ā 1.17.3
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/README.md +47 -7
- package/dist/langgraph/index.d.ts +1 -1
- package/dist/langgraph/index.d.ts.map +1 -1
- package/dist/langgraph/index.js.map +1 -1
- package/dist/langgraph/loopman-validation-node.d.ts +28 -37
- package/dist/langgraph/loopman-validation-node.d.ts.map +1 -1
- package/dist/langgraph/loopman-validation-node.js +38 -51
- package/dist/langgraph/loopman-validation-node.js.map +1 -1
- package/dist/templates.json +3 -3
- package/examples/templates/langchain-full-review/package.json +1 -1
- package/examples/templates/langchain-tool-validation/package.json +1 -1
- package/examples/templates/langgraph-hello-world/package.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -342,6 +342,33 @@ const workflow = new StateGraph(LoopmanGraphState)
|
|
|
342
342
|
const app = workflow.compile({ checkpointer: new MemorySaver() });
|
|
343
343
|
```
|
|
344
344
|
|
|
345
|
+
#### Task Options
|
|
346
|
+
|
|
347
|
+
Pass task-specific options when invoking the validation node:
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
const validationNode = createLoopmanValidationNode({
|
|
351
|
+
apiKey: process.env.LOOPMAN_API_KEY!,
|
|
352
|
+
workflowId: "my-workflow",
|
|
353
|
+
debug: true,
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
workflow.addNode("loopman_validation", (state, config) =>
|
|
357
|
+
validationNode(state, {
|
|
358
|
+
taskTitle: `Approve ${state.currentAction}`,
|
|
359
|
+
taskMessage: `Review action for user ${state.userId}`,
|
|
360
|
+
businessContext: (s) => `Risk: ${s.riskLevel}, Cost: $${s.estimatedCost}`,
|
|
361
|
+
proposedDecision: (s) => `Execute ${s.currentAction} on ${s.targetResource}`,
|
|
362
|
+
})
|
|
363
|
+
);
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Options:**
|
|
367
|
+
- `taskTitle`, `taskMessage` - Custom task information
|
|
368
|
+
- `businessContext`, `proposedDecision`, `decisionReasoning` - Context (string or function)
|
|
369
|
+
- `formatState` - Custom formatter
|
|
370
|
+
- `includeFullState` - Include state (default: `true`)
|
|
371
|
+
|
|
345
372
|
**š Feedback Loop in Action:**
|
|
346
373
|
|
|
347
374
|
When a human rejects a decision with status `NEEDS_CHANGES`:
|
|
@@ -531,15 +558,28 @@ Creates a LangGraph node that loads guidelines and decision history.
|
|
|
531
558
|
|
|
532
559
|
Creates a LangGraph node that handles human validation.
|
|
533
560
|
|
|
534
|
-
**
|
|
561
|
+
**Configuration:**
|
|
535
562
|
|
|
536
|
-
- `
|
|
537
|
-
- `
|
|
538
|
-
- `
|
|
539
|
-
- `
|
|
540
|
-
- `
|
|
563
|
+
- `apiKey` (string, required): Loopman API key
|
|
564
|
+
- `workflowId` (string, required): Workflow identifier
|
|
565
|
+
- `executionId` (string, optional): Execution ID (auto-generated)
|
|
566
|
+
- `category` (string, optional): Category filter for guidelines
|
|
567
|
+
- `timeout` (number, optional): Timeout in ms (default: 5 min)
|
|
568
|
+
- `pollingInterval` (number, optional): Polling interval (default: 5 sec)
|
|
569
|
+
- `debug` (boolean, optional): Enable debug logging
|
|
541
570
|
|
|
542
|
-
**
|
|
571
|
+
**Task Options (passed at invocation):**
|
|
572
|
+
|
|
573
|
+
- `taskTitle` (string): Task title
|
|
574
|
+
- `taskMessage` (string): Task description
|
|
575
|
+
- `businessContext` (string | function): Business context
|
|
576
|
+
- `proposedDecision` (string | function): Proposed decision
|
|
577
|
+
- `decisionReasoning` (string | function): Decision reasoning
|
|
578
|
+
- `includeFullState` (boolean): Include state (default: true)
|
|
579
|
+
- `formatState` (function): Custom state formatter
|
|
580
|
+
- `extractToolCall` (function): Custom tool call extractor
|
|
581
|
+
|
|
582
|
+
**Returns:** Node function `(state, options?) => Promise<StateUpdate>`
|
|
543
583
|
|
|
544
584
|
#### `createLoopmanConditionalEdge(config)`
|
|
545
585
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
export { LoopmanGraphState } from "./types";
|
|
8
8
|
export type { LoopmanGuideline, LoopmanDecision } from "./types";
|
|
9
9
|
export { createLoopmanValidationNode } from "./loopman-validation-node";
|
|
10
|
-
export type { LoopmanValidationNodeConfig } from "./loopman-validation-node";
|
|
10
|
+
export type { LoopmanValidationNodeConfig, LoopmanValidationTaskOptions, } from "./loopman-validation-node";
|
|
11
11
|
export { createLoopmanConditionalEdge } from "./loopman-conditional-edge";
|
|
12
12
|
export { createLoopmanContextNode } from "./loopman-context-node";
|
|
13
13
|
export type { LoopmanContextNodeConfig } from "./loopman-context-node";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/langgraph/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/langgraph/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EACV,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAG1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/langgraph/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG5C,yBAAyB;AACzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/langgraph/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG5C,yBAAyB;AACzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAMxE,0BAA0B;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAE1E,sBAAsB;AACtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,WAAW,CAAC"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { TaskInformation } from "../types";
|
|
11
11
|
/**
|
|
12
|
-
* Configuration for Loopman validation node
|
|
12
|
+
* Configuration for Loopman validation node (service-level config)
|
|
13
13
|
*/
|
|
14
14
|
export interface LoopmanValidationNodeConfig {
|
|
15
15
|
/** Loopman API key for authentication */
|
|
@@ -26,6 +26,11 @@ export interface LoopmanValidationNodeConfig {
|
|
|
26
26
|
pollingInterval?: number;
|
|
27
27
|
/** Enable debug logging */
|
|
28
28
|
debug?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Task-specific options that can be passed when invoking the validation node
|
|
32
|
+
*/
|
|
33
|
+
export interface LoopmanValidationTaskOptions {
|
|
29
34
|
/** Custom title for the task (default: "Tool validation") */
|
|
30
35
|
taskTitle?: string;
|
|
31
36
|
/** Custom message/description to display when creating task */
|
|
@@ -42,9 +47,9 @@ export interface LoopmanValidationNodeConfig {
|
|
|
42
47
|
proposedDecision?: string | ((state: any) => string);
|
|
43
48
|
/** Decision reasoning to include in the task (or function to extract from state) */
|
|
44
49
|
decisionReasoning?: string | ((state: any) => string);
|
|
45
|
-
/** Whether to include full state in task information (default:
|
|
50
|
+
/** Whether to include full state in task information (default: true) */
|
|
46
51
|
includeFullState?: boolean;
|
|
47
|
-
/** Custom function to format state for task information (if not provided, uses
|
|
52
|
+
/** Custom function to format state for task information (if not provided, uses default converter) */
|
|
48
53
|
formatState?: (state: any) => TaskInformation[];
|
|
49
54
|
}
|
|
50
55
|
/**
|
|
@@ -68,56 +73,42 @@ export interface LoopmanValidationNodeConfig {
|
|
|
68
73
|
* and adds `guidelines` and `decisionContext` to the state, making them
|
|
69
74
|
* available for the agent on retry (NEEDS_CHANGES) or subsequent executions.
|
|
70
75
|
*
|
|
71
|
-
* **State Inclusion**:
|
|
72
|
-
*
|
|
73
|
-
*
|
|
76
|
+
* **State Inclusion**: By default, the full agent state is included in the task information
|
|
77
|
+
* to help human reviewers understand the complete context of the decision.
|
|
78
|
+
* You can disable this by setting `includeFullState: false`, or provide a custom
|
|
79
|
+
* `formatState` function to control how state is formatted.
|
|
74
80
|
*
|
|
75
81
|
* **Decision Context**: You can provide business context, proposed decisions, and
|
|
76
82
|
* reasoning either as static strings or as functions that extract from the state.
|
|
77
83
|
*
|
|
78
|
-
* @example Basic usage
|
|
84
|
+
* @example Basic usage
|
|
79
85
|
* ```typescript
|
|
80
86
|
* import { createLoopmanValidationNode, LoopmanGraphState } from "loopman-langchain-sdk";
|
|
81
87
|
*
|
|
82
88
|
* const loopmanNode = createLoopmanValidationNode({
|
|
83
89
|
* apiKey: process.env.LOOPMAN_API_KEY!,
|
|
84
90
|
* workflowId: "my-workflow",
|
|
85
|
-
* executionId: `exec-${Date.now()}`,
|
|
86
|
-
* timeout: 5 * 60 * 1000,
|
|
87
|
-
* pollingInterval: 5000,
|
|
88
91
|
* debug: true,
|
|
89
|
-
* taskTitle: "Email Validation", // Custom title
|
|
90
|
-
* taskMessage: "Please review this action" // Custom description
|
|
91
92
|
* });
|
|
92
93
|
*
|
|
93
|
-
* workflow.addNode("loopman_validation",
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* apiKey: process.env.LOOPMAN_API_KEY!,
|
|
100
|
-
* workflowId: "my-workflow",
|
|
101
|
-
* includeFullState: true, // Include all state in task information
|
|
102
|
-
* businessContext: (state) => `Processing user request: ${state.userQuery}`,
|
|
103
|
-
* proposedDecision: (state) => `Execute ${state.currentAction} on ${state.targetResource}`,
|
|
104
|
-
* decisionReasoning: (state) => state.reasoning || "No specific reasoning provided",
|
|
105
|
-
* });
|
|
94
|
+
* workflow.addNode("loopman_validation", (state, config) =>
|
|
95
|
+
* loopmanNode(state, {
|
|
96
|
+
* taskTitle: "Email Validation",
|
|
97
|
+
* taskMessage: "Please review this action",
|
|
98
|
+
* })
|
|
99
|
+
* );
|
|
106
100
|
* ```
|
|
107
101
|
*
|
|
108
|
-
* @example With
|
|
102
|
+
* @example With dynamic context
|
|
109
103
|
* ```typescript
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* { type: "bulletPoints", label: "Parameters", value: Object.keys(state.params) },
|
|
118
|
-
* ],
|
|
119
|
-
* });
|
|
104
|
+
* workflow.addNode("loopman_validation", (state, config) =>
|
|
105
|
+
* loopmanNode(state, {
|
|
106
|
+
* businessContext: (s) => `Processing user request: ${s.userQuery}`,
|
|
107
|
+
* proposedDecision: (s) => `Execute ${s.currentAction} on ${s.targetResource}`,
|
|
108
|
+
* includeFullState: state.riskLevel === "HIGH",
|
|
109
|
+
* })
|
|
110
|
+
* );
|
|
120
111
|
* ```
|
|
121
112
|
*/
|
|
122
|
-
export declare function createLoopmanValidationNode(config: LoopmanValidationNodeConfig): (state: any) => Promise<any>;
|
|
113
|
+
export declare function createLoopmanValidationNode(config: LoopmanValidationNodeConfig): (state: any, options?: LoopmanValidationTaskOptions) => Promise<any>;
|
|
123
114
|
//# sourceMappingURL=loopman-validation-node.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopman-validation-node.d.ts","sourceRoot":"","sources":["../../src/langgraph/loopman-validation-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"loopman-validation-node.d.ts","sourceRoot":"","sources":["../../src/langgraph/loopman-validation-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK;QACrC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,GAAG,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;KACZ,GAAG,IAAI,CAAC;IACT,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACpD,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACrD,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IACtD,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qGAAqG;IACrG,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,eAAe,EAAE,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,2BAA2B,IAerB,OAAO,GAAG,EAAE,UAAS,4BAAiC,kBAsMrE"}
|
|
@@ -31,55 +31,41 @@ import { createLoopmanContextNode } from "./loopman-context-node.js";
|
|
|
31
31
|
* and adds `guidelines` and `decisionContext` to the state, making them
|
|
32
32
|
* available for the agent on retry (NEEDS_CHANGES) or subsequent executions.
|
|
33
33
|
*
|
|
34
|
-
* **State Inclusion**:
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* **State Inclusion**: By default, the full agent state is included in the task information
|
|
35
|
+
* to help human reviewers understand the complete context of the decision.
|
|
36
|
+
* You can disable this by setting `includeFullState: false`, or provide a custom
|
|
37
|
+
* `formatState` function to control how state is formatted.
|
|
37
38
|
*
|
|
38
39
|
* **Decision Context**: You can provide business context, proposed decisions, and
|
|
39
40
|
* reasoning either as static strings or as functions that extract from the state.
|
|
40
41
|
*
|
|
41
|
-
* @example Basic usage
|
|
42
|
+
* @example Basic usage
|
|
42
43
|
* ```typescript
|
|
43
44
|
* import { createLoopmanValidationNode, LoopmanGraphState } from "loopman-langchain-sdk";
|
|
44
45
|
*
|
|
45
46
|
* const loopmanNode = createLoopmanValidationNode({
|
|
46
47
|
* apiKey: process.env.LOOPMAN_API_KEY!,
|
|
47
48
|
* workflowId: "my-workflow",
|
|
48
|
-
* executionId: `exec-${Date.now()}`,
|
|
49
|
-
* timeout: 5 * 60 * 1000,
|
|
50
|
-
* pollingInterval: 5000,
|
|
51
49
|
* debug: true,
|
|
52
|
-
* taskTitle: "Email Validation", // Custom title
|
|
53
|
-
* taskMessage: "Please review this action" // Custom description
|
|
54
50
|
* });
|
|
55
51
|
*
|
|
56
|
-
* workflow.addNode("loopman_validation",
|
|
52
|
+
* workflow.addNode("loopman_validation", (state, config) =>
|
|
53
|
+
* loopmanNode(state, {
|
|
54
|
+
* taskTitle: "Email Validation",
|
|
55
|
+
* taskMessage: "Please review this action",
|
|
56
|
+
* })
|
|
57
|
+
* );
|
|
57
58
|
* ```
|
|
58
59
|
*
|
|
59
|
-
* @example With
|
|
60
|
+
* @example With dynamic context
|
|
60
61
|
* ```typescript
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* });
|
|
69
|
-
* ```
|
|
70
|
-
*
|
|
71
|
-
* @example With custom state formatter
|
|
72
|
-
* ```typescript
|
|
73
|
-
* const loopmanNode = createLoopmanValidationNode({
|
|
74
|
-
* apiKey: process.env.LOOPMAN_API_KEY!,
|
|
75
|
-
* workflowId: "my-workflow",
|
|
76
|
-
* includeFullState: true,
|
|
77
|
-
* formatState: (state) => [
|
|
78
|
-
* { type: "text", label: "User", value: state.userId },
|
|
79
|
-
* { type: "text", label: "Action", value: state.action },
|
|
80
|
-
* { type: "bulletPoints", label: "Parameters", value: Object.keys(state.params) },
|
|
81
|
-
* ],
|
|
82
|
-
* });
|
|
62
|
+
* workflow.addNode("loopman_validation", (state, config) =>
|
|
63
|
+
* loopmanNode(state, {
|
|
64
|
+
* businessContext: (s) => `Processing user request: ${s.userQuery}`,
|
|
65
|
+
* proposedDecision: (s) => `Execute ${s.currentAction} on ${s.targetResource}`,
|
|
66
|
+
* includeFullState: state.riskLevel === "HIGH",
|
|
67
|
+
* })
|
|
68
|
+
* );
|
|
83
69
|
* ```
|
|
84
70
|
*/
|
|
85
71
|
export function createLoopmanValidationNode(config) {
|
|
@@ -94,14 +80,14 @@ export function createLoopmanValidationNode(config) {
|
|
|
94
80
|
pollingInterval: config.pollingInterval,
|
|
95
81
|
debug: config.debug,
|
|
96
82
|
});
|
|
97
|
-
return async (state) => {
|
|
83
|
+
return async (state, options = {}) => {
|
|
98
84
|
const { messages, loopmanTaskId } = state;
|
|
99
85
|
const { debug } = config;
|
|
100
86
|
const logger = loopmanService.logger;
|
|
101
87
|
// Extract tool call from last message (optional - can be used without tool calls)
|
|
102
88
|
const lastMessage = messages[messages.length - 1];
|
|
103
|
-
const toolCall =
|
|
104
|
-
?
|
|
89
|
+
const toolCall = options.extractToolCall
|
|
90
|
+
? options.extractToolCall(messages)
|
|
105
91
|
: extractDefaultToolCall(lastMessage);
|
|
106
92
|
// Step 1: Check if we're retrying an existing task (NEEDS_CHANGES scenario)
|
|
107
93
|
const isRetry = !!loopmanTaskId;
|
|
@@ -124,27 +110,28 @@ export function createLoopmanValidationNode(config) {
|
|
|
124
110
|
logger.debug("[LoopmanNode] No tool call found, creating generic validation task");
|
|
125
111
|
}
|
|
126
112
|
// Step 2: Create or update task in Loopman
|
|
127
|
-
const taskTitle =
|
|
113
|
+
const taskTitle = options.taskTitle ||
|
|
128
114
|
(toolCall ? `Validation: ${toolCall.name}` : "Human validation required");
|
|
129
|
-
const taskMessage =
|
|
115
|
+
const taskMessage = options.taskMessage ||
|
|
130
116
|
(toolCall
|
|
131
117
|
? `Validation required for tool: ${toolCall.name}`
|
|
132
118
|
: "Human validation required for this decision");
|
|
133
119
|
// Extract businessContext, proposedDecision, and decisionReasoning
|
|
134
|
-
const businessContext = typeof
|
|
135
|
-
?
|
|
136
|
-
:
|
|
137
|
-
const proposedDecision = typeof
|
|
138
|
-
?
|
|
139
|
-
:
|
|
140
|
-
const decisionReasoning = typeof
|
|
141
|
-
?
|
|
142
|
-
:
|
|
143
|
-
// Prepare additional information from state
|
|
120
|
+
const businessContext = typeof options.businessContext === "function"
|
|
121
|
+
? options.businessContext(state)
|
|
122
|
+
: options.businessContext;
|
|
123
|
+
const proposedDecision = typeof options.proposedDecision === "function"
|
|
124
|
+
? options.proposedDecision(state)
|
|
125
|
+
: options.proposedDecision;
|
|
126
|
+
const decisionReasoning = typeof options.decisionReasoning === "function"
|
|
127
|
+
? options.decisionReasoning(state)
|
|
128
|
+
: options.decisionReasoning;
|
|
129
|
+
// Prepare additional information from state (enabled by default)
|
|
144
130
|
let additionalInformation;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
131
|
+
const shouldIncludeState = options.includeFullState !== false; // Default to true
|
|
132
|
+
if (shouldIncludeState) {
|
|
133
|
+
if (options.formatState) {
|
|
134
|
+
additionalInformation = options.formatState(state);
|
|
148
135
|
}
|
|
149
136
|
else {
|
|
150
137
|
additionalInformation = convertStateToInformation(state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopman-validation-node.js","sourceRoot":"","sources":["../../src/langgraph/loopman-validation-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"loopman-validation-node.js","sourceRoot":"","sources":["../../src/langgraph/loopman-validation-node.ts"],"names":[],"mappings":"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"}
|
package/dist/templates.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"langgraph-hello-world": {
|
|
3
3
|
"index.ts": "import { HumanMessage, ToolMessage } from \"@langchain/core/messages\";\nimport { END, MemorySaver, START, StateGraph } from \"@langchain/langgraph\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport { config } from \"dotenv\";\nimport { tool } from \"langchain\";\nimport * as z from \"zod\";\n\nimport {\n LoopmanGraphState,\n createLoopmanConditionalEdge,\n createLoopmanContextNode,\n createLoopmanValidationNode,\n enrichSystemPrompt,\n} from \"@loopman/langchain-sdk\";\n\nconfig();\n\n// Define your tools\nconst sayHello = tool(\n ({ name }) => {\n console.log(`Hello, ${name}!`);\n return `Hello, ${name}! Welcome to Loopman.`;\n },\n {\n name: \"say_hello\",\n description: \"Say hello to someone\",\n schema: z.object({\n name: z.string().describe(\"The name of the person to greet\"),\n }),\n }\n);\n\n// Agent node with context enrichment\nasync function agentNode(state: typeof LoopmanGraphState.State) {\n const { messages, guidelines, decisionContext } = state;\n\n // Enrich system prompt with guidelines and decision history\n const systemPrompt = enrichSystemPrompt(\n \"You are a helpful assistant that greets people ....\",\n { guidelines, decisionContext },\n { maxDecisions: 3 }\n );\n\n const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n const modelWithTools = model.bindTools([sayHello]);\n\n const messagesWithContext =\n (guidelines && guidelines.length > 0) ||\n (decisionContext && decisionContext.length > 0)\n ? [{ role: \"system\", content: systemPrompt }, ...messages]\n : messages;\n\n const response = await modelWithTools.invoke(messagesWithContext);\n\n return {\n messages: [response],\n };\n}\n\n// Tool execution node\nasync function toolNode(state: typeof LoopmanGraphState.State) {\n const { messages } = state;\n const lastMessage = messages[messages.length - 1];\n\n if (!lastMessage.tool_calls || lastMessage.tool_calls.length === 0) {\n return {};\n }\n\n const toolCall = lastMessage.tool_calls[0];\n const result = await sayHello.invoke(toolCall.args);\n\n return {\n messages: [\n new ToolMessage({\n content: String(result),\n tool_call_id: toolCall.id,\n }),\n ],\n };\n}\n\n// Build the graph with context loading\nconst workflow = new StateGraph(LoopmanGraphState)\n .addNode(\n \"load_context\",\n createLoopmanContextNode({\n apiKey: process.env.LOOPMAN_API_KEY!,\n workflowId: \"hello-world-workflow\",\n category: \"hello-world\",\n debug: true,\n })\n )\n .addNode(\"agent\", agentNode)\n .addNode(\n \"loopman_validation\",\n createLoopmanValidationNode({\n apiKey: process.env.LOOPMAN_API_KEY!,\n workflowId: \"hello-world-workflow\",\n debug: true,\n })\n )\n .addNode(\"tools\", toolNode)\n .addEdge(START, \"load_context\")\n .addEdge(\"load_context\", \"agent\")\n .addEdge(\"agent\", \"loopman_validation\")\n .addConditionalEdges(\n \"loopman_validation\",\n createLoopmanConditionalEdge({ debug: true }),\n {\n execute: \"tools\",\n rejected: END,\n retry: \"agent\",\n timeout: END,\n error: END,\n }\n )\n .addEdge(\"tools\", END);\n\n// Compile and run\nconst checkpointer = new MemorySaver();\nconst app = workflow.compile({ checkpointer });\n\nasync function main() {\n const config = { configurable: { thread_id: \"hello-world-thread\" } };\n const inputs = {\n messages: [new HumanMessage(\"Say hello to Alice\")],\n };\n\n console.log(\"Starting LangGraph workflow with context enrichment...\");\n\n for await (const output of await app.stream(inputs, config)) {\n const nodeName = Object.keys(output)[0];\n console.log(`Step: ${nodeName}`);\n }\n\n const finalState = await app.getState(config);\n console.log(\"Final status:\", finalState.values.loopmanTaskStatus);\n console.log(\"Guidelines loaded:\", finalState.values.guidelines?.length || 0);\n console.log(\n \"Decision context loaded:\",\n finalState.values.decisionContext?.length || 0\n );\n console.log(\"Workflow completed!\");\n}\n\nmain().catch(console.error);\n",
|
|
4
|
-
"package.json": "{\n \"name\": \"loopman-langgraph-hello-world\",\n \"version\": \"1.0.0\",\n \"description\": \"Loopman LangGraph Hello World Example\",\n \"main\": \"index.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"tsx index.ts\",\n \"dev\": \"tsx index.ts\",\n \"build\": \"tsc\",\n \"run\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"^1.0.2\",\n \"@langchain/langgraph\": \"^1.0.7\",\n \"@langchain/openai\": \"^1.0.0\",\n \"@loopman/langchain-sdk\": \"^1.17.
|
|
4
|
+
"package.json": "{\n \"name\": \"loopman-langgraph-hello-world\",\n \"version\": \"1.0.0\",\n \"description\": \"Loopman LangGraph Hello World Example\",\n \"main\": \"index.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"tsx index.ts\",\n \"dev\": \"tsx index.ts\",\n \"build\": \"tsc\",\n \"run\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"^1.0.2\",\n \"@langchain/langgraph\": \"^1.0.7\",\n \"@langchain/openai\": \"^1.0.0\",\n \"@loopman/langchain-sdk\": \"^1.17.3\",\n \"dotenv\": \"^17.2.3\",\n \"langchain\": \"^1.0.2\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.9.2\"\n }\n}\n",
|
|
5
5
|
"tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"lib\": [\"ES2022\"],\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true,\n \"types\": [\"node\"]\n },\n \"include\": [\"**/*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n",
|
|
6
6
|
"README.md": "# Loopman LangGraph Hello World\n\nThis project demonstrates how to integrate Loopman with LangGraph using Context Enrichment / Feedback Loop mode.\n\n## About LangGraph\n\nLangGraph is LangChain's official framework for building stateful, multi-actor applications with LLMs. It provides:\n\n- **Stateful workflows**: Explicit state management across nodes\n- **Conditional routing**: Dynamic edges based on state\n- **Streaming support**: Real-time updates during execution\n- **Visual debugging**: Graph visualization and inspection\n\n## Setup\n\n1. Install dependencies:\n```bash\nnpm install\n```\n\n2. Copy .env.example to .env and configure your keys:\n```bash\ncp .env.example .env\n```\n\nEdit the .env file and replace the placeholders with your actual values:\n- `OPENAI_API_KEY`: Your OpenAI API key\n- `LOOPMAN_API_KEY`: Your Loopman API key\n- `LOOPMAN_WORKFLOW_ID`: Your workflow ID from Loopman\n\n3. Run the example:\n```bash\nnpm start\n```\n\n## Graph Architecture\n\nThe workflow follows this pattern:\n\n```\nSTART\n ā\nload_context (load guidelines and decision history)\n ā\nagent (LLM decides action)\n ā\nloopman_validation (create task + poll)\n ā\n[conditional edge based on status]\n ā\nāāā tools (APPROVED: execute)\nāāā agent (NEEDS_CHANGES: retry)\nāāā END (REJECTED/TIMEOUT/ERROR: end)\n ā\nEND\n```\n\n## Key Features\n\n- **Context Enrichment**: Loads validation guidelines and historical decisions\n- **Prompt Enhancement**: Automatically enriches system prompts with context\n- **Learning from History**: Agent learns from past human decisions\n- **Category Filtering**: Guidelines filtered by category for relevance\n- **Feedback Loop**: Human feedback is stored and used to improve future decisions\n\n## Learn More\n\n- [LangGraph Documentation](https://js.langchain.com/docs/langgraph/)\n- [Loopman LangGraph Integration Guide](https://github.com/loopman/loopman-langchain-sdk/blob/main/docs/LANGGRAPH_INTEGRATION.md)\n- [Loopman Documentation](https://loopman.dev/docs)\n\n"
|
|
7
7
|
},
|
|
8
8
|
"langchain-tool-validation": {
|
|
9
9
|
"index.ts": "import { MemorySaver } from \"@langchain/langgraph\";\nimport { config } from \"dotenv\";\nimport { createAgent, tool } from \"langchain\";\nimport * as z from \"zod\";\nimport { loopmanMiddleware } from \"@loopman/langchain-sdk\";\n\n// Load environment variables\nconfig();\n\n// Simple hello world tool\nconst sayHello = tool(\n ({ name }) => {\n console.log(`Hello, ${name}!`);\n return `Hello, ${name}! Welcome to Loopman.`;\n },\n {\n name: \"say_hello\",\n description: \"Say hello to someone\",\n schema: z.object({\n name: z.string().describe(\"The name of the person to greet\"),\n }),\n }\n);\n\n// Create agent with Loopman middleware\nconst checkpointer = new MemorySaver();\n\nconst agent = createAgent({\n model: \"openai:gpt-4o-mini\",\n systemPrompt: \"You are a helpful assistant that greets people.\",\n tools: [sayHello],\n middleware: [\n loopmanMiddleware({\n apiKey: process.env.LOOPMAN_API_KEY!,\n workflowId: process.env.LOOPMAN_WORKFLOW_ID!,\n interruptOn: {\n say_hello: true, // Requires human validation\n },\n debug: true,\n }),\n ],\n checkpointer,\n});\n\n// Run the agent\nasync function main() {\n const config = { configurable: { thread_id: \"hello-world-thread\" } };\n\n const result = await agent.invoke(\n {\n messages: [\n {\n role: \"user\",\n content: \"Say hello to Alice\",\n },\n ],\n },\n config\n );\n\n console.log(\"Agent response:\", result.messages[result.messages.length - 1].content);\n}\n\nmain().catch(console.error);\n\n",
|
|
10
|
-
"package.json": "{\n \"name\": \"loopman-langchain-tool-validation\",\n \"version\": \"1.0.0\",\n \"description\": \"Loopman LangChain Tool Validation Example\",\n \"main\": \"index.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"tsx index.ts\",\n \"dev\": \"tsx index.ts\",\n \"build\": \"tsc\",\n \"run\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"^1.0.2\",\n \"@langchain/mcp-adapters\": \"^1.0.0\",\n \"@langchain/langgraph\": \"^1.0.7\",\n \"@langchain/openai\": \"^1.0.0\",\n \"@loopman/langchain-sdk\": \"^1.17.
|
|
10
|
+
"package.json": "{\n \"name\": \"loopman-langchain-tool-validation\",\n \"version\": \"1.0.0\",\n \"description\": \"Loopman LangChain Tool Validation Example\",\n \"main\": \"index.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"tsx index.ts\",\n \"dev\": \"tsx index.ts\",\n \"build\": \"tsc\",\n \"run\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"^1.0.2\",\n \"@langchain/mcp-adapters\": \"^1.0.0\",\n \"@langchain/langgraph\": \"^1.0.7\",\n \"@langchain/openai\": \"^1.0.0\",\n \"@loopman/langchain-sdk\": \"^1.17.3\",\n \"dotenv\": \"^17.2.3\",\n \"langchain\": \"^1.0.2\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.9.2\"\n }\n}\n",
|
|
11
11
|
"tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"lib\": [\"ES2022\"],\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true\n },\n \"include\": [\"**/*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n\n",
|
|
12
12
|
"README.md": "# Loopman LangChain - Tool Validation Mode\n\nThis project demonstrates how to integrate Loopman with LangChain using **Tool Validation** mode.\n\n## About Tool Validation Mode\n\nIn this mode, Loopman middleware intercepts specific tool calls and requires human validation before execution. This is useful when:\n- Certain actions need human approval (e.g., sending emails, making payments)\n- You want to validate AI decisions before they affect real systems\n- Compliance requires human oversight for specific operations\n\n## Setup\n\n1. Install dependencies:\n```bash\nnpm install\n```\n\n2. Copy .env.example to .env and configure your keys:\n```bash\ncp .env.example .env\n```\n\nEdit the .env file and replace the placeholders with your actual values:\n- `OPENAI_API_KEY`: Your OpenAI API key\n- `LOOPMAN_API_KEY`: Your Loopman API key\n- `LOOPMAN_WORKFLOW_ID`: Your workflow ID from Loopman\n\n3. Run the example:\n```bash\nnpm start\n```\n\n## How It Works\n\n### 1. Define Tools\n\n```typescript\nconst sayHello = tool(\n ({ name }) => {\n console.log(`Hello, ${name}!`);\n return `Hello, ${name}! Welcome to Loopman.`;\n },\n {\n name: \"say_hello\",\n description: \"Say hello to someone\",\n schema: z.object({\n name: z.string().describe(\"The name of the person to greet\"),\n }),\n }\n);\n```\n\n### 2. Add Loopman Middleware\n\n```typescript\nconst agent = createAgent({\n model: \"openai:gpt-4o-mini\",\n tools: [sayHello],\n middleware: [\n loopmanMiddleware({\n apiKey: process.env.LOOPMAN_API_KEY!,\n workflowId: process.env.LOOPMAN_WORKFLOW_ID!,\n interruptOn: {\n say_hello: true, // Requires human validation\n },\n debug: true,\n }),\n ],\n checkpointer,\n});\n```\n\n### 3. Run the Agent\n\n```typescript\nconst result = await agent.invoke(\n {\n messages: [{ role: \"user\", content: \"Say hello to Alice\" }],\n },\n config\n);\n```\n\n## Key Features\n\n- **Selective Validation**: Only specified tools require approval\n- **Automatic Interception**: Middleware handles validation workflow\n- **Stateful**: Uses checkpointer to maintain conversation state\n- **Debug Mode**: Verbose logging for development\n\n## Workflow\n\n```\n1. User sends message\n ā\n2. Agent generates tool call (say_hello)\n ā\n3. Loopman middleware intercepts\n ā\n4. Creates validation task\n ā\n5. Waits for human decision\n ā\n6. If approved ā Execute tool\n If rejected ā Return to agent with feedback\n```\n\n## Configuration Options\n\n### interruptOn\n\nSpecify which tools require validation:\n\n```typescript\ninterruptOn: {\n say_hello: true, // Always validate\n send_email: true, // Always validate\n get_weather: false, // Never validate (auto-execute)\n}\n```\n\n### debug\n\nEnable/disable verbose logging:\n\n```typescript\ndebug: true // Show detailed logs\ndebug: false // Production mode\n```\n\n## Learn More\n\n- [Loopman Middleware Documentation](https://github.com/loopman/loopman-langchain-sdk/blob/main/docs/TOOL_VALIDATION_MODE.md)\n- [LangChain Agent Documentation](https://js.langchain.com/docs/how_to/agent_executor)\n- [Loopman Documentation](https://loopman.dev/docs)\n\n"
|
|
13
13
|
},
|
|
14
14
|
"langchain-full-review": {
|
|
15
15
|
"index.ts": "import { config } from \"dotenv\";\nimport { tool } from \"langchain\";\nimport * as z from \"zod\";\nimport { createLoopmanAgent } from \"@loopman/langchain-sdk\";\n\n// Load environment variables\nconfig();\n\n// Simple hello world tool\nconst sayHello = tool(\n ({ name }) => {\n console.log(`Hello, ${name}!`);\n return `Hello, ${name}! Welcome to Loopman.`;\n },\n {\n name: \"say_hello\",\n description: \"Say hello to someone\",\n schema: z.object({\n name: z.string().describe(\"The name of the person to greet\"),\n }),\n }\n);\n\n// Create Loopman agent with full human review process\nconst agent = createLoopmanAgent({\n apiKey: process.env.LOOPMAN_API_KEY!,\n workflowId: process.env.LOOPMAN_WORKFLOW_ID!,\n model: \"openai:gpt-4o-mini\",\n systemPrompt: \"You are a helpful assistant that greets people.\",\n category: \"hello-world\",\n additionalTools: [sayHello],\n requireApprovalForTools: [\"say_hello\"], // Requires validation\n debug: true,\n});\n\n// Run the agent\nasync function main() {\n const result = await agent.processWithHumanValidation({\n input: \"Say hello to Alice\",\n });\n\n console.log(\"Agent response:\", result.response);\n if (result.decision) {\n console.log(\"Decision status:\", result.decision.status);\n if (result.decision.feedback) {\n console.log(\"Human feedback:\", result.decision.feedback);\n }\n }\n\n await agent.disconnect();\n}\n\nmain().catch(console.error);\n\n",
|
|
16
|
-
"package.json": "{\n \"name\": \"loopman-langchain-full-review\",\n \"version\": \"1.0.0\",\n \"description\": \"Loopman LangChain Full Human Review Example\",\n \"main\": \"index.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"tsx index.ts\",\n \"dev\": \"tsx index.ts\",\n \"build\": \"tsc\",\n \"run\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"^1.0.2\",\n \"@langchain/mcp-adapters\": \"^1.0.0\",\n \"@langchain/langgraph\": \"^1.0.7\",\n \"@langchain/openai\": \"^1.0.0\",\n \"@loopman/langchain-sdk\": \"^1.17.
|
|
16
|
+
"package.json": "{\n \"name\": \"loopman-langchain-full-review\",\n \"version\": \"1.0.0\",\n \"description\": \"Loopman LangChain Full Human Review Example\",\n \"main\": \"index.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"start\": \"tsx index.ts\",\n \"dev\": \"tsx index.ts\",\n \"build\": \"tsc\",\n \"run\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"^1.0.2\",\n \"@langchain/mcp-adapters\": \"^1.0.0\",\n \"@langchain/langgraph\": \"^1.0.7\",\n \"@langchain/openai\": \"^1.0.0\",\n \"@loopman/langchain-sdk\": \"^1.17.3\",\n \"dotenv\": \"^17.2.3\",\n \"langchain\": \"^1.0.2\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^24.9.2\"\n }\n}\n",
|
|
17
17
|
"tsconfig.json": "{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"lib\": [\"ES2022\"],\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"allowJs\": true,\n \"outDir\": \"./dist\",\n \"rootDir\": \"./\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"declaration\": true,\n \"declarationMap\": true,\n \"sourceMap\": true\n },\n \"include\": [\"**/*.ts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n\n",
|
|
18
18
|
"README.md": "# Loopman LangChain - Full Human Review Mode\n\nThis project demonstrates how to integrate Loopman with LangChain using **Full Human Review Process** mode.\n\n## About Full Human Review Mode\n\nIn this mode, the Loopman Agent handles the entire workflow including:\n- Creating validation tasks\n- Waiting for human approval\n- Handling feedback and retries\n- Managing the complete lifecycle\n\nThis is useful when:\n- You want a complete HITL (Human-In-The-Loop) solution\n- The agent should wait for human decisions before proceeding\n- You need full control over the validation workflow\n\n## Setup\n\n1. Install dependencies:\n```bash\nnpm install\n```\n\n2. Copy .env.example to .env and configure your keys:\n```bash\ncp .env.example .env\n```\n\nEdit the .env file and replace the placeholders with your actual values:\n- `OPENAI_API_KEY`: Your OpenAI API key\n- `LOOPMAN_API_KEY`: Your Loopman API key\n- `LOOPMAN_WORKFLOW_ID`: Your workflow ID from Loopman\n\n3. Run the example:\n```bash\nnpm start\n```\n\n## How It Works\n\n### 1. Define Tools\n\n```typescript\nconst sayHello = tool(\n ({ name }) => {\n console.log(`Hello, ${name}!`);\n return `Hello, ${name}! Welcome to Loopman.`;\n },\n {\n name: \"say_hello\",\n description: \"Say hello to someone\",\n schema: z.object({\n name: z.string().describe(\"The name of the person to greet\"),\n }),\n }\n);\n```\n\n### 2. Create Loopman Agent\n\n```typescript\nconst agent = createLoopmanAgent({\n apiKey: process.env.LOOPMAN_API_KEY!,\n workflowId: process.env.LOOPMAN_WORKFLOW_ID!,\n model: \"openai:gpt-4o-mini\",\n systemPrompt: \"You are a helpful assistant that greets people.\",\n category: \"hello-world\",\n additionalTools: [sayHello],\n requireApprovalForTools: [\"say_hello\"],\n debug: true,\n});\n```\n\n### 3. Process with Human Validation\n\n```typescript\nconst result = await agent.processWithHumanValidation({\n input: \"Say hello to Alice\",\n});\n\nconsole.log(\"Agent response:\", result.response);\nif (result.decision) {\n console.log(\"Decision status:\", result.decision.status);\n console.log(\"Human feedback:\", result.decision.feedback);\n}\n```\n\n## Key Features\n\n- **Complete HITL Workflow**: Agent manages the entire validation lifecycle\n- **Automatic Polling**: Waits for human decisions\n- **Feedback Handling**: Processes human feedback and retries if needed\n- **Category Support**: Organize validations by category\n- **Debug Mode**: Verbose logging for development\n\n## Workflow\n\n```\n1. User sends message\n ā\n2. Agent processes with LLM\n ā\n3. Agent generates tool call\n ā\n4. Creates Loopman validation task\n ā\n5. Polls for human decision\n ā\n6. If approved ā Execute and return result\n If rejected ā Process feedback and retry\n If timeout ā Handle timeout\n```\n\n## Configuration Options\n\n### requireApprovalForTools\n\nSpecify which tools require validation:\n\n```typescript\nrequireApprovalForTools: [\"say_hello\", \"send_email\"]\n// Only these tools will require human approval\n```\n\n### category\n\nOrganize validations by category:\n\n```typescript\ncategory: \"hello-world\"\n// Helps filter and organize validation tasks\n```\n\n### debug\n\nEnable/disable verbose logging:\n\n```typescript\ndebug: true // Show detailed logs\ndebug: false // Production mode\n```\n\n## Response Structure\n\nThe `processWithHumanValidation` method returns:\n\n```typescript\n{\n response: string, // Final agent response\n decision?: {\n status: \"APPROVED\" | \"REJECTED\" | \"NEEDS_CHANGES\",\n feedback?: string, // Human feedback if provided\n createdAt: Date,\n updatedAt: Date,\n }\n}\n```\n\n## Learn More\n\n- [Loopman Agent Documentation](https://github.com/loopman/loopman-langchain-sdk/blob/main/docs/LOOPMAN_AGENT.md)\n- [LangChain Documentation](https://js.langchain.com/docs)\n- [Loopman Documentation](https://loopman.dev/docs)\n\n"
|
|
19
19
|
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@langchain/mcp-adapters": "^1.0.0",
|
|
16
16
|
"@langchain/langgraph": "^1.0.7",
|
|
17
17
|
"@langchain/openai": "^1.0.0",
|
|
18
|
-
"@loopman/langchain-sdk": "^1.17.
|
|
18
|
+
"@loopman/langchain-sdk": "^1.17.3",
|
|
19
19
|
"dotenv": "^17.2.3",
|
|
20
20
|
"langchain": "^1.0.2",
|
|
21
21
|
"tsx": "^4.20.6",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@langchain/mcp-adapters": "^1.0.0",
|
|
16
16
|
"@langchain/langgraph": "^1.0.7",
|
|
17
17
|
"@langchain/openai": "^1.0.0",
|
|
18
|
-
"@loopman/langchain-sdk": "^1.17.
|
|
18
|
+
"@loopman/langchain-sdk": "^1.17.3",
|
|
19
19
|
"dotenv": "^17.2.3",
|
|
20
20
|
"langchain": "^1.0.2",
|
|
21
21
|
"tsx": "^4.20.6",
|