diff --git a/src/khoj/database/adapters/__init__.py b/src/khoj/database/adapters/__init__.py index ea0c0a85..471f3605 100644 --- a/src/khoj/database/adapters/__init__.py +++ b/src/khoj/database/adapters/__init__.py @@ -28,6 +28,7 @@ from khoj.database.models import ( Conversation, ChatModelOptions, SearchModelConfig, + SpeechToTextModelOptions, Subscription, UserConversationConfig, OpenAIProcessorConversationConfig, @@ -339,6 +340,10 @@ class ConversationAdapters: async def get_openai_chat_config(): return await OpenAIProcessorConversationConfig.objects.filter().afirst() + @staticmethod + async def get_speech_to_text_config(): + return await SpeechToTextModelOptions.objects.filter().afirst() + class EntryAdapters: word_filer = WordFilter() diff --git a/src/khoj/database/admin.py b/src/khoj/database/admin.py index 69f15b2f..4383056f 100644 --- a/src/khoj/database/admin.py +++ b/src/khoj/database/admin.py @@ -9,12 +9,14 @@ from khoj.database.models import ( OpenAIProcessorConversationConfig, OfflineChatProcessorConversationConfig, SearchModelConfig, + SpeechToTextModelOptions, Subscription, ) admin.site.register(KhojUser, UserAdmin) admin.site.register(ChatModelOptions) +admin.site.register(SpeechToTextModelOptions) admin.site.register(OpenAIProcessorConversationConfig) admin.site.register(OfflineChatProcessorConversationConfig) admin.site.register(SearchModelConfig) diff --git a/src/khoj/database/migrations/0020_speechtotextmodeloptions_and_more.py b/src/khoj/database/migrations/0020_speechtotextmodeloptions_and_more.py new file mode 100644 index 00000000..1185d298 --- /dev/null +++ b/src/khoj/database/migrations/0020_speechtotextmodeloptions_and_more.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.7 on 2023-11-22 08:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("database", "0019_alter_googleuser_family_name_and_more"), + ] + + operations = [ + migrations.CreateModel( + name="SpeechToTextModelOptions", + fields=[ + ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("model_name", models.CharField(default="whisper-1", max_length=200)), + ( + "model_type", + models.CharField( + choices=[("openai", "Openai"), ("offline", "Offline")], default="openai", max_length=200 + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AlterField( + model_name="chatmodeloptions", + name="chat_model", + field=models.CharField(default="gpt-4", max_length=200), + ), + ] diff --git a/src/khoj/database/models/__init__.py b/src/khoj/database/models/__init__.py index 92da3e6e..8098a731 100644 --- a/src/khoj/database/models/__init__.py +++ b/src/khoj/database/models/__init__.py @@ -120,6 +120,15 @@ class OfflineChatProcessorConversationConfig(BaseModel): enabled = models.BooleanField(default=False) +class SpeechToTextModelOptions(BaseModel): + class ModelType(models.TextChoices): + OPENAI = "openai" + OFFLINE = "offline" + + model_name = models.CharField(max_length=200, default="whisper-1") + model_type = models.CharField(max_length=200, choices=ModelType.choices, default=ModelType.OPENAI) + + class ChatModelOptions(BaseModel): class ModelType(models.TextChoices): OPENAI = "openai" @@ -127,7 +136,7 @@ class ChatModelOptions(BaseModel): max_prompt_size = models.IntegerField(default=None, null=True, blank=True) tokenizer = models.CharField(max_length=200, default=None, null=True, blank=True) - chat_model = models.CharField(max_length=200, default=None, null=True, blank=True) + chat_model = models.CharField(max_length=200, default="gpt-4") model_type = models.CharField(max_length=200, choices=ModelType.choices, default=ModelType.OPENAI) diff --git a/src/khoj/utils/initialization.py b/src/khoj/utils/initialization.py index ffc4d47e..ee0454c4 100644 --- a/src/khoj/utils/initialization.py +++ b/src/khoj/utils/initialization.py @@ -6,6 +6,7 @@ from khoj.database.models import ( OfflineChatProcessorConversationConfig, OpenAIProcessorConversationConfig, ChatModelOptions, + SpeechToTextModelOptions, ) from khoj.utils.constants import default_offline_chat_model, default_online_chat_model @@ -94,6 +95,15 @@ def initialization(): chat_model=openai_chat_model, model_type=ChatModelOptions.ModelType.OPENAI, max_prompt_size=max_tokens ) + default_speech2text_model = "whisper-1" + openai_speech2text_model = input( + f"Enter the OpenAI speech to text model you want to use (default: {default_speech2text_model}): " + ) + openai_speech2text_model = openai_speech2text_model or default_speech2text_model + SpeechToTextModelOptions.objects.create( + model_name=openai_speech2text_model, model_type=SpeechToTextModelOptions.ModelType.OPENAI + ) + logger.info("🗣️ Chat model configuration complete") admin_user = KhojUser.objects.filter(is_staff=True).first()