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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user