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 { 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: case ServiceProvider.Google:
console.log(
"[getClientApi] Returning ClientApi(ModelProvider.GeminiPro)",
);
return new ClientApi(ModelProvider.GeminiPro); return new ClientApi(ModelProvider.GeminiPro);
case ServiceProvider.Anthropic: case ServiceProvider.Anthropic:
console.log("[getClientApi] Returning ClientApi(ModelProvider.Claude)");
return new ClientApi(ModelProvider.Claude); return new ClientApi(ModelProvider.Claude);
case ServiceProvider.Baidu: case ServiceProvider.Baidu:
return new ClientApi(ModelProvider.Ernie); return new ClientApi(ModelProvider.Ernie);
@ -387,9 +422,15 @@ export function getClientApi(provider: ServiceProvider | string): ClientApi {
case ServiceProvider.SiliconFlow: case ServiceProvider.SiliconFlow:
return new ClientApi(ModelProvider.SiliconFlow); return new ClientApi(ModelProvider.SiliconFlow);
case ServiceProvider.Bedrock: case ServiceProvider.Bedrock:
case "AWS Bedrock": console.log(
"[getClientApi] Returning ClientApi(ModelProvider.Bedrock) for",
standardizedProvider,
);
return new ClientApi(ModelProvider.Bedrock); return new ClientApi(ModelProvider.Bedrock);
default: default:
console.log(
`[getClientApi] Provider '${provider}' (Standardized: '${standardizedProvider}') not matched, returning default GPT.`,
);
return new ClientApi(ModelProvider.GPT); return new ClientApi(ModelProvider.GPT);
} }
} }

View File

@ -693,22 +693,70 @@ export function ChatActions(props: {
onClose={() => setShowModelSelector(false)} onClose={() => setShowModelSelector(false)}
onSelection={(s) => { onSelection={(s) => {
if (s.length === 0) return; if (s.length === 0) return;
const [model, providerName] = getModelProvider(s[0]); 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 {
// 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) => { chatStore.updateTargetSession(session, (session) => {
session.mask.modelConfig.model = model as ModelType; session.mask.modelConfig.model = model as ModelType;
session.mask.modelConfig.providerName = session.mask.modelConfig.providerName = targetProvider; // Use the Enum value
providerName as ServiceProvider;
session.mask.syncGlobalConfig = false; session.mask.syncGlobalConfig = false;
}); console.log(
if (providerName == "ByteDance") { "[ChatActions] Updated session modelConfig:",
const selectedModel = models.find( session.mask.modelConfig,
(m) =>
m.name == model &&
m?.provider?.providerName == providerName,
); );
showToast(selectedModel?.displayName ?? ""); });
} else { // Display toast based on provider
showToast(model); 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 // make request
api.llm.chat({ api.llm.chat({
messages: sendMessages, messages: sendMessages,