44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
"""Prompt assembly for signal planner service."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from .shared import Any, PROMPT_SIGNAL_PLANNER, Signal, json, now_cn_naive
|
|
|
|
|
|
class SignalPlannerPromptMixin:
|
|
"""Build planner prompt text from signal and project context."""
|
|
|
|
@classmethod
|
|
def _build_prompt(
|
|
cls,
|
|
*,
|
|
signal: Signal,
|
|
project_title: str,
|
|
charter_json: dict[str, Any],
|
|
recent_signals: list[dict[str, Any]],
|
|
members: list[dict[str, Any]],
|
|
) -> str:
|
|
strategic = cls._as_dict(signal.strategic_analysis)
|
|
ai_analysis = (
|
|
strategic.get("ai_analysis")
|
|
if isinstance(strategic.get("ai_analysis"), dict)
|
|
else {}
|
|
)
|
|
return PROMPT_SIGNAL_PLANNER.format(
|
|
signal_id=int(signal.id),
|
|
signal_title=str(signal.title or ""),
|
|
signal_summary=str(signal.summary or ai_analysis.get("summary") or ""),
|
|
signal_content=str(signal.content or ""),
|
|
project_id=(
|
|
str(signal.matched_project_id)
|
|
if signal.matched_project_id is not None
|
|
else ""
|
|
),
|
|
project_title=str(project_title or ""),
|
|
project_scope=str(ai_analysis.get("requirement_project_scope") or ""),
|
|
charter_json=json.dumps(charter_json or {}, ensure_ascii=False),
|
|
recent_signals=json.dumps(recent_signals, ensure_ascii=False),
|
|
member_profiles=json.dumps(members, ensure_ascii=False),
|
|
now_cn=now_cn_naive().isoformat(),
|
|
)
|