computer-use-ootb-internal 0.0.96.post1__py3-none-any.whl → 0.0.97.post1__py3-none-any.whl
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.
- computer_use_ootb_internal/app_teachmode.py +29 -0
- computer_use_ootb_internal/computer_use_demo/animation/click_animation.py +5 -5
- computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/test_capture.py +7 -7
- computer_use_ootb_internal/example_websocket_js.html +41 -0
- computer_use_ootb_internal/requirements-lite.txt +1 -2
- computer_use_ootb_internal/service_teachmode.py +194 -0
- computer_use_ootb_internal/service_teachmode_test.py +41 -0
- {computer_use_ootb_internal-0.0.96.post1.dist-info → computer_use_ootb_internal-0.0.97.post1.dist-info}/METADATA +3 -4
- {computer_use_ootb_internal-0.0.96.post1.dist-info → computer_use_ootb_internal-0.0.97.post1.dist-info}/RECORD +11 -8
- {computer_use_ootb_internal-0.0.96.post1.dist-info → computer_use_ootb_internal-0.0.97.post1.dist-info}/WHEEL +0 -0
- {computer_use_ootb_internal-0.0.96.post1.dist-info → computer_use_ootb_internal-0.0.97.post1.dist-info}/entry_points.txt +0 -0
@@ -4,6 +4,8 @@ import json
|
|
4
4
|
from datetime import datetime
|
5
5
|
import threading
|
6
6
|
import requests
|
7
|
+
import platform # Add platform import
|
8
|
+
import subprocess # Add subprocess import
|
7
9
|
from fastapi import FastAPI, Request
|
8
10
|
from fastapi.responses import JSONResponse
|
9
11
|
from fastapi.middleware.cors import CORSMiddleware
|
@@ -87,6 +89,30 @@ class SharedState:
|
|
87
89
|
shared_state = None
|
88
90
|
rate_limiter = RateLimiter(interval_seconds=2)
|
89
91
|
|
92
|
+
# Add the new prepare_environment function here
|
93
|
+
def prepare_environment(state):
|
94
|
+
"""Prepares the environment before starting the main processing loop, e.g., opening specific apps."""
|
95
|
+
if platform.system() == "Windows":
|
96
|
+
# Assuming Star Rail mode is indicated by user_id containing "star_rail"
|
97
|
+
# You might need to adjust this condition based on the actual logic in run_teachmode_args
|
98
|
+
is_star_rail = "star_rail" in state.user_id.lower()
|
99
|
+
|
100
|
+
if is_star_rail:
|
101
|
+
print("Star Rail mode detected on Windows. Opening Edge browser...")
|
102
|
+
url = "https://sr.mihoyo.com/cloud/#/"
|
103
|
+
try:
|
104
|
+
# Use cmd /c start to open the URL in Edge without blocking
|
105
|
+
subprocess.run(["cmd", "/c", "start", "msedge", url], check=True, shell=False)
|
106
|
+
print(f"Successfully requested Edge to open {url}")
|
107
|
+
except FileNotFoundError:
|
108
|
+
print("Error: Microsoft Edge not found. Please ensure it's installed and in PATH.")
|
109
|
+
except Exception as e:
|
110
|
+
print(f"Error opening Edge: {e}")
|
111
|
+
else:
|
112
|
+
# Placeholder for potential preparations on other OS or non-Star Rail modes
|
113
|
+
print("Environment preparation: No specific actions required for this OS/mode.")
|
114
|
+
|
115
|
+
|
90
116
|
@app.post("/update_params")
|
91
117
|
async def update_parameters(request: Request):
|
92
118
|
data = await request.json()
|
@@ -285,6 +311,9 @@ def process_input():
|
|
285
311
|
shared_state.is_paused = False
|
286
312
|
shared_state.stop_event.clear() # Ensure stop event is cleared at the start
|
287
313
|
|
314
|
+
# Call the preparation function before starting the loop
|
315
|
+
prepare_environment(shared_state)
|
316
|
+
|
288
317
|
print(f"start sampling loop: {shared_state.chatbot_messages}")
|
289
318
|
print(f"shared_state.args before sampling loop: {shared_state.args}")
|
290
319
|
|
@@ -75,7 +75,7 @@ def _ensure_app():
|
|
75
75
|
# Keep references to animations to prevent garbage collection
|
76
76
|
_active_animations = []
|
77
77
|
|
78
|
-
def show_click(x: int, y: int, duration_ms: int = 2000, existing_ms: int =
|
78
|
+
def show_click(x: int, y: int, duration_ms: int = 2000, existing_ms: int = 2000): # 增加默认播放时间和静止时间
|
79
79
|
"""非阻塞式点击动画:立即返回,动画在后台运行
|
80
80
|
|
81
81
|
Args:
|
@@ -116,7 +116,7 @@ def _clean_animation(animation):
|
|
116
116
|
|
117
117
|
|
118
118
|
# ---------- 新增函数 ----------
|
119
|
-
def show_move_to(x1: int, y1: int, x2: int, y2: int, duration_ms: int = 1000, existing_ms: int =
|
119
|
+
def show_move_to(x1: int, y1: int, x2: int, y2: int, duration_ms: int = 1000, existing_ms: int = 3000):
|
120
120
|
"""
|
121
121
|
非阻塞式移动动画:在 (x1, y1) 处出现光标 GIF,
|
122
122
|
并在 duration_ms 毫秒内平滑移动到 (x2, y2),
|
@@ -179,7 +179,7 @@ def show_move_to(x1: int, y1: int, x2: int, y2: int, duration_ms: int = 1000, ex
|
|
179
179
|
# ---------- 命令行测试 ----------
|
180
180
|
if __name__ == "__main__":
|
181
181
|
# 确保应用程序实例存在
|
182
|
-
|
182
|
+
_ensure_app()
|
183
183
|
|
184
184
|
# 测试点击
|
185
185
|
print("Testing non-blocking click animation...")
|
@@ -191,7 +191,7 @@ if __name__ == "__main__":
|
|
191
191
|
x1, y1 = 200, 200
|
192
192
|
x2, y2 = 600, 600
|
193
193
|
# show_click(x1, y1)
|
194
|
-
show_move_to(x1, y1, x2, y2)
|
194
|
+
show_move_to(x1, y1, x2, y2, duration_ms=2000)
|
195
195
|
|
196
196
|
# # 测试先移动,然后点击
|
197
197
|
print("\nTesting sequence with pyautogui simulation...")
|
@@ -199,7 +199,7 @@ if __name__ == "__main__":
|
|
199
199
|
x4, y4 = 400, 500
|
200
200
|
|
201
201
|
# 启动移动动画
|
202
|
-
show_move_to(x3, y3, x4, y4)
|
202
|
+
show_move_to(x3, y3, x4, y4, duration_ms=1500)
|
203
203
|
|
204
204
|
# 模拟移动完成后的点击动画(延迟1.5秒)
|
205
205
|
QTimer.singleShot(1500, lambda: show_click(x4, y4))
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/test_capture.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
from PIL import ImageGrab
|
2
|
-
|
3
|
-
bbox=(2560, 366, 2560+1920, 366+1080)
|
4
|
-
|
5
|
-
screenshot = ImageGrab.grab(bbox=bbox, all_screens=True)
|
6
|
-
|
7
|
-
screenshot = screenshot.convert('RGB')
|
1
|
+
from PIL import ImageGrab
|
2
|
+
|
3
|
+
bbox=(2560, 366, 2560+1920, 366+1080)
|
4
|
+
|
5
|
+
screenshot = ImageGrab.grab(bbox=bbox, all_screens=True)
|
6
|
+
|
7
|
+
screenshot = screenshot.convert('RGB')
|
8
8
|
screenshot.save("screenshot.png")
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Teachmode Client</title>
|
5
|
+
<!-- include socket.io client -->
|
6
|
+
<script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<h1>Teachmode WebSocket Test</h1>
|
10
|
+
<div id="messages"></div>
|
11
|
+
|
12
|
+
<script>
|
13
|
+
const socket = io("http://localhost:5000"); // Your server’s URL/port
|
14
|
+
|
15
|
+
// Listen for partial responses
|
16
|
+
socket.on("partial_response", (data) => {
|
17
|
+
console.log("Got partial:", data);
|
18
|
+
const div = document.createElement("div");
|
19
|
+
div.innerText = "Assistant: " + data.content;
|
20
|
+
document.getElementById("messages").appendChild(div);
|
21
|
+
});
|
22
|
+
|
23
|
+
// Listen for done event
|
24
|
+
socket.on("done", (data) => {
|
25
|
+
console.log("Task completed:", data);
|
26
|
+
const div = document.createElement("div");
|
27
|
+
div.innerText = "TASK DONE!";
|
28
|
+
document.getElementById("messages").appendChild(div);
|
29
|
+
});
|
30
|
+
|
31
|
+
// When connected, emit run_teachmode
|
32
|
+
socket.on("connect", () => {
|
33
|
+
console.log("Connected to server. Emitting run_teachmode event...");
|
34
|
+
socket.emit("run_teachmode", {
|
35
|
+
user_input: "Hello, I'd like to do X, Y, Z."
|
36
|
+
// you can include model, task, user_id, trace_id, etc. if desired
|
37
|
+
});
|
38
|
+
});
|
39
|
+
</script>
|
40
|
+
</body>
|
41
|
+
</html>
|
@@ -0,0 +1,194 @@
|
|
1
|
+
import argparse
|
2
|
+
import time
|
3
|
+
import json
|
4
|
+
import threading
|
5
|
+
|
6
|
+
from flask import Flask, request, jsonify
|
7
|
+
from flask_socketio import SocketIO, emit
|
8
|
+
|
9
|
+
from screeninfo import get_monitors
|
10
|
+
from computer_use_ootb_internal.computer_use_demo.tools.computer import get_screen_details
|
11
|
+
from computer_use_ootb_internal.run_teachmode_ootb_args import simple_teachmode_sampling_loop
|
12
|
+
|
13
|
+
###############################################################################
|
14
|
+
# Shared State
|
15
|
+
###############################################################################
|
16
|
+
class SharedState:
|
17
|
+
def __init__(self):
|
18
|
+
self.args = None # Will hold argparse-like namespace
|
19
|
+
self.messages = [] # If you want to store a global chat or last session
|
20
|
+
|
21
|
+
shared_state = SharedState()
|
22
|
+
|
23
|
+
###############################################################################
|
24
|
+
# Flask + SocketIO Application Setup
|
25
|
+
###############################################################################
|
26
|
+
app = Flask(__name__)
|
27
|
+
app.config["SECRET_KEY"] = "some-secret-key" # In production, change this
|
28
|
+
socketio = SocketIO(app, cors_allowed_origins="*")
|
29
|
+
|
30
|
+
###############################################################################
|
31
|
+
# Utility Functions
|
32
|
+
###############################################################################
|
33
|
+
def setup_default_args():
|
34
|
+
"""
|
35
|
+
Creates argparse-like defaults.
|
36
|
+
You can also parse real CLI args if you wish.
|
37
|
+
"""
|
38
|
+
parser = argparse.ArgumentParser(description="Teachmode SocketIO Server.")
|
39
|
+
parser.add_argument("--model", default="teach-mode-gpt-4o")
|
40
|
+
parser.add_argument("--task", default="Help me complete data extraction on YouTube video.")
|
41
|
+
parser.add_argument("--selected_screen", type=int, default=0)
|
42
|
+
parser.add_argument("--user_id", default="liziqi")
|
43
|
+
parser.add_argument("--trace_id", default="default_trace")
|
44
|
+
parser.add_argument("--api_key_file", default="api_key.json")
|
45
|
+
parser.add_argument("--api_keys", default="")
|
46
|
+
parser.add_argument(
|
47
|
+
"--server_url",
|
48
|
+
default="http://ec2-44-234-43-86.us-west-2.compute.amazonaws.com/generate_action",
|
49
|
+
help="Server URL for the session (local='http://localhost:5000/generate_action', \
|
50
|
+
aws='http://ec2-44-234-43-86.us-west-2.compute.amazonaws.com/generate_action').",
|
51
|
+
)
|
52
|
+
|
53
|
+
# If you really want to parse sys.argv, do parser.parse_args().
|
54
|
+
# But you can also return the defaults for this example:
|
55
|
+
return parser.parse_args([])
|
56
|
+
|
57
|
+
def apply_args_to_state(args):
|
58
|
+
"""
|
59
|
+
Helper that prints or logs relevant arguments and stores them in shared_state.
|
60
|
+
"""
|
61
|
+
print("[apply_args_to_state] Applying arguments:", args)
|
62
|
+
shared_state.args = args
|
63
|
+
|
64
|
+
def run_teachmode_task(user_input):
|
65
|
+
"""
|
66
|
+
Calls simple_teachmode_sampling_loop and emits partial responses over SocketIO.
|
67
|
+
"""
|
68
|
+
# 1) Log or store user input
|
69
|
+
print(f"[run_teachmode_task] Received user_input: {user_input}")
|
70
|
+
# Optionally store or reset message history for this session
|
71
|
+
shared_state.messages = [{"role": "user", "content": user_input}]
|
72
|
+
|
73
|
+
# 2) Grab arguments from shared_state
|
74
|
+
args = shared_state.args
|
75
|
+
if not args:
|
76
|
+
print("[run_teachmode_task] No arguments in shared_state, applying defaults.")
|
77
|
+
args = setup_default_args()
|
78
|
+
apply_args_to_state(args)
|
79
|
+
|
80
|
+
# 3) Run the sampling loop
|
81
|
+
print(f"[run_teachmode_task] Starting the sampling loop with task: {args.task}")
|
82
|
+
sampling_loop = simple_teachmode_sampling_loop(
|
83
|
+
model=args.model,
|
84
|
+
task=args.task,
|
85
|
+
selected_screen=args.selected_screen,
|
86
|
+
user_id=args.user_id,
|
87
|
+
trace_id=args.trace_id,
|
88
|
+
api_keys=args.api_keys,
|
89
|
+
server_url=args.server_url
|
90
|
+
)
|
91
|
+
|
92
|
+
# 4) Send partial responses
|
93
|
+
for loop_msg in sampling_loop:
|
94
|
+
print(f"[run_teachmode_task] Emitting partial response: {loop_msg}")
|
95
|
+
# You can store it in shared_state messages
|
96
|
+
shared_state.messages.append({"role": "assistant", "content": loop_msg})
|
97
|
+
# Emit immediately so the client sees partial responses
|
98
|
+
emit("partial_response", {"role": "assistant", "content": loop_msg})
|
99
|
+
time.sleep(1) # Optional delay to simulate real-time streaming
|
100
|
+
|
101
|
+
# 5) Done event
|
102
|
+
print("[run_teachmode_task] Completed all messages.")
|
103
|
+
emit("done", {"messages": shared_state.messages, "status": "completed"})
|
104
|
+
|
105
|
+
###############################################################################
|
106
|
+
# HTTP Endpoint: update_params
|
107
|
+
###############################################################################
|
108
|
+
@app.route("/update_params", methods=["POST"])
|
109
|
+
def update_parameters():
|
110
|
+
"""
|
111
|
+
HTTP endpoint that allows updating the parameters (like Gradio's /update_params).
|
112
|
+
Expects JSON body with fields matching the argparse Namespace (model, task, etc.)
|
113
|
+
"""
|
114
|
+
data = request.json
|
115
|
+
if not data:
|
116
|
+
return jsonify({"status": "error", "message": "No JSON provided."}), 400
|
117
|
+
|
118
|
+
# Build an argparse.Namespace from the JSON keys
|
119
|
+
# Fallback to the existing arguments if some keys are missing
|
120
|
+
old_args = shared_state.args or setup_default_args()
|
121
|
+
new_args_dict = {**vars(old_args), **data} # Merge old with new
|
122
|
+
new_args = argparse.Namespace(**new_args_dict)
|
123
|
+
apply_args_to_state(new_args)
|
124
|
+
|
125
|
+
return jsonify({
|
126
|
+
"status": "success",
|
127
|
+
"message": "Parameters updated",
|
128
|
+
"new_args": vars(new_args)
|
129
|
+
})
|
130
|
+
|
131
|
+
###############################################################################
|
132
|
+
# HTTP Endpoint: get_messages
|
133
|
+
###############################################################################
|
134
|
+
@app.route("/get_messages", methods=["GET"])
|
135
|
+
def get_messages():
|
136
|
+
"""
|
137
|
+
Example new function: returns the current chat messages in shared_state.
|
138
|
+
"""
|
139
|
+
return jsonify(shared_state.messages)
|
140
|
+
|
141
|
+
###############################################################################
|
142
|
+
# HTTP Endpoint: clear_messages
|
143
|
+
###############################################################################
|
144
|
+
@app.route("/clear_messages", methods=["POST"])
|
145
|
+
def clear_messages():
|
146
|
+
"""
|
147
|
+
Example new function: clears the stored chat messages in shared_state.
|
148
|
+
"""
|
149
|
+
shared_state.messages = []
|
150
|
+
return jsonify({"status": "success", "message": "Chat history cleared."})
|
151
|
+
|
152
|
+
###############################################################################
|
153
|
+
# SocketIO Event: run_teachmode
|
154
|
+
###############################################################################
|
155
|
+
@socketio.on("run_teachmode")
|
156
|
+
def handle_run_teachmode(data):
|
157
|
+
"""
|
158
|
+
Websocket event that starts the teachmode sampling loop.
|
159
|
+
`data` can include e.g. {"user_input": "..."}.
|
160
|
+
"""
|
161
|
+
user_input = data.get("user_input", "Hello, let's start!")
|
162
|
+
run_teachmode_task(user_input)
|
163
|
+
|
164
|
+
###############################################################################
|
165
|
+
# SocketIO Event: connect
|
166
|
+
###############################################################################
|
167
|
+
@socketio.on("connect")
|
168
|
+
def on_connect():
|
169
|
+
print("[SocketIO] Client connected.")
|
170
|
+
|
171
|
+
@socketio.on("disconnect")
|
172
|
+
def on_disconnect():
|
173
|
+
print("[SocketIO] Client disconnected.")
|
174
|
+
|
175
|
+
###############################################################################
|
176
|
+
# Main
|
177
|
+
###############################################################################
|
178
|
+
def main():
|
179
|
+
# Pre-populate shared_state with default arguments
|
180
|
+
args = setup_default_args()
|
181
|
+
apply_args_to_state(args)
|
182
|
+
|
183
|
+
# Optional: Preload screen info if needed
|
184
|
+
screens = get_monitors()
|
185
|
+
print("Detected screens:", screens)
|
186
|
+
screen_names, primary_index = get_screen_details()
|
187
|
+
print("Screen names:", screen_names, "Default selected index:", primary_index)
|
188
|
+
|
189
|
+
# Run the Flask-SocketIO app
|
190
|
+
# eventlet is the default async_mode if installed, but we specify it explicitly.
|
191
|
+
socketio.run(app, host="0.0.0.0", port=5001, debug=True)
|
192
|
+
|
193
|
+
if __name__ == "__main__":
|
194
|
+
main()
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import socketio
|
2
|
+
|
3
|
+
# Create a Socket.IO client instance
|
4
|
+
sio = socketio.Client()
|
5
|
+
|
6
|
+
@sio.on('connect')
|
7
|
+
def on_connect():
|
8
|
+
print("Connected to the server.")
|
9
|
+
# Once connected, send the event to start the teachmode process:
|
10
|
+
data = {
|
11
|
+
"user_input": "Hello, I'd like to open the Chrome browser."
|
12
|
+
# You can add more parameters here if needed, e.g.:
|
13
|
+
# "model": "teach-mode-gpt-4o",
|
14
|
+
# "task": "Some task",
|
15
|
+
# "user_id": "my_user",
|
16
|
+
# etc.
|
17
|
+
}
|
18
|
+
print("Emitting 'run_teachmode' event with data:", data)
|
19
|
+
sio.emit("run_teachmode", data)
|
20
|
+
|
21
|
+
@sio.on('partial_response')
|
22
|
+
def on_partial_response(data):
|
23
|
+
print("[partial_response] =>", data)
|
24
|
+
|
25
|
+
@sio.on('done')
|
26
|
+
def on_done(data):
|
27
|
+
print("[done] =>", data)
|
28
|
+
# Since the process is completed, you can disconnect:
|
29
|
+
sio.disconnect()
|
30
|
+
|
31
|
+
@sio.on('disconnect')
|
32
|
+
def on_disconnect():
|
33
|
+
print("Disconnected from server.")
|
34
|
+
|
35
|
+
|
36
|
+
if __name__ == "__main__":
|
37
|
+
# Connect to the Socket.IO server (adapt host/port as needed):
|
38
|
+
sio.connect("http://localhost:5001")
|
39
|
+
|
40
|
+
# Keep the client alive to receive events
|
41
|
+
sio.wait()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: computer-use-ootb-internal
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.97.post1
|
4
4
|
Summary: Computer Use OOTB
|
5
5
|
Author-email: Siyuan Hu <siyuan.hu.sg@gmail.com>
|
6
6
|
Requires-Python: >=3.11
|
@@ -14,15 +14,14 @@ Requires-Dist: matplotlib
|
|
14
14
|
Requires-Dist: opencv-python
|
15
15
|
Requires-Dist: pre-commit==3.8.0
|
16
16
|
Requires-Dist: pyautogui==0.9.54
|
17
|
-
Requires-Dist: pyside6
|
18
17
|
Requires-Dist: pytest-asyncio==0.23.6
|
19
18
|
Requires-Dist: pytest==8.3.3
|
20
|
-
Requires-Dist: pywinauto
|
19
|
+
Requires-Dist: pywinauto; sys_platform == 'win32'
|
21
20
|
Requires-Dist: ruff==0.6.7
|
22
21
|
Requires-Dist: screeninfo
|
23
22
|
Requires-Dist: streamlit>=1.38.0
|
24
23
|
Requires-Dist: textdistance
|
25
|
-
Requires-Dist: uiautomation
|
24
|
+
Requires-Dist: uiautomation; sys_platform == 'win32'
|
26
25
|
Provides-Extra: dev
|
27
26
|
Requires-Dist: pytest-asyncio>=0.23.6; extra == 'dev'
|
28
27
|
Requires-Dist: pytest>=8.3.3; extra == 'dev'
|
@@ -1,16 +1,19 @@
|
|
1
1
|
computer_use_ootb_internal/README.md,sha256=FxpW95lyub2iX73ZDfK6ML7SdEKg060H5I6Grub7li4,31
|
2
|
-
computer_use_ootb_internal/app_teachmode.py,sha256=
|
2
|
+
computer_use_ootb_internal/app_teachmode.py,sha256=5Ek9cY9-wZvgTw67noYHGvE-oWu28biXU--4kfamjAs,17127
|
3
3
|
computer_use_ootb_internal/app_teachmode_gradio.py,sha256=zAw-n3s20j1Jr0S4TzXHwllKV6APJ8HEHB1KqBuzriY,7907
|
4
4
|
computer_use_ootb_internal/dependency_check.py,sha256=y8RMEP6RXQzTgU1MS_1piBLtz4J-Hfn9RjUZg59dyvo,1333
|
5
|
-
computer_use_ootb_internal/
|
5
|
+
computer_use_ootb_internal/example_websocket_js.html,sha256=BLYwDExVlgiAX4vXVXW3RuP5KD8FXE4EFXIl54bwF7w,1322
|
6
|
+
computer_use_ootb_internal/requirements-lite.txt,sha256=2C4OH_GRzuDsR-c9VpJee_te-VqLOf-KDk3LXKi3qdk,282
|
6
7
|
computer_use_ootb_internal/run_teachmode_ootb_args.py,sha256=djr4E7_G_qG9H6qmRz1mrM9Yrcxf1tnlSPH5ZqykF5Y,6845
|
7
|
-
computer_use_ootb_internal/
|
8
|
+
computer_use_ootb_internal/service_teachmode.py,sha256=e81zp3B7CA2nMjA-3qoKF4P1hlNGRI7P1tBo1j21FBk,8082
|
9
|
+
computer_use_ootb_internal/service_teachmode_test.py,sha256=zpfBFFKD9WGLX4m77ajOBfmczpYsCa3_qTBweeSNRV8,1112
|
10
|
+
computer_use_ootb_internal/computer_use_demo/animation/click_animation.py,sha256=j3v-CrFp61mZiJ4-eT06txkOoguZipbakrQFj2d_mbk,7759
|
8
11
|
computer_use_ootb_internal/computer_use_demo/animation/icons8-select-cursor-transparent-96.gif,sha256=4LfwsfFQnREXrNRs32aJU2jO65JXianJoL_8q7-8elg,30966
|
9
12
|
computer_use_ootb_internal/computer_use_demo/executor/teachmode_executor.py,sha256=y7lg_PjMif2WwCKWWC7g8Ys2zPRMh08Vtt42fStujY4,16623
|
10
13
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/__init__.py,sha256=h2CNeuACklxVpJC65QR8_6AvSybEZLmeO45hY_-lLBs,61
|
11
14
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/gui_capture.py,sha256=CxFJbsSb68ERKH7-C4RaaZy7FIhhzrzGx5qQJ4C37cA,13907
|
12
15
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/gui_parser.py,sha256=KSTJ0cMwh3ahUMzHRaDgA2sVNUL4MNlF7qEBGN3G0SI,28993
|
13
|
-
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/test_capture.py,sha256=
|
16
|
+
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/test_capture.py,sha256=YbLpuD-mSFiOU7j6HKrtX05oRP9ciEBxxGIsyse-nPI,204
|
14
17
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/uia_parser.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
18
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/utils.py,sha256=GEA1ES7vOpHBg_Suxpl99reh34kRG4RQpp072JQBK5c,9787
|
16
19
|
computer_use_ootb_internal/computer_use_demo/gui_agent/gui_parser/simple_parser/icon_detection/icon_detection.py,sha256=ysTgvtjE1XM7QSrLLy1HD0i6_7iOb9GME5FWJljrJg0,9752
|
@@ -35,7 +38,7 @@ computer_use_ootb_internal/computer_use_demo/tools/computer_marbot.py,sha256=zZu
|
|
35
38
|
computer_use_ootb_internal/computer_use_demo/tools/edit.py,sha256=b0PwUitxckHCQqFP3ZwlthWdqNkn7WETeTHeB6-o98c,11486
|
36
39
|
computer_use_ootb_internal/computer_use_demo/tools/run.py,sha256=xhXdnBK1di9muaO44CEirL9hpGy3NmKbjfMpyeVmn8Y,1595
|
37
40
|
computer_use_ootb_internal/computer_use_demo/tools/screen_capture.py,sha256=L8qfvtUkPPQGt92N-2Zfw5ZTDBzLsDps39uMnX3_uSA,6857
|
38
|
-
computer_use_ootb_internal-0.0.
|
39
|
-
computer_use_ootb_internal-0.0.
|
40
|
-
computer_use_ootb_internal-0.0.
|
41
|
-
computer_use_ootb_internal-0.0.
|
41
|
+
computer_use_ootb_internal-0.0.97.post1.dist-info/METADATA,sha256=RodVMKF5EUHUHdzQg84aLdfxiM-PYC0d0gH8eRGWdjg,942
|
42
|
+
computer_use_ootb_internal-0.0.97.post1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
43
|
+
computer_use_ootb_internal-0.0.97.post1.dist-info/entry_points.txt,sha256=-AbmawU7IRQuDZihgVMVDrFoY4E6rnXYOUB-5vSeBKs,93
|
44
|
+
computer_use_ootb_internal-0.0.97.post1.dist-info/RECORD,,
|
File without changes
|