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 + diff --git a/openspace/llm/client.py b/openspace/llm/client.py index 611cf87..3b49181 100644 --- a/openspace/llm/client.py +++ b/openspace/llm/client.py @@ -777,8 +777,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_obj is None: if ambiguous_tool_names: 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: diff --git a/openspace/tool_layer.py b/openspace/tool_layer.py index 7ceb447..0d7052a 100644 --- a/openspace/tool_layer.py +++ b/openspace/tool_layer.py @@ -355,8 +355,10 @@ async def execute( self._running = True self._task_done.clear() self._last_evolved_skills = [] # Reset per-execution tracking + start_time = asyncio.get_running_loop().time() self._capture_skill_dir = capture_skill_dir start_time = asyncio.get_event_loop().time() + # Use external task_id if provided, otherwise generate one if task_id is None: task_id = f"task_{uuid.uuid4().hex[:12]}"