@minded-ai/mindedjs 1.0.102 → 1.0.103-beta-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/agent.d.ts +4 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +76 -30
- package/dist/agent.js.map +1 -1
- package/dist/checkpointer/checkpointSaverFactory.js +1 -1
- package/dist/checkpointer/checkpointSaverFactory.js.map +1 -1
- package/dist/cli/index.js +12 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/edges/createDirectEdge.d.ts +1 -2
- package/dist/edges/createDirectEdge.d.ts.map +1 -1
- package/dist/edges/createDirectEdge.js +2 -6
- package/dist/edges/createDirectEdge.js.map +1 -1
- package/dist/edges/createLogicalRouter.d.ts.map +1 -1
- package/dist/edges/createLogicalRouter.js +6 -23
- package/dist/edges/createLogicalRouter.js.map +1 -1
- package/dist/edges/createPromptRouter.d.ts.map +1 -1
- package/dist/edges/createPromptRouter.js +6 -12
- package/dist/edges/createPromptRouter.js.map +1 -1
- package/dist/edges/edgeFactory.d.ts.map +1 -1
- package/dist/edges/edgeFactory.js +3 -8
- package/dist/edges/edgeFactory.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/interrupts/BaseInterruptSessionManager.d.ts +51 -0
- package/dist/interrupts/BaseInterruptSessionManager.d.ts.map +1 -0
- package/dist/interrupts/BaseInterruptSessionManager.js +39 -0
- package/dist/interrupts/BaseInterruptSessionManager.js.map +1 -0
- package/dist/interrupts/InterruptSessionManager.types.d.ts +36 -0
- package/dist/interrupts/InterruptSessionManager.types.d.ts.map +1 -0
- package/dist/interrupts/InterruptSessionManager.types.js +40 -0
- package/dist/interrupts/InterruptSessionManager.types.js.map +1 -0
- package/dist/interrupts/MemoryInterruptSessionManager.d.ts +14 -0
- package/dist/interrupts/MemoryInterruptSessionManager.d.ts.map +1 -0
- package/dist/interrupts/MemoryInterruptSessionManager.js +56 -0
- package/dist/interrupts/MemoryInterruptSessionManager.js.map +1 -0
- package/dist/interrupts/MindedInterruptSessionManager.d.ts +13 -0
- package/dist/interrupts/MindedInterruptSessionManager.d.ts.map +1 -0
- package/dist/interrupts/MindedInterruptSessionManager.js +156 -0
- package/dist/interrupts/MindedInterruptSessionManager.js.map +1 -0
- package/dist/interrupts/interruptSessionManagerFactory.d.ts +3 -0
- package/dist/interrupts/interruptSessionManagerFactory.d.ts.map +1 -0
- package/dist/interrupts/interruptSessionManagerFactory.js +56 -0
- package/dist/interrupts/interruptSessionManagerFactory.js.map +1 -0
- package/dist/llm/createLlmInstance.d.ts +1 -1
- package/dist/llm/createLlmInstance.d.ts.map +1 -1
- package/dist/llm/createLlmInstance.js +1 -18
- package/dist/llm/createLlmInstance.js.map +1 -1
- package/dist/nodes/addAppToolNode.d.ts.map +1 -1
- package/dist/nodes/addAppToolNode.js +4 -5
- package/dist/nodes/addAppToolNode.js.map +1 -1
- package/dist/nodes/addHumanInTheLoopNode.d.ts.map +1 -1
- package/dist/nodes/addHumanInTheLoopNode.js +3 -2
- package/dist/nodes/addHumanInTheLoopNode.js.map +1 -1
- package/dist/nodes/addJumpToNode.d.ts.map +1 -1
- package/dist/nodes/addJumpToNode.js +1 -2
- package/dist/nodes/addJumpToNode.js.map +1 -1
- package/dist/nodes/addJunctionNode.d.ts.map +1 -1
- package/dist/nodes/addJunctionNode.js +0 -1
- package/dist/nodes/addJunctionNode.js.map +1 -1
- package/dist/nodes/addPromptNode.d.ts.map +1 -1
- package/dist/nodes/addPromptNode.js +61 -7
- package/dist/nodes/addPromptNode.js.map +1 -1
- package/dist/nodes/addToolNode.js +4 -2
- package/dist/nodes/addToolNode.js.map +1 -1
- package/dist/nodes/addToolRunNode.d.ts.map +1 -1
- package/dist/nodes/addToolRunNode.js +2 -2
- package/dist/nodes/addToolRunNode.js.map +1 -1
- package/dist/nodes/addTriggerNode.d.ts.map +1 -1
- package/dist/nodes/addTriggerNode.js +1 -2
- package/dist/nodes/addTriggerNode.js.map +1 -1
- package/dist/nodes/nodeFactory.d.ts.map +1 -1
- package/dist/nodes/nodeFactory.js +0 -4
- package/dist/nodes/nodeFactory.js.map +1 -1
- package/dist/platform/mindedChatOpenAI.d.ts +5 -0
- package/dist/platform/mindedChatOpenAI.d.ts.map +1 -0
- package/dist/platform/{models/mindedChatOpenAI.js → mindedChatOpenAI.js} +1 -10
- package/dist/platform/mindedChatOpenAI.js.map +1 -0
- package/dist/platform/mindedConnection.d.ts.map +1 -1
- package/dist/platform/mindedConnection.js +12 -12
- package/dist/platform/mindedConnection.js.map +1 -1
- package/dist/platform/mindedConnectionTypes.d.ts +151 -1
- package/dist/platform/mindedConnectionTypes.d.ts.map +1 -1
- package/dist/platform/mindedConnectionTypes.js +9 -0
- package/dist/platform/mindedConnectionTypes.js.map +1 -1
- package/dist/playbooks/playbooks.js +4 -4
- package/dist/playbooks/playbooks.js.map +1 -1
- package/dist/types/Agent.types.d.ts +2 -0
- package/dist/types/Agent.types.d.ts.map +1 -1
- package/dist/types/Agent.types.js.map +1 -1
- package/dist/types/Flows.types.d.ts +3 -18
- package/dist/types/Flows.types.d.ts.map +1 -1
- package/dist/types/Flows.types.js +0 -2
- package/dist/types/Flows.types.js.map +1 -1
- package/dist/types/LLM.types.d.ts.map +1 -1
- package/dist/types/LLM.types.js +1 -1
- package/dist/types/LLM.types.js.map +1 -1
- package/dist/types/LangGraph.types.d.ts +2 -4
- package/dist/types/LangGraph.types.d.ts.map +1 -1
- package/dist/types/LangGraph.types.js +2 -5
- package/dist/types/LangGraph.types.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/voice/voiceSession.d.ts.map +1 -1
- package/dist/voice/voiceSession.js +17 -16
- package/dist/voice/voiceSession.js.map +1 -1
- package/docs/SUMMARY.md +0 -1
- package/docs/getting-started/installation.md +0 -42
- package/docs/low-code-editor/nodes.md +0 -27
- package/docs/low-code-editor/tools.md +0 -32
- package/package.json +2 -3
- package/src/agent.ts +93 -32
- package/src/checkpointer/checkpointSaverFactory.ts +1 -1
- package/src/cli/index.ts +12 -12
- package/src/edges/createDirectEdge.ts +2 -7
- package/src/edges/createLogicalRouter.ts +6 -23
- package/src/edges/createPromptRouter.ts +6 -13
- package/src/edges/edgeFactory.ts +4 -20
- package/src/index.ts +0 -6
- package/src/interrupts/BaseInterruptSessionManager.ts +94 -0
- package/src/interrupts/MemoryInterruptSessionManager.ts +57 -0
- package/src/interrupts/MindedInterruptSessionManager.ts +155 -0
- package/src/interrupts/interruptSessionManagerFactory.ts +20 -0
- package/src/llm/createLlmInstance.ts +2 -25
- package/src/nodes/addAppToolNode.ts +4 -5
- package/src/nodes/addHumanInTheLoopNode.ts +3 -3
- package/src/nodes/addJumpToNode.ts +1 -2
- package/src/nodes/addJunctionNode.ts +0 -1
- package/src/nodes/addPromptNode.ts +65 -10
- package/src/nodes/addToolNode.ts +4 -4
- package/src/nodes/addToolRunNode.ts +2 -4
- package/src/nodes/addTriggerNode.ts +1 -2
- package/src/nodes/nodeFactory.ts +1 -5
- package/src/platform/mindedChatOpenAI.ts +19 -0
- package/src/platform/mindedConnection.ts +15 -25
- package/src/platform/mindedConnectionTypes.ts +188 -1
- package/src/playbooks/playbooks.ts +4 -4
- package/src/types/Agent.types.ts +2 -0
- package/src/types/Flows.types.ts +1 -17
- package/src/types/LLM.types.ts +5 -5
- package/src/types/LangGraph.types.ts +2 -5
- package/src/utils/logger.ts +2 -1
- package/src/voice/voiceSession.ts +17 -16
- package/dist/browserTask/executeBrowserTask.d.ts +0 -12
- package/dist/browserTask/executeBrowserTask.d.ts.map +0 -1
- package/dist/browserTask/executeBrowserTask.js +0 -181
- package/dist/browserTask/executeBrowserTask.js.map +0 -1
- package/dist/nodes/addBrowserTaskNode.d.ts +0 -13
- package/dist/nodes/addBrowserTaskNode.d.ts.map +0 -1
- package/dist/nodes/addBrowserTaskNode.js +0 -230
- package/dist/nodes/addBrowserTaskNode.js.map +0 -1
- package/dist/nodes/addBrowserTaskRunNode.d.ts +0 -13
- package/dist/nodes/addBrowserTaskRunNode.d.ts.map +0 -1
- package/dist/nodes/addBrowserTaskRunNode.js +0 -126
- package/dist/nodes/addBrowserTaskRunNode.js.map +0 -1
- package/dist/platform/models/mindedChatOpenAI.d.ts +0 -20
- package/dist/platform/models/mindedChatOpenAI.d.ts.map +0 -1
- package/dist/platform/models/mindedChatOpenAI.js.map +0 -1
- package/dist/platform/models/parallelWrapper.d.ts +0 -17
- package/dist/platform/models/parallelWrapper.d.ts.map +0 -1
- package/dist/platform/models/parallelWrapper.js +0 -105
- package/dist/platform/models/parallelWrapper.js.map +0 -1
- package/docs/platform/parallel-llm.md +0 -242
- package/src/browserTask/executeBrowserTask.ts +0 -213
- package/src/nodes/addBrowserTaskNode.ts +0 -229
- package/src/nodes/addBrowserTaskRunNode.ts +0 -142
- package/src/platform/models/mindedChatOpenAI.ts +0 -49
- package/src/platform/models/parallelWrapper.ts +0 -141
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createParallelWrapper = createParallelWrapper;
|
|
4
|
-
const logger_1 = require("../../utils/logger");
|
|
5
|
-
/**
|
|
6
|
-
* Creates a wrapped version of a chat model with parallel request capabilities
|
|
7
|
-
*/
|
|
8
|
-
function createParallelWrapper(model, fields) {
|
|
9
|
-
const numParallelRequests = (fields === null || fields === void 0 ? void 0 : fields.numParallelRequests) || 1;
|
|
10
|
-
const logTimings = (fields === null || fields === void 0 ? void 0 : fields.logTimings) || false;
|
|
11
|
-
// If parallel requests are disabled, return the original model
|
|
12
|
-
if (numParallelRequests <= 1) {
|
|
13
|
-
return model;
|
|
14
|
-
}
|
|
15
|
-
// Helper function that returns a promise that resolves with the second fulfilled promise
|
|
16
|
-
const promiseSecondFulfillment = (promises) => {
|
|
17
|
-
return new Promise((resolve) => {
|
|
18
|
-
let fulfillCount = 0;
|
|
19
|
-
for (const p of promises) {
|
|
20
|
-
Promise.resolve(p)
|
|
21
|
-
.then((value) => {
|
|
22
|
-
fulfillCount++;
|
|
23
|
-
if (fulfillCount === 2) {
|
|
24
|
-
resolve(value);
|
|
25
|
-
}
|
|
26
|
-
})
|
|
27
|
-
.catch(() => {
|
|
28
|
-
// Ignoring rejections for second fulfillment tracking
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
// Store original methods
|
|
34
|
-
const originalGenerate = model._generate.bind(model);
|
|
35
|
-
const originalStream = model._streamResponseChunks.bind(model);
|
|
36
|
-
// Override _generate
|
|
37
|
-
model._generate = async function (messages, options, runManager) {
|
|
38
|
-
const startTime = Date.now();
|
|
39
|
-
// Create array of identical requests
|
|
40
|
-
const requests = Array.from({ length: numParallelRequests }, () => originalGenerate(messages, options, runManager));
|
|
41
|
-
let fastestRequestTime = 0;
|
|
42
|
-
let secondFastestRequestTime = 0;
|
|
43
|
-
// Race all requests and return the fastest
|
|
44
|
-
const racePromise = Promise.race(requests).then((result) => {
|
|
45
|
-
fastestRequestTime = (Date.now() - startTime) / 1000.0;
|
|
46
|
-
if (logTimings) {
|
|
47
|
-
logger_1.logger.debug({
|
|
48
|
-
msg: '[Model] Fastest request completed',
|
|
49
|
-
requestTime: fastestRequestTime,
|
|
50
|
-
numParallelRequests: numParallelRequests,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return result;
|
|
54
|
-
});
|
|
55
|
-
// Track second fastest if we have 3+ requests
|
|
56
|
-
if (requests.length >= 3) {
|
|
57
|
-
promiseSecondFulfillment(requests)
|
|
58
|
-
.then(() => {
|
|
59
|
-
secondFastestRequestTime = (Date.now() - startTime) / 1000.0;
|
|
60
|
-
})
|
|
61
|
-
.catch(() => {
|
|
62
|
-
// Ignore errors in timing tracking
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
// Track all completion times if we have 2+ requests
|
|
66
|
-
if (requests.length >= 2 && logTimings) {
|
|
67
|
-
Promise.all(requests)
|
|
68
|
-
.then(() => {
|
|
69
|
-
const allFinishTime = (Date.now() - startTime) / 1000.0;
|
|
70
|
-
const timeSaved = allFinishTime - fastestRequestTime;
|
|
71
|
-
const timeSavedFromSecond = secondFastestRequestTime > 0 ? secondFastestRequestTime - fastestRequestTime : 0;
|
|
72
|
-
logger_1.logger.debug({
|
|
73
|
-
msg: '[Model] Time saved using parallel requests',
|
|
74
|
-
fastestRequestTime,
|
|
75
|
-
secondFastestRequestTime: secondFastestRequestTime || 'N/A',
|
|
76
|
-
allFinishTime,
|
|
77
|
-
timeSaved,
|
|
78
|
-
timeSavedFromSecond,
|
|
79
|
-
numParallelRequests: numParallelRequests,
|
|
80
|
-
});
|
|
81
|
-
})
|
|
82
|
-
.catch(() => {
|
|
83
|
-
// Ignore errors in timing tracking
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return racePromise;
|
|
87
|
-
};
|
|
88
|
-
// Override _streamResponseChunks
|
|
89
|
-
model._streamResponseChunks = async function* (messages, options, runManager) {
|
|
90
|
-
// For streaming, we'll use the original implementation
|
|
91
|
-
// Parallel streaming is more complex and may not provide the same benefits
|
|
92
|
-
if (numParallelRequests > 1 && logTimings) {
|
|
93
|
-
logger_1.logger.debug({
|
|
94
|
-
msg: '[Model] Streaming mode - using single request',
|
|
95
|
-
reason: 'Parallel streaming not implemented',
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
yield* originalStream(messages, options, runManager);
|
|
99
|
-
};
|
|
100
|
-
// Add properties for testing
|
|
101
|
-
model.numParallelRequests = numParallelRequests;
|
|
102
|
-
model.logTimings = logTimings;
|
|
103
|
-
return model;
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=parallelWrapper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parallelWrapper.js","sourceRoot":"","sources":["../../../src/platform/models/parallelWrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
# Parallel LLM Requests
|
|
2
|
-
|
|
3
|
-
Parallel LLM requests can significantly reduce latency by sending multiple identical requests and using the fastest response. This feature can reduce response times by 30-50% in scenarios with variable network conditions.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
The easiest way to enable parallel requests is through your `minded.json` configuration:
|
|
8
|
-
|
|
9
|
-
```json
|
|
10
|
-
{
|
|
11
|
-
"flows": ["./src/flows"],
|
|
12
|
-
"tools": ["./src/tools"],
|
|
13
|
-
"agent": "./src/agent.ts",
|
|
14
|
-
"llm": {
|
|
15
|
-
"name": "MindedChatOpenAI",
|
|
16
|
-
"properties": {
|
|
17
|
-
"model": "gpt-4o",
|
|
18
|
-
"numParallelRequests": 3,
|
|
19
|
-
"logTimings": true
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Your agent will automatically use parallel requests for all LLM calls:
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
import { Agent } from '@minded-ai/mindedjs';
|
|
29
|
-
import memorySchema from './agentMemorySchema';
|
|
30
|
-
import config from '../minded.json';
|
|
31
|
-
import tools from './tools';
|
|
32
|
-
|
|
33
|
-
const agent = new Agent({
|
|
34
|
-
memorySchema,
|
|
35
|
-
config, // Parallel configuration is automatically applied
|
|
36
|
-
tools,
|
|
37
|
-
});
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Configuration Options
|
|
41
|
-
|
|
42
|
-
### MindedChatOpenAI (Recommended)
|
|
43
|
-
|
|
44
|
-
For agents running on the Minded platform, use `MindedChatOpenAI` with parallel configuration:
|
|
45
|
-
|
|
46
|
-
```json
|
|
47
|
-
{
|
|
48
|
-
"llm": {
|
|
49
|
-
"name": "MindedChatOpenAI",
|
|
50
|
-
"properties": {
|
|
51
|
-
"model": "gpt-4o",
|
|
52
|
-
"numParallelRequests": 3,
|
|
53
|
-
"logTimings": true,
|
|
54
|
-
"temperature": 0.7
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### AzureChatOpenAI
|
|
61
|
-
|
|
62
|
-
For Azure OpenAI deployments:
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"llm": {
|
|
67
|
-
"name": "AzureChatOpenAI",
|
|
68
|
-
"properties": {
|
|
69
|
-
"model": "gpt-4o",
|
|
70
|
-
"numParallelRequests": 3,
|
|
71
|
-
"logTimings": true,
|
|
72
|
-
"azureOpenAIApiVersion": "2024-02-01"
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Required environment variables:
|
|
79
|
-
|
|
80
|
-
```env
|
|
81
|
-
AZURE_OPENAI_API_KEY=your_azure_key
|
|
82
|
-
AZURE_OPENAI_API_INSTANCE_NAME=your_instance_name
|
|
83
|
-
AZURE_OPENAI_API_DEPLOYMENT_NAME=your_deployment_name
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### ChatOpenAI
|
|
87
|
-
|
|
88
|
-
For standard OpenAI API:
|
|
89
|
-
|
|
90
|
-
```json
|
|
91
|
-
{
|
|
92
|
-
"llm": {
|
|
93
|
-
"name": "ChatOpenAI",
|
|
94
|
-
"properties": {
|
|
95
|
-
"model": "gpt-4o",
|
|
96
|
-
"numParallelRequests": 3,
|
|
97
|
-
"logTimings": true,
|
|
98
|
-
"openAIApiKey": "${OPENAI_API_KEY}"
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Configuration Parameters
|
|
105
|
-
|
|
106
|
-
| Parameter | Type | Default | Description |
|
|
107
|
-
| --------------------- | ------- | ------- | --------------------------------------------- |
|
|
108
|
-
| `numParallelRequests` | number | 1 | Number of parallel requests (2-5 recommended) |
|
|
109
|
-
| `logTimings` | boolean | false | Enable detailed timing logs |
|
|
110
|
-
|
|
111
|
-
## Performance Notes
|
|
112
|
-
|
|
113
|
-
- **Optimal Range**: 2-3 parallel requests usually provide the best latency/cost balance
|
|
114
|
-
- **Cost Impact**: You pay for all parallel requests made
|
|
115
|
-
- **Best Use Cases**: Variable network conditions, consistency requirements
|
|
116
|
-
- **Latency Reduction**: Typically 30-50% faster response times
|
|
117
|
-
|
|
118
|
-
## Monitoring Performance
|
|
119
|
-
|
|
120
|
-
When `logTimings: true` is enabled, you'll see detailed performance logs:
|
|
121
|
-
|
|
122
|
-
```
|
|
123
|
-
[Model] Fastest request completed { requestTime: 1.234, numParallelRequests: 3 }
|
|
124
|
-
[Model] Time saved using parallel requests {
|
|
125
|
-
fastestRequestTime: 1.234,
|
|
126
|
-
secondFastestRequestTime: 1.567,
|
|
127
|
-
allFinishTime: 2.345,
|
|
128
|
-
timeSaved: 1.111,
|
|
129
|
-
timeSavedFromSecond: 0.333
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
## Advanced Usage
|
|
134
|
-
|
|
135
|
-
### Dynamic Configuration
|
|
136
|
-
|
|
137
|
-
You can adjust parallel requests based on environment:
|
|
138
|
-
|
|
139
|
-
```json
|
|
140
|
-
{
|
|
141
|
-
"llm": {
|
|
142
|
-
"name": "MindedChatOpenAI",
|
|
143
|
-
"properties": {
|
|
144
|
-
"model": "gpt-4o",
|
|
145
|
-
"numParallelRequests": "${NODE_ENV === 'production' ? 3 : 1}",
|
|
146
|
-
"logTimings": "${NODE_ENV === 'development'}"
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Manual Instantiation with createParallelWrapper
|
|
153
|
-
|
|
154
|
-
For advanced use cases where you need direct control over the LLM instance, you can manually apply parallel wrapping:
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
import { createParallelWrapper } from '@minded-ai/mindedjs';
|
|
158
|
-
import { ChatOpenAI, AzureChatOpenAI } from '@langchain/openai';
|
|
159
|
-
|
|
160
|
-
// Manual wrapping for ChatOpenAI
|
|
161
|
-
const parallelOpenAI = createParallelWrapper(
|
|
162
|
-
new ChatOpenAI({
|
|
163
|
-
openAIApiKey: process.env.OPENAI_API_KEY,
|
|
164
|
-
model: 'gpt-4o',
|
|
165
|
-
temperature: 0.7,
|
|
166
|
-
}),
|
|
167
|
-
{
|
|
168
|
-
numParallelRequests: 3,
|
|
169
|
-
logTimings: true,
|
|
170
|
-
},
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
// Manual wrapping for AzureChatOpenAI
|
|
174
|
-
const parallelAzure = createParallelWrapper(
|
|
175
|
-
new AzureChatOpenAI({
|
|
176
|
-
azureOpenAIApiKey: process.env.AZURE_OPENAI_API_KEY,
|
|
177
|
-
azureOpenAIApiInstanceName: process.env.AZURE_OPENAI_INSTANCE!,
|
|
178
|
-
azureOpenAIApiDeploymentName: process.env.AZURE_OPENAI_DEPLOYMENT!,
|
|
179
|
-
azureOpenAIApiVersion: '2024-02-01',
|
|
180
|
-
}),
|
|
181
|
-
{
|
|
182
|
-
numParallelRequests: 2,
|
|
183
|
-
logTimings: false,
|
|
184
|
-
},
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
// Use directly with Agent (bypassing configuration)
|
|
188
|
-
const agent = new Agent({
|
|
189
|
-
memorySchema,
|
|
190
|
-
config: {
|
|
191
|
-
flows: ['./flows'],
|
|
192
|
-
tools: [],
|
|
193
|
-
llm: parallelOpenAI as any, // Direct LLM instance
|
|
194
|
-
},
|
|
195
|
-
tools: [],
|
|
196
|
-
});
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Note**: The configuration-based approach is recommended for most use cases as it's simpler and more maintainable. Use manual instantiation only when you need specific control over LLM creation or are integrating with existing LangChain workflows.
|
|
200
|
-
|
|
201
|
-
## How It Works
|
|
202
|
-
|
|
203
|
-
### MindedChatOpenAI (Backend Processing)
|
|
204
|
-
|
|
205
|
-
- Parallel requests are handled on the Minded platform backend
|
|
206
|
-
- Multiple requests sent to Azure OpenAI from the backend
|
|
207
|
-
- Fastest response returned to your agent
|
|
208
|
-
- Optimal for production deployments
|
|
209
|
-
|
|
210
|
-
### Other LLM Providers (Client-Side Processing)
|
|
211
|
-
|
|
212
|
-
- Parallel requests handled in your application
|
|
213
|
-
- Multiple requests sent directly to the LLM provider
|
|
214
|
-
- Good for development and custom deployments
|
|
215
|
-
|
|
216
|
-
## Best Practices
|
|
217
|
-
|
|
218
|
-
1. **Start Small**: Begin with 2-3 parallel requests
|
|
219
|
-
2. **Monitor Costs**: Each parallel request counts toward your usage
|
|
220
|
-
3. **Enable Logging**: Use `logTimings: true` during development to measure improvements
|
|
221
|
-
4. **Environment-Specific**: Use fewer parallel requests in development
|
|
222
|
-
5. **Configuration Over Code**: Prefer `minded.json` configuration over manual instantiation
|
|
223
|
-
|
|
224
|
-
## Troubleshooting
|
|
225
|
-
|
|
226
|
-
### No Performance Improvement
|
|
227
|
-
|
|
228
|
-
- Check network latency variability
|
|
229
|
-
- Ensure `numParallelRequests > 1`
|
|
230
|
-
- Verify timing logs are showing multiple requests
|
|
231
|
-
|
|
232
|
-
### Increased Costs
|
|
233
|
-
|
|
234
|
-
- Reduce `numParallelRequests`
|
|
235
|
-
- Consider cost vs. latency trade-offs
|
|
236
|
-
- Monitor usage patterns
|
|
237
|
-
|
|
238
|
-
### Rate Limiting
|
|
239
|
-
|
|
240
|
-
- Lower `numParallelRequests`
|
|
241
|
-
- Implement backoff strategies
|
|
242
|
-
- Contact provider about rate limits
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { logger } from '../utils/logger';
|
|
2
|
-
|
|
3
|
-
// Browser Use Cloud API configuration
|
|
4
|
-
const BROWSER_USE_API_BASE_URL = 'https://api.browser-use.com/api/v1';
|
|
5
|
-
|
|
6
|
-
// Types for Browser Use Cloud API
|
|
7
|
-
export interface CloudTaskResponse {
|
|
8
|
-
id: string;
|
|
9
|
-
status: string;
|
|
10
|
-
live_url?: string;
|
|
11
|
-
steps?: any[];
|
|
12
|
-
output?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Browser Use Cloud API methods
|
|
16
|
-
export const createCloudTask = async (prompt: string, model?: string): Promise<string> => {
|
|
17
|
-
const apiKey = process.env.BROWSER_USE_API_KEY;
|
|
18
|
-
if (!apiKey) {
|
|
19
|
-
throw new Error('BROWSER_USE_API_KEY environment variable is required');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
logger.debug({ msg: 'Creating cloud browser task', prompt: prompt.substring(0, 100) + '...' });
|
|
23
|
-
|
|
24
|
-
const response = await fetch(`${BROWSER_USE_API_BASE_URL}/run-task`, {
|
|
25
|
-
method: 'POST',
|
|
26
|
-
headers: {
|
|
27
|
-
Authorization: `Bearer ${apiKey}`,
|
|
28
|
-
'Content-Type': 'application/json',
|
|
29
|
-
},
|
|
30
|
-
body: JSON.stringify({
|
|
31
|
-
task: prompt,
|
|
32
|
-
use_proxy: false,
|
|
33
|
-
llm_model: model || 'gpt-4o',
|
|
34
|
-
}),
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
if (!response.ok) {
|
|
38
|
-
logger.error({ msg: 'Failed to create cloud browser task', status: response.status, statusText: response.statusText });
|
|
39
|
-
throw new Error(`Failed to create browser task: ${response.statusText}`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const data = await response.json();
|
|
43
|
-
logger.debug({ msg: 'Cloud browser task created', taskId: data.id });
|
|
44
|
-
return data.id;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export const getTaskDetails = async (taskId: string): Promise<CloudTaskResponse> => {
|
|
48
|
-
const apiKey = process.env.BROWSER_USE_API_KEY;
|
|
49
|
-
if (!apiKey) {
|
|
50
|
-
throw new Error('BROWSER_USE_API_KEY environment variable is required');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const response = await fetch(`${BROWSER_USE_API_BASE_URL}/task/${taskId}`, {
|
|
54
|
-
headers: {
|
|
55
|
-
Authorization: `Bearer ${apiKey}`,
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
if (!response.ok) {
|
|
60
|
-
logger.error({ msg: 'Failed to get task details', taskId, status: response.status, statusText: response.statusText });
|
|
61
|
-
throw new Error(`Failed to get task details: ${response.statusText}`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return response.json();
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
export const waitForLiveUrl = async (taskId: string, maxWaitTime: number = 30000): Promise<CloudTaskResponse> => {
|
|
68
|
-
const startTime = Date.now();
|
|
69
|
-
const pollInterval = 2000; // 2 seconds
|
|
70
|
-
let pollCount = 0;
|
|
71
|
-
|
|
72
|
-
logger.debug({ msg: 'Starting to poll for live_url', taskId, maxWaitTime, pollInterval });
|
|
73
|
-
|
|
74
|
-
while (Date.now() - startTime < maxWaitTime) {
|
|
75
|
-
pollCount++;
|
|
76
|
-
const elapsedTime = Date.now() - startTime;
|
|
77
|
-
|
|
78
|
-
logger.trace({
|
|
79
|
-
msg: 'Polling for live_url',
|
|
80
|
-
taskId,
|
|
81
|
-
pollCount,
|
|
82
|
-
elapsedTime,
|
|
83
|
-
remainingTime: maxWaitTime - elapsedTime,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const taskDetails = await getTaskDetails(taskId);
|
|
87
|
-
|
|
88
|
-
logger.trace({
|
|
89
|
-
msg: 'Task details received',
|
|
90
|
-
taskId,
|
|
91
|
-
status: taskDetails.status,
|
|
92
|
-
hasLiveUrl: !!taskDetails.live_url,
|
|
93
|
-
pollCount,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
if (taskDetails.live_url) {
|
|
97
|
-
logger.debug({
|
|
98
|
-
msg: 'Live URL available',
|
|
99
|
-
taskId,
|
|
100
|
-
liveUrl: taskDetails.live_url,
|
|
101
|
-
pollCount,
|
|
102
|
-
totalTime: elapsedTime,
|
|
103
|
-
});
|
|
104
|
-
return taskDetails;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (taskDetails.status === 'failed' || taskDetails.status === 'stopped') {
|
|
108
|
-
logger.error({
|
|
109
|
-
msg: 'Task failed while waiting for live_url',
|
|
110
|
-
taskId,
|
|
111
|
-
status: taskDetails.status,
|
|
112
|
-
pollCount,
|
|
113
|
-
elapsedTime,
|
|
114
|
-
});
|
|
115
|
-
throw new Error(`Task failed with status: ${taskDetails.status}`);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
logger.trace({
|
|
119
|
-
msg: 'Live URL not yet available, continuing to poll',
|
|
120
|
-
taskId,
|
|
121
|
-
status: taskDetails.status,
|
|
122
|
-
pollCount,
|
|
123
|
-
nextPollIn: pollInterval,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
logger.error({
|
|
130
|
-
msg: 'Timeout waiting for live_url',
|
|
131
|
-
taskId,
|
|
132
|
-
pollCount,
|
|
133
|
-
totalTime: Date.now() - startTime,
|
|
134
|
-
maxWaitTime,
|
|
135
|
-
});
|
|
136
|
-
throw new Error('Timeout waiting for live_url to become available');
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
export const waitForCompletion = async (taskId: string, maxWaitTime: number = 300000): Promise<CloudTaskResponse> => {
|
|
140
|
-
const startTime = Date.now();
|
|
141
|
-
const pollInterval = 3000; // 3 seconds for completion polling
|
|
142
|
-
let pollCount = 0;
|
|
143
|
-
|
|
144
|
-
logger.debug({ msg: 'Starting to poll for task completion', taskId, maxWaitTime, pollInterval });
|
|
145
|
-
|
|
146
|
-
while (Date.now() - startTime < maxWaitTime) {
|
|
147
|
-
pollCount++;
|
|
148
|
-
const elapsedTime = Date.now() - startTime;
|
|
149
|
-
|
|
150
|
-
logger.trace({
|
|
151
|
-
msg: 'Polling for task completion',
|
|
152
|
-
taskId,
|
|
153
|
-
pollCount,
|
|
154
|
-
elapsedTime,
|
|
155
|
-
remainingTime: maxWaitTime - elapsedTime,
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
const taskDetails = await getTaskDetails(taskId);
|
|
159
|
-
|
|
160
|
-
logger.trace({
|
|
161
|
-
msg: 'Task completion status received',
|
|
162
|
-
taskId,
|
|
163
|
-
status: taskDetails.status,
|
|
164
|
-
pollCount,
|
|
165
|
-
hasOutput: !!taskDetails.output,
|
|
166
|
-
stepCount: taskDetails.steps?.length || 0,
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
if (taskDetails.status === 'finished') {
|
|
170
|
-
logger.debug({
|
|
171
|
-
msg: 'Task completed successfully',
|
|
172
|
-
taskId,
|
|
173
|
-
pollCount,
|
|
174
|
-
totalTime: elapsedTime,
|
|
175
|
-
stepCount: taskDetails.steps?.length || 0,
|
|
176
|
-
hasOutput: !!taskDetails.output,
|
|
177
|
-
});
|
|
178
|
-
return taskDetails;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (taskDetails.status === 'failed' || taskDetails.status === 'stopped') {
|
|
182
|
-
logger.error({
|
|
183
|
-
msg: 'Task failed during completion polling',
|
|
184
|
-
taskId,
|
|
185
|
-
status: taskDetails.status,
|
|
186
|
-
pollCount,
|
|
187
|
-
elapsedTime,
|
|
188
|
-
stepCount: taskDetails.steps?.length || 0,
|
|
189
|
-
});
|
|
190
|
-
throw new Error(`Task failed with status: ${taskDetails.status}`);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
logger.trace({
|
|
194
|
-
msg: 'Task still in progress, continuing to poll',
|
|
195
|
-
taskId,
|
|
196
|
-
status: taskDetails.status,
|
|
197
|
-
pollCount,
|
|
198
|
-
stepCount: taskDetails.steps?.length || 0,
|
|
199
|
-
nextPollIn: pollInterval,
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
logger.error({
|
|
206
|
-
msg: 'Timeout waiting for task completion',
|
|
207
|
-
taskId,
|
|
208
|
-
pollCount,
|
|
209
|
-
totalTime: Date.now() - startTime,
|
|
210
|
-
maxWaitTime,
|
|
211
|
-
});
|
|
212
|
-
throw new Error('Timeout waiting for task completion');
|
|
213
|
-
};
|