Skip to content

I've made some improvements to the Gemini integration and error handl… #121

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 45 additions & 6 deletions electron/ProcessingHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,10 @@ export class ProcessingHelper {
];

// Make API request to Gemini
console.log("Gemini extraction request:", {
url: `https://generativelanguage.googleapis.com/v1beta/models/${config.extractionModel || "gemini-2.0-flash"}:generateContent`,
contents: geminiMessages,
});
const response = await axios.default.post(
`https://generativelanguage.googleapis.com/v1beta/models/${config.extractionModel || "gemini-2.0-flash"}:generateContent?key=${this.geminiApiKey}`,
{
Expand All @@ -557,6 +561,7 @@ export class ProcessingHelper {
);

const responseData = response.data as GeminiResponse;
console.log("Gemini extraction response:", responseData);

if (!responseData.candidates || responseData.candidates.length === 0) {
throw new Error("Empty response from Gemini API");
Expand All @@ -567,11 +572,19 @@ export class ProcessingHelper {
// Handle when Gemini might wrap the JSON in markdown code blocks
const jsonText = responseText.replace(/```json|```/g, '').trim();
problemInfo = JSON.parse(jsonText);
} catch (error) {
} catch (error: any) {
console.error("Error using Gemini API:", error);
let errorMessage = "Failed to process with Gemini API. Please check your API key or try again later.";
if (error.response) {
errorMessage = `Gemini API Error: ${error.response.status} ${error.response.statusText}. ${error.response.data?.error?.message || ''}`;
} else if (error.request) {
errorMessage = "Gemini API Error: No response received from the server. Please check your network connection.";
} else {
errorMessage = `Gemini API Error: ${error.message}`;
}
return {
success: false,
error: "Failed to process with Gemini API. Please check your API key or try again later."
error: errorMessage
};
}
} else if (config.apiProvider === "anthropic") {
Expand Down Expand Up @@ -808,6 +821,10 @@ Your solution should be efficient, well-commented, and handle edge cases.
];

// Make API request to Gemini
console.log("Gemini solution request:", {
url: `https://generativelanguage.googleapis.com/v1beta/models/${config.solutionModel || "gemini-2.0-flash"}:generateContent`,
contents: geminiMessages,
});
const response = await axios.default.post(
`https://generativelanguage.googleapis.com/v1beta/models/${config.solutionModel || "gemini-2.0-flash"}:generateContent?key=${this.geminiApiKey}`,
{
Expand All @@ -821,17 +838,26 @@ Your solution should be efficient, well-commented, and handle edge cases.
);

const responseData = response.data as GeminiResponse;
console.log("Gemini solution response:", responseData);

if (!responseData.candidates || responseData.candidates.length === 0) {
throw new Error("Empty response from Gemini API");
}

responseContent = responseData.candidates[0].content.parts[0].text;
} catch (error) {
} catch (error: any) {
console.error("Error using Gemini API for solution:", error);
let errorMessage = "Failed to generate solution with Gemini API. Please check your API key or try again later.";
if (error.response) {
errorMessage = `Gemini API Error: ${error.response.status} ${error.response.statusText}. ${error.response.data?.error?.message || ''}`;
} else if (error.request) {
errorMessage = "Gemini API Error: No response received from the server. Please check your network connection.";
} else {
errorMessage = `Gemini API Error: ${error.message}`;
}
return {
success: false,
error: "Failed to generate solution with Gemini API. Please check your API key or try again later."
error: errorMessage
};
}
} else if (config.apiProvider === "anthropic") {
Expand Down Expand Up @@ -1129,6 +1155,10 @@ If you include code examples, use proper markdown code blocks with language spec
});
}

console.log("Gemini debug request:", {
url: `https://generativelanguage.googleapis.com/v1beta/models/${config.debuggingModel || "gemini-2.0-flash"}:generateContent`,
contents: geminiMessages,
});
const response = await axios.default.post(
`https://generativelanguage.googleapis.com/v1beta/models/${config.debuggingModel || "gemini-2.0-flash"}:generateContent?key=${this.geminiApiKey}`,
{
Expand All @@ -1142,17 +1172,26 @@ If you include code examples, use proper markdown code blocks with language spec
);

const responseData = response.data as GeminiResponse;
console.log("Gemini debug response:", responseData);

if (!responseData.candidates || responseData.candidates.length === 0) {
throw new Error("Empty response from Gemini API");
}

debugContent = responseData.candidates[0].content.parts[0].text;
} catch (error) {
} catch (error: any) {
console.error("Error using Gemini API for debugging:", error);
let errorMessage = "Failed to process debug request with Gemini API. Please check your API key or try again later.";
if (error.response) {
errorMessage = `Gemini API Error: ${error.response.status} ${error.response.statusText}. ${error.response.data?.error?.message || ''}`;
} else if (error.request) {
errorMessage = "Gemini API Error: No response received from the server. Please check your network connection.";
} else {
errorMessage = `Gemini API Error: ${error.message}`;
}
return {
success: false,
error: "Failed to process debug request with Gemini API. Please check your API key or try again later."
error: errorMessage
};
}
} else if (config.apiProvider === "anthropic") {
Expand Down
27 changes: 14 additions & 13 deletions src/components/Settings/SettingsDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ const modelCategories: ModelCategory[] = [
],
geminiModels: [
{
id: "gemini-1.5-pro",
name: "Gemini 1.5 Pro",
description: "Best overall performance for problem extraction"
id: "gemini-1.5-flash",
name: "Gemini 1.5 Flash",
description: "Fast and versatile multimodal model"
},
{
id: "gemini-2.0-flash",
Expand Down Expand Up @@ -96,9 +96,9 @@ const modelCategories: ModelCategory[] = [
],
geminiModels: [
{
id: "gemini-1.5-pro",
name: "Gemini 1.5 Pro",
description: "Strong overall performance for coding tasks"
id: "gemini-1.5-flash",
name: "Gemini 1.5 Flash",
description: "Fast and versatile multimodal model"
},
{
id: "gemini-2.0-flash",
Expand Down Expand Up @@ -142,9 +142,9 @@ const modelCategories: ModelCategory[] = [
],
geminiModels: [
{
id: "gemini-1.5-pro",
name: "Gemini 1.5 Pro",
description: "Best for analyzing code and error messages"
id: "gemini-1.5-flash",
name: "Gemini 1.5 Flash",
description: "Fast and versatile multimodal model"
},
{
id: "gemini-2.0-flash",
Expand Down Expand Up @@ -244,9 +244,9 @@ export function SettingsDialog({ open: externalOpen, onOpenChange }: SettingsDia
setSolutionModel("gpt-4o");
setDebuggingModel("gpt-4o");
} else if (provider === "gemini") {
setExtractionModel("gemini-1.5-pro");
setSolutionModel("gemini-1.5-pro");
setDebuggingModel("gemini-1.5-pro");
setExtractionModel("gemini-1.5-flash");
setSolutionModel("gemini-1.5-flash");
setDebuggingModel("gemini-1.5-flash");
} else if (provider === "anthropic") {
setExtractionModel("claude-3-7-sonnet-20250219");
setSolutionModel("claude-3-7-sonnet-20250219");
Expand Down Expand Up @@ -413,7 +413,8 @@ export function SettingsDialog({ open: externalOpen, onOpenChange }: SettingsDia
</p>
)}
<p className="text-xs text-white/50">
Your API key is stored locally and never sent to any server except {apiProvider === "openai" ? "OpenAI" : "Google"}
Your API key is stored locally and never sent to any server except {apiProvider === "openai" ? "OpenAI" : "Google"}.
{apiProvider === 'gemini' && <span> Note: Gemini is a Google product. You will need a Google AI Studio API key.</span>}
</p>
<div className="mt-2 p-2 rounded-md bg-white/5 border border-white/10">
<p className="text-xs text-white/80 mb-1">Don't have an API key?</p>
Expand Down