264 lines
8.7 KiB
TypeScript
264 lines
8.7 KiB
TypeScript
import { commands, window, workspace, env, ConfigurationTarget, Uri } from "vscode";
|
|
import { agent } from "./agent";
|
|
|
|
function showInformationWhenInitializing() {
|
|
window.showInformationMessage("Tabby is initializing.", "Settings").then((selection) => {
|
|
switch (selection) {
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationWhenAutomaticTrigger() {
|
|
window
|
|
.showInformationMessage(
|
|
"Tabby automatic code completion is enabled. Switch to manual trigger mode?",
|
|
"Manual Mode",
|
|
"Settings",
|
|
)
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Manual Mode":
|
|
commands.executeCommand("tabby.toggleInlineCompletionTriggerMode", "manual");
|
|
break;
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationWhenManualTrigger() {
|
|
window
|
|
.showInformationMessage(
|
|
"Tabby is standing by. Trigger code completion manually?",
|
|
"Trigger",
|
|
"Automatic Mode",
|
|
"Settings",
|
|
)
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Trigger":
|
|
commands.executeCommand("editor.action.inlineSuggest.trigger");
|
|
break;
|
|
case "Automatic Mode":
|
|
commands.executeCommand("tabby.toggleInlineCompletionTriggerMode", "automatic");
|
|
break;
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationWhenManualTriggerLoading() {
|
|
window.showInformationMessage("Tabby is generating code completions.", "Settings").then((selection) => {
|
|
switch (selection) {
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationWhenInlineSuggestDisabled() {
|
|
window
|
|
.showWarningMessage(
|
|
"Tabby's suggestion is not showing because inline suggestion is disabled. Please enable it first.",
|
|
"Enable",
|
|
"Settings",
|
|
)
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Enable":
|
|
const configuration = workspace.getConfiguration("editor");
|
|
console.debug(`Set editor.inlineSuggest.enabled: true.`);
|
|
configuration.update("inlineSuggest.enabled", true, ConfigurationTarget.Global, false);
|
|
break;
|
|
case "Settings":
|
|
commands.executeCommand("workbench.action.openSettings", "@id:editor.inlineSuggest.enabled");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationWhenDisconnected() {
|
|
window
|
|
.showInformationMessage("Cannot connect to Tabby Server. Please check settings.", "Settings")
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationStartAuth(callbacks?: { onAuthStart?: () => void; onAuthEnd?: () => void }) {
|
|
window
|
|
.showWarningMessage(
|
|
"Tabby Server requires authorization. Continue to open authorization page in your browser.",
|
|
"Continue",
|
|
"Settings",
|
|
)
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Continue":
|
|
commands.executeCommand("tabby.openAuthPage", callbacks);
|
|
break;
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
}
|
|
});
|
|
}
|
|
|
|
function showInformationAuthSuccess() {
|
|
window.showInformationMessage("Congrats, you're authorized, start to use Tabby now.");
|
|
}
|
|
|
|
function showInformationWhenStartAuthButAlreadyAuthorized() {
|
|
window.showInformationMessage("You are already authorized now.");
|
|
}
|
|
|
|
function showInformationWhenAuthFailed() {
|
|
window.showWarningMessage("Cannot connect to server. Please check settings.", "Settings").then((selection) => {
|
|
switch (selection) {
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
function getHelpMessageForCompletionResponseTimeIssue() {
|
|
let helpMessageForRunningLargeModelOnCPU = "";
|
|
const serverHealthState = agent().getServerHealthState();
|
|
if (serverHealthState?.device === "cpu" && serverHealthState?.model?.match(/[0-9\.]+B$/)) {
|
|
helpMessageForRunningLargeModelOnCPU +=
|
|
`Your Tabby server is running model ${serverHealthState?.model} on CPU. ` +
|
|
"This model may be performing poorly due to its large parameter size, please consider trying smaller models or switch to GPU. " +
|
|
"You can find a list of supported models in the model directory.\n";
|
|
}
|
|
let commonHelpMessage = "";
|
|
const host = new URL(agent().getConfig().server.endpoint).host;
|
|
if (helpMessageForRunningLargeModelOnCPU.length == 0) {
|
|
commonHelpMessage += ` - The running model ${
|
|
serverHealthState?.model ?? ""
|
|
} may be performing poorly due to its large parameter size. `;
|
|
commonHelpMessage +=
|
|
"Please consider trying smaller models. You can find a list of supported models in the model directory.\n";
|
|
}
|
|
if (!(host.startsWith("localhost") || host.startsWith("127.0.0.1"))) {
|
|
commonHelpMessage += " - A poor network connection. Please check your network and proxy settings.\n";
|
|
commonHelpMessage += " - Server overload. Please contact your Tabby server administrator for assistance.\n";
|
|
}
|
|
let message = "";
|
|
if (helpMessageForRunningLargeModelOnCPU.length > 0) {
|
|
message += helpMessageForRunningLargeModelOnCPU + "\n";
|
|
if (commonHelpMessage.length > 0) {
|
|
message += "Other possible causes of this issue: \n";
|
|
message += commonHelpMessage;
|
|
}
|
|
} else {
|
|
// commonHelpMessage should not be empty here
|
|
message += "Possible causes of this issue: \n";
|
|
message += commonHelpMessage;
|
|
}
|
|
return message;
|
|
}
|
|
|
|
function showInformationWhenSlowCompletionResponseTime(modal: boolean = false) {
|
|
if (modal) {
|
|
const stats = agent().getIssueDetail({ name: "slowCompletionResponseTime" })?.completionResponseStats;
|
|
let statsMessage = "";
|
|
if (stats && stats["responses"] && stats["averageResponseTime"]) {
|
|
statsMessage = `The average response time of recent ${stats["responses"]} completion requests is ${Number(
|
|
stats["averageResponseTime"],
|
|
).toFixed(0)}ms.\n\n`;
|
|
}
|
|
window
|
|
.showWarningMessage(
|
|
"Completion requests appear to take too much time.",
|
|
{
|
|
modal: true,
|
|
detail: statsMessage + getHelpMessageForCompletionResponseTimeIssue(),
|
|
},
|
|
"Model Directory",
|
|
)
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Model Directory":
|
|
env.openExternal(Uri.parse("https://tabby.tabbyml.com/docs/models/"));
|
|
break;
|
|
}
|
|
});
|
|
} else {
|
|
window
|
|
.showWarningMessage("Completion requests appear to take too much time.", "Detail", "Settings")
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Detail":
|
|
showInformationWhenSlowCompletionResponseTime(true);
|
|
break;
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function showInformationWhenHighCompletionTimeoutRate(modal: boolean = false) {
|
|
if (modal) {
|
|
const stats = agent().getIssueDetail({ name: "highCompletionTimeoutRate" })?.completionResponseStats;
|
|
let statsMessage = "";
|
|
if (stats && stats["total"] && stats["timeouts"]) {
|
|
statsMessage = `${stats["timeouts"]} of ${stats["total"]} completion requests timed out.\n\n`;
|
|
}
|
|
window
|
|
.showWarningMessage(
|
|
"Most completion requests timed out.",
|
|
{
|
|
modal: true,
|
|
detail: statsMessage + getHelpMessageForCompletionResponseTimeIssue(),
|
|
},
|
|
"Model Directory",
|
|
)
|
|
.then((selection) => {
|
|
switch (selection) {
|
|
case "Model Directory":
|
|
env.openExternal(Uri.parse("https://tabby.tabbyml.com/docs/models/"));
|
|
break;
|
|
}
|
|
});
|
|
} else {
|
|
window.showWarningMessage("Most completion requests timed out.", "Detail", "Settings").then((selection) => {
|
|
switch (selection) {
|
|
case "Detail":
|
|
showInformationWhenHighCompletionTimeoutRate(true);
|
|
break;
|
|
case "Settings":
|
|
commands.executeCommand("tabby.openSettings");
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
export const notifications = {
|
|
showInformationWhenInitializing,
|
|
showInformationWhenAutomaticTrigger,
|
|
showInformationWhenManualTrigger,
|
|
showInformationWhenManualTriggerLoading,
|
|
showInformationWhenInlineSuggestDisabled,
|
|
showInformationWhenDisconnected,
|
|
showInformationStartAuth,
|
|
showInformationAuthSuccess,
|
|
showInformationWhenStartAuthButAlreadyAuthorized,
|
|
showInformationWhenAuthFailed,
|
|
showInformationWhenSlowCompletionResponseTime,
|
|
showInformationWhenHighCompletionTimeoutRate,
|
|
};
|