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