mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-05-21 21:20:19 +09:00
Enhance API and Chat Actions with Improved Provider Handling
- Added logging to `getClientApi` for better debugging of provider input and standardized provider names. - Updated `ChatActions` to handle lowercase provider IDs, converting them to TitleCase for consistency with the ServiceProvider enum. - Implemented defaulting to OpenAI when provider ID is missing and added relevant logging for session updates. - Enhanced logging in `useChatStore` to track API call preparations and provider configurations.
This commit is contained in:
parent
78e8cb31c2
commit
04cbadb197
@ -361,10 +361,45 @@ export function getHeaders(ignoreHeaders: boolean = false) {
|
||||
}
|
||||
|
||||
export function getClientApi(provider: ServiceProvider | string): ClientApi {
|
||||
switch (provider) {
|
||||
console.log(
|
||||
"[getClientApi] Received Provider (raw):",
|
||||
provider,
|
||||
"| Type:",
|
||||
typeof provider,
|
||||
);
|
||||
|
||||
// Standardize the provider name to match Enum case (TitleCase)
|
||||
let standardizedProvider: ServiceProvider | string;
|
||||
if (typeof provider === "string") {
|
||||
// Convert known lowercase versions to their Enum equivalent
|
||||
switch (provider.toLowerCase()) {
|
||||
case "bedrock":
|
||||
standardizedProvider = ServiceProvider.Bedrock;
|
||||
break;
|
||||
case "openai":
|
||||
standardizedProvider = ServiceProvider.OpenAI;
|
||||
break;
|
||||
case "google":
|
||||
standardizedProvider = ServiceProvider.Google;
|
||||
break;
|
||||
// Add other potential lowercase strings if needed
|
||||
default:
|
||||
standardizedProvider = provider; // Keep unknown strings as is
|
||||
}
|
||||
} else {
|
||||
standardizedProvider = provider; // Already an Enum value
|
||||
}
|
||||
|
||||
console.log("[getClientApi] Standardized Provider:", standardizedProvider);
|
||||
|
||||
switch (standardizedProvider) {
|
||||
case ServiceProvider.Google:
|
||||
console.log(
|
||||
"[getClientApi] Returning ClientApi(ModelProvider.GeminiPro)",
|
||||
);
|
||||
return new ClientApi(ModelProvider.GeminiPro);
|
||||
case ServiceProvider.Anthropic:
|
||||
console.log("[getClientApi] Returning ClientApi(ModelProvider.Claude)");
|
||||
return new ClientApi(ModelProvider.Claude);
|
||||
case ServiceProvider.Baidu:
|
||||
return new ClientApi(ModelProvider.Ernie);
|
||||
@ -387,9 +422,15 @@ export function getClientApi(provider: ServiceProvider | string): ClientApi {
|
||||
case ServiceProvider.SiliconFlow:
|
||||
return new ClientApi(ModelProvider.SiliconFlow);
|
||||
case ServiceProvider.Bedrock:
|
||||
case "AWS Bedrock":
|
||||
console.log(
|
||||
"[getClientApi] Returning ClientApi(ModelProvider.Bedrock) for",
|
||||
standardizedProvider,
|
||||
);
|
||||
return new ClientApi(ModelProvider.Bedrock);
|
||||
default:
|
||||
console.log(
|
||||
`[getClientApi] Provider '${provider}' (Standardized: '${standardizedProvider}') not matched, returning default GPT.`,
|
||||
);
|
||||
return new ClientApi(ModelProvider.GPT);
|
||||
}
|
||||
}
|
||||
|
@ -693,22 +693,70 @@ export function ChatActions(props: {
|
||||
onClose={() => setShowModelSelector(false)}
|
||||
onSelection={(s) => {
|
||||
if (s.length === 0) return;
|
||||
const [model, providerName] = getModelProvider(s[0]);
|
||||
chatStore.updateTargetSession(session, (session) => {
|
||||
session.mask.modelConfig.model = model as ModelType;
|
||||
session.mask.modelConfig.providerName =
|
||||
providerName as ServiceProvider;
|
||||
session.mask.syncGlobalConfig = false;
|
||||
});
|
||||
if (providerName == "ByteDance") {
|
||||
const selectedModel = models.find(
|
||||
(m) =>
|
||||
m.name == model &&
|
||||
m?.provider?.providerName == providerName,
|
||||
);
|
||||
showToast(selectedModel?.displayName ?? "");
|
||||
const selectedValue = s[0];
|
||||
console.log(
|
||||
"[ChatActions] Model selected raw value:",
|
||||
selectedValue,
|
||||
);
|
||||
// providerId here will be lowercase, e.g., "bedrock"
|
||||
const [model, providerId] = getModelProvider(selectedValue);
|
||||
console.log(
|
||||
"[ChatActions] Parsed model:",
|
||||
model,
|
||||
"Provider ID:",
|
||||
providerId,
|
||||
);
|
||||
|
||||
// Convert lowercase providerId to TitleCase ServiceProvider enum value
|
||||
let targetProvider: ServiceProvider | undefined;
|
||||
if (providerId) {
|
||||
const upperProvider =
|
||||
providerId.charAt(0).toUpperCase() + providerId.slice(1);
|
||||
if (
|
||||
Object.values(ServiceProvider).includes(
|
||||
upperProvider as ServiceProvider,
|
||||
)
|
||||
) {
|
||||
targetProvider = upperProvider as ServiceProvider;
|
||||
} else {
|
||||
console.error(
|
||||
`[ChatActions] Unknown provider ID: ${providerId}`,
|
||||
);
|
||||
// Handle error or fallback if needed
|
||||
}
|
||||
} else {
|
||||
showToast(model);
|
||||
// Handle case where providerId is missing, maybe default to OpenAI?
|
||||
targetProvider = ServiceProvider.OpenAI;
|
||||
console.warn(
|
||||
`[ChatActions] Provider ID missing in ${selectedValue}, defaulting to OpenAI.`,
|
||||
);
|
||||
}
|
||||
|
||||
console.log(
|
||||
"[ChatActions] Target ServiceProvider Enum:",
|
||||
targetProvider,
|
||||
);
|
||||
|
||||
if (targetProvider) {
|
||||
// Only update if we found a valid provider
|
||||
chatStore.updateTargetSession(session, (session) => {
|
||||
session.mask.modelConfig.model = model as ModelType;
|
||||
session.mask.modelConfig.providerName = targetProvider; // Use the Enum value
|
||||
session.mask.syncGlobalConfig = false;
|
||||
console.log(
|
||||
"[ChatActions] Updated session modelConfig:",
|
||||
session.mask.modelConfig,
|
||||
);
|
||||
});
|
||||
// Display toast based on provider
|
||||
const toastMessage =
|
||||
targetProvider === ServiceProvider.ByteDance
|
||||
? models.find(
|
||||
(m) =>
|
||||
m.name === model && m?.provider?.id === providerId,
|
||||
)?.displayName ?? model
|
||||
: model;
|
||||
showToast(toastMessage);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
@ -456,7 +456,26 @@ export const useChatStore = createPersistStore(
|
||||
]);
|
||||
});
|
||||
|
||||
const api: ClientApi = getClientApi(modelConfig.providerName);
|
||||
// --- 详细日志 (修正版) ---
|
||||
const providerNameFromConfig = modelConfig.providerName;
|
||||
console.log(
|
||||
"[onUserInput] Preparing API call. Provider from config:",
|
||||
providerNameFromConfig,
|
||||
"| Type:",
|
||||
typeof providerNameFromConfig,
|
||||
"| Is Enum value (Bedrock)?:",
|
||||
providerNameFromConfig === ServiceProvider.Bedrock, // 与枚举比较
|
||||
"| Is 'Bedrock' string?:",
|
||||
providerNameFromConfig === "Bedrock", // 与字符串比较
|
||||
"| Model:",
|
||||
modelConfig.model,
|
||||
);
|
||||
// --- 日志结束 ---
|
||||
|
||||
// 使用从配置中获取的 providerName,并提供默认值
|
||||
const api: ClientApi = getClientApi(
|
||||
providerNameFromConfig ?? ServiceProvider.OpenAI,
|
||||
);
|
||||
// make request
|
||||
api.llm.chat({
|
||||
messages: sendMessages,
|
||||
|
Loading…
Reference in New Issue
Block a user