@minded-ai/mindedjs 1.0.94-beta.2 → 1.0.94-beta.4
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/browserTask/executeBrowserTask.d.ts.map +1 -1
- package/dist/browserTask/executeBrowserTask.js +27 -2
- package/dist/browserTask/executeBrowserTask.js.map +1 -1
- package/dist/nodes/addBrowserTaskNode.d.ts.map +1 -1
- package/dist/nodes/addBrowserTaskNode.js +17 -11
- package/dist/nodes/addBrowserTaskNode.js.map +1 -1
- package/docs/getting-started/installation.md +11 -1
- package/package.json +1 -1
- package/src/browserTask/executeBrowserTask.ts +33 -3
- package/src/nodes/addBrowserTaskNode.ts +17 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"executeBrowserTask.d.ts","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,CA8BvE,CAAC"}
|
|
@@ -1,9 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.executeBrowserTask = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
4
6
|
const executeBrowserTask = async (prompt) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const child = (0, child_process_1.spawn)('browser-use', ['-p', prompt]);
|
|
9
|
+
let output = '';
|
|
10
|
+
// Stream stdout to console and collect it
|
|
11
|
+
child.stdout.on('data', (data) => {
|
|
12
|
+
const chunk = data.toString();
|
|
13
|
+
logger_1.logger.trace({ message: 'Browser task output', output: chunk });
|
|
14
|
+
output += chunk;
|
|
15
|
+
});
|
|
16
|
+
// Stream stderr to console
|
|
17
|
+
child.stderr.on('data', (data) => {
|
|
18
|
+
logger_1.logger.error({ message: 'Browser task error', error: data.toString() });
|
|
19
|
+
});
|
|
20
|
+
child.on('error', (error) => {
|
|
21
|
+
reject(error);
|
|
22
|
+
});
|
|
23
|
+
child.on('close', (code) => {
|
|
24
|
+
if (code !== 0) {
|
|
25
|
+
reject(new Error(`browser-use exited with code ${code}`));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
resolve(output);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
|
7
32
|
};
|
|
8
33
|
exports.executeBrowserTask = executeBrowserTask;
|
|
9
34
|
//# sourceMappingURL=executeBrowserTask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"executeBrowserTask.js","sourceRoot":"","sources":["../../src/browserTask/executeBrowserTask.ts"],"names":[],"mappings":";;;AAAA,iDAAsC;AACtC,4CAAyC;AAElC,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAc,EAAmB,EAAE;IAE1E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,0CAA0C;QAC1C,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,eAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA9BW,QAAA,kBAAkB,sBA8B7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addBrowserTaskNode.d.ts","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAY,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAmB,MAAM,0BAA0B,CAAC;AAO7E,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,eAAe,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,iBAAiB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"addBrowserTaskNode.d.ts","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAY,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAmB,MAAM,0BAA0B,CAAC;AAO7E,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,eAAe,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,iBAAiB,wBAAwB,kBA2EjF,CAAC"}
|
|
@@ -6,13 +6,17 @@ const logger_1 = require("../utils/logger");
|
|
|
6
6
|
const history_1 = require("../utils/history");
|
|
7
7
|
const messages_1 = require("@langchain/core/messages");
|
|
8
8
|
const executeBrowserTask_1 = require("../browserTask/executeBrowserTask");
|
|
9
|
+
const uuid_1 = require("uuid");
|
|
9
10
|
const addBrowserTaskNode = async ({ graph, node }) => {
|
|
10
11
|
const callback = async (state) => {
|
|
11
12
|
logger_1.logger.info({ message: `Executing browser task node ${node.displayName}`, prompt: node.prompt });
|
|
13
|
+
const toolCallId = (0, uuid_1.v4)();
|
|
12
14
|
const toolCallingMessage = new messages_1.AIMessage({
|
|
13
|
-
|
|
15
|
+
id: (0, uuid_1.v4)(),
|
|
16
|
+
content: '',
|
|
14
17
|
tool_calls: [
|
|
15
18
|
{
|
|
19
|
+
id: toolCallId,
|
|
16
20
|
name: 'browser-task',
|
|
17
21
|
args: {
|
|
18
22
|
prompt: node.prompt,
|
|
@@ -26,10 +30,14 @@ const addBrowserTaskNode = async ({ graph, node }) => {
|
|
|
26
30
|
},
|
|
27
31
|
});
|
|
28
32
|
try {
|
|
29
|
-
const result = await (0, executeBrowserTask_1.executeBrowserTask)(node.prompt);
|
|
33
|
+
const result = await (0, executeBrowserTask_1.executeBrowserTask)(`Follow the instructions. Any retrieved data should be printed as string and not saved to a file.\n${node.prompt}`);
|
|
30
34
|
const toolCall = new messages_1.ToolMessage({
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
id: (0, uuid_1.v4)(),
|
|
36
|
+
content: JSON.stringify({
|
|
37
|
+
result: result.split(` Result: `)[1],
|
|
38
|
+
}),
|
|
39
|
+
name: 'browser-task',
|
|
40
|
+
tool_call_id: toolCallId,
|
|
33
41
|
status: 'success',
|
|
34
42
|
additional_kwargs: {
|
|
35
43
|
mindedMetadata: {
|
|
@@ -44,19 +52,19 @@ const addBrowserTaskNode = async ({ graph, node }) => {
|
|
|
44
52
|
nodeDisplayName: node.displayName,
|
|
45
53
|
raw: result,
|
|
46
54
|
}),
|
|
47
|
-
|
|
48
|
-
messages: [toolCallingMessage, toolCall],
|
|
49
|
-
}
|
|
55
|
+
messages: [toolCallingMessage, toolCall],
|
|
50
56
|
};
|
|
51
57
|
}
|
|
52
58
|
catch (error) {
|
|
53
59
|
logger_1.logger.error(`Error executing browser task node ${node.displayName}: ${error}`);
|
|
54
60
|
const toolCall = new messages_1.ToolMessage({
|
|
61
|
+
id: (0, uuid_1.v4)(),
|
|
55
62
|
content: JSON.stringify({
|
|
56
63
|
error: error instanceof Error ? error.message : error.toString()
|
|
57
64
|
}),
|
|
58
65
|
status: 'error',
|
|
59
|
-
|
|
66
|
+
name: 'browser-task',
|
|
67
|
+
tool_call_id: toolCallId,
|
|
60
68
|
additional_kwargs: {
|
|
61
69
|
mindedMetadata: {
|
|
62
70
|
nodeType: Flows_types_1.NodeType.BROWSER_TASK,
|
|
@@ -70,9 +78,7 @@ const addBrowserTaskNode = async ({ graph, node }) => {
|
|
|
70
78
|
nodeDisplayName: node.displayName,
|
|
71
79
|
raw: error,
|
|
72
80
|
}),
|
|
73
|
-
|
|
74
|
-
messages: [toolCallingMessage, toolCall],
|
|
75
|
-
}
|
|
81
|
+
messages: [toolCallingMessage, toolCall],
|
|
76
82
|
};
|
|
77
83
|
}
|
|
78
84
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addBrowserTaskNode.js","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskNode.ts"],"names":[],"mappings":";;;AACA,sDAAiE;AAGjE,4CAAyC;AACzC,8CAAqD;AACrD,uDAAkE;AAClE,0EAAuE;
|
|
1
|
+
{"version":3,"file":"addBrowserTaskNode.js","sourceRoot":"","sources":["../../src/nodes/addBrowserTaskNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,7 +52,17 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
52
52
|
uv tool install 'browser-use[cli]'
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
### 3.
|
|
55
|
+
### 3. Install Playwright Chromium browser
|
|
56
|
+
|
|
57
|
+
After installing browser-use, you need to install the Chromium browser for Playwright:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
playwright install chromium
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This downloads the Chromium browser that browser-use uses to automate web interactions.
|
|
64
|
+
|
|
65
|
+
### 4. Add uv to PATH
|
|
56
66
|
|
|
57
67
|
After installation, add uv to your PATH:
|
|
58
68
|
|
package/package.json
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { logger } from "../utils/logger";
|
|
3
|
+
|
|
4
|
+
export const executeBrowserTask = async (prompt: string): Promise<string> => {
|
|
5
|
+
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
const child = spawn('browser-use', ['-p', prompt]);
|
|
8
|
+
let output = '';
|
|
9
|
+
|
|
10
|
+
// Stream stdout to console and collect it
|
|
11
|
+
child.stdout.on('data', (data) => {
|
|
12
|
+
const chunk = data.toString();
|
|
13
|
+
logger.trace({ message: 'Browser task output', output: chunk });
|
|
14
|
+
output += chunk;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Stream stderr to console
|
|
18
|
+
child.stderr.on('data', (data) => {
|
|
19
|
+
logger.error({ message: 'Browser task error', error: data.toString() });
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
child.on('error', (error) => {
|
|
23
|
+
reject(error);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
child.on('close', (code) => {
|
|
27
|
+
if (code !== 0) {
|
|
28
|
+
reject(new Error(`browser-use exited with code ${code}`));
|
|
29
|
+
} else {
|
|
30
|
+
resolve(output);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
4
34
|
};
|
|
@@ -6,7 +6,7 @@ import { logger } from '../utils/logger';
|
|
|
6
6
|
import { createHistoryStep } from '../utils/history';
|
|
7
7
|
import { AIMessage, ToolMessage } from '@langchain/core/messages';
|
|
8
8
|
import { executeBrowserTask } from '../browserTask/executeBrowserTask';
|
|
9
|
-
|
|
9
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
10
10
|
type AddBrowserTaskNodeParams = {
|
|
11
11
|
graph: PreCompiledGraph;
|
|
12
12
|
node: BrowserTaskNode;
|
|
@@ -15,10 +15,13 @@ type AddBrowserTaskNodeParams = {
|
|
|
15
15
|
export const addBrowserTaskNode = async ({ graph, node }: AddBrowserTaskNodeParams) => {
|
|
16
16
|
const callback: RunnableLike = async (state: typeof stateAnnotation.State) => {
|
|
17
17
|
logger.info({ message: `Executing browser task node ${node.displayName}`, prompt: node.prompt });
|
|
18
|
+
const toolCallId = uuidv4();
|
|
18
19
|
const toolCallingMessage = new AIMessage({
|
|
19
|
-
|
|
20
|
+
id: uuidv4(),
|
|
21
|
+
content: '',
|
|
20
22
|
tool_calls: [
|
|
21
23
|
{
|
|
24
|
+
id: toolCallId,
|
|
22
25
|
name: 'browser-task',
|
|
23
26
|
args: {
|
|
24
27
|
prompt: node.prompt,
|
|
@@ -32,10 +35,14 @@ export const addBrowserTaskNode = async ({ graph, node }: AddBrowserTaskNodePara
|
|
|
32
35
|
},
|
|
33
36
|
});
|
|
34
37
|
try {
|
|
35
|
-
const result = await executeBrowserTask(node.prompt);
|
|
38
|
+
const result = await executeBrowserTask(`Follow the instructions. Any retrieved data should be printed as string and not saved to a file.\n${node.prompt}`);
|
|
36
39
|
const toolCall = new ToolMessage({
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
id: uuidv4(),
|
|
41
|
+
content: JSON.stringify({
|
|
42
|
+
result: result.split(` Result: `)[1],
|
|
43
|
+
}),
|
|
44
|
+
name: 'browser-task',
|
|
45
|
+
tool_call_id: toolCallId,
|
|
39
46
|
status: 'success',
|
|
40
47
|
additional_kwargs: {
|
|
41
48
|
mindedMetadata: {
|
|
@@ -50,18 +57,18 @@ export const addBrowserTaskNode = async ({ graph, node }: AddBrowserTaskNodePara
|
|
|
50
57
|
nodeDisplayName: node.displayName,
|
|
51
58
|
raw: result,
|
|
52
59
|
}),
|
|
53
|
-
|
|
54
|
-
messages: [toolCallingMessage, toolCall],
|
|
55
|
-
}
|
|
60
|
+
messages: [toolCallingMessage, toolCall],
|
|
56
61
|
};
|
|
57
62
|
} catch (error: any) {
|
|
58
63
|
logger.error(`Error executing browser task node ${node.displayName}: ${error}`);
|
|
59
64
|
const toolCall = new ToolMessage({
|
|
65
|
+
id: uuidv4(),
|
|
60
66
|
content: JSON.stringify({
|
|
61
67
|
error: error instanceof Error ? error.message : error.toString()
|
|
62
68
|
}),
|
|
63
69
|
status: 'error',
|
|
64
|
-
|
|
70
|
+
name: 'browser-task',
|
|
71
|
+
tool_call_id: toolCallId,
|
|
65
72
|
additional_kwargs: {
|
|
66
73
|
mindedMetadata: {
|
|
67
74
|
nodeType: NodeType.BROWSER_TASK,
|
|
@@ -75,9 +82,7 @@ export const addBrowserTaskNode = async ({ graph, node }: AddBrowserTaskNodePara
|
|
|
75
82
|
nodeDisplayName: node.displayName,
|
|
76
83
|
raw: error,
|
|
77
84
|
}),
|
|
78
|
-
|
|
79
|
-
messages: [toolCallingMessage, toolCall],
|
|
80
|
-
}
|
|
85
|
+
messages: [toolCallingMessage, toolCall],
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
88
|
};
|