Skip to content

Commit

Permalink
Feature/78 fix testing feedback (#84)
Browse files Browse the repository at this point in the history
* [#78] Detect language tests

* [#78] Add logger, fix error ChatList component on initial conversation

* [#78] Rename assistant tests
  • Loading branch information
dedenbangkit authored Sep 9, 2024
1 parent 4c1fc11 commit fa553d0
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 42 deletions.
31 changes: 19 additions & 12 deletions assistant/assistant.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,19 @@ async def publish_reliably(queue_message: str) -> None:
logger.error(f"[ASSISTANT] -> Error send to queue {type(e)}: {e}")


def get_language(user_prompt) -> str:
detected_language = detect(user_prompt)
if detected_language not in assistant_data:
logger.warning(
f"[ASSISTANT] -> Unsupported language detected: {detected_language} for '{user_prompt}', defaulting to English"
)
return "en"
return detected_language


async def on_message(body: str) -> None:
"""
Handles incoming messages, detects the language, and processes the message
Handles incoming messages, detects the language, and processes the message
using the appropriate knowledge base and prompts.
Parameters:
Expand All @@ -218,28 +228,25 @@ async def on_message(body: str) -> None:
from_client = json.loads(body)
user_prompt = from_client["body"]

detected_language = detect(user_prompt)
if detected_language not in assistant_data:
logger.warning(f"[ASSISTANT] -> Unsupported language detected: {detected_language} for '{user_prompt}', defaulting to English")
detected_language = 'en'

detected_language = get_language(user_prompt)
knowledge_base = assistant_data[detected_language]["knowledge_base"]
system_prompt = assistant_data[detected_language]["system_prompt"]
rag_prompt = assistant_data[detected_language]["rag_prompt"]
system_prompt = assistant_data[detected_language]["system_prompt"]
rag_prompt = assistant_data[detected_language]["rag_prompt"]
ragless_prompt = assistant_data[detected_language]["ragless_prompt"]

# Query the knowledge base for RAG context
rag_context, _, _, _ = query_collection(
knowledge_base, from_client["body"],
CHROMADB_DISTANCE_CUTOFF
knowledge_base, from_client["body"], CHROMADB_DISTANCE_CUTOFF
)

# Send the user's prompt and context to the LLM
llm_response, timestamp = query_llm(
openai, OPENAI_CHAT_MODEL,
openai,
OPENAI_CHAT_MODEL,
system_prompt,
ragless_prompt,
rag_prompt, rag_context,
rag_prompt,
rag_context,
user_prompt,
)
logger.info(f"[ASSISTANT] -> LLM replied: {llm_response}")
Expand Down
1 change: 1 addition & 0 deletions assistant/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ pika==1.3.2
black==24.4.2
flake8==7.1.0
langdetect==1.0.9
pytest==8.3.2
Empty file added assistant/tests/__init__.py
Empty file.
43 changes: 43 additions & 0 deletions assistant/tests/test_assistant.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from os import environ
from assistant import get_language, assistant_data


def test_language_support():
detected_language = get_language(
"Bonjour, veuillez m'envoyer les recommandations d'agriculture au Kenya"
)
assert detected_language == "fr"
knowledge_base = assistant_data[detected_language]["knowledge_base"]
system_prompt = assistant_data[detected_language]["system_prompt"]
rag_prompt = assistant_data[detected_language]["rag_prompt"]
ragless_prompt = assistant_data[detected_language]["ragless_prompt"]
assert knowledge_base.name == "EPPO-datasheets-fr"
assert system_prompt == environ["SYSTEM_PROMPT_fr"]
assert rag_prompt == environ["RAG_PROMPT_fr"]
assert ragless_prompt == environ["RAGLESS_PROMPT_fr"]

detected_language = get_language(
"Hello, please send me the recommendations of agriculture in Kenya"
)
assert detected_language == "en"
knowledge_base = assistant_data[detected_language]["knowledge_base"]
system_prompt = assistant_data[detected_language]["system_prompt"]
rag_prompt = assistant_data[detected_language]["rag_prompt"]
ragless_prompt = assistant_data[detected_language]["ragless_prompt"]
assert knowledge_base.name == "EPPO-datasheets-en"
assert system_prompt == environ["SYSTEM_PROMPT_en"]
assert rag_prompt == environ["RAG_PROMPT_en"]
assert ragless_prompt == environ["RAGLESS_PROMPT_en"]

detected_language = get_language(
"Hujambo, tafadhali nitumie mapendekezo ya kilimo nchini Kenya"
)
assert detected_language == "sw"
knowledge_base = assistant_data[detected_language]["knowledge_base"]
system_prompt = assistant_data[detected_language]["system_prompt"]
rag_prompt = assistant_data[detected_language]["rag_prompt"]
ragless_prompt = assistant_data[detected_language]["ragless_prompt"]
assert knowledge_base.name == "EPPO-datasheets-sw"
assert system_prompt == environ["SYSTEM_PROMPT_sw"]
assert rag_prompt == environ["RAG_PROMPT_sw"]
assert ragless_prompt == environ["RAGLESS_PROMPT_sw"]
62 changes: 32 additions & 30 deletions frontend/src/components/chats/ChatList.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ const ChatList = ({
const updatedChats = [...prev.chats, ...resData.chats].reduce(
(acc, incomingChat) => {
const existingChatIndex = acc.findIndex(
(chat) => chat.chat_session.id === incomingChat.chat_session.id
(chat) => chat.chat_session.id === incomingChat.chat_session.id,
);

if (existingChatIndex > -1) {
Expand All @@ -71,14 +71,14 @@ const ChatList = ({

return acc;
},
[...prev.chats]
[...prev.chats],
);

// Sort the chats by the last_message's created_at date in descending order
const sortedChats = updatedChats.sort(
(a, b) =>
new Date(b.last_message.created_at) -
new Date(a.last_message.created_at)
new Date(a.last_message.created_at),
);

return {
Expand Down Expand Up @@ -136,7 +136,7 @@ const ChatList = ({
const findNewMessage = newMessage.find(
(nm) =>
nm.conversation_envelope.client_phone_number ===
chat.chat_session.phone_number
chat.chat_session.phone_number,
);
if (findNewMessage) {
return {
Expand Down Expand Up @@ -168,36 +168,38 @@ const ChatList = ({
<div className="pt-20 pb-24 w-full">
{/* Chat List */}
<div className="bg-white overflow-hidden px-2">
{chatItems.chats.map(({ chat_session, last_message }) => (
<div
key={`chat-list-${chat_session.id}`}
className="p-4 border-b border-gray-200 cursor-pointer hover:bg-gray-50 transition"
onClick={() => handleOnClickChat(chat_session)}
>
<div className="flex items-center">
<Image
src="/images/bg-login-page.png"
alt="User Avatar"
className="rounded-full w-12 h-12 mr-4 bg-gray-300"
height={12}
width={12}
/>
<div className="flex-1">
<div className="flex justify-between">
<h3 className="text-md font-semibold text-gray-800">
{chat_session.name || chat_session.phone_number}
</h3>
<p className="text-xs text-gray-500">
{formatChatTime(last_message.created_at)}
{chatItems.chats
.filter((c) => c.last_message)
.map(({ chat_session, last_message }) => (
<div
key={`chat-list-${chat_session.id}`}
className="p-4 border-b border-gray-200 cursor-pointer hover:bg-gray-50 transition"
onClick={() => handleOnClickChat(chat_session)}
>
<div className="flex items-center">
<Image
src="/images/bg-login-page.png"
alt="User Avatar"
className="rounded-full w-12 h-12 mr-4 bg-gray-300"
height={12}
width={12}
/>
<div className="flex-1">
<div className="flex justify-between">
<h3 className="text-md font-semibold text-gray-800">
{chat_session.name || chat_session.phone_number}
</h3>
<p className="text-xs text-gray-500">
{formatChatTime(last_message.created_at)}
</p>
</div>
<p className="text-gray-600 text-sm">
{trimMessage(last_message.message)}
</p>
</div>
<p className="text-gray-600 text-sm">
{trimMessage(last_message.message)}
</p>
</div>
</div>
</div>
))}
))}
</div>
</div>
</div>
Expand Down

0 comments on commit fa553d0

Please sign in to comment.