diff --git a/README.md b/README.md index 6b457f3..0cf66fa 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # Witsy Generative AI desktop application: -- OpenAI, Ollama, Anthropic, MistralAI and Groq models supported +- OpenAI, Ollama, Anthropic, MistralAI, Google and Groq models supported - Chat completion and image generation with Vision models support - Prompt anywhere allows to generate content directly in any application - AI commands runnable on highlighted text in almost any application @@ -59,10 +59,11 @@ npm start ## Prerequisites -To use OpenAI, Anthropic or Mistral AI models, you need to enter your API key: +To use OpenAI, Anthropic, Google or Mistral AI models, you need to enter your API key: - [OpenAI](https://platform.openai.com/api-keys) - [Anthropic](https://console.anthropic.com/settings/keys) - [MistralAI](https://console.mistral.ai/api-keys/) +- [Google](https://aistudio.google.com/app/apikey) To use Ollama models, you need to install [Ollama](https://ollama.com) and download some [models](https://ollama.com/library). @@ -76,13 +77,13 @@ To use Internet search you need a [Tavily API key](https://app.tavily.com/home). ## TODO -- [ ] Google Gemini API - [ ] i18n - [ ] File upload for retrieval (??) - [ ] Proper database (SQLite3) storage (??) ## DONE +- [x] Google Gemini API - [x] Prompt anywhere - [x] Cancel commands - [x] GPT-4o support diff --git a/package.json b/package.json index aa5bae0..7a39f8d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "witsy", "productName": "Witsy", - "version": "1.6.2", + "version": "1.7.0", "description": "Witsy: desktop AI assistant", "repository": { "type": "git", diff --git a/src/services/engine.ts b/src/services/engine.ts index addde25..a2cfa82 100644 --- a/src/services/engine.ts +++ b/src/services/engine.ts @@ -35,11 +35,6 @@ export default class LlmEngine { throw new Error('Not implemented') } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isVisionModel(model: string): boolean { - return false - } - async getModels(): Promise { throw new Error('Not implemented') } @@ -86,6 +81,15 @@ export default class LlmEngine { return this.config.engines[this.getName()].models.chat } + isVisionModel(model: string): boolean { + for (const filter of this.getVisionModels()) { + if (minimatch(model, filter)) { + return true + } + } + return false + } + requiresVisionModelSwitch(thread: Message[], currentModel: string): boolean { // if we already have a vision or auto switch is disabled diff --git a/src/services/google.ts b/src/services/google.ts index 2daa448..c30102e 100644 --- a/src/services/google.ts +++ b/src/services/google.ts @@ -31,10 +31,6 @@ export default class extends LlmEngine { return ['gemini-1.5-flash-latest', 'models/gemini-1.5-pro-latest', 'models/gemini-pro-vision', '*vision*'] } - isVisionModel(model: string): boolean { - return this.getVisionModels().includes(model) - } - getRountingModel(): string | null { return null } diff --git a/src/services/groq.ts b/src/services/groq.ts index eaab9b4..5e0ad8f 100644 --- a/src/services/groq.ts +++ b/src/services/groq.ts @@ -31,11 +31,6 @@ export default class extends LlmEngine { return [] } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - isVisionModel(model: string): boolean { - return false - } - getRountingModel(): string|null { return null } diff --git a/src/services/mistralai.ts b/src/services/mistralai.ts index 0d02bb0..deab784 100644 --- a/src/services/mistralai.ts +++ b/src/services/mistralai.ts @@ -32,10 +32,6 @@ export default class extends LlmEngine { return [] } - isVisionModel(model: string): boolean { - return this.getVisionModels().includes(model) - } - getRountingModel(): string|null { return null } diff --git a/src/services/ollama.ts b/src/services/ollama.ts index b4a0ea0..c66748f 100644 --- a/src/services/ollama.ts +++ b/src/services/ollama.ts @@ -35,10 +35,6 @@ export default class extends LlmEngine { return ['llava-llama3:latest', 'llava:latest', '*llava*'] } - isVisionModel(model: string): boolean { - return this.getVisionModels().includes(model) || model.includes('llava') - } - getRountingModel(): string|null { return null } diff --git a/src/services/openai.ts b/src/services/openai.ts index 18328c1..a24ae9f 100644 --- a/src/services/openai.ts +++ b/src/services/openai.ts @@ -36,10 +36,6 @@ export default class extends LlmEngine { return [/*'*4o*', */ 'gpt-4-turbo', 'gpt-4-vision', '*vision*'] } - isVisionModel(model: string): boolean { - return this.getVisionModels().includes(model) - } - getRountingModel(): string | null { return 'gpt-3.5-turbo' }