agentops-accelerator 0.3.23__tar.gz → 0.4.1__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.
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.claude-plugin/marketplace.json +1 -1
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/plugin/marketplace.json +1 -1
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/CHANGELOG.md +53 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/PKG-INFO +5 -4
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-prompt-agent-quickstart.md +12 -5
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/package.json +1 -1
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/plugin.json +1 -1
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/pyproject.toml +5 -3
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/analyzer.py +4 -0
- agentops_accelerator-0.4.1/src/agentops/agent/checks/_rbac_authorization.py +118 -0
- agentops_accelerator-0.4.1/src/agentops/agent/checks/rbac_openai_data_plane.py +235 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/cli/app.py +1 -1
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/prompt_deploy.py +50 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/cicd.py +62 -5
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-pr-prompt-agent.yml +4 -3
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-pr-prompt-agent.yml +4 -3
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/PKG-INFO +5 -4
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/SOURCES.txt +3 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/requires.txt +4 -3
- agentops_accelerator-0.4.1/tests/unit/test_agent_checks_rbac_openai_data_plane.py +335 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cicd.py +77 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_prompt_deploy.py +205 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/uv.lock +128 -94
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.gitattributes +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/actions/azure-oidc-login/action.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/code-quality-py.instructions.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/copilot-instructions.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/dependabot.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/extensions/agentops-skills/extension.mjs +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/skills/release-management/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/_build.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/ci.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/cut-release.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/e2e.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/release.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/staging.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.gitignore +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.pre-commit-config.yaml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.vscode/launch.json +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.vscode/settings.json +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.vscode/tasks.json +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/AGENTS.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/CONTRIBUTING.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/LICENSE +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/README.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/SECURITY.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/bundles.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/ci-github-actions.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/concepts.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/doctor-checks.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/doctor-explained.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/e2e-live-architecture.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/e2e-live-setup.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/foundry-evaluation-sdk-built-in-evaluators.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/how-it-works.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/media/agentops-diagrams.vsdx +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/media/foundry-control-plane.png +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/release-process.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-end-to-end.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-hosted-agent-quickstart.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/examples/flat-quickstart/README.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/examples/flat-quickstart/agentops.yaml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/examples/flat-quickstart/dataset.jsonl +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/icon.png +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/agent-app/Dockerfile +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/agent-app/app.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/agent-app/requirements.txt +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/bootstrap.bicep +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/bootstrap.parameters.example.json +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/perrun.bicep +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/launch.json +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/media/foundry.svg +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/media/quickstart.gif +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/.vscodeignore +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/LICENSE +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/README.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-agent/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-config/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-dataset/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-eval/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-governance/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-report/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-workflow/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/create_support_agent.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/cut-release.ps1 +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/cut-release.sh +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_aggregate_summary.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_data/basic.jsonl +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_data/rag.jsonl +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_data/tools.jsonl +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_demo.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_hosted_agent.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_make_transcript.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_render_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/release.ps1 +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/release.sh +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/setup-e2e-new-tenant.ps1 +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/staging.ps1 +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/staging.sh +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/sync-skills.ps1 +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/sync-skills.sh +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/setup.cfg +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/__main__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/_legacy_ids.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/catalog.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/errors.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/foundry_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/governance.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/latency.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/observability.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/opex.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/opex_workspace.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/content_filter.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/diagnostics.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/local_auth.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/managed_identity.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/network.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/regression.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/release_readiness.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/safety.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/spec_conformance.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/cockpit.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/findings.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/history.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/knowledge/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/knowledge/waf-checklist.csv +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_base.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_bundle_rule.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_client.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_dataset_rules.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_engine.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_prompt_rules.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_spec_rules.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/production_telemetry.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/report.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/app.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/auth.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/chat.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/protocol.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/_credentials.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/azure_monitor.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/azure_resources.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/foundry_control.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/results_history.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/_base.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/agents_md.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/spec_kit.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/time_range.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/cli/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/agentops_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/azd_eval.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/config_loader.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/evaluators.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/governance.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/release_evidence.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/results.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/mcp/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/mcp/server.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/azd_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/cloud_results.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/cloud_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/comparison.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/diagnostics.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/invocations.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/official_eval.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/orchestrator.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/publisher.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/reporter.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/runtime.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/thresholds.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/assert_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/azd_eval_init.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/eval_analysis.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/evidence_pack.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/initializer.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/preflight.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/redteam_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/setup_wizard.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/skills.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/trace_promotion.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/workflow_analysis.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/.gitignore +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent-server/Dockerfile +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent-server/README.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent-server/main.bicep +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent.yaml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agentops.yaml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/foundry.svg +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/icon.png +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev-azd.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod-azd.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prompt-agent.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa-azd.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-pr.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/project.gitignore +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/sample-traces.jsonl +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-agent/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-config/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-dataset/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-eval/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-governance/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-report/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-workflow/SKILL.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/smoke.jsonl +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/waf-checklist.README.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/waf-checklist.csv +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-dev-azd.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-dev.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-prod-azd.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-prod.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-prompt-agent.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-qa-azd.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-qa.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-pr.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/__init__.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/azd_env.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/azure_endpoints.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/colors.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/dotenv_loader.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/foundry_discovery.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/logging.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/telemetry.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/yaml.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/dependency_links.txt +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/entry_points.txt +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/top_level.txt +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/TESTING.md +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/fixtures/fake_adapter.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/fixtures/fake_eval_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/integration/.gitkeep +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/integration/test_cli_flat_schema.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/integration/test_pipeline_smoke.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/.gitkeep +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_analyzer.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_categories.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_errors.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_foundry_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_observability.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_opex.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_opex_workspace.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_regression.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_safety.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_spec_conformance.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_cli.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_findings.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_history.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_opex_workspace_check.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_posture_rules.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_results_history.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_server.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agentops_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_assert_and_redteam_runners.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_env.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_eval.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_eval_init.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azure_endpoints.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azure_resources_discovery.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_cockpit_connection_summary.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_cockpit_port_conflict.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_commands.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_explain.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cloud_results.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cloud_runner.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cockpit.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_diagnostics.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_doctor_catalog.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_doctor_cli_explain.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_dotenv_loader.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_e2e_render.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_eval_analysis.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_eval_run_grader_errors.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_evaluators.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_foundry_discovery.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_governance.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_init_command.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_initializer.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_invocations.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_knowledge_loader.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_llm_assist.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_llm_assist_spec_rules.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_mcp_server.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_official_eval.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_pipeline_publisher.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_pipeline_reporter.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_preflight.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_production_telemetry.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_release_evidence.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_runtime_conversation.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_runtime_model_config.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_setup_wizard.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_shared_credentials.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_skills.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_skills_sync.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_telemetry.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_time_range.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_trace_promotion.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_workflow_analysis.py +0 -0
- {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tombstones/vscode/CDN_DEPRECATION_REQUEST.md +0 -0
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"name": "agentops-accelerator",
|
|
14
14
|
"source": "../../plugins/agentops",
|
|
15
15
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Toolkit and Microsoft Foundry agents.",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "0.4.1",
|
|
17
17
|
"keywords": [
|
|
18
18
|
"agentops",
|
|
19
19
|
"evaluation",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"name": "agentops-accelerator",
|
|
14
14
|
"source": "../../plugins/agentops",
|
|
15
15
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Toolkit and Microsoft Foundry agents.",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "0.4.1",
|
|
17
17
|
"keywords": [
|
|
18
18
|
"agentops",
|
|
19
19
|
"evaluation",
|
|
@@ -5,6 +5,59 @@ This format follows [Keep a Changelog](https://keepachangelog.com/) and adheres
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.4.1] - 2026-06-15
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **PR-stage Foundry prompt-agent versions are now tagged at the source.** When
|
|
12
|
+
`agentops.pipeline.prompt_deploy stage` runs in a PR context (GitHub Actions
|
|
13
|
+
`pull_request` event or Azure DevOps `BUILD_REASON=PullRequest`), the version
|
|
14
|
+
it creates in the dev Foundry project carries metadata
|
|
15
|
+
`agentops:candidate=true`, `agentops:pr=<number>`, and
|
|
16
|
+
`agentops:created_at=<ISO timestamp>`. Portal viewers can filter the
|
|
17
|
+
Versions tab on `agentops:candidate` to separate abandoned PR candidates
|
|
18
|
+
from deployed-of-record versions, and downstream consumers that resolve
|
|
19
|
+
"latest" can refuse to pick up candidates. Deployed-of-record versions
|
|
20
|
+
(push to `main`/`develop`/`release/**` or `workflow_dispatch`) are not
|
|
21
|
+
tagged, so absence of `agentops:candidate` is the deployed-of-record
|
|
22
|
+
signal. The PR/deploy workflow templates and the prompt-agent quickstart
|
|
23
|
+
tutorial are updated to describe the new contract.
|
|
24
|
+
([#214](https://github.com/Azure/agentops/issues/214))
|
|
25
|
+
|
|
26
|
+
## [0.4.0] - 2026-06-14
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- **`agentops doctor` now detects missing OpenAI data-plane RBAC on the Foundry
|
|
30
|
+
resource.** A new `security.missing_openai_data_plane_rbac` check resolves the
|
|
31
|
+
signed-in principal (via the `oid` claim of the access token used by
|
|
32
|
+
`DefaultAzureCredential`) and lists role assignments at the Foundry account
|
|
33
|
+
scope using `azure-mgmt-authorization`. When none of *Cognitive Services
|
|
34
|
+
OpenAI User*, *Cognitive Services OpenAI Contributor* or *Cognitive Services
|
|
35
|
+
Contributor* is present (directly or inherited), Doctor surfaces an
|
|
36
|
+
actionable WARNING that includes the exact `az role assignment create`
|
|
37
|
+
command for *Cognitive Services OpenAI User* scoped to the Foundry account.
|
|
38
|
+
The check is read-only and skips silently when the SDK, principal or scope
|
|
39
|
+
cannot be resolved. ([#228](https://github.com/Azure/agentops/issues/228))
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
- **`agentops-pr` workflow templates now auto-detect a committed baseline.**
|
|
43
|
+
Both the GitHub Actions (`.github/workflows/agentops-pr.yml`) and Azure
|
|
44
|
+
DevOps (`.azuredevops/pipelines/agentops-pr.yml`) PR templates emitted by
|
|
45
|
+
`agentops workflow generate` wrap `agentops eval run` with a small bash
|
|
46
|
+
guard. When `.agentops/baseline/results.json` exists in the consumer
|
|
47
|
+
repo, the step automatically passes `--baseline .agentops/baseline/results.json`;
|
|
48
|
+
without the file the behaviour is unchanged. Aligns shipped templates
|
|
49
|
+
with the `tutorial-baseline-comparison.md` "drop a file in your repo"
|
|
50
|
+
promise. Deploy templates (`dev`/`qa`/`prod`) are untouched.
|
|
51
|
+
([#155](https://github.com/Azure/agentops/issues/155))
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
- **`agentops skills install --platform` help text now lists `cursor`.** The
|
|
55
|
+
CLI option help was advertising only `copilot` and `claude` even though the
|
|
56
|
+
`cursor` platform is fully implemented (registers rules in
|
|
57
|
+
`.cursor/rules/agentops.mdc`). Updated to `Target platform(s): copilot,
|
|
58
|
+
claude, cursor.` so users discover the supported value from `--help`.
|
|
59
|
+
([#157](https://github.com/Azure/agentops/issues/157))
|
|
60
|
+
|
|
8
61
|
## [0.3.23] - 2026-06-12
|
|
9
62
|
|
|
10
63
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentops-accelerator
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Release readiness gates and evidence for Microsoft Foundry agents
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -37,18 +37,19 @@ Provides-Extra: foundry
|
|
|
37
37
|
Requires-Dist: azure-ai-evaluation<2.0,>=1.0; extra == "foundry"
|
|
38
38
|
Requires-Dist: azure-identity<2.0,>=1.17; extra == "foundry"
|
|
39
39
|
Requires-Dist: azure-monitor-opentelemetry<2.0,>=1.6; extra == "foundry"
|
|
40
|
-
Requires-Dist: pandas<
|
|
40
|
+
Requires-Dist: pandas<4.0,>=2.0; extra == "foundry"
|
|
41
41
|
Provides-Extra: agent
|
|
42
42
|
Requires-Dist: fastapi<1.0,>=0.110; extra == "agent"
|
|
43
43
|
Requires-Dist: uvicorn[standard]<1.0,>=0.30; extra == "agent"
|
|
44
44
|
Requires-Dist: httpx<1.0,>=0.27; extra == "agent"
|
|
45
45
|
Requires-Dist: cryptography>=42; extra == "agent"
|
|
46
46
|
Requires-Dist: markdown<4.0,>=3.6; extra == "agent"
|
|
47
|
-
Requires-Dist: azure-monitor-query<
|
|
47
|
+
Requires-Dist: azure-monitor-query<3.0,>=1.3; extra == "agent"
|
|
48
48
|
Requires-Dist: azure-monitor-opentelemetry<2.0,>=1.6; extra == "agent"
|
|
49
49
|
Requires-Dist: azure-identity<2.0,>=1.17; extra == "agent"
|
|
50
|
-
Requires-Dist: azure-mgmt-cognitiveservices<
|
|
50
|
+
Requires-Dist: azure-mgmt-cognitiveservices<15.0,>=13.5; extra == "agent"
|
|
51
51
|
Requires-Dist: azure-mgmt-monitor<7.0,>=6.0; extra == "agent"
|
|
52
|
+
Requires-Dist: azure-mgmt-authorization<5.0,>=4.0; extra == "agent"
|
|
52
53
|
Dynamic: license-file
|
|
53
54
|
|
|
54
55
|
<h1 align="center">AgentOps Accelerator</h1>
|
{agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-prompt-agent-quickstart.md
RENAMED
|
@@ -1370,11 +1370,18 @@ The PR workflow now has two jobs:
|
|
|
1370
1370
|
|
|
1371
1371
|
> **Why does the PR workflow stage in dev, not sandbox?** The PR gate
|
|
1372
1372
|
> must evaluate the same target the deploy workflow will use. Sandbox
|
|
1373
|
-
> is the author's playground and never receives CI traffic.
|
|
1374
|
-
>
|
|
1375
|
-
>
|
|
1376
|
-
>
|
|
1377
|
-
>
|
|
1373
|
+
> is the author's playground and never receives CI traffic.
|
|
1374
|
+
>
|
|
1375
|
+
> Candidate versions created by PR runs are tagged in Foundry with
|
|
1376
|
+
> `agentops:candidate=true` plus `agentops:pr=<number>` and
|
|
1377
|
+
> `agentops:created_at=<ISO timestamp>`. Portal viewers can filter the
|
|
1378
|
+
> Versions tab on `agentops:candidate` to separate "abandoned PR
|
|
1379
|
+
> candidates" from "deployed versions of record". Downstream consumers
|
|
1380
|
+
> that resolve `<agent>` to "latest" should skip versions carrying
|
|
1381
|
+
> `agentops:candidate=true`; the supported pinning mechanism remains
|
|
1382
|
+
> `foundry-agent.json`, which always points at the deployed-of-record
|
|
1383
|
+
> version. AgentOps uses prompt SHAs and git SHAs as the durable
|
|
1384
|
+
> identity, not old candidate version numbers.
|
|
1378
1385
|
|
|
1379
1386
|
The dev deploy workflow stages a candidate (same logic), evaluates it,
|
|
1380
1387
|
summarizes the deployment via `prompt_deploy summarize`, and uploads
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "agentops-accelerator",
|
|
3
3
|
"displayName": "AgentOps Accelerator — Skills for GitHub Copilot",
|
|
4
4
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Accelerator and Microsoft Foundry agents.",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.4.1",
|
|
6
6
|
"publisher": "AgentOpsAccelerator",
|
|
7
7
|
"icon": "icon.png",
|
|
8
8
|
"license": "MIT",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentops-accelerator",
|
|
3
3
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Accelerator and Microsoft Foundry agents.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "AgentOps Accelerator",
|
|
7
7
|
"url": "https://github.com/Azure/agentops"
|
|
@@ -22,7 +22,7 @@ foundry = [
|
|
|
22
22
|
"azure-ai-evaluation>=1.0,<2.0",
|
|
23
23
|
"azure-identity>=1.17,<2.0",
|
|
24
24
|
"azure-monitor-opentelemetry>=1.6,<2.0",
|
|
25
|
-
"pandas>=2.0,<
|
|
25
|
+
"pandas>=2.0,<4.0",
|
|
26
26
|
]
|
|
27
27
|
agent = [
|
|
28
28
|
"fastapi>=0.110,<1.0",
|
|
@@ -30,11 +30,12 @@ agent = [
|
|
|
30
30
|
"httpx>=0.27,<1.0",
|
|
31
31
|
"cryptography>=42",
|
|
32
32
|
"markdown>=3.6,<4.0",
|
|
33
|
-
"azure-monitor-query>=1.3,<
|
|
33
|
+
"azure-monitor-query>=1.3,<3.0",
|
|
34
34
|
"azure-monitor-opentelemetry>=1.6,<2.0",
|
|
35
35
|
"azure-identity>=1.17,<2.0",
|
|
36
|
-
"azure-mgmt-cognitiveservices>=13.5,<
|
|
36
|
+
"azure-mgmt-cognitiveservices>=13.5,<15.0",
|
|
37
37
|
"azure-mgmt-monitor>=6.0,<7.0",
|
|
38
|
+
"azure-mgmt-authorization>=4.0,<5.0",
|
|
38
39
|
]
|
|
39
40
|
|
|
40
41
|
[project.scripts]
|
|
@@ -67,6 +68,7 @@ where = ["src"]
|
|
|
67
68
|
[dependency-groups]
|
|
68
69
|
dev = [
|
|
69
70
|
"azure-ai-evaluation>=1.0,<2.0",
|
|
71
|
+
"azure-mgmt-authorization>=4.0,<5.0",
|
|
70
72
|
"mypy>=1.19.1",
|
|
71
73
|
"pre-commit>=4.0",
|
|
72
74
|
"pytest>=8.0",
|
|
@@ -16,6 +16,9 @@ from agentops.agent.checks.observability import run_observability_check
|
|
|
16
16
|
from agentops.agent.checks.opex_workspace import run_opex_workspace_check
|
|
17
17
|
from agentops.agent.checks.opex import run_opex_check
|
|
18
18
|
from agentops.agent.checks.posture import run_posture_check
|
|
19
|
+
from agentops.agent.checks.rbac_openai_data_plane import (
|
|
20
|
+
run_rbac_openai_data_plane_check,
|
|
21
|
+
)
|
|
19
22
|
from agentops.agent.checks.regression import run_regression_check
|
|
20
23
|
from agentops.agent.checks.release_readiness import run_release_readiness_check
|
|
21
24
|
from agentops.agent.checks.safety import run_safety_check
|
|
@@ -145,6 +148,7 @@ def analyze(
|
|
|
145
148
|
findings.extend(run_errors_check(monitor, foundry, config.checks.errors))
|
|
146
149
|
findings.extend(run_safety_check(history, config.checks.safety, monitor, foundry))
|
|
147
150
|
findings.extend(run_posture_check(resources, posture_config))
|
|
151
|
+
findings.extend(run_rbac_openai_data_plane_check(resources))
|
|
148
152
|
findings.extend(run_opex_workspace_check(workspace))
|
|
149
153
|
findings.extend(run_governance_check(workspace))
|
|
150
154
|
findings.extend(run_observability_check(workspace))
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Lazy Azure SDK glue for the ``rbac_openai_data_plane`` Doctor check.
|
|
2
|
+
|
|
3
|
+
Kept in a private module so the parent check can attempt the lazy
|
|
4
|
+
import in a single place and stay silent when ``azure-identity`` /
|
|
5
|
+
``azure-mgmt-authorization`` are not installed. All errors that should
|
|
6
|
+
make the check skip are normalised into :class:`AuthorizationCheckError`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from typing import List
|
|
13
|
+
|
|
14
|
+
log = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AuthorizationCheckError(RuntimeError):
|
|
18
|
+
"""Raised when the RBAC check cannot run for an environmental reason."""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def resolve_signed_in_principal_object_id() -> str:
|
|
22
|
+
"""Return the ``oid`` claim of the shared Azure credential's access token.
|
|
23
|
+
|
|
24
|
+
Raises :class:`AuthorizationCheckError` when the credential chain cannot
|
|
25
|
+
return a token, or when the token does not expose an ``oid`` claim.
|
|
26
|
+
"""
|
|
27
|
+
try:
|
|
28
|
+
from agentops.agent.sources._credentials import (
|
|
29
|
+
format_source_error,
|
|
30
|
+
get_shared_credential,
|
|
31
|
+
)
|
|
32
|
+
except ImportError as exc: # pragma: no cover - shipped together
|
|
33
|
+
raise AuthorizationCheckError(
|
|
34
|
+
f"shared credential factory unavailable: {exc}"
|
|
35
|
+
) from exc
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
credential = get_shared_credential(process_timeout=30)
|
|
39
|
+
token = credential.get_token("https://management.azure.com/.default")
|
|
40
|
+
except Exception as exc: # noqa: BLE001 - normalised to skip-error
|
|
41
|
+
raise AuthorizationCheckError(format_source_error(exc)) from exc
|
|
42
|
+
|
|
43
|
+
from agentops.agent.checks.rbac_openai_data_plane import decode_oid_from_jwt
|
|
44
|
+
|
|
45
|
+
oid = decode_oid_from_jwt(getattr(token, "token", "") or "")
|
|
46
|
+
if not oid:
|
|
47
|
+
raise AuthorizationCheckError(
|
|
48
|
+
"access token did not include an 'oid' claim; cannot identify "
|
|
49
|
+
"the signed-in principal"
|
|
50
|
+
)
|
|
51
|
+
return oid
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def list_principal_role_definition_ids(
|
|
55
|
+
*,
|
|
56
|
+
subscription_id: str,
|
|
57
|
+
scope: str,
|
|
58
|
+
principal_object_id: str,
|
|
59
|
+
) -> List[str]:
|
|
60
|
+
"""List role definition GUIDs assigned to the principal at/above scope.
|
|
61
|
+
|
|
62
|
+
Uses ``RoleAssignmentsOperations.list_for_scope`` with the
|
|
63
|
+
``atScopeAndAbove() and assignedTo('<oid>')`` filter so management-plane
|
|
64
|
+
inheritance (subscription, resource group, account) is honoured.
|
|
65
|
+
"""
|
|
66
|
+
try:
|
|
67
|
+
from azure.mgmt.authorization import AuthorizationManagementClient
|
|
68
|
+
except ImportError as exc:
|
|
69
|
+
raise AuthorizationCheckError(
|
|
70
|
+
"azure-mgmt-authorization not installed; install "
|
|
71
|
+
"`agentops-accelerator[agent]` (or add the package directly) to "
|
|
72
|
+
"enable the OpenAI data-plane RBAC check"
|
|
73
|
+
) from exc
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
from agentops.agent.sources._credentials import (
|
|
77
|
+
format_source_error,
|
|
78
|
+
get_shared_credential,
|
|
79
|
+
)
|
|
80
|
+
except ImportError as exc: # pragma: no cover - shipped together
|
|
81
|
+
raise AuthorizationCheckError(
|
|
82
|
+
f"shared credential factory unavailable: {exc}"
|
|
83
|
+
) from exc
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
credential = get_shared_credential(process_timeout=30)
|
|
87
|
+
client = AuthorizationManagementClient(
|
|
88
|
+
credential=credential,
|
|
89
|
+
subscription_id=subscription_id,
|
|
90
|
+
)
|
|
91
|
+
except Exception as exc: # noqa: BLE001
|
|
92
|
+
raise AuthorizationCheckError(format_source_error(exc)) from exc
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
assignments = list(
|
|
96
|
+
client.role_assignments.list_for_scope(
|
|
97
|
+
scope=scope,
|
|
98
|
+
filter=(
|
|
99
|
+
f"atScopeAndAbove() and assignedTo('{principal_object_id}')"
|
|
100
|
+
),
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
except Exception as exc: # noqa: BLE001
|
|
104
|
+
raise AuthorizationCheckError(format_source_error(exc)) from exc
|
|
105
|
+
|
|
106
|
+
role_definition_ids: List[str] = []
|
|
107
|
+
for assignment in assignments:
|
|
108
|
+
rd_id = (
|
|
109
|
+
getattr(assignment, "role_definition_id", None)
|
|
110
|
+
or getattr(getattr(assignment, "properties", None), "role_definition_id", None)
|
|
111
|
+
)
|
|
112
|
+
if not rd_id:
|
|
113
|
+
continue
|
|
114
|
+
# role_definition_id is a full ARM id ending in `/<guid>`.
|
|
115
|
+
guid = rd_id.rstrip("/").rsplit("/", 1)[-1]
|
|
116
|
+
if guid:
|
|
117
|
+
role_definition_ids.append(guid)
|
|
118
|
+
return role_definition_ids
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"""Check: signed-in principal has Cognitive Services OpenAI User RBAC.
|
|
2
|
+
|
|
3
|
+
Cloud eval graders and any other data-plane Azure OpenAI call run by
|
|
4
|
+
``agentops eval run`` need the **Cognitive Services OpenAI User** role
|
|
5
|
+
(or another role granting the
|
|
6
|
+
``Microsoft.CognitiveServices/accounts/OpenAI/*/action`` data action) on
|
|
7
|
+
the AI Services account that backs the Foundry project. Without it the
|
|
8
|
+
runtime raises ``PermissionDenied`` / ``AuthenticationError`` mid-run
|
|
9
|
+
even after Azure CLI authentication looks fine.
|
|
10
|
+
|
|
11
|
+
Today the tutorial and the ``agentops-eval`` skill document this, and
|
|
12
|
+
the CLI surfaces a clearer warning since v0.3.6, but Doctor was silent
|
|
13
|
+
on the missing assignment. This check fills the gap by inspecting the
|
|
14
|
+
existing :class:`AzureResourcesPayload` (resource group, account name,
|
|
15
|
+
account resource id) and querying ``azure-mgmt-authorization`` for role
|
|
16
|
+
assignments at and above the account scope.
|
|
17
|
+
|
|
18
|
+
The check is **read-only**: it never grants or modifies RBAC. It stays
|
|
19
|
+
silent when:
|
|
20
|
+
|
|
21
|
+
- the Azure resources source is disabled or returned a non-``ok`` status;
|
|
22
|
+
- ``azure-mgmt-authorization`` is not installed;
|
|
23
|
+
- the signed-in principal cannot be identified (no ``oid`` claim);
|
|
24
|
+
- the role assignments listing fails (permissions / network / etc.).
|
|
25
|
+
|
|
26
|
+
Issue: https://github.com/Azure/agentops/issues/228
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import base64
|
|
32
|
+
import binascii
|
|
33
|
+
import json
|
|
34
|
+
import logging
|
|
35
|
+
from typing import Any, List, Optional, Sequence
|
|
36
|
+
|
|
37
|
+
from agentops.agent.findings import Category, Finding, Severity
|
|
38
|
+
from agentops.agent.sources.azure_resources import AzureResourcesPayload
|
|
39
|
+
|
|
40
|
+
log = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
SOURCE_NAME = "azure_resources"
|
|
43
|
+
|
|
44
|
+
# https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/ai-machine-learning#cognitive-services-openai-user
|
|
45
|
+
COGNITIVE_SERVICES_OPENAI_USER_ROLE_ID: str = (
|
|
46
|
+
"5e0bd9bd-7b93-4f28-af87-19fc36ad61bd"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Roles that *also* grant the OpenAI data action and therefore satisfy the
|
|
50
|
+
# same need as Cognitive Services OpenAI User. Listed by definition GUID
|
|
51
|
+
# so renames in display name do not break detection.
|
|
52
|
+
_OPENAI_DATA_PLANE_ROLE_IDS: frozenset[str] = frozenset(
|
|
53
|
+
{
|
|
54
|
+
# Cognitive Services OpenAI User
|
|
55
|
+
"5e0bd9bd-7b93-4f28-af87-19fc36ad61bd",
|
|
56
|
+
# Cognitive Services OpenAI Contributor
|
|
57
|
+
"a001fd3d-188f-4b5d-821b-7da978bf7442",
|
|
58
|
+
# Cognitive Services Contributor (broader admin role; superset of data
|
|
59
|
+
# action via control plane).
|
|
60
|
+
"25fbc0a9-bd7c-42a3-aa1a-3b75d497ee68",
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
_FINDING_ID = "security.missing_openai_data_plane_rbac"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def run_rbac_openai_data_plane_check(
|
|
68
|
+
resources: Optional[AzureResourcesPayload],
|
|
69
|
+
) -> List[Finding]:
|
|
70
|
+
"""Return findings if the signed-in principal lacks OpenAI data-plane RBAC."""
|
|
71
|
+
if resources is None:
|
|
72
|
+
return []
|
|
73
|
+
diag = resources.diagnostics or {}
|
|
74
|
+
if diag.get("status") != "ok":
|
|
75
|
+
return []
|
|
76
|
+
target = diag.get("target")
|
|
77
|
+
account_name = diag.get("account") or (
|
|
78
|
+
resources.account.name if resources.account else None
|
|
79
|
+
)
|
|
80
|
+
resource_group = diag.get("resource_group")
|
|
81
|
+
subscription_id = _subscription_id_from_target(target)
|
|
82
|
+
if not target or not account_name or not subscription_id:
|
|
83
|
+
return []
|
|
84
|
+
|
|
85
|
+
try: # lazy import — keeps `agentops` CLI light
|
|
86
|
+
from ._rbac_authorization import (
|
|
87
|
+
AuthorizationCheckError,
|
|
88
|
+
list_principal_role_definition_ids,
|
|
89
|
+
resolve_signed_in_principal_object_id,
|
|
90
|
+
)
|
|
91
|
+
except ImportError as exc: # pragma: no cover - test env always installs it
|
|
92
|
+
log.debug("rbac_openai_data_plane: helper unavailable: %s", exc)
|
|
93
|
+
return []
|
|
94
|
+
|
|
95
|
+
try:
|
|
96
|
+
principal_object_id = resolve_signed_in_principal_object_id()
|
|
97
|
+
except AuthorizationCheckError as exc:
|
|
98
|
+
log.info(
|
|
99
|
+
"rbac_openai_data_plane: skipped (cannot resolve principal): %s", exc
|
|
100
|
+
)
|
|
101
|
+
return []
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
role_definition_ids = list_principal_role_definition_ids(
|
|
105
|
+
subscription_id=subscription_id,
|
|
106
|
+
scope=target,
|
|
107
|
+
principal_object_id=principal_object_id,
|
|
108
|
+
)
|
|
109
|
+
except AuthorizationCheckError as exc:
|
|
110
|
+
log.info(
|
|
111
|
+
"rbac_openai_data_plane: skipped (role assignments listing failed): %s",
|
|
112
|
+
exc,
|
|
113
|
+
)
|
|
114
|
+
return []
|
|
115
|
+
|
|
116
|
+
granted_role_ids = {rid.lower() for rid in role_definition_ids}
|
|
117
|
+
if granted_role_ids & {rid.lower() for rid in _OPENAI_DATA_PLANE_ROLE_IDS}:
|
|
118
|
+
return []
|
|
119
|
+
|
|
120
|
+
return [
|
|
121
|
+
_missing_rbac_finding(
|
|
122
|
+
account_name=account_name,
|
|
123
|
+
resource_group=resource_group,
|
|
124
|
+
subscription_id=subscription_id,
|
|
125
|
+
scope=target,
|
|
126
|
+
principal_object_id=principal_object_id,
|
|
127
|
+
granted_role_ids=sorted(granted_role_ids),
|
|
128
|
+
)
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _subscription_id_from_target(target: Optional[str]) -> Optional[str]:
|
|
133
|
+
"""Extract the subscription GUID from an ARM resource id."""
|
|
134
|
+
if not target:
|
|
135
|
+
return None
|
|
136
|
+
parts = target.strip("/").split("/")
|
|
137
|
+
try:
|
|
138
|
+
idx = parts.index("subscriptions")
|
|
139
|
+
except ValueError:
|
|
140
|
+
return None
|
|
141
|
+
if idx + 1 >= len(parts):
|
|
142
|
+
return None
|
|
143
|
+
return parts[idx + 1]
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _missing_rbac_finding(
|
|
147
|
+
*,
|
|
148
|
+
account_name: str,
|
|
149
|
+
resource_group: Optional[str],
|
|
150
|
+
subscription_id: str,
|
|
151
|
+
scope: str,
|
|
152
|
+
principal_object_id: str,
|
|
153
|
+
granted_role_ids: Sequence[str],
|
|
154
|
+
) -> Finding:
|
|
155
|
+
rg_clause = (
|
|
156
|
+
f" (resource group `{resource_group}`)" if resource_group else ""
|
|
157
|
+
)
|
|
158
|
+
az_command = (
|
|
159
|
+
"az role assignment create "
|
|
160
|
+
f"--assignee {principal_object_id} "
|
|
161
|
+
'--role "Cognitive Services OpenAI User" '
|
|
162
|
+
f"--scope {scope}"
|
|
163
|
+
)
|
|
164
|
+
return Finding(
|
|
165
|
+
id=_FINDING_ID,
|
|
166
|
+
severity=Severity.WARNING,
|
|
167
|
+
category=Category.SECURITY,
|
|
168
|
+
title=(
|
|
169
|
+
"Signed-in principal is missing Cognitive Services OpenAI User on "
|
|
170
|
+
f"`{account_name}`"
|
|
171
|
+
),
|
|
172
|
+
summary=(
|
|
173
|
+
"The Doctor signed-in principal does not hold the **Cognitive "
|
|
174
|
+
"Services OpenAI User** role (or any role with the OpenAI "
|
|
175
|
+
"data-plane action) at or above the AI Services account "
|
|
176
|
+
f"`{account_name}`{rg_clause}. Cloud eval graders and other "
|
|
177
|
+
"data-plane Azure OpenAI calls will fail with `PermissionDenied` "
|
|
178
|
+
"/ `AuthenticationError` until this assignment exists and Entra "
|
|
179
|
+
"ID propagates it (typically a few minutes)."
|
|
180
|
+
),
|
|
181
|
+
recommendation=(
|
|
182
|
+
"Grant the role at the AI Services account scope (preferred) or "
|
|
183
|
+
"the resource group scope, then wait for propagation before "
|
|
184
|
+
f"re-running `agentops eval run`. Suggested command:\n\n"
|
|
185
|
+
f"```bash\n{az_command}\n```\n\n"
|
|
186
|
+
"If your team scopes this role at the subscription or resource "
|
|
187
|
+
"group level instead, grant it there. Doctor will detect any "
|
|
188
|
+
"role at or above the account scope. If you intentionally use a "
|
|
189
|
+
"different role granting "
|
|
190
|
+
"`Microsoft.CognitiveServices/accounts/OpenAI/*/action`, add its "
|
|
191
|
+
"definition GUID to "
|
|
192
|
+
"`agentops/agent/checks/rbac_openai_data_plane.py:"
|
|
193
|
+
"_OPENAI_DATA_PLANE_ROLE_IDS`."
|
|
194
|
+
),
|
|
195
|
+
source=SOURCE_NAME,
|
|
196
|
+
evidence={
|
|
197
|
+
"account": account_name,
|
|
198
|
+
"resource_group": resource_group,
|
|
199
|
+
"subscription_id": subscription_id,
|
|
200
|
+
"scope": scope,
|
|
201
|
+
"principal_object_id": principal_object_id,
|
|
202
|
+
"granted_role_definition_ids": list(granted_role_ids),
|
|
203
|
+
"required_role": "Cognitive Services OpenAI User",
|
|
204
|
+
"required_role_id": COGNITIVE_SERVICES_OPENAI_USER_ROLE_ID,
|
|
205
|
+
"remediation_command": az_command,
|
|
206
|
+
},
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
# Re-exported only so callers and tests can decode an Entra ID access token's
|
|
211
|
+
# ``oid`` claim without depending on a dedicated JWT library. Kept here (not
|
|
212
|
+
# in the helper module) because the helper module lazy-imports azure SDKs.
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def decode_oid_from_jwt(token: str) -> Optional[str]:
|
|
216
|
+
"""Return the ``oid`` (object id) claim of an Entra access token.
|
|
217
|
+
|
|
218
|
+
Returns ``None`` when the token is malformed, when the payload cannot
|
|
219
|
+
be base64-decoded, or when the JSON has no ``oid`` field. The token's
|
|
220
|
+
signature is **not** verified — Doctor consumes it strictly as a
|
|
221
|
+
self-attested identifier already produced by the calling Azure SDK.
|
|
222
|
+
"""
|
|
223
|
+
if not token or token.count(".") < 2:
|
|
224
|
+
return None
|
|
225
|
+
payload = token.split(".")[1]
|
|
226
|
+
padding = "=" * (-len(payload) % 4)
|
|
227
|
+
try:
|
|
228
|
+
raw = base64.urlsafe_b64decode(payload + padding)
|
|
229
|
+
claims: Any = json.loads(raw.decode("utf-8"))
|
|
230
|
+
except (binascii.Error, UnicodeDecodeError, ValueError):
|
|
231
|
+
return None
|
|
232
|
+
if not isinstance(claims, dict):
|
|
233
|
+
return None
|
|
234
|
+
oid = claims.get("oid")
|
|
235
|
+
return oid if isinstance(oid, str) and oid else None
|
{agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/prompt_deploy.py
RENAMED
|
@@ -424,9 +424,59 @@ def _deployment_metadata(*, environment: str, prompt_hash: str) -> Dict[str, str
|
|
|
424
424
|
workflow_url = _workflow_url()
|
|
425
425
|
if workflow_url:
|
|
426
426
|
metadata["agentops.workflow_url"] = workflow_url[:512]
|
|
427
|
+
|
|
428
|
+
# When the staging step is invoked from a PR-stage workflow, mark the
|
|
429
|
+
# version as a candidate so portal viewers can filter it out and naive
|
|
430
|
+
# consumers that resolve "latest" can refuse to pick it up. See issue
|
|
431
|
+
# #214 for the full rationale.
|
|
432
|
+
pr_number = _detect_pr_stage()
|
|
433
|
+
if pr_number is not None:
|
|
434
|
+
metadata["agentops:candidate"] = "true"
|
|
435
|
+
if pr_number:
|
|
436
|
+
metadata["agentops:pr"] = pr_number[:512]
|
|
437
|
+
metadata["agentops:created_at"] = datetime.now(timezone.utc).isoformat()
|
|
438
|
+
|
|
427
439
|
return {key: value for key, value in metadata.items() if value}
|
|
428
440
|
|
|
429
441
|
|
|
442
|
+
def _detect_pr_stage() -> Optional[str]:
|
|
443
|
+
"""Return the PR number string when running in a PR-stage context.
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
- A PR number (e.g. ``"42"``) when both the PR context and number are
|
|
447
|
+
identifiable.
|
|
448
|
+
- An empty string when the PR context is detected but the number cannot
|
|
449
|
+
be parsed (the version is still flagged as a candidate).
|
|
450
|
+
- ``None`` when no PR context is detected (deployed-of-record path).
|
|
451
|
+
|
|
452
|
+
Detection covers the two CI platforms AgentOps generates workflows for:
|
|
453
|
+
GitHub Actions (``GITHUB_EVENT_NAME == 'pull_request'``) and Azure
|
|
454
|
+
DevOps (``BUILD_REASON == 'PullRequest'``).
|
|
455
|
+
"""
|
|
456
|
+
|
|
457
|
+
if os.environ.get("GITHUB_EVENT_NAME") == "pull_request":
|
|
458
|
+
ref = os.environ.get("GITHUB_REF", "")
|
|
459
|
+
# ``refs/pull/<N>/merge`` or ``refs/pull/<N>/head``.
|
|
460
|
+
if ref.startswith("refs/pull/"):
|
|
461
|
+
parts = ref.split("/")
|
|
462
|
+
if len(parts) >= 3 and parts[2].isdigit():
|
|
463
|
+
return parts[2]
|
|
464
|
+
ref_name = os.environ.get("GITHUB_REF_NAME", "")
|
|
465
|
+
# GITHUB_REF_NAME for PRs is shaped like ``<N>/merge``.
|
|
466
|
+
head = ref_name.split("/", 1)[0] if ref_name else ""
|
|
467
|
+
if head.isdigit():
|
|
468
|
+
return head
|
|
469
|
+
return ""
|
|
470
|
+
|
|
471
|
+
if os.environ.get("BUILD_REASON") == "PullRequest":
|
|
472
|
+
return (
|
|
473
|
+
os.environ.get("SYSTEM_PULLREQUEST_PULLREQUESTNUMBER")
|
|
474
|
+
or ""
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
return None
|
|
478
|
+
|
|
479
|
+
|
|
430
480
|
def _git_sha() -> str:
|
|
431
481
|
return (
|
|
432
482
|
os.environ.get("GITHUB_SHA")
|