Skip to content

feat(chat): make chat general available #44

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

Merged
merged 4 commits into from
May 12, 2024
Merged
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
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@
"type": "webview",
"id": "firecoder.chat-gui",
"name": "",
"visibility": "visible",
"when": "config.firecoder.experimental.chat || config.firecoder.cloud.use"
"visibility": "visible"
}
]
},
Expand Down
1 change: 0 additions & 1 deletion src/common/auth/supabaseClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ export const getSuppabaseClient = () => {
autoRefreshToken: true,
persistSession: true,
detectSessionInUrl: false,
debug: true,
storage: secretsStorage,
},
});
Expand Down
65 changes: 64 additions & 1 deletion src/common/panel/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import { getNonce } from "../utils/getNonce";
import { chat } from "../chat";
import { Chat, ChatMessage } from "../prompt/promptChat";
import { state } from "../utils/state";
import { configuration } from "../utils/configuration";
import { TypeModelsChat, modelsChat, servers } from "../server";
import { getSuppabaseClient } from "../auth/supabaseClient";

export type MessageType =
| {
Expand All @@ -29,6 +32,12 @@ type MessageToExtention =
type: "abort-generate";
id: string;
}
| {
type: "get-settings";
}
| {
type: "enable-chat";
}
| {
type: "get-chat";
chatId: string;
Expand Down Expand Up @@ -173,6 +182,16 @@ export class ChatPanel implements vscode.WebviewViewProvider {
id: message.id,
});
break;
case "get-settings":
await this.handleGetSettings({
id: message.id,
});
break;
case "enable-chat":
await this.handleEnableChat({
id: message.id,
});
break;
default:
break;
}
Expand Down Expand Up @@ -213,6 +232,40 @@ export class ChatPanel implements vscode.WebviewViewProvider {
sendResponse("", true);
}

private async handleGetSettings({ id }: { id: string }) {
const settigns = await this.getSettings();

await this.postMessage({
type: "e2w-response",
id: id,
data: settigns,
done: true,
});
}

private async getSettings() {
const cloudUsing = configuration.get("cloud.use");
const cloudChatUsing = configuration.get("cloud.chat.use");
const chatServerIsWorking = Object.keys(modelsChat)
.map(
(chatModel) => servers[chatModel as TypeModelsChat].status === "started"
)
.some((serverIsWorking) => serverIsWorking);

const localChatUsing = configuration.get("experimental.chat");
const supabase = getSuppabaseClient();
const sesssion = await supabase.auth.getSession();
const userLoggined = sesssion.data.session ? true : false;

const chatEnabled =
(localChatUsing && chatServerIsWorking) || (cloudUsing && cloudChatUsing);

return {
chatEnabled: chatEnabled,
userLoggined: userLoggined,
};
}

private async handleGetChat({ chatId, id }: { chatId: string; id: string }) {
const sendResponse = (messageToResponse: Chat | null, done: boolean) => {
this.postMessage({
Expand Down Expand Up @@ -270,7 +323,17 @@ export class ChatPanel implements vscode.WebviewViewProvider {
await this.postMessage({
type: "e2w-response",
id: id,
data: "",
data: true,
done: true,
});
}

private async handleEnableChat({ id }: { id: string }) {
await configuration.set("experimental.chat", true);
await this.postMessage({
type: "e2w-response",
id: id,
data: true,
done: true,
});
}
Expand Down
6 changes: 3 additions & 3 deletions src/common/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const modelsBase = {
};
export type TypeModelsBase = keyof typeof modelsBase;

const modelsChat = {
export const modelsChat = {
"chat-small": {
port: 39725,
},
Expand Down Expand Up @@ -197,7 +197,7 @@ class Server {
});

const isServerStarted = await this.checkServerStatusIntervalWithTimeout(
1000000
20000
);

if (!isServerStarted) {
Expand All @@ -217,7 +217,7 @@ class Server {
return true;
}

public async stopServer() {
public stopServer() {
if (this.serverProcess) {
const result = this.serverProcess.kill(9);
if (result === false) {
Expand Down
13 changes: 8 additions & 5 deletions src/common/utils/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,6 @@ interface ConfigurationPropertiesType
}

class Configuration {
// private configuration: vscode.WorkspaceConfiguration;
// constructor() {
// this.configuration = vscode.workspace.getConfiguration("firecoder");
// }

public get<T extends keyof ConfigurationPropertiesType>(
property: T
): ConfigurationPropertiesType[T]["possibleValues"] {
Expand All @@ -100,6 +95,14 @@ class Configuration {

return value ?? ConfigurationProperties[property]["default"];
}

public async set<T extends keyof ConfigurationPropertiesType>(
property: T,
value: ConfigurationPropertiesType[T]["possibleValues"]
) {
const configuration = vscode.workspace.getConfiguration("firecoder");
await configuration.update(property, value, true);
}
}

export const configuration = new Configuration();
150 changes: 79 additions & 71 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,18 +70,13 @@ export async function activate(context: vscode.ExtensionContext) {
vscode.workspace.onDidChangeConfiguration(async (event) => {
if (event.affectsConfiguration("firecoder.cloud.use")) {
const cloudUse = configuration.get("cloud.use");
const supabase = getSuppabaseClient();
if (cloudUse === true) {
const supabase = getSuppabaseClient();

const data = await supabase.auth.getUser();
if (data.error) {
await login();
return;
}
} else {
const supabase = getSuppabaseClient();

await supabase.auth.signOut();
}
}
});
Expand All @@ -94,87 +89,67 @@ export async function activate(context: vscode.ExtensionContext) {
})
);

vscode.workspace.onDidChangeConfiguration(async (event) => {
if (
event.affectsConfiguration("firecoder.cloud.use") ||
event.affectsConfiguration("firecoder.experimental.chat") ||
event.affectsConfiguration("firecoder.completion.manuallyMode") ||
event.affectsConfiguration("firecoder.completion.autoMode") ||
event.affectsConfiguration(
"firecoder.experimental.useGpu.linux.nvidia"
) ||
event.affectsConfiguration("firecoder.experimental.useGpu.osx.metal") ||
event.affectsConfiguration(
"firecoder.experimental.useGpu.windows.nvidia"
) ||
event.affectsConfiguration("firecoder.server.usePreRelease") ||
event.affectsConfiguration("firecoder.cloud.use.chat") ||
event.affectsConfiguration("firecoder.cloud.use.autocomplete")
) {
Object.values(servers).forEach((server) => server.stopServer());

const completionServers =
configuration.get("cloud.use") &&
configuration.get("cloud.autocomplete.use")
? []
: new Set([
configuration.get("completion.autoMode"),
configuration.get("completion.manuallyMode"),
]);
const serversToStart = [
...completionServers,
...(configuration.get("experimental.chat") &&
configuration.get("cloud.use") &&
configuration.get("cloud.chat.use")
? []
: ["chat-medium" as const]),
];
await Promise.all(
serversToStart.map((serverType) => servers[serverType].startServer())
);
const startChat = async () => {
if (configuration.get("cloud.use") && configuration.get("cloud.chat.use")) {
Logger.info("Use cloud for chat.", {
component: "main",
sendTelemetry: true,
});
} else if (configuration.get("experimental.chat")) {
Logger.info("Use local for chat.", {
component: "main",
sendTelemetry: true,
});
try {
await servers["chat-medium"].startServer();
} catch (error) {
vscode.window.showErrorMessage((error as Error).message);
Logger.error(error, {
component: "server",
sendTelemetry: true,
});
}
Logger.info("Chat is ready to start.", {
component: "main",
sendTelemetry: true,
});
} else {
Logger.info("Chat is not enable", {
component: "main",
sendTelemetry: true,
});
}
});
};

(async () => {
if (configuration.get("cloud.use")) {
Logger.info("Use cloud for chat and completions", {
const startCompletion = async (registerCompletionProvider: boolean) => {
if (
configuration.get("cloud.use") &&
configuration.get("cloud.autocomplete.use")
) {
Logger.info("Use cloud for auto completions.", {
component: "main",
sendTelemetry: true,
});

const InlineCompletionProvider = getInlineCompletionProvider(context);
vscode.languages.registerInlineCompletionItemProvider(
{ pattern: "**" },
InlineCompletionProvider
);
} else {
Logger.info("Use local for auto completions.", {
component: "main",
sendTelemetry: true,
});
try {
const completionServers = configuration.get("cloud.use")
? []
: new Set([
configuration.get("completion.autoMode"),
configuration.get("completion.manuallyMode"),
]);
const serversStarted = await Promise.all(
[
...completionServers,
...(configuration.get("experimental.chat") &&
!configuration.get("cloud.use")
? ["chat-medium" as const]
: []),
...new Set([
configuration.get("completion.autoMode"),
configuration.get("completion.manuallyMode"),
]),
].map((serverType) => servers[serverType].startServer())
);

if (serversStarted.some((serverStarted) => serverStarted)) {
Logger.info("Server inited", {
Logger.info("Servers inited", {
component: "main",
sendTelemetry: true,
});
const InlineCompletionProvider = getInlineCompletionProvider(context);
vscode.languages.registerInlineCompletionItemProvider(
{ pattern: "**" },
InlineCompletionProvider
);
}
} catch (error) {
vscode.window.showErrorMessage((error as Error).message);
Expand All @@ -184,12 +159,45 @@ export async function activate(context: vscode.ExtensionContext) {
});
}
}
if (registerCompletionProvider) {
const InlineCompletionProvider = getInlineCompletionProvider(context);
vscode.languages.registerInlineCompletionItemProvider(
{ pattern: "**" },
InlineCompletionProvider
);
}
};

(async () => {
await Promise.all([startChat(), startCompletion(true)]);

Logger.info("FireCoder is ready.", {
component: "main",
sendTelemetry: true,
});
})();

vscode.workspace.onDidChangeConfiguration(async (event) => {
if (
event.affectsConfiguration("firecoder.cloud.use") ||
event.affectsConfiguration("firecoder.cloud.chat.use") ||
event.affectsConfiguration("firecoder.cloud.autocomplete.use") ||
event.affectsConfiguration("firecoder.experimental.chat") ||
event.affectsConfiguration("firecoder.completion.manuallyMode") ||
event.affectsConfiguration("firecoder.completion.autoMode") ||
event.affectsConfiguration(
"firecoder.experimental.useGpu.linux.nvidia"
) ||
event.affectsConfiguration("firecoder.experimental.useGpu.osx.metal") ||
event.affectsConfiguration(
"firecoder.experimental.useGpu.windows.nvidia"
) ||
event.affectsConfiguration("firecoder.server.usePreRelease")
) {
Object.values(servers).forEach((server) => server.stopServer());
await Promise.all([startChat(), startCompletion(false)]);
}
});
}

export function deactivate() {
Expand Down
Loading