Skip to content

Commit b2843f7

Browse files
Olasunkanmi OyinlolaOlasunkanmi Oyinlola
authored andcommitted
feat(llm): Introduce chat history management
- Implement ChatHistoryManager to handle LLM chat histories, supporting multiple models. - Add LLM_CONFIGS for managing model-specific configurations. - Enhance logging across various services and commands to improve debugging.
1 parent a86803b commit b2843f7

32 files changed

+283
-177
lines changed

src/application/constant.ts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ILLMConfig } from "../services/chat-history-manager";
2+
13
export const USER_MESSAGE = " ☕️ Hold on while CodeBuddy ";
24
export enum OLA_ACTIONS {
35
comment = "CodeBuddy.commentCode",
@@ -28,7 +30,7 @@ export enum COMMON {
2830
}
2931
export const GROQ_CONFIG = {
3032
temperature: 0.1,
31-
max_tokens: 8192,
33+
max_tokens: 6000,
3234
top_p: 1,
3335
stream: false,
3436
stop: ["thanks"],
@@ -361,3 +363,48 @@ const FILE_TYPE_PROMPTS: Record<string, string> = {
361363
json: "Parse this JSON file and provide a structured analysis:",
362364
default: "Extract all relevant information from this file:",
363365
};
366+
367+
export const LLM_CONFIGS: Record<string, ILLMConfig> = {
368+
gemini: {
369+
botRole: "model",
370+
userRole: "user",
371+
formatMessage: (role, content) => ({ role, parts: [{ text: content }] }),
372+
},
373+
groq: {
374+
botRole: "system",
375+
userRole: "user",
376+
formatMessage: (role, content) => ({ role, content }),
377+
},
378+
anthropic: {
379+
botRole: "assistant",
380+
userRole: "user",
381+
formatMessage: (role, content) => ({ role, content }),
382+
},
383+
};
384+
385+
//Note, this kind of configuration can be used by orchestrator on where to direct the requests
386+
// export const LLM_CONFIGS: Record<string, LLMConfig> = {
387+
// gemini: {
388+
// botRole: "model",
389+
// userRole: "user",
390+
// chatFormat: "markdown",
391+
// multiModalModel: "gemini-pro-vision",
392+
// codeInterpreter: true,
393+
// retriever: true,
394+
// fileUpload: true,
395+
// webSearch: true,
396+
// functionCalling: true,
397+
// codeInterpreterModel: "gemini-pro-vision",
398+
// retrieverModel: "gemini-pro",
399+
// webSearchModel: "gemini-pro",
400+
// functionCallingModel: "gemini-pro",
401+
// fileUploadModel: "gemini-pro-vision",
402+
// fileUploadPrompt: (fileType: string) => {
403+
// const prompt = FILE_TYPE_PROMPTS[fileType] || FILE_TYPE_PROMPTS.default;
404+
// return `${prompt} \n\n ${fileType} file content:`;
405+
// },
406+
// fileUploadHandler: (fileType: string) => {
407+
// return fileType === "pdf" ? "Upload PDF file" : "Upload file";
408+
// },
409+
// },
410+
// };

src/commands/generate-commit-message.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ export class GenerateCommitMessage extends CodeCommandHandler {
101101
If documentation or comments have been substantially modified, include this information.
102102
Avoid mentioning minor changes like code formatting, unless that's the primary purpose of the commit.
103103
When presented with a git diff, analyze it thoroughly and respond with a commit message formatted as described above. Your goal is to provide a clear, informative summary that helps developers quickly understand the nature and scope of the changes.
104+
Return your response as a markdown and use the pre tags.
104105
Here is the gitDifference
105106
${await this.getStagedDifferenceSummary()}`;
106107
}

src/commands/handler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
vscodeErrorMessage,
2020
} from "../utils/utils";
2121
import { Memory } from "../memory/base";
22-
import { Logger } from "../infrastructure/logger/logger";
22+
import { Logger, LogLevel } from "../infrastructure/logger/logger";
2323

2424
interface ICodeCommandHandler {
2525
getApplicationConfig(configKey: string): string | undefined;
@@ -66,7 +66,9 @@ export abstract class CodeCommandHandler implements ICodeCommandHandler {
6666
this.anthropicApiKey = getConfigValue(anthropicApiKey);
6767
this.xGrokApiKey = getConfigValue(grokApiKey);
6868
this.xGrokModel = getConfigValue(grokModel);
69-
this.logger = new Logger("CodeCommandHandler");
69+
this.logger = Logger.initialize("CodeCommandHandler", {
70+
minLevel: LogLevel.DEBUG,
71+
});
7072
}
7173

7274
getApplicationConfig(configKey: string): string | undefined {

src/emitter/base.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import * as vscode from "vscode";
2-
import { Logger } from "../infrastructure/logger/logger";
2+
import { Logger, LogLevel } from "../infrastructure/logger/logger";
33
import { IEventPayload } from "./interface";
44
export class BaseEmitter<EventMap extends Record<string, IEventPayload>> {
55
protected logger: Logger;
66
constructor() {
7-
this.logger = new Logger("BaseEmitter");
7+
this.logger = Logger.initialize("CodeCommandHandler", {
8+
minLevel: LogLevel.DEBUG,
9+
});
810
}
911
private readonly emitters: Map<keyof EventMap, vscode.EventEmitter<any>> =
1012
new Map();

src/extension.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@ import { EventEmitter } from "./emitter/publisher";
2222
import { Logger, LogLevel } from "./infrastructure/logger/logger";
2323
import { dbManager } from "./infrastructure/repository/database-manager";
2424
import { Memory } from "./memory/base";
25+
import { FileManager } from "./services/file-manager";
26+
import { FileUploadService } from "./services/file-upload";
27+
import { Credentials } from "./services/github-authentication";
28+
import { getAPIKeyAndModel, getConfigValue } from "./utils/utils";
2529
import { AnthropicWebViewProvider } from "./webview-providers/anthropic";
2630
import { CodeActionsProvider } from "./webview-providers/code-actions";
2731
import { DeepseekWebViewProvider } from "./webview-providers/deepseek";
2832
import { GeminiWebViewProvider } from "./webview-providers/gemini";
2933
import { GroqWebViewProvider } from "./webview-providers/groq";
30-
import { FileManager } from "./services/file-manager";
31-
import { FileUploadService } from "./services/file-upload";
32-
import { initializeGenerativeAiEnvironment } from "./services/generative-ai-model-manager";
33-
import { Credentials } from "./services/github-authentication";
34-
import { getAPIKeyAndModel, getConfigValue } from "./utils/utils";
3534
import { WebViewProviderManager } from "./webview-providers/manager";
3635

3736
const {

src/infrastructure/http/http-service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import {
55
RequestHeader,
66
} from "../../application/constant";
77
import { HttpRequestOptions } from "../../application/interfaces";
8-
import { Logger } from "../logger/logger";
8+
import { Logger, LogLevel } from "../logger/logger";
99
import { IHttpClient } from "./http-service.interface";
1010

1111
export class HttpClient implements IHttpClient {
1212
protected readonly logger: Logger;
1313

1414
private static instance: HttpClient;
1515
constructor() {
16-
this.logger = new Logger("HttpClient");
16+
this.logger = Logger.initialize("HttpClient", { minLevel: LogLevel.DEBUG });
1717
}
1818

1919
static getInstance() {

src/infrastructure/repository/code.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Client, ResultSet, Row } from "@libsql/client";
22
import { ICodeRepository } from "../../application/interfaces/code.repository.interface";
3-
import { Logger } from "../logger/logger";
3+
import { Logger, LogLevel } from "../logger/logger";
44
import { dbManager } from "./database-manager";
55
import {
66
createIndex,
@@ -14,7 +14,9 @@ export class CodeRepository implements ICodeRepository {
1414
private static instance: CodeRepository;
1515
private readonly logger: Logger;
1616
private constructor() {
17-
this.logger = new Logger("CodeRepository");
17+
this.logger = Logger.initialize("CodeRepository", {
18+
minLevel: LogLevel.DEBUG,
19+
});
1820
this.client = dbManager.getClient();
1921
}
2022

src/infrastructure/repository/database-manager.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { Client, createClient } from "@libsql/client";
22
import * as vscode from "vscode";
3-
import { Logger } from "../logger/logger";
3+
import { Logger, LogLevel } from "../logger/logger";
44

55
class DatabaseManager {
66
private client: Client | undefined;
77
private static instance: DatabaseManager;
88
private readonly logger: Logger;
99
private constructor() {
10-
this.logger = new Logger("DatabaseManager");
10+
this.logger = Logger.initialize("DatabaseManager", {
11+
minLevel: LogLevel.DEBUG,
12+
});
1113
}
1214

1315
/**

src/infrastructure/storage/local-storage.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import * as vscode from "vscode";
2-
import { Logger } from "../logger/logger";
2+
import { Logger, LogLevel } from "../logger/logger";
33

44
export class LocalStorageManager {
55
private readonly localStorage: vscode.SecretStorage;
66
private readonly logger: Logger;
77
constructor(context: vscode.ExtensionContext) {
88
this.localStorage = context.secrets;
9-
this.logger = new Logger("localStorageManager");
9+
this.logger = Logger.initialize("LocalStorageManager", {
10+
minLevel: LogLevel.DEBUG,
11+
});
1012
this.localStorage.onDidChange(this.handleOnChange.bind(this));
1113
}
1214

src/llms/base.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Logger } from "../infrastructure/logger/logger";
2+
import { LogLevel } from "../services/telemetry";
23
import { validateLlmConfig } from "../utils/llm-config-validator";
34
import { IBaseLLM, ILlmConfig } from "./interface";
45

@@ -7,7 +8,7 @@ export abstract class BaseLLM<T extends Record<string, any>>
78
{
89
protected logger: Logger;
910
constructor(protected config: ILlmConfig) {
10-
this.logger = new Logger("BaseLLM");
11+
this.logger = Logger.initialize("BaseLLM", { minLevel: LogLevel.DEBUG });
1112
this.validateConfig();
1213
}
1314

0 commit comments

Comments
 (0)