@beeos-ai/device-agent 0.9.5 → 0.9.8
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/config/schema.js +14 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/inbound/cli/main.js +2 -2
- package/dist/inbound/cli/run-command.js +13 -1
- package/dist/inbound/cli/run-command.js.map +1 -1
- package/dist/messaging/token-provider.d.ts +15 -14
- package/dist/messaging/token-provider.js +16 -16
- package/dist/messaging/token-provider.js.map +1 -1
- package/dist/model/adapters/guiowl.js +3 -2
- package/dist/model/adapters/guiowl.js.map +1 -1
- package/dist/model/adapters/maiui.js +80 -53
- package/dist/model/adapters/maiui.js.map +1 -1
- package/dist/model/adapters/qwenvl.js +147 -51
- package/dist/model/adapters/qwenvl.js.map +1 -1
- package/dist/model/adapters/tool-call.js +13 -3
- package/dist/model/adapters/tool-call.js.map +1 -1
- package/dist/model/adapters/uitars.js +80 -84
- package/dist/model/adapters/uitars.js.map +1 -1
- package/dist/plugins/message-bus/busy-reply.d.ts +5 -5
- package/dist/plugins/message-bus/busy-reply.js +30 -9
- package/dist/plugins/message-bus/busy-reply.js.map +1 -1
- package/dist/plugins/message-bus/cancel.d.ts +5 -11
- package/dist/plugins/message-bus/cancel.js +8 -14
- package/dist/plugins/message-bus/cancel.js.map +1 -1
- package/dist/plugins/message-bus/inbound.d.ts +18 -25
- package/dist/plugins/message-bus/inbound.js +23 -55
- package/dist/plugins/message-bus/inbound.js.map +1 -1
- package/dist/plugins/message-bus/index.d.ts +25 -44
- package/dist/plugins/message-bus/index.js +81 -111
- package/dist/plugins/message-bus/index.js.map +1 -1
- package/dist/plugins/message-bus/ms-channel-notifier.d.ts +24 -37
- package/dist/plugins/message-bus/ms-channel-notifier.js +39 -59
- package/dist/plugins/message-bus/ms-channel-notifier.js.map +1 -1
- package/dist/resources/parsers.js +17 -0
- package/dist/resources/parsers.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,84 +1,168 @@
|
|
|
1
1
|
import { ModelAdapter, registerAdapter } from "./base.js";
|
|
2
2
|
import { parseToolCall } from "./tool-call.js";
|
|
3
3
|
// Qwen-VL adapter
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
// Aligned with ClawGUI prompts_qwenvl.py (PHONE_USE_QWEN_CN / PHONE_USE_QWEN_EN)
|
|
5
|
+
//
|
|
6
|
+
// Message structure (mirrors ClawGUI exactly):
|
|
7
|
+
// Always 2 messages: [system(XML tools schema), user(text then image)]
|
|
8
|
+
// No multi-turn accumulation; action history injected as text.
|
|
9
|
+
//
|
|
10
|
+
// Output format expected:
|
|
11
|
+
// Thought: <one sentence>
|
|
12
|
+
// Action: <one sentence>
|
|
13
|
+
// <tool_call>{"name":"mobile_use","arguments":{...}}</tool_call>
|
|
14
|
+
//
|
|
15
|
+
// Coordinates: 0–999 normalized (resolution declared as 999x999 in schema)
|
|
16
|
+
const TOOL_SCHEMA = JSON.stringify({
|
|
17
|
+
type: "function",
|
|
18
|
+
function: {
|
|
19
|
+
name_for_human: "mobile_use",
|
|
20
|
+
name: "mobile_use",
|
|
21
|
+
description: "Use a touchscreen to interact with a mobile device, and take screenshots.\n" +
|
|
22
|
+
"* This is an interface to a mobile device with touchscreen. You can perform actions like clicking, typing, swiping, etc.\n" +
|
|
23
|
+
"* Some applications may take time to start or process actions, so you may need to wait and take successive screenshots to see the results of your actions.\n" +
|
|
24
|
+
"* The screen's resolution is 999x999.\n" +
|
|
25
|
+
"* Make sure to click any buttons, links, icons, etc with the cursor tip in the center of the element. Don't click boxes on their edges unless asked.",
|
|
26
|
+
parameters: {
|
|
27
|
+
properties: {
|
|
28
|
+
action: {
|
|
29
|
+
description: "The action to perform. The available actions are:\n" +
|
|
30
|
+
"* `click`: Click the point on the screen with coordinate (x, y).\n" +
|
|
31
|
+
"* `long_press`: Press the point on the screen with coordinate (x, y) for specified seconds.\n" +
|
|
32
|
+
"* `swipe`: Swipe from the starting point with coordinate (x, y) to the end point with coordinates2 (x2, y2).\n" +
|
|
33
|
+
"* `type`: Input the specified text into the activated input box.\n" +
|
|
34
|
+
"* `answer`: Output the answer.\n" +
|
|
35
|
+
"* `system_button`: Press the system button.\n" +
|
|
36
|
+
"* `open_app`: Open the specified application.\n" +
|
|
37
|
+
"* `wait`: Wait specified seconds for the change to happen.\n" +
|
|
38
|
+
"* `terminate`: Terminate the current task and report its completion status.",
|
|
39
|
+
enum: ["click", "long_press", "swipe", "type", "answer", "system_button", "open_app", "wait", "terminate"],
|
|
40
|
+
type: "string",
|
|
41
|
+
},
|
|
42
|
+
coordinate: {
|
|
43
|
+
description: "(x, y): The x (pixels from the left edge) and y (pixels from the top edge) coordinates to move the mouse to. Required only by `action=click`, `action=long_press`, and `action=swipe`.",
|
|
44
|
+
type: "array",
|
|
45
|
+
},
|
|
46
|
+
coordinate2: {
|
|
47
|
+
description: "(x, y): The x (pixels from the left edge) and y (pixels from the top edge) coordinates to move the mouse to. Required only by `action=swipe`.",
|
|
48
|
+
type: "array",
|
|
49
|
+
},
|
|
50
|
+
text: {
|
|
51
|
+
description: "Required only by `action=type` and `action=answer`.",
|
|
52
|
+
type: "string",
|
|
53
|
+
},
|
|
54
|
+
time: {
|
|
55
|
+
description: "The seconds to wait. Required only by `action=long_press` and `action=wait`.",
|
|
56
|
+
type: "number",
|
|
57
|
+
},
|
|
58
|
+
button: {
|
|
59
|
+
description: "Back means returning to the previous interface, Home means returning to the desktop, Menu means opening the application background menu, and Enter means pressing the enter. Required only by `action=system_button`",
|
|
60
|
+
enum: ["Back", "Home", "Menu", "Enter"],
|
|
61
|
+
type: "string",
|
|
62
|
+
},
|
|
63
|
+
status: {
|
|
64
|
+
description: "The status of the task. Required only by `action=terminate`.",
|
|
65
|
+
type: "string",
|
|
66
|
+
enum: ["success", "failure"],
|
|
67
|
+
},
|
|
68
|
+
app_name: {
|
|
69
|
+
description: "The name of the app to open. Required only by `action=open_app`.",
|
|
70
|
+
type: "string",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
required: ["action"],
|
|
74
|
+
type: "object",
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const SYSTEM_PROMPT_CN = `# 工具
|
|
9
79
|
|
|
10
|
-
|
|
80
|
+
你可以调用一个或多个函数来辅助完成用户的请求。
|
|
81
|
+
|
|
82
|
+
可用的函数签名定义在 <tools></tools> XML 标签中:
|
|
83
|
+
<tools>
|
|
84
|
+
${TOOL_SCHEMA}
|
|
85
|
+
</tools>
|
|
86
|
+
|
|
87
|
+
每次调用函数时,请在 <tool_call></tool_call> XML 标签中返回一个包含函数名和参数的 JSON 对象:
|
|
11
88
|
<tool_call>
|
|
12
|
-
{"name":
|
|
89
|
+
{"name": <函数名>, "arguments": <参数JSON对象>}
|
|
13
90
|
</tool_call>
|
|
14
91
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
92
|
+
# 响应格式
|
|
93
|
+
|
|
94
|
+
每一步的响应格式:
|
|
95
|
+
1) Thought(思考):用一句简洁的话解释下一步操作(不要进行多步推理)。
|
|
96
|
+
2) Action(动作):用一句简短的祈使句描述要在界面上执行的操作。
|
|
97
|
+
3) 一个 <tool_call>...</tool_call> 代码块,其中只包含 JSON:{"name": <函数名>, "arguments": <参数JSON对象>}。
|
|
98
|
+
|
|
99
|
+
规则:
|
|
100
|
+
- 严格按照 Thought、Action、<tool_call> 的顺序输出。
|
|
101
|
+
- 保持简洁:Thought 一句话,Action 一句话。
|
|
102
|
+
- 不要在这三部分之外输出任何其他内容。
|
|
103
|
+
- 如果任务完成,请在 tool_call 中使用 action=terminate。`;
|
|
104
|
+
const SYSTEM_PROMPT_EN = `# Tools
|
|
105
|
+
|
|
106
|
+
You can call one or more functions to assist with the user's request.
|
|
25
107
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
108
|
+
The available function signatures are defined within <tools></tools> XML tags:
|
|
109
|
+
<tools>
|
|
110
|
+
${TOOL_SCHEMA}
|
|
111
|
+
</tools>
|
|
29
112
|
|
|
30
|
-
|
|
113
|
+
Each time you call a function, return a JSON object containing the function name and arguments within <tool_call></tool_call> XML tags:
|
|
31
114
|
<tool_call>
|
|
32
|
-
{"name":
|
|
115
|
+
{"name": <function_name>, "arguments": <arguments_json_object>}
|
|
33
116
|
</tool_call>
|
|
34
117
|
|
|
35
|
-
|
|
36
|
-
- tap: {"action":"tap","coordinate":[x,y]}
|
|
37
|
-
- long_press: {"action":"long_press","coordinate":[x,y]}
|
|
38
|
-
- swipe: {"action":"swipe","start_coordinate":[x,y],"end_coordinate":[x,y]}
|
|
39
|
-
- type: {"action":"type","text":"..."}
|
|
40
|
-
- press_back: {"action":"press_back"}
|
|
41
|
-
- press_home: {"action":"press_home"}
|
|
42
|
-
- open_app: {"action":"open_app","text":"App名称"}
|
|
43
|
-
- wait: {"action":"wait"}
|
|
44
|
-
- finish: {"action":"finish","text":"原因"}
|
|
118
|
+
# Response Format
|
|
45
119
|
|
|
46
|
-
|
|
120
|
+
Response format for each step:
|
|
121
|
+
1) Thought: Explain the next action in one concise sentence (do not perform multi-step reasoning).
|
|
122
|
+
2) Action: Describe the UI operation to perform in one short imperative sentence.
|
|
123
|
+
3) A <tool_call>...</tool_call> code block containing only JSON: {"name": <function_name>, "arguments": <arguments_json_object>}.
|
|
124
|
+
|
|
125
|
+
Rules:
|
|
126
|
+
- Strictly output in the order of Thought, Action, <tool_call>.
|
|
127
|
+
- Keep it concise: one sentence for Thought, one sentence for Action.
|
|
128
|
+
- Do not output anything beyond these three parts.
|
|
129
|
+
- If the task is completed, use action=terminate in the tool_call.`;
|
|
47
130
|
class QwenVLAdapter extends ModelAdapter {
|
|
48
131
|
name = "qwenvl";
|
|
49
132
|
patterns = [/qwen.*vl/, /qwen2.*vl/, /qvq/, /qwen-vl/];
|
|
50
133
|
actionHistory = [];
|
|
51
|
-
buildMessages(task, screenInfo,
|
|
134
|
+
buildMessages(task, screenInfo, _context, _isFirst, lang) {
|
|
52
135
|
const systemPrompt = lang === "cn" ? SYSTEM_PROMPT_CN : SYSTEM_PROMPT_EN;
|
|
53
|
-
// Build
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
: `Task: ${task}${historyText}\n\nWhat is the next action?`;
|
|
60
|
-
const content = [];
|
|
136
|
+
// Build user query: task + history (ClawGUI format)
|
|
137
|
+
const userQuery = buildUserQuery(task, this.actionHistory);
|
|
138
|
+
// Text first, image second — matches ClawGUI
|
|
139
|
+
const content = [
|
|
140
|
+
{ type: "text", text: userQuery },
|
|
141
|
+
];
|
|
61
142
|
if (screenInfo.imageRef) {
|
|
62
143
|
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
63
144
|
}
|
|
64
|
-
content.push({ type: "text", text: taskText });
|
|
65
145
|
return [
|
|
66
|
-
{ role: "system", content: systemPrompt },
|
|
146
|
+
{ role: "system", content: [{ type: "text", text: systemPrompt }] },
|
|
67
147
|
{ role: "user", content },
|
|
68
148
|
];
|
|
69
149
|
}
|
|
70
150
|
parseResponse(raw) {
|
|
71
|
-
|
|
151
|
+
// Extract Thought: line as thinking
|
|
152
|
+
const thoughtM = raw.match(/^Thought\s*[::]\s*(.+?)(?=\nAction\s*[::]|\n<tool_call>|$)/ms);
|
|
153
|
+
const thinking = thoughtM ? thoughtM[1].trim() : extractThinkTag(raw);
|
|
72
154
|
const toolBlock = raw.includes("<tool_call>") ? raw : `<tool_call>${raw}</tool_call>`;
|
|
73
155
|
return parseToolCall(toolBlock, thinking) ?? wait(thinking);
|
|
74
156
|
}
|
|
75
|
-
updateContext(
|
|
76
|
-
// Record action in history for next rebuild
|
|
157
|
+
updateContext(_context, response, parsed) {
|
|
77
158
|
if (!parsed.shouldFinish) {
|
|
78
|
-
|
|
159
|
+
// Record the Action: line from raw output as history description (ClawGUI format)
|
|
160
|
+
const actionLineM = response.rawContent.match(/^Action\s*[::]\s*(.+?)$/m);
|
|
161
|
+
const desc = actionLineM ? actionLineM[1].trim() : actionSummary(parsed);
|
|
162
|
+
this.actionHistory.push(desc);
|
|
79
163
|
}
|
|
80
|
-
// QwenVL always rebuilds messages
|
|
81
|
-
return
|
|
164
|
+
// QwenVL always rebuilds messages; context is not accumulated
|
|
165
|
+
return _context;
|
|
82
166
|
}
|
|
83
167
|
clearHistory() {
|
|
84
168
|
this.actionHistory = [];
|
|
@@ -86,7 +170,19 @@ class QwenVLAdapter extends ModelAdapter {
|
|
|
86
170
|
}
|
|
87
171
|
registerAdapter(new QwenVLAdapter());
|
|
88
172
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
89
|
-
function
|
|
173
|
+
function buildUserQuery(task, history) {
|
|
174
|
+
// Mirrors ClawGUI build_qwenvl_user_query exactly:
|
|
175
|
+
// "The user query: {task}.\nTask progress: Step 1: xxx; Step 2: yyy;\n"
|
|
176
|
+
let query = `The user query: ${task}.\n`;
|
|
177
|
+
if (history.length > 0) {
|
|
178
|
+
const progress = history
|
|
179
|
+
.map((h, i) => `Step ${i + 1}: ${h.replace(/\n/g, "").replace(/"/g, "")};`)
|
|
180
|
+
.join(" ");
|
|
181
|
+
query += `Task progress (You have done the following operation on the current device): ${progress}\n`;
|
|
182
|
+
}
|
|
183
|
+
return query;
|
|
184
|
+
}
|
|
185
|
+
function extractThinkTag(raw) {
|
|
90
186
|
const m = raw.match(/<think(?:ing)?>([\s\S]*?)<\/think(?:ing)?>/i);
|
|
91
187
|
return m ? m[1].trim() : "";
|
|
92
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qwenvl.js","sourceRoot":"","sources":["../../../src/model/adapters/qwenvl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,kBAAkB;AAClB,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"qwenvl.js","sourceRoot":"","sources":["../../../src/model/adapters/qwenvl.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,8 +52,7 @@ export function argsToAction(args, thinking) {
|
|
|
52
52
|
}
|
|
53
53
|
if (action === "swipe" && coord) {
|
|
54
54
|
const dir = String(args.direction ?? "down");
|
|
55
|
-
const
|
|
56
|
-
const dist = distMap[String(args.distance ?? "medium")] ?? 300;
|
|
55
|
+
const dist = 300;
|
|
57
56
|
const [sx, sy] = [coord[0], coord[1]];
|
|
58
57
|
const [ex, ey] = dir === "up" ? [sx, sy + dist] :
|
|
59
58
|
dir === "down" ? [sx, sy - dist] :
|
|
@@ -61,11 +60,18 @@ export function argsToAction(args, thinking) {
|
|
|
61
60
|
[sx - dist, sy];
|
|
62
61
|
return done("swipe", { start_x: sx, start_y: sy, end_x: ex, end_y: ey }, thinking);
|
|
63
62
|
}
|
|
63
|
+
if (action === "drag") {
|
|
64
|
+
const sc = startCoord ?? coord;
|
|
65
|
+
const ec = endCoord;
|
|
66
|
+
if (sc && ec) {
|
|
67
|
+
return done("swipe", { start_x: sc[0], start_y: sc[1], end_x: ec[0], end_y: ec[1] }, thinking);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
64
70
|
if (action === "type") {
|
|
65
71
|
return done("type", { text: String(args.text ?? "") }, thinking);
|
|
66
72
|
}
|
|
67
73
|
if (action === "open_app" || action === "open") {
|
|
68
|
-
return done("open_app", { app_name: String(args.
|
|
74
|
+
return done("open_app", { app_name: String(args.app_name ?? args.text ?? "") }, thinking);
|
|
69
75
|
}
|
|
70
76
|
if (action === "press_back" || action === "back") {
|
|
71
77
|
return done("press_back", {}, thinking);
|
|
@@ -90,6 +96,10 @@ export function argsToAction(args, thinking) {
|
|
|
90
96
|
const key = String(args.text ?? args.key ?? "").trim();
|
|
91
97
|
return done("press_key", { key: key.startsWith("KEYCODE_") ? key : `KEYCODE_${key.toUpperCase()}` }, thinking);
|
|
92
98
|
}
|
|
99
|
+
if (action === "interact") {
|
|
100
|
+
const msg = String(args.text ?? args.message ?? "User interaction required");
|
|
101
|
+
return done("takeover", { message: msg }, thinking);
|
|
102
|
+
}
|
|
93
103
|
if (action === "wait") {
|
|
94
104
|
const time = Number(args.time ?? args.duration_seconds ?? 2);
|
|
95
105
|
return done("wait", { duration_seconds: time }, thinking);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../../src/model/adapters/tool-call.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../../src/model/adapters/tool-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,107 +1,75 @@
|
|
|
1
1
|
import { ModelAdapter, registerAdapter } from "./base.js";
|
|
2
2
|
// UITars / Doubao-1.5-UI-TARS adapter
|
|
3
|
-
//
|
|
3
|
+
// Aligned with ClawGUI prompts_uitars.py (PHONE_USE_DOUBAO template)
|
|
4
|
+
//
|
|
5
|
+
// Message structure (mirrors ClawGUI exactly):
|
|
6
|
+
// First turn : [user(text=systemPrompt+task, image)] — no system role
|
|
7
|
+
// Subsequent : [...context, user(image only)]
|
|
8
|
+
// assistant : raw model output appended by updateContext
|
|
9
|
+
// Image window: max 5 (pruned in updateContext)
|
|
10
|
+
//
|
|
4
11
|
// Coordinate system: smart_resize (normalized to IMAGE_FACTOR=28 grid)
|
|
5
12
|
const MAX_IMAGES = 5;
|
|
6
|
-
|
|
7
|
-
|
|
13
|
+
function buildSystemPrompt(task, lang) {
|
|
14
|
+
const language = lang === "cn" ? "Chinese" : "English";
|
|
15
|
+
return `You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.
|
|
8
16
|
|
|
9
|
-
Output
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
## Output Format
|
|
18
|
+
\`\`\`
|
|
19
|
+
Thought: ...
|
|
20
|
+
Action: ...
|
|
21
|
+
\`\`\`
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- finish(message='...')
|
|
23
|
+
## Action Space
|
|
24
|
+
click(point='<point>x1 y1</point>')
|
|
25
|
+
long_press(point='<point>x1 y1</point>')
|
|
26
|
+
type(content='') #If you want to submit your input, use "\\n" at the end of \`content\`.
|
|
27
|
+
scroll(point='<point>x1 y1</point>', direction='down or up or right or left')
|
|
28
|
+
open_app(app_name='')
|
|
29
|
+
drag(start_point='<point>x1 y1</point>', end_point='<point>x2 y2</point>')
|
|
30
|
+
press_home()
|
|
31
|
+
press_back()
|
|
32
|
+
finished(content='xxx') # Use escape characters \\', \\", and \\n in content part to ensure we can parse the content in normal python string format.
|
|
24
33
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
34
|
+
## Note
|
|
35
|
+
- Use ${language} in \`Thought\` part.
|
|
36
|
+
- Write a small plan and finally summarize your next action (with its target element) in one sentence in \`Thought\` part.
|
|
28
37
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
可用动作:
|
|
34
|
-
- click(point='<point>x y</point>')
|
|
35
|
-
- long_press(point='<point>x y</point>')
|
|
36
|
-
- double_click(point='<point>x y</point>')
|
|
37
|
-
- type(content='text')
|
|
38
|
-
- scroll(point='<point>x y</point>', direction='up|down|left|right', dist='short|medium|long')
|
|
39
|
-
- press_back()
|
|
40
|
-
- press_home()
|
|
41
|
-
- open_app(app_name='App')
|
|
42
|
-
- wait()
|
|
43
|
-
- finish(message='...')
|
|
44
|
-
|
|
45
|
-
坐标为 smart_resize 空间(相对于缩放后的图像网格)。`;
|
|
38
|
+
## User Instruction
|
|
39
|
+
${task}`;
|
|
40
|
+
}
|
|
46
41
|
class UITarsAdapter extends ModelAdapter {
|
|
47
42
|
name = "uitars";
|
|
48
43
|
patterns = [/uitars/, /ui[-_]?tars/, /doubao.*ui/, /ui.*tars/];
|
|
49
|
-
// Sliding window of recent image URLs (data:* or signed https). Kept
|
|
50
|
-
// for parity with the reference agent's MAX_IMAGES window — currently
|
|
51
|
-
// not replayed into the prompt because the live `context` already
|
|
52
|
-
// carries vision parts; future turn-rewinding logic will read this.
|
|
53
|
-
imageHistory = [];
|
|
54
44
|
buildMessages(task, screenInfo, context, isFirst, lang) {
|
|
55
|
-
const systemPrompt = lang === "cn" ? SYSTEM_PROMPT_CN : SYSTEM_PROMPT_EN;
|
|
56
|
-
if (screenInfo.imageRef) {
|
|
57
|
-
this.imageHistory.push(screenInfo.imageRef.url);
|
|
58
|
-
if (this.imageHistory.length > MAX_IMAGES) {
|
|
59
|
-
this.imageHistory.shift();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
const msgs = [{ role: "system", content: systemPrompt }];
|
|
63
45
|
if (isFirst) {
|
|
64
|
-
|
|
46
|
+
// System prompt embedded in the first user message (no system role).
|
|
47
|
+
// Text first, image second — matches ClawGUI.
|
|
48
|
+
const content = [
|
|
49
|
+
{ type: "text", text: buildSystemPrompt(task, lang) },
|
|
50
|
+
];
|
|
65
51
|
if (screenInfo.imageRef) {
|
|
66
52
|
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
67
53
|
}
|
|
68
|
-
|
|
69
|
-
msgs.push({ role: "user", content });
|
|
54
|
+
return [{ role: "user", content }];
|
|
70
55
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (Array.isArray(m.content)) {
|
|
76
|
-
const textParts = m.content
|
|
77
|
-
.filter((p) => p.type === "text");
|
|
78
|
-
const stripped = textParts.length === 1 && typeof textParts[0].text === "string"
|
|
79
|
-
? textParts[0].text
|
|
80
|
-
: textParts;
|
|
81
|
-
return { ...m, content: stripped };
|
|
82
|
-
}
|
|
83
|
-
return m;
|
|
84
|
-
});
|
|
85
|
-
msgs.push(...textOnlyContext);
|
|
86
|
-
const content = [];
|
|
87
|
-
if (screenInfo.imageRef) {
|
|
88
|
-
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
89
|
-
}
|
|
90
|
-
content.push({ type: "text", text: "Current screen. What is the next action?" });
|
|
91
|
-
msgs.push({ role: "user", content });
|
|
56
|
+
// Subsequent turns: append image-only user message to accumulated context.
|
|
57
|
+
const content = [];
|
|
58
|
+
if (screenInfo.imageRef) {
|
|
59
|
+
content.push({ type: "image_url", image_url: { url: screenInfo.imageRef.url } });
|
|
92
60
|
}
|
|
93
|
-
return
|
|
61
|
+
return [...context, { role: "user", content }];
|
|
94
62
|
}
|
|
95
63
|
parseResponse(raw) {
|
|
96
64
|
const [thinking, actionStr] = splitThoughtAction(raw);
|
|
97
65
|
return parseUITarsAction(actionStr, thinking);
|
|
98
66
|
}
|
|
99
|
-
updateContext(context, response,
|
|
67
|
+
updateContext(context, response, _parsed) {
|
|
100
68
|
context.push({ role: "assistant", content: response.rawContent });
|
|
101
|
-
return context;
|
|
69
|
+
return pruneImages(context, MAX_IMAGES);
|
|
102
70
|
}
|
|
103
71
|
clearHistory() {
|
|
104
|
-
|
|
72
|
+
// Context is reset externally (OpenAIAdapter clears on new run).
|
|
105
73
|
}
|
|
106
74
|
}
|
|
107
75
|
registerAdapter(new UITarsAdapter());
|
|
@@ -114,7 +82,6 @@ function splitThoughtAction(raw) {
|
|
|
114
82
|
return [thinking, action];
|
|
115
83
|
}
|
|
116
84
|
function parsePoint(s) {
|
|
117
|
-
// <point>x y</point> or plain "x y"
|
|
118
85
|
const m = s.match(/<point>\s*(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)\s*<\/point>/) ??
|
|
119
86
|
s.match(/(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)/);
|
|
120
87
|
if (!m)
|
|
@@ -129,7 +96,8 @@ function parseUITarsAction(s, thinking) {
|
|
|
129
96
|
const make = (actionType, params, shouldFinish = false, finishMessage = null) => ({ actionType, params, thinking, coordSystem: "smart_resize", shouldFinish, finishMessage });
|
|
130
97
|
const trimmed = s.replace(/^```[a-z]*\s*/i, "").replace(/```$/, "").trim();
|
|
131
98
|
if (trimmed.startsWith("finish")) {
|
|
132
|
-
|
|
99
|
+
// Handles both finish(message=...) and finished(content=...)
|
|
100
|
+
const msg = parseKeyword(trimmed, "content") ?? parseKeyword(trimmed, "message") ?? trimmed;
|
|
133
101
|
return make("finish", { message: msg }, true, msg);
|
|
134
102
|
}
|
|
135
103
|
if (trimmed.startsWith("click")) {
|
|
@@ -150,6 +118,13 @@ function parseUITarsAction(s, thinking) {
|
|
|
150
118
|
if (pt)
|
|
151
119
|
return make("double_tap", { x: pt[0], y: pt[1] });
|
|
152
120
|
}
|
|
121
|
+
if (trimmed.startsWith("drag")) {
|
|
122
|
+
const startStr = parseKeyword(trimmed, "start_point") ?? "";
|
|
123
|
+
const endStr = parseKeyword(trimmed, "end_point") ?? "";
|
|
124
|
+
const start = parsePoint(startStr) ?? [500, 300];
|
|
125
|
+
const end = parsePoint(endStr) ?? [500, 700];
|
|
126
|
+
return make("swipe", { start_x: start[0], start_y: start[1], end_x: end[0], end_y: end[1] });
|
|
127
|
+
}
|
|
153
128
|
if (trimmed.startsWith("type")) {
|
|
154
129
|
const text = parseKeyword(trimmed, "content") ?? parseKeyword(trimmed, "text") ?? "";
|
|
155
130
|
return make("type", { text });
|
|
@@ -158,11 +133,12 @@ function parseUITarsAction(s, thinking) {
|
|
|
158
133
|
const pointStr = parseKeyword(trimmed, "point") ?? "";
|
|
159
134
|
const pt = parsePoint(pointStr) ?? [500, 500];
|
|
160
135
|
const dir = parseKeyword(trimmed, "direction") ?? "down";
|
|
161
|
-
const
|
|
162
|
-
const distMap = { short: 200, medium: 400, long: 700 };
|
|
163
|
-
const dist = distMap[distStr] ?? 400;
|
|
136
|
+
const dist = 300;
|
|
164
137
|
const [sx, sy] = [pt[0], pt[1]];
|
|
165
|
-
const [ex, ey] = dir === "up" ? [sx, sy
|
|
138
|
+
const [ex, ey] = dir === "up" ? [sx, sy + dist] :
|
|
139
|
+
dir === "down" ? [sx, sy - dist] :
|
|
140
|
+
dir === "left" ? [sx + dist, sy] :
|
|
141
|
+
[sx - dist, sy];
|
|
166
142
|
return make("swipe", { start_x: sx, start_y: sy, end_x: ex, end_y: ey });
|
|
167
143
|
}
|
|
168
144
|
if (trimmed.startsWith("press_back"))
|
|
@@ -177,4 +153,24 @@ function parseUITarsAction(s, thinking) {
|
|
|
177
153
|
return make("wait", { duration_seconds: 2 });
|
|
178
154
|
return make("wait", { duration_seconds: 2 });
|
|
179
155
|
}
|
|
156
|
+
function pruneImages(context, keepCount) {
|
|
157
|
+
let imageCount = 0;
|
|
158
|
+
for (let i = context.length - 1; i >= 0; i--) {
|
|
159
|
+
const msg = context[i];
|
|
160
|
+
if (Array.isArray(msg.content)) {
|
|
161
|
+
const parts = msg.content;
|
|
162
|
+
const hasImage = parts.some((p) => p.type === "image_url");
|
|
163
|
+
if (hasImage) {
|
|
164
|
+
imageCount++;
|
|
165
|
+
if (imageCount > keepCount) {
|
|
166
|
+
context[i] = {
|
|
167
|
+
...msg,
|
|
168
|
+
content: parts.filter((p) => p.type !== "image_url"),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return context;
|
|
175
|
+
}
|
|
180
176
|
//# sourceMappingURL=uitars.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uitars.js","sourceRoot":"","sources":["../../../src/model/adapters/uitars.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE1D,sCAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"uitars.js","sourceRoot":"","sources":["../../../src/model/adapters/uitars.ts"],"names":[],"mappings":"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"}
|