fix: isolate startup tools and preview dialogs
This commit is contained in:
@@ -6,14 +6,19 @@ from types import SimpleNamespace
|
||||
from fastapi import HTTPException
|
||||
from routes.assistants import _validate_startup_actions
|
||||
from schemas import AssistantUpsert
|
||||
from services.config_resolver import _runtime_tool_ids
|
||||
|
||||
|
||||
def startup_body(*, phase: str = "opening") -> AssistantUpsert:
|
||||
def startup_body(
|
||||
*,
|
||||
phase: str = "opening",
|
||||
bind_tool: bool = False,
|
||||
) -> AssistantUpsert:
|
||||
return AssistantUpsert(
|
||||
name="启动动作测试",
|
||||
type="prompt",
|
||||
runtimeMode="pipeline",
|
||||
toolIds=["tool_message"],
|
||||
toolIds=["tool_message"] if bind_tool else [],
|
||||
startup={
|
||||
"executionMode": "sequential",
|
||||
"actions": [
|
||||
@@ -45,20 +50,52 @@ class FakeSession:
|
||||
self.tool = tool
|
||||
|
||||
async def get(self, _model, tool_id):
|
||||
return self.tool if tool_id == self.tool.id else None
|
||||
return self.tool if self.tool is not None and tool_id == self.tool.id else None
|
||||
|
||||
|
||||
class StartupActionValidationTests(unittest.IsolatedAsyncioTestCase):
|
||||
def test_runtime_pool_includes_bound_and_startup_only_tools(self):
|
||||
self.assertEqual(
|
||||
_runtime_tool_ids(
|
||||
["conversation_tool", "shared_tool"],
|
||||
{
|
||||
"actions": [
|
||||
{"tool_id": "opening_tool"},
|
||||
{"toolId": "shared_tool"},
|
||||
]
|
||||
},
|
||||
),
|
||||
["conversation_tool", "shared_tool", "opening_tool"],
|
||||
)
|
||||
|
||||
def test_realtime_rejects_startup_actions(self):
|
||||
with self.assertRaisesRegex(ValueError, "Realtime"):
|
||||
AssistantUpsert(
|
||||
name="Realtime 启动动作",
|
||||
type="prompt",
|
||||
runtimeMode="realtime",
|
||||
toolIds=["tool_message"],
|
||||
startup=startup_body().startup,
|
||||
)
|
||||
|
||||
async def test_startup_tool_does_not_need_conversation_binding(self):
|
||||
tool = SimpleNamespace(
|
||||
id="tool_message",
|
||||
name="重要提示",
|
||||
function_name="show_message",
|
||||
type="client",
|
||||
status="active",
|
||||
definition={
|
||||
"config": {
|
||||
"wait_for_response": True,
|
||||
"response_wait_mode": "session",
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
body = startup_body(bind_tool=False)
|
||||
await _validate_startup_actions(FakeSession(tool), body)
|
||||
self.assertEqual(body.tool_ids, [])
|
||||
|
||||
async def test_show_message_requires_session_wait(self):
|
||||
tool = SimpleNamespace(
|
||||
id="tool_message",
|
||||
|
||||
Reference in New Issue
Block a user