jack 6 дней назад
Родитель
Сommit
4ae32ed084

+ 2 - 1
app/core/runner/llm_callback_handler.py

@@ -41,6 +41,7 @@ class LLMCallbackHandler:
         message = ChatCompletionMessage(
             content="", role="assistant", tool_calls=[], audio=None
         )
+        message.reasoning_content = ""
 
         index = 0
         try:
@@ -125,7 +126,7 @@ class LLMCallbackHandler:
                         self.event_handler.pub_message_in_progress(self.message)
                     '''
                     # append message content delta
-                    # message.reasoning_content += delta.reasoning_content
+                    message.reasoning_content += delta.reasoning_content
                     self.event_handler.pub_message_delta(
                         self.message.id,
                         index,

+ 7 - 21
app/core/runner/thread_runner.py

@@ -257,6 +257,7 @@ class ThreadRunner:
                 thread_id=run.thread_id,
                 run_id=run.id,
                 step_details={
+                    "reasoning_content": response_msg.reasoning_content,
                     "type": "tool_calls",
                     "tool_calls": [tool_call_dict for _, tool_call_dict in tool_calls],
                 },
@@ -291,6 +292,7 @@ class ThreadRunner:
                         run_step_id=new_run_step.id,
                         step_details={
                             "type": "tool_calls",
+                            #"reasoning_content": response_msg.reasoning_content,
                             "tool_calls": tool_calls_with_outputs,
                         },
                         completed=not external_tool_call_dict,
@@ -338,12 +340,15 @@ class ThreadRunner:
                 response_msg.content = (
                     '[{"text": {"value": "", "annotations": []}, "type": "text"}]'
                 )
+            if response_msg.reasoning_content == "":
+                response_msg.reasoning_content = None
+
             # 无 tool call 信息,message 生成结束,更新状态
             new_message = MessageService.modify_message_sync(
                 session=self.session,
                 thread_id=run.thread_id,
                 message_id=llm_callback_handler.message.id,
-                body=MessageUpdate(content=response_msg.content),
+                body=MessageUpdate(content=response_msg.content, reasoning_content=response_msg.reasoning_content),
             )
             self.event_handler.pub_message_completed(new_message)
 
@@ -428,13 +433,6 @@ class ThreadRunner:
                 """
                 for content in message.content:
                     if content["type"] == "text":
-                        # message_content = content["text"]["value"]
-                        '''
-                        {
-                    "text": "图片主要讲了什么?",
-                    "type": "text"
-                }
-                        '''
                         message_content.append(
                             {"type": "text", "text": content["text"]["value"]}
                         )
@@ -454,22 +452,10 @@ class ThreadRunner:
                 for content in message.content:
                     if content["type"] == "text":
                         assistant_content += content["text"]["value"]
-                '''
-                if message_content == "":
-                    message_content = (
-                        "You are a multilingual AI assistant.\n"
-                        + "- Detect user language; reply in same language unless told otherwise.\n"
-                        + "- Default to English if detection is unclear.\n"
-                        + "- Give concise, accurate, and safe answers; admit when unsure.\n"
-                        + "- Keep tone and style consistent; adapt examples to user's context.\n"
-                        + "- For code, include explanations and comments in user's language.\n"
-                        + "- If a question is ambiguous, ask for clarification.\n"
-                    )
-                '''
                 if assistant_content == "":
                     assistant_content = "\r\n"
 
-                chat_messages.append(msg_util.new_message(role, assistant_content))
+                chat_messages.append(msg_util.new_message(role, assistant_content, message.reasoning_content))
 
         chat_messages.reverse()  # 倒序排列,最新的消息在前面
         return chat_messages  # 暂时只支持5条消息,后续正价token上限

+ 6 - 3
app/core/runner/utils/message_util.py

@@ -15,7 +15,7 @@ from openai.types.chat import ChatCompletionMessage, ChatCompletionMessageToolCa
 from openai.types.chat.chat_completion_message_tool_call import Function
 
 
-def new_message(role: str, content: str):
+def new_message(role: str, content: str, reasoning_content=None):
     if role != "user" and role != "system" and role != "assistant":
         raise ValueError(f"Invalid role {role}")
 
@@ -34,8 +34,11 @@ def assistant_message(content: str):
     return new_message("assistant", content)
 
 
-def tool_calls(tool_calls):
-    return {"role": "assistant", "tool_calls": tool_calls}
+def tool_calls(tool_calls, reasoning_content=None):
+    if reasoning_content is None:
+        return {"role": "assistant", "tool_calls": tool_calls}
+    else:
+        return {"role": "assistant", "tool_calls": tool_calls, "reasoning_content": reasoning_content}
 
 
 def tool_call_result(id, content):

+ 3 - 0
app/models/message.py

@@ -18,6 +18,7 @@ class MessageBase(BaseModel):
     metadata_: Optional[dict] = Field(default=None, sa_column=Column("metadata", JSON), schema_extra={"validation_alias": "metadata"})
     assistant_id: Optional[str] = Field(default=None)
     run_id: Optional[str] = Field(default=None)
+    reasoning_content:  Union[str, List[dict]] = Field(default=None, sa_column=Column(JSON))
 
 
 class Message(MessageBase, TimeStampMixin, PrimaryKeyMixin, table=True):
@@ -30,10 +31,12 @@ class MessageCreate(BaseModel):
     file_ids: Optional[list] = Field(default=None)
     attachments: Optional[list] = Field(default=None, sa_column=Column(JSON))  # 附件
     metadata_: Optional[dict] = Field(default=None, schema_extra={"validation_alias": "metadata"})
+    reasoning_content: Union[str, List[dict]] = Field(nullable=False)
 
 
 class MessageUpdate(BaseModel):
     content:  Union[str, List[dict]] = Field(default=None)
+    reasoning_content: Union[str, List[dict]] = Field(default=None)
     metadata_: Optional[dict] = Field(default=None, schema_extra={"validation_alias": "metadata"})
 
 

+ 5 - 1
app/services/run/run_step.py

@@ -60,7 +60,11 @@ class RunStepService:
         run_step = RunStepService.get_run_step(run_step_id=run_step_id, session=session)
         RunStepService.check_status_in(run_step=run_step, status_list=["in_progress", "completed"])
 
-        run_step.step_details = step_details
+        #run_step.step_details = step_details
+        if isinstance(step_details, dict):
+            run_step.step_details.update(step_details)
+        else:
+            run_step.step_details = step_details
 
         if completed and run_step.status != "completed":
             run_step.status = "completed"