|
import asyncio |
|
import chainlit as cl |
|
import os |
|
from langchain_openai import ChatOpenAI |
|
|
|
from .utils_actions import offer_actions,offer_initial_actions |
|
from .utils_customer_research import read_markdown_file |
|
from .utils_data import get_company_data, get_opportunities, get_opportunities_from_db |
|
from .utils_objections import create_objections |
|
from .utils_opportunity_review import prep_opportunity_review |
|
from .utils_prompt import get_chat_prompt |
|
|
|
async def prep_start(session_state): |
|
|
|
get_company_data(session_state) |
|
chat_prompt = get_chat_prompt() |
|
chat_model = ChatOpenAI(model=session_state.llm_model) |
|
simple_chain = chat_prompt | chat_model |
|
cl.user_session.set("chain", simple_chain) |
|
|
|
welcome_message = f"**Welcome to {session_state.company.name} SalesBuddy**\n*Your AI assistant for sales and sales management*" |
|
await cl.Message(content=welcome_message).send() |
|
|
|
path = os.path.join(os.path.dirname(__file__), './images/salesbuddy_logo.jpg') |
|
image = cl.Image(path=path, name="salesbuddy_logo", display="inline") |
|
|
|
await cl.Message( |
|
content=" ", |
|
elements=[image], |
|
).send() |
|
|
|
await offer_initial_actions() |
|
|
|
|
|
opportunities = get_opportunities() |
|
|
|
cl.user_session.set("opportunities", opportunities) |
|
|
|
async def prep_opportunities(session_state): |
|
|
|
research_title = "**Upcoming Opportunities**" |
|
await cl.Message(content=research_title).send() |
|
opportunities = cl.user_session.get("opportunities", None) |
|
if opportunities is None: |
|
await cl.Message(content="No scenarios found.").send() |
|
return |
|
opportunity_actions = [] |
|
for idx, row in opportunities.iterrows(): |
|
if row['Opportunity Description'] != "": |
|
customer_name = row['Customer Name'] |
|
opportunity_name = row['Opportunity Name'] |
|
opportunity_stage = row['Opportunity Stage'] |
|
name = f"{customer_name}: {opportunity_name} ({opportunity_stage})" |
|
opportunity_action = cl.Action( |
|
name=name, |
|
value=f"{idx}", |
|
description=f"{row['Customer Name']}: {row['Opportunity Name']} ({row['Opportunity Stage']}) " |
|
f"Value: {row['Opportunity Value']}. Meeting with {row['Customer Contact']} " |
|
f"({row['Customer Contact Role']})" |
|
) |
|
opportunity_actions.append(opportunity_action) |
|
await cl.Message(content="Select an opportunity (hover for details):", actions=opportunity_actions).send() |
|
|
|
async def prep_opportunity_analysis(): |
|
|
|
session_state = cl.user_session.get("session_state", None) |
|
opportunity_analysis_message = "Reviewing HSBC Opportunitiy - please wait..." |
|
await cl.Message(content=opportunity_analysis_message).send() |
|
|
|
if session_state.do_opportunity_analysis: |
|
agent_1_message = "*Retrieving and evaluating opportunity data from SalesForce CRM ...*" |
|
await cl.Message(content=agent_1_message).send() |
|
await prep_opportunity_review(session_state) |
|
report = session_state.opportunity_review_report |
|
await cl.Message(content=report).send() |
|
else: |
|
|
|
agent_1_message = "*Retrieving data from SalesForce CRM ...*" |
|
await cl.Message(content=agent_1_message).send() |
|
await asyncio.sleep(2) |
|
|
|
if session_state.add_objections_to_analysis: |
|
agent_3_message = "*Evaluating opportunity data and identifying risks ...*" |
|
await cl.Message(content=agent_3_message).send() |
|
session_state.objections = await create_objections(session_state) |
|
else: |
|
agent_2_message = "*Evaluating opportunity data...*" |
|
await cl.Message(content=agent_2_message).send() |
|
await asyncio.sleep(1.5) |
|
|
|
agent_3_message = "*Determining next steps ...*" |
|
await cl.Message(content=agent_3_message).send() |
|
await asyncio.sleep(1) |
|
|
|
markdown_file_path = "./reports/HSBC Opportunity Review Report.md" |
|
if os.path.exists(markdown_file_path): |
|
await cl.Message(content=read_markdown_file(markdown_file_path)).send() |
|
else: |
|
output_messages = get_opportunity_analysis() |
|
for output_message in output_messages: |
|
await cl.Message(content=output_message).send() |
|
await cl.Message(content="").send() |
|
|
|
if session_state.add_objections_to_analysis: |
|
output_message = "**Risks**" |
|
await cl.Message(content=output_message).send() |
|
for obj in session_state.objections: |
|
await cl.Message(content=obj).send() |
|
|
|
output_message = "**Next Steps**" |
|
await cl.Message(content=output_message).send() |
|
output_messages = get_next_steps() |
|
for output_message in output_messages: |
|
await cl.Message(content=output_message).send() |
|
await cl.Message(content="").send() |
|
await cl.Message(content="\n\n").send() |
|
|
|
await offer_actions() |
|
|
|
async def prep_research(session_state): |
|
research_title = "**Customer Research**" |
|
await cl.Message(content=research_title).send() |
|
research_message = "Enter customer name to research" |
|
await cl.Message(content=research_message).send() |
|
|
|
|
|
def get_opportunity_analysis(): |
|
output_1 = "**Summary:** The HSBC opportunity involves replacing the existing analytics engine for their loan origination system, valued at $250,000. The current system is slow and lacks flexibility, creating urgency due to an impending renewal with the existing vendor. Multiple meetings have been conducted, culminating in a proposal review. The decision process is progressing, with a meeting scheduled on October 26 with John Smith to discuss the next steps. Potential for pilot program or final negotiations." |
|
output_2 = "**Score: 75**" |
|
output_3 = "**MEDDIC Evaluation:**" |
|
output_4 = "**Metrics: 70** - The proposal discussed expected performance improvements and ROI, but specific quantitative metrics driving the decision were not detailed." |
|
output_5 = "**Economic Buyer: 65** - There is no direct mention of engagement with the ultimate economic buyer, although the CFO's involvement in the proposal review suggests some level of engagement." |
|
output_6 = "**Decision Criteria: 75** - The decision criteria seem to be partially understood, as there has been discussion about ROI, performance improvements, and contract terms, but further clarity is needed." |
|
output_7 = "**Decision Process: 80** - The decision process appears to be well-understood, with clear next steps and urgency due to the vendor renewal timeline." |
|
output_8 = "**Identify Pain: 85** - The pain points related to the existing system's performance and flexibility are clearly identified, driving the opportunity forward." |
|
output_9 = "**Champion: 75** - John Smith, the VP of IT, appears to be a potential champion, as he is involved in every meeting, but his level of influence and commitment is not fully confirmed." |
|
outputs = [output_1, output_2, output_3, output_4, output_5, output_6, output_7, output_8, output_9] |
|
return outputs |
|
def get_next_steps(): |
|
output_10 = "Engage with the CFO and other key stakeholders to refine the understanding of the decision criteria and ensure alignment with their expectations. Confirm John Smith's role as a champion and clarify his influence on the decision-making process." |
|
output_11 = "**Talking Points:**" |
|
output_12 = " 1. Discuss specific quantitative metrics and performance benchmarks that demonstrate the expected improvements and ROI to solidify the business case" |
|
output_13 = " 2. Address the decision criteria with more clarity, ensuring that all stakeholders, including the CFO, have a shared understanding of what is needed to move forward" |
|
output_14 = " 3. Highlight the urgency of the situation due to the impending vendor renewal and how your solution can address the identified pain points in a timely manner" |
|
outputs = [output_10, output_11, output_12, output_13, output_14] |
|
return outputs |
|
|
|
|
|
async def prep_latest_news(): |
|
latest_news_message = "Retrieving latest news on this customer - please wait..." |
|
await cl.Message(content=latest_news_message).send() |
|
await asyncio.sleep(2) |
|
agent_1_message = "Agent 1: Processing data..." |
|
await cl.Message(content=agent_1_message).send() |
|
await asyncio.sleep(1) |
|
agent_2_message = "Agent 2: Evaluating opportunity..." |
|
await cl.Message(content=agent_2_message).send() |
|
|