fix(sub-agent): 深度压缩重建 system 消息包装为 dict,根治压缩后首次模型调用必崩
- _deep_compress_messages 此前把 _rebuild_system_prompt 返回的裸字符串直接
作为 messages[0],压缩后首次模型调用在 _merge_system_messages 的
msg.get("role") 处崩溃('str' object has no attribute 'get'),
任何触发 150k tokens 压缩阈值的子智能体 100% 必崩
- _merge_system_messages 入口增加非 dict 归一防御(包装为 system 消息),
同时避免下游 sanitizer 静默丢弃导致 system prompt 内容丢失
This commit is contained in:
parent
f9f9032ce5
commit
e04b56d967
@ -1099,7 +1099,10 @@ class SubAgentTask:
|
|||||||
summary_text = "\n".join(summary_lines)
|
summary_text = "\n".join(summary_lines)
|
||||||
|
|
||||||
# 重建消息列表:冻结的 system prompt + 压缩摘要 system + 保留的最近消息
|
# 重建消息列表:冻结的 system prompt + 压缩摘要 system + 保留的最近消息
|
||||||
frozen_system = self._rebuild_system_prompt()
|
# 注意:_rebuild_system_prompt 返回裸字符串,必须包装为标准消息 dict;
|
||||||
|
# 否则下游 API 客户端(_merge_system_messages 的 msg.get("role"))会在
|
||||||
|
# 压缩后的首次模型调用崩溃('str' object has no attribute 'get')。
|
||||||
|
frozen_system = {"role": "system", "content": self._rebuild_system_prompt()}
|
||||||
compressed_system = {
|
compressed_system = {
|
||||||
"role": "system",
|
"role": "system",
|
||||||
"content": summary_text,
|
"content": summary_text,
|
||||||
|
|||||||
@ -44,6 +44,20 @@ class APIClientMessageMixin:
|
|||||||
if not messages:
|
if not messages:
|
||||||
return messages
|
return messages
|
||||||
|
|
||||||
|
# 防御:上游偶发会把裸字符串混进消息列表(如子智能体压缩重建的 system
|
||||||
|
# prompt 文本),直接 .get() 会崩。统一包装为标准 system 消息,保留内容。
|
||||||
|
# 下游 sanitizer 对非 dict 是静默丢弃,先行归一也能避免内容丢失。
|
||||||
|
normalized: List[Dict] = []
|
||||||
|
for item in messages:
|
||||||
|
if isinstance(item, dict):
|
||||||
|
normalized.append(item)
|
||||||
|
else:
|
||||||
|
normalized.append({
|
||||||
|
"role": "system",
|
||||||
|
"content": item if isinstance(item, str) else json.dumps(item, ensure_ascii=False),
|
||||||
|
})
|
||||||
|
messages = normalized
|
||||||
|
|
||||||
merged_contents: List[str] = []
|
merged_contents: List[str] = []
|
||||||
idx = 0
|
idx = 0
|
||||||
while idx < len(messages) and messages[idx].get("role") == "system":
|
while idx < len(messages) and messages[idx].get("role") == "system":
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user