Add manual opener tool calls to Assistant model and API
- Introduced `manual_opener_tool_calls` field in the Assistant model to support custom tool calls. - Updated AssistantBase and AssistantUpdate schemas to include the new field. - Implemented normalization and migration logic for handling manual opener tool calls in the API. - Enhanced runtime metadata to include manual opener tool calls in responses. - Updated tests to validate the new functionality and ensure proper handling of tool calls. - Refactored tool ID normalization to support legacy tool names for backward compatibility.
This commit is contained in:
@@ -21,6 +21,7 @@ class TestAssistantAPI:
|
||||
data = response.json()
|
||||
assert data["name"] == sample_assistant_data["name"]
|
||||
assert data["opener"] == sample_assistant_data["opener"]
|
||||
assert data["manualOpenerToolCalls"] == []
|
||||
assert data["prompt"] == sample_assistant_data["prompt"]
|
||||
assert data["language"] == sample_assistant_data["language"]
|
||||
assert data["voiceOutputEnabled"] is True
|
||||
@@ -67,6 +68,9 @@ class TestAssistantAPI:
|
||||
"prompt": "You are an updated assistant.",
|
||||
"speed": 1.5,
|
||||
"voiceOutputEnabled": False,
|
||||
"manualOpenerToolCalls": [
|
||||
{"toolName": "text_msg_prompt", "arguments": {"msg": "请选择服务类型"}}
|
||||
],
|
||||
}
|
||||
response = client.put(f"/api/assistants/{assistant_id}", json=update_data)
|
||||
assert response.status_code == 200
|
||||
@@ -75,6 +79,9 @@ class TestAssistantAPI:
|
||||
assert data["prompt"] == "You are an updated assistant."
|
||||
assert data["speed"] == 1.5
|
||||
assert data["voiceOutputEnabled"] is False
|
||||
assert data["manualOpenerToolCalls"] == [
|
||||
{"toolName": "text_msg_prompt", "arguments": {"msg": "请选择服务类型"}}
|
||||
]
|
||||
|
||||
def test_delete_assistant(self, client, sample_assistant_data):
|
||||
"""Test deleting an assistant"""
|
||||
@@ -205,6 +212,7 @@ class TestAssistantAPI:
|
||||
"voice": voice_id,
|
||||
"prompt": "runtime prompt",
|
||||
"opener": "runtime opener",
|
||||
"manualOpenerToolCalls": [{"toolName": "text_msg_prompt", "arguments": {"msg": "欢迎"}}],
|
||||
"speed": 1.1,
|
||||
})
|
||||
assistant_resp = client.post("/api/assistants", json=sample_assistant_data)
|
||||
@@ -217,8 +225,10 @@ class TestAssistantAPI:
|
||||
|
||||
assert payload["assistantId"] == assistant_id
|
||||
metadata = payload["sessionStartMetadata"]
|
||||
assert metadata["systemPrompt"] == "runtime prompt"
|
||||
assert metadata["systemPrompt"].startswith("runtime prompt")
|
||||
assert "Tool usage policy:" in metadata["systemPrompt"]
|
||||
assert metadata["greeting"] == "runtime opener"
|
||||
assert metadata["manualOpenerToolCalls"] == [{"toolName": "text_msg_prompt", "arguments": {"msg": "欢迎"}}]
|
||||
assert metadata["services"]["llm"]["model"] == sample_llm_model_data["model_name"]
|
||||
assert metadata["services"]["asr"]["model"] == sample_asr_model_data["model_name"]
|
||||
assert metadata["services"]["asr"]["baseUrl"] == sample_asr_model_data["base_url"]
|
||||
@@ -239,8 +249,10 @@ class TestAssistantAPI:
|
||||
assert payload["assistantId"] == assistant_id
|
||||
assert payload["assistant"]["assistantId"] == assistant_id
|
||||
assert payload["assistant"]["configVersionId"].startswith(f"asst_{assistant_id}_")
|
||||
assert payload["assistant"]["systemPrompt"] == sample_assistant_data["prompt"]
|
||||
assert payload["sessionStartMetadata"]["systemPrompt"] == sample_assistant_data["prompt"]
|
||||
assert payload["assistant"]["systemPrompt"].startswith(sample_assistant_data["prompt"])
|
||||
assert "Tool usage policy:" in payload["assistant"]["systemPrompt"]
|
||||
assert payload["sessionStartMetadata"]["systemPrompt"].startswith(sample_assistant_data["prompt"])
|
||||
assert "Tool usage policy:" in payload["sessionStartMetadata"]["systemPrompt"]
|
||||
assert payload["sessionStartMetadata"]["history"]["assistantId"] == assistant_id
|
||||
|
||||
def test_runtime_config_resolves_selected_tools_into_runtime_definitions(self, client, sample_assistant_data):
|
||||
@@ -263,6 +275,30 @@ class TestAssistantAPI:
|
||||
assert by_name["calculator"]["function"]["parameters"]["type"] == "object"
|
||||
assert "expression" in by_name["calculator"]["function"]["parameters"]["properties"]
|
||||
|
||||
def test_runtime_config_normalizes_legacy_voice_message_prompt_tool_id(self, client, sample_assistant_data):
|
||||
sample_assistant_data["tools"] = ["voice_message_prompt"]
|
||||
sample_assistant_data["manualOpenerToolCalls"] = [
|
||||
{"toolName": "voice_message_prompt", "arguments": {"msg": "您好"}}
|
||||
]
|
||||
assistant_resp = client.post("/api/assistants", json=sample_assistant_data)
|
||||
assert assistant_resp.status_code == 200
|
||||
assistant_payload = assistant_resp.json()
|
||||
assistant_id = assistant_payload["id"]
|
||||
assert assistant_payload["tools"] == ["voice_msg_prompt"]
|
||||
assert assistant_payload["manualOpenerToolCalls"] == [
|
||||
{"toolName": "voice_msg_prompt", "arguments": {"msg": "您好"}}
|
||||
]
|
||||
|
||||
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"]
|
||||
by_name = {item["function"]["name"]: item for item in tools}
|
||||
assert "voice_msg_prompt" in by_name
|
||||
assert metadata["manualOpenerToolCalls"] == [
|
||||
{"toolName": "voice_msg_prompt", "arguments": {"msg": "您好"}}
|
||||
]
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user