executor_fixtures.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from __future__ import annotations
  2. from langchain_core.messages import AIMessage
  3. from production_build_agents.contracts.models import (
  4. CandidateArtifact,
  5. ExecutorCandidate,
  6. Finding,
  7. ArtifactBindingClaim,
  8. )
  9. from tests.support.fake_models import ToolAwareFakeChatModel
  10. def build_executor_candidate(
  11. *,
  12. run_id: str = "test-run",
  13. plan_id: str = "GlobalDataPlan",
  14. task_id: str = "Task1",
  15. plan_version: int = 1,
  16. deliverable_type: str = "structured_data",
  17. artifact_uri: str | None = None,
  18. expectation_id: str = "Requirement1-Expectation1",
  19. evidence_tool_call_ids: list[str] | None = None,
  20. ) -> ExecutorCandidate:
  21. artifacts = []
  22. findings = [
  23. Finding(
  24. statement="主视觉应保持制作表给出的统一设定",
  25. source_paths=["$.核心制作点[0]"],
  26. )
  27. ]
  28. payload = {"global_constraints": ["统一主视觉"]}
  29. if deliverable_type == "image":
  30. payload = {}
  31. artifacts = [
  32. CandidateArtifact(
  33. artifact_type="image",
  34. uri=artifact_uri or "https://example.test/reference.png",
  35. description="全局视觉参考图",
  36. )
  37. ]
  38. findings = []
  39. elif deliverable_type == "video":
  40. payload = {}
  41. artifacts = [
  42. CandidateArtifact(
  43. artifact_type="video",
  44. uri=artifact_uri or "https://example.test/video.mp4",
  45. description="任务视频",
  46. )
  47. ]
  48. findings = []
  49. elif deliverable_type == "research_result":
  50. payload = {}
  51. artifacts = []
  52. findings = [
  53. Finding(
  54. statement="检索得到一条可用参考资料",
  55. source_urls=[artifact_uri or "https://example.test/source"],
  56. )
  57. ]
  58. elif deliverable_type == "reference_collection":
  59. payload = {}
  60. artifacts = [
  61. CandidateArtifact(
  62. artifact_type="reference",
  63. uri=artifact_uri or "https://example.test/reference",
  64. description="参考资料",
  65. )
  66. ]
  67. findings = []
  68. return ExecutorCandidate(
  69. schema_version="0.3",
  70. run_id=run_id,
  71. plan_id=plan_id,
  72. task_id=task_id,
  73. plan_version=plan_version,
  74. deliverable_type=deliverable_type,
  75. payload=payload,
  76. artifacts=artifacts,
  77. artifact_binding_claims=[
  78. ArtifactBindingClaim(
  79. expectation_id=expectation_id,
  80. artifact_uri=(
  81. artifacts[0].uri
  82. if artifacts
  83. else "delivery_artifact.json"
  84. ),
  85. evidence_tool_call_ids=evidence_tool_call_ids or [],
  86. )
  87. ],
  88. findings=findings,
  89. unresolved=[],
  90. summary="已完成当前 Task",
  91. )
  92. def build_executor_model(
  93. *candidates: ExecutorCandidate,
  94. ) -> ToolAwareFakeChatModel:
  95. return ToolAwareFakeChatModel(
  96. responses=[
  97. AIMessage(content=candidate.model_dump_json())
  98. for candidate in candidates
  99. ]
  100. )