Spaces:
Running
Running
import streamlit as st # type: ignore | |
import os | |
from sentence_transformers import SentenceTransformer | |
from translate_app import tr | |
import getpass | |
from langchain_mistralai import ChatMistralAI | |
from langgraph.checkpoint.memory import MemorySaver | |
from langgraph.graph import START, END, MessagesState, StateGraph | |
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder | |
from typing import Sequence | |
from langchain_core.messages import BaseMessage, SystemMessage, HumanMessage, AIMessage, trim_messages | |
from langgraph.graph.message import add_messages | |
from typing_extensions import Annotated, TypedDict | |
import warnings | |
warnings.filterwarnings('ignore') | |
title = "Sales coaching" | |
sidebar_name = "Sales coaching" | |
dataPath = st.session_state.DataPath | |
os.environ["LANGCHAIN_TRACING_V2"] = "true" | |
os.environ["LANGCHAIN_ENDPOINT"]="https://api.smith.langchain.com" | |
os.environ["LANGCHAIN_HUB_API_URL"]="https://api.smith.langchain.com" | |
os.environ["LANGCHAIN_PROJECT"] = "Sales Coaching Chatbot" | |
os.getenv("LANGCHAIN_API_KEY") | |
os.getenv("MISTRAL_API_KEY") | |
model = ChatMistralAI(model="mistral-large-latest") | |
dataPath = st.session_state.DataPath | |
trimmer = trim_messages( | |
max_tokens=1000, | |
strategy="last", | |
token_counter=model, | |
include_system=True, | |
allow_partial=False, | |
start_on="human", | |
) | |
prompt = ChatPromptTemplate.from_messages( | |
[ | |
( | |
"system", | |
"You are a helpful assistant. Answer all questions to the best of your ability in {language}.", | |
), | |
MessagesPlaceholder(variable_name="messages"), | |
] | |
) | |
class State(TypedDict): | |
messages: Annotated[Sequence[BaseMessage], add_messages] | |
language: str | |
def call_model(state: State): | |
chain = prompt | model | |
trimmed_messages = trimmer.invoke(state["messages"]) | |
response = chain.invoke( | |
{"messages": trimmed_messages, "language": state["language"]} | |
) | |
return {"messages": [response]} | |
# Define a new graph | |
workflow = StateGraph(state_schema=State) | |
# Define the (single) node in the graph | |
workflow.add_edge(START, "model") | |
workflow.add_node("model", call_model) | |
workflow.add_edge("model", END) | |
# Add memory | |
memory = MemorySaver() | |
app = workflow.compile(checkpointer=memory) | |
config = {"configurable": {"thread_id": "abc123"}} | |
def run(): | |
st.write("") | |
st.write("") | |
st.title(tr(title)) | |
context = """Simuler conversation entre un commercial de mon entreprise et interlocuteur chez un de mes prospect. L'IA simule les r茅ponses du prospect. L'humain saisie les questions du Commercial. Mon entreprise commercialise une solution logicielle pour g茅rer la proposition de valeur d鈥檈ntreprises B2B qui commercialises des solutions technologiques. | |
L'humain est une des persona suivantes : | |
路 Fondateur | |
路 Directeur g茅n茅ral | |
路 Directeur marketing | |
路 Directeur commercial | |
路 Directeur des op茅rations de vente | |
Le prospect (humain) est dans (Profil des clients cibles) suivant | |
路 Les scale-up fran莽aises qui commercialisent une solution technologique B2B | |
路 Les soci茅t茅s fran莽aises qui commercialisent une solution technologique B2B | |
Probl茅matique adress茅e pas ma solution | |
路 Il est difficile pour les startups de concevoir et formaliser une proposition de valeur unique et pertinente | |
路 Il est difficile pour les forces de vente d'articuler clairement les messages de la proposition de valeur | |
路 Il est chronophage pour les scale-ups de former leur forces de ventes sur les 茅volutions de la proposition de valeur et de ses messages Valeur ajout茅e de ma solution | |
路 augmenter les performances commerciales | |
路 R茅duction du cycle de vente | |
路 Augmenter la croissance du chiffre d'affaires | |
路 Concentrer les ressources sur les opportunit茅s qualifi茅es | |
路 R茅duction temps de mont茅 en comp茅tence des nouvelles embauches | |
路 augmenter le taux de conversion d'affaires gagn茅es | |
路 am茅liorer l'efficacit茅 globale des ventes | |
路 Am茅liorer l'efficience et la confiance des forces de ventes | |
路 optimiser les processus commerciaux pour r茅duire les cycles de vente, fid茅liser les clients et augmenter la productivit茅 | |
路 favorise le d茅veloppement personnel des forces de vente | |
Les cas d鈥檜sages adress茅s par ma solution | |
路 Affiner et mod茅liser la proposition de valeur | |
路 D茅cliner les messages marketing & commerciaux | |
路 Former la force de vente sur la proposition de valeur | |
路 Orchestrer les conversations clients | |
路 Partager les retours terrain | |
路 Mettre en oeuvre des meilleures pratiques commerciales | |
路 Identifier et reproduire les messages de vente gagnants | |
""" | |
messages = [ | |
SystemMessage(content=context) | |
] | |
trimmer.invoke(messages) | |
# query = "Hi I'm Todd, please tell me a joke." | |
query = st.text_area(label=tr("Vendeur:"), value="") | |
language = "French" | |
st.button(label=tr("Validez"), type="primary") | |
input_messages = messages + [HumanMessage(query)] | |
output = app.invoke( | |
{"messages": input_messages, "language": language}, | |
config, | |
) | |
st.write(output["messages"][-1].pretty_print()) | |
''' | |
# Cr茅er un espace r茅serv茅 pour afficher les tokens | |
placeholder = st.empty() | |
for chunk, metadata in app.stream( | |
{"messages": input_messages, "language": language}, | |
config, | |
stream_mode="messages", | |
): | |
if isinstance(chunk, AIMessage): # Filter to just model responses | |
# st.markdown("<span style='white-space: nowrap;'>"+"/"+chunk.content+"/"+"</span>", unsafe_allow_html=True) | |
placeholder.markdown(f"<p style='display: inline;'>{chunk.content}</p>", unsafe_allow_html=True) | |
''' | |
st.write("") | |
st.write("") | |
st.write("") | |
st.write("") |