Compare commits

...

3 Commits

Author SHA1 Message Date
AC
a5caf98db0 Enhance Bedrock API Logging for Request Details
- Updated logging in the Bedrock API handler to include detailed information about the request model, stream status, and message count for improved debugging and monitoring.
2025-04-06 17:04:55 +08:00
AC
4093e4c500 Improve AWS Bedrock Configuration Error Handling
- Enhanced error messages in `getAwsCredentials` to provide clearer feedback when AWS Bedrock is not configured properly.
- Added checks for missing Bedrock Access Key ID and Secret Access Key, with specific error messages for each case.
2025-04-06 17:03:53 +08:00
AC
04cbadb197 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.
2025-04-06 17:03:18 +08:00
4 changed files with 143 additions and 20 deletions

View File

@@ -15,7 +15,15 @@ const ALLOWED_PATH = new Set([BedrockConfig.ChatPath]);
function getAwsCredentials() {
const config = getServerSideConfig();
if (!config.isBedrock) {
throw new Error("AWS Bedrock is not configured properly");
throw new Error(
"AWS Bedrock is not configured properly (ENABLE_AWS_BEDROCK is not true)",
);
}
if (!config.bedrockAccessKeyId) {
throw new Error("AWS Bedrock Access Key ID is missing or empty.");
}
if (!config.bedrockSecretAccessKey) {
throw new Error("AWS Bedrock Secret Access Key is missing or empty.");
}
return {
accessKeyId: config.bedrockAccessKeyId as string,
@@ -69,7 +77,14 @@ export async function handle(
});
const body = await req.json();
console.log("[Bedrock] request body: ", body);
console.log(
"[Bedrock] Request - Model:",
body.model,
"Stream:",
body.stream,
"Messages count:",
body.messages.length,
);
const {
messages,

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,