Merge pull request #4431 from linyqh/codex/fix-codex-image-handoff

fix(openai): 修复 Codex 生图网关侧交接问题
This commit is contained in:
Wesley Liddick
2026-07-16 19:32:33 +08:00
committed by GitHub
20 changed files with 234 additions and 37 deletions
@@ -1461,7 +1461,7 @@
</div>
</div>
<!-- OpenAI Codex 图片工具统一策略(自动注入 + 客户端显式携带) -->
<!-- OpenAI Codex hosted image_generation bridge policy -->
<div
v-if="account?.platform === 'openai' && (account?.type === 'oauth' || account?.type === 'setup-token' || account?.type === 'apikey')"
class="border-t border-gray-200 pt-4 dark:border-dark-600"
@@ -771,6 +771,10 @@ describe('EditAccountModal', () => {
const wrapper = mountModal(account)
expect(wrapper.text()).toContain('admin.accounts.openai.codexImageTool')
expect(wrapper.text()).toContain('admin.accounts.openai.codexImageToolDesc')
expect(wrapper.text()).toContain('admin.accounts.openai.codexImageToolEnabledDesc')
await wrapper.get('button[data-testid="codex-image-tool-enabled"]').trigger('click')
await wrapper.get('form#edit-account-form').trigger('submit.prevent')
@@ -809,6 +813,9 @@ describe('EditAccountModal', () => {
const wrapper = mountModal(account)
expect(wrapper.text()).toContain('admin.accounts.openai.codexImageToolBlock')
expect(wrapper.text()).toContain('admin.accounts.openai.codexImageToolBlockDesc')
await wrapper.get('button[data-testid="codex-image-tool-block"]').trigger('click')
await wrapper.get('form#edit-account-form').trigger('submit.prevent')
@@ -100,6 +100,14 @@
{{ t('keys.useKeyModal.openai.authModeApiKey') }}
</button>
</div>
<div
v-if="codexAuthMode === 'api-key'"
data-testid="codex-api-key-restart-notice"
class="mt-3 flex items-start gap-2 border-l-2 border-amber-400 bg-amber-50 px-3 py-2 text-xs leading-5 text-amber-800 dark:border-amber-500 dark:bg-amber-950/30 dark:text-amber-200"
>
<Icon name="exclamationCircle" size="sm" class="mt-0.5 flex-shrink-0" />
<p>{{ t('keys.useKeyModal.openai.authModeApiKeyRestartNotice') }}</p>
</div>
</div>
<!-- OS/Shell Tabs -->
@@ -268,6 +268,7 @@ describe('UseKeyModal', () => {
expect(configToml).toContain('[features]\ngoals = true')
expect(codeBlocks).toContain('{\n "OPENAI_API_KEY": "sk-test"\n}')
expect(wrapper.text()).toContain('auth.json')
expect(wrapper.find('[data-testid="codex-api-key-restart-notice"]').exists()).toBe(false)
})
it('renders API Key Mode authorization in OpenAI Codex config', async () => {
@@ -305,6 +306,19 @@ describe('UseKeyModal', () => {
expect(configToml).not.toContain('image_generation')
expect(codeBlocks).toContain('{\n "OPENAI_API_KEY": "sk-test"\n}')
expect(wrapper.text()).toContain('auth.json')
const restartNotice = wrapper.get('[data-testid="codex-api-key-restart-notice"]')
expect(restartNotice.text()).toContain(
'keys.useKeyModal.openai.authModeApiKeyRestartNotice'
)
await wrapper.get('[data-testid="codex-auth-mode-legacy"]').trigger('click')
await nextTick()
expect(wrapper.find('[data-testid="codex-api-key-restart-notice"]').exists()).toBe(false)
expect(wrapper.findAll('pre code').map((code) => code.text()).join('\n')).not.toContain(
'x-openai-actor-authorization'
)
})
it('keeps legacy OpenAI Codex WebSocket config as the default', async () => {