diff --git a/README.md b/README.md index 14ffa40..af0a1b7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -![Perplexed: An Obsidian Plugin for Perplexity and Perplexica](https://i.imgur.com/MVOK3rk.png) +![Perplexed: An Obsidian Plugin for Perplexity and Perplexica / Vane](https://i.imgur.com/MVOK3rk.png) # Perplexed: AI Content Generation for Obsidian -**Perplexed** is an Obsidian plugin that enables AI-powered content generation with source citations using [Perplexity](https://www.perplexity.ai/) and [Perplexica](https://perplexica.io/). This plugin brings research-grade AI capabilities directly into your Obsidian workspace, allowing you to generate well-cited content for your notes. +**Perplexed** is an Obsidian plugin that enables AI-powered content generation with source citations using [Perplexity](https://www.perplexity.ai/), [Anthropic Claude](https://www.anthropic.com/), and [Perplexica / Vane](https://github.com/ItzCrazyKns/Vane) (self-hosted). This plugin brings research-grade AI capabilities directly into your Obsidian workspace, allowing you to generate well-cited content for your notes. ## 🎯 Key Features @@ -15,7 +15,7 @@ ## 🎯 Key Features [2]: 2025, Jun 16. [Governance, risk and compliance (GRC): Definitions and resources](https://www.diligent.com/resources/guides/grc). Published: 2025-05-27 | Updated: 2025-06-16 > ``` -- **Multiple AI Providers**: Support for Perplexity, Anthropic Claude, Perplexica (self-hosted), and LM Studio (local) +- **Multiple AI Providers**: Support for Perplexity, Anthropic Claude, Perplexica / Vane (self-hosted), and LM Studio (local) - **Streaming Responses**: Real-time streaming of AI responses for better UX - **Flexible Configuration**: Customizable endpoints, models, and parameters - **Deep Research Mode**: Comprehensive research across hundreds of sources @@ -32,7 +32,7 @@ ## Network use and accounts |---|---|---|---| | Perplexity | `https://api.perplexity.ai/chat/completions` | Required | Required (paid) | | Anthropic Claude | `https://api.anthropic.com/v1/messages` | Required | Required (paid) | -| Perplexica | `http://localhost:3030/api/search` (default; user-configurable) | Not required | Not required (self-hosted) | +| Perplexica / Vane ([install required](https://github.com/ItzCrazyKns/Vane)) | `http://localhost:3030/api/search` (default; user-configurable) | Not required | Not required (self-hosted, runs locally) | | LM Studio | `http://localhost:1234/v1/chat/completions` (default; user-configurable) | Not required | Not required (runs locally) | The plugin does not collect telemetry, ship vault content anywhere else, @@ -45,7 +45,7 @@ ## 📋 Table of Contents - [Installation](#installation) - [Initial Setup](#initial-setup) - [Using Perplexity](#using-perplexity) - - [Using Perplexica](#using-perplexica) + - [Using Perplexica / Vane](#using-perplexica--vane) - [Using LM Studio](#using-lm-studio) - [Command Reference](#command-reference) - [Developer Onboarding](#developer-onboarding) @@ -87,18 +87,39 @@ ### 1. Configure Perplexity (Recommended for most users) - Enter your Perplexity API key - The default endpoint should work: `https://api.perplexity.ai/chat/completions` -### 2. Configure Perplexica (Self-hosted alternative) +### 2. Configure Perplexica / Vane (self-hosted — requires local install) -Perplexica is a free, open-source alternative that you can host yourself. +Perplexica / Vane is a free, open-source AI search engine that you run +**locally on your own machine**. This plugin does not bundle the server +or proxy to a hosted instance — you must install and run it yourself +before the "Ask Perplexica / Vane" command will work. -1. **Set up Perplexica Server**: - - Follow the [Perplexica setup guide](https://perplexica.io/) - - Ensure your server is running and accessible +> **Note on naming:** The maintainer (`ItzCrazyKns`) renamed the +> open-source self-hosted repo from **Perplexica** to **Vane** on +> 2026-03-09 (commit `feat(app): rename to 'vane'`). The old GitHub URL +> `ItzCrazyKns/Perplexica` redirects to `ItzCrazyKns/Vane`. A hosted +> service at [perplexica.io](https://perplexica.io/) remains live under +> the Perplexica name — that's a separate hosted product, not what you +> self-install for use with this plugin. The local API surface this +> plugin talks to (`/api/search`, focus modes, optimization modes) is +> unchanged across the rename. -2. **Configure in Plugin**: - - Open plugin settings - - Set the Perplexica endpoint (e.g., `http://localhost:3030/api/search`) - - Configure your preferred model and settings +1. **Install Perplexica / Vane locally**: + - Repo and full installation docs: + [github.com/ItzCrazyKns/Vane](https://github.com/ItzCrazyKns/Vane) + - Docker is the recommended install path; the repo's README walks + through `docker-compose` setup, configuring SearXNG, and choosing + your local LLM provider (Ollama, LM Studio, OpenAI-compatible + endpoints, etc.). + - Confirm the server is running and reachable, e.g.: + `curl http://localhost:3030/api/search` + +2. **Configure in this plugin**: + - Open Obsidian Settings → Community Plugins → Perplexed + - Set the Perplexica / Vane endpoint to where your local server is + listening (default: `http://localhost:3030/api/search`) + - Pick a focus mode, optimization mode, and the local model you've + configured the server to use ### 3. Configure LM Studio (Optional) @@ -195,12 +216,12 @@ #### Example Usage Artificial Intelligence (AI) is fundamentally transforming how we work across various industries and sectors. From automating routine tasks to enabling more sophisticated decision-making processes, AI technologies are reshaping traditional workflows and creating new opportunities for productivity and innovation. ``` -## Using Perplexica +## Using Perplexica / Vane ### Quick Start 1. **Open Command Palette**: `Ctrl/Cmd + Shift + P` -2. **Run Command**: Type "Ask Perplexica" and select it +2. **Run Command**: Type "Ask Perplexica / Vane" and select it 3. **Enter Your Question**: Type your research question 4. **Configure Options**: - **Focus Mode**: Choose search specialization @@ -280,13 +301,13 @@ ### Perplexity Commands | `Update Perplexity URL` | Change Perplexity API endpoint | Settings command | | `Show Perplexity Settings` | Display current Perplexity configuration | Debug command | -### Perplexica Commands +### Perplexica / Vane Commands | Command | Description | Usage | |---------|-------------|-------| -| `Ask Perplexica` | Query Perplexica with focus and optimization modes | Editor command with modal interface | -| `Update Perplexica URL` | Change Perplexica API endpoint | Settings command | -| `Show Perplexica Settings` | Display current Perplexica configuration | Debug command | +| `Ask Perplexica / Vane` | Query Perplexica / Vane with focus and optimization modes | Editor command with modal interface | +| `Update Perplexica / Vane URL` | Change Perplexica / Vane API endpoint | Settings command | +| `Show Perplexica / Vane Settings` | Display current Perplexica / Vane configuration | Debug command | ### LM Studio Commands diff --git a/main.ts b/main.ts index 5d266e3..702ffff 100644 --- a/main.ts +++ b/main.ts @@ -158,7 +158,7 @@ const DEFAULT_SETTINGS: PerplexedPluginSettings = { // Placeholder text perplexityQueryPlaceholder: "What would you like to ask Perplexity?", - perplexicaQueryPlaceholder: "What would you like to ask Perplexica?", + perplexicaQueryPlaceholder: "What would you like to ask Perplexica / Vane?", lmStudioQueryPlaceholder: "What would you like to ask?", lmStudioSystemPromptPlaceholder: "You are a helpful AI assistant...", articleTermPlaceholder: "e.g., AI Copilots, AI Studios, Machine Learning, etc.", @@ -549,11 +549,11 @@ export default class PerplexedPlugin extends Plugin { // Command to update Perplexica URL this.addCommand({ id: 'update-perplexica-url', - name: 'Update Perplexica URL', + name: 'Update Perplexica / Vane URL', callback: () => { const modal = new URLUpdateModal(this.app, { - title: 'Update Perplexica API URL', - label: 'Perplexica API URL', + title: 'Update Perplexica / Vane API URL', + label: 'Perplexica / Vane API URL', placeholder: 'http://localhost:3030/api/search', currentValue: this.settings.perplexicaEndpoint, onSave: async (newUrl: string) => { @@ -568,9 +568,9 @@ export default class PerplexedPlugin extends Plugin { // Command to show current settings this.addCommand({ id: 'show-perplexica-settings', - name: 'Show Perplexica Settings', + name: 'Show Perplexica / Vane Settings', callback: () => { - new Notice(`Current Perplexica URL: ${this.settings.perplexicaEndpoint}`); + new Notice(`Current Perplexica / Vane URL: ${this.settings.perplexicaEndpoint}`); console.log('Perplexica Settings:', this.settings); } }); @@ -578,11 +578,11 @@ export default class PerplexedPlugin extends Plugin { // Command to ask Perplexica this.addCommand({ id: 'ask-perplexica', - name: 'Ask Perplexica', + name: 'Ask Perplexica / Vane', editorCallback: (editor: Editor) => { try { if (!this.perplexicaService) { - new Notice('Perplexica service not initialized. Please check console for errors and try the debug command.'); + new Notice('Perplexica / Vane service not initialized. Please check console for errors and try the debug command.'); console.error('Perplexica service is not initialized'); return; } @@ -595,7 +595,7 @@ export default class PerplexedPlugin extends Plugin { modal.open(); } catch (error) { console.error('Error opening Perplexica modal:', error); - new Notice('Failed to open Perplexica modal. Check console for details.'); + new Notice('Failed to open Perplexica / Vane modal. Check console for details.'); } } }); @@ -1135,17 +1135,17 @@ class PerplexedSettingTab extends PluginSettingTab { await this.plugin.saveSettings(); })); - // Perplexica Section - const perplexicaHeader = containerEl.createEl('h3', { text: 'Perplexica (Self-Hosted)' }); + // Perplexica / Vane Section + const perplexicaHeader = containerEl.createEl('h3', { text: 'Perplexica / Vane (self-hosted)' }); perplexicaHeader.style.color = 'var(--text-accent)'; containerEl.createEl('p', { - text: 'Configure settings for your local Perplexica installation', + text: 'Configure settings for your local Perplexica / Vane installation', cls: 'setting-item-description' }); new Setting(containerEl) .setName('Endpoint') - .setDesc('API endpoint for your local Perplexica instance') + .setDesc('API endpoint for your local Perplexica / Vane instance') .addText(text => text .setPlaceholder('http://localhost:3030/api/search') .setValue(this.plugin.settings.perplexicaEndpoint) @@ -1169,7 +1169,7 @@ class PerplexedSettingTab extends PluginSettingTab { new Setting(containerEl) .setName('Default Model') - .setDesc('Default AI model for Perplexica to use') + .setDesc('Default AI model for Perplexica / Vane to use') .addText(text => text .setPlaceholder('llama3.2:latest') .setValue(this.plugin.settings.defaultModel) @@ -1182,7 +1182,7 @@ class PerplexedSettingTab extends PluginSettingTab { // Perplexica Request Template const perplexicaJsonSetting = new Setting(containerEl) .setName('Request Body Template') - .setDesc('JSON template for Perplexica API requests'); + .setDesc('JSON template for Perplexica / Vane API requests'); // Create a textarea element for Perplexica const perplexicaTextArea = document.createElement('textarea'); @@ -1307,10 +1307,10 @@ class PerplexedSettingTab extends PluginSettingTab { ); new Setting(containerEl) - .setName('Perplexica System Prompt') - .setDesc('System prompt used for Perplexica requests') + .setName('Perplexica / Vane System Prompt') + .setDesc('System prompt used for Perplexica / Vane requests') .addTextArea(text => text - .setPlaceholder('Enter system prompt for Perplexica...') + .setPlaceholder('Enter system prompt for Perplexica / Vane...') .setValue(this.plugin.settings.prompts.perplexicaSystemPrompt) .onChange(async (value: string) => { this.plugin.settings.prompts.perplexicaSystemPrompt = value; @@ -1358,8 +1358,8 @@ class PerplexedSettingTab extends PluginSettingTab { ); new Setting(containerEl) - .setName('Perplexica Query Placeholder') - .setDesc('Placeholder text for Perplexica query input') + .setName('Perplexica / Vane Query Placeholder') + .setDesc('Placeholder text for Perplexica / Vane query input') .addText(text => text .setPlaceholder('Enter placeholder text...') .setValue(this.plugin.settings.prompts.perplexicaQueryPlaceholder) diff --git a/src/modals/PerplexicaModal.ts b/src/modals/PerplexicaModal.ts index 2775391..bb863bf 100644 --- a/src/modals/PerplexicaModal.ts +++ b/src/modals/PerplexicaModal.ts @@ -57,10 +57,10 @@ export class PerplexicaModal extends Modal { // ----- Header ----- const header = contentEl.createDiv({ cls: 'perplexica-modal__header' }); - header.createEl('h2', { text: 'Ask Perplexica', cls: 'perplexica-modal__title' }); + header.createEl('h2', { text: 'Ask Perplexica / Vane', cls: 'perplexica-modal__title' }); header.createEl('p', { cls: 'perplexica-modal__subtitle', - text: 'Self-hosted, source-grounded answers via your local Perplexica instance. Streams into the active note at the cursor.', + text: 'Self-hosted, source-grounded answers via your local Perplexica / Vane instance. Streams into the active note at the cursor.', }); // ----- Question ----- @@ -151,7 +151,7 @@ export class PerplexicaModal extends Modal { cancelBtn.addEventListener('click', () => this.close()); const askBtn = footer.createEl('button', { - text: 'Ask Perplexica', + text: 'Ask Perplexica / Vane', cls: 'perplexica-modal__button mod-cta', }); askBtn.addEventListener('click', () => void this.onSubmit()); diff --git a/src/services/perplexicaService.ts b/src/services/perplexicaService.ts index c2adad6..0720f5a 100644 --- a/src/services/perplexicaService.ts +++ b/src/services/perplexicaService.ts @@ -91,7 +91,7 @@ export class PerplexicaService { // Process query to handle multi-line content in callout const processedQuery = query.split('\n').map(line => `> ${line}`).join('\n'); - editor.replaceRange(`\n\n***\n> [!info] **Perplexica Query** (${timestamp})\n> **Question:**\n${processedQuery}\n> **Focus:** ${focusMode}\n> **Optimization:** ${optimizationMode}\n> \n> ### **Response from Perplexica**:\n\n`, cursor); + editor.replaceRange(`\n\n***\n> [!info] **Perplexica / Vane Query** (${timestamp})\n> **Question:**\n${processedQuery}\n> **Focus:** ${focusMode}\n> **Optimization:** ${optimizationMode}\n> \n> ### **Response from Perplexica / Vane**:\n\n`, cursor); // Get cursor position after header for response content const responseCursor = editor.getCursor(); @@ -210,7 +210,7 @@ export class PerplexicaService { } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); - new Notice(`Perplexica Error: ${errorMsg}`); + new Notice(`Perplexica / Vane Error: ${errorMsg}`); editor.replaceRange(`\n**Error:** ${errorMsg}\n\n***\n`, editor.getCursor()); } }