agentframe-py 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. agentframe_py-0.3.0/.github/workflows/base-image.yml +62 -0
  2. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/AGENTS.md +42 -14
  3. agentframe_py-0.3.0/CHANGELOG.md +506 -0
  4. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/PKG-INFO +114 -67
  5. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/README.md +110 -66
  6. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/README.md +10 -4
  7. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/README.md +8 -4
  8. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/agents.md +11 -7
  9. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/authorization.md +21 -10
  10. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/discovery.md +19 -4
  11. agentframe_py-0.3.0/docs/api/evaluation.md +964 -0
  12. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/hosting.md +9 -5
  13. agentframe_py-0.3.0/docs/api/orchestration.md +1059 -0
  14. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/runtime.md +4 -1
  15. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/base-classes.md +1 -1
  16. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/discovery.md +7 -0
  17. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/evaluation.md +71 -28
  18. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/orchestration.md +147 -64
  19. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/prompt-safeguarding.md +13 -2
  20. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/tracing.md +8 -0
  21. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/guides/agent-examples.md +7 -5
  22. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/guides/authorization.md +81 -0
  23. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/guides/development.md +12 -1
  24. agentframe_py-0.3.0/docs/guides/evaluation.md +365 -0
  25. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/guides/limits.md +20 -0
  26. agentframe_py-0.3.0/docs/guides/orchestration.md +295 -0
  27. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/guides/releasing.md +2 -2
  28. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/roadmap.md +52 -17
  29. agentframe_py-0.3.0/examples/evaluation.py +90 -0
  30. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/multi_agent/agentframe.yaml +4 -1
  31. agentframe_py-0.3.0/examples/multi_agent/planner.py +286 -0
  32. agentframe_py-0.3.0/examples/multi_agent/planner_evaluation.py +175 -0
  33. agentframe_py-0.3.0/examples/multi_agent/writer.py +56 -0
  34. agentframe_py-0.3.0/examples/plan_approval.py +143 -0
  35. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/smoke.py +116 -11
  36. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/pyproject.toml +4 -1
  37. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/__init__.py +12 -1
  38. agentframe_py-0.3.0/src/agentframe/authoring/context.py +458 -0
  39. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/cli.py +245 -4
  40. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/cards.py +15 -7
  41. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/directory.py +106 -15
  42. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/identity.py +37 -10
  43. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/remote.py +133 -23
  44. agentframe_py-0.3.0/src/agentframe/discovery/transport.py +82 -0
  45. agentframe_py-0.3.0/src/agentframe/evaluation/__init__.py +41 -0
  46. agentframe_py-0.3.0/src/agentframe/evaluation/budget.py +62 -0
  47. agentframe_py-0.3.0/src/agentframe/evaluation/cases.py +179 -0
  48. agentframe_py-0.3.0/src/agentframe/evaluation/harness.py +379 -0
  49. agentframe_py-0.3.0/src/agentframe/evaluation/judge.py +257 -0
  50. agentframe_py-0.3.0/src/agentframe/evaluation/report.py +765 -0
  51. agentframe_py-0.3.0/src/agentframe/evaluation/scoring.py +190 -0
  52. agentframe_py-0.3.0/src/agentframe/evaluation/targets.py +450 -0
  53. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/a2a_executor.py +14 -0
  54. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/app.py +32 -16
  55. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/lifecycle.py +10 -5
  56. agentframe_py-0.3.0/src/agentframe/hosting/task_store.py +61 -0
  57. agentframe_py-0.3.0/src/agentframe/orchestration/__init__.py +1 -0
  58. agentframe_py-0.3.0/src/agentframe/orchestration/card_text.py +113 -0
  59. agentframe_py-0.3.0/src/agentframe/orchestration/catalog.py +671 -0
  60. agentframe_py-0.3.0/src/agentframe/orchestration/execution.py +506 -0
  61. agentframe_py-0.3.0/src/agentframe/orchestration/plan.py +462 -0
  62. agentframe_py-0.3.0/src/agentframe/orchestration/planning.py +242 -0
  63. agentframe_py-0.3.0/src/agentframe/orchestration/remote_tools.py +275 -0
  64. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/generation.py +66 -22
  65. agentframe_py-0.3.0/src/agentframe/runtime/remotes.py +198 -0
  66. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/runtime.py +48 -74
  67. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/tools.py +16 -6
  68. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/security/authorization.py +2 -1
  69. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/security/execution_policy.py +71 -4
  70. agentframe_py-0.3.0/tests/integration/test_evaluation_a2a.py +292 -0
  71. agentframe_py-0.3.0/tests/integration/test_evaluation_interop.py +120 -0
  72. agentframe_py-0.3.0/tests/integration/test_evaluation_release.py +147 -0
  73. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_foundry_agents.py +62 -4
  74. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_multi_agent_interop.py +25 -0
  75. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_multi_agent_release.py +7 -92
  76. agentframe_py-0.3.0/tests/integration/test_orchestration_release.py +493 -0
  77. agentframe_py-0.3.0/tests/integration/test_plan_approval.py +196 -0
  78. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_providers.py +400 -2
  79. agentframe_py-0.3.0/tests/integration/test_remote_tools_hosted.py +373 -0
  80. agentframe_py-0.3.0/tests/integration/test_run_plan_hosted.py +1057 -0
  81. agentframe_py-0.3.0/tests/integration/test_skill_catalog_hosted.py +122 -0
  82. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/support/a2a_peer.py +3 -0
  83. agentframe_py-0.3.0/tests/support/agent_processes.py +130 -0
  84. agentframe_py-0.3.0/tests/support/eval_targets.py +56 -0
  85. agentframe_py-0.3.0/tests/support/peer_process.py +16 -0
  86. agentframe_py-0.3.0/tests/support/release_targets.py +333 -0
  87. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/discovery/test_directory.py +2 -0
  88. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/discovery/test_remote.py +80 -10
  89. agentframe_py-0.3.0/tests/unit/evaluation/test_a2a_target.py +73 -0
  90. agentframe_py-0.3.0/tests/unit/evaluation/test_cases.py +137 -0
  91. agentframe_py-0.3.0/tests/unit/evaluation/test_controls.py +423 -0
  92. agentframe_py-0.3.0/tests/unit/evaluation/test_evaluation.py +443 -0
  93. agentframe_py-0.3.0/tests/unit/evaluation/test_judge.py +365 -0
  94. agentframe_py-0.3.0/tests/unit/evaluation/test_report.py +574 -0
  95. agentframe_py-0.3.0/tests/unit/evaluation/test_scorers.py +205 -0
  96. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_shutdown.py +32 -0
  97. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_task_operations.py +1 -0
  98. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/models/test_foundry.py +33 -0
  99. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/models/test_ollama.py +32 -0
  100. agentframe_py-0.3.0/tests/unit/orchestration/test_default_remote.py +331 -0
  101. agentframe_py-0.3.0/tests/unit/orchestration/test_plan.py +459 -0
  102. agentframe_py-0.3.0/tests/unit/orchestration/test_planning.py +448 -0
  103. agentframe_py-0.3.0/tests/unit/orchestration/test_remote_tools.py +512 -0
  104. agentframe_py-0.3.0/tests/unit/orchestration/test_skill_catalog.py +612 -0
  105. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/security/test_execution_policy.py +59 -0
  106. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/test_compose.py +7 -1
  107. agentframe_py-0.3.0/tests/unit/test_eval_cli.py +150 -0
  108. agentframe_py-0.3.0/tests/unit/test_package.py +36 -0
  109. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/uv.lock +1 -1
  110. agentframe_py-0.2.0/CHANGELOG.md +0 -195
  111. agentframe_py-0.2.0/examples/multi_agent/planner.py +0 -129
  112. agentframe_py-0.2.0/src/agentframe/authoring/context.py +0 -127
  113. agentframe_py-0.2.0/tests/support/release_targets.py +0 -113
  114. agentframe_py-0.2.0/tests/unit/test_package.py +0 -19
  115. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.github/actions/check-wheel/action.yml +0 -0
  116. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.github/workflows/ci.yml +0 -0
  117. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.github/workflows/foundry.yml +0 -0
  118. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.github/workflows/release.yml +0 -0
  119. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.gitignore +0 -0
  120. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.pre-commit-config.yaml +0 -0
  121. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/.python-version +0 -0
  122. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/LICENSE +0 -0
  123. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/configuration.md +0 -0
  124. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/decorators.md +0 -0
  125. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/models.md +0 -0
  126. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/api/streaming.md +0 -0
  127. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/mcp-skills.md +0 -0
  128. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/design/streaming.md +0 -0
  129. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/docs/guides/annotations.md +0 -0
  130. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/__init__.py +0 -0
  131. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/assistant.py +0 -0
  132. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/echo.py +0 -0
  133. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/multi_agent/__init__.py +0 -0
  134. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/multi_agent/research.py +0 -0
  135. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/orders.py +0 -0
  136. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/examples/routed_assistant.py +0 -0
  137. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/__main__.py +0 -0
  138. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/authoring/__init__.py +0 -0
  139. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/authoring/agent.py +0 -0
  140. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/authoring/decorators.py +0 -0
  141. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/authoring/definitions.py +0 -0
  142. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/authoring/services.py +0 -0
  143. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/compose.py +0 -0
  144. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/dev.py +0 -0
  145. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/dev_server.py +0 -0
  146. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/__init__.py +0 -0
  147. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/foundry.py +0 -0
  148. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/discovery/registry.py +0 -0
  149. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/errors.py +0 -0
  150. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/__init__.py +0 -0
  151. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/admission.py +0 -0
  152. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/card.py +0 -0
  153. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/dedup.py +0 -0
  154. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/draining_server.py +0 -0
  155. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/host.py +0 -0
  156. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/model_router.py +0 -0
  157. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/request_size.py +0 -0
  158. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/routing.py +0 -0
  159. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/hosting/skill_call.py +0 -0
  160. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/models/__init__.py +0 -0
  161. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/models/base.py +0 -0
  162. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/models/foundry.py +0 -0
  163. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/models/ollama.py +0 -0
  164. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/models/strict_schema.py +0 -0
  165. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/project.py +0 -0
  166. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/py.typed +0 -0
  167. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/__init__.py +0 -0
  168. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/correlation.py +0 -0
  169. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/limits.py +0 -0
  170. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/options.py +0 -0
  171. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/runtime/usage.py +0 -0
  172. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/security/__init__.py +0 -0
  173. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/security/authentication.py +0 -0
  174. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/security/entra.py +0 -0
  175. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/security/principal.py +0 -0
  176. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/src/agentframe/testing.py +0 -0
  177. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/conftest.py +0 -0
  178. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_agentframe_dev.py +0 -0
  179. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_compose_containers.py +0 -0
  180. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_directory_localhost.py +0 -0
  181. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_entra_interoperability.py +0 -0
  182. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_example.py +0 -0
  183. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_graceful_shutdown.py +0 -0
  184. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_hardening.py +0 -0
  185. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_interoperability.py +0 -0
  186. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_on_behalf_of.py +0 -0
  187. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_remote_agents.py +0 -0
  188. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_remote_budgets.py +0 -0
  189. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_remote_context.py +0 -0
  190. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_remote_correlation.py +0 -0
  191. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_remote_identity.py +0 -0
  192. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_routing_example.py +0 -0
  193. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_smoke.py +0 -0
  194. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_structured_example.py +0 -0
  195. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_success_criterion.py +0 -0
  196. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/integration/test_tools_example.py +0 -0
  197. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/support/a2a_client.py +0 -0
  198. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/support/cli_targets.py +0 -0
  199. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/support/dev_targets.py +0 -0
  200. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/support/fake_entra.py +0 -0
  201. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/support/local_server.py +0 -0
  202. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/authoring/test_decorators.py +0 -0
  203. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/authoring/test_services.py +0 -0
  204. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/authoring/test_tool_registration.py +0 -0
  205. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/authoring/test_tools.py +0 -0
  206. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/discovery/test_directory_find.py +0 -0
  207. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/discovery/test_foundry_registry.py +0 -0
  208. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/discovery/test_outbound_identity.py +0 -0
  209. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/discovery/test_registry.py +0 -0
  210. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/golden/Dockerfile +0 -0
  211. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/golden/compose.yaml +0 -0
  212. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_a2a_binding.py +0 -0
  213. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_a2a_executor.py +0 -0
  214. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_admission.py +0 -0
  215. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_app.py +0 -0
  216. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_caller_context.py +0 -0
  217. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_card.py +0 -0
  218. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_dedup.py +0 -0
  219. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_limits_ceiling.py +0 -0
  220. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_model_router.py +0 -0
  221. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_routing.py +0 -0
  222. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/hosting/test_size_limits.py +0 -0
  223. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/models/test_models.py +0 -0
  224. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/models/test_strict_schema.py +0 -0
  225. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_correlation.py +0 -0
  226. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_generation.py +0 -0
  227. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_limits.py +0 -0
  228. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_options.py +0 -0
  229. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_retries.py +0 -0
  230. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_runtime.py +0 -0
  231. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_structured_output.py +0 -0
  232. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_tool_loop.py +0 -0
  233. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_tool_replay.py +0 -0
  234. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/runtime/test_validation.py +0 -0
  235. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/security/test_authentication.py +0 -0
  236. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/security/test_authorization.py +0 -0
  237. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/security/test_entra.py +0 -0
  238. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/security/test_tool_authorization.py +0 -0
  239. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/test_cli.py +0 -0
  240. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/test_dev.py +0 -0
  241. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/test_project.py +0 -0
  242. {agentframe_py-0.2.0 → agentframe_py-0.3.0}/tests/unit/test_testing.py +0 -0
@@ -0,0 +1,62 @@
1
+ # Weekly check that the python:3.13-slim digest pinned by `agentframe compose`
2
+ # (src/agentframe/compose.py, tests/unit/golden/Dockerfile and
3
+ # docs/guides/development.md) is still the tag's current digest. When it is
4
+ # not, it opens one issue and fails, so a maintainer refreshes the pin
5
+ # deliberately; it never writes to the repository.
6
+ name: Base image digest
7
+
8
+ on:
9
+ schedule:
10
+ - cron: "0 6 * * 1"
11
+ workflow_dispatch:
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ check:
18
+ runs-on: ubuntu-latest
19
+ permissions:
20
+ contents: read
21
+ issues: write
22
+ env:
23
+ IMAGE: python
24
+ TAG: 3.13-slim
25
+ ISSUE_TITLE: Refresh the pinned python:3.13-slim digest
26
+ steps:
27
+ - uses: actions/checkout@v7
28
+ - name: Compare the pinned and current digests
29
+ env:
30
+ GH_TOKEN: ${{ github.token }}
31
+ run: |
32
+ set -euo pipefail
33
+ pinned=$(sed -n 's/^FROM .*@//p' tests/unit/golden/Dockerfile)
34
+ token=$(curl -fsS "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/${IMAGE}:pull" | jq -r .token)
35
+ current=$(curl -fsSI \
36
+ -H "Authorization: Bearer ${token}" \
37
+ -H "Accept: application/vnd.oci.image.index.v1+json" \
38
+ -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
39
+ "https://registry-1.docker.io/v2/library/${IMAGE}/manifests/${TAG}" \
40
+ | tr -d '\r' | sed -n 's/^docker-content-digest: //Ip')
41
+ if [[ ! "${current}" =~ ^sha256:[0-9a-f]{64}$ ]]; then
42
+ echo "::error::Could not read the current ${IMAGE}:${TAG} digest."
43
+ exit 1
44
+ fi
45
+ echo "Pinned: ${pinned}"
46
+ echo "Current: ${current}"
47
+ if [[ "${pinned}" == "${current}" ]]; then
48
+ exit 0
49
+ fi
50
+ open=$(gh issue list --state open --search "\"${ISSUE_TITLE}\" in:title" --json number --jq length)
51
+ if [[ "${open}" == "0" ]]; then
52
+ gh issue create --title "${ISSUE_TITLE}" --body "$(cat <<EOF
53
+ \`${IMAGE}:${TAG}\` now resolves to \`${current}\`; \`agentframe compose\` pins \`${pinned}\`.
54
+
55
+ After testing the new image, update the digest in \`src/agentframe/compose.py\` (\`BASE_IMAGE\`), \`tests/unit/golden/Dockerfile\` and \`docs/guides/development.md\`. See the Containers section of the development guide.
56
+
57
+ Opened by the [Base image digest workflow](${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}).
58
+ EOF
59
+ )"
60
+ fi
61
+ echo "::error::${IMAGE}:${TAG} moved to ${current}; refresh the pinned digest."
62
+ exit 1
@@ -14,10 +14,11 @@ This repository contains the M0 development tooling, M1 model-free
14
14
  authoring/local `Runtime`, M2 native A2A hosting, M3 Ollama/Foundry text
15
15
  generation, M4 typed structured outputs, M5 bounded tool calling, M6 built-in
16
16
  opt-in model routing and M7 hardening alongside design documentation. Version
17
- 0.1.0, the first usable single-agent release, is published on PyPI as
18
- `agentframe-py` (import `agentframe`). Pre-1.0 there is no stable API. The
19
- M8+ multi-agent stories (#83-#97) are complete and form the 0.2.0
20
- multi-agent release; later features (MCP, telemetry, streaming) are not implemented. Keep design API examples beyond
17
+ 0.1.0, the first usable single-agent release, and version 0.2.0, the M8+
18
+ multi-agent release (#83-#97), are published on PyPI as `agentframe-py`
19
+ (import `agentframe`). Pre-1.0 there is no stable API. M9 evaluation (#164, #152-#163)
20
+ and M10 model-planned orchestration (#177, #166-#176) are complete and form
21
+ version 0.3.0; later features (MCP, telemetry, streaming) are not implemented. Keep design API examples beyond
21
22
  the implemented surface labeled as unimplemented; explicitly approved
22
23
  names/defaults are decisions, not still-unresolved recommendations. Do not
23
24
  scaffold implementation or add dependencies merely to make design snippets
@@ -88,24 +89,27 @@ Folders stay one level deep. Put new code in the group that owns the concept:
88
89
  | Path | Contents |
89
90
  | --- | --- |
90
91
  | `src/agentframe/__init__.py` | Public API re-exports; every public name is importable from `agentframe`. |
91
- | `src/agentframe/` (root) | `errors.py`, `testing.py` (`ScriptedModel`), `cli.py` (`agentframe run` / `dev` / `compose`), `project.py` (`agentframe.yaml`), `dev.py` (`dev_settings()`), `dev_server.py` (`agentframe dev` supervisor), `compose.py` (`agentframe compose` generator). |
92
+ | `src/agentframe/` (root) | `errors.py`, `testing.py` (`ScriptedModel`), `cli.py` (`agentframe run` / `dev` / `compose` / `eval`), `project.py` (`agentframe.yaml`), `dev.py` (`dev_settings()`), `dev_server.py` (`agentframe dev` supervisor), `compose.py` (`agentframe compose` generator). |
92
93
  | `src/agentframe/authoring/` | `Agent`, `@agent` / `@skill`, definitions, `RunContext`, `Inject` / `Services`. |
93
94
  | `src/agentframe/runtime/` | `Runtime`, generation, `RunLimits`, `RunOptions`, `Usage`. |
94
95
  | `src/agentframe/models/` | `base.py` model protocol and settings; provider adapters `ollama.py`, `foundry.py`; `strict_schema.py` (OpenAI strict JSON-schema converter). |
95
96
  | `src/agentframe/hosting/` | `AgentApp`, `HostConfig`, Agent Card, A2A executor, routing. |
96
97
  | `src/agentframe/security/` | `Principal`, authentication, authorization. |
98
+ | `src/agentframe/orchestration/` | `RemoteSkill`, `SkillCatalog`, bounding of untrusted card text, `RemoteTool` (remote entries as model tools, with per-entry permissions and tool checks), `Plan` / `PlanStep` with static checks and reference substitution (`plan.py`), the `ctx.plan` planning call (`planning.py`) and the plan executor behind `ctx.run_plan` (`execution.py`, `PlanResult`, `StepResult`) (M10). |
97
99
  | `src/agentframe/discovery/` | `AgentRegistry`, `AgentReference`, `AgentQuery`, file and environment registries (M8+). |
100
+ | `src/agentframe/evaluation/` | Evaluation harness (M9): `cases.py` (`Case`, `load_cases`), `targets.py` (`Target`, `TargetResult`, `LocalSkill`, `A2ATarget`), `scoring.py` (`Score`, scorer calls, built-ins `equals`, `contains`, `valid`), `judge.py` (`Judge`, the rubric scorer's model-backed run and its budget holds), `report.py` (`CaseResult`, `EvalReport`, versioned JSON, `require`), `budget.py` (`TokenBudget`, evaluation-wide token holds), `harness.py` (`Evaluation`). Imported as `agentframe.evaluation`, not re-exported from `agentframe`, so its `__init__.py` re-exports its own public names. |
98
101
  | `tests/unit/<group>/` | Unit tests mirroring the source groups; root-module tests in `tests/unit/`. |
99
102
  | `tests/integration/` | Interoperability, real providers, success criterion, README example. |
100
- | `tests/support/` | Shared helpers, on pytest's `pythonpath` (`from local_server import ...`). |
101
- | `examples/` | Runnable examples, each with `create_app()`; `smoke.py` checks them all against the installed wheel in CI. |
103
+ | `tests/support/` | Shared helpers, on pytest's `pythonpath` (`from local_server import ...`); `agent_processes.py` starts agents (`agentframe run`) and the plain A2A peer (`peer_process.py`) as separate processes for release tests. |
104
+ | `examples/` | Runnable examples, each with `create_app()` (`evaluation.py` has `create_evaluation()` instead; `multi_agent/planner_evaluation.py` has `create_planner_evaluation(model, runtime)`); `smoke.py` checks them all against the installed wheel in CI. `multi_agent/` holds the research, writer and planner agents (hand-written `plan`, model-planned `propose` / `planned`, M10). |
102
105
  | `docs/roadmap.md` | Product boundaries, decisions and milestones. |
103
106
  | `docs/guides/` | How to use AgentFrame and how its behavior works. |
104
107
  | `docs/design/` | Rationale and proposed designs. |
105
108
  | `docs/api/` | Public surface reference. |
106
109
 
107
110
  Keep subpackage `__init__.py` files to a short docstring; add public exports to
108
- the top-level `__init__.py` only. Import internal modules by full path, for
111
+ the top-level `__init__.py` only (except `agentframe.evaluation`, which
112
+ `import agentframe` must not load). Import internal modules by full path, for
109
113
  example `from agentframe.runtime.limits import RunLimits`. Keep test basenames
110
114
  unique, since test folders are not packages.
111
115
 
@@ -118,7 +122,20 @@ clear error for an unknown model/deployment, a hosted structured call through
118
122
  the official A2A client, a validated typed `output=` result and the example's
119
123
  `summarize` skill returning a typed data part over A2A, a one-tool round trip
120
124
  run locally and through `examples/orders.py` over A2A (skipped if the model
121
- lacks tool support), a Foundry one-tool round trip that replays encrypted
125
+ lacks tool support), a model calling a localhost agent's skill as a remote
126
+ tool (M10 #167, checking only that the entry was called; skipped without tool
127
+ support), a rubric `Judge` grading one model-free case in an `Evaluation`
128
+ by majority of `votes=3` (M9 #160, #161), `examples/evaluation.py`'s answers
129
+ graded by a rubric judge (M9 #163; xfails for Ollama when the small judge
130
+ fails correct answers), a model planning one unambiguous
131
+ two-step goal over two localhost agents' cards with `ctx.plan` (M10 #170,
132
+ checking only the entries and the dependency; `llama3.2:3b` often writes
133
+ an invalid or different plan, an Ollama xfail), the `examples/multi_agent` planner planning and running its
134
+ post with the real model and the planner evaluation with `report.require`
135
+ (M10 #176, `-k real_planner`; specialists use stand-in models; for Ollama only
136
+ model-quality outcomes xfail: an invalid or empty plan, a plan the example's
137
+ checks refuse, or more than half the evaluation's plans erroring that way;
138
+ any other failure fails), a Foundry one-tool round trip that replays encrypted
122
139
  reasoning items and one unambiguous free-text request routed by
123
140
  `examples/routed_assistant.py` over A2A (checking only the selected skill and
124
141
  that its argument is present, since routing is nondeterministic). They are marked
@@ -158,7 +175,10 @@ agent and fetches that agent's card, read-only. It runs only with
158
175
  roles are in `docs/api/discovery.md#foundryagentregistry`. The same agent is the
159
176
  real non-AgentFrame server for #94: one test `ask`s it once, another checks
160
177
  `call` is refused before sending. In CI, `test_multi_agent_interop.py` proves
161
- both directions against a plain SDK peer (`tests/support/a2a_peer.py`).
178
+ both directions against a plain SDK peer (`tests/support/a2a_peer.py`). For
179
+ #159 the same file evaluates the agent with one `A2ATarget` `ask` case and
180
+ checks a `skill=` case is refused before sending; `test_evaluation_interop.py`
181
+ does the same against the plain SDK peer in CI.
162
182
 
163
183
  `tests/integration/test_entra_interoperability.py` has one opt-in `entra` test
164
184
  using a real token from `az account get-access-token`, enabled with
@@ -448,7 +468,9 @@ Model deployments are not agent endpoints; no AgentFrame-to-Foundry deployment
448
468
  or tested registry integration is claimed.
449
469
 
450
470
  Implemented (#84): `AgentDirectory(sources=[...], card_ttl_seconds=300,
451
- allow_stale=False, allow_http_hosts=(), http_client=None)` owns SDK card
471
+ allow_stale=False, allow_http_hosts=(), http_client=None,
472
+ max_reply_bytes=8 MiB)` (#150: `Remote` replies streamed, over it -> safe
473
+ `RemoteAgentError`) owns SDK card
452
474
  fetch/validation/cache/refresh via an internal fetcher (no public
453
475
  `AgentCardResolver`/`CardCacheConfig`). Sources read on every `get`; cards
454
476
  cached per card URL, refetched when stale; failed refresh raises unless
@@ -538,7 +560,9 @@ reservations. Default max 5 remote hops, excess fails. These controls use the
538
560
  same A2A extension; detailed config/wire/usage trust remains open, not base
539
561
  protocol fields or hard billing guarantees.
540
562
  No orchestration helpers in the first multi-agent release: plain await,
541
- asyncio.TaskGroup and directory.find. Later optional `Remote[ResearchAgent]`
563
+ asyncio.TaskGroup and directory.find. M10 (0.3.0) adds opt-in remote skills as model
564
+ tools and checked plans (`docs/guides/orchestration.md`); plain await stays
565
+ the default. Later optional `Remote[ResearchAgent]`
542
566
  typed proxy always uses structured selection, never prompt routing. Prove two or more
543
567
  independently deployed AgentFrame agents, an orchestrator discovering/calling a
544
568
  specialist with propagated context, and non-AgentFrame A2A client/server interop.
@@ -605,7 +629,11 @@ failed runs log ID, class and safe message; skill/tool/router tracebacks stay in
605
629
  operator logs with the ID, so authors keep secrets out of exception messages.
606
630
  `tests/integration/test_hardening.py` is the M7 end-to-end acceptance suite;
607
631
  `tests/integration/test_multi_agent_release.py` is M8+'s, running
608
- `examples/multi_agent` as separate `agentframe run` processes.
632
+ `examples/multi_agent` as separate `agentframe run` processes;
633
+ `tests/integration/test_orchestration_release.py` is M10's (#176), running its
634
+ research, writer and planner agents, the plain SDK peer and a registry-wide
635
+ coordinator (`tests/support/release_targets.py`) as separate processes with a
636
+ scripted planning model, plus the planner evaluation.
609
637
  Network host examples must include clearly labeled application-supplied
610
638
  development authentication/authorization placeholders where appropriate;
611
639
  loopback/omission is not access policy or a production-safe default.
@@ -673,7 +701,7 @@ remain open; tracing/accounting/enforcement work independently. See
673
701
 
674
702
  Read `README.md` and `docs/README.md` first. Keep `docs/roadmap.md`, the
675
703
  guides (`docs/guides/annotations.md`, `agent-examples.md`, `limits.md`,
676
- `authorization.md`, `development.md`) and the design docs
704
+ `authorization.md`, `development.md`, `evaluation.md`, `orchestration.md`) and the design docs
677
705
  (`docs/design/base-classes.md`, `tracing.md`, `mcp-skills.md`,
678
706
  `prompt-safeguarding.md`, `discovery.md`, `streaming.md`, `evaluation.md`,
679
707
  `orchestration.md`) consistent, including discovery/streaming API pages and