agentops-accelerator 0.3.3__tar.gz → 0.3.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.claude-plugin/marketplace.json +1 -1
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/plugin/marketplace.json +1 -1
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/CHANGELOG.md +52 -0
- {agentops_accelerator-0.3.3/src/agentops_accelerator.egg-info → agentops_accelerator-0.3.5}/PKG-INFO +1 -1
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/tutorial-end-to-end.md +28 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/tutorial-hosted-agent-quickstart.md +26 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/tutorial-prompt-agent-quickstart.md +34 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/package.json +1 -1
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/plugin.json +1 -1
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/skills/agentops-eval/SKILL.md +48 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/runtime.py +22 -2
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/skills/agentops-eval/SKILL.md +48 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/azure_endpoints.py +32 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5/src/agentops_accelerator.egg-info}/PKG-INFO +1 -1
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops_accelerator.egg-info/SOURCES.txt +1 -0
- agentops_accelerator-0.3.5/tests/unit/test_azure_endpoints.py +117 -0
- agentops_accelerator-0.3.5/tests/unit/test_runtime_model_config.py +100 -0
- agentops_accelerator-0.3.3/tests/unit/test_azure_endpoints.py +0 -54
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.gitattributes +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/actions/azure-oidc-login/action.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/code-quality-py.instructions.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/copilot-instructions.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/dependabot.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/extensions/agentops-skills/extension.mjs +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/skills/release-management/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/_build.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/ci.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/cut-release.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/e2e.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/release.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.github/workflows/staging.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.gitignore +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.pre-commit-config.yaml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.vscode/launch.json +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.vscode/settings.json +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/.vscode/tasks.json +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/AGENTS.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/CONTRIBUTING.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/LICENSE +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/README.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/SECURITY.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/bundles.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/ci-github-actions.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/concepts.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/doctor-checks.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/doctor-explained.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/e2e-live-architecture.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/e2e-live-setup.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/foundry-evaluation-sdk-built-in-evaluators.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/how-it-works.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/media/agentops-diagrams.vsdx +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/media/foundry-control-plane.png +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/release-process.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/examples/flat-quickstart/README.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/examples/flat-quickstart/agentops.yaml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/examples/flat-quickstart/dataset.jsonl +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/icon.png +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/infra/e2e/agent-app/Dockerfile +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/infra/e2e/agent-app/app.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/infra/e2e/agent-app/requirements.txt +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/infra/e2e/bootstrap.bicep +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/infra/e2e/bootstrap.parameters.example.json +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/infra/e2e/perrun.bicep +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/launch.json +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/media/foundry.svg +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/media/quickstart.gif +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/.vscodeignore +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/LICENSE +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/README.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/skills/agentops-agent/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/skills/agentops-config/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/skills/agentops-dataset/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/skills/agentops-report/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/plugins/agentops/skills/agentops-workflow/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/pyproject.toml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/create_support_agent.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/cut-release.ps1 +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/cut-release.sh +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_aggregate_summary.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_data/basic.jsonl +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_data/rag.jsonl +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_data/tools.jsonl +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_demo.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_hosted_agent.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_make_transcript.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/e2e_render_config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/release.ps1 +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/release.sh +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/setup-e2e-new-tenant.ps1 +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/staging.ps1 +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/staging.sh +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/sync-skills.ps1 +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/scripts/sync-skills.sh +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/setup.cfg +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/__main__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/_legacy_ids.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/analyzer.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/catalog.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/errors.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/foundry_config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/latency.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/opex.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/opex_workspace.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture_rules/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture_rules/content_filter.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture_rules/diagnostics.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture_rules/local_auth.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture_rules/managed_identity.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/posture_rules/network.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/regression.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/release_readiness.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/safety.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/checks/spec_conformance.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/cockpit.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/findings.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/history.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/knowledge/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/knowledge/waf-checklist.csv +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_base.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_bundle_rule.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_client.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_dataset_rules.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_engine.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_prompt_rules.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/llm_assist/_spec_rules.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/production_telemetry.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/report.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/server/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/server/app.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/server/auth.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/server/chat.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/server/protocol.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/azure_monitor.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/azure_resources.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/foundry_control.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/results_history.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/spec_detectors/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/spec_detectors/_base.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/spec_detectors/agents_md.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/sources/spec_detectors/spec_kit.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/agent/time_range.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/cli/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/cli/app.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/core/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/core/agentops_config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/core/config_loader.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/core/evaluators.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/core/release_evidence.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/core/results.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/mcp/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/mcp/server.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/cloud_results.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/cloud_runner.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/comparison.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/diagnostics.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/invocations.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/official_eval.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/orchestrator.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/prompt_deploy.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/publisher.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/reporter.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/pipeline/thresholds.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/cicd.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/eval_analysis.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/evidence_pack.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/initializer.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/preflight.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/setup_wizard.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/skills.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/trace_promotion.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/services/workflow_analysis.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/.gitignore +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/agent-server/Dockerfile +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/agent-server/README.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/agent-server/main.bicep +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/agent.yaml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/agentops.yaml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/foundry.svg +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/icon.png +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev-azd.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-dev.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod-azd.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prod.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-prompt-agent.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa-azd.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-deploy-qa.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-pr-prompt-agent.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-pr.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/pipelines/azuredevops/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/project.gitignore +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/sample-traces.jsonl +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/skills/agentops-agent/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/skills/agentops-config/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/skills/agentops-dataset/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/skills/agentops-report/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/skills/agentops-workflow/SKILL.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/smoke.jsonl +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/waf-checklist.README.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/waf-checklist.csv +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-dev-azd.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-dev.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-prod-azd.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-prod.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-prompt-agent.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-qa-azd.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-deploy-qa.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-pr-prompt-agent.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-pr.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/templates/workflows/agentops-watchdog.yml +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/__init__.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/azd_env.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/colors.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/dotenv_loader.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/foundry_discovery.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/logging.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/telemetry.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/yaml.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops_accelerator.egg-info/dependency_links.txt +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops_accelerator.egg-info/entry_points.txt +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops_accelerator.egg-info/requires.txt +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops_accelerator.egg-info/top_level.txt +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/TESTING.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/fixtures/fake_adapter.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/fixtures/fake_eval_runner.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/integration/.gitkeep +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/integration/test_cli_flat_schema.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/integration/test_pipeline_smoke.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/.gitkeep +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_analyzer.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_categories.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_errors.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_foundry_config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_opex.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_opex_workspace.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_regression.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_safety.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_checks_spec_conformance.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_cli.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_findings.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_history.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_opex_workspace_check.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_posture_rules.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_results_history.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agent_server.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_agentops_config.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_azd_env.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_azure_resources_discovery.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cicd.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cli_cockpit_connection_summary.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cli_cockpit_port_conflict.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cli_commands.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cli_explain.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cloud_results.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cloud_runner.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_cockpit.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_diagnostics.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_doctor_catalog.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_doctor_cli_explain.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_dotenv_loader.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_e2e_render.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_eval_analysis.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_evaluators.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_foundry_discovery.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_init_command.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_initializer.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_invocations.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_knowledge_loader.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_llm_assist.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_llm_assist_spec_rules.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_mcp_server.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_official_eval.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_pipeline_publisher.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_pipeline_reporter.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_preflight.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_production_telemetry.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_prompt_deploy.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_release_evidence.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_runtime_conversation.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_setup_wizard.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_skills.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_skills_sync.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_telemetry.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_time_range.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_trace_promotion.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tests/unit/test_workflow_analysis.py +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/tombstones/vscode/CDN_DEPRECATION_REQUEST.md +0 -0
- {agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/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.3.
|
|
16
|
+
"version": "0.3.5",
|
|
17
17
|
"keywords": [
|
|
18
18
|
"agentops",
|
|
19
19
|
"evaluation",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"name": "agentops-accelerator",
|
|
14
14
|
"source": "../../plugins/agentops",
|
|
15
15
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Toolkit and Microsoft Foundry agents.",
|
|
16
|
-
"version": "0.3.
|
|
16
|
+
"version": "0.3.5",
|
|
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.3.5] - 2026-06-01
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **`agentops-eval` coding-agent skill now preflights the data-plane RBAC
|
|
12
|
+
step that the Foundry portal does not assign by default.** Creating a
|
|
13
|
+
Foundry project through the portal only grants the user `Foundry User`
|
|
14
|
+
at the *project* scope, which does not cover
|
|
15
|
+
`Microsoft.CognitiveServices/accounts/OpenAI/deployments/chat/completions/action`
|
|
16
|
+
on the parent AI Services account where chat completions actually live.
|
|
17
|
+
Subscription `Owner` is also insufficient because the built-in `Owner`
|
|
18
|
+
role definition has `actions: ["*"]` but `dataActions: []`. The first
|
|
19
|
+
`agentops eval run` against a fresh workspace therefore failed with
|
|
20
|
+
`PermissionDenied` on every AI-assisted evaluator and every cloud-eval
|
|
21
|
+
grader. The skill's new **Step 0.5 - Ensure data-plane RBAC on the AI
|
|
22
|
+
Services account** resolves the Foundry project endpoint from
|
|
23
|
+
`.azure/<env>/.env` or `.agentops/.env`, looks up the backing AI
|
|
24
|
+
Services account + resource group with
|
|
25
|
+
`az cognitiveservices account list`, fetches the signed-in object ID
|
|
26
|
+
with `az ad signed-in-user show`, and runs an idempotent
|
|
27
|
+
`az role assignment create` for `Cognitive Services OpenAI User` at
|
|
28
|
+
the resource-group scope before handing off to `agentops eval analyze`.
|
|
29
|
+
This keeps the skill experience consistent with the new manual
|
|
30
|
+
instructions added to the prompt-agent, hosted-agent, and end-to-end
|
|
31
|
+
tutorials, so users running the skill against a fresh Foundry project
|
|
32
|
+
no longer hit the same 401 the manual tutorials previously hid.
|
|
33
|
+
|
|
34
|
+
## [0.3.4] - 2026-06-01
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
- **`agentops eval run` in local execution mode no longer fails with
|
|
38
|
+
`Missing environment variables: AZURE_OPENAI_ENDPOINT` when only the
|
|
39
|
+
Foundry project endpoint is configured.** `CONTRIBUTING.md` and the
|
|
40
|
+
user-facing env-var docs both stated that `AZURE_OPENAI_ENDPOINT` is
|
|
41
|
+
"auto-derived from the project endpoint when absent", but
|
|
42
|
+
`pipeline/runtime.py::_model_config` only read the explicit
|
|
43
|
+
`AZURE_OPENAI_ENDPOINT` env var with no fallback — so a fresh workspace
|
|
44
|
+
created by `agentops init` (which writes `AZURE_AI_FOUNDRY_PROJECT_ENDPOINT`
|
|
45
|
+
but not `AZURE_OPENAI_ENDPOINT`) would always trip the missing-env error
|
|
46
|
+
the first time AI-assisted evaluators tried to run locally. The new
|
|
47
|
+
helper `agentops.utils.azure_endpoints.derive_openai_endpoint_from_project`
|
|
48
|
+
trims the trailing `/api/projects/<name>` segment from a Foundry project
|
|
49
|
+
URL (covering both `services.ai.azure.com` and the legacy
|
|
50
|
+
`cognitiveservices.azure.com` hosts) to recover the AI Services account
|
|
51
|
+
base URL, which is exactly what the `openai` and `azure-ai-evaluation`
|
|
52
|
+
SDKs want. `_model_config` now uses the derived value as a fallback
|
|
53
|
+
whenever `AZURE_OPENAI_ENDPOINT` is unset, so the documented behavior
|
|
54
|
+
finally matches the runtime. When `AZURE_OPENAI_DEPLOYMENT` is the only
|
|
55
|
+
thing missing, the error message now points users at the deployment list
|
|
56
|
+
in the Foundry portal *and* mentions the `execution: cloud` escape hatch
|
|
57
|
+
in `agentops.yaml` so the next step is obvious without leaving the
|
|
58
|
+
terminal.
|
|
59
|
+
|
|
8
60
|
## [0.3.3] - 2026-05-31
|
|
9
61
|
|
|
10
62
|
### Changed
|
|
@@ -286,6 +286,34 @@ for creating agents, tools, tracing, evaluation, and red-team scans:
|
|
|
286
286
|
https://github.com/Azure-Samples/microsoft-foundry-e2e-agent-observability-workshop/tree/2026-04-aie-europe
|
|
287
287
|
```
|
|
288
288
|
|
|
289
|
+
### Grant your identity data-plane access to the AI Services account
|
|
290
|
+
|
|
291
|
+
Both options above (prompt agent and hosted HTTP agent) eventually drive
|
|
292
|
+
an `agentops eval run` that calls chat-completions on the AI Services
|
|
293
|
+
account behind your Foundry project — either through Foundry's cloud
|
|
294
|
+
graders or through the local AI-assisted evaluators. Creating a project
|
|
295
|
+
through the portal assigns you `Foundry User` **only at the project
|
|
296
|
+
scope**, which does not cover OpenAI data-plane actions on the parent
|
|
297
|
+
account. Subscription `Owner` is also insufficient: its built-in role
|
|
298
|
+
definition has `actions: ["*"]` but `dataActions: []`. Skipping this is
|
|
299
|
+
what causes the eval to fail later with `PermissionDenied` on
|
|
300
|
+
`Microsoft.CognitiveServices/accounts/OpenAI/deployments/chat/
|
|
301
|
+
completions/action`.
|
|
302
|
+
|
|
303
|
+
Run the assignment once per resource group that hosts a Foundry account
|
|
304
|
+
you will evaluate against. Replace `<your-objectId>`,
|
|
305
|
+
`<subscription-id>`, and `<resource-group>` with your own values (use
|
|
306
|
+
`az ad signed-in-user show --query id -o tsv` to get the object ID):
|
|
307
|
+
|
|
308
|
+
```powershell
|
|
309
|
+
az role assignment create `
|
|
310
|
+
--assignee <your-objectId> `
|
|
311
|
+
--role "Cognitive Services OpenAI User" `
|
|
312
|
+
--scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Propagation usually completes within 30–120 seconds.
|
|
316
|
+
|
|
289
317
|
## 2. Create the travel eval dataset
|
|
290
318
|
|
|
291
319
|
```powershell
|
{agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/tutorial-hosted-agent-quickstart.md
RENAMED
|
@@ -310,6 +310,32 @@ If the deployed endpoint needs a bearer token:
|
|
|
310
310
|
$env:HOSTED_AGENT_TOKEN = "<token>"
|
|
311
311
|
```
|
|
312
312
|
|
|
313
|
+
### Grant your identity data-plane access to the AI Services account
|
|
314
|
+
|
|
315
|
+
The local AI-assisted evaluators that AgentOps runs in step 8 call
|
|
316
|
+
chat-completions on the AI Services account that backs your Foundry
|
|
317
|
+
project. Creating a project through the portal only assigns you
|
|
318
|
+
`Foundry User` **at the project scope**, which does not cover the
|
|
319
|
+
OpenAI data-plane action on the parent account. Even subscription
|
|
320
|
+
`Owner` is insufficient: the built-in `Owner` role has `actions: ["*"]`
|
|
321
|
+
but `dataActions: []`. Skipping this once causes the eval to fail with
|
|
322
|
+
`PermissionDenied` on `Microsoft.CognitiveServices/accounts/OpenAI/
|
|
323
|
+
deployments/chat/completions/action`.
|
|
324
|
+
|
|
325
|
+
Run the assignment once per resource group hosting a Foundry account
|
|
326
|
+
you will evaluate against (replace `<your-objectId>`,
|
|
327
|
+
`<subscription-id>`, and `<resource-group>` with your values; get the
|
|
328
|
+
object ID with `az ad signed-in-user show --query id -o tsv`):
|
|
329
|
+
|
|
330
|
+
```powershell
|
|
331
|
+
az role assignment create `
|
|
332
|
+
--assignee <your-objectId> `
|
|
333
|
+
--role "Cognitive Services OpenAI User" `
|
|
334
|
+
--scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Propagation usually completes within 30–120 seconds.
|
|
338
|
+
|
|
313
339
|
## 5. Initialize AgentOps interactively
|
|
314
340
|
|
|
315
341
|
```powershell
|
{agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/docs/tutorial-prompt-agent-quickstart.md
RENAMED
|
@@ -241,6 +241,40 @@ Show me the planned changes and the resulting endpoints before applying.
|
|
|
241
241
|
|
|
242
242
|
If the skill is not available, use Path A.
|
|
243
243
|
|
|
244
|
+
### Grant your identity data-plane access to the AI Services account
|
|
245
|
+
|
|
246
|
+
Creating a project through the portal only assigns you `Foundry User` **at
|
|
247
|
+
the project scope**. That role does not cover the OpenAI data-plane actions
|
|
248
|
+
that live on the parent AI Services *account* — the chat-completions call
|
|
249
|
+
that backs every AI-assisted evaluator and every cloud-eval grader. Even
|
|
250
|
+
`Owner` on the subscription is not enough: the built-in `Owner` role
|
|
251
|
+
definition has `actions: ["*"]` but `dataActions: []`, so it grants full
|
|
252
|
+
control plane and zero data plane on Cognitive Services accounts.
|
|
253
|
+
|
|
254
|
+
Skipping this step is what causes the eval grader to fail later with::
|
|
255
|
+
|
|
256
|
+
PermissionDenied: The principal `<your-objectId>` lacks the required
|
|
257
|
+
data action `Microsoft.CognitiveServices/accounts/OpenAI/deployments/
|
|
258
|
+
chat/completions/action` to perform `POST /openai/deployments/...`
|
|
259
|
+
|
|
260
|
+
Run the assignment once per resource group that hosts a Foundry account
|
|
261
|
+
you will evaluate against. Replace `<your-objectId>`, `<subscription-id>`,
|
|
262
|
+
and `<resource-group>` with your own values (you can get the object ID
|
|
263
|
+
with `az ad signed-in-user show --query id -o tsv`):
|
|
264
|
+
|
|
265
|
+
```powershell
|
|
266
|
+
az role assignment create `
|
|
267
|
+
--assignee <your-objectId> `
|
|
268
|
+
--role "Cognitive Services OpenAI User" `
|
|
269
|
+
--scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Repeat the command with the `travel-agent-dev` resource group if the dev
|
|
273
|
+
project lives in a different RG. The assignment usually propagates within
|
|
274
|
+
30–120 seconds. AgentOps Doctor will detect the missing assignment in a
|
|
275
|
+
future release, but until then this is a manual one-time setup step per
|
|
276
|
+
new environment.
|
|
277
|
+
|
|
244
278
|
## 4. Seed `travel-agent` in the sandbox project
|
|
245
279
|
|
|
246
280
|
You only author the agent in **one place**: your sandbox Foundry
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "agentops-accelerator",
|
|
3
3
|
"displayName": "AgentOps Accelerator — Skills for GitHub Copilot",
|
|
4
4
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Accelerator and Microsoft Foundry agents.",
|
|
5
|
-
"version": "0.3.
|
|
5
|
+
"version": "0.3.5",
|
|
6
6
|
"publisher": "AgentOpsAccelerator",
|
|
7
7
|
"icon": "icon.png",
|
|
8
8
|
"license": "MIT",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentops-accelerator",
|
|
3
3
|
"description": "Copilot agent skills for running standardized evaluation workflows with AgentOps Accelerator and Microsoft Foundry agents.",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.5",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "AgentOps Accelerator",
|
|
7
7
|
"url": "https://github.com/Azure/agentops"
|
|
@@ -25,6 +25,54 @@ with a `name:version` or URL.
|
|
|
25
25
|
(`--project-endpoint`, `--agent`, `--dataset`, …) for non-interactive
|
|
26
26
|
runs. Run `agentops init show` later to inspect the resolved config.
|
|
27
27
|
|
|
28
|
+
## Step 0.5 - Ensure data-plane RBAC on the AI Services account
|
|
29
|
+
|
|
30
|
+
AgentOps eval (cloud graders **and** local AI-assisted evaluators) calls
|
|
31
|
+
`/openai/deployments/.../chat/completions` on the AI Services account
|
|
32
|
+
that backs the Foundry project. Creating a project through the Foundry
|
|
33
|
+
portal only assigns the user `Foundry User` at the *project* scope,
|
|
34
|
+
which does **not** cover OpenAI data-plane actions on the parent
|
|
35
|
+
account. Subscription `Owner` is also insufficient because the built-in
|
|
36
|
+
`Owner` role has `actions: ["*"]` but `dataActions: []`. The first
|
|
37
|
+
`agentops eval run` against a fresh workspace will otherwise fail with:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
PermissionDenied … lacks the required data action
|
|
41
|
+
'Microsoft.CognitiveServices/accounts/OpenAI/deployments/chat/completions/action'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Run this preflight before Step 1 - it is idempotent (Azure returns
|
|
45
|
+
`RoleAssignmentExists` if already granted) and takes ~5 seconds:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 1. Resolve the AI Services account from agentops.yaml / .azure/<env>/.env
|
|
49
|
+
PROJECT_ENDPOINT=$(grep -h '^AZURE_AI_FOUNDRY_PROJECT_ENDPOINT' .azure/*/.env .agentops/.env 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '"')
|
|
50
|
+
ACCOUNT_HOST=$(echo "$PROJECT_ENDPOINT" | awk -F[/:] '{print $4}')
|
|
51
|
+
ACCOUNT_NAME=$(echo "$ACCOUNT_HOST" | cut -d. -f1)
|
|
52
|
+
|
|
53
|
+
# 2. Resolve subscription, resource group, and signed-in object ID
|
|
54
|
+
SUB_ID=$(az account show --query id -o tsv)
|
|
55
|
+
RG=$(az cognitiveservices account list --subscription "$SUB_ID" --query "[?name=='$ACCOUNT_NAME'].resourceGroup | [0]" -o tsv)
|
|
56
|
+
OBJ_ID=$(az ad signed-in-user show --query id -o tsv)
|
|
57
|
+
|
|
58
|
+
# 3. Grant data-plane access at the RG scope (covers sandbox + future evals)
|
|
59
|
+
az role assignment create \
|
|
60
|
+
--assignee "$OBJ_ID" \
|
|
61
|
+
--role "Cognitive Services OpenAI User" \
|
|
62
|
+
--scope "/subscriptions/$SUB_ID/resourceGroups/$RG"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
PowerShell equivalent: replace `$(...)` with the PowerShell variable
|
|
66
|
+
assignments shown in `docs/tutorial-prompt-agent-quickstart.md`.
|
|
67
|
+
|
|
68
|
+
If the user has not run `az login` yet, do that first. If
|
|
69
|
+
`az cognitiveservices account list` returns an empty RG, the AI Services
|
|
70
|
+
account lives in a different subscription - ask the user which one.
|
|
71
|
+
|
|
72
|
+
Skip this step only if the user explicitly says the role is already
|
|
73
|
+
assigned, or if a previous `agentops eval run` succeeded against the
|
|
74
|
+
same Foundry account.
|
|
75
|
+
|
|
28
76
|
## Step 1 - Analyze evaluation setup
|
|
29
77
|
|
|
30
78
|
Run the deterministic local triage first:
|
|
@@ -65,10 +65,22 @@ def _credential() -> Any:
|
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
def _model_config() -> Dict[str, str]:
|
|
68
|
-
from agentops.utils.azure_endpoints import
|
|
68
|
+
from agentops.utils.azure_endpoints import (
|
|
69
|
+
derive_openai_endpoint_from_project,
|
|
70
|
+
normalize_azure_openai_endpoint,
|
|
71
|
+
)
|
|
69
72
|
|
|
70
73
|
raw_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
|
|
71
74
|
endpoint = normalize_azure_openai_endpoint(raw_endpoint)
|
|
75
|
+
if not endpoint:
|
|
76
|
+
# CONTRIBUTING.md promises ``AZURE_OPENAI_ENDPOINT`` is "auto-derived
|
|
77
|
+
# from the project endpoint when absent". The Foundry project URL
|
|
78
|
+
# already encodes the AI Services account host, so we can recover
|
|
79
|
+
# the base inference endpoint without an extra round-trip or any
|
|
80
|
+
# new wizard prompt.
|
|
81
|
+
endpoint = derive_openai_endpoint_from_project(
|
|
82
|
+
os.getenv("AZURE_AI_FOUNDRY_PROJECT_ENDPOINT")
|
|
83
|
+
)
|
|
72
84
|
deployment = os.getenv("AZURE_OPENAI_DEPLOYMENT") or os.getenv(
|
|
73
85
|
"AZURE_AI_MODEL_DEPLOYMENT_NAME"
|
|
74
86
|
)
|
|
@@ -85,9 +97,17 @@ def _model_config() -> Dict[str, str]:
|
|
|
85
97
|
if not deployment:
|
|
86
98
|
missing.append("AZURE_OPENAI_DEPLOYMENT")
|
|
87
99
|
if missing:
|
|
100
|
+
hint = ""
|
|
101
|
+
if "AZURE_OPENAI_DEPLOYMENT" in missing:
|
|
102
|
+
hint = (
|
|
103
|
+
" Set AZURE_OPENAI_DEPLOYMENT to the name of a model "
|
|
104
|
+
"deployment in your Foundry project (Models + endpoints "
|
|
105
|
+
"in the portal), or switch the run to `execution: cloud` "
|
|
106
|
+
"in agentops.yaml so Foundry runs the evaluators server-side."
|
|
107
|
+
)
|
|
88
108
|
raise RuntimeError(
|
|
89
109
|
"AI-assisted evaluators require an evaluator model. "
|
|
90
|
-
"Missing environment variables: " + ", ".join(missing)
|
|
110
|
+
"Missing environment variables: " + ", ".join(missing) + "." + hint
|
|
91
111
|
)
|
|
92
112
|
|
|
93
113
|
config: Dict[str, str] = {
|
|
@@ -25,6 +25,54 @@ with a `name:version` or URL.
|
|
|
25
25
|
(`--project-endpoint`, `--agent`, `--dataset`, …) for non-interactive
|
|
26
26
|
runs. Run `agentops init show` later to inspect the resolved config.
|
|
27
27
|
|
|
28
|
+
## Step 0.5 - Ensure data-plane RBAC on the AI Services account
|
|
29
|
+
|
|
30
|
+
AgentOps eval (cloud graders **and** local AI-assisted evaluators) calls
|
|
31
|
+
`/openai/deployments/.../chat/completions` on the AI Services account
|
|
32
|
+
that backs the Foundry project. Creating a project through the Foundry
|
|
33
|
+
portal only assigns the user `Foundry User` at the *project* scope,
|
|
34
|
+
which does **not** cover OpenAI data-plane actions on the parent
|
|
35
|
+
account. Subscription `Owner` is also insufficient because the built-in
|
|
36
|
+
`Owner` role has `actions: ["*"]` but `dataActions: []`. The first
|
|
37
|
+
`agentops eval run` against a fresh workspace will otherwise fail with:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
PermissionDenied … lacks the required data action
|
|
41
|
+
'Microsoft.CognitiveServices/accounts/OpenAI/deployments/chat/completions/action'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Run this preflight before Step 1 - it is idempotent (Azure returns
|
|
45
|
+
`RoleAssignmentExists` if already granted) and takes ~5 seconds:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 1. Resolve the AI Services account from agentops.yaml / .azure/<env>/.env
|
|
49
|
+
PROJECT_ENDPOINT=$(grep -h '^AZURE_AI_FOUNDRY_PROJECT_ENDPOINT' .azure/*/.env .agentops/.env 2>/dev/null | tail -1 | cut -d= -f2- | tr -d '"')
|
|
50
|
+
ACCOUNT_HOST=$(echo "$PROJECT_ENDPOINT" | awk -F[/:] '{print $4}')
|
|
51
|
+
ACCOUNT_NAME=$(echo "$ACCOUNT_HOST" | cut -d. -f1)
|
|
52
|
+
|
|
53
|
+
# 2. Resolve subscription, resource group, and signed-in object ID
|
|
54
|
+
SUB_ID=$(az account show --query id -o tsv)
|
|
55
|
+
RG=$(az cognitiveservices account list --subscription "$SUB_ID" --query "[?name=='$ACCOUNT_NAME'].resourceGroup | [0]" -o tsv)
|
|
56
|
+
OBJ_ID=$(az ad signed-in-user show --query id -o tsv)
|
|
57
|
+
|
|
58
|
+
# 3. Grant data-plane access at the RG scope (covers sandbox + future evals)
|
|
59
|
+
az role assignment create \
|
|
60
|
+
--assignee "$OBJ_ID" \
|
|
61
|
+
--role "Cognitive Services OpenAI User" \
|
|
62
|
+
--scope "/subscriptions/$SUB_ID/resourceGroups/$RG"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
PowerShell equivalent: replace `$(...)` with the PowerShell variable
|
|
66
|
+
assignments shown in `docs/tutorial-prompt-agent-quickstart.md`.
|
|
67
|
+
|
|
68
|
+
If the user has not run `az login` yet, do that first. If
|
|
69
|
+
`az cognitiveservices account list` returns an empty RG, the AI Services
|
|
70
|
+
account lives in a different subscription - ask the user which one.
|
|
71
|
+
|
|
72
|
+
Skip this step only if the user explicitly says the role is already
|
|
73
|
+
assigned, or if a previous `agentops eval run` succeeded against the
|
|
74
|
+
same Foundry account.
|
|
75
|
+
|
|
28
76
|
## Step 1 - Analyze evaluation setup
|
|
29
77
|
|
|
30
78
|
Run the deterministic local triage first:
|
{agentops_accelerator-0.3.3 → agentops_accelerator-0.3.5}/src/agentops/utils/azure_endpoints.py
RENAMED
|
@@ -60,3 +60,35 @@ def normalize_azure_openai_endpoint(value: Optional[str]) -> Optional[str]:
|
|
|
60
60
|
# Trim any straggling trailing slash so callers building paths
|
|
61
61
|
# never get a doubled ``//``.
|
|
62
62
|
return rewritten.rstrip("/")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Foundry project endpoints look like
|
|
66
|
+
# ``https://<account>.services.ai.azure.com/api/projects/<project>`` (or the
|
|
67
|
+
# legacy ``cognitiveservices.azure.com`` host). The Azure OpenAI inference
|
|
68
|
+
# endpoint that the ``openai`` and ``azure-ai-evaluation`` SDKs want is the
|
|
69
|
+
# *account* base URL — i.e. the same scheme/host with the project path
|
|
70
|
+
# trimmed off. ``derive_openai_endpoint_from_project`` performs that trim so
|
|
71
|
+
# users who only configure ``AZURE_AI_FOUNDRY_PROJECT_ENDPOINT`` (the value
|
|
72
|
+
# the ``agentops init`` wizard already writes) get a working AI-assisted
|
|
73
|
+
# evaluator run without having to hand-author ``AZURE_OPENAI_ENDPOINT`` too.
|
|
74
|
+
_PROJECT_PATH_RE = re.compile(r"/api/projects/[^/?#]+/*\Z", re.IGNORECASE)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def derive_openai_endpoint_from_project(value: Optional[str]) -> Optional[str]:
|
|
78
|
+
"""Return the Azure OpenAI base URL embedded in a Foundry project endpoint.
|
|
79
|
+
|
|
80
|
+
The function is conservative: it only rewrites URLs whose final path
|
|
81
|
+
segment matches ``/api/projects/<project>`` exactly. Anything else
|
|
82
|
+
(already-base URLs, URLs with extra path segments after the project
|
|
83
|
+
name, non-Foundry hosts) is returned untouched apart from a normalizing
|
|
84
|
+
pass through :func:`normalize_azure_openai_endpoint`. ``None`` and
|
|
85
|
+
empty strings pass through unchanged so callers can keep the
|
|
86
|
+
``os.getenv`` ergonomic of ``derive_openai_endpoint_from_project(os.getenv(...))``.
|
|
87
|
+
"""
|
|
88
|
+
if value is None:
|
|
89
|
+
return None
|
|
90
|
+
stripped = value.strip()
|
|
91
|
+
if not stripped:
|
|
92
|
+
return stripped
|
|
93
|
+
trimmed = _PROJECT_PATH_RE.sub("", stripped)
|
|
94
|
+
return normalize_azure_openai_endpoint(trimmed)
|
|
@@ -285,6 +285,7 @@ tests/unit/test_production_telemetry.py
|
|
|
285
285
|
tests/unit/test_prompt_deploy.py
|
|
286
286
|
tests/unit/test_release_evidence.py
|
|
287
287
|
tests/unit/test_runtime_conversation.py
|
|
288
|
+
tests/unit/test_runtime_model_config.py
|
|
288
289
|
tests/unit/test_setup_wizard.py
|
|
289
290
|
tests/unit/test_skills.py
|
|
290
291
|
tests/unit/test_skills_sync.py
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""Tests for :mod:`agentops.utils.azure_endpoints`."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from agentops.utils.azure_endpoints import (
|
|
8
|
+
derive_openai_endpoint_from_project,
|
|
9
|
+
normalize_azure_openai_endpoint,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.mark.parametrize(
|
|
14
|
+
"raw, expected",
|
|
15
|
+
[
|
|
16
|
+
# Already-clean values are returned untouched (apart from trailing slash).
|
|
17
|
+
("https://x.openai.azure.com", "https://x.openai.azure.com"),
|
|
18
|
+
("https://x.openai.azure.com/", "https://x.openai.azure.com"),
|
|
19
|
+
# The portal-style suffix is stripped.
|
|
20
|
+
("https://x.openai.azure.com/openai/v1", "https://x.openai.azure.com"),
|
|
21
|
+
("https://x.openai.azure.com/openai/v1/", "https://x.openai.azure.com"),
|
|
22
|
+
("https://x.openai.azure.com/openai/v1//", "https://x.openai.azure.com"),
|
|
23
|
+
# Other well-known variants.
|
|
24
|
+
("https://x.openai.azure.com/openai", "https://x.openai.azure.com"),
|
|
25
|
+
("https://x.openai.azure.com/openai/", "https://x.openai.azure.com"),
|
|
26
|
+
(
|
|
27
|
+
"https://x.openai.azure.com/openai/deployments",
|
|
28
|
+
"https://x.openai.azure.com",
|
|
29
|
+
),
|
|
30
|
+
# Case-insensitive suffix match.
|
|
31
|
+
("https://x.openai.azure.com/OpenAI/V1", "https://x.openai.azure.com"),
|
|
32
|
+
# The AI Services proxy host is also accepted.
|
|
33
|
+
(
|
|
34
|
+
"https://aif-prj.cognitiveservices.azure.com/openai/v1",
|
|
35
|
+
"https://aif-prj.cognitiveservices.azure.com",
|
|
36
|
+
),
|
|
37
|
+
# Whitespace is trimmed.
|
|
38
|
+
(" https://x.openai.azure.com/openai/v1 ", "https://x.openai.azure.com"),
|
|
39
|
+
],
|
|
40
|
+
)
|
|
41
|
+
def test_normalize_strips_known_suffixes(raw: str, expected: str) -> None:
|
|
42
|
+
assert normalize_azure_openai_endpoint(raw) == expected
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_normalize_passes_through_none() -> None:
|
|
46
|
+
assert normalize_azure_openai_endpoint(None) is None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_normalize_passes_through_empty_string() -> None:
|
|
50
|
+
assert normalize_azure_openai_endpoint("") == ""
|
|
51
|
+
assert normalize_azure_openai_endpoint(" ") == ""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_normalize_only_strips_at_the_end() -> None:
|
|
55
|
+
# A path containing "openai" earlier in the URL must not be touched.
|
|
56
|
+
raw = "https://proxy.example.com/openai/v1/extra"
|
|
57
|
+
assert normalize_azure_openai_endpoint(raw) == raw.rstrip("/")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@pytest.mark.parametrize(
|
|
61
|
+
"raw, expected",
|
|
62
|
+
[
|
|
63
|
+
# Canonical Foundry project endpoint (services.ai.azure.com host).
|
|
64
|
+
(
|
|
65
|
+
"https://ai-account-xyz.services.ai.azure.com/api/projects/proj-default",
|
|
66
|
+
"https://ai-account-xyz.services.ai.azure.com",
|
|
67
|
+
),
|
|
68
|
+
# Trailing slash on the project segment.
|
|
69
|
+
(
|
|
70
|
+
"https://ai-account-xyz.services.ai.azure.com/api/projects/proj-default/",
|
|
71
|
+
"https://ai-account-xyz.services.ai.azure.com",
|
|
72
|
+
),
|
|
73
|
+
# Legacy cognitiveservices host.
|
|
74
|
+
(
|
|
75
|
+
"https://acct.cognitiveservices.azure.com/api/projects/p1",
|
|
76
|
+
"https://acct.cognitiveservices.azure.com",
|
|
77
|
+
),
|
|
78
|
+
# Project names may include hyphens and digits.
|
|
79
|
+
(
|
|
80
|
+
"https://acct.services.ai.azure.com/api/projects/travel-agent-sandbox",
|
|
81
|
+
"https://acct.services.ai.azure.com",
|
|
82
|
+
),
|
|
83
|
+
# Case-insensitive match on the ``/api/projects/`` segment.
|
|
84
|
+
(
|
|
85
|
+
"https://acct.services.ai.azure.com/API/Projects/p1",
|
|
86
|
+
"https://acct.services.ai.azure.com",
|
|
87
|
+
),
|
|
88
|
+
# Already a base URL — passed through unchanged (apart from trailing slash).
|
|
89
|
+
(
|
|
90
|
+
"https://acct.services.ai.azure.com",
|
|
91
|
+
"https://acct.services.ai.azure.com",
|
|
92
|
+
),
|
|
93
|
+
# Already a base URL with the OpenAI inference suffix — still normalized.
|
|
94
|
+
(
|
|
95
|
+
"https://acct.services.ai.azure.com/openai/v1",
|
|
96
|
+
"https://acct.services.ai.azure.com",
|
|
97
|
+
),
|
|
98
|
+
],
|
|
99
|
+
)
|
|
100
|
+
def test_derive_openai_endpoint_from_project(raw: str, expected: str) -> None:
|
|
101
|
+
assert derive_openai_endpoint_from_project(raw) == expected
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_derive_openai_endpoint_from_project_passes_through_none() -> None:
|
|
105
|
+
assert derive_openai_endpoint_from_project(None) is None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_derive_openai_endpoint_from_project_passes_through_empty() -> None:
|
|
109
|
+
assert derive_openai_endpoint_from_project("") == ""
|
|
110
|
+
assert derive_openai_endpoint_from_project(" ") == ""
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def test_derive_openai_endpoint_from_project_keeps_extra_path() -> None:
|
|
114
|
+
# Only the final ``/api/projects/<name>`` segment is trimmed; an endpoint
|
|
115
|
+
# carrying additional sub-paths (e.g. an explicit agent path) is left as-is.
|
|
116
|
+
raw = "https://acct.services.ai.azure.com/api/projects/proj/agents/foo"
|
|
117
|
+
assert derive_openai_endpoint_from_project(raw) == raw.rstrip("/")
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Tests for :func:`agentops.pipeline.runtime._model_config`.
|
|
2
|
+
|
|
3
|
+
The covered behavior:
|
|
4
|
+
|
|
5
|
+
* ``AZURE_OPENAI_ENDPOINT`` is preferred when explicitly set.
|
|
6
|
+
* When absent, the endpoint is auto-derived from
|
|
7
|
+
``AZURE_AI_FOUNDRY_PROJECT_ENDPOINT`` — the CONTRIBUTING-stated promise
|
|
8
|
+
that ``agentops init`` already satisfies for the project endpoint.
|
|
9
|
+
* When neither is available the error mentions both missing variables and
|
|
10
|
+
hints the ``execution: cloud`` escape hatch for the deployment-only case.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
|
|
17
|
+
from agentops.pipeline.runtime import _model_config
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@pytest.fixture(autouse=True)
|
|
21
|
+
def _clear_env(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
22
|
+
for key in (
|
|
23
|
+
"AZURE_OPENAI_ENDPOINT",
|
|
24
|
+
"AZURE_OPENAI_DEPLOYMENT",
|
|
25
|
+
"AZURE_AI_MODEL_DEPLOYMENT_NAME",
|
|
26
|
+
"AZURE_AI_FOUNDRY_PROJECT_ENDPOINT",
|
|
27
|
+
"AZURE_OPENAI_API_VERSION",
|
|
28
|
+
):
|
|
29
|
+
monkeypatch.delenv(key, raising=False)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_explicit_openai_endpoint_wins(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
33
|
+
monkeypatch.setenv("AZURE_OPENAI_ENDPOINT", "https://explicit.openai.azure.com")
|
|
34
|
+
monkeypatch.setenv("AZURE_OPENAI_DEPLOYMENT", "gpt-4o-mini")
|
|
35
|
+
monkeypatch.setenv(
|
|
36
|
+
"AZURE_AI_FOUNDRY_PROJECT_ENDPOINT",
|
|
37
|
+
"https://different.services.ai.azure.com/api/projects/p1",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
cfg = _model_config()
|
|
41
|
+
|
|
42
|
+
assert cfg["azure_endpoint"] == "https://explicit.openai.azure.com"
|
|
43
|
+
assert cfg["azure_deployment"] == "gpt-4o-mini"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_endpoint_auto_derived_from_project(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
47
|
+
monkeypatch.setenv(
|
|
48
|
+
"AZURE_AI_FOUNDRY_PROJECT_ENDPOINT",
|
|
49
|
+
"https://ai-account-xyz.services.ai.azure.com/api/projects/proj-default",
|
|
50
|
+
)
|
|
51
|
+
monkeypatch.setenv("AZURE_OPENAI_DEPLOYMENT", "gpt-4o-mini")
|
|
52
|
+
|
|
53
|
+
cfg = _model_config()
|
|
54
|
+
|
|
55
|
+
assert cfg["azure_endpoint"] == "https://ai-account-xyz.services.ai.azure.com"
|
|
56
|
+
assert cfg["azure_deployment"] == "gpt-4o-mini"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_missing_deployment_still_raises_with_hint(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
60
|
+
monkeypatch.setenv(
|
|
61
|
+
"AZURE_AI_FOUNDRY_PROJECT_ENDPOINT",
|
|
62
|
+
"https://acct.services.ai.azure.com/api/projects/p1",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
with pytest.raises(RuntimeError) as excinfo:
|
|
66
|
+
_model_config()
|
|
67
|
+
|
|
68
|
+
message = str(excinfo.value)
|
|
69
|
+
assert "AZURE_OPENAI_DEPLOYMENT" in message
|
|
70
|
+
assert "AZURE_OPENAI_ENDPOINT" not in message
|
|
71
|
+
# The hint nudges the user toward the cloud-execution escape hatch.
|
|
72
|
+
assert "execution: cloud" in message
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def test_missing_both_lists_endpoint_and_deployment(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
76
|
+
with pytest.raises(RuntimeError) as excinfo:
|
|
77
|
+
_model_config()
|
|
78
|
+
|
|
79
|
+
message = str(excinfo.value)
|
|
80
|
+
assert "AZURE_OPENAI_ENDPOINT" in message
|
|
81
|
+
assert "AZURE_OPENAI_DEPLOYMENT" in message
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_default_api_version_pinned(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
85
|
+
monkeypatch.setenv("AZURE_OPENAI_ENDPOINT", "https://x.openai.azure.com")
|
|
86
|
+
monkeypatch.setenv("AZURE_OPENAI_DEPLOYMENT", "gpt-4o-mini")
|
|
87
|
+
|
|
88
|
+
cfg = _model_config()
|
|
89
|
+
|
|
90
|
+
assert cfg["api_version"] == "2025-04-01-preview"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_api_version_override(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
94
|
+
monkeypatch.setenv("AZURE_OPENAI_ENDPOINT", "https://x.openai.azure.com")
|
|
95
|
+
monkeypatch.setenv("AZURE_OPENAI_DEPLOYMENT", "gpt-4o-mini")
|
|
96
|
+
monkeypatch.setenv("AZURE_OPENAI_API_VERSION", "2024-12-01-preview")
|
|
97
|
+
|
|
98
|
+
cfg = _model_config()
|
|
99
|
+
|
|
100
|
+
assert cfg["api_version"] == "2024-12-01-preview"
|