application.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. from __future__ import annotations
  2. from dataclasses import dataclass
  3. from pathlib import Path
  4. from cyber_agent.application import (
  5. AgentApplication,
  6. AgentRole,
  7. ApplicationServices,
  8. ProviderRef,
  9. QualityRuleSpec,
  10. ToolSet,
  11. ToolSpec,
  12. )
  13. from cyber_agent.tools import get_tool_registry
  14. from .providers import (
  15. PlaceholderQualityProvider,
  16. ReferenceArtifactStore,
  17. ReferenceCandidateRepository,
  18. ReferenceContextProvider,
  19. ReferenceProjector,
  20. )
  21. from .tools import FactVerifier
  22. _ROLES = Path(__file__).with_name("roles")
  23. def _prompt(role_id: str) -> str:
  24. return (_ROLES / f"{role_id}.prompt").read_text(encoding="utf-8").strip()
  25. @dataclass(frozen=True)
  26. class ReferenceComponents:
  27. application: AgentApplication
  28. services: ApplicationServices
  29. artifacts: ReferenceArtifactStore
  30. candidates: ReferenceCandidateRepository
  31. context: ReferenceContextProvider
  32. facts: FactVerifier
  33. projector: ReferenceProjector
  34. def build_reference_components() -> ReferenceComponents:
  35. artifacts = ReferenceArtifactStore()
  36. candidates = ReferenceCandidateRepository(artifacts)
  37. context = ReferenceContextProvider()
  38. facts = FactVerifier(artifacts)
  39. projector = ReferenceProjector()
  40. registry = get_tool_registry().clone()
  41. async def verify_fact(question: str) -> dict:
  42. """Runtime tests use FactVerifier directly so hidden identity stays framework-owned."""
  43. return {"question": question}
  44. registry.register(verify_fact)
  45. application = AgentApplication(
  46. application_id="application_reference",
  47. application_version="1",
  48. root_role="editor",
  49. roles=(
  50. AgentRole(
  51. role_id="editor",
  52. model="reference-model",
  53. system_prompt=_prompt("editor"),
  54. tool_sets=("editor-tools",),
  55. allowed_child_roles=("fact_checker", "writer"),
  56. ),
  57. AgentRole(
  58. role_id="fact_checker",
  59. model="reference-model",
  60. system_prompt=_prompt("fact_checker"),
  61. tool_sets=("fact-tools",),
  62. ),
  63. AgentRole(
  64. role_id="writer",
  65. model="reference-model",
  66. system_prompt=_prompt("writer"),
  67. tool_sets=("writer-tools",),
  68. ),
  69. ),
  70. tool_sets=(
  71. ToolSet(
  72. tool_set_id="editor-tools",
  73. tools=tuple(ToolSpec(
  74. tool_name=name,
  75. implementation_version="framework-1",
  76. ) for name in (
  77. "agent",
  78. "update_task_progress",
  79. "review_task_result",
  80. )),
  81. ),
  82. ToolSet(
  83. tool_set_id="fact-tools",
  84. tools=(
  85. ToolSpec(
  86. tool_name="verify_fact",
  87. implementation_version="1",
  88. side_effect_class="read",
  89. ),
  90. ToolSpec(
  91. tool_name="update_task_progress",
  92. implementation_version="framework-1",
  93. ),
  94. ToolSpec(
  95. tool_name="submit_task_report",
  96. implementation_version="framework-1",
  97. ),
  98. ),
  99. ),
  100. ToolSet(
  101. tool_set_id="writer-tools",
  102. tools=tuple(ToolSpec(
  103. tool_name=name,
  104. implementation_version="framework-1",
  105. side_effect_class=("write" if name == "manage_candidate" else "none"),
  106. ) for name in (
  107. "manage_candidate",
  108. "update_task_progress",
  109. "submit_task_report",
  110. )),
  111. ),
  112. ),
  113. artifact_resolver_ref=ProviderRef(
  114. provider_id="reference-artifacts",
  115. provider_version="1",
  116. ),
  117. context_provider_ref=ProviderRef(
  118. provider_id="reference-context",
  119. provider_version="1",
  120. ),
  121. candidate_repository_ref=ProviderRef(
  122. provider_id="reference-candidates",
  123. provider_version="1",
  124. ),
  125. quality_provider_ref=ProviderRef(
  126. provider_id="reference-quality",
  127. provider_version="1",
  128. ),
  129. event_projector_ref=ProviderRef(
  130. provider_id="reference-projector",
  131. provider_version="1",
  132. ),
  133. quality_rules=(QualityRuleSpec(
  134. rule_id="no_placeholder",
  135. version="1",
  136. criterion="Candidate output contains no placeholder description.",
  137. ),),
  138. )
  139. services = ApplicationServices(
  140. tool_registry=registry,
  141. context_provider=context,
  142. artifact_resolver=artifacts,
  143. candidate_repository=candidates,
  144. quality_provider=PlaceholderQualityProvider(),
  145. event_projector=projector,
  146. )
  147. return ReferenceComponents(
  148. application=application,
  149. services=services,
  150. artifacts=artifacts,
  151. candidates=candidates,
  152. context=context,
  153. facts=facts,
  154. projector=projector,
  155. )