Skip to content

Commit 42e0bce

Browse files
committed
test: system instruction process
1 parent 304c4bc commit 42e0bce

File tree

1 file changed

+79
-6
lines changed

1 file changed

+79
-6
lines changed

api/v1/chat.py

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
41108
def 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

Comments
 (0)