2026-03-31 23:55:26 +08:00
|
|
|
|
"""
|
2026-04-06 22:22:50 +08:00
|
|
|
|
访谈 Agent 可配置性格(Persona):仅影响语气,不替代事实边界与槽位约束。
|
2026-03-31 23:55:26 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
from typing import Final
|
|
|
|
|
|
|
|
|
|
|
|
# 与 settings.chat_interview_persona 及文档保持一致
|
|
|
|
|
|
VALID_INTERVIEW_PERSONAS: Final[frozenset[str]] = frozenset(
|
|
|
|
|
|
{"default", "warm_listener", "curious_guide"}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def normalize_interview_persona(raw: str | None) -> str:
|
|
|
|
|
|
"""未知或空值回退 default,避免部署拼写错误导致空提示。"""
|
|
|
|
|
|
key = (raw or "default").strip().lower()
|
|
|
|
|
|
if key in VALID_INTERVIEW_PERSONAS:
|
|
|
|
|
|
return key
|
|
|
|
|
|
return "default"
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-04-06 22:22:50 +08:00
|
|
|
|
def get_interview_persona_tone_hint(persona: str) -> str:
|
|
|
|
|
|
"""一句访谈性格提示,融入主 system prompt;default 返回空串。"""
|
2026-03-31 23:55:26 +08:00
|
|
|
|
key = normalize_interview_persona(persona)
|
|
|
|
|
|
if key == "default":
|
|
|
|
|
|
return ""
|
2026-04-06 22:22:50 +08:00
|
|
|
|
if key == "warm_listener":
|
|
|
|
|
|
return "偏倾听与承接,语气柔和、少打断;不审问感,一次最多一个具体问题。"
|
|
|
|
|
|
return "爱把人往一个具体细节里带;短句像微信,一次最多一个具体问题,不重复上文已清楚的事。"
|
|
|
|
|
|
|
2026-03-31 23:55:26 +08:00
|
|
|
|
|
2026-04-06 22:22:50 +08:00
|
|
|
|
def get_interview_persona_block(persona: str) -> str:
|
|
|
|
|
|
"""兼容旧名:返回空串,请改用 get_interview_persona_tone_hint。"""
|
|
|
|
|
|
return ""
|
2026-03-31 23:55:26 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_opening_persona_line(persona: str) -> str:
|
2026-04-06 22:22:50 +08:00
|
|
|
|
"""兼容旧名:与访谈轮次共用一句性格提示。"""
|
|
|
|
|
|
return get_interview_persona_tone_hint(persona)
|