# Bohrium Science Agent SDK
这是DP Tech的Bohrium Science Agent SDK,提供了一个命令行工具dp-agent,用于管理科学计算任务。同时提供了Python SDK用于开发自定义的科学计算应用。
## 安装
```bash
pip install bohr-agent-sdk -i https://pypi.org/simple --upgrade
```
## CLI 使用方法
安装后,您可以使用以下命令:
### 获取资源
```bash
# 获取基础代码结构
dp-agent fetch scaffolding --type=calculation/device
# 获取配置文件
dp-agent fetch config
```
`fetch config` 命令会下载 .env 配置文件并替换部分动态变量,如 MQTT_DEVICE_ID。
注意:出于安全考虑,此功能仅在内网环境可用。其他环境需要手动配置。
### 运行命令
```bash
# 运行实验环境
dp-agent run tool device
# 运行云环境
dp-agent run tool cloud
# 运行计算环境
dp-agent run tool calculation
# 运行代理
dp-agent run agent
# 调试模式
dp-agent run debug
```
## SDK 快速入门
Bohrium Science Agent SDK 提供了两种主要的开发模式:实验室模式(Lab)和云模式(Cloud)。
### 基础结构
安装完成并运行 `dp-agent fetch scaffolding` 后,您将获得以下基础项目结构:
```
your-project/
├── lab/ # 实验室模式相关代码
│ ├── __init__.py
│ └── tescan_device.py # 设备控制示例
├── cloud/ # 云模式相关代码
│ └── __init__.py
└── main.py # 主程序入口
```
### 实验室模式开发
实验室模式主要用于控制本地实验设备。以下是一个基于 Tescan 设备的示例:
```python
from typing import Dict, TypedDict
from dp.agent.device.device import Device, action, BaseParams, SuccessResult
class TakePictureParams(BaseParams):
"""拍照参数"""
horizontal_width: str
class PictureData(TypedDict):
"""照片数据"""
image_id: str
class PictureResult(SuccessResult):
"""拍照结果"""
data: PictureData
class MyDevice(Device):
device_name = "my_device"
@action("take_picture")
def take_picture(self, params: TakePictureParams) -> PictureResult:
"""拍照动作
Args:
params: 拍照参数
- horizontal_width: 图片水平宽度
"""
hw = params.get("horizontal_width", "default")
return PictureResult(
message=f"Picture taken with {self.device_name}",
data={"image_id": "image_123"}
)
```
### 云端开发
云模式基于 MCP (Message Control Protocol) 实现,用于处理远程设备控制和任务调度。register_mcp_tools 通过 python 的自省和反射机制实现了设备控制的自动注册,无需重复实现操作定义。
以下展示如何创建设备并注册到 MCP 服务器:
```python
"""
Example of using the bohr-agent-sdk cloud functionality.
"""
import signal
import sys
from dp.agent.cloud import mcp, get_mqtt_cloud_instance
from dp.agent.device.device import TescanDevice, register_mcp_tools
def signal_handler(sig, frame):
"""Handle SIGINT signal to gracefully shutdown."""
print("Shutting down...")
get_mqtt_cloud_instance().stop()
sys.exit(0)
def main():
"""Start the cloud services."""
print("Starting Tescan Device Twin Cloud Services...")
# Register signal handler
signal.signal(signal.SIGINT, signal_handler)
# Create device instance
device = TescanDevice(mcp, device)
# Register device tools
register_mcp_tools(device)
# Start MCP server
print("Starting MCP server...")
mcp.run(transport="sse")
if __name__ == "__main__":
main()
```
### 配置说明
在 `.env` 文件中配置必要的环境变量:
```
MQTT_INSTANCE_ID=your_instance_id
MQTT_ENDPOINT=your_endpoint
MQTT_DEVICE_ID=your_device_id
MQTT_GROUP_ID=your_group_id
MQTT_AK=your_access_key
MQTT_SK=your_secret_key
```
### 主要功能
- 设备控制接口(Lab模式)
- 设备初始化
- 命令执行
- 状态监控
- 云端任务处理(Cloud模式)
- 任务队列管理
- 计算资源调度
- 结果回传
更详细的API文档请参考代码中的注释。
Raw data
{
"_id": null,
"home_page": "https://github.com/dptech-corp/bohr-agent-sdk/",
"name": "bohr-agent-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "liupeng <liupeng@dp.tech>, zjgemi <liuxzj@dp.tech>",
"keywords": "agent SDK, AI for science",
"author": "DP Technology",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/b0/eb/615568a0d4fb04206ac3aa4e7a0349473052201fd1dd4862578fe63830b1/bohr_agent_sdk-0.1.19.tar.gz",
"platform": null,
"description": "# Bohrium Science Agent SDK\n\n\u8fd9\u662fDP Tech\u7684Bohrium Science Agent SDK\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u547d\u4ee4\u884c\u5de5\u5177dp-agent\uff0c\u7528\u4e8e\u7ba1\u7406\u79d1\u5b66\u8ba1\u7b97\u4efb\u52a1\u3002\u540c\u65f6\u63d0\u4f9b\u4e86Python SDK\u7528\u4e8e\u5f00\u53d1\u81ea\u5b9a\u4e49\u7684\u79d1\u5b66\u8ba1\u7b97\u5e94\u7528\u3002\n\n## \u5b89\u88c5\n\n```bash\npip install bohr-agent-sdk -i https://pypi.org/simple --upgrade\n```\n\n## CLI \u4f7f\u7528\u65b9\u6cd5\n\n\u5b89\u88c5\u540e\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\uff1a\n\n### \u83b7\u53d6\u8d44\u6e90\n\n```bash\n# \u83b7\u53d6\u57fa\u7840\u4ee3\u7801\u7ed3\u6784\ndp-agent fetch scaffolding --type=calculation/device\n\n# \u83b7\u53d6\u914d\u7f6e\u6587\u4ef6\ndp-agent fetch config\n```\n\n`fetch config` \u547d\u4ee4\u4f1a\u4e0b\u8f7d .env \u914d\u7f6e\u6587\u4ef6\u5e76\u66ff\u6362\u90e8\u5206\u52a8\u6001\u53d8\u91cf\uff0c\u5982 MQTT_DEVICE_ID\u3002\n\u6ce8\u610f\uff1a\u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u6b64\u529f\u80fd\u4ec5\u5728\u5185\u7f51\u73af\u5883\u53ef\u7528\u3002\u5176\u4ed6\u73af\u5883\u9700\u8981\u624b\u52a8\u914d\u7f6e\u3002\n\n### \u8fd0\u884c\u547d\u4ee4\n\n```bash\n# \u8fd0\u884c\u5b9e\u9a8c\u73af\u5883\ndp-agent run tool device\n\n# \u8fd0\u884c\u4e91\u73af\u5883\ndp-agent run tool cloud\n\n# \u8fd0\u884c\u8ba1\u7b97\u73af\u5883\ndp-agent run tool calculation\n\n# \u8fd0\u884c\u4ee3\u7406\ndp-agent run agent\n\n# \u8c03\u8bd5\u6a21\u5f0f\ndp-agent run debug\n```\n\n## SDK \u5feb\u901f\u5165\u95e8\n\nBohrium Science Agent SDK \u63d0\u4f9b\u4e86\u4e24\u79cd\u4e3b\u8981\u7684\u5f00\u53d1\u6a21\u5f0f\uff1a\u5b9e\u9a8c\u5ba4\u6a21\u5f0f\uff08Lab\uff09\u548c\u4e91\u6a21\u5f0f\uff08Cloud\uff09\u3002\n\n### \u57fa\u7840\u7ed3\u6784\n\n\u5b89\u88c5\u5b8c\u6210\u5e76\u8fd0\u884c `dp-agent fetch scaffolding` \u540e\uff0c\u60a8\u5c06\u83b7\u5f97\u4ee5\u4e0b\u57fa\u7840\u9879\u76ee\u7ed3\u6784\uff1a\n\n```\nyour-project/\n\u251c\u2500\u2500 lab/ # \u5b9e\u9a8c\u5ba4\u6a21\u5f0f\u76f8\u5173\u4ee3\u7801\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 tescan_device.py # \u8bbe\u5907\u63a7\u5236\u793a\u4f8b\n\u251c\u2500\u2500 cloud/ # \u4e91\u6a21\u5f0f\u76f8\u5173\u4ee3\u7801\n\u2502 \u2514\u2500\u2500 __init__.py\n\u2514\u2500\u2500 main.py # \u4e3b\u7a0b\u5e8f\u5165\u53e3\n```\n\n### \u5b9e\u9a8c\u5ba4\u6a21\u5f0f\u5f00\u53d1\n\n\u5b9e\u9a8c\u5ba4\u6a21\u5f0f\u4e3b\u8981\u7528\u4e8e\u63a7\u5236\u672c\u5730\u5b9e\u9a8c\u8bbe\u5907\u3002\u4ee5\u4e0b\u662f\u4e00\u4e2a\u57fa\u4e8e Tescan \u8bbe\u5907\u7684\u793a\u4f8b\uff1a\n\n```python\nfrom typing import Dict, TypedDict\nfrom dp.agent.device.device import Device, action, BaseParams, SuccessResult\n\nclass TakePictureParams(BaseParams):\n \"\"\"\u62cd\u7167\u53c2\u6570\"\"\"\n horizontal_width: str\n\nclass PictureData(TypedDict):\n \"\"\"\u7167\u7247\u6570\u636e\"\"\"\n image_id: str\n\nclass PictureResult(SuccessResult):\n \"\"\"\u62cd\u7167\u7ed3\u679c\"\"\"\n data: PictureData\n\nclass MyDevice(Device):\n device_name = \"my_device\"\n \n @action(\"take_picture\")\n def take_picture(self, params: TakePictureParams) -> PictureResult:\n \"\"\"\u62cd\u7167\u52a8\u4f5c\n \n Args:\n params: \u62cd\u7167\u53c2\u6570\n - horizontal_width: \u56fe\u7247\u6c34\u5e73\u5bbd\u5ea6\n \"\"\"\n hw = params.get(\"horizontal_width\", \"default\")\n return PictureResult(\n message=f\"Picture taken with {self.device_name}\",\n data={\"image_id\": \"image_123\"}\n )\n```\n\n### \u4e91\u7aef\u5f00\u53d1\n\n\u4e91\u6a21\u5f0f\u57fa\u4e8e MCP (Message Control Protocol) \u5b9e\u73b0\uff0c\u7528\u4e8e\u5904\u7406\u8fdc\u7a0b\u8bbe\u5907\u63a7\u5236\u548c\u4efb\u52a1\u8c03\u5ea6\u3002register_mcp_tools \u901a\u8fc7 python \u7684\u81ea\u7701\u548c\u53cd\u5c04\u673a\u5236\u5b9e\u73b0\u4e86\u8bbe\u5907\u63a7\u5236\u7684\u81ea\u52a8\u6ce8\u518c\uff0c\u65e0\u9700\u91cd\u590d\u5b9e\u73b0\u64cd\u4f5c\u5b9a\u4e49\u3002\n\u4ee5\u4e0b\u5c55\u793a\u5982\u4f55\u521b\u5efa\u8bbe\u5907\u5e76\u6ce8\u518c\u5230 MCP \u670d\u52a1\u5668\uff1a\n\n```python\n\"\"\"\nExample of using the bohr-agent-sdk cloud functionality.\n\"\"\"\nimport signal\nimport sys\nfrom dp.agent.cloud import mcp, get_mqtt_cloud_instance\nfrom dp.agent.device.device import TescanDevice, register_mcp_tools\n\ndef signal_handler(sig, frame):\n \"\"\"Handle SIGINT signal to gracefully shutdown.\"\"\"\n print(\"Shutting down...\")\n get_mqtt_cloud_instance().stop()\n sys.exit(0)\n\ndef main():\n \"\"\"Start the cloud services.\"\"\"\n print(\"Starting Tescan Device Twin Cloud Services...\")\n \n # Register signal handler\n signal.signal(signal.SIGINT, signal_handler)\n \n # Create device instance\n device = TescanDevice(mcp, device)\n \n # Register device tools\n register_mcp_tools(device)\n \n # Start MCP server\n print(\"Starting MCP server...\")\n mcp.run(transport=\"sse\")\n\nif __name__ == \"__main__\":\n main()\n```\n\n\n### \u914d\u7f6e\u8bf4\u660e\n\n\u5728 `.env` \u6587\u4ef6\u4e2d\u914d\u7f6e\u5fc5\u8981\u7684\u73af\u5883\u53d8\u91cf\uff1a\n\n```\nMQTT_INSTANCE_ID=your_instance_id\nMQTT_ENDPOINT=your_endpoint\nMQTT_DEVICE_ID=your_device_id\nMQTT_GROUP_ID=your_group_id\nMQTT_AK=your_access_key\nMQTT_SK=your_secret_key\n```\n\n### \u4e3b\u8981\u529f\u80fd\n\n- \u8bbe\u5907\u63a7\u5236\u63a5\u53e3\uff08Lab\u6a21\u5f0f\uff09\n - \u8bbe\u5907\u521d\u59cb\u5316\n - \u547d\u4ee4\u6267\u884c\n - \u72b6\u6001\u76d1\u63a7\n \n- \u4e91\u7aef\u4efb\u52a1\u5904\u7406\uff08Cloud\u6a21\u5f0f\uff09\n - \u4efb\u52a1\u961f\u5217\u7ba1\u7406\n - \u8ba1\u7b97\u8d44\u6e90\u8c03\u5ea6\n - \u7ed3\u679c\u56de\u4f20\n\n\u66f4\u8be6\u7ec6\u7684API\u6587\u6863\u8bf7\u53c2\u8003\u4ee3\u7801\u4e2d\u7684\u6ce8\u91ca\u3002\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "SDK for scientific agents",
"version": "0.1.19",
"project_urls": {
"Bug Reports": "https://github.com/dptech-corp/bohr-agent-sdk/issues",
"Homepage": "https://github.com/dptech-corp/bohr-agent-sdk",
"repository": "https://github.com/dptech-corp/bohr-agent-sdk"
},
"split_keywords": [
"agent sdk",
" ai for science"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "89e4a90a9d730452001ce9f583223529fa68d9ad80ac5fc9003ae0b9ddf1317d",
"md5": "7ea3c638d8c9658005e8f93962b9f909",
"sha256": "5154a95064b16fac3d8672fa610d65c75f88eb6d863408b965b68d573490feb0"
},
"downloads": -1,
"filename": "bohr_agent_sdk-0.1.19-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7ea3c638d8c9658005e8f93962b9f909",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 47291,
"upload_time": "2025-07-15T06:46:34",
"upload_time_iso_8601": "2025-07-15T06:46:34.639099Z",
"url": "https://files.pythonhosted.org/packages/89/e4/a90a9d730452001ce9f583223529fa68d9ad80ac5fc9003ae0b9ddf1317d/bohr_agent_sdk-0.1.19-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b0eb615568a0d4fb04206ac3aa4e7a0349473052201fd1dd4862578fe63830b1",
"md5": "13fc0c52a48748921025bbe3190123d5",
"sha256": "a856bd07cfb9eea596af061bac19e4d45fa8989daa0abe485311180a6ca2e521"
},
"downloads": -1,
"filename": "bohr_agent_sdk-0.1.19.tar.gz",
"has_sig": false,
"md5_digest": "13fc0c52a48748921025bbe3190123d5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 38193,
"upload_time": "2025-07-15T06:46:36",
"upload_time_iso_8601": "2025-07-15T06:46:36.079685Z",
"url": "https://files.pythonhosted.org/packages/b0/eb/615568a0d4fb04206ac3aa4e7a0349473052201fd1dd4862578fe63830b1/bohr_agent_sdk-0.1.19.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-15 06:46:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dptech-corp",
"github_project": "bohr-agent-sdk",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "bohr-agent-sdk"
}