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 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() # 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 = "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()