diff --git a/api/app/core/workflow/nodes/knowledge/node.py b/api/app/core/workflow/nodes/knowledge/node.py index bd1ba998..c3fda4e2 100644 --- a/api/app/core/workflow/nodes/knowledge/node.py +++ b/api/app/core/workflow/nodes/knowledge/node.py @@ -334,7 +334,8 @@ class KnowledgeRetrievalNode(BaseNode): for kb_config in knowledge_bases: db_knowledge = knowledge_repository.get_knowledge_by_id(db=db, knowledge_id=kb_config.kb_id) if not (db_knowledge and db_knowledge.chunk_num > 0 and db_knowledge.status == 1): - raise RuntimeError("The knowledge base does not exist or access is denied.") + logger.warning("The knowledge base does not exist or access is denied.") + continue tasks.append(self.knowledge_retrieval(db, query, db_knowledge, kb_config)) if tasks: result = await asyncio.gather(*tasks) diff --git a/api/app/schemas/app_schema.py b/api/app/schemas/app_schema.py index 11c27b56..89603322 100644 --- a/api/app/schemas/app_schema.py +++ b/api/app/schemas/app_schema.py @@ -3,7 +3,7 @@ import uuid from typing import Optional, Any, List, Dict, Union from enum import Enum, StrEnum -from pydantic import BaseModel, Field, ConfigDict, field_serializer, field_validator +from pydantic import BaseModel, Field, ConfigDict, field_serializer, field_validator, model_serializer from app.schemas.workflow_schema import WorkflowConfigCreate @@ -661,9 +661,11 @@ class DraftRunResponse(BaseModel): suggested_questions: List[str] = Field(default_factory=list, description="下一步建议问题") citations: List[Dict[str, Any]] = Field(default_factory=list, description="引用来源") audio_url: Optional[str] = Field(default=None, description="TTS 语音URL") + audio_status: Optional[str] = Field(default=None, description="TTS 语音状态") - def model_dump(self, **kwargs): - data = super().model_dump(**kwargs) + @model_serializer(mode="wrap") + def _serialize(self, handler): + data = handler(self) if not data.get("reasoning_content"): data.pop("reasoning_content", None) return data diff --git a/api/app/schemas/conversation_schema.py b/api/app/schemas/conversation_schema.py index fd1be5d9..20782fd9 100644 --- a/api/app/schemas/conversation_schema.py +++ b/api/app/schemas/conversation_schema.py @@ -2,7 +2,7 @@ import uuid import datetime from typing import Optional, Dict, Any, List -from pydantic import BaseModel, Field, ConfigDict, field_serializer +from pydantic import BaseModel, Field, ConfigDict, field_serializer, model_serializer # 导入 FileInput(用于体验运行) from app.schemas.app_schema import FileInput @@ -94,6 +94,18 @@ class ChatResponse(BaseModel): message_id: str usage: Optional[Dict[str, Any]] = None elapsed_time: Optional[float] = None + reasoning_content: Optional[str] = None + suggested_questions: Optional[List[str]] = None + citations: Optional[List[Any]] = None + audio_url: Optional[str] = None + audio_status: Optional[str] = None + + @model_serializer(mode="wrap") + def _serialize(self, handler): + data = handler(self) + if not data.get("reasoning_content"): + data.pop("reasoning_content", None) + return data # ---------- Conversation Summary Schemas ---------- diff --git a/api/app/services/app_chat_service.py b/api/app/services/app_chat_service.py index 7c52c2d6..12f54c03 100644 --- a/api/app/services/app_chat_service.py +++ b/api/app/services/app_chat_service.py @@ -317,7 +317,7 @@ class AppChatService: "suggested_questions": suggested_questions, "citations": filtered_citations, "audio_url": audio_url, - "audio_status": "pending" + "audio_status": "pending" if audio_url else None } async def agnet_chat_stream( diff --git a/api/app/services/draft_run_service.py b/api/app/services/draft_run_service.py index 10d50ece..2566a50f 100644 --- a/api/app/services/draft_run_service.py +++ b/api/app/services/draft_run_service.py @@ -754,7 +754,7 @@ class AgentRunService: ) if not sub_agent else [], "citations": filtered_citations, "audio_url": audio_url, - "audio_status": "pending" + "audio_status": "pending" if audio_url else None } logger.info(