feat(codex): 拆分openai:compact为独立端点,简化Codex请求为透传模式

- 新增openai:compact端点类型(EndpointKind.COMPACT),独立于openai:cli
- OpenAICompactAdapter继承OpenAICliAdapter,自动标记compact模式
- Codex请求补丁改为纯透传:仅清理内部标记,不再修改客户端payload
- stream_policy支持openai:compact独立策略,compact端点移除stream字段
- candidate_builder支持compact回退到cli端点
- auth_type: vertex_ai重命名为service_account,保持向后兼容
- Vertex Provider新增api_formats与auth_type组合校验
- KeyAllowedModels对话框改为从Provider获取模型,展示provider_model_name
- Dialog内Select组件自动禁用Portal,修复层级遮挡问题
- 新增Codex compact端点回填迁移脚本
This commit is contained in:
fawney19
2026-03-01 23:55:26 +08:00
parent 4bf3a453e7
commit 97d42703da
37 changed files with 650 additions and 286 deletions

View File

@@ -92,8 +92,9 @@
</template>
<script setup lang="ts">
import { computed, useSlots, type Component } from 'vue'
import { computed, provide, useSlots, type Component } from 'vue'
import { useEscapeKey } from '@/composables/useEscapeKey'
import { DIALOG_CONTEXT_KEY } from './context'
// Props 定义
const props = defineProps<{
@@ -116,6 +117,8 @@ const emit = defineEmits<{
'update:modelValue': [value: boolean]
}>()
provide(DIALOG_CONTEXT_KEY, true)
// 获取 slots 以便在模板中使用
const slots = useSlots()

View File

@@ -0,0 +1,3 @@
import type { InjectionKey } from 'vue'
export const DIALOG_CONTEXT_KEY: InjectionKey<boolean> = Symbol('dialog-context')

View File

@@ -1,5 +1,5 @@
<template>
<SelectPortal>
<SelectPortal :disabled="shouldDisablePortal">
<SelectContentPrimitive
v-bind="$attrs"
:class="contentClass"
@@ -23,7 +23,8 @@ import {
SelectViewport,
} from 'radix-vue'
import { cn } from '@/lib/utils'
import { computed } from 'vue'
import { computed, inject } from 'vue'
import { DIALOG_CONTEXT_KEY } from './dialog/context'
interface Props {
class?: string
@@ -32,6 +33,7 @@ interface Props {
sideOffset?: number
align?: 'start' | 'center' | 'end'
alignOffset?: number
disablePortal?: boolean
}
const props = withDefaults(defineProps<Props>(), {
@@ -41,8 +43,12 @@ const props = withDefaults(defineProps<Props>(), {
sideOffset: 4,
align: undefined,
alignOffset: undefined,
disablePortal: false,
})
const isInsideDialog = inject(DIALOG_CONTEXT_KEY, false)
const shouldDisablePortal = computed(() => props.disablePortal || isInsideDialog)
const contentClass = computed(() =>
cn(
'z-[200] max-h-96 min-w-[8rem] overflow-hidden rounded-2xl border border-border bg-card text-foreground shadow-2xl backdrop-blur-xl pointer-events-auto',