Import tool setting

This commit is contained in:
Xin Wang
2026-02-11 11:04:05 +08:00
parent 180a69ca67
commit 9304927fe9
5 changed files with 344 additions and 27 deletions

View File

@@ -72,6 +72,15 @@ TOOL_REGISTRY = {
"required": ["query"]
}
},
"current_time": {
"name": "当前时间",
"description": "获取当前本地时间",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
},
"code_interpreter": {
"name": "代码执行",
"description": "安全地执行Python代码",
@@ -83,6 +92,37 @@ TOOL_REGISTRY = {
"required": ["code"]
}
},
"take_phone": {
"name": "接听电话",
"description": "执行接听电话命令",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
},
"increase_volume": {
"name": "调高音量",
"description": "提升设备音量",
"parameters": {
"type": "object",
"properties": {
"step": {"type": "integer", "description": "调整步进默认1"}
},
"required": []
}
},
"decrease_volume": {
"name": "调低音量",
"description": "降低设备音量",
"parameters": {
"type": "object",
"properties": {
"step": {"type": "integer", "description": "调整步进默认1"}
},
"required": []
}
},
}
TOOL_CATEGORY_MAP = {
@@ -90,8 +130,12 @@ TOOL_CATEGORY_MAP = {
"weather": "query",
"translate": "query",
"knowledge": "query",
"calculator": "system",
"code_interpreter": "system",
"calculator": "query",
"current_time": "query",
"code_interpreter": "query",
"take_phone": "system",
"increase_volume": "system",
"decrease_volume": "system",
}
TOOL_ICON_MAP = {
@@ -99,27 +143,51 @@ TOOL_ICON_MAP = {
"weather": "CloudSun",
"translate": "Globe",
"knowledge": "Box",
"current_time": "Calendar",
"calculator": "Terminal",
"code_interpreter": "Terminal",
"take_phone": "Phone",
"increase_volume": "Volume2",
"decrease_volume": "Volume2",
}
def _seed_default_tools_if_empty(db: Session) -> None:
"""Seed default tools into DB when tool_resources is empty."""
if db.query(ToolResource).count() > 0:
return
def _sync_default_tools(db: Session) -> None:
"""Ensure built-in tools exist and keep system tool metadata aligned."""
changed = False
for tool_id, payload in TOOL_REGISTRY.items():
db.add(ToolResource(
id=tool_id,
user_id=1,
name=payload.get("name", tool_id),
description=payload.get("description", ""),
category=TOOL_CATEGORY_MAP.get(tool_id, "system"),
icon=TOOL_ICON_MAP.get(tool_id, "Wrench"),
enabled=True,
is_system=True,
))
db.commit()
row = db.query(ToolResource).filter(ToolResource.id == tool_id).first()
category = TOOL_CATEGORY_MAP.get(tool_id, "system")
icon = TOOL_ICON_MAP.get(tool_id, "Wrench")
if not row:
db.add(ToolResource(
id=tool_id,
user_id=1,
name=payload.get("name", tool_id),
description=payload.get("description", ""),
category=category,
icon=icon,
enabled=True,
is_system=True,
))
changed = True
continue
if row.is_system:
new_name = payload.get("name", row.name)
new_description = payload.get("description", row.description)
if row.name != new_name:
row.name = new_name
changed = True
if row.description != new_description:
row.description = new_description
changed = True
if row.category != category:
row.category = category
changed = True
if row.icon != icon:
row.icon = icon
changed = True
if changed:
db.commit()
@router.get("/list")
@@ -147,7 +215,7 @@ def list_tool_resources(
db: Session = Depends(get_db),
):
"""获取工具资源列表。system/query 仅表示工具执行类型,不代表权限。"""
_seed_default_tools_if_empty(db)
_sync_default_tools(db)
query = db.query(ToolResource)
if not include_system:
query = query.filter(ToolResource.is_system == False)
@@ -163,7 +231,7 @@ def list_tool_resources(
@router.get("/resources/{id}", response_model=ToolResourceOut)
def get_tool_resource(id: str, db: Session = Depends(get_db)):
"""获取单个工具资源详情。"""
_seed_default_tools_if_empty(db)
_sync_default_tools(db)
item = db.query(ToolResource).filter(ToolResource.id == id).first()
if not item:
raise HTTPException(status_code=404, detail="Tool resource not found")
@@ -173,7 +241,7 @@ def get_tool_resource(id: str, db: Session = Depends(get_db)):
@router.post("/resources", response_model=ToolResourceOut)
def create_tool_resource(data: ToolResourceCreate, db: Session = Depends(get_db)):
"""创建自定义工具资源。"""
_seed_default_tools_if_empty(db)
_sync_default_tools(db)
candidate_id = (data.id or "").strip()
if candidate_id and db.query(ToolResource).filter(ToolResource.id == candidate_id).first():
raise HTTPException(status_code=400, detail="Tool ID already exists")
@@ -197,7 +265,7 @@ def create_tool_resource(data: ToolResourceCreate, db: Session = Depends(get_db)
@router.put("/resources/{id}", response_model=ToolResourceOut)
def update_tool_resource(id: str, data: ToolResourceUpdate, db: Session = Depends(get_db)):
"""更新工具资源。"""
_seed_default_tools_if_empty(db)
_sync_default_tools(db)
item = db.query(ToolResource).filter(ToolResource.id == id).first()
if not item:
raise HTTPException(status_code=404, detail="Tool resource not found")
@@ -215,7 +283,7 @@ def update_tool_resource(id: str, data: ToolResourceUpdate, db: Session = Depend
@router.delete("/resources/{id}")
def delete_tool_resource(id: str, db: Session = Depends(get_db)):
"""删除工具资源。"""
_seed_default_tools_if_empty(db)
_sync_default_tools(db)
item = db.query(ToolResource).filter(ToolResource.id == id).first()
if not item:
raise HTTPException(status_code=404, detail="Tool resource not found")