Add wait_for_response functionality to ToolResource and related components. Update API models, schemas, and routers to support new parameter. Enhance UI components to manage wait_for_response state, ensuring proper integration across the application.
This commit is contained in:
@@ -314,6 +314,7 @@ class DuplexPipeline:
|
||||
self._runtime_tool_default_args: Dict[str, Dict[str, Any]] = {}
|
||||
self._runtime_tool_id_map: Dict[str, str] = {}
|
||||
self._runtime_tool_display_names: Dict[str, str] = {}
|
||||
self._runtime_tool_wait_for_response: Dict[str, bool] = {}
|
||||
self._pending_tool_waiters: Dict[str, asyncio.Future] = {}
|
||||
self._early_tool_results: Dict[str, Dict[str, Any]] = {}
|
||||
self._completed_tool_call_ids: set[str] = set()
|
||||
@@ -337,6 +338,7 @@ class DuplexPipeline:
|
||||
self._runtime_tool_default_args = self._resolved_tool_default_args_map()
|
||||
self._runtime_tool_id_map = self._resolved_tool_id_map()
|
||||
self._runtime_tool_display_names = self._resolved_tool_display_name_map()
|
||||
self._runtime_tool_wait_for_response = self._resolved_tool_wait_for_response_map()
|
||||
self._initial_greeting_emitted = False
|
||||
|
||||
if self._server_tool_executor is None:
|
||||
@@ -441,12 +443,14 @@ class DuplexPipeline:
|
||||
self._runtime_tool_default_args = self._resolved_tool_default_args_map()
|
||||
self._runtime_tool_id_map = self._resolved_tool_id_map()
|
||||
self._runtime_tool_display_names = self._resolved_tool_display_name_map()
|
||||
self._runtime_tool_wait_for_response = self._resolved_tool_wait_for_response_map()
|
||||
elif "tools" in metadata:
|
||||
self._runtime_tools = []
|
||||
self._runtime_tool_executor = {}
|
||||
self._runtime_tool_default_args = {}
|
||||
self._runtime_tool_id_map = {}
|
||||
self._runtime_tool_display_names = {}
|
||||
self._runtime_tool_wait_for_response = {}
|
||||
|
||||
if self.llm_service and hasattr(self.llm_service, "set_knowledge_config"):
|
||||
self.llm_service.set_knowledge_config(self._resolved_knowledge_config())
|
||||
@@ -1577,6 +1581,25 @@ class DuplexPipeline:
|
||||
result[name] = dict(raw_defaults)
|
||||
return result
|
||||
|
||||
def _resolved_tool_wait_for_response_map(self) -> Dict[str, bool]:
|
||||
result: Dict[str, bool] = {}
|
||||
for item in self._runtime_tools:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
fn = item.get("function")
|
||||
if isinstance(fn, dict) and fn.get("name"):
|
||||
name = str(fn.get("name")).strip()
|
||||
else:
|
||||
name = str(item.get("name") or "").strip()
|
||||
if not name:
|
||||
continue
|
||||
raw_wait = item.get("waitForResponse")
|
||||
if raw_wait is None:
|
||||
raw_wait = item.get("wait_for_response")
|
||||
if isinstance(raw_wait, bool):
|
||||
result[name] = raw_wait
|
||||
return result
|
||||
|
||||
def _resolved_tool_id_map(self) -> Dict[str, str]:
|
||||
result: Dict[str, str] = {}
|
||||
for item in self._runtime_tools:
|
||||
@@ -1647,6 +1670,9 @@ class DuplexPipeline:
|
||||
def _tool_display_name(self, tool_name: str) -> str:
|
||||
return str(self._runtime_tool_display_names.get(tool_name) or tool_name).strip()
|
||||
|
||||
def _tool_wait_for_response(self, tool_name: str) -> bool:
|
||||
return bool(self._runtime_tool_wait_for_response.get(tool_name, False))
|
||||
|
||||
def _tool_executor(self, tool_call: Dict[str, Any]) -> str:
|
||||
name = self._tool_name(tool_call)
|
||||
if name and name in self._runtime_tool_executor:
|
||||
@@ -1873,6 +1899,8 @@ class DuplexPipeline:
|
||||
tool_name = self._tool_name(enriched_tool_call) or "unknown_tool"
|
||||
tool_id = self._tool_id_for_name(tool_name)
|
||||
tool_display_name = self._tool_display_name(tool_name) or tool_name
|
||||
wait_for_response = self._tool_wait_for_response(tool_name)
|
||||
enriched_tool_call["wait_for_response"] = wait_for_response
|
||||
call_id = str(enriched_tool_call.get("id") or "").strip()
|
||||
fn_payload = (
|
||||
dict(enriched_tool_call.get("function"))
|
||||
@@ -1906,6 +1934,7 @@ class DuplexPipeline:
|
||||
tool_name=tool_name,
|
||||
tool_id=tool_id,
|
||||
tool_display_name=tool_display_name,
|
||||
wait_for_response=wait_for_response,
|
||||
arguments=tool_arguments,
|
||||
executor=executor,
|
||||
timeout_ms=int(self._TOOL_WAIT_TIMEOUT_SECONDS * 1000),
|
||||
|
||||
Reference in New Issue
Block a user