prompt-manager: Claude system as content blocks; avoid empty 'system'; PROMPT uses pm.system (blocks) or system_text; tests green

This commit is contained in:
2025-09-17 12:33:47 +03:00
parent d155ffa74c
commit 135c393eda
5 changed files with 442 additions and 136 deletions

View File

@@ -1611,7 +1611,9 @@ class ProviderCallNode(Node):
return d
if provider == "claude":
sys_text = "\n\n".join([m["content"] for m in msgs if m.get("role") == "system"]).strip()
# Собираем system как массив блоков (Anthropic Messages API допускает массив content-блоков)
sys_msgs = [str(m.get("content") or "") for m in msgs if m.get("role") == "system"]
system_blocks = [{"type": "text", "text": s} for s in sys_msgs if s is not None and str(s) != ""]
out_msgs = []
for m in msgs:
if m.get("role") == "system":
@@ -1619,11 +1621,15 @@ class ProviderCallNode(Node):
role = m.get("role")
role = role if role in {"user", "assistant"} else "user"
out_msgs.append({"role": role, "content": [{"type": "text", "text": str(m.get("content") or "")}]})
return {
# Оставляем system_text для обратной совместимости (объединённая строка), но основной — system как массив блоков
sys_text = "\n\n".join(sys_msgs).strip()
d = {
"system_text": sys_text,
"system": sys_text, # удобно для шаблона: "system": "{{ pm.system_text }}"
"messages": out_msgs,
}
if system_blocks:
d["system"] = system_blocks
return d
# По умолчанию ничего, но это валидный JSON
return {"messages": []}
@@ -1709,9 +1715,12 @@ class ProviderCallNode(Node):
prompt_fragment = ", ".join(parts)
elif provider == "claude":
parts = []
sys_text = pm_struct.get("system_text") or pm_struct.get("system")
if sys_text is not None:
parts.append('"system": ' + json.dumps(sys_text, ensure_ascii=False))
# Предпочитаем массив блоков system, если он есть; иначе строковый system_text
sys_val = pm_struct.get("system", None)
if sys_val is None:
sys_val = pm_struct.get("system_text")
if sys_val:
parts.append('"system": ' + json.dumps(sys_val, ensure_ascii=False))
msgs = pm_struct.get("messages")
if msgs is not None:
parts.append('"messages": ' + json.dumps(msgs, ensure_ascii=False))