diff --git a/cmd/server/main-server.go b/cmd/server/main-server.go index 748acaefbd..5259b60ffa 100644 --- a/cmd/server/main-server.go +++ b/cmd/server/main-server.go @@ -14,6 +14,7 @@ import ( "time" "github.com/joho/godotenv" + "github.com/wavetermdev/waveterm/pkg/aiusechat" "github.com/wavetermdev/waveterm/pkg/authkey" "github.com/wavetermdev/waveterm/pkg/blockcontroller" "github.com/wavetermdev/waveterm/pkg/blocklogger" @@ -526,6 +527,7 @@ func main() { sigutil.InstallShutdownSignalHandlers(doShutdown) sigutil.InstallSIGUSR1Handler() startConfigWatcher() + aiusechat.InitAIModeConfigWatcher() maybeStartPprofServer() go stdinReadWatch() go telemetryLoop() diff --git a/frontend/app/aipanel/ai-utils.ts b/frontend/app/aipanel/ai-utils.ts index fce9a7194d..dd725571d6 100644 --- a/frontend/app/aipanel/ai-utils.ts +++ b/frontend/app/aipanel/ai-utils.ts @@ -572,3 +572,25 @@ export const getFilteredAIModeConfigs = ( shouldShowCloudModes, }; }; + +/** + * Get the display name for an AI mode configuration. + * If display:name is set, use that. Otherwise, construct from model/provider. + * For azure-legacy, show "azureresourcename (azure)". + * For other providers, show "model (provider)". + */ +export function getModeDisplayName(config: AIModeConfigType): string { + if (config["display:name"]) { + return config["display:name"]; + } + + const provider = config["ai:provider"]; + const model = config["ai:model"]; + const azureResourceName = config["ai:azureresourcename"]; + + if (provider === "azure-legacy") { + return `${azureResourceName || "unknown"} (azure)`; + } + + return `${model || "unknown"} (${provider || "custom"})`; +} diff --git a/frontend/app/aipanel/aimode.tsx b/frontend/app/aipanel/aimode.tsx index d8aa67ccac..5ae1d8a385 100644 --- a/frontend/app/aipanel/aimode.tsx +++ b/frontend/app/aipanel/aimode.tsx @@ -1,17 +1,18 @@ // Copyright 2025, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 +import { Tooltip } from "@/app/element/tooltip"; import { atoms, getSettingsKeyAtom } from "@/app/store/global"; import { RpcApi } from "@/app/store/wshclientapi"; import { TabRpcClient } from "@/app/store/wshrpcutil"; import { cn, fireAndForget, makeIconClass } from "@/util/util"; import { useAtomValue } from "jotai"; import { memo, useRef, useState } from "react"; -import { getFilteredAIModeConfigs } from "./ai-utils"; +import { getFilteredAIModeConfigs, getModeDisplayName } from "./ai-utils"; import { WaveAIModel } from "./waveai-model"; interface AIModeMenuItemProps { - config: any; + config: AIModeConfigWithMode; isSelected: boolean; isDisabled: boolean; onClick: () => void; @@ -34,13 +35,16 @@ const AIModeMenuItem = memo(({ config, isSelected, isDisabled, onClick, isFirst,