159 lines
4.7 KiB
TypeScript
159 lines
4.7 KiB
TypeScript
import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting, ItemView, WorkspaceLeaf } from 'obsidian';
|
|
import { EventBus } from './src/utils/EventBus';
|
|
import { GraphView, GRAPH_VIEW_TYPE } from './src/views/GraphView';
|
|
import { ChatView, CHAT_VIEW_TYPE } from './src/views/ChatView';
|
|
|
|
import 'src/css/styles.css'; // Путь к твоему новому CSS файлу
|
|
|
|
// ----------------------------------------------- Settings ---------------------------------------------------------------
|
|
|
|
interface LLMAgentSettings {
|
|
apiBaseUrl: string;
|
|
systemPrompt: string;
|
|
}
|
|
|
|
const DEFAULT_SETTINGS: LLMAgentSettings = {
|
|
apiBaseUrl: 'http://localhost:5000/api',
|
|
systemPrompt: 'Ты полезный ИИ ассистент.',
|
|
};
|
|
|
|
// ----------------------------------------------- Main Plugin Class ---------------------------------------------------------------
|
|
|
|
export default class LLMAgentPlugin extends Plugin {
|
|
settings: LLMAgentSettings;
|
|
eventBus: EventBus;
|
|
|
|
async onload() {
|
|
await this.loadSettings();
|
|
|
|
this.eventBus = new EventBus();
|
|
|
|
// Регистрируем кастомные views
|
|
this.registerView(GRAPH_VIEW_TYPE, (leaf) => new GraphView(leaf, this));
|
|
this.registerView(CHAT_VIEW_TYPE, (leaf) => new ChatView(leaf, this));
|
|
|
|
// Добавляем команды
|
|
this.addCommand({
|
|
id: 'open-llm-agent-graph',
|
|
name: 'Открыть граф диалогов LLM Agent',
|
|
callback: () => this.activateGraphView()
|
|
});
|
|
|
|
this.addCommand({
|
|
id: 'open-llm-agent-chat',
|
|
name: 'Открыть чат LLM Agent',
|
|
callback: () => this.activateChatView()
|
|
});
|
|
|
|
this.addCommand({
|
|
id: 'new-llm-agent-chat',
|
|
name: 'Новый чат LLM Agent',
|
|
callback: () => this.handleNewChat()
|
|
});
|
|
|
|
// Добавляем иконку в ribbon
|
|
this.addRibbonIcon('brain-circuit', 'LLM Agent', () => {
|
|
this.activateGraphView();
|
|
this.activateChatView();
|
|
});
|
|
|
|
console.log('LLM Agent plugin загружен');
|
|
|
|
// This adds a settings tab so the user can configure various aspects of the plugin
|
|
this.addSettingTab(new SampleSettingTab(this.app, this));
|
|
}
|
|
|
|
onunload() {
|
|
console.log('LLM Agent plugin выгружен');
|
|
}
|
|
|
|
// ----------------------------------------------- Settings Management ---------------------------------------------------------------
|
|
|
|
async loadSettings() {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
}
|
|
|
|
async saveSettings() {
|
|
await this.saveData(this.settings);
|
|
}
|
|
|
|
// ----------------------------------------------- View Management ---------------------------------------------------------------
|
|
|
|
async activateGraphView() {
|
|
const existingLeaf = this.app.workspace.getLeavesOfType(GRAPH_VIEW_TYPE)[0];
|
|
if (existingLeaf) {
|
|
this.app.workspace.revealLeaf(existingLeaf);
|
|
} else {
|
|
await this.app.workspace.getLeaf('tab').setViewState({
|
|
type: GRAPH_VIEW_TYPE,
|
|
active: true
|
|
});
|
|
}
|
|
}
|
|
|
|
async activateChatView() {
|
|
const existingLeaf = this.app.workspace.getLeavesOfType(CHAT_VIEW_TYPE)[0];
|
|
if (existingLeaf) {
|
|
this.app.workspace.revealLeaf(existingLeaf);
|
|
} else {
|
|
const rightLeaf = this.app.workspace.getRightLeaf(false);
|
|
if (rightLeaf) {
|
|
await rightLeaf.setViewState({
|
|
type: CHAT_VIEW_TYPE,
|
|
active: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------- Event Handlers ---------------------------------------------------------------
|
|
|
|
handleNewChat() {
|
|
this.eventBus.emit('new-chat');
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------- Sample Setting Tab ---------------------------------------------------------------
|
|
|
|
class SampleSettingTab extends PluginSettingTab {
|
|
plugin: LLMAgentPlugin;
|
|
|
|
constructor(app: App, plugin: LLMAgentPlugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
|
|
display(): void {
|
|
const { containerEl } = this;
|
|
|
|
containerEl.empty();
|
|
|
|
new Setting(containerEl)
|
|
.setName('API Base URL')
|
|
.setDesc('Базовый URL для API LLM Agent')
|
|
.addText((text) =>
|
|
text
|
|
.setPlaceholder('Введите URL')
|
|
.setValue(this.plugin.settings.apiBaseUrl)
|
|
.onChange(async (value) => {
|
|
this.plugin.settings.apiBaseUrl = value;
|
|
await this.plugin.saveSettings();
|
|
})
|
|
);
|
|
|
|
// Новое поле для системного промпта
|
|
new Setting(containerEl)
|
|
.setName('Системный промпт')
|
|
.setDesc('Этот промпт будет отправляться LLM перед каждым диалогом.')
|
|
.addTextArea((text) =>
|
|
text
|
|
.setPlaceholder('Ты полезный ИИ ассистент.')
|
|
.setValue(this.plugin.settings.systemPrompt)
|
|
.onChange(async (value) => {
|
|
this.plugin.settings.systemPrompt = value;
|
|
await this.plugin.saveSettings();
|
|
})
|
|
);
|
|
}
|
|
}
|