Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Endpoint for full chat history #236

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion integreat_chat/chatanswers/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
from . import views

urlpatterns = [
path("extract_answer/", views.extract_answer, name="extract_answer"),
path("extract_answer/", views.chat, name="extract_answer"),
path("chat/", views.chat, name="chat"),
]
2 changes: 1 addition & 1 deletion integreat_chat/chatanswers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@


@csrf_exempt
def extract_answer(request):
def chat(request):
"""
Extract an answer for a user query from Integreat content. Expects a JSON body with message
and language attributes
Expand Down
62 changes: 62 additions & 0 deletions integreat_chat/core/utils/chat_message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
"""
base request class
"""
from django.utils.functional import cached_property

from integreat_chat.translate.services.language import LanguageService
from integreat_chat.translate.static.language_code_map import LANGUAGE_MAP


class Message:
"""
Class for handling messages
"""
def __init__( # pylint: disable=too-many-arguments
self,
message: dict,
language_service: LanguageService,
skip_language_detection: bool,
gui_language: str,
supported_languages: list[str],
fallback_language = str
):
self.original_message = message["content"]
self.role = message["role"]
self.language_service = language_service
self.skip_language_detection = skip_language_detection
self.gui_language = gui_language
self.supported_languages = supported_languages
self.fallback_language = fallback_language

@cached_property
def likely_message_language(self) -> str:
"""
Detect language and decide which language to use for RAG
"""
if self.skip_language_detection:
return self.gui_language
return self.language_service.classify_language(self.original_message)

@cached_property
def translated_message(self) -> str:
"""
If necessary, translate message into GUI language
"""
if self.likely_message_language not in self.supported_languages:
if self.likely_message_language not in LANGUAGE_MAP:
raise ValueError(
f"Unsupported translation language: {self.likely_message_language}"
)
return self.language_service.translate_message(
self.likely_message_language, self.fallback_language, self.original_message
)
return self.original_message

@property
def use_language(self) -> str:
"""
Select a language for RAG prompting
"""
if self.likely_message_language not in self.supported_languages:
return self.fallback_language
return self.likely_message_language
63 changes: 25 additions & 38 deletions integreat_chat/core/utils/integreat_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@
"""
import logging
from django.conf import settings
from django.utils.functional import cached_property

from integreat_chat.translate.services.language import LanguageService
from integreat_chat.translate.static.language_code_map import LANGUAGE_MAP

from ..static.region_language_map import REGION_LANGUAGE_MAP
from .chat_message import Message


LOGGER = logging.getLogger('django')
Expand All @@ -21,7 +20,7 @@ class IntegreatRequest:
used models and a fallback language.
"""
def __init__(self, data: dict, skip_language_detection: bool = False) -> None:
self.parse_arguments(data)
self.parse_meta_information(data)
self.language_service = LanguageService()
self.skip_language_detection = skip_language_detection
self.supported_languages = (
Expand All @@ -32,14 +31,14 @@ def __init__(self, data: dict, skip_language_detection: bool = False) -> None:
)
if self.supported_languages is None or self.fallback_language is None:
raise ValueError("supported_languages or fallback_language has not been set.")
self.parse_messages(data)

def parse_arguments(self, data: dict) -> None:
def parse_meta_information(self, data: dict) -> None:
"""
Parse arguments from HTTP request body
Parse meta information from HTTP request body
"""
if "language" not in data or "region" not in data or "message" not in data:
raise ValueError("Missing language, region or message attribute")
self.original_message = data["message"]
if "language" not in data or "region" not in data:
raise ValueError("Missing language or region attribute")
if data["region"] not in settings.INTEGREAT_REGIONS:
raise ValueError("Integreat region not enabled")
self.region = data["region"]
Expand All @@ -50,35 +49,23 @@ def parse_arguments(self, data: dict) -> None:
else data["language"]
)

@cached_property
def likely_message_language(self) -> str:
def parse_messages(self, data: dict) -> None:
"""
Detect language and decide which language to use for RAG
Parse message(s) from HTTP request body
"""
if self.skip_language_detection:
return self.gui_language
return self.language_service.classify_language(self.original_message)

@cached_property
def translated_message(self) -> str:
"""
If necessary, translate message into GUI language
"""
if self.likely_message_language not in self.supported_languages:
if self.likely_message_language not in LANGUAGE_MAP:
raise ValueError(
f"Unsupported translation language: {self.likely_message_language}"
)
return self.language_service.translate_message(
self.likely_message_language, self.fallback_language, self.original_message
)
return self.original_message

@property
def use_language(self) -> str:
"""
Select a language for RAG prompting
"""
if self.likely_message_language not in self.supported_languages:
return self.fallback_language
return self.likely_message_language
if "messages" not in data and "message" not in data:
raise ValueError("No messages in request body")
if "message" in data:
messages = [data["message"]]
else:
messages = data["messages"]
self.messages = [
Message(
message,
self.language_service,
self.skip_language_detection,
self.gui_language,
self.supported_languages,
self.fallback_language
) for message in messages
]