diff --git a/.github/workflows/smoke-copilot-byok-aoai-apikey.lock.yml b/.github/workflows/smoke-copilot-byok-aoai-apikey.lock.yml index aefc72096..ddb60f30e 100644 --- a/.github/workflows/smoke-copilot-byok-aoai-apikey.lock.yml +++ b/.github/workflows/smoke-copilot-byok-aoai-apikey.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"991dfadca6e513b54820b088ebada1a008a001d893663bdf8538ad1730dc98bc","body_hash":"cee8c86196236442333e4b86df2a757d85728530cba795d37043a8482be0a555","compiler_version":"v0.92.6","strict":true,"engine_base_url_customized":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.98"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"994a9f1b7fff4f088053ca39a3988ef4d78250578d33872786d85282ba86c84c","body_hash":"cee8c86196236442333e4b86df2a757d85728530cba795d37043a8482be0a555","compiler_version":"v0.92.6","strict":true,"engine_base_url_customized":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.98"}} # gh-aw-manifest: {"version":1,"secrets":["FOUNDRY_API_KEY","FOUNDRY_OPENAI_ENDPOINT","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"8b9c5e98dfe3472ac4e3f13e0a2441cd078a2ca7","version":"v0.92.6"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.62","digest":"sha256:80c4ddd927647b636f49807d2557b4cd3ec175c894194e432c9374f5a69e890f","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.62@sha256:80c4ddd927647b636f49807d2557b4cd3ec175c894194e432c9374f5a69e890f"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.62","digest":"sha256:ebb9e7b5bec475f6b6c2eb6e999ada7d41d57d0acbacb8493c5bebc0106fd44d","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.62@sha256:ebb9e7b5bec475f6b6c2eb6e999ada7d41d57d0acbacb8493c5bebc0106fd44d"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.62","digest":"sha256:b145850ed8bdffd2d4fcd8f1f3ea5793b56cadee6989700b91f42cff490630ef","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.62@sha256:b145850ed8bdffd2d4fcd8f1f3ea5793b56cadee6989700b91f42cff490630ef"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.35","digest":"sha256:35e28671836380c0eae52660ea2ad7e5f6659f63cb20d1abae9271656c670858","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.35@sha256:35e28671836380c0eae52660ea2ad7e5f6659f63cb20d1abae9271656c670858"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f","pinned_image":"ghcr.io/github/gh-aw-node@sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f"},{"image":"ghcr.io/github/github-mcp-server:v2.0.2","digest":"sha256:ffced0d76e77428532a2ced185516992d77fd146d69eec2f244e6237d1a97796","pinned_image":"ghcr.io/github/github-mcp-server:v2.0.2@sha256:ffced0d76e77428532a2ced185516992d77fd146d69eec2f244e6237d1a97796"}],"mcp_servers":[{"name":"github","tools":["get_pull_request","get_pull_request_comments","get_pull_request_diff","get_pull_request_files","get_pull_request_review_comments","get_pull_request_reviews","get_pull_request_status","list_pull_requests","pull_request_read","search_pull_requests"]},{"name":"safeoutputs","tools":["add_comment","add_labels","missing_data","missing_tool","noop","report_incomplete"]}],"threat_detection":{"mode":"disabled"}} # This file was automatically generated by gh-aw (v0.92.6). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -27,6 +27,7 @@ # # Frontmatter env variables: # - COPILOT_MODEL: (main workflow) +# - COPILOT_PROVIDER_WIRE_API: (main workflow) # # Secrets used: # - FOUNDRY_API_KEY @@ -84,6 +85,7 @@ run-name: "Smoke Copilot BYOK AOAI (api-key)" env: COPILOT_MODEL: o4-mini-aw + COPILOT_PROVIDER_WIRE_API: responses OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.GH_AW_DEFAULT_OTLP_ENDPOINT || vars.GH_AW_DEFAULT_OTLP_ENDPOINT }} OTEL_SERVICE_NAME: gh-aw.smoke-copilot-byok-aoai-apikey OTEL_RESOURCE_ATTRIBUTES: 'gh-aw.workflow.name=Smoke%20Copilot%20BYOK%20AOAI%20%28api-key%29,gh-aw.repository=${{ github.repository }},gh-aw.run.id=${{ github.run_id }},github.run_id=${{ github.run_id }},gh-aw.engine.id=copilot' diff --git a/.github/workflows/smoke-copilot-byok-aoai-apikey.md b/.github/workflows/smoke-copilot-byok-aoai-apikey.md index 1cc0f0576..2bf68a936 100644 --- a/.github/workflows/smoke-copilot-byok-aoai-apikey.md +++ b/.github/workflows/smoke-copilot-byok-aoai-apikey.md @@ -55,6 +55,8 @@ safe-outputs: timeout-minutes: 15 env: COPILOT_MODEL: o4-mini-aw + # Copilot's chat-completions fallback sends temperature=0, which o4-mini rejects. + COPILOT_PROVIDER_WIRE_API: responses sandbox: agent: id: awf diff --git a/.github/workflows/smoke-copilot-byok-aoai-entra.lock.yml b/.github/workflows/smoke-copilot-byok-aoai-entra.lock.yml index 50a594246..249e7a123 100644 --- a/.github/workflows/smoke-copilot-byok-aoai-entra.lock.yml +++ b/.github/workflows/smoke-copilot-byok-aoai-entra.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"7d0de46f775d68684867d6b766da77eb993f052de953da677aeff41e0ceb7596","body_hash":"2bd1bbc4c7ffa08b048d3da8fdad3d4e5e80e28cb3c04e1690a95bc5638b8864","compiler_version":"v0.92.6","engine_base_url_customized":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.98"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"7fc694404b5b83afc7611d73bb4523c214111b3b82bbae29138310535b7e3c87","body_hash":"2bd1bbc4c7ffa08b048d3da8fdad3d4e5e80e28cb3c04e1690a95bc5638b8864","compiler_version":"v0.92.6","engine_base_url_customized":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.98"}} # gh-aw-manifest: {"version":1,"secrets":["AZURE_CLIENT_ID","AZURE_TENANT_ID","FOUNDRY_OPENAI_ENDPOINT","GH_AW_DEFAULT_OTLP_ENDPOINT","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"9000827ccba6bdab643e8b6fd33ac0654aef8333","version":"v8.0.2"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/upload-artifact","sha":"cf430e030ddbb5b0abf93d22962f4752f3646cd9","version":"v7.0.2"},{"repo":"github/gh-aw-actions/setup","sha":"8b9c5e98dfe3472ac4e3f13e0a2441cd078a2ca7","version":"v0.92.6"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.62","digest":"sha256:80c4ddd927647b636f49807d2557b4cd3ec175c894194e432c9374f5a69e890f","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.62@sha256:80c4ddd927647b636f49807d2557b4cd3ec175c894194e432c9374f5a69e890f"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.62","digest":"sha256:ebb9e7b5bec475f6b6c2eb6e999ada7d41d57d0acbacb8493c5bebc0106fd44d","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.62@sha256:ebb9e7b5bec475f6b6c2eb6e999ada7d41d57d0acbacb8493c5bebc0106fd44d"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.62","digest":"sha256:b145850ed8bdffd2d4fcd8f1f3ea5793b56cadee6989700b91f42cff490630ef","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.62@sha256:b145850ed8bdffd2d4fcd8f1f3ea5793b56cadee6989700b91f42cff490630ef"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.35","digest":"sha256:35e28671836380c0eae52660ea2ad7e5f6659f63cb20d1abae9271656c670858","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.35@sha256:35e28671836380c0eae52660ea2ad7e5f6659f63cb20d1abae9271656c670858"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f","pinned_image":"ghcr.io/github/gh-aw-node@sha256:11c2c544876cdbaffefe0f7f1283b74838c209654b4934a78e23ed11f750490f"},{"image":"ghcr.io/github/github-mcp-server:v2.0.2","digest":"sha256:ffced0d76e77428532a2ced185516992d77fd146d69eec2f244e6237d1a97796","pinned_image":"ghcr.io/github/github-mcp-server:v2.0.2@sha256:ffced0d76e77428532a2ced185516992d77fd146d69eec2f244e6237d1a97796"}],"mcp_servers":[{"name":"github","tools":["get_pull_request","get_pull_request_comments","get_pull_request_diff","get_pull_request_files","get_pull_request_review_comments","get_pull_request_reviews","get_pull_request_status","list_pull_requests","pull_request_read","search_pull_requests"]},{"name":"safeoutputs","tools":["add_comment","add_labels","missing_data","missing_tool","noop","report_incomplete"]}],"threat_detection":{"mode":"disabled"}} # This file was automatically generated by gh-aw (v0.92.6). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -29,6 +29,7 @@ # - AWF_AUTH_PROVIDER: (main workflow) # - AWF_AUTH_TYPE: (main workflow) # - COPILOT_MODEL: (main workflow) +# - COPILOT_PROVIDER_WIRE_API: (main workflow) # # Secrets used: # - AZURE_CLIENT_ID @@ -62,7 +63,7 @@ on: - labeled # roles: all # Roles processed as role check in pre-activation job schedule: - - cron: "6 */12 * * *" + - cron: "18 */12 * * *" workflow_dispatch: inputs: aw_context: @@ -89,6 +90,7 @@ env: AWF_AUTH_PROVIDER: azure AWF_AUTH_TYPE: github-oidc COPILOT_MODEL: o4-mini-aw + COPILOT_PROVIDER_WIRE_API: responses OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.GH_AW_DEFAULT_OTLP_ENDPOINT || vars.GH_AW_DEFAULT_OTLP_ENDPOINT }} OTEL_SERVICE_NAME: gh-aw.smoke-copilot-byok-aoai-entra OTEL_RESOURCE_ATTRIBUTES: 'gh-aw.workflow.name=Smoke%20Copilot%20BYOK%20AOAI%20%28Entra%29,gh-aw.repository=${{ github.repository }},gh-aw.run.id=${{ github.run_id }},github.run_id=${{ github.run_id }},gh-aw.engine.id=copilot' diff --git a/.github/workflows/smoke-copilot-byok-aoai-entra.md b/.github/workflows/smoke-copilot-byok-aoai-entra.md index f487ecf2b..6a5daa69d 100644 --- a/.github/workflows/smoke-copilot-byok-aoai-entra.md +++ b/.github/workflows/smoke-copilot-byok-aoai-entra.md @@ -60,6 +60,8 @@ safe-outputs: timeout-minutes: 15 env: COPILOT_MODEL: o4-mini-aw + # Copilot's chat-completions fallback sends temperature=0, which o4-mini rejects. + COPILOT_PROVIDER_WIRE_API: responses AWF_AUTH_TYPE: github-oidc AWF_AUTH_PROVIDER: azure sandbox: diff --git a/docs/api-proxy-sidecar.md b/docs/api-proxy-sidecar.md index 6678f6ef2..9de863dc9 100644 --- a/docs/api-proxy-sidecar.md +++ b/docs/api-proxy-sidecar.md @@ -1012,6 +1012,11 @@ not a production-wide alias or a generic fallback. Update the confirmed mapping and pinned pricing together if that Azure deployment changes its underlying model. +Both smokes explicitly select `COPILOT_PROVIDER_WIRE_API=responses` so Copilot +does not send its generic chat-completions `temperature=0` default, which +`o4-mini` rejects. The wire deployment remains `o4-mini-aw`, and the same +workflow-scoped prices and budget limits apply. + ### Caller attribution (`x-awf-caller`) The agent harness may set an optional `x-awf-caller` request header so that diff --git a/scripts/ci/configure-aoai-smoke-pricing.test.ts b/scripts/ci/configure-aoai-smoke-pricing.test.ts index 4be232234..5fb12b674 100644 --- a/scripts/ci/configure-aoai-smoke-pricing.test.ts +++ b/scripts/ci/configure-aoai-smoke-pricing.test.ts @@ -87,6 +87,17 @@ test.each(['apikey', 'entra'])('postprocessing configures only the Azure %s smok expect(() => applyGeneralWorkflowPatches('', workflow)).toThrow('Missing AWF config staging'); }); +test.each(['apikey', 'entra'])('the %s smoke uses Responses without changing the priced wire deployment', mode => { + const name = `smoke-copilot-byok-aoai-${mode}`; + const source = fs.readFileSync(path.join(root, `.github/workflows/${name}.md`), 'utf8'); + const lock = fs.readFileSync(path.join(root, `.github/workflows/${name}.lock.yml`), 'utf8'); + for (const content of [source.split('---')[1], lock]) { + expect(yaml.load(content)).toMatchObject({ + env: { COPILOT_MODEL: 'o4-mini-aw', COPILOT_PROVIDER_WIRE_API: 'responses' }, + }); + } +}); + test.each(['apikey', 'entra'])('the actual generated %s config stage installs pricing before AWF launches', mode => { const lockPath = path.join(root, `.github/workflows/smoke-copilot-byok-aoai-${mode}.lock.yml`); const content = fs.readFileSync(lockPath, 'utf8');