context.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. """Stage-specific input contracts backed only by ``find_agent_v2_*`` tables."""
  2. from __future__ import annotations
  3. from pydantic import BaseModel
  4. from find_agent_v2.observability import InputSlot
  5. from find_agent_v2.service import get_find_agent_v2_service
  6. from find_agent_v2.state import DiscoverySnapshot
  7. def load_full_state(run_id: str, *, limit: int = 100) -> dict:
  8. return get_find_agent_v2_service().get_full_state(run_id, limit=limit)
  9. def snapshot_run(run_id: str) -> DiscoverySnapshot:
  10. return get_find_agent_v2_service().snapshot(run_id)
  11. def require_running_run(run_id: str) -> dict:
  12. run = get_find_agent_v2_service().require_run(run_id)
  13. if str(run.get("status") or "") not in {"running", "finished"}:
  14. raise ValueError(f"run_id={run_id} 当前状态不可执行: {run.get('status')}")
  15. return run
  16. def render_assignment(assignment: BaseModel) -> str:
  17. """Serialize the exact object sent to a model and shown in observability."""
  18. return assignment.model_dump_json(exclude_none=True)
  19. def assignment_slots(assignment: BaseModel, *, source: str) -> tuple[InputSlot, ...]:
  20. """Use one canonical payload so observation can never change model semantics."""
  21. return (
  22. InputSlot(
  23. "阶段任务",
  24. render_assignment(assignment),
  25. "stage_assignment",
  26. source,
  27. False,
  28. ),
  29. )