agentops-accelerator 0.8.0__tar.gz → 0.8.2__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 (343) hide show
  1. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.claude-plugin/marketplace.json +1 -1
  2. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/plugin/marketplace.json +1 -1
  3. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/CHANGELOG.md +52 -0
  4. {agentops_accelerator-0.8.0/src/agentops_accelerator.egg-info → agentops_accelerator-0.8.2}/PKG-INFO +1 -1
  5. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/package.json +1 -1
  6. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/plugin.json +1 -1
  7. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/_rbac_authorization.py +8 -5
  8. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_client.py +50 -2
  9. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/azure_monitor.py +7 -3
  10. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/invocations.py +84 -4
  11. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2/src/agentops_accelerator.egg-info}/PKG-INFO +1 -1
  12. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_rbac_openai_data_plane.py +6 -2
  13. agentops_accelerator-0.8.2/tests/unit/test_invocations.py +112 -0
  14. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_llm_assist.py +82 -0
  15. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_telemetry.py +40 -0
  16. agentops_accelerator-0.8.0/tests/unit/test_invocations.py +0 -54
  17. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.gitattributes +0 -0
  18. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/actions/azure-oidc-login/action.yml +0 -0
  19. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/code-quality-py.instructions.md +0 -0
  20. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/copilot-instructions.md +0 -0
  21. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/dependabot.yml +0 -0
  22. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/extensions/agentops-skills/extension.mjs +0 -0
  23. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/skills/release-management/SKILL.md +0 -0
  24. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/_build.yml +0 -0
  25. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/agentops-watchdog.yml +0 -0
  26. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/ci.yml +0 -0
  27. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/cut-release.yml +0 -0
  28. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/e2e.yml +0 -0
  29. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/release.yml +0 -0
  30. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/staging.yml +0 -0
  31. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.gitignore +0 -0
  32. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.pre-commit-config.yaml +0 -0
  33. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.vscode/launch.json +0 -0
  34. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.vscode/settings.json +0 -0
  35. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.vscode/tasks.json +0 -0
  36. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/AGENTS.md +0 -0
  37. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/CONTRIBUTING.md +0 -0
  38. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/LICENSE +0 -0
  39. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/README.md +0 -0
  40. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/SECURITY.md +0 -0
  41. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/bundles.md +0 -0
  42. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/ci-github-actions.md +0 -0
  43. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/concepts.md +0 -0
  44. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/doctor-checks.md +0 -0
  45. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/doctor-explained.md +0 -0
  46. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/e2e-live-architecture.md +0 -0
  47. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/e2e-live-setup.md +0 -0
  48. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/evaluation.md +0 -0
  49. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/foundry-evaluation-sdk-built-in-evaluators.md +0 -0
  50. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/how-it-works.md +0 -0
  51. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/media/agentops-diagrams.vsdx +0 -0
  52. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/media/foundry-control-plane.png +0 -0
  53. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/release-process.md +0 -0
  54. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/tutorial-end-to-end.md +0 -0
  55. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/tutorial-hosted-agent-quickstart.md +0 -0
  56. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/tutorial-prompt-agent.md +0 -0
  57. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/examples/flat-quickstart/README.md +0 -0
  58. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/examples/flat-quickstart/agentops.yaml +0 -0
  59. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/examples/flat-quickstart/dataset.jsonl +0 -0
  60. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/icon.png +0 -0
  61. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/agent-app/Dockerfile +0 -0
  62. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/agent-app/app.py +0 -0
  63. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/agent-app/requirements.txt +0 -0
  64. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/bootstrap.bicep +0 -0
  65. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/bootstrap.parameters.example.json +0 -0
  66. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/perrun.bicep +0 -0
  67. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/launch.json +0 -0
  68. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/media/foundry.svg +0 -0
  69. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/media/quickstart.gif +0 -0
  70. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/.vscodeignore +0 -0
  71. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/LICENSE +0 -0
  72. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/README.md +0 -0
  73. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-agent/SKILL.md +0 -0
  74. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-config/SKILL.md +0 -0
  75. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-dataset/SKILL.md +0 -0
  76. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-eval/SKILL.md +0 -0
  77. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-governance/SKILL.md +0 -0
  78. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-report/SKILL.md +0 -0
  79. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-workflow/SKILL.md +0 -0
  80. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/pyproject.toml +0 -0
  81. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/create_support_agent.py +0 -0
  82. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/cut-release.ps1 +0 -0
  83. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/cut-release.sh +0 -0
  84. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_aggregate_summary.py +0 -0
  85. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_data/basic.jsonl +0 -0
  86. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_data/rag.jsonl +0 -0
  87. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_data/tools.jsonl +0 -0
  88. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_demo.py +0 -0
  89. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_hosted_agent.py +0 -0
  90. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_make_transcript.py +0 -0
  91. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_render_config.py +0 -0
  92. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/release.ps1 +0 -0
  93. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/release.sh +0 -0
  94. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/setup-e2e-new-tenant.ps1 +0 -0
  95. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/staging.ps1 +0 -0
  96. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/staging.sh +0 -0
  97. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/sync-skills.ps1 +0 -0
  98. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/sync-skills.sh +0 -0
  99. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/setup.cfg +0 -0
  100. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/__init__.py +0 -0
  101. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/__main__.py +0 -0
  102. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/__init__.py +0 -0
  103. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/_legacy_ids.py +0 -0
  104. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/analyzer.py +0 -0
  105. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/__init__.py +0 -0
  106. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/catalog.py +0 -0
  107. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/errors.py +0 -0
  108. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/foundry_config.py +0 -0
  109. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/governance.py +0 -0
  110. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/latency.py +0 -0
  111. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/observability.py +0 -0
  112. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/opex.py +0 -0
  113. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/opex_workspace.py +0 -0
  114. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture.py +0 -0
  115. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/__init__.py +0 -0
  116. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/aoai_diagnostic_categories.py +0 -0
  117. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/content_filter.py +0 -0
  118. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/diagnostics.py +0 -0
  119. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/local_auth.py +0 -0
  120. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/managed_identity.py +0 -0
  121. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/network.py +0 -0
  122. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/rbac_openai_data_plane.py +0 -0
  123. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/regression.py +0 -0
  124. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/release_readiness.py +0 -0
  125. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/safety.py +0 -0
  126. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/spec_conformance.py +0 -0
  127. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/cockpit.py +0 -0
  128. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/config.py +0 -0
  129. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/findings.py +0 -0
  130. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/history.py +0 -0
  131. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/knowledge/__init__.py +0 -0
  132. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/knowledge/waf-checklist.csv +0 -0
  133. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/__init__.py +0 -0
  134. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_base.py +0 -0
  135. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_bundle_rule.py +0 -0
  136. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_dataset_rules.py +0 -0
  137. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_engine.py +0 -0
  138. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_prompt_rules.py +0 -0
  139. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_spec_rules.py +0 -0
  140. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/production_telemetry.py +0 -0
  141. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/report.py +0 -0
  142. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/__init__.py +0 -0
  143. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/app.py +0 -0
  144. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/auth.py +0 -0
  145. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/chat.py +0 -0
  146. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/protocol.py +0 -0
  147. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/__init__.py +0 -0
  148. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/_credentials.py +0 -0
  149. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/azure_resources.py +0 -0
  150. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/foundry_control.py +0 -0
  151. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/results_history.py +0 -0
  152. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/__init__.py +0 -0
  153. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/_base.py +0 -0
  154. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/agents_md.py +0 -0
  155. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/spec_kit.py +0 -0
  156. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/time_range.py +0 -0
  157. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/cli/__init__.py +0 -0
  158. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/cli/app.py +0 -0
  159. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/__init__.py +0 -0
  160. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/agentops_config.py +0 -0
  161. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/azd_eval.py +0 -0
  162. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/config_loader.py +0 -0
  163. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/evaluators.py +0 -0
  164. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/governance.py +0 -0
  165. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/release_evidence.py +0 -0
  166. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/results.py +0 -0
  167. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/step_summary.py +0 -0
  168. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/mcp/__init__.py +0 -0
  169. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/mcp/server.py +0 -0
  170. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/__init__.py +0 -0
  171. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/azd_runner.py +0 -0
  172. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/cloud_results.py +0 -0
  173. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/cloud_runner.py +0 -0
  174. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/comparison.py +0 -0
  175. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/diagnostics.py +0 -0
  176. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/official_eval.py +0 -0
  177. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/orchestrator.py +0 -0
  178. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/prompt_deploy.py +0 -0
  179. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/publisher.py +0 -0
  180. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/reporter.py +0 -0
  181. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/runtime.py +0 -0
  182. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/thresholds.py +0 -0
  183. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/__init__.py +0 -0
  184. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/assert_runner.py +0 -0
  185. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/azd_eval_init.py +0 -0
  186. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/cicd.py +0 -0
  187. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/dashboard.py +0 -0
  188. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/eval_analysis.py +0 -0
  189. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/evidence_pack.py +0 -0
  190. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/initializer.py +0 -0
  191. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/preflight.py +0 -0
  192. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/redteam_runner.py +0 -0
  193. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/setup_wizard.py +0 -0
  194. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/skills.py +0 -0
  195. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/telemetry_import.py +0 -0
  196. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/trace_promotion.py +0 -0
  197. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/workflow_analysis.py +0 -0
  198. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/.gitignore +0 -0
  199. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/__init__.py +0 -0
  200. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent-server/Dockerfile +0 -0
  201. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent-server/README.md +0 -0
  202. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent-server/main.bicep +0 -0
  203. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent.yaml +0 -0
  204. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agentops.yaml +0 -0
  205. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/foundry.svg +0 -0
  206. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/icon.png +0 -0
  207. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev-azd.yml +0 -0
  208. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev.yml +0 -0
  209. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod-azd.yml +0 -0
  210. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod.yml +0 -0
  211. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prompt-agent.yml +0 -0
  212. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa-azd.yml +0 -0
  213. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa.yml +0 -0
  214. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-pr-prompt-agent.yml +0 -0
  215. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-pr.yml +0 -0
  216. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-watchdog.yml +0 -0
  217. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/project.gitignore +0 -0
  218. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/sample-traces.jsonl +0 -0
  219. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-agent/SKILL.md +0 -0
  220. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-config/SKILL.md +0 -0
  221. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-dataset/SKILL.md +0 -0
  222. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-eval/SKILL.md +0 -0
  223. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-governance/SKILL.md +0 -0
  224. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-report/SKILL.md +0 -0
  225. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-workflow/SKILL.md +0 -0
  226. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/smoke.jsonl +0 -0
  227. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/waf-checklist.README.md +0 -0
  228. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/waf-checklist.csv +0 -0
  229. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/README.md +0 -0
  230. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/foundry-ops.workbook.json +0 -0
  231. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/agent_behavior.kql +0 -0
  232. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/capacity_ptu_spillover.kql +0 -0
  233. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/errors_throttling.kql +0 -0
  234. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/latency_percentiles.kql +0 -0
  235. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/traffic_tokens.kql +0 -0
  236. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-dev-azd.yml +0 -0
  237. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-dev.yml +0 -0
  238. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-prod-azd.yml +0 -0
  239. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-prod.yml +0 -0
  240. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-prompt-agent.yml +0 -0
  241. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-qa-azd.yml +0 -0
  242. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-qa.yml +0 -0
  243. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-pr-prompt-agent.yml +0 -0
  244. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-pr.yml +0 -0
  245. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-watchdog.yml +0 -0
  246. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/__init__.py +0 -0
  247. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/azd_env.py +0 -0
  248. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/azure_endpoints.py +0 -0
  249. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/colors.py +0 -0
  250. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/dotenv_loader.py +0 -0
  251. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/foundry_discovery.py +0 -0
  252. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/logging.py +0 -0
  253. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/telemetry.py +0 -0
  254. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/yaml.py +0 -0
  255. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/SOURCES.txt +0 -0
  256. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/dependency_links.txt +0 -0
  257. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/entry_points.txt +0 -0
  258. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/requires.txt +0 -0
  259. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/top_level.txt +0 -0
  260. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/TESTING.md +0 -0
  261. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/fixtures/fake_adapter.py +0 -0
  262. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/fixtures/fake_eval_runner.py +0 -0
  263. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/fixtures/workbook_agent_behavior_events.json +0 -0
  264. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/integration/.gitkeep +0 -0
  265. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/integration/test_cli_flat_schema.py +0 -0
  266. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/integration/test_pipeline_smoke.py +0 -0
  267. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/.gitkeep +0 -0
  268. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_analyzer.py +0 -0
  269. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_categories.py +0 -0
  270. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_errors.py +0 -0
  271. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_foundry_config.py +0 -0
  272. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_observability.py +0 -0
  273. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_opex.py +0 -0
  274. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_opex_workspace.py +0 -0
  275. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_regression.py +0 -0
  276. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_safety.py +0 -0
  277. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_spec_conformance.py +0 -0
  278. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_cli.py +0 -0
  279. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_config.py +0 -0
  280. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_findings.py +0 -0
  281. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_history.py +0 -0
  282. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_opex_workspace_check.py +0 -0
  283. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_posture_rules.py +0 -0
  284. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_results_history.py +0 -0
  285. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_server.py +0 -0
  286. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agentops_config.py +0 -0
  287. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_assert_and_redteam_runners.py +0 -0
  288. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_env.py +0 -0
  289. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_eval.py +0 -0
  290. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_eval_init.py +0 -0
  291. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_runner.py +0 -0
  292. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azure_endpoints.py +0 -0
  293. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azure_resources_discovery.py +0 -0
  294. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cicd.py +0 -0
  295. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_cockpit_connection_summary.py +0 -0
  296. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_cockpit_port_conflict.py +0 -0
  297. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_commands.py +0 -0
  298. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_dashboard.py +0 -0
  299. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_explain.py +0 -0
  300. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cloud_results.py +0 -0
  301. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cloud_runner.py +0 -0
  302. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cockpit.py +0 -0
  303. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_dashboard.py +0 -0
  304. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_diagnostics.py +0 -0
  305. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_doctor_catalog.py +0 -0
  306. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_doctor_cli_explain.py +0 -0
  307. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_dotenv_loader.py +0 -0
  308. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_e2e_render.py +0 -0
  309. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_eval_analysis.py +0 -0
  310. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_eval_run_grader_errors.py +0 -0
  311. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_evaluators.py +0 -0
  312. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_foundry_discovery.py +0 -0
  313. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_governance.py +0 -0
  314. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_http_response_fields.py +0 -0
  315. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_http_streaming.py +0 -0
  316. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_init_command.py +0 -0
  317. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_initializer.py +0 -0
  318. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_knowledge_loader.py +0 -0
  319. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_llm_assist_spec_rules.py +0 -0
  320. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_mcp_server.py +0 -0
  321. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_official_eval.py +0 -0
  322. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_pipeline_publisher.py +0 -0
  323. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_pipeline_reporter.py +0 -0
  324. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_preflight.py +0 -0
  325. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_production_telemetry.py +0 -0
  326. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_prompt_deploy.py +0 -0
  327. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_release_evidence.py +0 -0
  328. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_conversation.py +0 -0
  329. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_dataset_response_source.py +0 -0
  330. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_model_config.py +0 -0
  331. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_response_fields.py +0 -0
  332. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_setup_wizard.py +0 -0
  333. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_shared_credentials.py +0 -0
  334. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_skills.py +0 -0
  335. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_skills_sync.py +0 -0
  336. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_step_summary.py +0 -0
  337. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_telemetry_import.py +0 -0
  338. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_time_range.py +0 -0
  339. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_trace_promotion.py +0 -0
  340. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_workflow_analysis.py +0 -0
  341. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_yaml_utils.py +0 -0
  342. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tombstones/vscode/CDN_DEPRECATION_REQUEST.md +0 -0
  343. {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/uv.lock +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.8.0",
16
+ "version": "0.8.2",
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.8.0",
16
+ "version": "0.8.2",
17
17
  "keywords": [
18
18
  "agentops",
19
19
  "evaluation",
@@ -5,6 +5,58 @@ This format follows [Keep a Changelog](https://keepachangelog.com/) and adheres
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.8.2] - 2026-08-07
9
+
10
+ ### Fixed
11
+ - **`protocol: responses` now works against a Foundry hosted agent.** Every
12
+ invocation failed with
13
+ `HTTP 400 ... Missing required query parameter: api-version`, because the
14
+ hosted-agent path built the request URL by string-concatenating `/responses`
15
+ onto the configured URL. That had three consequences:
16
+ - Any existing query string was corrupted, because `/responses` was appended
17
+ after it (`.../responses?api-version=v1` became
18
+ `.../responses?api-version=v1/responses`).
19
+ - The required `api-version` query parameter was never added, so the Foundry
20
+ data plane rejected the request outright.
21
+ - A Foundry *agent identity* URL
22
+ (`/api/projects/<project>/agents/<name>/versions/<n>`) was accepted even
23
+ though it is not an invocable route; the invocable route is
24
+ `/agents/<name>/endpoint/protocols/openai/responses`.
25
+
26
+ The URL is now parsed rather than concatenated: the path and the query string
27
+ are handled separately, an agent identity URL is normalized onto the protocol
28
+ route, and `api-version` defaults to `v1` for Foundry protocol routes only.
29
+ When the configured URL pins a version, the version is preserved by sending an
30
+ `agent_reference` in the request body (the same mechanism
31
+ `_invoke_foundry_prompt` already uses), so pinning semantics are not lost.
32
+ URLs that already point at a `/responses` route and non-Foundry HTTP endpoints
33
+ are left untouched.
34
+
35
+ ## [0.8.1] - 2026-07-16
36
+
37
+ ### Fixed
38
+ - **`agentops doctor` no longer prints noisy non-fatal errors to the console.**
39
+ Three low-level probes that already degrade gracefully were leaking their
40
+ transport errors to the screen during readiness checks:
41
+ - The **LLM judge** called the Foundry project OpenAI client on the legacy
42
+ `/openai/` route, which returns HTTP 404 for chat completions, printing
43
+ `WARNING: llm_assist: judge call failed: Error code: 404`. The client is now
44
+ normalized to the stable `/openai/v1/` route (with the injected
45
+ `api-version` query parameter cleared) using the same reused credential and
46
+ token refresh, so the judge runs instead of 404ing. Non-Foundry endpoints
47
+ are left untouched.
48
+ - The **OpenAI data-plane RBAC check** built an ARM role-assignment filter
49
+ (`atScopeAndAbove() and assignedTo('<oid>')`) that ARM rejects with
50
+ `UnsupportedQuery`. It now sends the supported `assignedTo('<oid>')` filter,
51
+ which already returns assignments at the target scope and every ancestor
52
+ scope, so the check runs instead of skipping with a console error.
53
+ - The **Application Insights** REST probe caught only `urllib.error.URLError`,
54
+ so a read timeout (a `socket.timeout`, which is an `OSError` but not a
55
+ `URLError`) escaped and surfaced
56
+ `INFO: Rate-limit App Insights probe failed (non-fatal): The read operation
57
+ timed out`. It now catches `OSError` (covering both) and the request timeout
58
+ was raised from 10s to 30s, so a slow App Insights degrades quietly.
59
+
8
60
  ## [0.8.0] - 2026-07-14
9
61
 
10
62
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentops-accelerator
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Release readiness gates and evidence for Microsoft Foundry agents
5
5
  License: MIT License
6
6
 
@@ -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.8.0",
5
+ "version": "0.8.2",
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.8.0",
4
+ "version": "0.8.2",
5
5
  "author": {
6
6
  "name": "AgentOps Accelerator",
7
7
  "url": "https://github.com/Azure/agentops"
@@ -60,8 +60,13 @@ def list_principal_role_definition_ids(
60
60
  """List role definition GUIDs assigned to the principal at/above scope.
61
61
 
62
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.
63
+ ``assignedTo('<oid>')`` filter. That filter already returns assignments at
64
+ the given scope and every ancestor scope (subscription, resource group,
65
+ account), including those inherited through group membership, so
66
+ management-plane inheritance is honoured. The ARM RBAC API rejects the
67
+ combined ``atScopeAndAbove() and assignedTo(...)`` form
68
+ (``UnsupportedQuery``); ``assignedTo(...)`` on its own is the supported
69
+ equivalent.
65
70
  """
66
71
  try:
67
72
  from azure.mgmt.authorization import AuthorizationManagementClient
@@ -95,9 +100,7 @@ def list_principal_role_definition_ids(
95
100
  assignments = list(
96
101
  client.role_assignments.list_for_scope(
97
102
  scope=scope,
98
- filter=(
99
- f"atScopeAndAbove() and assignedTo('{principal_object_id}')"
100
- ),
103
+ filter=f"assignedTo('{principal_object_id}')",
101
104
  )
102
105
  )
103
106
  except Exception as exc: # noqa: BLE001
@@ -39,6 +39,51 @@ class JudgementMeta:
39
39
  model_deployment: Optional[str] = None
40
40
 
41
41
 
42
+ def _normalize_foundry_openai_client(client: Any) -> Any:
43
+ """Point a Foundry project OpenAI client at the ``/openai/v1/`` route.
44
+
45
+ ``AIProjectClient.get_openai_client()`` returns a client whose
46
+ ``base_url`` ends in ``/openai/`` and which injects an ``api-version``
47
+ query parameter. On that legacy route Foundry chat completions return
48
+ HTTP 404. The stable surface is the OpenAI v1 route (``/openai/v1/``)
49
+ served *without* an ``api-version`` parameter.
50
+
51
+ We rewrite the client in place with the public ``with_options`` API so
52
+ the reused credential and its token refresh keep working (no second
53
+ credential, no endpoint string-munging). The client is returned
54
+ unchanged when its ``base_url`` is not the recognised Foundry project
55
+ shape, so custom or already-normalised endpoints are left untouched.
56
+ """
57
+ try:
58
+ base_url = str(getattr(client, "base_url", "") or "")
59
+ except Exception: # pragma: no cover - defensive
60
+ return client
61
+ if not base_url:
62
+ return client
63
+
64
+ normalized = base_url if base_url.endswith("/") else base_url + "/"
65
+ if normalized.endswith("/openai/v1/"):
66
+ # Already on the v1 surface; only ensure api-version is dropped.
67
+ pass
68
+ elif normalized.endswith("/openai/"):
69
+ normalized = normalized + "v1/"
70
+ else:
71
+ # Unknown shape (non-Foundry route). Leave routing untouched.
72
+ return client
73
+
74
+ with_options = getattr(client, "with_options", None)
75
+ if with_options is None: # pragma: no cover - defensive
76
+ return client
77
+ try:
78
+ return with_options(
79
+ base_url=normalized,
80
+ default_query={"api-version": None},
81
+ )
82
+ except Exception as exc: # pragma: no cover - defensive
83
+ log.info("llm_assist: could not normalize OpenAI route: %s", exc)
84
+ return client
85
+
86
+
42
87
  class LLMJudge:
43
88
  """Thin wrapper around the Foundry project's OpenAI client."""
44
89
 
@@ -230,6 +275,7 @@ class LLMJudge:
230
275
  if not endpoint:
231
276
  log.info("llm_assist: project endpoint not configured")
232
277
  return None
278
+
233
279
  try:
234
280
  from azure.ai.projects import AIProjectClient # type: ignore
235
281
  from azure.identity import DefaultAzureCredential # type: ignore
@@ -240,7 +286,9 @@ class LLMJudge:
240
286
  try:
241
287
  project_client = AIProjectClient(
242
288
  endpoint=endpoint,
243
- credential=DefaultAzureCredential(exclude_developer_cli_credential=True, process_timeout=30),
289
+ credential=DefaultAzureCredential(
290
+ exclude_developer_cli_credential=True, process_timeout=30
291
+ ),
244
292
  )
245
293
  # Foundry exposes get_openai_client without an api_version arg;
246
294
  # never pass one (the SDK picks the right version).
@@ -251,7 +299,7 @@ class LLMJudge:
251
299
  if get_openai_client is None:
252
300
  log.info("llm_assist: AIProjectClient has no OpenAI client helper")
253
301
  return None
254
- self._client = get_openai_client()
302
+ self._client = _normalize_foundry_openai_client(get_openai_client())
255
303
  except Exception as exc: # pragma: no cover
256
304
  log.warning("llm_assist: openai client init failed: %s", exc)
257
305
  return None
@@ -13,7 +13,7 @@ import os
13
13
  import re
14
14
  from dataclasses import dataclass, field
15
15
  from typing import Any, Dict, List, Optional
16
- from urllib import error, request
16
+ from urllib import request
17
17
 
18
18
  from agentops.agent.config import AzureMonitorSourceConfig
19
19
 
@@ -504,9 +504,13 @@ def _query_application_insights(
504
504
  method="POST",
505
505
  )
506
506
  try:
507
- with request.urlopen(req, timeout=10) as resp: # noqa: S310
507
+ with request.urlopen(req, timeout=30) as resp: # noqa: S310
508
508
  parsed = json.loads(resp.read())
509
- except (error.URLError, ValueError, KeyError) as exc:
509
+ except (OSError, ValueError, KeyError) as exc:
510
+ # OSError covers urllib.error.URLError *and* socket.timeout /
511
+ # TimeoutError. A read timeout is not a URLError, so catching only
512
+ # URLError here would let it propagate to the caller and surface a
513
+ # noisy non-fatal INFO line on the console. Degrade quietly instead.
510
514
  log.debug("App Insights REST query failed: %s", exc)
511
515
  return None
512
516
 
@@ -18,8 +18,10 @@ from __future__ import annotations
18
18
 
19
19
  import json
20
20
  import os
21
+ import re
21
22
  import time
22
23
  import urllib.error
24
+ import urllib.parse
23
25
  import urllib.request
24
26
  from dataclasses import dataclass, field
25
27
  from typing import Any, Dict, List, Optional
@@ -49,6 +51,79 @@ _MAX_TOOL_ITERATIONS = 4
49
51
  # while letting the agent produce its final natural-language reply.
50
52
  _TOOL_STUB_OUTPUT = '{"status": "ok"}'
51
53
 
54
+ # Foundry serves hosted agents on a protocol route hanging off the agent
55
+ # resource, not on the resource URL itself. The portal and `azd` surface
56
+ # identity URLs (`.../agents/<name>` or `.../agents/<name>/versions/<n>`),
57
+ # which cannot be POSTed to, so they are normalised onto this suffix.
58
+ _FOUNDRY_HOSTED_RESPONSES_SUFFIX = "/endpoint/protocols/openai/responses"
59
+
60
+ # The Foundry protocol route rejects requests without `api-version`
61
+ # (HTTP 400 "Missing required query parameter: api-version"). This is the
62
+ # default applied when the configured URL does not carry one already.
63
+ _FOUNDRY_HOSTED_API_VERSION = "v1"
64
+
65
+ # Matches a Foundry agent identity path, optionally pinned to a version.
66
+ _FOUNDRY_AGENT_PATH_RE = re.compile(
67
+ r"^(?P<base>.*/agents/(?P<name>[^/]+))(?:/versions/(?P<version>[^/]+))?$"
68
+ )
69
+
70
+
71
+ def _foundry_hosted_responses_target(
72
+ raw_url: str,
73
+ ) -> tuple[str, Optional[Dict[str, Any]]]:
74
+ """Normalise a Foundry hosted-agent URL into its Responses invocation route.
75
+
76
+ Accepts any of the URL shapes users realistically have on hand:
77
+
78
+ * ``.../agents/<name>`` - agent identity URL
79
+ * ``.../agents/<name>/versions/<n>`` - version-pinned identity URL
80
+ * ``.../agents/<name>/endpoint/protocols/openai`` - protocol route
81
+ * ``.../agents/<name>/endpoint/protocols/openai/responses`` - full route
82
+
83
+ Query parameters on the configured URL are preserved, and ``api-version``
84
+ is defaulted when absent. When the source URL pinned a specific version,
85
+ an ``agent_reference`` block is returned so the pin survives the rewrite
86
+ (the protocol route itself is not version-scoped).
87
+
88
+ Returns ``(url, agent_reference_or_None)``.
89
+ """
90
+ parts = urllib.parse.urlsplit(raw_url)
91
+ path = parts.path.rstrip("/")
92
+ agent_reference: Optional[Dict[str, Any]] = None
93
+
94
+ if not path.endswith("/responses"):
95
+ identity = _FOUNDRY_AGENT_PATH_RE.match(path)
96
+ if identity:
97
+ path = identity.group("base") + _FOUNDRY_HOSTED_RESPONSES_SUFFIX
98
+ version = identity.group("version")
99
+ if version:
100
+ agent_reference = {
101
+ "type": "agent_reference",
102
+ "name": urllib.parse.unquote(identity.group("name")),
103
+ "version": urllib.parse.unquote(version),
104
+ }
105
+ else:
106
+ path = f"{path}/responses"
107
+
108
+ query = urllib.parse.parse_qsl(parts.query, keep_blank_values=True)
109
+ # Only Foundry's own protocol route mandates api-version; leave custom
110
+ # hosted endpoints (e.g. *.azurewebsites.net) byte-for-byte unchanged.
111
+ if "/protocols/openai" in path and not any(
112
+ key.lower() == "api-version" for key, _ in query
113
+ ):
114
+ query.append(("api-version", _FOUNDRY_HOSTED_API_VERSION))
115
+
116
+ url = urllib.parse.urlunsplit(
117
+ (
118
+ parts.scheme,
119
+ parts.netloc,
120
+ path,
121
+ urllib.parse.urlencode(query),
122
+ parts.fragment,
123
+ )
124
+ )
125
+ return url, agent_reference
126
+
52
127
 
53
128
  def _summarise_tool_calls(calls: List[Any]) -> str:
54
129
  """Build a short, human-readable summary of executed tool calls.
@@ -547,16 +622,21 @@ def _invoke_foundry_hosted(
547
622
  }
548
623
 
549
624
  if target.protocol == "responses":
550
- url = target.url.rstrip("/")
551
- if not url.endswith("/responses"):
552
- url = f"{url}/responses"
553
- initial_body = {"input": [{"role": "user", "content": _row_input(row)}]}
625
+ url, agent_reference = _foundry_hosted_responses_target(target.url)
626
+ initial_body: Dict[str, Any] = {
627
+ "input": [{"role": "user", "content": _row_input(row)}]
628
+ }
629
+ if agent_reference:
630
+ initial_body["agent_reference"] = agent_reference
554
631
 
555
632
  text, aggregated_tool_calls, elapsed = _run_responses_tool_loop(
556
633
  url=url,
557
634
  headers=headers,
558
635
  initial_body=initial_body,
559
636
  timeout=timeout,
637
+ follow_up_extras=(
638
+ {"agent_reference": agent_reference} if agent_reference else None
639
+ ),
560
640
  )
561
641
 
562
642
  if not text:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentops-accelerator
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: Release readiness gates and evidence for Microsoft Foundry agents
5
5
  License: MIT License
6
6
 
@@ -310,8 +310,12 @@ def test_list_role_definition_ids_extracts_guid_suffix() -> None:
310
310
  role_assignments.list_for_scope.assert_called_once()
311
311
  kwargs = role_assignments.list_for_scope.call_args.kwargs
312
312
  assert kwargs["scope"] == _ACCOUNT_TARGET
313
- assert _PRINCIPAL_OID in kwargs["filter"]
314
- assert "atScopeAndAbove" in kwargs["filter"]
313
+ # The ARM RBAC API rejects the combined
314
+ # ``atScopeAndAbove() and assignedTo(...)`` filter with UnsupportedQuery.
315
+ # ``assignedTo(...)`` alone is the supported equivalent and already
316
+ # returns assignments at scope and every ancestor scope.
317
+ assert kwargs["filter"] == f"assignedTo('{_PRINCIPAL_OID}')"
318
+ assert "atScopeAndAbove" not in kwargs["filter"]
315
319
 
316
320
 
317
321
  def test_list_role_definition_ids_raises_when_sdk_missing() -> None:
@@ -0,0 +1,112 @@
1
+ """Unit tests for target invocation helpers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+ import pytest
8
+
9
+ from agentops.core.agentops_config import AgentOpsConfig
10
+ from agentops.pipeline import invocations
11
+
12
+
13
+ def _config(**overrides: object) -> AgentOpsConfig:
14
+ data = {
15
+ "version": 1,
16
+ "agent": "my-agent:1",
17
+ "dataset": Path("data.jsonl"),
18
+ **overrides,
19
+ }
20
+ return AgentOpsConfig(**data)
21
+
22
+
23
+ def test_project_endpoint_prefers_config_over_environment(monkeypatch):
24
+ monkeypatch.setenv(
25
+ "AZURE_AI_FOUNDRY_PROJECT_ENDPOINT",
26
+ "https://from-env.services.ai.azure.com/api/projects/p",
27
+ )
28
+ cfg = _config(
29
+ project_endpoint="https://from-config.services.ai.azure.com/api/projects/p"
30
+ )
31
+
32
+ assert (
33
+ invocations._project_endpoint(cfg)
34
+ == "https://from-config.services.ai.azure.com/api/projects/p"
35
+ )
36
+
37
+
38
+ def test_project_endpoint_falls_back_to_environment(monkeypatch):
39
+ monkeypatch.setenv(
40
+ "AZURE_AI_FOUNDRY_PROJECT_ENDPOINT",
41
+ "https://from-env.services.ai.azure.com/api/projects/p",
42
+ )
43
+
44
+ assert (
45
+ invocations._project_endpoint(_config())
46
+ == "https://from-env.services.ai.azure.com/api/projects/p"
47
+ )
48
+
49
+
50
+ def test_project_endpoint_requires_config_or_environment(monkeypatch):
51
+ monkeypatch.delenv("AZURE_AI_FOUNDRY_PROJECT_ENDPOINT", raising=False)
52
+
53
+ with pytest.raises(RuntimeError, match="project_endpoint"):
54
+ invocations._project_endpoint(_config())
55
+
56
+
57
+ _AGENT_BASE = "https://acct.services.ai.azure.com/api/projects/proj/agents/helpdeskbot"
58
+ _PROTOCOL_ROUTE = f"{_AGENT_BASE}/endpoint/protocols/openai/responses"
59
+
60
+
61
+ def test_hosted_responses_target_rewrites_version_pinned_identity_url():
62
+ url, agent_reference = invocations._foundry_hosted_responses_target(
63
+ f"{_AGENT_BASE}/versions/11"
64
+ )
65
+
66
+ assert url == f"{_PROTOCOL_ROUTE}?api-version=v1"
67
+ assert agent_reference == {
68
+ "type": "agent_reference",
69
+ "name": "helpdeskbot",
70
+ "version": "11",
71
+ }
72
+
73
+
74
+ def test_hosted_responses_target_rewrites_unversioned_identity_url():
75
+ url, agent_reference = invocations._foundry_hosted_responses_target(_AGENT_BASE)
76
+
77
+ assert url == f"{_PROTOCOL_ROUTE}?api-version=v1"
78
+ assert agent_reference is None
79
+
80
+
81
+ def test_hosted_responses_target_preserves_existing_query_parameters():
82
+ url, _ = invocations._foundry_hosted_responses_target(
83
+ f"{_AGENT_BASE}/endpoint/protocols/openai?api-version=2025-05-01&trace=on"
84
+ )
85
+
86
+ assert url == f"{_PROTOCOL_ROUTE}?api-version=2025-05-01&trace=on"
87
+
88
+
89
+ def test_hosted_responses_target_is_idempotent_on_full_route():
90
+ configured = f"{_PROTOCOL_ROUTE}?api-version=v1"
91
+
92
+ url, agent_reference = invocations._foundry_hosted_responses_target(configured)
93
+
94
+ assert url == configured
95
+ assert agent_reference is None
96
+
97
+
98
+ def test_hosted_responses_target_appends_responses_to_protocol_route():
99
+ url, _ = invocations._foundry_hosted_responses_target(
100
+ f"{_AGENT_BASE}/endpoint/protocols/openai"
101
+ )
102
+
103
+ assert url == f"{_PROTOCOL_ROUTE}?api-version=v1"
104
+
105
+
106
+ def test_hosted_responses_target_leaves_custom_endpoints_without_api_version():
107
+ url, agent_reference = invocations._foundry_hosted_responses_target(
108
+ "https://my-agent.azurewebsites.net/chat"
109
+ )
110
+
111
+ assert url == "https://my-agent.azurewebsites.net/chat/responses"
112
+ assert agent_reference is None
@@ -481,3 +481,85 @@ def test_judge_falls_back_to_inference_get_openai_client(
481
481
  judge = LLMJudge(config=_enabled_config(), workspace=tmp_path)
482
482
 
483
483
  assert judge._get_client() == "legacy-openai-client"
484
+
485
+
486
+ # ---------------------------------------------------------------------------
487
+ # _normalize_foundry_openai_client -- Foundry /openai/v1/ route fix
488
+ # ---------------------------------------------------------------------------
489
+
490
+
491
+ class _FakeOpenAIClient:
492
+ """Minimal stand-in exposing ``base_url`` and ``with_options``."""
493
+
494
+ def __init__(self, base_url: str) -> None:
495
+ self.base_url = base_url
496
+ self.with_options_kwargs: Optional[Dict[str, Any]] = None
497
+
498
+ def with_options(self, **kwargs: Any) -> "_FakeOpenAIClient":
499
+ self.with_options_kwargs = kwargs
500
+ new = _FakeOpenAIClient(kwargs.get("base_url", self.base_url))
501
+ new.with_options_kwargs = kwargs
502
+ return new
503
+
504
+
505
+ def test_normalize_rewrites_openai_route_to_v1_and_drops_api_version() -> None:
506
+ from agentops.agent.llm_assist._client import (
507
+ _normalize_foundry_openai_client,
508
+ )
509
+
510
+ client = _FakeOpenAIClient(
511
+ "https://acct.services.ai.azure.com/api/projects/p/openai/"
512
+ )
513
+ normalized = _normalize_foundry_openai_client(client)
514
+
515
+ assert normalized.with_options_kwargs is not None
516
+ assert (
517
+ normalized.with_options_kwargs["base_url"]
518
+ == "https://acct.services.ai.azure.com/api/projects/p/openai/v1/"
519
+ )
520
+ # The injected ``api-version`` query param must be cleared, otherwise the
521
+ # Foundry v1 route returns HTTP 404.
522
+ assert normalized.with_options_kwargs["default_query"] == {
523
+ "api-version": None
524
+ }
525
+
526
+
527
+ def test_normalize_leaves_v1_route_but_still_drops_api_version() -> None:
528
+ from agentops.agent.llm_assist._client import (
529
+ _normalize_foundry_openai_client,
530
+ )
531
+
532
+ client = _FakeOpenAIClient(
533
+ "https://acct.services.ai.azure.com/api/projects/p/openai/v1/"
534
+ )
535
+ normalized = _normalize_foundry_openai_client(client)
536
+
537
+ assert (
538
+ normalized.with_options_kwargs["base_url"]
539
+ == "https://acct.services.ai.azure.com/api/projects/p/openai/v1/"
540
+ )
541
+ assert normalized.with_options_kwargs["default_query"] == {
542
+ "api-version": None
543
+ }
544
+
545
+
546
+ def test_normalize_leaves_unknown_route_untouched() -> None:
547
+ from agentops.agent.llm_assist._client import (
548
+ _normalize_foundry_openai_client,
549
+ )
550
+
551
+ client = _FakeOpenAIClient("https://custom.example.com/v1/")
552
+ normalized = _normalize_foundry_openai_client(client)
553
+
554
+ # Non-Foundry routes are returned as-is; with_options is never called.
555
+ assert normalized is client
556
+ assert client.with_options_kwargs is None
557
+
558
+
559
+ def test_normalize_ignores_client_without_base_url() -> None:
560
+ from agentops.agent.llm_assist._client import (
561
+ _normalize_foundry_openai_client,
562
+ )
563
+
564
+ sentinel = object()
565
+ assert _normalize_foundry_openai_client(sentinel) is sentinel
@@ -708,6 +708,46 @@ def test_azure_monitor_skipped_when_connection_string_lacks_application_id(
708
708
  assert payload.diagnostics["discovery_reason"]
709
709
 
710
710
 
711
+ def test_query_application_insights_returns_none_on_read_timeout(
712
+ monkeypatch: pytest.MonkeyPatch,
713
+ ) -> None:
714
+ """A read timeout must degrade quietly, not raise.
715
+
716
+ ``socket.timeout`` (aka ``TimeoutError``) is an ``OSError`` but NOT a
717
+ ``urllib.error.URLError``, so the previous narrow ``except URLError``
718
+ let it escape and surface a noisy non-fatal INFO line on the console.
719
+ The fix catches ``OSError`` and returns ``None``.
720
+ """
721
+ import socket
722
+
723
+ def _raise_timeout(*_args, **_kwargs):
724
+ raise socket.timeout("The read operation timed out")
725
+
726
+ monkeypatch.setattr(azure_monitor.request, "urlopen", _raise_timeout)
727
+
728
+ assert (
729
+ azure_monitor._query_application_insights("app-id", "bearer", "kql")
730
+ is None
731
+ )
732
+
733
+
734
+ def test_query_application_insights_returns_none_on_urlerror(
735
+ monkeypatch: pytest.MonkeyPatch,
736
+ ) -> None:
737
+ """Transport failures (URLError) also degrade quietly to None."""
738
+ from urllib.error import URLError
739
+
740
+ def _raise_urlerror(*_args, **_kwargs):
741
+ raise URLError("connection refused")
742
+
743
+ monkeypatch.setattr(azure_monitor.request, "urlopen", _raise_urlerror)
744
+
745
+ assert (
746
+ azure_monitor._query_application_insights("app-id", "bearer", "kql")
747
+ is None
748
+ )
749
+
750
+
711
751
  def _app_insights_result(row: dict[str, object]) -> dict[str, object]:
712
752
  return {
713
753
  "tables": [