test_invocation.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from pathlib import Path
  2. from langchain_core.messages import AIMessage
  3. from production_build_agents.agents.invocation import (
  4. build_agent_run_config,
  5. extract_final_json,
  6. )
  7. from production_build_agents.contracts.models import ExecutorCandidate
  8. def test_extracts_final_candidate_after_schema_fragment() -> None:
  9. fixture = (
  10. Path(__file__).parents[1]
  11. / "fixtures"
  12. / "v20_executor_output_recovery.txt"
  13. ).read_text(encoding="utf-8")
  14. payload = extract_final_json(
  15. {"messages": [AIMessage(content=fixture)]},
  16. role="Executor",
  17. error_type=ValueError,
  18. )
  19. assert ExecutorCandidate.model_validate_json(payload).run_id == "fixture-v20"
  20. def test_agent_run_config_exposes_stable_business_identity() -> None:
  21. config = build_agent_run_config(
  22. business_run_id="run-1",
  23. agent_run_id="run-1:Segment1:v2:executor",
  24. domain="production",
  25. role="segment_executor",
  26. invocation_mode="EXECUTE",
  27. segment_id="Segment1",
  28. plan_version=2,
  29. recursion_limit=64,
  30. )
  31. assert config == {
  32. "configurable": {
  33. "thread_id": "run-1:Segment1:v2:executor",
  34. },
  35. "metadata": {
  36. "business_run_id": "run-1",
  37. "agent_run_id": "run-1:Segment1:v2:executor",
  38. "domain": "production",
  39. "role": "segment_executor",
  40. "invocation_mode": "EXECUTE",
  41. "segment_id": "Segment1",
  42. "plan_version": 2,
  43. },
  44. "recursion_limit": 64,
  45. }