agentforge-py 0.3.0__tar.gz → 0.4.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 (248) hide show
  1. agentforge_py-0.4.0/PKG-INFO +557 -0
  2. agentforge_py-0.4.0/README.md +431 -0
  3. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/pyproject.toml +66 -66
  4. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/__init__.py +9 -1
  5. agentforge_py-0.4.0/src/agentforge/_deprecation.py +89 -0
  6. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/_build.py +27 -0
  7. agentforge_py-0.4.0/src/agentforge/cli/_notes.py +223 -0
  8. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/_scaffold_state.py +50 -0
  9. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/_shared_scaffold.py +70 -24
  10. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/main.py +1 -1
  11. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/new_cmd.py +6 -4
  12. agentforge_py-0.4.0/src/agentforge/cli/release_notes.json +1138 -0
  13. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/upgrade_cmd.py +176 -36
  14. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/retrieval.py +87 -40
  15. agentforge_py-0.4.0/tests/unit/test_cli_version.py +39 -0
  16. agentforge_py-0.4.0/tests/unit/test_deprecation.py +64 -0
  17. agentforge_py-0.4.0/tests/unit/test_notes.py +182 -0
  18. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_retriever_graphrag.py +155 -0
  19. agentforge_py-0.4.0/tests/unit/test_shared_scaffold.py +171 -0
  20. agentforge_py-0.4.0/tests/unit/test_three_section_format.py +136 -0
  21. agentforge_py-0.4.0/tests/unit/test_upgrade_cmd.py +93 -0
  22. agentforge_py-0.4.0/tests/unit/test_upgrade_notes.py +118 -0
  23. agentforge_py-0.3.0/PKG-INFO +0 -158
  24. agentforge_py-0.3.0/README.md +0 -32
  25. agentforge_py-0.3.0/tests/unit/test_shared_scaffold.py +0 -92
  26. agentforge_py-0.3.0/tests/unit/test_three_section_format.py +0 -66
  27. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/.gitignore +0 -0
  28. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/LICENSE +0 -0
  29. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_testing/__init__.py +0 -0
  30. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_testing/fake_llm.py +0 -0
  31. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_testing/fake_tool.py +0 -0
  32. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_tools/__init__.py +0 -0
  33. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_tools/calculator.py +0 -0
  34. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_tools/decorator.py +0 -0
  35. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_tools/file_read.py +0 -0
  36. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_tools/shell.py +0 -0
  37. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/_tools/web_search.py +0 -0
  38. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/agent.py +0 -0
  39. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/auth.py +0 -0
  40. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/__init__.py +0 -0
  41. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/config_cmd.py +0 -0
  42. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/db_cmd.py +0 -0
  43. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/debug_cmd.py +0 -0
  44. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/docs_cmd.py +0 -0
  45. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/eval_cmd.py +0 -0
  46. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/health_cmd.py +0 -0
  47. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/list_modules.py +0 -0
  48. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/manifest_apply.py +0 -0
  49. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/module_cmd.py +0 -0
  50. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/cli/run_cmd.py +0 -0
  51. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/config/__init__.py +0 -0
  52. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/eval/__init__.py +0 -0
  53. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/eval/consistency.py +0 -0
  54. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/eval/coverage.py +0 -0
  55. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/eval/format_compliance.py +0 -0
  56. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/eval/regression.py +0 -0
  57. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/findings.py +0 -0
  58. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/guardrails/__init__.py +0 -0
  59. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/guardrails/allowlist.py +0 -0
  60. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/guardrails/capability_check.py +0 -0
  61. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/guardrails/engine.py +0 -0
  62. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/guardrails/pii_redact_basic.py +0 -0
  63. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/guardrails/prompt_injection_basic.py +0 -0
  64. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/memory/__init__.py +0 -0
  65. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/memory/in_memory.py +0 -0
  66. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/memory/in_memory_graph.py +0 -0
  67. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/memory/in_memory_vector.py +0 -0
  68. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/pipeline/__init__.py +0 -0
  69. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/pipeline/engine.py +0 -0
  70. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/pipeline/errors.py +0 -0
  71. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/pipeline/tool.py +0 -0
  72. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/py.typed +0 -0
  73. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/recording.py +0 -0
  74. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/__init__.py +0 -0
  75. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/_defaults.py +0 -0
  76. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/markdown.py +0 -0
  77. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/patch_applier.py +0 -0
  78. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/registry.py +0 -0
  79. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/scorecard.py +0 -0
  80. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/renderers/span_table.py +0 -0
  81. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/replay.py +0 -0
  82. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/resolver_register.py +0 -0
  83. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/runtime.py +0 -0
  84. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/__init__.py +0 -0
  85. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/_base.py +0 -0
  86. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/_plan.py +0 -0
  87. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/multi_agent.py +0 -0
  88. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/plan_execute.py +0 -0
  89. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/react.py +0 -0
  90. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/strategies/tot.py +0 -0
  91. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/.cursorrules +0 -0
  92. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/.github/copilot-instructions.md +0 -0
  93. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/.gitkeep +0 -0
  94. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/AGENTS.md.tmpl +0 -0
  95. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/CLAUDE.md +0 -0
  96. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/01-set-up-new-agent.md.tmpl +0 -0
  97. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/02-add-a-tool.md +0 -0
  98. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/03-add-a-pipeline-task.md +0 -0
  99. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/04-pick-reasoning-strategy.md +0 -0
  100. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/05-write-prompts.md +0 -0
  101. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/06-test-your-agent.md +0 -0
  102. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/07-debug-a-run.md +0 -0
  103. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/08-add-memory.md +0 -0
  104. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/09-add-mcp.md +0 -0
  105. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/10-add-evaluators.md +0 -0
  106. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/11-add-safety-guardrails.md +0 -0
  107. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/12-add-observability.md +0 -0
  108. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/13-configure-multi-provider.md +0 -0
  109. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/14-deploy-your-agent.md +0 -0
  110. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/15-upgrade-your-agent.md +0 -0
  111. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/16-configuration-reference.md +0 -0
  112. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/17-add-reranker.md +0 -0
  113. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/18-add-hybrid-search.md +0 -0
  114. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/19-add-graphrag.md +0 -0
  115. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/20-apply-schema-migrations.md +0 -0
  116. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/21-use-streaming-guardrails.md +0 -0
  117. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/README.md.tmpl +0 -0
  118. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/.env.example +0 -0
  119. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/.gitignore +0 -0
  120. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/README.md +0 -0
  121. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/agentforge.yaml +0 -0
  122. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/copier.yml +0 -0
  123. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/pyproject.toml +0 -0
  124. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
  125. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
  126. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/.env.example +0 -0
  127. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/.gitignore +0 -0
  128. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/README.md +0 -0
  129. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/agentforge.yaml +0 -0
  130. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/copier.yml +0 -0
  131. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/pyproject.toml +0 -0
  132. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
  133. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
  134. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/.env.example +0 -0
  135. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/.gitignore +0 -0
  136. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/README.md +0 -0
  137. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/agentforge.yaml +0 -0
  138. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/copier.yml +0 -0
  139. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/pyproject.toml +0 -0
  140. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
  141. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
  142. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/.env.example +0 -0
  143. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/.gitignore +0 -0
  144. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/README.md +0 -0
  145. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/agentforge.yaml +0 -0
  146. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/copier.yml +0 -0
  147. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/pyproject.toml +0 -0
  148. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
  149. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
  150. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/.env.example +0 -0
  151. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/.gitignore +0 -0
  152. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/README.md +0 -0
  153. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/agentforge.yaml +0 -0
  154. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/copier.yml +0 -0
  155. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/pyproject.toml +0 -0
  156. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
  157. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/research/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
  158. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/.env.example +0 -0
  159. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/.gitignore +0 -0
  160. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/README.md +0 -0
  161. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/agentforge.yaml +0 -0
  162. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/copier.yml +0 -0
  163. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/pyproject.toml +0 -0
  164. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
  165. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/templates/triage/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
  166. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/testing/__init__.py +0 -0
  167. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/testing/conformance.py +0 -0
  168. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/testing/factory.py +0 -0
  169. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/testing/fixtures.py +0 -0
  170. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/testing/llm.py +0 -0
  171. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/testing/recording.py +0 -0
  172. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/src/agentforge/tools/__init__.py +0 -0
  173. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/conftest.py +0 -0
  174. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/integration/test_add_module_uv_live.py +0 -0
  175. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/integration/test_configured_runtime_e2e.py +0 -0
  176. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/integration/test_web_search_live.py +0 -0
  177. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/.gitkeep +0 -0
  178. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent.py +0 -0
  179. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent_evaluators.py +0 -0
  180. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent_fallback_chain.py +0 -0
  181. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent_graph_store.py +0 -0
  182. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent_hooks.py +0 -0
  183. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent_pipeline.py +0 -0
  184. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_agent_retriever.py +0 -0
  185. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_build_retriever.py +0 -0
  186. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_build.py +0 -0
  187. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_build_pipeline.py +0 -0
  188. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_config.py +0 -0
  189. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_db.py +0 -0
  190. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_debug.py +0 -0
  191. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_docs.py +0 -0
  192. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_eval.py +0 -0
  193. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_health.py +0 -0
  194. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_list_modules.py +0 -0
  195. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_cli_run.py +0 -0
  196. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_config.py +0 -0
  197. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_env_bearer_auth.py +0 -0
  198. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_eval_consistency.py +0 -0
  199. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_eval_coverage.py +0 -0
  200. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_eval_format_compliance.py +0 -0
  201. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_eval_regression.py +0 -0
  202. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_example_swap_smoke.py +0 -0
  203. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_extras_chain.py +0 -0
  204. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_fake_tool.py +0 -0
  205. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_findings.py +0 -0
  206. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_graph_store_properties.py +0 -0
  207. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_guardrails_builtins.py +0 -0
  208. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_guardrails_conformance.py +0 -0
  209. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_guardrails_engine.py +0 -0
  210. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_in_memory_graph_store.py +0 -0
  211. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_in_memory_store.py +0 -0
  212. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_in_memory_vector_store.py +0 -0
  213. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_manifest_apply.py +0 -0
  214. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_module_cmd.py +0 -0
  215. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_multi_agent_stream.py +0 -0
  216. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_new_cmd.py +0 -0
  217. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_pipeline_engine.py +0 -0
  218. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_plan.py +0 -0
  219. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_plan_execute_stream.py +0 -0
  220. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_react_stream.py +0 -0
  221. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_recording.py +0 -0
  222. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_renderer_pipeline_findings.py +0 -0
  223. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_renderer_registry.py +0 -0
  224. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_renderers_builtin.py +0 -0
  225. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_replay.py +0 -0
  226. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_retrieval.py +0 -0
  227. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_retrieval_rerank.py +0 -0
  228. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_retriever_hybrid.py +0 -0
  229. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_runtime.py +0 -0
  230. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_scaffold_state.py +0 -0
  231. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_base.py +0 -0
  232. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_budget_properties.py +0 -0
  233. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_dispatch_tool.py +0 -0
  234. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_multi_agent.py +0 -0
  235. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_plan_execute.py +0 -0
  236. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_react.py +0 -0
  237. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_strategies_tot.py +0 -0
  238. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_testing_factory.py +0 -0
  239. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_testing_fake_llm.py +0 -0
  240. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_testing_mock_llm.py +0 -0
  241. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_testing_recording.py +0 -0
  242. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_tool_decorator.py +0 -0
  243. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_tools_calculator.py +0 -0
  244. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_tools_file_read.py +0 -0
  245. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_tools_shell.py +0 -0
  246. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_tools_web_search.py +0 -0
  247. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_tot_stream.py +0 -0
  248. {agentforge_py-0.3.0 → agentforge_py-0.4.0}/tests/unit/test_vector_store_properties.py +0 -0
@@ -0,0 +1,557 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentforge-py
3
+ Version: 0.4.0
4
+ Summary: AgentForge — open-source plug-and-play framework for production AI agents
5
+ Project-URL: Homepage, https://github.com/Scaffoldic/agentforge-py
6
+ Project-URL: Repository, https://github.com/Scaffoldic/agentforge-py
7
+ Project-URL: Documentation, https://github.com/Scaffoldic/agentforge-py
8
+ Project-URL: Changelog, https://github.com/Scaffoldic/agentforge-py/blob/main/CHANGELOG.md
9
+ Project-URL: Issues, https://github.com/Scaffoldic/agentforge-py/issues
10
+ Author: The AgentForge Authors
11
+ License-Expression: Apache-2.0
12
+ License-File: LICENSE
13
+ Keywords: agent,agentic,ai,framework,llm,react,tools
14
+ Classifier: Development Status :: 2 - Pre-Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.13
23
+ Requires-Dist: agentforge-core~=0.4.0
24
+ Requires-Dist: copier>=9.4
25
+ Requires-Dist: pydantic>=2.10
26
+ Requires-Dist: pyyaml>=6.0
27
+ Requires-Dist: typer>=0.15
28
+ Provides-Extra: a2a
29
+ Requires-Dist: agentforge-a2a~=0.4.0; extra == 'a2a'
30
+ Provides-Extra: all
31
+ Requires-Dist: agentforge-a2a~=0.4.0; extra == 'all'
32
+ Requires-Dist: agentforge-anthropic[anthropic]~=0.4.0; extra == 'all'
33
+ Requires-Dist: agentforge-bedrock~=0.4.0; extra == 'all'
34
+ Requires-Dist: agentforge-chat-history-postgres~=0.4.0; extra == 'all'
35
+ Requires-Dist: agentforge-chat-history-redis~=0.4.0; extra == 'all'
36
+ Requires-Dist: agentforge-chat-http~=0.4.0; extra == 'all'
37
+ Requires-Dist: agentforge-chat-slack~=0.4.0; extra == 'all'
38
+ Requires-Dist: agentforge-chat~=0.4.0; extra == 'all'
39
+ Requires-Dist: agentforge-eval-geval~=0.4.0; extra == 'all'
40
+ Requires-Dist: agentforge-evidently[evidently]~=0.4.0; extra == 'all'
41
+ Requires-Dist: agentforge-guard-llamaguard~=0.4.0; extra == 'all'
42
+ Requires-Dist: agentforge-guard-llmguard~=0.4.0; extra == 'all'
43
+ Requires-Dist: agentforge-guard-nemo~=0.4.0; extra == 'all'
44
+ Requires-Dist: agentforge-guard-presidio~=0.4.0; extra == 'all'
45
+ Requires-Dist: agentforge-langfuse[langfuse]~=0.4.0; extra == 'all'
46
+ Requires-Dist: agentforge-litellm[litellm]~=0.4.0; extra == 'all'
47
+ Requires-Dist: agentforge-mcp[mcp]~=0.4.0; extra == 'all'
48
+ Requires-Dist: agentforge-memory-neo4j~=0.4.0; extra == 'all'
49
+ Requires-Dist: agentforge-memory-postgres~=0.4.0; extra == 'all'
50
+ Requires-Dist: agentforge-memory-sqlite~=0.4.0; extra == 'all'
51
+ Requires-Dist: agentforge-memory-surrealdb~=0.4.0; extra == 'all'
52
+ Requires-Dist: agentforge-ollama[ollama]~=0.4.0; extra == 'all'
53
+ Requires-Dist: agentforge-openai[openai]~=0.4.0; extra == 'all'
54
+ Requires-Dist: agentforge-otel~=0.4.0; extra == 'all'
55
+ Requires-Dist: agentforge-phoenix[phoenix]~=0.4.0; extra == 'all'
56
+ Requires-Dist: agentforge-reranker-cohere[cohere]~=0.4.0; extra == 'all'
57
+ Requires-Dist: agentforge-reranker-mixedbread[mixedbread]~=0.4.0; extra == 'all'
58
+ Requires-Dist: agentforge-reranker-sentence-transformers[sentence-transformers]~=0.4.0; extra == 'all'
59
+ Requires-Dist: agentforge-reranker-voyage[voyage]~=0.4.0; extra == 'all'
60
+ Requires-Dist: agentforge-statsd[statsd]~=0.4.0; extra == 'all'
61
+ Requires-Dist: agentforge-testing~=0.4.0; extra == 'all'
62
+ Requires-Dist: agentforge-voyage[voyage]~=0.4.0; extra == 'all'
63
+ Provides-Extra: anthropic
64
+ Requires-Dist: agentforge-anthropic[anthropic]~=0.4.0; extra == 'anthropic'
65
+ Provides-Extra: bedrock
66
+ Requires-Dist: agentforge-bedrock~=0.4.0; extra == 'bedrock'
67
+ Provides-Extra: chat
68
+ Requires-Dist: agentforge-chat~=0.4.0; extra == 'chat'
69
+ Provides-Extra: chat-history-postgres
70
+ Requires-Dist: agentforge-chat-history-postgres~=0.4.0; extra == 'chat-history-postgres'
71
+ Provides-Extra: chat-history-redis
72
+ Requires-Dist: agentforge-chat-history-redis~=0.4.0; extra == 'chat-history-redis'
73
+ Provides-Extra: chat-http
74
+ Requires-Dist: agentforge-chat-http~=0.4.0; extra == 'chat-http'
75
+ Provides-Extra: chat-slack
76
+ Requires-Dist: agentforge-chat-slack~=0.4.0; extra == 'chat-slack'
77
+ Provides-Extra: eval
78
+ Requires-Dist: agentforge-eval-geval~=0.4.0; extra == 'eval'
79
+ Provides-Extra: evidently
80
+ Requires-Dist: agentforge-evidently[evidently]~=0.4.0; extra == 'evidently'
81
+ Provides-Extra: guard-llamaguard
82
+ Requires-Dist: agentforge-guard-llamaguard~=0.4.0; extra == 'guard-llamaguard'
83
+ Provides-Extra: guard-llmguard
84
+ Requires-Dist: agentforge-guard-llmguard~=0.4.0; extra == 'guard-llmguard'
85
+ Provides-Extra: guard-nemo
86
+ Requires-Dist: agentforge-guard-nemo~=0.4.0; extra == 'guard-nemo'
87
+ Provides-Extra: guard-presidio
88
+ Requires-Dist: agentforge-guard-presidio~=0.4.0; extra == 'guard-presidio'
89
+ Provides-Extra: langfuse
90
+ Requires-Dist: agentforge-langfuse[langfuse]~=0.4.0; extra == 'langfuse'
91
+ Provides-Extra: litellm
92
+ Requires-Dist: agentforge-litellm[litellm]~=0.4.0; extra == 'litellm'
93
+ Provides-Extra: mcp
94
+ Requires-Dist: agentforge-mcp[mcp]~=0.4.0; extra == 'mcp'
95
+ Provides-Extra: memory-neo4j
96
+ Requires-Dist: agentforge-memory-neo4j~=0.4.0; extra == 'memory-neo4j'
97
+ Provides-Extra: memory-postgres
98
+ Requires-Dist: agentforge-memory-postgres~=0.4.0; extra == 'memory-postgres'
99
+ Provides-Extra: memory-sqlite
100
+ Requires-Dist: agentforge-memory-sqlite~=0.4.0; extra == 'memory-sqlite'
101
+ Provides-Extra: memory-surrealdb
102
+ Requires-Dist: agentforge-memory-surrealdb~=0.4.0; extra == 'memory-surrealdb'
103
+ Provides-Extra: ollama
104
+ Requires-Dist: agentforge-ollama[ollama]~=0.4.0; extra == 'ollama'
105
+ Provides-Extra: openai
106
+ Requires-Dist: agentforge-openai[openai]~=0.4.0; extra == 'openai'
107
+ Provides-Extra: otel
108
+ Requires-Dist: agentforge-otel~=0.4.0; extra == 'otel'
109
+ Provides-Extra: phoenix
110
+ Requires-Dist: agentforge-phoenix[phoenix]~=0.4.0; extra == 'phoenix'
111
+ Provides-Extra: reranker-cohere
112
+ Requires-Dist: agentforge-reranker-cohere[cohere]~=0.4.0; extra == 'reranker-cohere'
113
+ Provides-Extra: reranker-mixedbread
114
+ Requires-Dist: agentforge-reranker-mixedbread[mixedbread]~=0.4.0; extra == 'reranker-mixedbread'
115
+ Provides-Extra: reranker-sentence-transformers
116
+ Requires-Dist: agentforge-reranker-sentence-transformers[sentence-transformers]~=0.4.0; extra == 'reranker-sentence-transformers'
117
+ Provides-Extra: reranker-voyage
118
+ Requires-Dist: agentforge-reranker-voyage[voyage]~=0.4.0; extra == 'reranker-voyage'
119
+ Provides-Extra: statsd
120
+ Requires-Dist: agentforge-statsd[statsd]~=0.4.0; extra == 'statsd'
121
+ Provides-Extra: testing
122
+ Requires-Dist: agentforge-testing~=0.4.0; extra == 'testing'
123
+ Provides-Extra: voyage
124
+ Requires-Dist: agentforge-voyage[voyage]~=0.4.0; extra == 'voyage'
125
+ Description-Content-Type: text/markdown
126
+
127
+ <!--
128
+ This is the PyPI landing page for the `agentforge-py` distribution.
129
+ It mirrors the repository root README.md, but every link is ABSOLUTE
130
+ (https://github.com/Scaffoldic/agentforge-py/...) because PyPI does
131
+ not resolve repo-relative links or images. When you update the root
132
+ README, update this file too and keep the links absolute.
133
+ -->
134
+
135
+ # AgentForge
136
+
137
+ **An AI-agent framework that behaves like infrastructure, not a demo you
138
+ ship once.**
139
+ Production plumbing — cost, tracing, memory, guardrails, failover — comes as
140
+ swap-by-config packages behind version-locked contracts. You write your use
141
+ case; the framework is already production-grade.
142
+
143
+ [![PyPI](https://img.shields.io/pypi/v/agentforge-py.svg)](https://pypi.org/project/agentforge-py/)
144
+ [![Python](https://img.shields.io/badge/python-3.13-blue.svg)](https://github.com/Scaffoldic/agentforge-py)
145
+ [![License](https://img.shields.io/badge/license-Apache_2.0-blue.svg)](https://github.com/Scaffoldic/agentforge-py/blob/main/LICENSE)
146
+
147
+ ![Scaffold a complete agent project, run the full loop offline with budget and tracing wired in, then swap the vendor or the reasoning loop by editing one line of YAML — the agent code never changes](https://raw.githubusercontent.com/Scaffoldic/agentforge-py/main/examples/swap-by-config/demo.gif)
148
+
149
+ *From zero: `agentforge new` scaffolds a runnable project → the full loop runs
150
+ **offline, no API key** (a recorded run) with budget + tracing already wired →
151
+ swap the vendor *or* the reasoning loop by editing **one line of YAML**,
152
+ `agent.py` never changes.*
153
+ [Runnable example →](https://github.com/Scaffoldic/agentforge-py/tree/main/examples/swap-by-config)
154
+
155
+ > **AgentForge treats an agent like a system you operate, not a demo
156
+ > you ship once.** Four things at its core:
157
+ >
158
+ > 1. **Version-locked contracts.** ~30 ABCs in a small
159
+ > `agentforge-core` describe the agent surface, and breaking one
160
+ > is a *major* version bump (ADR-0007) — so you can build on them
161
+ > like a stable API.
162
+ > 2. **Every backend is its own package, swapped by config.** LLM
163
+ > provider, memory store, observability stack, reranker, guardrail
164
+ > — each ships as a separate PyPI distribution you plug in and swap
165
+ > by editing one line of YAML, never your agent code.
166
+ > 3. **The reasoning loop is swap-by-config too.** ReAct,
167
+ > Plan-and-Execute, Tree-of-Thoughts, and a Multi-Agent Supervisor
168
+ > ship behind one `Strategy` contract — pick the loop in YAML, or
169
+ > compose your own from the ABC. The same agent code runs under any
170
+ > of them; the strategy is a configuration choice, not a rewrite.
171
+ > 4. **Scaffolds keep your AI coding assistant on-idiom.** Every
172
+ > generated project ships framework-aware instructions for **Claude
173
+ > Code, Cursor, GitHub Copilot, Aider, Codex, and Windsurf** plus
174
+ > task runbooks — so the AI helping you build stays inside the
175
+ > framework's conventions automatically.
176
+ >
177
+ > Cost guardrails, OpenTelemetry tracing, vendor failover, PII
178
+ > redaction, and reproducible evals are wired in too — behind those
179
+ > same locked contracts, so you can depend on them in production.
180
+
181
+ ```python
182
+ from agentforge import Agent
183
+
184
+ async with Agent(model="anthropic:claude-sonnet-4-7") as agent:
185
+ result = await agent.run("Summarise this PR in three bullets.")
186
+ print(result.output)
187
+ ```
188
+
189
+ Swap `anthropic:` for `openai:`, `bedrock:`, `ollama:`, or
190
+ `litellm:` — same code, different vendor. Swap the reasoning loop the
191
+ same way: `strategy: react` → `plan-execute` → `tree-of-thoughts` →
192
+ `supervisor`, no code change. Every swap happens *behind a locked
193
+ contract*, so it can't quietly change the shape of what your agent gets
194
+ back.
195
+
196
+ ---
197
+
198
+ ## Why AgentForge
199
+
200
+ ### For developers
201
+ The plumbing every production agent needs — cost limits, run-id
202
+ propagation, distributed tracing, vendor failover, durable state,
203
+ prompt-injection defenses, PII redaction, hybrid retrieval — is
204
+ **configured, not coded**. You focus on what your agent *does*,
205
+ not on the harness around it.
206
+
207
+ ### For organisations
208
+ Audit-ready by default. Every call traces through OpenTelemetry
209
+ with run_id propagation. Cost guardrails reject runs that exceed
210
+ their budget *before* the LLM bill lands. PII redaction happens
211
+ inside the framework, not in app code. Built-in evaluators turn
212
+ "did this prompt change regress?" into a reproducible CI gate.
213
+ SOC 2 / GDPR / ISO 27001 conversations get shorter.
214
+
215
+ ### For your AI coding assistant
216
+ Every scaffolded agent ships with framework-aware instructions
217
+ for **Claude Code, Cursor, GitHub Copilot, Aider, Codex CLI, and
218
+ Windsurf** — plus 21 task-oriented runbooks. Your AI builds
219
+ inside the framework's idioms automatically. `agentforge upgrade`
220
+ keeps the instructions current as new capabilities ship, so the AI
221
+ learns the new APIs without you teaching it.
222
+
223
+ ---
224
+
225
+ ## Quick start
226
+
227
+ **Day 1 — install, scaffold, run:**
228
+
229
+ ```bash
230
+ pip install "agentforge-py[anthropic]" # or [openai], [bedrock], [ollama], [litellm]
231
+ agentforge new my-agent --template minimal
232
+ cd my-agent
233
+
234
+ export ANTHROPIC_API_KEY=sk-ant-…
235
+ agentforge run "Hi"
236
+ ```
237
+
238
+ Six starter templates ship in the wheel: `minimal`, `code-reviewer`,
239
+ `patch-bot`, `docs-qa`, `triage`, `research`.
240
+
241
+ > **Want proof before you install a provider?**
242
+ > [`examples/swap-by-config/`](https://github.com/Scaffoldic/agentforge-py/tree/main/examples/swap-by-config)
243
+ > runs the full agent loop **offline with no API key** (`python smoke.py`), and
244
+ > shows the same `agent.py` driving Anthropic or OpenAI with a one-line config
245
+ > change.
246
+
247
+ **Day N — add modules, swap backends, upgrade the framework:**
248
+
249
+ ```bash
250
+ # add a sister module (memory backend, reranker, observability, guard, protocol…)
251
+ pip install agentforge-memory-postgres
252
+ agentforge add memory-postgres
253
+ agentforge config validate
254
+
255
+ # swap providers / strategies / backends without touching code
256
+ agentforge swap llm openai
257
+
258
+ # upgrade the framework — managed files + runbooks refresh,
259
+ # your custom code + `<!-- agentforge:custom -->` blocks survive
260
+ agentforge upgrade --to 0.4.0
261
+ ```
262
+
263
+ Every command has a matching `docs/runbooks/NN-*.md` step-by-step
264
+ guide that ships in the scaffold — your AI coding assistant
265
+ follows the relevant runbook automatically when you ask it for
266
+ "add a reranker" / "configure multi-provider" / "use streaming
267
+ guardrails".
268
+
269
+ ---
270
+
271
+ ## What's in the box
272
+
273
+ AgentForge is a **contracts-first** framework: ~30 locked ABCs in
274
+ `agentforge-core` describe the agent surface; everything else is a
275
+ plug-in module shipped as its own PyPI package. Pick the modules
276
+ you need, swap them via config when requirements change.
277
+
278
+ ### Pluggable providers
279
+ LLMs: Anthropic · OpenAI · AWS Bedrock · Ollama (local) · LiteLLM
280
+ (100+ underlying providers). Embeddings: OpenAI Matryoshka · Voyage
281
+ multimodal · Bedrock · Ollama. One string ID
282
+ (`anthropic:claude-sonnet-4-7`) selects the model; no
283
+ provider-specific code paths in your agent.
284
+
285
+ ### Reasoning strategies
286
+ ReAct · Plan-and-Execute · Tree-of-Thoughts · Multi-Agent
287
+ Supervisor. Pick the loop in YAML, compose your own from the
288
+ strategy ABC when you need to.
289
+
290
+ ### Persistence + retrieval
291
+ One `MemoryStore` + `VectorStore` (+ `GraphStore`) contract, five
292
+ backends: SQLite · Postgres · Neo4j · SurrealDB · Kùzu (embedded,
293
+ zero-ops graph). Hybrid retrieval (vector + BM25 over native
294
+ indexes, RRF fusion), four reranker vendors, directional GraphRAG
295
+ expansion for graph backends, schema migrations across all stores
296
+ via `agentforge db migrate`.
297
+
298
+ ### Guardrails — cost, safety, reliability
299
+ **Cost.** `BudgetPolicy` checks every LLM, tool, and retriever
300
+ call against the run's budget — over-budget runs fail fast,
301
+ before the bill lands.
302
+ **Safety.** Input / output / tool-call validator pipelines with
303
+ four built-in basics + four vendor wrappers — **LLM Guard,
304
+ Microsoft Presidio, NVIDIA NeMo Guardrails, Meta Llama Guard** —
305
+ for PII, prompt injection, toxicity, and off-topic detection.
306
+ **Reliability.** Run-id propagation, `idempotency_key_for()` for
307
+ side-effecting tools, `FallbackChain` cross-provider failover.
308
+
309
+ ### Governance
310
+ A governance spine behind locked contracts: typed `Principal`
311
+ identities (`kind` / `owner`) and an `IdentityProvider` contract,
312
+ with an offline `local` driver (HMAC, URN ids) in the
313
+ `agentforge-governance` package — the foundation for registry,
314
+ policy-as-code, and audit (ADR-0023).
315
+
316
+ ### Observability
317
+ JSON-structured logs + OpenTelemetry (with child spans, A2A
318
+ trace propagation, PII redaction) + Langfuse + Arize Phoenix +
319
+ Evidently + StatsD. Everything wires in via config; nothing to
320
+ instrument in your agent code.
321
+
322
+ ### Evaluation
323
+ Deterministic graders — Coverage, FormatCompliance,
324
+ RegressionVsBaseline, Consistency — plus six LLM judges
325
+ (Correctness, Faithfulness, Groundedness, Hallucination,
326
+ Relevance, Helpfulness). Turn prompt and model upgrades into a
327
+ CI gate.
328
+
329
+ ### Chat + protocols
330
+ `ChatSession` with in-memory / SQLite / Postgres / Redis history,
331
+ four truncation strategies, sentence-window streaming guardrails
332
+ (PII redaction over a streamed response), and a Slack adapter.
333
+ **MCP** stdio + HTTP/SSE servers. **A2A** HTTP + streaming +
334
+ discovery + bearer / mTLS auth.
335
+
336
+ ### CLI
337
+ `agentforge run` · `eval` · `debug` · `db migrate` · `health` ·
338
+ `config validate` · `list` / `add` / `remove` / `swap` (module
339
+ management) · `new` · `upgrade` · `fork` / `unfork` · `status` ·
340
+ `docs`.
341
+
342
+ ---
343
+
344
+ ## Build your own agent
345
+
346
+ > **You don't need to clone the repository.** AgentForge ships as
347
+ > PyPI packages — your agent lives in *your own project*, with the
348
+ > framework as a dependency. Cloning the repo is only for
349
+ > [contributing to the framework itself](https://github.com/Scaffoldic/agentforge-py/blob/main/CONTRIBUTING.md).
350
+
351
+ ### 1. Install from PyPI
352
+
353
+ ```bash
354
+ pip install "agentforge-py[anthropic]" # or [openai], [bedrock], [ollama], [litellm]
355
+ # combine extras
356
+ pip install "agentforge-py[anthropic,openai,memory-postgres,otel]"
357
+ # or install sister packages directly
358
+ pip install agentforge-py agentforge-memory-postgres agentforge-langfuse
359
+ ```
360
+
361
+ Every module is its own PyPI distribution. Install only what you
362
+ use; the framework lazy-imports vendor SDKs so unused providers
363
+ don't add startup cost.
364
+
365
+ ### 2. Scaffold your agent project
366
+
367
+ ```bash
368
+ agentforge new my-agent --template minimal
369
+ cd my-agent
370
+ ```
371
+
372
+ Pick from six templates: `minimal`, `code-reviewer`, `patch-bot`,
373
+ `docs-qa`, `triage`, `research`. You get a complete, runnable
374
+ project:
375
+
376
+ ```
377
+ my-agent/
378
+ ├── agentforge.yaml # model, strategy, budget — the swap-by-config surface
379
+ ├── pyproject.toml
380
+ ├── .env.example # copy to .env, add your API key
381
+ ├── src/my_agent/
382
+ │ └── main.py # your agent code — start editing here
383
+ ├── docs/runbooks/ # step-by-step guides your AI assistant follows
384
+ ├── AGENTS.md # framework-aware instructions for AI coding
385
+ └── CLAUDE.md # assistants (Claude Code, Cursor, Copilot, …)
386
+ ```
387
+
388
+ ### 3. Add your API key
389
+
390
+ ```bash
391
+ cp .env.example .env # then set ANTHROPIC_API_KEY=sk-ant-…
392
+ ```
393
+
394
+ ### 4. Write what your agent does
395
+
396
+ Edit `src/my_agent/main.py`. Give the agent your own tools — a
397
+ typed function plus the `@tool` decorator is all it takes (the
398
+ input schema is inferred from the signature and docstring):
399
+
400
+ ```python
401
+ from agentforge import Agent, tool
402
+
403
+ @tool
404
+ def lookup_order(order_id: str) -> dict:
405
+ """Fetch an order record from your backend."""
406
+ return orders_db.get(order_id)
407
+
408
+ async with Agent(tools=[lookup_order]) as agent:
409
+ result = await agent.run("What's the status of order 1042?")
410
+ print(result.output)
411
+ ```
412
+
413
+ Stateful tools subclass the `Tool` ABC instead. Four defaults ship
414
+ in `agentforge.tools`: `web_search`, `calculator`, `file_read`,
415
+ `shell`.
416
+
417
+ ### 5. Configure behaviour in YAML, not code
418
+
419
+ `agentforge.yaml` is where the model, reasoning strategy, and
420
+ guardrails live — your Python never names a vendor:
421
+
422
+ ```yaml
423
+ agent:
424
+ model: "anthropic:claude-sonnet-4-5"
425
+ strategy: "react" # swap-by-config: plan-execute · tree-of-thoughts · supervisor
426
+ budget:
427
+ usd: 2.0 # over-budget runs fail before the bill lands
428
+ ```
429
+
430
+ Switching providers is `agentforge swap llm openai` — one config
431
+ line changes, your agent code doesn't.
432
+
433
+ ### 6. Run and validate
434
+
435
+ ```bash
436
+ agentforge run "What's the status of order 1042?"
437
+ agentforge config validate
438
+ ```
439
+
440
+ ### 7. Grow it as your needs grow
441
+
442
+ ```bash
443
+ # durable state, tracing, safety, retrieval — one pip install + one `add` each
444
+ pip install agentforge-memory-postgres && agentforge add memory-postgres
445
+ pip install agentforge-otel && agentforge add otel
446
+
447
+ # framework upgrades refresh managed files; your custom code survives
448
+ agentforge upgrade --to 0.4.0
449
+ ```
450
+
451
+ Memory backends, rerankers, guardrail vendors, observability
452
+ stacks, MCP/A2A protocols, evaluators — every capability in
453
+ [What's in the box](#whats-in-the-box) plugs in the same way, and
454
+ each has a matching `docs/runbooks/NN-*.md` guide in your scaffold
455
+ that your AI coding assistant follows automatically.
456
+
457
+ ---
458
+
459
+ ## Repository structure
460
+
461
+ uv workspace — one git repo, 36 installable packages in lock-step.
462
+
463
+ ```
464
+ agentforge-py/
465
+ ├── packages/
466
+ │ ├── agentforge-core/ locked contracts (~30 ABCs)
467
+ │ ├── agentforge/ default runtime + CLI + templates
468
+ │ ├── agentforge-{anthropic,openai,bedrock,ollama,litellm}/ LLM providers
469
+ │ ├── agentforge-voyage/ embeddings
470
+ │ ├── agentforge-memory-{sqlite,postgres,neo4j,surrealdb,kuzu}/ persistence
471
+ │ ├── agentforge-reranker-{cohere,voyage,mixedbread,sentence-transformers}/
472
+ │ ├── agentforge-guard-{llmguard,presidio,nemo,llamaguard}/ safety
473
+ │ ├── agentforge-governance/ identity + governance spine
474
+ │ ├── agentforge-{otel,langfuse,phoenix,evidently,statsd}/ observability
475
+ │ ├── agentforge-{mcp,a2a}/ protocols
476
+ │ ├── agentforge-chat / chat-http / chat-history-{postgres,redis} / chat-slack/
477
+ │ ├── agentforge-eval-geval/ LLM judges
478
+ │ └── agentforge-testing/ golden sets + recordings
479
+ ├── docs/features/ canonical feat-NNN specs
480
+ ├── docs/design/ architecture + module system
481
+ ├── docs/adr/ immutable decision records
482
+ └── docs/roadmap.md shipped + backlog
483
+ ```
484
+
485
+ ---
486
+
487
+ ## Development (contributing to the framework)
488
+
489
+ You only need this section to work on AgentForge itself. To
490
+ **build an agent**, you never clone the repo — see
491
+ [Build your own agent](#build-your-own-agent).
492
+
493
+ Prereqs: Python 3.13 + [uv](https://docs.astral.sh/uv/).
494
+
495
+ ```bash
496
+ git clone git@github.com:Scaffoldic/agentforge-py.git
497
+ cd agentforge-py
498
+ uv sync --all-extras --dev
499
+ uv run pre-commit install
500
+ uv run pre-commit run --all-files # ruff + mypy + bandit + pytest + ≥90 % cov
501
+ ```
502
+
503
+ Linux CI runs on every PR. Windows and macOS CI run on
504
+ `workflow_dispatch` — invoke before cutting a release or when
505
+ touching path / subprocess / filesystem code.
506
+
507
+ ---
508
+
509
+ ## Status
510
+
511
+ **Early but production-minded.** AgentForge is `v0.4.x` and
512
+ solo-maintained — the API surface is stabilising, the contracts are
513
+ locked (ADR-0007), and it's tested like infrastructure
514
+ (`mypy --strict`, ≥90 % coverage, a conformance harness every backend
515
+ must pass, live integration tests in CI). Issues, feedback, and
516
+ contributors are very welcome.
517
+
518
+ ---
519
+
520
+ ## Contributing
521
+
522
+ Start with [`CONTRIBUTING.md`](https://github.com/Scaffoldic/agentforge-py/blob/main/CONTRIBUTING.md)
523
+ — setup, the hard rules, branch/PR conventions, and the pre-commit gate. The
524
+ deeper conventions live in
525
+ [`AGENTS.md`](https://github.com/Scaffoldic/agentforge-py/blob/main/AGENTS.md).
526
+ Be excellent to each other:
527
+ [`CODE_OF_CONDUCT.md`](https://github.com/Scaffoldic/agentforge-py/blob/main/CODE_OF_CONDUCT.md).
528
+ Found a security issue? See
529
+ [`SECURITY.md`](https://github.com/Scaffoldic/agentforge-py/blob/main/SECURITY.md)
530
+ (please report privately).
531
+
532
+ - Branch from `main`: `feat/<NNN>-<slug>`, `fix/<slug>`,
533
+ `docs/<slug>`, `chore/<slug>`
534
+ - Conventional Commits
535
+ - One feature = one PR, squash-merged
536
+ - 90 % coverage floor
537
+ - Every feature PR updates its spec's `Implementation status`
538
+
539
+ Looking for somewhere to start? Issues labelled `good first issue`
540
+ and `help wanted`, plus the
541
+ [`docs/roadmap.md`](https://github.com/Scaffoldic/agentforge-py/blob/main/docs/roadmap.md)
542
+ backlog.
543
+
544
+ ---
545
+
546
+ ## Roadmap
547
+
548
+ [`docs/roadmap.md`](https://github.com/Scaffoldic/agentforge-py/blob/main/docs/roadmap.md)
549
+ tracks shipped + backlog.
550
+
551
+ ---
552
+
553
+ ## License
554
+
555
+ Apache 2.0. See
556
+ [`LICENSE`](https://github.com/Scaffoldic/agentforge-py/blob/main/LICENSE) and
557
+ [`NOTICE`](https://github.com/Scaffoldic/agentforge-py/blob/main/NOTICE).