fix: use agent avatar for auto mode and hide selector in agent mode
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-02-20 17:58:53 +08:00
parent 9cb6a779c3
commit afd231dde0
2 changed files with 34 additions and 60 deletions

View File

@ -3,7 +3,6 @@ import {
getAgentAiModelWithProvider, getAgentAiModelWithProvider,
getDefaultAiModel, getDefaultAiModel,
getEnabledAiModelsWithProvider, getEnabledAiModelsWithProvider,
getSiteSettings,
} from "@/lib/db/queries"; } from "@/lib/db/queries";
import { ChatSDKError } from "@/lib/errors"; import { ChatSDKError } from "@/lib/errors";
import { isAiModelAgentAuto } from "@/lib/db/ai-model-flags"; import { isAiModelAgentAuto } from "@/lib/db/ai-model-flags";
@ -34,7 +33,6 @@ export async function GET() {
const modelsWithProvider = await getEnabledAiModelsWithProvider(false); const modelsWithProvider = await getEnabledAiModelsWithProvider(false);
const agentModelWithProvider = await getAgentAiModelWithProvider(); const agentModelWithProvider = await getAgentAiModelWithProvider();
const defaultModel = await getDefaultAiModel(); const defaultModel = await getDefaultAiModel();
const siteSettings = await getSiteSettings();
const visibleModelsWithProvider = sortModelsForDisplay( const visibleModelsWithProvider = sortModelsForDisplay(
modelsWithProvider modelsWithProvider
.filter(({ model }) => !isAiModelAgentAuto(model)) .filter(({ model }) => !isAiModelAgentAuto(model))
@ -68,32 +66,6 @@ export async function GET() {
sortOrder: model.sortOrder ?? 0, sortOrder: model.sortOrder ?? 0,
})); }));
// Agent 模式在前端展示头像/参数时,优先使用“Agent模式 - 默认生图模型”的配置
// 避免展示成分析模型(如视觉模型)的头像,导致与管理员设置不一致
const imageGenModelsWithProvider = visibleModelsWithProviderSorted.filter(
({ model }) => model.supportsImageGen
);
const configuredAutoImageModelId =
typeof siteSettings?.canvasAutoModeDefaultModelId === "string"
? siteSettings.canvasAutoModeDefaultModelId.trim()
: "";
const configuredAutoImageModel = configuredAutoImageModelId
? imageGenModelsWithProvider.find(
({ model }) => model.id === configuredAutoImageModelId
)
: undefined;
const defaultImageGenModel =
(defaultModel &&
!isAiModelAgentAuto(defaultModel) &&
defaultModel.supportsImageGen
? imageGenModelsWithProvider.find(({ model }) => model.id === defaultModel.id)
: undefined) || imageGenModelsWithProvider[0];
const agentDisplayModelWithProvider =
configuredAutoImageModel ||
defaultImageGenModel ||
agentModelWithProvider ||
null;
const resolvedDefaultModelId = const resolvedDefaultModelId =
(defaultModel && (defaultModel &&
!isAiModelAgentAuto(defaultModel) && !isAiModelAgentAuto(defaultModel) &&
@ -106,13 +78,13 @@ export async function GET() {
return Response.json({ return Response.json({
models, models,
defaultModelId: resolvedDefaultModelId, defaultModelId: resolvedDefaultModelId,
agentModel: agentDisplayModelWithProvider agentModel: agentModelWithProvider
? { ? {
id: agentDisplayModelWithProvider.model.id, id: agentModelWithProvider.model.id,
displayName: agentDisplayModelWithProvider.model.displayName, displayName: agentModelWithProvider.model.displayName,
avatarUrl: agentDisplayModelWithProvider.model.avatarUrl, avatarUrl: agentModelWithProvider.model.avatarUrl,
providerType: agentDisplayModelWithProvider.provider.type, providerType: agentModelWithProvider.provider.type,
imageGenConfig: agentDisplayModelWithProvider.model.imageGenConfig, imageGenConfig: agentModelWithProvider.model.imageGenConfig,
} }
: null, : null,
}); });

View File

@ -5386,32 +5386,34 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
</div> </div>
<div className="flex items-center gap-2 flex-shrink-0"> <div className="flex items-center gap-2 flex-shrink-0">
<Select {activeComposerMode !== "agent" ? (
value={modelSelectValue} <Select
onValueChange={(value) => { value={modelSelectValue}
setSelectedModelId(value); onValueChange={(value) => {
if (value !== "auto" || !aiDetailGenerationEnabled) { setSelectedModelId(value);
setIsDetailGenerationMode(false); if (value !== "auto" || !aiDetailGenerationEnabled) {
} setIsDetailGenerationMode(false);
}} }
> }}
<SelectTrigger className="h-8 w-8 rounded-full border border-[#cfd4dc] bg-white p-0 justify-center [&>svg]:hidden"> >
<span className="h-6 w-6 overflow-hidden rounded-full bg-white flex items-center justify-center"> <SelectTrigger className="h-8 w-8 rounded-full border border-[#cfd4dc] bg-white p-0 justify-center [&>svg]:hidden">
{selectDisplayModel?.avatarUrl ? ( <span className="h-6 w-6 overflow-hidden rounded-full bg-white flex items-center justify-center">
<img {selectDisplayModel?.avatarUrl ? (
src={selectDisplayModel.avatarUrl} <img
alt={selectDisplayModel.displayName || "模型头像"} src={selectDisplayModel.avatarUrl}
className="h-full w-full object-cover" alt={selectDisplayModel.displayName || "模型头像"}
/> className="h-full w-full object-cover"
) : ( />
<span className="flex h-full w-full items-center justify-center text-[10px] font-medium text-[#4b5563]"> ) : (
{(selectDisplayModel?.displayName || "A").slice(0, 1)} <span className="flex h-full w-full items-center justify-center text-[10px] font-medium text-[#4b5563]">
</span> {(selectDisplayModel?.displayName || "A").slice(0, 1)}
)} </span>
</span> )}
</SelectTrigger> </span>
{renderModelSelectContent()} </SelectTrigger>
</Select> {renderModelSelectContent()}
</Select>
) : null}
<Button <Button
size="icon" size="icon"