agentforge-py 0.3.1__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.
- agentforge_py-0.4.0/PKG-INFO +557 -0
- agentforge_py-0.4.0/README.md +431 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/pyproject.toml +66 -66
- agentforge_py-0.4.0/src/agentforge/_deprecation.py +89 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/_build.py +27 -0
- agentforge_py-0.4.0/src/agentforge/cli/_notes.py +223 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/_scaffold_state.py +50 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/_shared_scaffold.py +70 -24
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/new_cmd.py +6 -4
- agentforge_py-0.4.0/src/agentforge/cli/release_notes.json +1138 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/upgrade_cmd.py +176 -36
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/retrieval.py +87 -40
- agentforge_py-0.4.0/tests/unit/test_deprecation.py +64 -0
- agentforge_py-0.4.0/tests/unit/test_notes.py +182 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_retriever_graphrag.py +155 -0
- agentforge_py-0.4.0/tests/unit/test_shared_scaffold.py +171 -0
- agentforge_py-0.4.0/tests/unit/test_three_section_format.py +136 -0
- agentforge_py-0.4.0/tests/unit/test_upgrade_cmd.py +93 -0
- agentforge_py-0.4.0/tests/unit/test_upgrade_notes.py +118 -0
- agentforge_py-0.3.1/PKG-INFO +0 -158
- agentforge_py-0.3.1/README.md +0 -32
- agentforge_py-0.3.1/tests/unit/test_shared_scaffold.py +0 -92
- agentforge_py-0.3.1/tests/unit/test_three_section_format.py +0 -66
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/LICENSE +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_testing/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_testing/fake_llm.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_testing/fake_tool.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_tools/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_tools/calculator.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_tools/decorator.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_tools/file_read.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_tools/shell.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/_tools/web_search.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/agent.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/auth.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/config_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/db_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/debug_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/docs_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/eval_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/health_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/list_modules.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/manifest_apply.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/module_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/cli/run_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/config/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/eval/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/eval/consistency.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/eval/coverage.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/eval/format_compliance.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/eval/regression.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/findings.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/guardrails/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/guardrails/allowlist.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/guardrails/capability_check.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/guardrails/engine.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/guardrails/pii_redact_basic.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/guardrails/prompt_injection_basic.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/memory/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/memory/in_memory.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/memory/in_memory_graph.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/memory/in_memory_vector.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/pipeline/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/pipeline/engine.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/pipeline/errors.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/pipeline/tool.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/py.typed +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/recording.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/_defaults.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/markdown.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/patch_applier.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/registry.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/scorecard.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/renderers/span_table.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/replay.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/resolver_register.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/runtime.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/_base.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/_plan.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/multi_agent.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/plan_execute.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/react.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/strategies/tot.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/.cursorrules +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/.github/copilot-instructions.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/.gitkeep +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/AGENTS.md.tmpl +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/CLAUDE.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/01-set-up-new-agent.md.tmpl +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/02-add-a-tool.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/03-add-a-pipeline-task.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/04-pick-reasoning-strategy.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/05-write-prompts.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/06-test-your-agent.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/07-debug-a-run.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/08-add-memory.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/09-add-mcp.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/10-add-evaluators.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/11-add-safety-guardrails.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/12-add-observability.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/13-configure-multi-provider.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/14-deploy-your-agent.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/15-upgrade-your-agent.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/16-configuration-reference.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/17-add-reranker.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/18-add-hybrid-search.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/19-add-graphrag.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/20-apply-schema-migrations.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/21-use-streaming-guardrails.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/_shared/docs/runbooks/README.md.tmpl +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/.env.example +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/README.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/agentforge.yaml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/copier.yml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/pyproject.toml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/code-reviewer/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/.env.example +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/README.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/agentforge.yaml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/copier.yml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/pyproject.toml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/docs-qa/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/.env.example +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/README.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/agentforge.yaml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/copier.yml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/pyproject.toml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/minimal/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/.env.example +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/README.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/agentforge.yaml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/copier.yml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/pyproject.toml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/patch-bot/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/.env.example +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/README.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/agentforge.yaml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/copier.yml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/pyproject.toml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/research/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/.env.example +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/.gitignore +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/README.md +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/agentforge.yaml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/copier.yml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/pyproject.toml +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/src/{{project_slug.replace('-', '_')}}/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/templates/triage/src/{{project_slug.replace('-', '_')}}/main.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/testing/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/testing/conformance.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/testing/factory.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/testing/fixtures.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/testing/llm.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/testing/recording.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/src/agentforge/tools/__init__.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/conftest.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/integration/test_add_module_uv_live.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/integration/test_configured_runtime_e2e.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/integration/test_web_search_live.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/.gitkeep +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent_evaluators.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent_fallback_chain.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent_graph_store.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent_hooks.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent_pipeline.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_agent_retriever.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_build_retriever.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_build.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_build_pipeline.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_config.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_db.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_debug.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_docs.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_eval.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_health.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_list_modules.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_run.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_cli_version.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_config.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_env_bearer_auth.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_eval_consistency.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_eval_coverage.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_eval_format_compliance.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_eval_regression.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_example_swap_smoke.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_extras_chain.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_fake_tool.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_findings.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_graph_store_properties.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_guardrails_builtins.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_guardrails_conformance.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_guardrails_engine.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_in_memory_graph_store.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_in_memory_store.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_in_memory_vector_store.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_manifest_apply.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_module_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_multi_agent_stream.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_new_cmd.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_pipeline_engine.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_plan.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_plan_execute_stream.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_react_stream.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_recording.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_renderer_pipeline_findings.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_renderer_registry.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_renderers_builtin.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_replay.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_retrieval.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_retrieval_rerank.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_retriever_hybrid.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_runtime.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_scaffold_state.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_base.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_budget_properties.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_dispatch_tool.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_multi_agent.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_plan_execute.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_react.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_strategies_tot.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_testing_factory.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_testing_fake_llm.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_testing_mock_llm.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_testing_recording.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_tool_decorator.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_tools_calculator.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_tools_file_read.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_tools_shell.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_tools_web_search.py +0 -0
- {agentforge_py-0.3.1 → agentforge_py-0.4.0}/tests/unit/test_tot_stream.py +0 -0
- {agentforge_py-0.3.1 → 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
|
+
[](https://pypi.org/project/agentforge-py/)
|
|
144
|
+
[](https://github.com/Scaffoldic/agentforge-py)
|
|
145
|
+
[](https://github.com/Scaffoldic/agentforge-py/blob/main/LICENSE)
|
|
146
|
+
|
|
147
|
+

|
|
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).
|