diff --git a/app/client/platforms/bytedance.ts b/app/client/platforms/bytedance.ts
index f9524cba2..8e4091636 100644
--- a/app/client/platforms/bytedance.ts
+++ b/app/client/platforms/bytedance.ts
@@ -117,7 +117,7 @@ export class DoubaoApi implements LLMApi {
options.onController?.(controller);
try {
- const chatPath = this.path(ByteDance.ChatPath);
+ const chatPath = this.path(ByteDance.ChatPath(modelConfig.model));
const chatPayload = {
method: "POST",
body: JSON.stringify(requestPayload),
diff --git a/app/components/chat.tsx b/app/components/chat.tsx
index 6691403e6..4b6874443 100644
--- a/app/components/chat.tsx
+++ b/app/components/chat.tsx
@@ -1868,7 +1868,7 @@ function _Chat() {
{!isUser && (
- {message.model}
+ {message.modelDisplayName ?? message.model}
)}
diff --git a/app/components/emoji.tsx b/app/components/emoji.tsx
index 31d7f0ac6..828c9caf8 100644
--- a/app/components/emoji.tsx
+++ b/app/components/emoji.tsx
@@ -82,7 +82,11 @@ export function Avatar(props: { model?: ModelType; avatar?: string }) {
LlmIcon = BotIconGrok;
} else if (modelName.startsWith("hunyuan")) {
LlmIcon = BotIconHunyuan;
- } else if (modelName.startsWith("doubao") || modelName.startsWith("ep-")) {
+ } else if (
+ modelName.startsWith("doubao") ||
+ modelName.startsWith("ep-") ||
+ modelName.startsWith("bot-")
+ ) {
LlmIcon = BotIconDoubao;
} else if (
modelName.includes("glm") ||
diff --git a/app/constant.ts b/app/constant.ts
index c1b135485..3130e499a 100644
--- a/app/constant.ts
+++ b/app/constant.ts
@@ -216,7 +216,13 @@ export const Baidu = {
export const ByteDance = {
ExampleEndpoint: "https://ark.cn-beijing.volces.com/api/",
- ChatPath: "api/v3/chat/completions",
+ ChatPath: (modelName: string) => {
+ if (modelName.startsWith("bot-")) {
+ return "api/v3/bots/chat/completions";
+ } else {
+ return "api/v3/chat/completions";
+ }
+ },
};
export const Alibaba = {
diff --git a/app/store/chat.ts b/app/store/chat.ts
index 87c1a8beb..8a0261027 100644
--- a/app/store/chat.ts
+++ b/app/store/chat.ts
@@ -60,6 +60,7 @@ export type ChatMessage = RequestMessage & {
isError?: boolean;
id: string;
model?: ModelType;
+ modelDisplayName?: string;
tools?: ChatMessageTool[];
audio_url?: string;
isMcpResponse?: boolean;
@@ -151,6 +152,24 @@ function getSummarizeModel(
return [currentModel, providerName];
}
+function getModelDisplayName(
+ model: ModelType,
+ providerName: ServiceProvider,
+): string | undefined {
+ const configStore = useAppConfig.getState();
+ const accessStore = useAccessStore.getState();
+ const allModel = collectModelsWithDefaultModel(
+ configStore.models,
+ [configStore.customModels, accessStore.customModels].join(","),
+ accessStore.defaultModel,
+ );
+
+ const matchedModel = allModel.find(
+ (m) => m.name === model && m.provider?.providerName === providerName,
+ );
+ return matchedModel ? matchedModel.displayName : undefined;
+}
+
function countMessages(msgs: ChatMessage[]) {
return msgs.reduce(
(pre, cur) => pre + estimateTokenLength(getMessageTextContent(cur)),
@@ -437,6 +456,10 @@ export const useChatStore = createPersistStore(
role: "assistant",
streaming: true,
model: modelConfig.model,
+ modelDisplayName: getModelDisplayName(
+ modelConfig.model,
+ modelConfig.providerName,
+ ),
});
// get recent messages
diff --git a/app/utils.ts b/app/utils.ts
index 6183e03b0..6582cb1f8 100644
--- a/app/utils.ts
+++ b/app/utils.ts
@@ -304,7 +304,9 @@ export function getTimeoutMSByModel(model: string) {
model.startsWith("o1") ||
model.startsWith("o3") ||
model.includes("deepseek-r") ||
- model.includes("-thinking")
+ model.includes("-thinking") ||
+ model.startsWith("ep-") ||
+ model.startsWith("bot-")
)
return REQUEST_TIMEOUT_MS_FOR_THINKING;
return REQUEST_TIMEOUT_MS;