diff --git a/chatbot/llm_models/llm_script.py b/chatbot/llm_models/llm_script.py index 7169d9357..d64a5d748 100644 --- a/chatbot/llm_models/llm_script.py +++ b/chatbot/llm_models/llm_script.py @@ -26,6 +26,18 @@ llm_retry_number = int(os.getenv('LLM_RETRY_NUMBER')) +def get_custom_model(company_bot): + """Return company_bot.other_params['custom_model'] if set, else None.""" + if not company_bot: + return None + other_params = company_bot.get('other_params') if isinstance(company_bot, dict) else getattr( + company_bot, 'other_params', None + ) + if isinstance(other_params, str): + other_params = json.loads(other_params) + return other_params.get('custom_model') if other_params else None + + def handle_llama_model( messages, max_token, model_name=None, is_json_format=True, temperature=None, top_p=None, seed=None, n=None, stream=False, url_to_use=None @@ -101,7 +113,10 @@ def handle_openai_model( else: client = OpenAI(api_key=client_api_key) - if model_name: + custom_model = get_custom_model(company_bot) + if custom_model: + model_to_use = custom_model + elif model_name: model_to_use = model_name elif company_bot: model_to_use = company_bot.llm_model @@ -121,7 +136,7 @@ def handle_openai_model( LLMModel.GPT5_2, } if max_token: - if company_bot.llm_model in token_limit_models: + if model_to_use in token_limit_models: request_data["max_completion_tokens"] = max_token else: request_data["max_tokens"]= max_token @@ -135,7 +150,7 @@ def handle_openai_model( request_data["tools"]= tools if tool_choice: request_data["tool_choice"]= tool_choice - if top_p is not None and company_bot.llm_model not in token_limit_models: + if top_p is not None and model_to_use not in token_limit_models: request_data['top_p'] = top_p print("request_data: ", request_data) response = client.chat.completions.create(**request_data) @@ -243,7 +258,10 @@ def handle_bedrock_model( config=boto_config ) print("aws_key used: ", aws_key if aws_key else AWS_KEY) - if model_name: + custom_model = get_custom_model(company_bot) + if custom_model: + model_id = custom_model + elif model_name: model_id = model_name else: model_id = 'meta.llama3-1-8b-instruct-v1:0' @@ -621,7 +639,10 @@ def handle_openai_response_api( client = OpenAI(api_key=client_api_key) - if model_name: + custom_model = get_custom_model(company_bot) + if custom_model: + model_to_use = custom_model + elif model_name: model_to_use = model_name elif company_bot: model_to_use = company_bot.llm_model diff --git a/chatbot/models/enums.py b/chatbot/models/enums.py index b675aa116..3c3428a0f 100644 --- a/chatbot/models/enums.py +++ b/chatbot/models/enums.py @@ -81,7 +81,8 @@ class LLMModel(models.TextChoices): GPT5_2 = 'gpt-5.2', _('GPT_5_2') GPT5_2_PRO = 'gpt-5.2-pro', _('GPT_5_2_PRO') GPT5_MINI = 'gpt-5-mini', _('GPT_5_MINI') - + CLAUDE_HAIKU_4_5 = 'us.anthropic.claude-haiku-4-5-20251001-v1:0', _('CLAUDE_HAIKU_4_5') + CLAUDE_SONNET_4_5 = 'us.anthropic.claude-sonnet-4-5-20250929-v1:0', _('CLAUDE_SONNET_4_5') class EntityStatus(models.TextChoices): """ diff --git a/chatbot/models/story_models.py b/chatbot/models/story_models.py index bac1e4e91..f6d40076f 100644 --- a/chatbot/models/story_models.py +++ b/chatbot/models/story_models.py @@ -1,6 +1,5 @@ import io import os -import base64 from django.db import models from django.core.validators import MinLengthValidator from chatbot.models import Profile, TagChoices, StoryLanguageChoices, StorySourceChoices, MediaTypeChoices, \ @@ -8,9 +7,6 @@ from pillow_heif import register_heif_opener from django.core.files.base import ContentFile from PIL import Image, UnidentifiedImageError -import requests - -from chatbot.services.storage import StorageFactory S3_BASE_URL = os.getenv('S3_MEDIA_URL') register_heif_opener() @@ -116,30 +112,17 @@ def get_public_url(self): def save(self, *args, **kwargs): try: - if self.file_url: - if self.file_url.startswith("s3://"): - storage_handler = StorageFactory.get_storage_handler() - response_content = storage_handler.get_file_from_store(self.file_url) - self.base64_str = base64.b64encode(response_content).decode('utf-8') - print("Encoded base64 from file_url") - else: - response = requests.get(self.file_url) - response.raise_for_status() - self.base64_str = base64.b64encode(response.content).decode('utf-8') - print("Encoded base64 from file_url") - if not self.file: super().save(*args, **kwargs) return - self.file.seek(0) file_ext = os.path.splitext(self.file.name)[1].lower() print("file_ext:", file_ext) print("File name:", self.file.name) - print("File size:", self.file.size) # Convert HEIC/HEIF to JPEG if file_ext in ['.heic', '.heif']: try: + self.file.seek(0) image = Image.open(self.file) converted_io = io.BytesIO() image.save(converted_io, format='JPEG') @@ -156,10 +139,6 @@ def save(self, *args, **kwargs): except Exception as e: print("Unexpected error during HEIF conversion:", str(e)) - # Reset pointer before base64 encoding - self.file.seek(0) - self.base64_str = base64.b64encode(self.file.read()).decode('utf-8') - except Exception as e: print("Error during save():", str(e)) diff --git a/chatbot/utils/shikshalokam_story_utils.py b/chatbot/utils/shikshalokam_story_utils.py index 18cc3819f..7d589ea17 100644 --- a/chatbot/utils/shikshalokam_story_utils.py +++ b/chatbot/utils/shikshalokam_story_utils.py @@ -414,7 +414,6 @@ def get_html_from_template(story, profile, flow, auth=False, language=None): return html_content def update_story_pdf(access_token, session, flow, is_edit_story=False): - try: chatsession = ChatSession.objects.values("language").get(session=session) @@ -431,6 +430,7 @@ def update_story_pdf(access_token, session, flow, is_edit_story=False): if story and story.content and story.formatted_content: update_story_content(story) + profile = story.author print("profile: ", profile) print("story: ", story.title) @@ -438,6 +438,7 @@ def update_story_pdf(access_token, session, flow, is_edit_story=False): language = chatsession.get("language", StoryLanguageChoices.ENGLISH) flow_obj = Flow.objects.filter(flow_route=flow).first() has_pdf_template = flow_obj and PDFTemplates.objects.filter(flow=flow_obj).exists() + if has_pdf_template: html_content = get_html_from_template( story=story, profile=profile, flow=flow, @@ -447,7 +448,7 @@ def update_story_pdf(access_token, session, flow, is_edit_story=False): html_content = get_story_html(story=story, profile=profile, flow=flow) pdf_generated = generate_pdf_with_gotenberg(html_content) - # print("pdf_generated: ", pdf_generated) + pdf_file_name = story.title if not pdf_file_name or pdf_file_name == '': pdf_file_name = 'Improvement_story' @@ -514,7 +515,6 @@ def update_story_pdf(access_token, session, flow, is_edit_story=False): conversation = get_stored_conversation(company_chats=company_chats) chat_history = get_stored_chathistory(company_chats=company_chats) - tasks_payload = [] task_id_from_session = None diff --git a/chatbot/views/story_views.py b/chatbot/views/story_views.py index 019b1d7e9..9ce12068a 100644 --- a/chatbot/views/story_views.py +++ b/chatbot/views/story_views.py @@ -1,6 +1,5 @@ from chatbot.models import Story, StoryMedia, SessionFlowName from chatbot.models.base_models import Flow -from chatbot.models.enums import CreateStoryChoices from chatbot.models.media_models import ProfileMedia from chatbot.serializer.profile_serializer import ProfileMediaSerializer from chatbot.serializer.story_serializer import StoryCreateSerializer, StoryRetrieveSerializer, StoryMediaRetrieveSerializer, StoryFullSerializer @@ -9,7 +8,6 @@ from chatbot.utils.story_utils.base.story_update_utils import extract_update_data, get_or_create_translation, update_translation_fields, sync_to_main_story from chatbot.utils.story_utils.base.translation_mixins import LanguageDetectionMixin from chatbot.utils.story_utils.story_utils import create_story_object, generate_story -from django.contrib.auth import PermissionDenied from rest_framework import generics, status from rest_framework.decorators import api_view from rest_framework.response import Response @@ -239,7 +237,6 @@ def create(self, request, *args, **kwargs): """ Handle POST requests (create). """ - print("Creating") session_value = request.data.get('session') access_token = request.data.get('access_token') flow = request.data.get('flow') @@ -249,18 +246,14 @@ def create(self, request, *args, **kwargs): file_url = "https://" + file_url[len("s3://"):] request.data["file_url"] = file_url - print("session_value: ", session_value) - print("flow: ", flow) - print("access_token: ", access_token) try: response = super().create(request, *args, **kwargs) - print("response: ", response) - print("response status_code: ", response.status_code) if response.status_code == status.HTTP_201_CREATED and flow != SessionFlowName.Reflection: update_story_pdf( access_token=access_token, session=session_value, flow=flow ) + return response except Exception as e: diff --git a/shikshalokam_mohini/settings.py b/shikshalokam_mohini/settings.py index 040ef0bab..0fbcbfea5 100644 --- a/shikshalokam_mohini/settings.py +++ b/shikshalokam_mohini/settings.py @@ -15,8 +15,6 @@ from datetime import timedelta import sentry_sdk from dotenv import load_dotenv -from socket import gethostbyname -from socket import gethostname load_dotenv() @@ -370,6 +368,7 @@ def load_secrets(): **STORAGES["staticfiles"]["OPTIONS"], "location": "static", } + else: raise ValueError( f"Unsupported STORAGE_CLOUD_PROVIDER: {STORAGE_CLOUD_PROVIDER}. "