Add parameter schema and defaults to ToolResource model and schemas. Implement runtime tool resolution in assistants and tools routers, ensuring proper handling of tool parameters. Update tests to validate new functionality and ensure correct integration of parameter handling in the API.

This commit is contained in:
Xin Wang
2026-02-27 14:44:28 +08:00
parent d942c85eff
commit 5f768edf68
13 changed files with 397 additions and 9 deletions

View File

@@ -243,6 +243,26 @@ class TestAssistantAPI:
assert payload["sessionStartMetadata"]["systemPrompt"] == sample_assistant_data["prompt"]
assert payload["sessionStartMetadata"]["history"]["assistantId"] == assistant_id
def test_runtime_config_resolves_selected_tools_into_runtime_definitions(self, client, sample_assistant_data):
sample_assistant_data["tools"] = ["increase_volume", "calculator"]
assistant_resp = client.post("/api/assistants", json=sample_assistant_data)
assert assistant_resp.status_code == 200
assistant_id = assistant_resp.json()["id"]
runtime_resp = client.get(f"/api/assistants/{assistant_id}/runtime-config")
assert runtime_resp.status_code == 200
metadata = runtime_resp.json()["sessionStartMetadata"]
tools = metadata["tools"]
assert isinstance(tools, list)
assert len(tools) == 2
by_name = {item["function"]["name"]: item for item in tools}
assert by_name["increase_volume"]["executor"] == "client"
assert by_name["increase_volume"]["defaultArgs"]["step"] == 1
assert by_name["calculator"]["executor"] == "server"
assert by_name["calculator"]["function"]["parameters"]["type"] == "object"
assert "expression" in by_name["calculator"]["function"]["parameters"]["properties"]
def test_runtime_config_text_mode_when_voice_output_disabled(self, client, sample_assistant_data):
sample_assistant_data["voiceOutputEnabled"] = False
assistant_resp = client.post("/api/assistants", json=sample_assistant_data)

View File

@@ -281,6 +281,9 @@ class TestToolResourceCRUD:
assert payload["total"] >= 1
ids = [item["id"] for item in payload["list"]]
assert "calculator" in ids
calculator = next((item for item in payload["list"] if item["id"] == "calculator"), None)
assert calculator is not None
assert calculator["parameter_schema"]["type"] == "object"
def test_create_update_delete_tool_resource(self, client):
create_resp = client.post("/api/tools/resources", json={
@@ -292,6 +295,12 @@ class TestToolResourceCRUD:
"http_url": "https://example.com/search",
"http_headers": {},
"http_timeout_ms": 10000,
"parameter_schema": {
"type": "object",
"properties": {"keyword": {"type": "string"}},
"required": ["keyword"]
},
"parameter_defaults": {"limit": 10},
"enabled": True,
})
assert create_resp.status_code == 200
@@ -299,15 +308,19 @@ class TestToolResourceCRUD:
tool_id = created["id"]
assert created["name"] == "自定义网页抓取"
assert created["is_system"] is False
assert created["parameter_schema"]["required"] == ["keyword"]
assert created["parameter_defaults"]["limit"] == 10
update_resp = client.put(f"/api/tools/resources/{tool_id}", json={
"name": "自定义网页检索",
"category": "system",
"parameter_defaults": {"limit": 20},
})
assert update_resp.status_code == 200
updated = update_resp.json()
assert updated["name"] == "自定义网页检索"
assert updated["category"] == "system"
assert updated["parameter_defaults"]["limit"] == 20
get_resp = client.get(f"/api/tools/resources/{tool_id}")
assert get_resp.status_code == 200