From 1cf7953d68074aae80e31ede61a914c6498fe5ea Mon Sep 17 00:00:00 2001 From: Harry <164126595+wwyharry@users.noreply.github.com> Date: Wed, 25 Mar 2026 22:38:34 +0800 Subject: [PATCH 1/4] Use get_running_loop instead of get_event_loop asyncio.get_event_loop() is deprecated in Python 3.10+; use asyncio.get_running_loop() instead. --- openspace/tool_layer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openspace/tool_layer.py b/openspace/tool_layer.py index 1ea419f..2424860 100644 --- a/openspace/tool_layer.py +++ b/openspace/tool_layer.py @@ -349,7 +349,7 @@ async def execute( self._running = True self._task_done.clear() self._last_evolved_skills = [] # Reset per-execution tracking - start_time = asyncio.get_event_loop().time() + start_time = asyncio.get_running_loop().time() # Use external task_id if provided, otherwise generate one if task_id is None: task_id = f"task_{uuid.uuid4().hex[:12]}" @@ -933,4 +933,4 @@ def __repr__(self) -> str: if self._running: status = "running" backends = ", ".join(self.config.backend_scope) if self.config.backend_scope else "all" - return f"" \ No newline at end of file + return f"" From 0fe59515ca48f0e59508e4d46b40713626abcbaf Mon Sep 17 00:00:00 2001 From: Harry <164126595+wwyharry@users.noreply.github.com> Date: Wed, 25 Mar 2026 23:17:37 +0800 Subject: [PATCH 2/4] Improve error handling for tool argument parsing Fixed the bare `except` issue (JSONDecodeError, ValueError, TypeError) --- openspace/llm/client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openspace/llm/client.py b/openspace/llm/client.py index 19a1664..032f2a9 100644 --- a/openspace/llm/client.py +++ b/openspace/llm/client.py @@ -650,8 +650,8 @@ async def complete( args_str = json.dumps(args, ensure_ascii=False)[:200] self._logger.info(f"Calling {tool_name} with args: {args_str}") - except: - pass + except (json.JSONDecodeError, ValueError, TypeError) as e: + self._logger.debug(f"Failed to parse tool arguments for {tool_name}: {e}") if tool_name not in tool_map: result = ToolResult( @@ -766,4 +766,4 @@ def format_messages_to_text(messages: List[Dict]) -> str: role = msg.get("role", "unknown").upper() content = msg.get("content", "") formatted += f"[{role}]\n{content}\n\n" - return formatted \ No newline at end of file + return formatted From 84f3aa3953643fed2d762ece49425a792ced9054 Mon Sep 17 00:00:00 2001 From: Harry <164126595+wwyharry@users.noreply.github.com> Date: Wed, 25 Mar 2026 23:24:36 +0800 Subject: [PATCH 3/4] Improve embedding API response handling Add error handling and validation for embedding API response. --- openspace/skill_engine/skill_ranker.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/openspace/skill_engine/skill_ranker.py b/openspace/skill_engine/skill_ranker.py index 503eda5..c0a409d 100644 --- a/openspace/skill_engine/skill_ranker.py +++ b/openspace/skill_engine/skill_ranker.py @@ -340,7 +340,17 @@ def _generate_embedding( try: with urllib.request.urlopen(req, timeout=15) as resp: data = json.loads(resp.read().decode("utf-8")) - return data.get("data", [{}])[0].get("embedding") + + data_list = data.get("data") + if not data_list or not isinstance(data_list, list): + logger.warning(f"Invalid embedding API response: missing 'data' array") + return None + + embedding = data_list[0].get("embedding") + if not embedding: + logger.warning("Embedding API response missing 'embedding' field in first result") + return None + return embedding except Exception as e: last_err = e if attempt < 2: From f2d144781dfb8e57fdc34e4facb11df8f75715dc Mon Sep 17 00:00:00 2001 From: Harry <164126595+wwyharry@users.noreply.github.com> Date: Wed, 25 Mar 2026 23:26:42 +0800 Subject: [PATCH 4/4] Enhance embedding generation with response validation Added validation for API response structure and improved error handling for embedding generation. --- openspace/cloud/embedding.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/openspace/cloud/embedding.py b/openspace/cloud/embedding.py index 6606936..493ff52 100644 --- a/openspace/cloud/embedding.py +++ b/openspace/cloud/embedding.py @@ -121,9 +121,25 @@ def generate_embedding(text: str, api_key: Optional[str] = None) -> Optional[Lis method="POST", ) try: - with urllib.request.urlopen(req, timeout=15) as resp: - data = json.loads(resp.read().decode("utf-8")) - return data.get("data", [{}])[0].get("embedding") - except Exception as e: - logger.warning("Embedding generation failed: %s", e) - return None + with urllib.request.urlopen(req, timeout=15) as resp: + data = json.loads(resp.read().decode("utf-8")) + + # 验证 API 响应结构 + data_list = data.get("data") + if not data_list or not isinstance(data_list, list) or len(data_list) == 0: + logger.warning("Embedding API response missing or invalid 'data' array") + return None + + embedding = data_list[0].get("embedding") + if not embedding: + logger.warning("Embedding API response missing 'embedding' field") + return None + + return embedding +except urllib.error.HTTPError as e: + logger.warning(f"Embedding API HTTP error: {e.code} {e.reason}") + return None +except Exception as e: + logger.warning("Embedding generation failed: %s", e) + return None +