@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.
Files changed (170) hide show
  1. package/dist/agent.d.ts +4 -1
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +76 -30
  4. package/dist/agent.js.map +1 -1
  5. package/dist/checkpointer/checkpointSaverFactory.js +1 -1
  6. package/dist/checkpointer/checkpointSaverFactory.js.map +1 -1
  7. package/dist/cli/index.js +12 -12
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/edges/createDirectEdge.d.ts +1 -2
  10. package/dist/edges/createDirectEdge.d.ts.map +1 -1
  11. package/dist/edges/createDirectEdge.js +2 -6
  12. package/dist/edges/createDirectEdge.js.map +1 -1
  13. package/dist/edges/createLogicalRouter.d.ts.map +1 -1
  14. package/dist/edges/createLogicalRouter.js +6 -23
  15. package/dist/edges/createLogicalRouter.js.map +1 -1
  16. package/dist/edges/createPromptRouter.d.ts.map +1 -1
  17. package/dist/edges/createPromptRouter.js +6 -12
  18. package/dist/edges/createPromptRouter.js.map +1 -1
  19. package/dist/edges/edgeFactory.d.ts.map +1 -1
  20. package/dist/edges/edgeFactory.js +3 -8
  21. package/dist/edges/edgeFactory.js.map +1 -1
  22. package/dist/index.d.ts +0 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -6
  25. package/dist/index.js.map +1 -1
  26. package/dist/interrupts/BaseInterruptSessionManager.d.ts +51 -0
  27. package/dist/interrupts/BaseInterruptSessionManager.d.ts.map +1 -0
  28. package/dist/interrupts/BaseInterruptSessionManager.js +39 -0
  29. package/dist/interrupts/BaseInterruptSessionManager.js.map +1 -0
  30. package/dist/interrupts/InterruptSessionManager.types.d.ts +36 -0
  31. package/dist/interrupts/InterruptSessionManager.types.d.ts.map +1 -0
  32. package/dist/interrupts/InterruptSessionManager.types.js +40 -0
  33. package/dist/interrupts/InterruptSessionManager.types.js.map +1 -0
  34. package/dist/interrupts/MemoryInterruptSessionManager.d.ts +14 -0
  35. package/dist/interrupts/MemoryInterruptSessionManager.d.ts.map +1 -0
  36. package/dist/interrupts/MemoryInterruptSessionManager.js +56 -0
  37. package/dist/interrupts/MemoryInterruptSessionManager.js.map +1 -0
  38. package/dist/interrupts/MindedInterruptSessionManager.d.ts +13 -0
  39. package/dist/interrupts/MindedInterruptSessionManager.d.ts.map +1 -0
  40. package/dist/interrupts/MindedInterruptSessionManager.js +156 -0
  41. package/dist/interrupts/MindedInterruptSessionManager.js.map +1 -0
  42. package/dist/interrupts/interruptSessionManagerFactory.d.ts +3 -0
  43. package/dist/interrupts/interruptSessionManagerFactory.d.ts.map +1 -0
  44. package/dist/interrupts/interruptSessionManagerFactory.js +56 -0
  45. package/dist/interrupts/interruptSessionManagerFactory.js.map +1 -0
  46. package/dist/llm/createLlmInstance.d.ts +1 -1
  47. package/dist/llm/createLlmInstance.d.ts.map +1 -1
  48. package/dist/llm/createLlmInstance.js +1 -18
  49. package/dist/llm/createLlmInstance.js.map +1 -1
  50. package/dist/nodes/addAppToolNode.d.ts.map +1 -1
  51. package/dist/nodes/addAppToolNode.js +4 -5
  52. package/dist/nodes/addAppToolNode.js.map +1 -1
  53. package/dist/nodes/addHumanInTheLoopNode.d.ts.map +1 -1
  54. package/dist/nodes/addHumanInTheLoopNode.js +3 -2
  55. package/dist/nodes/addHumanInTheLoopNode.js.map +1 -1
  56. package/dist/nodes/addJumpToNode.d.ts.map +1 -1
  57. package/dist/nodes/addJumpToNode.js +1 -2
  58. package/dist/nodes/addJumpToNode.js.map +1 -1
  59. package/dist/nodes/addJunctionNode.d.ts.map +1 -1
  60. package/dist/nodes/addJunctionNode.js +0 -1
  61. package/dist/nodes/addJunctionNode.js.map +1 -1
  62. package/dist/nodes/addPromptNode.d.ts.map +1 -1
  63. package/dist/nodes/addPromptNode.js +61 -7
  64. package/dist/nodes/addPromptNode.js.map +1 -1
  65. package/dist/nodes/addToolNode.js +4 -2
  66. package/dist/nodes/addToolNode.js.map +1 -1
  67. package/dist/nodes/addToolRunNode.d.ts.map +1 -1
  68. package/dist/nodes/addToolRunNode.js +2 -2
  69. package/dist/nodes/addToolRunNode.js.map +1 -1
  70. package/dist/nodes/addTriggerNode.d.ts.map +1 -1
  71. package/dist/nodes/addTriggerNode.js +1 -2
  72. package/dist/nodes/addTriggerNode.js.map +1 -1
  73. package/dist/nodes/nodeFactory.d.ts.map +1 -1
  74. package/dist/nodes/nodeFactory.js +0 -4
  75. package/dist/nodes/nodeFactory.js.map +1 -1
  76. package/dist/platform/mindedChatOpenAI.d.ts +5 -0
  77. package/dist/platform/mindedChatOpenAI.d.ts.map +1 -0
  78. package/dist/platform/{models/mindedChatOpenAI.js → mindedChatOpenAI.js} +1 -10
  79. package/dist/platform/mindedChatOpenAI.js.map +1 -0
  80. package/dist/platform/mindedConnection.d.ts.map +1 -1
  81. package/dist/platform/mindedConnection.js +12 -12
  82. package/dist/platform/mindedConnection.js.map +1 -1
  83. package/dist/platform/mindedConnectionTypes.d.ts +151 -1
  84. package/dist/platform/mindedConnectionTypes.d.ts.map +1 -1
  85. package/dist/platform/mindedConnectionTypes.js +9 -0
  86. package/dist/platform/mindedConnectionTypes.js.map +1 -1
  87. package/dist/playbooks/playbooks.js +4 -4
  88. package/dist/playbooks/playbooks.js.map +1 -1
  89. package/dist/types/Agent.types.d.ts +2 -0
  90. package/dist/types/Agent.types.d.ts.map +1 -1
  91. package/dist/types/Agent.types.js.map +1 -1
  92. package/dist/types/Flows.types.d.ts +3 -18
  93. package/dist/types/Flows.types.d.ts.map +1 -1
  94. package/dist/types/Flows.types.js +0 -2
  95. package/dist/types/Flows.types.js.map +1 -1
  96. package/dist/types/LLM.types.d.ts.map +1 -1
  97. package/dist/types/LLM.types.js +1 -1
  98. package/dist/types/LLM.types.js.map +1 -1
  99. package/dist/types/LangGraph.types.d.ts +2 -4
  100. package/dist/types/LangGraph.types.d.ts.map +1 -1
  101. package/dist/types/LangGraph.types.js +2 -5
  102. package/dist/types/LangGraph.types.js.map +1 -1
  103. package/dist/utils/logger.d.ts.map +1 -1
  104. package/dist/utils/logger.js +2 -1
  105. package/dist/utils/logger.js.map +1 -1
  106. package/dist/voice/voiceSession.d.ts.map +1 -1
  107. package/dist/voice/voiceSession.js +17 -16
  108. package/dist/voice/voiceSession.js.map +1 -1
  109. package/docs/SUMMARY.md +0 -1
  110. package/docs/getting-started/installation.md +0 -42
  111. package/docs/low-code-editor/nodes.md +0 -27
  112. package/docs/low-code-editor/tools.md +0 -32
  113. package/package.json +2 -3
  114. package/src/agent.ts +93 -32
  115. package/src/checkpointer/checkpointSaverFactory.ts +1 -1
  116. package/src/cli/index.ts +12 -12
  117. package/src/edges/createDirectEdge.ts +2 -7
  118. package/src/edges/createLogicalRouter.ts +6 -23
  119. package/src/edges/createPromptRouter.ts +6 -13
  120. package/src/edges/edgeFactory.ts +4 -20
  121. package/src/index.ts +0 -6
  122. package/src/interrupts/BaseInterruptSessionManager.ts +94 -0
  123. package/src/interrupts/MemoryInterruptSessionManager.ts +57 -0
  124. package/src/interrupts/MindedInterruptSessionManager.ts +155 -0
  125. package/src/interrupts/interruptSessionManagerFactory.ts +20 -0
  126. package/src/llm/createLlmInstance.ts +2 -25
  127. package/src/nodes/addAppToolNode.ts +4 -5
  128. package/src/nodes/addHumanInTheLoopNode.ts +3 -3
  129. package/src/nodes/addJumpToNode.ts +1 -2
  130. package/src/nodes/addJunctionNode.ts +0 -1
  131. package/src/nodes/addPromptNode.ts +65 -10
  132. package/src/nodes/addToolNode.ts +4 -4
  133. package/src/nodes/addToolRunNode.ts +2 -4
  134. package/src/nodes/addTriggerNode.ts +1 -2
  135. package/src/nodes/nodeFactory.ts +1 -5
  136. package/src/platform/mindedChatOpenAI.ts +19 -0
  137. package/src/platform/mindedConnection.ts +15 -25
  138. package/src/platform/mindedConnectionTypes.ts +188 -1
  139. package/src/playbooks/playbooks.ts +4 -4
  140. package/src/types/Agent.types.ts +2 -0
  141. package/src/types/Flows.types.ts +1 -17
  142. package/src/types/LLM.types.ts +5 -5
  143. package/src/types/LangGraph.types.ts +2 -5
  144. package/src/utils/logger.ts +2 -1
  145. package/src/voice/voiceSession.ts +17 -16
  146. package/dist/browserTask/executeBrowserTask.d.ts +0 -12
  147. package/dist/browserTask/executeBrowserTask.d.ts.map +0 -1
  148. package/dist/browserTask/executeBrowserTask.js +0 -181
  149. package/dist/browserTask/executeBrowserTask.js.map +0 -1
  150. package/dist/nodes/addBrowserTaskNode.d.ts +0 -13
  151. package/dist/nodes/addBrowserTaskNode.d.ts.map +0 -1
  152. package/dist/nodes/addBrowserTaskNode.js +0 -230
  153. package/dist/nodes/addBrowserTaskNode.js.map +0 -1
  154. package/dist/nodes/addBrowserTaskRunNode.d.ts +0 -13
  155. package/dist/nodes/addBrowserTaskRunNode.d.ts.map +0 -1
  156. package/dist/nodes/addBrowserTaskRunNode.js +0 -126
  157. package/dist/nodes/addBrowserTaskRunNode.js.map +0 -1
  158. package/dist/platform/models/mindedChatOpenAI.d.ts +0 -20
  159. package/dist/platform/models/mindedChatOpenAI.d.ts.map +0 -1
  160. package/dist/platform/models/mindedChatOpenAI.js.map +0 -1
  161. package/dist/platform/models/parallelWrapper.d.ts +0 -17
  162. package/dist/platform/models/parallelWrapper.d.ts.map +0 -1
  163. package/dist/platform/models/parallelWrapper.js +0 -105
  164. package/dist/platform/models/parallelWrapper.js.map +0 -1
  165. package/docs/platform/parallel-llm.md +0 -242
  166. package/src/browserTask/executeBrowserTask.ts +0 -213
  167. package/src/nodes/addBrowserTaskNode.ts +0 -229
  168. package/src/nodes/addBrowserTaskRunNode.ts +0 -142
  169. package/src/platform/models/mindedChatOpenAI.ts +0 -49
  170. 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
- };