bohr-agent-sdk 0.1.117__py3-none-any.whl → 0.1.119__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.
- {bohr_agent_sdk-0.1.117.dist-info → bohr_agent_sdk-0.1.119.dist-info}/METADATA +1 -1
- {bohr_agent_sdk-0.1.117.dist-info → bohr_agent_sdk-0.1.119.dist-info}/RECORD +8 -8
- dp/agent/cli/templates/ui/server/session_manager.py +1 -1
- dp/agent/cli/templates/ui/websocket-server.py +4 -2
- dp/agent/server/calculation_mcp_server.py +22 -16
- {bohr_agent_sdk-0.1.117.dist-info → bohr_agent_sdk-0.1.119.dist-info}/WHEEL +0 -0
- {bohr_agent_sdk-0.1.117.dist-info → bohr_agent_sdk-0.1.119.dist-info}/entry_points.txt +0 -0
- {bohr_agent_sdk-0.1.117.dist-info → bohr_agent_sdk-0.1.119.dist-info}/top_level.txt +0 -0
|
@@ -17,7 +17,7 @@ dp/agent/cli/templates/device/tescan_device.py.template,sha256=c7RIwWhfwp5WiPy1S
|
|
|
17
17
|
dp/agent/cli/templates/ui/__init__.py,sha256=QgYZneX7gKyajZIEvbHIEMD3av3bKj64E_eeDPBeuvY,14
|
|
18
18
|
dp/agent/cli/templates/ui/test_download.py,sha256=RzZ59pVd-4fYIbUbW6ZO1b1Twbycu5G6yb5yLFuT0oI,3002
|
|
19
19
|
dp/agent/cli/templates/ui/ui_utils.py,sha256=OMgQxZ-UvIJB_a58YBMypQKTI7N9B3AQBOR7kOTudRE,9774
|
|
20
|
-
dp/agent/cli/templates/ui/websocket-server.py,sha256=
|
|
20
|
+
dp/agent/cli/templates/ui/websocket-server.py,sha256=vhLsDuhQFxqp9RL7lWq3M8CP196VDZuoI3y_5YPqXQA,2968
|
|
21
21
|
dp/agent/cli/templates/ui/api/__init__.py,sha256=eq1djuBJYvWlGTgxXvT9A386Eu21FNCcB7gV2lU46dU,8
|
|
22
22
|
dp/agent/cli/templates/ui/api/config.py,sha256=ZhHApcXDrmO1JjI-Ok09ETYB-BVis390ZrMRt140DhQ,1018
|
|
23
23
|
dp/agent/cli/templates/ui/api/constants.py,sha256=mHY81zf4ksfKEOsSiVsWD_A_KcQ6wveLvAImCay_kVM,1391
|
|
@@ -47,7 +47,7 @@ dp/agent/cli/templates/ui/server/connection.py,sha256=DVlhx49gMjKVPxOpi7spAZiHZA
|
|
|
47
47
|
dp/agent/cli/templates/ui/server/file_watcher.py,sha256=t0e7IMgf4E1y0CxeboCqsVeZPBo1CGSw_qoO8wG6Wy4,2923
|
|
48
48
|
dp/agent/cli/templates/ui/server/middleware.py,sha256=bNR5aFqKjxv2einQ0e26aq6tiUW4SMses3IHkrmHDCk,1474
|
|
49
49
|
dp/agent/cli/templates/ui/server/models.py,sha256=obfMkFFB9qZZXDdwoC25u3tBlUC6Rz7sjeyuh7a_UWk,1680
|
|
50
|
-
dp/agent/cli/templates/ui/server/session_manager.py,sha256=
|
|
50
|
+
dp/agent/cli/templates/ui/server/session_manager.py,sha256=GviOjYZtdbd4Cpdxc0zfb1NV38uBvyJnzgd9uUusb9k,46528
|
|
51
51
|
dp/agent/cli/templates/ui/server/user_files.py,sha256=khkiyY2UOOysHqO6JgCPUDqtrInp83G1M62i3Lj-0aY,2995
|
|
52
52
|
dp/agent/cli/templates/ui/server/utils.py,sha256=f4NfwFBq_RdZyFn_KCW6ZThYW8TvQyVruK7PJZ-DA80,1530
|
|
53
53
|
dp/agent/client/__init__.py,sha256=yu7HYZwAkD7g5dL9JttLkGmspBcyOf-6OoCjci4oPDA,59
|
|
@@ -62,7 +62,7 @@ dp/agent/device/device/__init__.py,sha256=w7_1S16S1vWUq0RGl0GFgjq2vFkc5oNvy8cQTn
|
|
|
62
62
|
dp/agent/device/device/device.py,sha256=9ZRIJth-4qMO-i-u_b_cO3d6a4eTbTQjPaxFsV_zEkc,9643
|
|
63
63
|
dp/agent/device/device/types.py,sha256=JuxB-hjf1CjjvfBxCLwRAXVFlYS-nPEdiJpBWLFVCzo,1924
|
|
64
64
|
dp/agent/server/__init__.py,sha256=rckaYd8pbYyB4ENEhgjXKeGMXjdnrgcJpdM1gu5u1Wc,508
|
|
65
|
-
dp/agent/server/calculation_mcp_server.py,sha256=
|
|
65
|
+
dp/agent/server/calculation_mcp_server.py,sha256=Nq1lv-H1E8J1yNz85TCbl1GtSQXQGZfAIB1qKajZcNY,19664
|
|
66
66
|
dp/agent/server/preprocessor.py,sha256=XUWu7QOwo_sIDMYS2b1OTrM33EXEVH_73vk-ju1Ok8A,1264
|
|
67
67
|
dp/agent/server/utils.py,sha256=cIKaAg8UaP5yMwvIVTgUVBjy-B3S16bEdnucUf4UDIM,2055
|
|
68
68
|
dp/agent/server/executor/__init__.py,sha256=s95M5qKQk39Yi9qaVJZhk_nfj54quSf7EDghR3OCFUA,248
|
|
@@ -75,8 +75,8 @@ dp/agent/server/storage/bohrium_storage.py,sha256=EsKX4dWWvZTn2TEhZv4zsvihfDK0mm
|
|
|
75
75
|
dp/agent/server/storage/http_storage.py,sha256=KiySq7g9-iJr12XQCKKyJLn8wJoDnSRpQAR5_qPJ1ZU,1471
|
|
76
76
|
dp/agent/server/storage/local_storage.py,sha256=t1wfjByjXew9ws3PuUxWxmZQ0-Wt1a6t4wmj3fW62GI,1352
|
|
77
77
|
dp/agent/server/storage/oss_storage.py,sha256=pgjmi7Gir3Y5wkMDCvU4fvSls15fXT7Ax-h9MYHFPK0,3359
|
|
78
|
-
bohr_agent_sdk-0.1.
|
|
79
|
-
bohr_agent_sdk-0.1.
|
|
80
|
-
bohr_agent_sdk-0.1.
|
|
81
|
-
bohr_agent_sdk-0.1.
|
|
82
|
-
bohr_agent_sdk-0.1.
|
|
78
|
+
bohr_agent_sdk-0.1.119.dist-info/METADATA,sha256=oG4bst9eor1ytVutI5UGppqY8aJ-C9c12jKOGBoHh2g,11070
|
|
79
|
+
bohr_agent_sdk-0.1.119.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
80
|
+
bohr_agent_sdk-0.1.119.dist-info/entry_points.txt,sha256=5n5kneF5IbDQtoQ2WfF-QuBjDtsimJte9Rv9baSGgc0,86
|
|
81
|
+
bohr_agent_sdk-0.1.119.dist-info/top_level.txt,sha256=87xLUDhu_1nQHoGLwlhJ6XlO7OsjILh6i1nX6ljFzDo,3
|
|
82
|
+
bohr_agent_sdk-0.1.119.dist-info/RECORD,,
|
|
@@ -48,11 +48,13 @@ if __name__ == "__main__":
|
|
|
48
48
|
|
|
49
49
|
# uvicorn 始终监听 0.0.0.0 以支持所有配置的主机
|
|
50
50
|
uvicorn.run(
|
|
51
|
-
app,
|
|
52
|
-
host="0.0.0.0",
|
|
51
|
+
app,
|
|
52
|
+
host="0.0.0.0",
|
|
53
53
|
port=port,
|
|
54
54
|
log_level="info", # 使用 info 级别,过滤掉 warning
|
|
55
55
|
access_log=False, # 禁用访问日志,减少噪音
|
|
56
|
+
ws_ping_interval=20, # Send WebSocket ping every 20s to keep connection alive
|
|
57
|
+
ws_ping_timeout=30, # Disconnect if no pong received within 30s
|
|
56
58
|
# 添加自定义的日志配置
|
|
57
59
|
log_config={
|
|
58
60
|
"version": 1,
|
|
@@ -26,6 +26,7 @@ from .executor import executor_dict
|
|
|
26
26
|
from .storage import storage_dict
|
|
27
27
|
from .utils import get_logger, JobResult, Tool
|
|
28
28
|
logger = get_logger(__name__)
|
|
29
|
+
CALCULATION_MCP_WORKDIR = os.getenv("CALCULATION_MCP_WORKDIR", os.getcwd())
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
def parse_uri(uri):
|
|
@@ -81,7 +82,8 @@ def query_job_status(job_id: str, executor: Optional[dict] = None
|
|
|
81
82
|
status (str): One of "Running", "Succeeded" or "Failed"
|
|
82
83
|
"""
|
|
83
84
|
trace_id, exec_id = job_id.split("/")
|
|
84
|
-
|
|
85
|
+
workdir = os.path.join(CALCULATION_MCP_WORKDIR, trace_id)
|
|
86
|
+
with set_directory(workdir):
|
|
85
87
|
executor = load_job_info()["executor"] or executor
|
|
86
88
|
_, executor = init_executor(executor)
|
|
87
89
|
status = executor.query_status(exec_id)
|
|
@@ -96,7 +98,8 @@ def terminate_job(job_id: str, executor: Optional[dict] = None):
|
|
|
96
98
|
job_id (str): The ID of the calculation job
|
|
97
99
|
"""
|
|
98
100
|
trace_id, exec_id = job_id.split("/")
|
|
99
|
-
|
|
101
|
+
workdir = os.path.join(CALCULATION_MCP_WORKDIR, trace_id)
|
|
102
|
+
with set_directory(workdir):
|
|
100
103
|
executor = load_job_info()["executor"] or executor
|
|
101
104
|
_, executor = init_executor(executor)
|
|
102
105
|
executor.terminate(exec_id)
|
|
@@ -130,13 +133,15 @@ def handle_input_artifacts(fn, kwargs, storage):
|
|
|
130
133
|
kwargs.get(name) is not None):
|
|
131
134
|
uris = kwargs[name]
|
|
132
135
|
new_paths = []
|
|
133
|
-
for uri in uris:
|
|
136
|
+
for i, uri in enumerate(uris):
|
|
134
137
|
scheme, key = parse_uri(uri)
|
|
135
138
|
if scheme == storage_type:
|
|
136
139
|
s = storage
|
|
137
140
|
else:
|
|
138
141
|
s = storage_dict[scheme]()
|
|
139
|
-
|
|
142
|
+
dest_dir = Path("inputs") / name / f"item_{i:03d}"
|
|
143
|
+
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
144
|
+
path = s.download(key, str(dest_dir))
|
|
140
145
|
new_paths.append(Path(path))
|
|
141
146
|
logger.info("Artifact %s downloaded to %s" % (
|
|
142
147
|
uri, path))
|
|
@@ -172,13 +177,15 @@ def handle_input_artifacts(fn, kwargs, storage):
|
|
|
172
177
|
new_paths_dict = {}
|
|
173
178
|
for key_name, uris in uris_dict.items():
|
|
174
179
|
new_paths = []
|
|
175
|
-
for uri in uris:
|
|
180
|
+
for i, uri in enumerate(uris):
|
|
176
181
|
scheme, key = parse_uri(uri)
|
|
177
182
|
if scheme == storage_type:
|
|
178
183
|
s = storage
|
|
179
184
|
else:
|
|
180
185
|
s = storage_dict[scheme]()
|
|
181
|
-
|
|
186
|
+
dest_dir = Path("inputs") / name / key_name / f"item_{i:03d}"
|
|
187
|
+
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
188
|
+
path = s.download(key, str(dest_dir))
|
|
182
189
|
new_paths.append(Path(path))
|
|
183
190
|
logger.info("Artifact %s (key=%s) downloaded to %s" % (
|
|
184
191
|
uri, key_name, path))
|
|
@@ -237,7 +244,8 @@ def get_job_results(job_id: str, executor: Optional[dict] = None,
|
|
|
237
244
|
results (Any): results of the calculation job
|
|
238
245
|
"""
|
|
239
246
|
trace_id, exec_id = job_id.split("/")
|
|
240
|
-
|
|
247
|
+
workdir = os.path.join(CALCULATION_MCP_WORKDIR, trace_id)
|
|
248
|
+
with set_directory(workdir):
|
|
241
249
|
job_info = load_job_info()
|
|
242
250
|
executor = job_info["executor"] or executor
|
|
243
251
|
storage = job_info["storage"] or storage
|
|
@@ -383,17 +391,14 @@ class CalculationMCPServer:
|
|
|
383
391
|
**kwargs) -> SubmitResult:
|
|
384
392
|
trace_id = datetime.today().strftime('%Y-%m-%d-%H:%M:%S.%f')
|
|
385
393
|
logger.info("Job processing (Trace ID: %s)" % trace_id)
|
|
386
|
-
if
|
|
387
|
-
executor, storage, kwargs = preprocess_func(
|
|
388
|
-
executor, storage, kwargs)
|
|
389
|
-
executor_type, executor = init_executor(executor)
|
|
390
|
-
if create_workdir is False or (
|
|
391
|
-
create_workdir is None and inspect.iscoroutinefunction(fn)
|
|
392
|
-
and executor_type == "local"):
|
|
394
|
+
if create_workdir is False:
|
|
393
395
|
workdir = "."
|
|
394
396
|
else:
|
|
395
|
-
workdir = trace_id
|
|
397
|
+
workdir = os.path.join(CALCULATION_MCP_WORKDIR, trace_id)
|
|
396
398
|
with set_directory(workdir):
|
|
399
|
+
if preprocess_func is not None:
|
|
400
|
+
executor, storage, kwargs = preprocess_func(
|
|
401
|
+
executor, storage, kwargs)
|
|
397
402
|
job = {
|
|
398
403
|
"tool_name": fn.__name__,
|
|
399
404
|
"executor": executor,
|
|
@@ -403,6 +408,7 @@ class CalculationMCPServer:
|
|
|
403
408
|
json.dump(job, f, indent=4)
|
|
404
409
|
kwargs, input_artifacts = handle_input_artifacts(
|
|
405
410
|
fn, kwargs, storage)
|
|
411
|
+
executor_type, executor = init_executor(executor)
|
|
406
412
|
res = executor.submit(fn, kwargs)
|
|
407
413
|
exec_id = res["job_id"]
|
|
408
414
|
job_id = "%s/%s" % (workdir, exec_id)
|
|
@@ -433,7 +439,7 @@ class CalculationMCPServer:
|
|
|
433
439
|
and executor_type == "local"):
|
|
434
440
|
workdir = "."
|
|
435
441
|
else:
|
|
436
|
-
workdir = trace_id
|
|
442
|
+
workdir = os.path.join(CALCULATION_MCP_WORKDIR, trace_id)
|
|
437
443
|
with set_directory(workdir):
|
|
438
444
|
kwargs, input_artifacts = handle_input_artifacts(
|
|
439
445
|
fn, kwargs, storage)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|