@@ -38,6 +38,73 @@ def extract_llm_params(request: ChatCompletionRequest) -> Dict[str, Any]:
3838 return params
3939
4040
41+ def process_user_messages (messages : List [Message ]) -> List [Message ]:
42+ """
43+ 处理用户发送的消息列表:
44+ 1. 提取所有 system role 消息并合并
45+ 2. 将合并后的 system 消息转为 user 消息
46+ 3. 放在第一条 user role 消息的最前面
47+
48+ Args:
49+ messages: 原始消息列表
50+
51+ Returns:
52+ 处理后的消息列表(不包含 system role)
53+ """
54+ system_messages = []
55+ non_system_messages = []
56+
57+ # 分离 system 消息和其他消息
58+ for msg in messages :
59+ if msg .role == "system" :
60+ system_messages .append (msg )
61+ else :
62+ non_system_messages .append (msg )
63+
64+ # 如果没有 system 消息,直接返回原列表
65+ if not system_messages :
66+ return messages
67+
68+ # 合并所有 system 消息
69+ merged_system_content = []
70+ for msg in system_messages :
71+ content_text = extract_text_from_content (msg .content )
72+ if content_text .strip ():
73+ merged_system_content .append (content_text )
74+
75+ # 如果合并后为空,直接返回非 system 消息
76+ if not merged_system_content :
77+ return non_system_messages
78+
79+ # 创建转换后的 user 消息(带有明确的标识)
80+ system_as_user_content = "# System Instructions\n \n " + "\n \n ---\n \n " .join (merged_system_content )
81+ system_as_user_msg = Message (
82+ role = "user" ,
83+ content = system_as_user_content
84+ )
85+
86+ # 找到第一条 user 消息的位置
87+ first_user_index = None
88+ for i , msg in enumerate (non_system_messages ):
89+ if msg .role == "user" :
90+ first_user_index = i
91+ break
92+
93+ # 插入转换后的消息
94+ if first_user_index is not None :
95+ # 在第一条 user 消息之前插入
96+ processed_messages = (
97+ non_system_messages [:first_user_index ] +
98+ [system_as_user_msg ] +
99+ non_system_messages [first_user_index :]
100+ )
101+ else :
102+ # 如果没有 user 消息,放在最前面
103+ processed_messages = [system_as_user_msg ] + non_system_messages
104+
105+ return processed_messages
106+
107+
41108def verify_auth (authorization : str = Header (None )) -> bool :
42109 """验证 API 密钥"""
43110 if not config .api_key :
@@ -72,8 +139,11 @@ async def stream_chat_completion(
72139 if not request .messages :
73140 raise HTTPException (status_code = 400 , detail = "No messages found" )
74141
142+ # 处理用户消息:将 system role 合并后转为 user 消息
143+ processed_messages = process_user_messages (request .messages )
144+
75145 # 提取最后一个用户消息作为当前问题
76- user_messages = [msg for msg in request . messages if msg .role == "user" ]
146+ user_messages = [msg for msg in processed_messages if msg .role == "user" ]
77147 if not user_messages :
78148 raise HTTPException (status_code = 400 , detail = "No user message found" )
79149
@@ -85,8 +155,8 @@ async def stream_chat_completion(
85155
86156 # 构建结构化的对话历史(排除最后一条用户消息)
87157 conversation_history = []
88- if len (request . messages ) > 1 :
89- context_messages = request . messages [:- 1 ] # 排除最后一条消息
158+ if len (processed_messages ) > 1 :
159+ context_messages = processed_messages [:- 1 ] # 排除最后一条消息
90160 for msg in context_messages :
91161 conversation_history .append ({
92162 "role" : msg .role ,
@@ -369,8 +439,11 @@ async def chat_completions(
369439 if not request .messages :
370440 raise HTTPException (status_code = 400 , detail = "No messages found" )
371441
442+ # 处理用户消息:将 system role 合并后转为 user 消息
443+ processed_messages = process_user_messages (request .messages )
444+
372445 # 提取最后一个用户消息作为当前问题
373- user_messages = [msg for msg in request . messages if msg .role == "user" ]
446+ user_messages = [msg for msg in processed_messages if msg .role == "user" ]
374447 if not user_messages :
375448 raise HTTPException (status_code = 400 , detail = "No user message found" )
376449
@@ -382,8 +455,8 @@ async def chat_completions(
382455
383456 # 构建结构化的对话历史(排除最后一条用户消息)
384457 conversation_history = []
385- if len (request . messages ) > 1 :
386- context_messages = request . messages [:- 1 ] # 排除最后一条消息
458+ if len (processed_messages ) > 1 :
459+ context_messages = processed_messages [:- 1 ] # 排除最后一条消息
387460 for msg in context_messages :
388461 conversation_history .append ({
389462 "role" : msg .role ,
0 commit comments