test-wuying-agentbay-sdk 0.13.1-beta.20251223203147 → 0.13.1-beta.20251224091333
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/index.cjs +350 -295
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +70 -119
- package/dist/index.d.ts +70 -119
- package/dist/index.mjs +350 -295
- package/dist/index.mjs.map +1 -1
- package/docs/api/common-features/advanced/agent.md +5 -3
- package/docs/api/common-features/advanced/mobile-use-agent.md +161 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -3872,41 +3872,35 @@ _chunk4IPTHWLMcjs.init_cjs_shims.call(void 0, );
|
|
|
3872
3872
|
|
|
3873
3873
|
// src/agent/agent.ts
|
|
3874
3874
|
_chunk4IPTHWLMcjs.init_cjs_shims.call(void 0, );
|
|
3875
|
-
var
|
|
3876
|
-
/**
|
|
3877
|
-
* Initialize an Computer Agent object.
|
|
3878
|
-
*
|
|
3879
|
-
* @param session - The Session instance that this Agent belongs to.
|
|
3880
|
-
*/
|
|
3875
|
+
var _BaseTaskAgent = class _BaseTaskAgent {
|
|
3881
3876
|
constructor(session) {
|
|
3882
3877
|
this.session = session;
|
|
3883
3878
|
}
|
|
3879
|
+
/**
|
|
3880
|
+
* Get the full MCP tool name based on prefix and action.
|
|
3881
|
+
*/
|
|
3882
|
+
getToolName(action) {
|
|
3883
|
+
const toolMap = {
|
|
3884
|
+
execute: "execute_task",
|
|
3885
|
+
get_status: "get_task_status",
|
|
3886
|
+
terminate: "terminate_task"
|
|
3887
|
+
};
|
|
3888
|
+
const baseName = toolMap[action] || action;
|
|
3889
|
+
if (this.toolPrefix) {
|
|
3890
|
+
return `${this.toolPrefix}_${baseName}`;
|
|
3891
|
+
}
|
|
3892
|
+
return baseName;
|
|
3893
|
+
}
|
|
3884
3894
|
/**
|
|
3885
3895
|
* Execute a specific task described in human language.
|
|
3886
|
-
*
|
|
3887
|
-
* @param task - Task description in human language.
|
|
3888
|
-
* @param maxTryTimes - Maximum number of retry attempts.
|
|
3889
|
-
* @returns ExecutionResult containing success status, task output, and error
|
|
3890
|
-
* message if any.
|
|
3891
|
-
*
|
|
3892
|
-
* @example
|
|
3893
|
-
* ```typescript
|
|
3894
|
-
* const agentBay = new AgentBay({ apiKey: 'your_api_key' });
|
|
3895
|
-
* const result = await agentBay.create({ imageId: 'windows_latest' });
|
|
3896
|
-
* if (result.success) {
|
|
3897
|
-
* const taskResult = await result.session.agent.computer.executeTask(
|
|
3898
|
-
* 'Open notepad',
|
|
3899
|
-
* 10
|
|
3900
|
-
* );
|
|
3901
|
-
* console.log(`Task status: ${taskResult.taskStatus}`);
|
|
3902
|
-
* await result.session.delete();
|
|
3903
|
-
* }
|
|
3904
|
-
* ```
|
|
3905
3896
|
*/
|
|
3906
3897
|
async executeTask(task, maxTryTimes) {
|
|
3907
3898
|
try {
|
|
3908
3899
|
const args = { task, max_try_times: maxTryTimes };
|
|
3909
|
-
const result = await this.session.callMcpTool(
|
|
3900
|
+
const result = await this.session.callMcpTool(
|
|
3901
|
+
this.getToolName("execute"),
|
|
3902
|
+
args
|
|
3903
|
+
);
|
|
3910
3904
|
if (!result.success) {
|
|
3911
3905
|
return {
|
|
3912
3906
|
requestId: result.requestId,
|
|
@@ -3930,7 +3924,7 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
3930
3924
|
taskResult: "Invalid execution response."
|
|
3931
3925
|
};
|
|
3932
3926
|
}
|
|
3933
|
-
const taskId = content.task_id;
|
|
3927
|
+
const taskId = content.taskId || content.task_id;
|
|
3934
3928
|
if (!taskId) {
|
|
3935
3929
|
return {
|
|
3936
3930
|
requestId: result.requestId,
|
|
@@ -3955,13 +3949,13 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
3955
3949
|
};
|
|
3956
3950
|
}
|
|
3957
3951
|
switch (query.taskStatus) {
|
|
3958
|
-
case "
|
|
3952
|
+
case "completed":
|
|
3959
3953
|
return {
|
|
3960
3954
|
requestId: query.requestId,
|
|
3961
3955
|
success: true,
|
|
3962
3956
|
errorMessage: "",
|
|
3963
3957
|
taskId,
|
|
3964
|
-
taskStatus: "
|
|
3958
|
+
taskStatus: "completed",
|
|
3965
3959
|
taskResult: query.taskProduct
|
|
3966
3960
|
};
|
|
3967
3961
|
case "failed":
|
|
@@ -3973,6 +3967,15 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
3973
3967
|
taskStatus: "failed",
|
|
3974
3968
|
taskResult: ""
|
|
3975
3969
|
};
|
|
3970
|
+
case "cancelled":
|
|
3971
|
+
return {
|
|
3972
|
+
requestId: query.requestId,
|
|
3973
|
+
success: false,
|
|
3974
|
+
errorMessage: query.errorMessage || "Task was cancelled.",
|
|
3975
|
+
taskId,
|
|
3976
|
+
taskStatus: "cancelled",
|
|
3977
|
+
taskResult: ""
|
|
3978
|
+
};
|
|
3976
3979
|
case "unsupported":
|
|
3977
3980
|
return {
|
|
3978
3981
|
requestId: query.requestId,
|
|
@@ -4008,32 +4011,20 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
4008
4011
|
}
|
|
4009
4012
|
/**
|
|
4010
4013
|
* Get the status of the task with the given task ID.
|
|
4011
|
-
*
|
|
4012
|
-
* @param taskId - Task ID
|
|
4013
|
-
* @returns QueryResult containing the task status
|
|
4014
|
-
*
|
|
4015
|
-
* @example
|
|
4016
|
-
* ```typescript
|
|
4017
|
-
* const agentBay = new AgentBay({ apiKey: 'your_api_key' });
|
|
4018
|
-
* const result = await agentBay.create({ imageId: 'windows_latest' });
|
|
4019
|
-
* if (result.success) {
|
|
4020
|
-
* const taskResult = await result.session.agent.computer.executeTask('Open
|
|
4021
|
-
* calculator', 10); const statusResult = await
|
|
4022
|
-
* result.session.agent.computer.getTaskStatus(taskResult.taskId);
|
|
4023
|
-
* console.log(`Status:
|
|
4024
|
-
* ${JSON.parse(statusResult.output).status}`); await result.session.delete();
|
|
4025
|
-
* }
|
|
4026
|
-
* ```
|
|
4027
4014
|
*/
|
|
4028
4015
|
async getTaskStatus(taskId) {
|
|
4029
4016
|
try {
|
|
4030
4017
|
const args = { task_id: taskId };
|
|
4031
|
-
const result = await this.session.callMcpTool(
|
|
4018
|
+
const result = await this.session.callMcpTool(
|
|
4019
|
+
this.getToolName("get_status"),
|
|
4020
|
+
args
|
|
4021
|
+
);
|
|
4032
4022
|
if (!result.success) {
|
|
4033
4023
|
return {
|
|
4034
4024
|
requestId: result.requestId,
|
|
4035
4025
|
success: false,
|
|
4036
4026
|
errorMessage: result.errorMessage,
|
|
4027
|
+
taskId,
|
|
4037
4028
|
taskAction: "",
|
|
4038
4029
|
taskProduct: "",
|
|
4039
4030
|
taskStatus: "failed"
|
|
@@ -4042,19 +4033,27 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
4042
4033
|
let queryResult;
|
|
4043
4034
|
try {
|
|
4044
4035
|
queryResult = JSON.parse(result.data);
|
|
4036
|
+
const contentTaskId = queryResult.taskId || queryResult.task_id || taskId;
|
|
4037
|
+
const taskProduct = queryResult.result || queryResult.product || "";
|
|
4038
|
+
const stream = Array.isArray(queryResult.stream) ? queryResult.stream : void 0;
|
|
4039
|
+
const error = queryResult.error || void 0;
|
|
4045
4040
|
return {
|
|
4046
4041
|
requestId: result.requestId,
|
|
4047
4042
|
success: true,
|
|
4048
4043
|
errorMessage: "",
|
|
4044
|
+
taskId: contentTaskId,
|
|
4049
4045
|
taskAction: queryResult.action || "",
|
|
4050
|
-
taskProduct
|
|
4051
|
-
taskStatus: queryResult.status || "
|
|
4046
|
+
taskProduct,
|
|
4047
|
+
taskStatus: queryResult.status || "completed",
|
|
4048
|
+
stream,
|
|
4049
|
+
error
|
|
4052
4050
|
};
|
|
4053
4051
|
} catch (error) {
|
|
4054
4052
|
return {
|
|
4055
4053
|
requestId: result.requestId,
|
|
4056
4054
|
success: false,
|
|
4057
4055
|
errorMessage: `Failed to get task status: ${error}`,
|
|
4056
|
+
taskId,
|
|
4058
4057
|
taskAction: "",
|
|
4059
4058
|
taskProduct: "",
|
|
4060
4059
|
taskStatus: "failed"
|
|
@@ -4065,6 +4064,7 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
4065
4064
|
requestId: "",
|
|
4066
4065
|
success: false,
|
|
4067
4066
|
errorMessage: `Failed to get task status: ${error}`,
|
|
4067
|
+
taskId,
|
|
4068
4068
|
taskAction: "",
|
|
4069
4069
|
taskProduct: "",
|
|
4070
4070
|
taskStatus: "failed"
|
|
@@ -4073,33 +4073,15 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
4073
4073
|
}
|
|
4074
4074
|
/**
|
|
4075
4075
|
* Terminate a task with a specified task ID.
|
|
4076
|
-
*
|
|
4077
|
-
* @param taskId - The ID of the running task.
|
|
4078
|
-
* @returns ExecutionResult containing success status, task output, and
|
|
4079
|
-
* error message if any.
|
|
4080
|
-
*
|
|
4081
|
-
* @example
|
|
4082
|
-
* ```typescript
|
|
4083
|
-
* const agentBay = new AgentBay({ apiKey: 'your_api_key' });
|
|
4084
|
-
* const result = await agentBay.create({ imageId: 'windows_latest' });
|
|
4085
|
-
* if (result.success) {
|
|
4086
|
-
* const taskResult = await result.session.agent.computer.executeTask(
|
|
4087
|
-
* 'Open notepad',
|
|
4088
|
-
* 5
|
|
4089
|
-
* );
|
|
4090
|
-
* const terminateResult = await result.session.agent.computer.terminateTask(
|
|
4091
|
-
* taskResult.taskId
|
|
4092
|
-
* );
|
|
4093
|
-
* console.log(`Terminated: ${terminateResult.taskStatus}`);
|
|
4094
|
-
* await result.session.delete();
|
|
4095
|
-
* }
|
|
4096
|
-
* ```
|
|
4097
4076
|
*/
|
|
4098
4077
|
async terminateTask(taskId) {
|
|
4099
4078
|
logDebug("Terminating task");
|
|
4100
4079
|
try {
|
|
4101
4080
|
const args = { task_id: taskId };
|
|
4102
|
-
const result = await this.session.callMcpTool(
|
|
4081
|
+
const result = await this.session.callMcpTool(
|
|
4082
|
+
this.getToolName("terminate"),
|
|
4083
|
+
args
|
|
4084
|
+
);
|
|
4103
4085
|
let content;
|
|
4104
4086
|
try {
|
|
4105
4087
|
content = JSON.parse(result.data);
|
|
@@ -4113,8 +4095,8 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
4113
4095
|
taskResult: ""
|
|
4114
4096
|
};
|
|
4115
4097
|
}
|
|
4116
|
-
const terminatedTaskId = content.task_id || taskId;
|
|
4117
|
-
const status = content.status || "
|
|
4098
|
+
const terminatedTaskId = content.taskId || content.task_id || taskId;
|
|
4099
|
+
const status = content.status || "cancelling";
|
|
4118
4100
|
if (result.success) {
|
|
4119
4101
|
return {
|
|
4120
4102
|
requestId: result.requestId,
|
|
@@ -4145,17 +4127,20 @@ var _ComputerUseAgent = class _ComputerUseAgent {
|
|
|
4145
4127
|
}
|
|
4146
4128
|
}
|
|
4147
4129
|
};
|
|
4130
|
+
_chunk4IPTHWLMcjs.__name.call(void 0, _BaseTaskAgent, "BaseTaskAgent");
|
|
4131
|
+
var BaseTaskAgent = _BaseTaskAgent;
|
|
4132
|
+
var _ComputerUseAgent = class _ComputerUseAgent extends BaseTaskAgent {
|
|
4133
|
+
constructor() {
|
|
4134
|
+
super(...arguments);
|
|
4135
|
+
this.toolPrefix = "flux";
|
|
4136
|
+
}
|
|
4137
|
+
};
|
|
4148
4138
|
_chunk4IPTHWLMcjs.__name.call(void 0, _ComputerUseAgent, "ComputerUseAgent");
|
|
4149
4139
|
var ComputerUseAgent = _ComputerUseAgent;
|
|
4150
|
-
var _BrowserUseAgent = class _BrowserUseAgent {
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
*
|
|
4155
|
-
* @param session - The Session instance that this Agent belongs to.
|
|
4156
|
-
*/
|
|
4157
|
-
constructor(session) {
|
|
4158
|
-
this.session = session;
|
|
4140
|
+
var _BrowserUseAgent = class _BrowserUseAgent extends BaseTaskAgent {
|
|
4141
|
+
constructor() {
|
|
4142
|
+
super(...arguments);
|
|
4143
|
+
this.toolPrefix = "browser_use";
|
|
4159
4144
|
}
|
|
4160
4145
|
/**
|
|
4161
4146
|
* Initialize the browser agent with specific options.
|
|
@@ -4200,276 +4185,345 @@ var _BrowserUseAgent = class _BrowserUseAgent {
|
|
|
4200
4185
|
};
|
|
4201
4186
|
}
|
|
4202
4187
|
}
|
|
4188
|
+
};
|
|
4189
|
+
_chunk4IPTHWLMcjs.__name.call(void 0, _BrowserUseAgent, "BrowserUseAgent");
|
|
4190
|
+
var BrowserUseAgent = _BrowserUseAgent;
|
|
4191
|
+
var _MobileUseAgent = class _MobileUseAgent extends BaseTaskAgent {
|
|
4192
|
+
constructor() {
|
|
4193
|
+
super(...arguments);
|
|
4194
|
+
this.toolPrefix = "";
|
|
4195
|
+
}
|
|
4203
4196
|
/**
|
|
4204
|
-
* Execute a
|
|
4197
|
+
* Execute a task in human language without waiting for completion
|
|
4198
|
+
* (non-blocking). This is a fire-and-return interface that immediately
|
|
4199
|
+
* provides a task ID. Call getTaskStatus to check the task status.
|
|
4205
4200
|
*
|
|
4206
4201
|
* @param task - Task description in human language.
|
|
4207
|
-
* @param
|
|
4208
|
-
*
|
|
4209
|
-
*
|
|
4202
|
+
* @param maxSteps - Maximum number of steps (clicks/swipes/etc.) allowed.
|
|
4203
|
+
* Used to prevent infinite loops or excessive resource
|
|
4204
|
+
* consumption. Default is 50.
|
|
4205
|
+
* @param maxStepRetries - Maximum retry times for MCP tool call failures
|
|
4206
|
+
* at SDK level. Used to retry when callMcpTool fails
|
|
4207
|
+
* (e.g., network errors, timeouts). Default is 3.
|
|
4208
|
+
* @returns ExecutionResult containing success status, task ID, task status,
|
|
4209
|
+
* and error message if any.
|
|
4210
4210
|
*
|
|
4211
4211
|
* @example
|
|
4212
4212
|
* ```typescript
|
|
4213
4213
|
* const agentBay = new AgentBay({ apiKey: 'your_api_key' });
|
|
4214
|
-
* const result = await agentBay.create({ imageId: '
|
|
4214
|
+
* const result = await agentBay.create({ imageId: 'mobile_latest' });
|
|
4215
4215
|
* if (result.success) {
|
|
4216
|
-
* const
|
|
4217
|
-
* '
|
|
4218
|
-
* 10
|
|
4216
|
+
* const execResult = await result.session.agent.mobile.executeTask(
|
|
4217
|
+
* 'Open WeChat app', 100, 5
|
|
4219
4218
|
* );
|
|
4220
|
-
* console.log(`Task
|
|
4219
|
+
* console.log(`Task ID: ${execResult.taskId}`);
|
|
4221
4220
|
* await result.session.delete();
|
|
4222
4221
|
* }
|
|
4223
4222
|
* ```
|
|
4224
4223
|
*/
|
|
4225
|
-
async executeTask(task,
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
errorMessage: result.errorMessage,
|
|
4234
|
-
taskStatus: "failed",
|
|
4235
|
-
taskId: "",
|
|
4236
|
-
taskResult: "Task Failed"
|
|
4237
|
-
};
|
|
4238
|
-
}
|
|
4239
|
-
let content;
|
|
4224
|
+
async executeTask(task, maxSteps = 50, maxStepRetries = 3) {
|
|
4225
|
+
const args = {
|
|
4226
|
+
task,
|
|
4227
|
+
max_steps: maxSteps
|
|
4228
|
+
};
|
|
4229
|
+
let lastError;
|
|
4230
|
+
let lastRequestId = "";
|
|
4231
|
+
for (let attempt = 0; attempt < maxStepRetries; attempt++) {
|
|
4240
4232
|
try {
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
}
|
|
4252
|
-
const taskId = content.task_id;
|
|
4253
|
-
if (!taskId) {
|
|
4254
|
-
return {
|
|
4255
|
-
requestId: result.requestId,
|
|
4256
|
-
success: false,
|
|
4257
|
-
errorMessage: "Task ID not found in response",
|
|
4258
|
-
taskStatus: "failed",
|
|
4259
|
-
taskId: "",
|
|
4260
|
-
taskResult: "Invalid task ID."
|
|
4261
|
-
};
|
|
4262
|
-
}
|
|
4263
|
-
let triedTime = 0;
|
|
4264
|
-
while (triedTime < maxTryTimes) {
|
|
4265
|
-
const query = await this.getTaskStatus(taskId);
|
|
4266
|
-
if (!query.success) {
|
|
4267
|
-
return {
|
|
4268
|
-
requestId: query.requestId,
|
|
4269
|
-
success: false,
|
|
4270
|
-
errorMessage: query.errorMessage,
|
|
4271
|
-
taskStatus: "failed",
|
|
4272
|
-
taskId,
|
|
4273
|
-
taskResult: ""
|
|
4274
|
-
};
|
|
4275
|
-
}
|
|
4276
|
-
switch (query.taskStatus) {
|
|
4277
|
-
case "finished":
|
|
4233
|
+
const result = await this.session.callMcpTool(
|
|
4234
|
+
this.getToolName("execute"),
|
|
4235
|
+
args
|
|
4236
|
+
);
|
|
4237
|
+
lastRequestId = result.requestId;
|
|
4238
|
+
if (result.success) {
|
|
4239
|
+
let content;
|
|
4240
|
+
try {
|
|
4241
|
+
content = JSON.parse(result.data);
|
|
4242
|
+
} catch (err) {
|
|
4278
4243
|
return {
|
|
4279
|
-
requestId:
|
|
4280
|
-
success:
|
|
4281
|
-
errorMessage:
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
taskResult:
|
|
4244
|
+
requestId: result.requestId,
|
|
4245
|
+
success: false,
|
|
4246
|
+
errorMessage: `Failed to parse response: ${err}`,
|
|
4247
|
+
taskStatus: "failed",
|
|
4248
|
+
taskId: "",
|
|
4249
|
+
taskResult: "Invalid execution response."
|
|
4285
4250
|
};
|
|
4286
|
-
|
|
4251
|
+
}
|
|
4252
|
+
const taskId = content.taskId || content.task_id;
|
|
4253
|
+
if (!taskId) {
|
|
4287
4254
|
return {
|
|
4288
|
-
requestId:
|
|
4255
|
+
requestId: result.requestId,
|
|
4289
4256
|
success: false,
|
|
4290
|
-
errorMessage:
|
|
4291
|
-
taskId,
|
|
4257
|
+
errorMessage: "Task ID not found in response",
|
|
4292
4258
|
taskStatus: "failed",
|
|
4293
|
-
|
|
4259
|
+
taskId: "",
|
|
4260
|
+
taskResult: "Invalid task ID."
|
|
4294
4261
|
};
|
|
4295
|
-
|
|
4262
|
+
}
|
|
4263
|
+
return {
|
|
4264
|
+
requestId: result.requestId,
|
|
4265
|
+
success: true,
|
|
4266
|
+
errorMessage: "",
|
|
4267
|
+
taskId,
|
|
4268
|
+
taskStatus: "running",
|
|
4269
|
+
taskResult: ""
|
|
4270
|
+
};
|
|
4271
|
+
} else {
|
|
4272
|
+
lastError = result.errorMessage || "Failed to execute task";
|
|
4273
|
+
if (attempt < maxStepRetries - 1) {
|
|
4274
|
+
logDebug(
|
|
4275
|
+
`Attempt ${attempt + 1}/${maxStepRetries} failed, retrying...`
|
|
4276
|
+
);
|
|
4277
|
+
await new Promise((resolve2) => setTimeout(resolve2, 1e3));
|
|
4278
|
+
continue;
|
|
4279
|
+
} else {
|
|
4296
4280
|
return {
|
|
4297
|
-
requestId:
|
|
4281
|
+
requestId: result.requestId,
|
|
4298
4282
|
success: false,
|
|
4299
|
-
errorMessage:
|
|
4300
|
-
|
|
4301
|
-
|
|
4302
|
-
taskResult: ""
|
|
4283
|
+
errorMessage: lastError,
|
|
4284
|
+
taskStatus: "failed",
|
|
4285
|
+
taskId: "",
|
|
4286
|
+
taskResult: "Task Failed"
|
|
4303
4287
|
};
|
|
4288
|
+
}
|
|
4289
|
+
}
|
|
4290
|
+
} catch (error) {
|
|
4291
|
+
lastError = `Failed to execute: ${error}`;
|
|
4292
|
+
if (attempt < maxStepRetries - 1) {
|
|
4293
|
+
logDebug(
|
|
4294
|
+
`Attempt ${attempt + 1}/${maxStepRetries} raised exception, retrying...`
|
|
4295
|
+
);
|
|
4296
|
+
await new Promise((resolve2) => setTimeout(resolve2, 1e3));
|
|
4297
|
+
continue;
|
|
4298
|
+
} else {
|
|
4299
|
+
return {
|
|
4300
|
+
requestId: lastRequestId,
|
|
4301
|
+
success: false,
|
|
4302
|
+
errorMessage: lastError,
|
|
4303
|
+
taskStatus: "failed",
|
|
4304
|
+
taskId: "",
|
|
4305
|
+
taskResult: "Task Failed"
|
|
4306
|
+
};
|
|
4304
4307
|
}
|
|
4305
|
-
logDebug(`Task ${taskId} is still running, please wait for a while.`);
|
|
4306
|
-
await new Promise((resolve2) => setTimeout(resolve2, 3e3));
|
|
4307
|
-
triedTime++;
|
|
4308
4308
|
}
|
|
4309
|
-
return {
|
|
4310
|
-
requestId: result.requestId,
|
|
4311
|
-
success: false,
|
|
4312
|
-
errorMessage: "Task execution timed out",
|
|
4313
|
-
taskStatus: "timeout",
|
|
4314
|
-
taskId,
|
|
4315
|
-
taskResult: "Task Timed Out"
|
|
4316
|
-
};
|
|
4317
|
-
} catch (error) {
|
|
4318
|
-
return {
|
|
4319
|
-
requestId: "",
|
|
4320
|
-
success: false,
|
|
4321
|
-
errorMessage: `Failed to execute: ${error}`,
|
|
4322
|
-
taskStatus: "failed",
|
|
4323
|
-
taskId: "",
|
|
4324
|
-
taskResult: "Task Failed"
|
|
4325
|
-
};
|
|
4326
4309
|
}
|
|
4310
|
+
return {
|
|
4311
|
+
requestId: lastRequestId,
|
|
4312
|
+
success: false,
|
|
4313
|
+
errorMessage: `Failed after ${maxStepRetries} attempts: ${lastError || "Unknown error"}`,
|
|
4314
|
+
taskStatus: "failed",
|
|
4315
|
+
taskId: "",
|
|
4316
|
+
taskResult: "Task Failed"
|
|
4317
|
+
};
|
|
4327
4318
|
}
|
|
4328
4319
|
/**
|
|
4329
|
-
*
|
|
4320
|
+
* Execute a specific task described in human language synchronously.
|
|
4321
|
+
* This is a synchronous interface that blocks until the task is completed or
|
|
4322
|
+
* an error occurs, or timeout happens. The default polling interval is
|
|
4323
|
+
* 3 seconds.
|
|
4330
4324
|
*
|
|
4331
|
-
* @param
|
|
4332
|
-
* @
|
|
4325
|
+
* @param task - Task description in human language.
|
|
4326
|
+
* @param maxSteps - Maximum number of steps (clicks/swipes/etc.) allowed.
|
|
4327
|
+
* Used to prevent infinite loops or excessive resource
|
|
4328
|
+
* consumption. Default is 50.
|
|
4329
|
+
* @param maxStepRetries - Maximum retry times for MCP tool call failures
|
|
4330
|
+
* at SDK level. Used to retry when callMcpTool fails
|
|
4331
|
+
* (e.g., network errors, timeouts). Default is 3.
|
|
4332
|
+
* @param maxTryTimes - Maximum number of polling attempts (each 3 seconds).
|
|
4333
|
+
* Used to control how long to wait for task completion.
|
|
4334
|
+
* Default is 300 (about 15 minutes).
|
|
4335
|
+
* @returns ExecutionResult containing success status, task ID, task status,
|
|
4336
|
+
* and error message if any.
|
|
4333
4337
|
*
|
|
4334
4338
|
* @example
|
|
4335
4339
|
* ```typescript
|
|
4336
4340
|
* const agentBay = new AgentBay({ apiKey: 'your_api_key' });
|
|
4337
|
-
* const result = await agentBay.create({ imageId: '
|
|
4341
|
+
* const result = await agentBay.create({ imageId: 'mobile_latest' });
|
|
4338
4342
|
* if (result.success) {
|
|
4339
|
-
* const
|
|
4340
|
-
* '
|
|
4341
|
-
* 10
|
|
4343
|
+
* const execResult = await result.session.agent.mobile.executeTaskAndWait(
|
|
4344
|
+
* 'Open WeChat app', 100, 3, 200
|
|
4342
4345
|
* );
|
|
4343
|
-
*
|
|
4344
|
-
* taskResult.taskId
|
|
4345
|
-
* );
|
|
4346
|
-
* console.log(`Status: ${statusResult.taskStatus}`);
|
|
4346
|
+
* console.log(`Task result: ${execResult.taskResult}`);
|
|
4347
4347
|
* await result.session.delete();
|
|
4348
4348
|
* }
|
|
4349
4349
|
* ```
|
|
4350
4350
|
*/
|
|
4351
|
-
async
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
taskAction: "",
|
|
4361
|
-
taskProduct: "",
|
|
4362
|
-
taskStatus: "failed"
|
|
4363
|
-
};
|
|
4364
|
-
}
|
|
4365
|
-
let queryResult;
|
|
4351
|
+
async executeTaskAndWait(task, maxSteps = 50, maxStepRetries = 3, maxTryTimes = 300) {
|
|
4352
|
+
const args = {
|
|
4353
|
+
task,
|
|
4354
|
+
max_steps: maxSteps
|
|
4355
|
+
};
|
|
4356
|
+
let taskId;
|
|
4357
|
+
let lastError;
|
|
4358
|
+
let lastRequestId = "";
|
|
4359
|
+
for (let attempt = 0; attempt < maxStepRetries; attempt++) {
|
|
4366
4360
|
try {
|
|
4367
|
-
|
|
4368
|
-
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
|
|
4374
|
-
|
|
4375
|
-
|
|
4361
|
+
const result = await this.session.callMcpTool(
|
|
4362
|
+
this.getToolName("execute"),
|
|
4363
|
+
args
|
|
4364
|
+
);
|
|
4365
|
+
lastRequestId = result.requestId;
|
|
4366
|
+
if (result.success) {
|
|
4367
|
+
let content;
|
|
4368
|
+
try {
|
|
4369
|
+
content = JSON.parse(result.data);
|
|
4370
|
+
} catch (err) {
|
|
4371
|
+
return {
|
|
4372
|
+
requestId: result.requestId,
|
|
4373
|
+
success: false,
|
|
4374
|
+
errorMessage: `Failed to parse response: ${err}`,
|
|
4375
|
+
taskStatus: "failed",
|
|
4376
|
+
taskId: "",
|
|
4377
|
+
taskResult: "Invalid execution response."
|
|
4378
|
+
};
|
|
4379
|
+
}
|
|
4380
|
+
taskId = content.taskId || content.task_id;
|
|
4381
|
+
if (!taskId) {
|
|
4382
|
+
return {
|
|
4383
|
+
requestId: result.requestId,
|
|
4384
|
+
success: false,
|
|
4385
|
+
errorMessage: "Task ID not found in response",
|
|
4386
|
+
taskStatus: "failed",
|
|
4387
|
+
taskId: "",
|
|
4388
|
+
taskResult: "Invalid task ID."
|
|
4389
|
+
};
|
|
4390
|
+
}
|
|
4391
|
+
break;
|
|
4392
|
+
} else {
|
|
4393
|
+
lastError = result.errorMessage || "Failed to execute task";
|
|
4394
|
+
if (attempt < maxStepRetries - 1) {
|
|
4395
|
+
logDebug(
|
|
4396
|
+
`Attempt ${attempt + 1}/${maxStepRetries} failed, retrying...`
|
|
4397
|
+
);
|
|
4398
|
+
await new Promise((resolve2) => setTimeout(resolve2, 1e3));
|
|
4399
|
+
continue;
|
|
4400
|
+
} else {
|
|
4401
|
+
return {
|
|
4402
|
+
requestId: result.requestId,
|
|
4403
|
+
success: false,
|
|
4404
|
+
errorMessage: lastError,
|
|
4405
|
+
taskStatus: "failed",
|
|
4406
|
+
taskId: "",
|
|
4407
|
+
taskResult: "Task Failed"
|
|
4408
|
+
};
|
|
4409
|
+
}
|
|
4410
|
+
}
|
|
4376
4411
|
} catch (error) {
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
}
|
|
4412
|
+
lastError = `Failed to execute: ${error}`;
|
|
4413
|
+
if (attempt < maxStepRetries - 1) {
|
|
4414
|
+
logDebug(
|
|
4415
|
+
`Attempt ${attempt + 1}/${maxStepRetries} raised exception, retrying...`
|
|
4416
|
+
);
|
|
4417
|
+
await new Promise((resolve2) => setTimeout(resolve2, 1e3));
|
|
4418
|
+
continue;
|
|
4419
|
+
} else {
|
|
4420
|
+
return {
|
|
4421
|
+
requestId: lastRequestId,
|
|
4422
|
+
success: false,
|
|
4423
|
+
errorMessage: lastError,
|
|
4424
|
+
taskStatus: "failed",
|
|
4425
|
+
taskId: "",
|
|
4426
|
+
taskResult: "Task Failed"
|
|
4427
|
+
};
|
|
4428
|
+
}
|
|
4385
4429
|
}
|
|
4386
|
-
}
|
|
4430
|
+
}
|
|
4431
|
+
if (!taskId) {
|
|
4387
4432
|
return {
|
|
4388
|
-
requestId:
|
|
4433
|
+
requestId: lastRequestId,
|
|
4389
4434
|
success: false,
|
|
4390
|
-
errorMessage: `Failed to get
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4435
|
+
errorMessage: `Failed to get task_id after ${maxStepRetries} attempts: ${lastError || "Unknown error"}`,
|
|
4436
|
+
taskStatus: "failed",
|
|
4437
|
+
taskId: "",
|
|
4438
|
+
taskResult: "Task Failed"
|
|
4394
4439
|
};
|
|
4395
4440
|
}
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
* @returns ExecutionResult containing success status, task output, and
|
|
4402
|
-
* error message if any.
|
|
4403
|
-
*
|
|
4404
|
-
* @example
|
|
4405
|
-
* ```typescript
|
|
4406
|
-
* const agentBay = new AgentBay({ apiKey: 'your_api_key' });
|
|
4407
|
-
* const result = await agentBay.create({ imageId: 'linux_latest' });
|
|
4408
|
-
* if (result.success) {
|
|
4409
|
-
* const taskResult = await result.session.agent.browser.executeTask(
|
|
4410
|
-
* 'Navigate to baidu and query the weather of Shanghai',
|
|
4411
|
-
* 10
|
|
4412
|
-
* );
|
|
4413
|
-
* const terminateResult = await result.session.agent.browser.terminateTask(
|
|
4414
|
-
* taskResult.taskId
|
|
4415
|
-
* );
|
|
4416
|
-
* console.log(`Terminated: ${terminateResult.taskStatus}`);
|
|
4417
|
-
* await result.session.delete();
|
|
4418
|
-
* }
|
|
4419
|
-
* ```
|
|
4420
|
-
*/
|
|
4421
|
-
async terminateTask(taskId) {
|
|
4422
|
-
logDebug("Terminating task");
|
|
4423
|
-
try {
|
|
4424
|
-
const args = { task_id: taskId };
|
|
4425
|
-
const result = await this.session.callMcpTool("browser_use_terminate_task", args);
|
|
4426
|
-
let content;
|
|
4427
|
-
try {
|
|
4428
|
-
content = JSON.parse(result.data);
|
|
4429
|
-
} catch (err) {
|
|
4441
|
+
let triedTime = 0;
|
|
4442
|
+
const processedTimestamps = /* @__PURE__ */ new Set();
|
|
4443
|
+
while (triedTime < maxTryTimes) {
|
|
4444
|
+
const query = await this.getTaskStatus(taskId);
|
|
4445
|
+
if (!query.success) {
|
|
4430
4446
|
return {
|
|
4431
|
-
requestId:
|
|
4447
|
+
requestId: query.requestId,
|
|
4432
4448
|
success: false,
|
|
4433
|
-
errorMessage:
|
|
4434
|
-
taskId,
|
|
4449
|
+
errorMessage: query.errorMessage,
|
|
4435
4450
|
taskStatus: "failed",
|
|
4451
|
+
taskId,
|
|
4436
4452
|
taskResult: ""
|
|
4437
4453
|
};
|
|
4438
4454
|
}
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
-
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
4455
|
+
if (query.stream) {
|
|
4456
|
+
for (const streamItem of query.stream) {
|
|
4457
|
+
const timestamp = streamItem.timestamp_ms;
|
|
4458
|
+
if (timestamp !== void 0 && !processedTimestamps.has(timestamp)) {
|
|
4459
|
+
processedTimestamps.add(timestamp);
|
|
4460
|
+
const content = streamItem.content || "";
|
|
4461
|
+
const reasoning = streamItem.reasoning || "";
|
|
4462
|
+
if (content) {
|
|
4463
|
+
process.stdout.write(content);
|
|
4464
|
+
}
|
|
4465
|
+
if (reasoning) {
|
|
4466
|
+
}
|
|
4467
|
+
}
|
|
4468
|
+
}
|
|
4450
4469
|
}
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4470
|
+
if (query.error) {
|
|
4471
|
+
}
|
|
4472
|
+
switch (query.taskStatus) {
|
|
4473
|
+
case "completed":
|
|
4474
|
+
return {
|
|
4475
|
+
requestId: query.requestId,
|
|
4476
|
+
success: true,
|
|
4477
|
+
errorMessage: "",
|
|
4478
|
+
taskId,
|
|
4479
|
+
taskStatus: "completed",
|
|
4480
|
+
taskResult: query.taskProduct
|
|
4481
|
+
};
|
|
4482
|
+
case "failed":
|
|
4483
|
+
return {
|
|
4484
|
+
requestId: query.requestId,
|
|
4485
|
+
success: false,
|
|
4486
|
+
errorMessage: query.errorMessage || "Failed to execute task.",
|
|
4487
|
+
taskId,
|
|
4488
|
+
taskStatus: "failed",
|
|
4489
|
+
taskResult: ""
|
|
4490
|
+
};
|
|
4491
|
+
case "cancelled":
|
|
4492
|
+
return {
|
|
4493
|
+
requestId: query.requestId,
|
|
4494
|
+
success: false,
|
|
4495
|
+
errorMessage: query.errorMessage || "Task was cancelled.",
|
|
4496
|
+
taskId,
|
|
4497
|
+
taskStatus: "cancelled",
|
|
4498
|
+
taskResult: ""
|
|
4499
|
+
};
|
|
4500
|
+
case "unsupported":
|
|
4501
|
+
return {
|
|
4502
|
+
requestId: query.requestId,
|
|
4503
|
+
success: false,
|
|
4504
|
+
errorMessage: query.errorMessage || "Unsupported task.",
|
|
4505
|
+
taskId,
|
|
4506
|
+
taskStatus: "unsupported",
|
|
4507
|
+
taskResult: ""
|
|
4508
|
+
};
|
|
4509
|
+
}
|
|
4510
|
+
logDebug(`\u23F3 Task ${taskId} running \u{1F680}: ${query.taskAction}.`);
|
|
4511
|
+
await new Promise((resolve2) => setTimeout(resolve2, 3e3));
|
|
4512
|
+
triedTime++;
|
|
4468
4513
|
}
|
|
4514
|
+
logDebug("\u26A0\uFE0F task execution timeout!");
|
|
4515
|
+
return {
|
|
4516
|
+
requestId: lastRequestId,
|
|
4517
|
+
success: false,
|
|
4518
|
+
errorMessage: "Task timeout.",
|
|
4519
|
+
taskStatus: "failed",
|
|
4520
|
+
taskId,
|
|
4521
|
+
taskResult: "Task timeout."
|
|
4522
|
+
};
|
|
4469
4523
|
}
|
|
4470
4524
|
};
|
|
4471
|
-
_chunk4IPTHWLMcjs.__name.call(void 0,
|
|
4472
|
-
var
|
|
4525
|
+
_chunk4IPTHWLMcjs.__name.call(void 0, _MobileUseAgent, "MobileUseAgent");
|
|
4526
|
+
var MobileUseAgent = _MobileUseAgent;
|
|
4473
4527
|
var _Agent = class _Agent {
|
|
4474
4528
|
/**
|
|
4475
4529
|
* Initialize an Agent object.
|
|
@@ -4479,6 +4533,7 @@ var _Agent = class _Agent {
|
|
|
4479
4533
|
constructor(session) {
|
|
4480
4534
|
this.computer = new ComputerUseAgent(session);
|
|
4481
4535
|
this.browser = new BrowserUseAgent(session);
|
|
4536
|
+
this.mobile = new MobileUseAgent(session);
|
|
4482
4537
|
}
|
|
4483
4538
|
};
|
|
4484
4539
|
_chunk4IPTHWLMcjs.__name.call(void 0, _Agent, "Agent");
|