Skip to content

Commit a86803b

Browse files
Olasunkanmi OyinlolaOlasunkanmi Oyinlola
authored andcommitted
git push --set-upstream origin chat_history_handling
1 parent 64ca1b5 commit a86803b

File tree

12 files changed

+507
-163
lines changed

12 files changed

+507
-163
lines changed

src/commands/handler.ts

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import Anthropic from "@anthropic-ai/sdk";
33
import { GenerativeModel, GoogleGenerativeAI } from "@google/generative-ai";
44
import Groq from "groq-sdk";
55
import * as vscode from "vscode";
6-
import { APP_CONFIG, COMMON, generativeAiModels } from "../application/constant";
6+
import {
7+
APP_CONFIG,
8+
COMMON,
9+
generativeAiModels,
10+
} from "../application/constant";
711
import { AnthropicWebViewProvider } from "../webview-providers/anthropic";
812
import { GeminiWebViewProvider } from "../webview-providers/gemini";
913
import { GroqWebViewProvider } from "../webview-providers/groq";
@@ -38,7 +42,7 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
3842
constructor(
3943
private readonly action: string,
4044
_context: vscode.ExtensionContext,
41-
errorMessage?: string
45+
errorMessage?: string,
4246
) {
4347
this.context = _context;
4448
this.error = errorMessage;
@@ -69,21 +73,23 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
6973
return getConfigValue(configKey);
7074
}
7175

72-
protected createModel(): { generativeAi: string; model: any; modelName: string } | undefined {
76+
protected createModel():
77+
| { generativeAi: string; model: any; modelName: string }
78+
| undefined {
7379
try {
7480
let model;
7581
let modelName = "";
7682
if (!this.generativeAi) {
7783
vscodeErrorMessage(
78-
"Configuration not found. Go to settings, search for Your coding buddy. Fill up the model and model name"
84+
"Configuration not found. Go to settings, search for Your coding buddy. Fill up the model and model name",
7985
);
8086
}
8187
if (this.generativeAi === generativeAiModels.GROQ) {
8288
const apiKey = this.groqApiKey;
8389
modelName = this.groqModel;
8490
if (!apiKey || !modelName) {
8591
vscodeErrorMessage(
86-
"Configuration not found. Go to settings, search for Your coding buddy. Fill up the model and model name"
92+
"Configuration not found. Go to settings, search for Your coding buddy. Fill up the model and model name",
8793
);
8894
}
8995
model = this.createGroqModel(apiKey);
@@ -109,7 +115,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
109115
return { generativeAi: this.generativeAi, model, modelName };
110116
} catch (error) {
111117
console.error("Error creating model:", error);
112-
vscode.window.showErrorMessage("An error occurred while creating the model. Please try again.");
118+
vscode.window.showErrorMessage(
119+
"An error occurred while creating the model. Please try again.",
120+
);
113121
}
114122
}
115123

@@ -142,7 +150,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
142150
return new Groq({ apiKey });
143151
}
144152

145-
protected async generateModelResponse(text: string): Promise<string | Anthropic.Messages.Message | undefined> {
153+
protected async generateModelResponse(
154+
text: string,
155+
): Promise<string | Anthropic.Messages.Message | undefined> {
146156
try {
147157
const activeModel = this.createModel();
148158
if (!activeModel) {
@@ -179,7 +189,7 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
179189

180190
if (!response) {
181191
throw new Error(
182-
"Could not generate response. Check your settings, ensure the API keys and Model Name is added properly."
192+
"Could not generate response. Check your settings, ensure the API keys and Model Name is added properly.",
183193
);
184194
}
185195
if (this.action.includes("chart")) {
@@ -188,7 +198,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
188198
return response;
189199
} catch (error) {
190200
this.logger.error("Error generating response:", error);
191-
vscode.window.showErrorMessage("An error occurred while generating the response. Please try again.");
201+
vscode.window.showErrorMessage(
202+
"An error occurred while generating the response. Please try again.",
203+
);
192204
}
193205
}
194206

@@ -199,12 +211,19 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
199211
return inputString;
200212
}
201213

202-
async generateGeminiResponse(model: any, text: string): Promise<string | undefined> {
214+
async generateGeminiResponse(
215+
model: any,
216+
text: string,
217+
): Promise<string | undefined> {
203218
const result = await model.generateContent(text);
204219
return result ? await result.response.text() : undefined;
205220
}
206221

207-
private async anthropicResponse(model: Anthropic, generativeAiModel: string, userPrompt: string) {
222+
private async anthropicResponse(
223+
model: Anthropic,
224+
generativeAiModel: string,
225+
userPrompt: string,
226+
) {
208227
try {
209228
const response = await model.messages.create({
210229
model: generativeAiModel,
@@ -218,9 +237,15 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
218237
}
219238
}
220239

221-
private async groqResponse(model: Groq, prompt: string, generativeAiModel: string): Promise<string | undefined> {
240+
private async groqResponse(
241+
model: Groq,
242+
prompt: string,
243+
generativeAiModel: string,
244+
): Promise<string | undefined> {
222245
try {
223-
const chatHistory = Memory.has(COMMON.ANTHROPIC_CHAT_HISTORY) ? Memory.get(COMMON.GROQ_CHAT_HISTORY) : [];
246+
const chatHistory = Memory.has(COMMON.ANTHROPIC_CHAT_HISTORY)
247+
? Memory.get(COMMON.GROQ_CHAT_HISTORY)
248+
: [];
224249
const params = {
225250
messages: [
226251
...chatHistory,
@@ -232,7 +257,8 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
232257
model: generativeAiModel,
233258
};
234259

235-
const completion: Groq.Chat.ChatCompletion = await model.chat.completions.create(params);
260+
const completion: Groq.Chat.ChatCompletion =
261+
await model.chat.completions.create(params);
236262
return completion.choices[0]?.message?.content ?? undefined;
237263
} catch (error) {
238264
this.logger.error("Error generating response:", error);
@@ -243,7 +269,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
243269

244270
abstract createPrompt(text?: string): any;
245271

246-
async generateResponse(message?: string): Promise<string | Anthropic.Messages.Message | undefined> {
272+
async generateResponse(
273+
message?: string,
274+
): Promise<string | Anthropic.Messages.Message | undefined> {
247275
this.logger.info(this.action);
248276
let prompt;
249277
const selectedCode = this.getSelectedWindowArea();
@@ -255,7 +283,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
255283
if (message && selectedCode) {
256284
prompt = await this.createPrompt(`${message} \n ${selectedCode}`);
257285
} else {
258-
message ? (prompt = await this.createPrompt(message)) : (prompt = await this.createPrompt(selectedCode));
286+
message
287+
? (prompt = await this.createPrompt(message))
288+
: (prompt = await this.createPrompt(selectedCode));
259289
}
260290

261291
if (!prompt) {
@@ -338,7 +368,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
338368
placeHolder: "Enter instructions for CodeBuddy",
339369
ignoreFocusOut: true,
340370
validateInput: (text) => {
341-
return text === "" ? "Enter instructions for CodeBuddy or press Escape to close chat box" : null;
371+
return text === ""
372+
? "Enter instructions for CodeBuddy or press Escape to close chat box"
373+
: null;
342374
},
343375
});
344376
return userPrompt;
@@ -350,7 +382,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
350382
async execute(message?: string): Promise<void> {
351383
try {
352384
let prompt: string | undefined;
353-
const response = (await this.generateResponse(prompt ? prompt : message)) as string;
385+
const response = (await this.generateResponse(
386+
prompt ? prompt : message,
387+
)) as string;
354388
if (!response) {
355389
vscode.window.showErrorMessage("model not reponding, try again later");
356390
return;
@@ -383,7 +417,10 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
383417
break;
384418
}
385419
} catch (error) {
386-
this.logger.error("Error while passing model response to the webview", error);
420+
this.logger.error(
421+
"Error while passing model response to the webview",
422+
error,
423+
);
387424
}
388425
}
389426
}

src/emitter/publisher.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,27 @@ export class EventEmitter extends BaseEmitter<Record<string, IEventPayload>> {
99
onPromptGenerated: vscode.Event<IEventPayload> = this.createEvent("onQuery");
1010
onThinking: vscode.Event<IEventPayload> = this.createEvent("onThinking");
1111
onResponse: vscode.Event<IEventPayload> = this.createEvent("onResponse");
12-
onSecretChange: vscode.Event<IEventPayload> = this.createEvent("onSecretChange");
12+
onSecretChange: vscode.Event<IEventPayload> =
13+
this.createEvent("onSecretChange");
1314
onBootstrap: vscode.Event<IEventPayload> = this.createEvent("onBootstrap");
1415
onFileUpload: vscode.Event<IEventPayload> = this.createEvent("onFileUpload");
15-
onFileProcessSuccess: vscode.Event<IEventPayload> = this.createEvent("onFileProcessSuccess");
16-
onActiveworkspaceUpdate: vscode.Event<IEventPayload> = this.createEvent("onActiveworkspaceUpdate");
17-
onFilesRetrieved: vscode.Event<IEventPayload> = this.createEvent("onFilesRetrieved");
18-
onStrategizing: vscode.Event<IEventPayload> = this.createEvent("onStrategizing");
19-
onModelChange: vscode.Event<IEventPayload> = this.createEvent("onModelChange");
20-
onModelChangeSuccess: vscode.Event<IEventPayload> = this.createEvent("onModelChangeSuccess");
21-
onHistoryUpdated: vscode.Event<IEventPayload> = this.createEvent("onHistoryUpdated");
16+
onFileProcessSuccess: vscode.Event<IEventPayload> = this.createEvent(
17+
"onFileProcessSuccess",
18+
);
19+
onActiveworkspaceUpdate: vscode.Event<IEventPayload> = this.createEvent(
20+
"onActiveworkspaceUpdate",
21+
);
22+
onFilesRetrieved: vscode.Event<IEventPayload> =
23+
this.createEvent("onFilesRetrieved");
24+
onStrategizing: vscode.Event<IEventPayload> =
25+
this.createEvent("onStrategizing");
26+
onModelChange: vscode.Event<IEventPayload> =
27+
this.createEvent("onModelChange");
28+
onModelChangeSuccess: vscode.Event<IEventPayload> = this.createEvent(
29+
"onModelChangeSuccess",
30+
);
31+
onHistoryUpdated: vscode.Event<IEventPayload> =
32+
this.createEvent("onHistoryUpdated");
2233

2334
/**
2435
* Emits a generic event with specified status, message, and optional data.

src/extension.ts

Lines changed: 76 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import * as fs from "fs";
22
import * as path from "path";
33
import * as vscode from "vscode";
4-
import { APP_CONFIG, generativeAiModels, OLA_ACTIONS, USER_MESSAGE } from "./application/constant";
4+
import {
5+
APP_CONFIG,
6+
generativeAiModels,
7+
OLA_ACTIONS,
8+
USER_MESSAGE,
9+
} from "./application/constant";
510
import { Comments } from "./commands/comment";
611
import { ExplainCode } from "./commands/explain";
712
import { FixError } from "./commands/fixError";
@@ -86,7 +91,8 @@ export async function activate(context: vscode.ExtensionContext) {
8691
const { apiKey, model } = getAPIKeyAndModel("gemini");
8792
FileUploadService.initialize(apiKey);
8893
await credentials.initialize(context);
89-
const session: vscode.AuthenticationSession | undefined = await credentials.getSession();
94+
const session: vscode.AuthenticationSession | undefined =
95+
await credentials.getSession();
9096
logger.info(`Logged into GitHub as ${session?.account.label}`);
9197
Memory.getInstance();
9298

@@ -108,17 +114,47 @@ export async function activate(context: vscode.ExtensionContext) {
108114
generateCodeChart,
109115
inlineChat,
110116
} = OLA_ACTIONS;
111-
const getComment = new Comments(`${USER_MESSAGE} generates the code comments...`, context);
112-
const getInLineChat = new InLineChat(`${USER_MESSAGE} generates a response...`, context);
113-
const generateOptimizeCode = new OptimizeCode(`${USER_MESSAGE} optimizes the code...`, context);
114-
const generateRefactoredCode = new RefactorCode(`${USER_MESSAGE} refactors the code...`, context);
115-
const explainCode = new ExplainCode(`${USER_MESSAGE} explains the code...`, context);
116-
const generateReview = new ReviewCode(`${USER_MESSAGE} reviews the code...`, context);
117-
const codeChartGenerator = new CodeChartGenerator(`${USER_MESSAGE} creates the code chart...`, context);
118-
const generateCommitMessage = new GenerateCommitMessage(`${USER_MESSAGE} generates a commit message...`, context);
119-
const generateInterviewQuestions = new InterviewMe(`${USER_MESSAGE} generates interview questions...`, context);
120-
121-
const generateUnitTests = new GenerateUnitTest(`${USER_MESSAGE} generates unit tests...`, context);
117+
const getComment = new Comments(
118+
`${USER_MESSAGE} generates the code comments...`,
119+
context,
120+
);
121+
const getInLineChat = new InLineChat(
122+
`${USER_MESSAGE} generates a response...`,
123+
context,
124+
);
125+
const generateOptimizeCode = new OptimizeCode(
126+
`${USER_MESSAGE} optimizes the code...`,
127+
context,
128+
);
129+
const generateRefactoredCode = new RefactorCode(
130+
`${USER_MESSAGE} refactors the code...`,
131+
context,
132+
);
133+
const explainCode = new ExplainCode(
134+
`${USER_MESSAGE} explains the code...`,
135+
context,
136+
);
137+
const generateReview = new ReviewCode(
138+
`${USER_MESSAGE} reviews the code...`,
139+
context,
140+
);
141+
const codeChartGenerator = new CodeChartGenerator(
142+
`${USER_MESSAGE} creates the code chart...`,
143+
context,
144+
);
145+
const generateCommitMessage = new GenerateCommitMessage(
146+
`${USER_MESSAGE} generates a commit message...`,
147+
context,
148+
);
149+
const generateInterviewQuestions = new InterviewMe(
150+
`${USER_MESSAGE} generates interview questions...`,
151+
context,
152+
);
153+
154+
const generateUnitTests = new GenerateUnitTest(
155+
`${USER_MESSAGE} generates unit tests...`,
156+
context,
157+
);
122158

123159
const actionMap = {
124160
[comment]: async () => await getComment.execute(),
@@ -128,21 +164,29 @@ export async function activate(context: vscode.ExtensionContext) {
128164
[interviewMe]: async () => await generateInterviewQuestions.execute(),
129165
[generateUnitTest]: async () => await generateUnitTests.execute(),
130166
[fix]: (errorMessage: string) =>
131-
new FixError(`${USER_MESSAGE} finds a solution to the error...`, context, errorMessage).execute(errorMessage),
167+
new FixError(
168+
`${USER_MESSAGE} finds a solution to the error...`,
169+
context,
170+
errorMessage,
171+
).execute(errorMessage),
132172
[explain]: async () => await explainCode.execute(),
133-
[commitMessage]: async () => await generateCommitMessage.execute("commitMessage"),
173+
[commitMessage]: async () =>
174+
await generateCommitMessage.execute("commitMessage"),
134175
[generateCodeChart]: async () => await codeChartGenerator.execute(),
135176
[inlineChat]: async () => await getInLineChat.execute(),
136177
};
137178

138-
let subscriptions: vscode.Disposable[] = Object.entries(actionMap).map(([action, handler]) =>
139-
vscode.commands.registerCommand(action, handler)
179+
let subscriptions: vscode.Disposable[] = Object.entries(actionMap).map(
180+
([action, handler]) => vscode.commands.registerCommand(action, handler),
140181
);
141182

142183
const selectedGenerativeAiModel = getConfigValue("generativeAi.option");
143184

144185
const quickFix = new CodeActionsProvider();
145-
quickFixCodeAction = vscode.languages.registerCodeActionsProvider({ scheme: "file", language: "*" }, quickFix);
186+
quickFixCodeAction = vscode.languages.registerCodeActionsProvider(
187+
{ scheme: "file", language: "*" },
188+
quickFix,
189+
);
146190

147191
agentEventEmmitter = new EventEmitter();
148192

@@ -186,12 +230,23 @@ export async function activate(context: vscode.ExtensionContext) {
186230
const modelConfig = modelConfigurations[selectedGenerativeAiModel];
187231
const apiKey = getConfigValue(modelConfig.key);
188232
const apiModel = getConfigValue(modelConfig.model);
189-
providerManager.initializeProvider(selectedGenerativeAiModel, apiKey, apiModel, true);
233+
providerManager.initializeProvider(
234+
selectedGenerativeAiModel,
235+
apiKey,
236+
apiModel,
237+
true,
238+
);
190239
}
191-
context.subscriptions.push(...subscriptions, quickFixCodeAction, agentEventEmmitter);
240+
context.subscriptions.push(
241+
...subscriptions,
242+
quickFixCodeAction,
243+
agentEventEmmitter,
244+
);
192245
} catch (error) {
193246
Memory.clear();
194-
vscode.window.showErrorMessage("An Error occured while setting up generative AI model");
247+
vscode.window.showErrorMessage(
248+
"An Error occured while setting up generative AI model",
249+
);
195250
console.log(error);
196251
}
197252
}

0 commit comments

Comments
 (0)