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:
AC 2025-04-06 17:03:18 +08:00
parent 78e8cb31c2
commit 04cbadb197
3 changed files with 126 additions and 18 deletions

View File

@ -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);
}
}

View File

@ -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);
}
}}
/>

View File

@ -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,