diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52d8f39a..965e4dbd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,10 +108,29 @@ jobs: with: python-version: '3.12' + - name: Resolve openhands-sdk source + id: sdk-source + env: + GH_TOKEN: ${{ github.token }} + PR_BODY: ${{ github.event.pull_request.body || '' }} + run: | + sdk_repo=OpenHands/software-agent-sdk + sdk_ref=main + if [[ "$PR_BODY" =~ github.com/OpenHands/software-agent-sdk/pull/([0-9]+) ]]; then + sdk_pr=${BASH_REMATCH[1]} + sdk_metadata=$(gh api "repos/OpenHands/software-agent-sdk/pulls/$sdk_pr") + sdk_repo=$(jq -r '.head.repo.full_name' <<< "$sdk_metadata") + sdk_ref=$(jq -r '.head.sha' <<< "$sdk_metadata") + fi + echo "repo=$sdk_repo" >> "$GITHUB_OUTPUT" + echo "ref=$sdk_ref" >> "$GITHUB_OUTPUT" + - name: Install openhands-sdk - run: pip install -r scripts/requirements-acp-check.txt + run: >- + pip install + "openhands-sdk @ git+https://github.com/${{ steps.sdk-source.outputs.repo }}@${{ steps.sdk-source.outputs.ref }}#subdirectory=openhands-sdk" - name: Check ACP_PROVIDERS matches openhands-sdk env: OPENHANDS_SUPPRESS_BANNER: '1' - run: python scripts/check-acp-drift.py \ No newline at end of file + run: python scripts/check-acp-drift.py diff --git a/scripts/requirements-acp-check.txt b/scripts/requirements-acp-check.txt index 2fe7bb13..619a8a8b 100644 --- a/scripts/requirements-acp-check.txt +++ b/scripts/requirements-acp-check.txt @@ -1,5 +1,6 @@ # Pinned dependency for scripts/check-acp-drift.py. # Tracks `main` of OpenHands/software-agent-sdk intentionally: the drift # check exists to fail CI when ACP_PROVIDERS moves upstream so this repo's -# JSON mirror gets updated. Do NOT pin to a tag or sha. +# JSON mirror gets updated. Do NOT pin to a tag or sha. CI resolves a companion +# SDK PR linked in the TypeScript client PR description before installing. openhands-sdk @ git+https://github.com/OpenHands/software-agent-sdk@main#subdirectory=openhands-sdk diff --git a/src/__tests__/acp-providers.test.ts b/src/__tests__/acp-providers.test.ts index 39f3b5fc..02a7fd5d 100644 --- a/src/__tests__/acp-providers.test.ts +++ b/src/__tests__/acp-providers.test.ts @@ -39,6 +39,15 @@ describe('ACP provider credential descriptors', () => { expect(provider.base_url_env_var).toBe(baseUrlEnvVar); }); + it('uses the maintained Codex adapter and exposes GPT-5.6 models', () => { + const codex = ACP_PROVIDERS.codex; + expect(codex.default_command).toEqual(['npx', '-y', '@agentclientprotocol/codex-acp@1.1.2']); + expect(codex.default_session_mode).toBe('agent-full-access'); + expect(codex.available_models.map((model) => model.id)).toEqual( + expect.arrayContaining(['gpt-5.6', 'gpt-5.6-sol', 'gpt-5.6-terra', 'gpt-5.6-luna']) + ); + }); + describe('file_secrets', () => { it('claude-code authenticates via env var only (no file secrets)', () => { expect(ACP_PROVIDERS['claude-code'].file_secrets).toEqual([]); diff --git a/src/models/acp-providers.json b/src/models/acp-providers.json index cf24ee47..6c1285f7 100644 --- a/src/models/acp-providers.json +++ b/src/models/acp-providers.json @@ -36,14 +36,30 @@ "codex": { "key": "codex", "display_name": "Codex", - "default_command": ["npx", "-y", "@zed-industries/codex-acp@0.16.0"], + "default_command": ["npx", "-y", "@agentclientprotocol/codex-acp@1.1.2"], "api_key_env_var": "OPENAI_API_KEY", "base_url_env_var": "OPENAI_BASE_URL", - "default_session_mode": "full-access", + "default_session_mode": "agent-full-access", "agent_name_patterns": ["codex-acp"], "supports_set_session_model": true, "session_meta_key": null, "available_models": [ + { + "id": "gpt-5.6", + "label": "GPT-5.6" + }, + { + "id": "gpt-5.6-sol", + "label": "GPT-5.6 Sol" + }, + { + "id": "gpt-5.6-terra", + "label": "GPT-5.6 Terra" + }, + { + "id": "gpt-5.6-luna", + "label": "GPT-5.6 Luna" + }, { "id": "gpt-5.5", "label": "GPT-5.5"