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.
Files changed (320) hide show
  1. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.claude-plugin/marketplace.json +1 -1
  2. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/plugin/marketplace.json +1 -1
  3. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/CHANGELOG.md +53 -0
  4. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/PKG-INFO +5 -4
  5. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-prompt-agent-quickstart.md +12 -5
  6. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/package.json +1 -1
  7. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/plugin.json +1 -1
  8. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/pyproject.toml +5 -3
  9. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/analyzer.py +4 -0
  10. agentops_accelerator-0.4.1/src/agentops/agent/checks/_rbac_authorization.py +118 -0
  11. agentops_accelerator-0.4.1/src/agentops/agent/checks/rbac_openai_data_plane.py +235 -0
  12. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/cli/app.py +1 -1
  13. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/prompt_deploy.py +50 -0
  14. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/cicd.py +62 -5
  15. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-pr-prompt-agent.yml +4 -3
  16. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-pr-prompt-agent.yml +4 -3
  17. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/PKG-INFO +5 -4
  18. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/SOURCES.txt +3 -0
  19. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/requires.txt +4 -3
  20. agentops_accelerator-0.4.1/tests/unit/test_agent_checks_rbac_openai_data_plane.py +335 -0
  21. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cicd.py +77 -0
  22. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_prompt_deploy.py +205 -0
  23. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/uv.lock +128 -94
  24. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.gitattributes +0 -0
  25. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/actions/azure-oidc-login/action.yml +0 -0
  26. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/code-quality-py.instructions.md +0 -0
  27. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/copilot-instructions.md +0 -0
  28. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/dependabot.yml +0 -0
  29. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/extensions/agentops-skills/extension.mjs +0 -0
  30. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/skills/release-management/SKILL.md +0 -0
  31. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/_build.yml +0 -0
  32. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/agentops-watchdog.yml +0 -0
  33. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/ci.yml +0 -0
  34. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/cut-release.yml +0 -0
  35. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/e2e.yml +0 -0
  36. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/release.yml +0 -0
  37. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.github/workflows/staging.yml +0 -0
  38. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.gitignore +0 -0
  39. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.pre-commit-config.yaml +0 -0
  40. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.vscode/launch.json +0 -0
  41. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.vscode/settings.json +0 -0
  42. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/.vscode/tasks.json +0 -0
  43. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/AGENTS.md +0 -0
  44. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/CONTRIBUTING.md +0 -0
  45. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/LICENSE +0 -0
  46. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/README.md +0 -0
  47. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/SECURITY.md +0 -0
  48. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/bundles.md +0 -0
  49. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/ci-github-actions.md +0 -0
  50. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/concepts.md +0 -0
  51. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/doctor-checks.md +0 -0
  52. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/doctor-explained.md +0 -0
  53. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/e2e-live-architecture.md +0 -0
  54. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/e2e-live-setup.md +0 -0
  55. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/foundry-evaluation-sdk-built-in-evaluators.md +0 -0
  56. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/how-it-works.md +0 -0
  57. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/media/agentops-diagrams.vsdx +0 -0
  58. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/media/foundry-control-plane.png +0 -0
  59. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/release-process.md +0 -0
  60. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-end-to-end.md +0 -0
  61. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/docs/tutorial-hosted-agent-quickstart.md +0 -0
  62. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/examples/flat-quickstart/README.md +0 -0
  63. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/examples/flat-quickstart/agentops.yaml +0 -0
  64. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/examples/flat-quickstart/dataset.jsonl +0 -0
  65. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/icon.png +0 -0
  66. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/agent-app/Dockerfile +0 -0
  67. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/agent-app/app.py +0 -0
  68. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/agent-app/requirements.txt +0 -0
  69. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/bootstrap.bicep +0 -0
  70. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/bootstrap.parameters.example.json +0 -0
  71. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/infra/e2e/perrun.bicep +0 -0
  72. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/launch.json +0 -0
  73. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/media/foundry.svg +0 -0
  74. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/media/quickstart.gif +0 -0
  75. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/.vscodeignore +0 -0
  76. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/LICENSE +0 -0
  77. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/README.md +0 -0
  78. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-agent/SKILL.md +0 -0
  79. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-config/SKILL.md +0 -0
  80. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-dataset/SKILL.md +0 -0
  81. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-eval/SKILL.md +0 -0
  82. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-governance/SKILL.md +0 -0
  83. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-report/SKILL.md +0 -0
  84. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/plugins/agentops/skills/agentops-workflow/SKILL.md +0 -0
  85. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/create_support_agent.py +0 -0
  86. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/cut-release.ps1 +0 -0
  87. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/cut-release.sh +0 -0
  88. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_aggregate_summary.py +0 -0
  89. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_data/basic.jsonl +0 -0
  90. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_data/rag.jsonl +0 -0
  91. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_data/tools.jsonl +0 -0
  92. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_demo.py +0 -0
  93. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_hosted_agent.py +0 -0
  94. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_make_transcript.py +0 -0
  95. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/e2e_render_config.py +0 -0
  96. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/release.ps1 +0 -0
  97. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/release.sh +0 -0
  98. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/setup-e2e-new-tenant.ps1 +0 -0
  99. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/staging.ps1 +0 -0
  100. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/staging.sh +0 -0
  101. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/sync-skills.ps1 +0 -0
  102. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/scripts/sync-skills.sh +0 -0
  103. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/setup.cfg +0 -0
  104. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/__init__.py +0 -0
  105. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/__main__.py +0 -0
  106. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/__init__.py +0 -0
  107. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/_legacy_ids.py +0 -0
  108. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/__init__.py +0 -0
  109. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/catalog.py +0 -0
  110. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/errors.py +0 -0
  111. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/foundry_config.py +0 -0
  112. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/governance.py +0 -0
  113. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/latency.py +0 -0
  114. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/observability.py +0 -0
  115. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/opex.py +0 -0
  116. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/opex_workspace.py +0 -0
  117. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture.py +0 -0
  118. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/__init__.py +0 -0
  119. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/content_filter.py +0 -0
  120. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/diagnostics.py +0 -0
  121. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/local_auth.py +0 -0
  122. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/managed_identity.py +0 -0
  123. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/posture_rules/network.py +0 -0
  124. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/regression.py +0 -0
  125. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/release_readiness.py +0 -0
  126. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/safety.py +0 -0
  127. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/checks/spec_conformance.py +0 -0
  128. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/cockpit.py +0 -0
  129. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/config.py +0 -0
  130. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/findings.py +0 -0
  131. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/history.py +0 -0
  132. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/knowledge/__init__.py +0 -0
  133. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/knowledge/waf-checklist.csv +0 -0
  134. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/__init__.py +0 -0
  135. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_base.py +0 -0
  136. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_bundle_rule.py +0 -0
  137. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_client.py +0 -0
  138. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_dataset_rules.py +0 -0
  139. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_engine.py +0 -0
  140. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_prompt_rules.py +0 -0
  141. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/llm_assist/_spec_rules.py +0 -0
  142. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/production_telemetry.py +0 -0
  143. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/report.py +0 -0
  144. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/__init__.py +0 -0
  145. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/app.py +0 -0
  146. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/auth.py +0 -0
  147. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/chat.py +0 -0
  148. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/server/protocol.py +0 -0
  149. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/__init__.py +0 -0
  150. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/_credentials.py +0 -0
  151. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/azure_monitor.py +0 -0
  152. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/azure_resources.py +0 -0
  153. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/foundry_control.py +0 -0
  154. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/results_history.py +0 -0
  155. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/__init__.py +0 -0
  156. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/_base.py +0 -0
  157. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/agents_md.py +0 -0
  158. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/sources/spec_detectors/spec_kit.py +0 -0
  159. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/agent/time_range.py +0 -0
  160. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/cli/__init__.py +0 -0
  161. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/__init__.py +0 -0
  162. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/agentops_config.py +0 -0
  163. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/azd_eval.py +0 -0
  164. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/config_loader.py +0 -0
  165. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/evaluators.py +0 -0
  166. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/governance.py +0 -0
  167. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/release_evidence.py +0 -0
  168. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/core/results.py +0 -0
  169. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/mcp/__init__.py +0 -0
  170. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/mcp/server.py +0 -0
  171. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/__init__.py +0 -0
  172. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/azd_runner.py +0 -0
  173. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/cloud_results.py +0 -0
  174. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/cloud_runner.py +0 -0
  175. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/comparison.py +0 -0
  176. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/diagnostics.py +0 -0
  177. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/invocations.py +0 -0
  178. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/official_eval.py +0 -0
  179. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/orchestrator.py +0 -0
  180. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/publisher.py +0 -0
  181. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/reporter.py +0 -0
  182. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/runtime.py +0 -0
  183. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/pipeline/thresholds.py +0 -0
  184. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/__init__.py +0 -0
  185. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/assert_runner.py +0 -0
  186. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/azd_eval_init.py +0 -0
  187. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/eval_analysis.py +0 -0
  188. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/evidence_pack.py +0 -0
  189. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/initializer.py +0 -0
  190. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/preflight.py +0 -0
  191. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/redteam_runner.py +0 -0
  192. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/setup_wizard.py +0 -0
  193. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/skills.py +0 -0
  194. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/trace_promotion.py +0 -0
  195. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/services/workflow_analysis.py +0 -0
  196. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/.gitignore +0 -0
  197. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/__init__.py +0 -0
  198. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent-server/Dockerfile +0 -0
  199. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent-server/README.md +0 -0
  200. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent-server/main.bicep +0 -0
  201. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agent.yaml +0 -0
  202. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/agentops.yaml +0 -0
  203. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/foundry.svg +0 -0
  204. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/icon.png +0 -0
  205. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev-azd.yml +0 -0
  206. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev.yml +0 -0
  207. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod-azd.yml +0 -0
  208. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod.yml +0 -0
  209. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prompt-agent.yml +0 -0
  210. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa-azd.yml +0 -0
  211. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa.yml +0 -0
  212. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-pr.yml +0 -0
  213. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/pipelines/azuredevops/agentops-watchdog.yml +0 -0
  214. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/project.gitignore +0 -0
  215. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/sample-traces.jsonl +0 -0
  216. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-agent/SKILL.md +0 -0
  217. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-config/SKILL.md +0 -0
  218. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-dataset/SKILL.md +0 -0
  219. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-eval/SKILL.md +0 -0
  220. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-governance/SKILL.md +0 -0
  221. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-report/SKILL.md +0 -0
  222. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/skills/agentops-workflow/SKILL.md +0 -0
  223. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/smoke.jsonl +0 -0
  224. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/waf-checklist.README.md +0 -0
  225. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/waf-checklist.csv +0 -0
  226. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-dev-azd.yml +0 -0
  227. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-dev.yml +0 -0
  228. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-prod-azd.yml +0 -0
  229. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-prod.yml +0 -0
  230. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-prompt-agent.yml +0 -0
  231. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-qa-azd.yml +0 -0
  232. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-deploy-qa.yml +0 -0
  233. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-pr.yml +0 -0
  234. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/templates/workflows/agentops-watchdog.yml +0 -0
  235. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/__init__.py +0 -0
  236. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/azd_env.py +0 -0
  237. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/azure_endpoints.py +0 -0
  238. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/colors.py +0 -0
  239. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/dotenv_loader.py +0 -0
  240. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/foundry_discovery.py +0 -0
  241. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/logging.py +0 -0
  242. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/telemetry.py +0 -0
  243. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops/utils/yaml.py +0 -0
  244. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/dependency_links.txt +0 -0
  245. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/entry_points.txt +0 -0
  246. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/src/agentops_accelerator.egg-info/top_level.txt +0 -0
  247. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/TESTING.md +0 -0
  248. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/fixtures/fake_adapter.py +0 -0
  249. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/fixtures/fake_eval_runner.py +0 -0
  250. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/integration/.gitkeep +0 -0
  251. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/integration/test_cli_flat_schema.py +0 -0
  252. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/integration/test_pipeline_smoke.py +0 -0
  253. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/.gitkeep +0 -0
  254. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_analyzer.py +0 -0
  255. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_categories.py +0 -0
  256. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_errors.py +0 -0
  257. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_foundry_config.py +0 -0
  258. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_observability.py +0 -0
  259. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_opex.py +0 -0
  260. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_opex_workspace.py +0 -0
  261. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_regression.py +0 -0
  262. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_safety.py +0 -0
  263. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_checks_spec_conformance.py +0 -0
  264. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_cli.py +0 -0
  265. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_config.py +0 -0
  266. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_findings.py +0 -0
  267. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_history.py +0 -0
  268. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_opex_workspace_check.py +0 -0
  269. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_posture_rules.py +0 -0
  270. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_results_history.py +0 -0
  271. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agent_server.py +0 -0
  272. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_agentops_config.py +0 -0
  273. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_assert_and_redteam_runners.py +0 -0
  274. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_env.py +0 -0
  275. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_eval.py +0 -0
  276. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_eval_init.py +0 -0
  277. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azd_runner.py +0 -0
  278. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azure_endpoints.py +0 -0
  279. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_azure_resources_discovery.py +0 -0
  280. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_cockpit_connection_summary.py +0 -0
  281. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_cockpit_port_conflict.py +0 -0
  282. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_commands.py +0 -0
  283. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cli_explain.py +0 -0
  284. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cloud_results.py +0 -0
  285. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cloud_runner.py +0 -0
  286. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_cockpit.py +0 -0
  287. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_diagnostics.py +0 -0
  288. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_doctor_catalog.py +0 -0
  289. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_doctor_cli_explain.py +0 -0
  290. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_dotenv_loader.py +0 -0
  291. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_e2e_render.py +0 -0
  292. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_eval_analysis.py +0 -0
  293. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_eval_run_grader_errors.py +0 -0
  294. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_evaluators.py +0 -0
  295. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_foundry_discovery.py +0 -0
  296. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_governance.py +0 -0
  297. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_init_command.py +0 -0
  298. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_initializer.py +0 -0
  299. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_invocations.py +0 -0
  300. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_knowledge_loader.py +0 -0
  301. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_llm_assist.py +0 -0
  302. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_llm_assist_spec_rules.py +0 -0
  303. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_mcp_server.py +0 -0
  304. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_official_eval.py +0 -0
  305. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_pipeline_publisher.py +0 -0
  306. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_pipeline_reporter.py +0 -0
  307. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_preflight.py +0 -0
  308. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_production_telemetry.py +0 -0
  309. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_release_evidence.py +0 -0
  310. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_runtime_conversation.py +0 -0
  311. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_runtime_model_config.py +0 -0
  312. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_setup_wizard.py +0 -0
  313. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_shared_credentials.py +0 -0
  314. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_skills.py +0 -0
  315. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_skills_sync.py +0 -0
  316. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_telemetry.py +0 -0
  317. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_time_range.py +0 -0
  318. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_trace_promotion.py +0 -0
  319. {agentops_accelerator-0.3.23 → agentops_accelerator-0.4.1}/tests/unit/test_workflow_analysis.py +0 -0
  320. {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.3.23",
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.3.23",
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.23
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<3.0,>=2.0; extra == "foundry"
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<2.0,>=1.3; extra == "agent"
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<14.0,>=13.5; extra == "agent"
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>
@@ -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. PR
1374
- > candidates accumulate in dev over time and may need periodic
1375
- > cleanup according to your team's Foundry retention policy; AgentOps
1376
- > uses prompt SHAs and git SHAs as the durable identity, not old
1377
- > candidate version numbers.
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.3.23",
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.3.23",
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,<3.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,<2.0",
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,<14.0",
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
@@ -3313,7 +3313,7 @@ def cmd_skills_install(
3313
3313
  typer.Option(
3314
3314
  "--platform",
3315
3315
  "-p",
3316
- help="Target platform(s): copilot, claude.",
3316
+ help="Target platform(s): copilot, claude, cursor.",
3317
3317
  ),
3318
3318
  ] = None,
3319
3319
  from_github: Annotated[
@@ -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")