File size: 7,982 Bytes
0e9ef68
 
 
 
2393995
0e9ef68
 
 
 
 
 
 
 
 
 
 
 
 
2393995
0e9ef68
2393995
 
 
 
 
 
 
 
 
 
0e9ef68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2393995
0e9ef68
 
 
 
 
 
 
 
 
 
 
2393995
0e9ef68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import asyncio
import chainlit as cl
from langchain_openai import ChatOpenAI

from utils_actions import offer_actions,offer_initial_actions
from utils_data import get_company_data, get_opportunities
from utils_prompt import get_chat_prompt
from utils_objections import create_objections


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()
    # await cl.Message(content=session_state.company.product_summary).send()

    image = cl.Image(path="images/salesbuddy_logo.jpg", 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}",  # Send the row index as value
                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 = "Retrieving and Reviewing HSBC Opportunitiy - please wait..."
    await cl.Message(content=opportunity_analysis_message).send()
    
    if session_state.do_opportunity_analysis:
        pass
    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 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 ...*"
            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)
        output_message = "**Analysis Results**"
        await cl.Message(content=output_message).send()
        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()