import os import json import bcrypt import pandas as pd import numpy as np from typing import List from pathlib import Path from langchain_huggingface import HuggingFaceEndpoint from langchain.schema.runnable.config import RunnableConfig from langchain.schema import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain.agents import AgentExecutor from langchain.agents.agent_types import AgentType from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent, create_csv_agent import chainlit as cl from chainlit.input_widget import TextInput, Select, Switch, Slider from deep_translator import GoogleTranslator @cl.password_auth_callback def auth_callback(username: str, password: str): auth = json.loads(os.environ['CHAINLIT_AUTH_LOGIN']) ident = next(d['ident'] for d in auth if d['ident'] == username) pwd = next(d['pwd'] for d in auth if d['ident'] == username) resultLogAdmin = bcrypt.checkpw(username.encode('utf-8'), bcrypt.hashpw(ident.encode('utf-8'), bcrypt.gensalt())) resultPwdAdmin = bcrypt.checkpw(password.encode('utf-8'), bcrypt.hashpw(pwd.encode('utf-8'), bcrypt.gensalt())) resultRole = next(d['role'] for d in auth if d['ident'] == username) if resultLogAdmin and resultPwdAdmin and resultRole == "admindatapcc": return cl.User( identifier=ident + " : đŸ§‘â€đŸ’Œ Admin Datapcc", metadata={"role": "admin", "provider": "credentials"} ) elif resultLogAdmin and resultPwdAdmin and resultRole == "userdatapcc": return cl.User( identifier=ident + " : 🧑‍🎓 User Datapcc", metadata={"role": "user", "provider": "credentials"} ) @cl.step(type="tool") async def LLMistral(): os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN'] repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" llm = HuggingFaceEndpoint( repo_id=repo_id, max_new_tokens=5300, temperature=0.1, task="text2text-generation", streaming=True ) return llm @cl.set_chat_profiles async def chat_profile(): return [ cl.ChatProfile(name="Traitement des donnĂ©es d'enquĂȘte : «ExpĂ© CFA : questionnaire auprĂšs des professionnels de la branche de l'agencement»",markdown_description="VidĂ©o exploratoire autour de l'Ă©vĂ©nement",icon="/public/logo-ofipe.png",), ] @cl.set_starters async def set_starters(): return [ cl.Starter( label="RĂ©partition du nombre de CAA dans les entreprises", message="Quel est le nombre de chargĂ©.e d'affaires en agencement dans chaque type d'entreprises?", icon="/public/request-theme.svg", ) ] @cl.on_message async def on_message(message: cl.Message): await cl.Message(f"> SURVEYIA").send() llm = await LLMistral() agent = create_csv_agent( llm, "./public/ExpeCFA_LP_CAA.csv", verbose=True, allow_dangerous_code=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION ) cb = cl.AsyncLangchainCallbackHandler() try: res = await agent.acall("RĂ©ponds en langue française Ă  la question suivante :\n" + message.content + "\nDĂ©taille la rĂ©ponse en faisant une analyse complĂšte en 2000 mots minimum.", callbacks=[cb]) await cl.Message(author="COPILOT",content=GoogleTranslator(source='auto', target='fr').translate(res['output'])).send() except ValueError as e: res = str(e) resArray = res.split(":") ans = '' if str(res).find('parsing') != -1: for i in range(2,len(resArray)): ans += resArray[i] await cl.Message(author="COPILOT",content=ans.replace("`","")).send() else: await cl.Message(author="COPILOT",content="Reformulez votre requĂȘte, s'il vous plait 😃").send()