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.
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.claude-plugin/marketplace.json +1 -1
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/plugin/marketplace.json +1 -1
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/CHANGELOG.md +52 -0
- {agentops_accelerator-0.8.0/src/agentops_accelerator.egg-info → agentops_accelerator-0.8.2}/PKG-INFO +1 -1
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/package.json +1 -1
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/plugin.json +1 -1
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/_rbac_authorization.py +8 -5
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_client.py +50 -2
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/azure_monitor.py +7 -3
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/invocations.py +84 -4
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2/src/agentops_accelerator.egg-info}/PKG-INFO +1 -1
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_rbac_openai_data_plane.py +6 -2
- agentops_accelerator-0.8.2/tests/unit/test_invocations.py +112 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_llm_assist.py +82 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_telemetry.py +40 -0
- agentops_accelerator-0.8.0/tests/unit/test_invocations.py +0 -54
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.gitattributes +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/actions/azure-oidc-login/action.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/code-quality-py.instructions.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/copilot-instructions.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/dependabot.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/extensions/agentops-skills/extension.mjs +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/skills/release-management/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/_build.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/ci.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/cut-release.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/e2e.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/release.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.github/workflows/staging.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.gitignore +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.pre-commit-config.yaml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.vscode/launch.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.vscode/settings.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/.vscode/tasks.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/AGENTS.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/CONTRIBUTING.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/LICENSE +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/README.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/SECURITY.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/bundles.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/ci-github-actions.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/concepts.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/doctor-checks.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/doctor-explained.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/e2e-live-architecture.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/e2e-live-setup.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/evaluation.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/foundry-evaluation-sdk-built-in-evaluators.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/how-it-works.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/media/agentops-diagrams.vsdx +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/media/foundry-control-plane.png +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/release-process.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/tutorial-end-to-end.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/tutorial-hosted-agent-quickstart.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/docs/tutorial-prompt-agent.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/examples/flat-quickstart/README.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/examples/flat-quickstart/agentops.yaml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/examples/flat-quickstart/dataset.jsonl +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/icon.png +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/agent-app/Dockerfile +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/agent-app/app.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/agent-app/requirements.txt +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/bootstrap.bicep +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/bootstrap.parameters.example.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/infra/e2e/perrun.bicep +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/launch.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/media/foundry.svg +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/media/quickstart.gif +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/.vscodeignore +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/LICENSE +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/README.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-agent/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-config/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-dataset/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-eval/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-governance/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-report/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/plugins/agentops/skills/agentops-workflow/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/pyproject.toml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/create_support_agent.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/cut-release.ps1 +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/cut-release.sh +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_aggregate_summary.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_data/basic.jsonl +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_data/rag.jsonl +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_data/tools.jsonl +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_demo.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_hosted_agent.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_make_transcript.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/e2e_render_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/release.ps1 +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/release.sh +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/setup-e2e-new-tenant.ps1 +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/staging.ps1 +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/staging.sh +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/sync-skills.ps1 +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/scripts/sync-skills.sh +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/setup.cfg +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/__main__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/_legacy_ids.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/analyzer.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/catalog.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/errors.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/foundry_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/governance.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/latency.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/observability.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/opex.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/opex_workspace.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/aoai_diagnostic_categories.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/content_filter.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/diagnostics.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/local_auth.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/managed_identity.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/posture_rules/network.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/rbac_openai_data_plane.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/regression.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/release_readiness.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/safety.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/checks/spec_conformance.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/cockpit.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/findings.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/history.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/knowledge/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/knowledge/waf-checklist.csv +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_base.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_bundle_rule.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_dataset_rules.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_engine.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_prompt_rules.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_spec_rules.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/production_telemetry.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/report.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/app.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/auth.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/chat.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/server/protocol.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/_credentials.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/azure_resources.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/foundry_control.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/results_history.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/_base.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/agents_md.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/sources/spec_detectors/spec_kit.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/time_range.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/cli/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/cli/app.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/agentops_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/azd_eval.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/config_loader.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/evaluators.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/governance.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/release_evidence.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/results.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/core/step_summary.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/mcp/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/mcp/server.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/azd_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/cloud_results.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/cloud_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/comparison.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/diagnostics.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/official_eval.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/orchestrator.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/prompt_deploy.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/publisher.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/reporter.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/runtime.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/thresholds.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/assert_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/azd_eval_init.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/cicd.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/dashboard.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/eval_analysis.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/evidence_pack.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/initializer.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/preflight.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/redteam_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/setup_wizard.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/skills.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/telemetry_import.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/trace_promotion.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/services/workflow_analysis.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/.gitignore +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent-server/Dockerfile +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent-server/README.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent-server/main.bicep +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agent.yaml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/agentops.yaml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/foundry.svg +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/icon.png +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev-azd.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod-azd.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prompt-agent.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa-azd.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-pr-prompt-agent.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-pr.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/pipelines/azuredevops/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/project.gitignore +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/sample-traces.jsonl +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-agent/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-config/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-dataset/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-eval/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-governance/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-report/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/skills/agentops-workflow/SKILL.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/smoke.jsonl +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/waf-checklist.README.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/waf-checklist.csv +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/README.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/foundry-ops.workbook.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/agent_behavior.kql +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/capacity_ptu_spillover.kql +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/errors_throttling.kql +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/latency_percentiles.kql +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workbooks/queries/traffic_tokens.kql +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-dev-azd.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-dev.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-prod-azd.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-prod.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-prompt-agent.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-qa-azd.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-deploy-qa.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-pr-prompt-agent.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-pr.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/templates/workflows/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/__init__.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/azd_env.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/azure_endpoints.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/colors.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/dotenv_loader.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/foundry_discovery.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/logging.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/telemetry.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/utils/yaml.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/SOURCES.txt +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/dependency_links.txt +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/entry_points.txt +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/requires.txt +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops_accelerator.egg-info/top_level.txt +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/TESTING.md +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/fixtures/fake_adapter.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/fixtures/fake_eval_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/fixtures/workbook_agent_behavior_events.json +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/integration/.gitkeep +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/integration/test_cli_flat_schema.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/integration/test_pipeline_smoke.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/.gitkeep +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_analyzer.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_categories.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_errors.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_foundry_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_observability.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_opex.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_opex_workspace.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_regression.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_safety.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_checks_spec_conformance.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_cli.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_findings.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_history.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_opex_workspace_check.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_posture_rules.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_results_history.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agent_server.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_agentops_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_assert_and_redteam_runners.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_env.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_eval.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_eval_init.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azd_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azure_endpoints.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_azure_resources_discovery.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cicd.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_cockpit_connection_summary.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_cockpit_port_conflict.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_commands.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_dashboard.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cli_explain.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cloud_results.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cloud_runner.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_cockpit.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_dashboard.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_diagnostics.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_doctor_catalog.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_doctor_cli_explain.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_dotenv_loader.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_e2e_render.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_eval_analysis.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_eval_run_grader_errors.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_evaluators.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_foundry_discovery.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_governance.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_http_response_fields.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_http_streaming.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_init_command.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_initializer.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_knowledge_loader.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_llm_assist_spec_rules.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_mcp_server.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_official_eval.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_pipeline_publisher.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_pipeline_reporter.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_preflight.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_production_telemetry.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_prompt_deploy.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_release_evidence.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_conversation.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_dataset_response_source.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_model_config.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_runtime_response_fields.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_setup_wizard.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_shared_credentials.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_skills.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_skills_sync.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_step_summary.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_telemetry_import.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_time_range.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_trace_promotion.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_workflow_analysis.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tests/unit/test_yaml_utils.py +0 -0
- {agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/tombstones/vscode/CDN_DEPRECATION_REQUEST.md +0 -0
- {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.
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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.
|
|
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
|
-
``
|
|
64
|
-
|
|
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
|
{agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/agent/llm_assist/_client.py
RENAMED
|
@@ -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(
|
|
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
|
|
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=
|
|
507
|
+
with request.urlopen(req, timeout=30) as resp: # noqa: S310
|
|
508
508
|
parsed = json.loads(resp.read())
|
|
509
|
-
except (
|
|
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
|
|
{agentops_accelerator-0.8.0 → agentops_accelerator-0.8.2}/src/agentops/pipeline/invocations.py
RENAMED
|
@@ -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
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
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:
|
|
@@ -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
|
-
|
|
314
|
-
|
|
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": [
|