diff --git a/common/models/interaction.py b/common/models/interaction.py index d429ce9..8a9ef6b 100644 --- a/common/models/interaction.py +++ b/common/models/interaction.py @@ -122,6 +122,8 @@ class EveAIAgent(db.Model): role = db.Column(db.Text, nullable=True) goal = db.Column(db.Text, nullable=True) backstory = db.Column(db.Text, nullable=True) + temperature = db.Column(db.Float, nullable=True) + llm_model = db.Column(db.String(50), nullable=True) tuning = db.Column(db.Boolean, nullable=True, default=False) configuration = db.Column(JSONB, nullable=True) arguments = db.Column(JSONB, nullable=True) diff --git a/config/agents/globals/EMAIL_CONTENT_AGENT/1.0.0.yaml b/config/agents/globals/EMAIL_CONTENT_AGENT/1.0.0.yaml deleted file mode 100644 index 981a88a..0000000 --- a/config/agents/globals/EMAIL_CONTENT_AGENT/1.0.0.yaml +++ /dev/null @@ -1,17 +0,0 @@ -version: "1.0.0" -name: "Email Content Agent" -role: > - Email Content Writer -goal: > - Craft a highly personalized email that resonates with the {end_user_role}'s context and identification (personal and - company if available). - {custom_goal} -backstory: > - You are an expert in writing compelling, personalized emails that capture the {end_user_role}'s attention and drive - engagement. You are perfectly multilingual, and can write the mail in the native language of the {end_user_role}. - {custom_backstory} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "An Agent that writes engaging emails." - changes: "Initial version" diff --git a/config/agents/globals/EMAIL_ENGAGEMENT_AGENT/1.0.0.yaml b/config/agents/globals/EMAIL_ENGAGEMENT_AGENT/1.0.0.yaml deleted file mode 100644 index 6581c92..0000000 --- a/config/agents/globals/EMAIL_ENGAGEMENT_AGENT/1.0.0.yaml +++ /dev/null @@ -1,16 +0,0 @@ -version: "1.0.0" -name: "Email Engagement Agent" -role: > - Engagement Optimization Specialist {custom_role} -goal: > - You ensure that the email includes strong CTAs and strategically placed engagement hooks that encourage the - {end_user_role} to take immediate action. {custom_goal} -backstory: > - You specialize in optimizing content to ensure that it not only resonates with the recipient but also encourages them - to take the desired action. - {custom_backstory} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "An Agent that ensures the email is engaging and lead to maximal desired action" - changes: "Initial version" diff --git a/config/agents/globals/IDENTIFICATION_AGENT/1.0.0.yaml b/config/agents/globals/IDENTIFICATION_AGENT/1.0.0.yaml deleted file mode 100644 index 09e08e5..0000000 --- a/config/agents/globals/IDENTIFICATION_AGENT/1.0.0.yaml +++ /dev/null @@ -1,20 +0,0 @@ -version: "1.0.0" -name: "Identification Agent" -role: > - Identification Administrative force. {custom_role} -goal: > - You are an administrative force that tries to gather identification information to complete the administration of an - end-user, the company he or she works for, through monitoring conversations and advising on questions to help you do - your job. You are responsible for completing the company's backend systems (like CRM, ERP, ...) with inputs from the - end user in the conversation. - {custom_goal} -backstory: > - You are and administrative force for {company}, and very proficient in gathering information for the company's backend - systems. You do so by monitoring conversations between one of your colleagues (e.g. sales, finance, support, ...) and - an end user. You ask your colleagues to request additional information to complete your task. - {custom_backstory} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "An Agent that gathers administrative information" - changes: "Initial version" diff --git a/config/agents/globals/RAG_AGENT/1.2.0.yaml b/config/agents/globals/RAG_AGENT/1.2.0.yaml index 86d2d6a..360c6e9 100644 --- a/config/agents/globals/RAG_AGENT/1.2.0.yaml +++ b/config/agents/globals/RAG_AGENT/1.2.0.yaml @@ -7,19 +7,20 @@ goal: > of the current conversation. {custom_goal} backstory: > - You are the primary contact for {tenant_name}. You are known by {name}, and can be addressed by this name, or 'you'. - You are a very good communicator. - We want you to answer using the following Tone of Voice: {tone_of_voice} - {tone_of_voice_context}. - And we want you to answer using the following Language Level: {language_level} - {language_level_context}. - We want your answers to be {response_depth} - {response_depth_context}. - We want your answers to be {conversation_purpose} - {conversation_purpose_context}. - You can change Tone of Voice and Language level if required by the person you are talking to.. + You are the primary contact for {tenant_name}, and have been it's spokesperson for a very long time. You are used to + addressing customers, prospects, press, ... + You are known by {name}, and can be addressed by this name, or 'you'. + You are a very good communicator, that knows how to adapt his style to the public your interacting with. You always stay correct and polite, whatever happens. And you ensure no discriminating language is used. You are perfectly multilingual in all known languages, and do your best to answer questions in {language}, whatever - language the context provided to you is in. You are participating in a conversation, not writing e.g. an email. Do not - include a salutation or closing greeting in your answer. + language the context provided to you is in. You are participating in a conversation, not writing e.g. an email or + essay. Do not include a salutation or closing greeting in your answer. {custom_backstory} full_model_name: "mistral.mistral-medium-latest" +allowed_models: + - "mistral.mistral-small-latest" + - "mistral.mistral-medium-latest" + - "mistral.magistral-medium-latest" temperature: 0.4 metadata: author: "Josako" diff --git a/config/agents/globals/RAG_COMMUNICATION_AGENT/1.0.0.yaml b/config/agents/globals/RAG_COMMUNICATION_AGENT/1.0.0.yaml deleted file mode 100644 index a0c8c82..0000000 --- a/config/agents/globals/RAG_COMMUNICATION_AGENT/1.0.0.yaml +++ /dev/null @@ -1,26 +0,0 @@ -version: "1.0.0" -name: "Rag Communication Agent" -role: > - {company} Interaction Responsible. {custom_role} -goal: > - Your team has collected answers to a question asked. But it also created some additional questions to be asked. You - ensure the necessary answers are returned, and make an informed selection of the additional questions that can be - asked (combining them when appropriate), ensuring the human you're communicating to does not get overwhelmed. - {custom_goal} -backstory: > - You are the online communication expert for {company}. You handled a lot of online communications with both customers - and internal employees. You are a master in redacting one coherent reply in a conversation that includes all the - answers, and a selection of additional questions to be asked in a conversation. Although your backoffice team might - want to ask a myriad of questions, you understand that doesn't fit with the way humans communicate. You know how to - combine multiple related questions, and understand how to interweave the questions in the answers when related. - You are perfectly multilingual in all known languages, and do your best to answer questions in {language}, whatever - language the context provided to you is in. Also, ensure that questions asked do not contradict with the answers - given, or aren't obsolete given the answer provided. - You are participating in a conversation, not writing e.g. an email. Do not include a salutation or closing greeting - in your answer. - {custom_backstory} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "An Agent that consolidates both answers and questions in a consistent reply" - changes: "Initial version" diff --git a/config/agents/globals/RAG_PROOFREADER_AGENT/1.0.0.yaml b/config/agents/globals/RAG_PROOFREADER_AGENT/1.0.0.yaml new file mode 100644 index 0000000..fb95a44 --- /dev/null +++ b/config/agents/globals/RAG_PROOFREADER_AGENT/1.0.0.yaml @@ -0,0 +1,24 @@ +version: "1.0.0" +name: "Rag Proofreader Agent" +role: > + Proofreader for {tenant_name}. {custom_role} +goal: > + You get a prepared answer to be send out, and adapt it to comply to best practices. + {custom_goal} +backstory: > + You are the primary contact for {tenant_name}, and have been it's spokesperson for a very long time. You are used to + addressing customers, prospects, press, ... + You are known by {name}, and can be addressed by this name, or 'you'. + You review communications and ensure they are clear and follow best practices. + {custom_backstory} +full_model_name: "mistral.mistral-medium-latest" +allowed_models: + - "mistral.mistral-small-latest" + - "mistral.mistral-medium-latest" + - "mistral.magistral-medium-latest" +temperature: 0.4 +metadata: + author: "Josako" + date_added: "2025-10-22" + description: "An Agent that does QA Activities on provided answers" + changes: "Initial version" diff --git a/config/agents/globals/SPIN_DETECTION_AGENT/1.0.0.yaml b/config/agents/globals/SPIN_DETECTION_AGENT/1.0.0.yaml deleted file mode 100644 index 2348272..0000000 --- a/config/agents/globals/SPIN_DETECTION_AGENT/1.0.0.yaml +++ /dev/null @@ -1,22 +0,0 @@ -version: "1.0.0" -name: "SPIN Sales Assistant" -role: > - Sales Assistant for {company} on {products}. {custom_role} -goal: > - Your main job is to help your sales specialist to analyze an ongoing conversation with a customer, and detect - SPIN-related information. {custom_goal} -backstory: > - You are a sales assistant for {company} on {products}. You are known by {name}, and can be addressed by this name, or you. You are - trained to understand an analyse ongoing conversations. Your are proficient in detecting SPIN-related information in a - conversation. - SPIN stands for: - - Situation information - Understanding the customer's current context - - Problem information - Uncovering challenges and pain points - - Implication information - Exploring consequences of those problems - - Need-payoff information - Helping customers realize value of solutions - {custom_backstory} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "An Agent that detects SPIN information in an ongoing conversation" - changes: "Initial version" diff --git a/config/agents/globals/SPIN_SALES_SPECIALIST_AGENT/1.0.0.yaml b/config/agents/globals/SPIN_SALES_SPECIALIST_AGENT/1.0.0.yaml deleted file mode 100644 index 9fb68c3..0000000 --- a/config/agents/globals/SPIN_SALES_SPECIALIST_AGENT/1.0.0.yaml +++ /dev/null @@ -1,25 +0,0 @@ -version: "1.0.0" -name: "SPIN Sales Specialist" -role: > - Sales Specialist for {company} on {products}. {custom_role} -goal: > - Your main job is to do sales using the SPIN selling methodology in a first conversation with a potential customer. - {custom_goal} -backstory: > - You are a sales specialist for {company} on {products}. You are known by {name}, and can be addressed by this name, - or you. You have an assistant that provides you with already detected SPIN-information in an ongoing conversation. You - decide on follow-up questions for more in-depth information to ensure we get the required information that may lead to - selling {products}. - SPIN stands for: - - Situation information - Understanding the customer's current context - - Problem information - Uncovering challenges and pain points - - Implication information - Exploring consequences of those problems - - Need-payoff information - Helping customers realize value of solutions - {custom_backstory} - You are acquainted with the following product information: - {product_information} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "An Agent that asks for Follow-up questions for SPIN-process" - changes: "Initial version" diff --git a/config/specialist_forms/globals/PROFESSIONAL_CONTACT_FORM/1.0.0.yaml b/config/specialist_forms/globals/PROFESSIONAL_CONTACT_FORM/1.0.0.yaml index d1c9409..68cd20b 100644 --- a/config/specialist_forms/globals/PROFESSIONAL_CONTACT_FORM/1.0.0.yaml +++ b/config/specialist_forms/globals/PROFESSIONAL_CONTACT_FORM/1.0.0.yaml @@ -28,16 +28,6 @@ fields: type: "str" description: "Job Title" required: false - address: - name: "Address" - type: "str" - description: "Your Address" - required: false - zip: - name: "Postal Code" - type: "str" - description: "Postal Code" - required: false city: name: "City" type: "str" diff --git a/config/specialists/globals/RAG_SPECIALIST/1.2.0.yaml b/config/specialists/globals/RAG_SPECIALIST/1.2.0.yaml index 7638025..4e94b9d 100644 --- a/config/specialists/globals/RAG_SPECIALIST/1.2.0.yaml +++ b/config/specialists/globals/RAG_SPECIALIST/1.2.0.yaml @@ -67,9 +67,13 @@ results: agents: - type: "RAG_AGENT" version: "1.2" + - type: "RAG_PROOFREADER_AGENT" + version: "1.0" tasks: - type: "RAG_TASK" version: "1.1" + - type: "RAG_PROOFREADING_TASK" + version: "1.0" metadata: author: "Josako" date_added: "2025-01-08" diff --git a/config/specialists/globals/SPIN_SPECIALIST/1.0.0.yaml b/config/specialists/globals/SPIN_SPECIALIST/1.0.0.yaml deleted file mode 100644 index 8fcc113..0000000 --- a/config/specialists/globals/SPIN_SPECIALIST/1.0.0.yaml +++ /dev/null @@ -1,183 +0,0 @@ -version: "1.0.0" -name: "Spin Sales Specialist" -framework: "crewai" -chat: true -configuration: - name: - name: "name" - type: "str" - description: "The name the specialist is called upon." - required: true - company: - name: "company" - type: "str" - description: "The name of your company. If not provided, your tenant's name will be used." - required: false - products: - name: "products" - type: "List[str]" - description: "The products or services you're providing" - required: false - product_information: - name: "product_information" - type: "text" - description: "Information on the products you are selling, such as ICP (Ideal Customer Profile), Pitch, ..." - required: false - engagement_options: - name: "engagement_options" - type: "text" - description: "Engagement options such as email, phone number, booking link, ..." - tenant_language: - name: "tenant_language" - type: "str" - description: "The language code used for internal information. If not provided, the tenant's default language will be used" - required: false - nr_of_questions: - name: "nr_of_questions" - type: "int" - description: "The maximum number of questions to formulate extra questions" - required: true - default: 3 -arguments: - language: - name: "Language" - type: "str" - description: "Language code to be used for receiving questions and giving answers" - required: true - query: - name: "query" - type: "str" - description: "Query or response to process" - required: true - identification: - name: "identification" - type: "text" - description: "Initial identification information when available" - required: false -results: - rag_output: - answer: - name: "answer" - type: "str" - description: "Answer to the query" - required: true - citations: - name: "citations" - type: "List[str]" - description: "List of citations" - required: false - insufficient_info: - name: "insufficient_info" - type: "bool" - description: "Whether or not the query is insufficient info" - required: true - spin: - situation: - name: "situation" - type: "str" - description: "A description of the customer's current situation / context" - required: false - problem: - name: "problem" - type: "str" - description: "The current problems the customer is facing, for which he/she seeks a solution" - required: false - implication: - name: "implication" - type: "str" - description: "A list of implications" - required: false - needs: - name: "needs" - type: "str" - description: "A list of needs" - required: false - additional_info: - name: "additional_info" - type: "str" - description: "Additional information that may be commercially interesting" - required: false - lead_info: - lead_personal_info: - name: - name: "name" - type: "str" - description: "name of the lead" - required: "true" - job_title: - name: "job_title" - type: "str" - description: "job title" - required: false - email: - name: "email" - type: "str" - description: "lead email" - required: "false" - phone: - name: "phone" - type: "str" - description: "lead phone" - required: false - additional_info: - name: "additional_info" - type: "str" - description: "additional info on the lead" - required: false - lead_company_info: - company_name: - name: "company_name" - type: "str" - description: "Name of the lead company" - required: false - industry: - name: "industry" - type: "str" - description: "The industry of the company" - required: false - company_size: - name: "company_size" - type: "int" - description: "The size of the company" - required: false - company_website: - name: "company_website" - type: "str" - description: "The main website for the company" - required: false - additional_info: - name: "additional_info" - type: "str" - description: "Additional information that may be commercially interesting" - required: false -agents: - - type: "RAG_AGENT" - version: "1.0" - - type: "RAG_COMMUNICATION_AGENT" - version: "1.0" - - type: "SPIN_DETECTION_AGENT" - version: "1.0" - - type: "SPIN_SALES_SPECIALIST_AGENT" - version: "1.0" - - type: "IDENTIFICATION_AGENT" - version: "1.0" - - type: "RAG_COMMUNICATION_AGENT" - version: "1.0" -tasks: - - type: "RAG_TASK" - version: "1.0" - - type: "SPIN_DETECT_TASK" - version: "1.0" - - type: "SPIN_QUESTIONS_TASK" - version: "1.0" - - type: "IDENTIFICATION_DETECTION_TASK" - version: "1.0" - - type: "IDENTIFICATION_QUESTIONS_TASK" - version: "1.0" - - type: "RAG_CONSOLIDATION_TASK" - version: "1.0" -metadata: - author: "Josako" - date_added: "2025-01-08" - changes: "Initial version" - description: "A Specialist that performs both Q&A as SPIN (Sales Process) activities" \ No newline at end of file diff --git a/config/specialists/globals/SPIN_SPECIALIST/1.0.0_overview.svg b/config/specialists/globals/SPIN_SPECIALIST/1.0.0_overview.svg deleted file mode 100644 index c374ee4..0000000 --- a/config/specialists/globals/SPIN_SPECIALIST/1.0.0_overview.svg +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - - - - - - - - - - EveAI Agent - - - - - - - - - - - - - - - - - - - - Identification Agent - - - - - - - - - - - - - - - - SPIN Sales Assistant - - - - - - - - - - - - - - - - SPIN Sales Specialist - - - - - - - - - - - - - - - - - - - - Identification Agent - - - - - - - - - - - - - - - - Consolidation Agent - - - - - - - - - - - - - - - - RAG Agent - - - - - - - - - - - - - - - - - EveAI Task - - - - - - - - - - - - - RAG Task - - - - - - - - - - - - - - - SPIN Detection - - - - - - - - - - - - - - - - - - - Identification Gathering - - - - - - - - - - - - - - - - - - - Identification Questions - - - - - - - - - - - - - - - Consolidate Q&A - - - - - - - - - - - - - - - SPIN Questions - - - - - - - - - - - - - EveAI Tool - - - - - - - - - - - - - - - - RAG Task - - - - - - - - - - - - - Retrieval - - - - - - - Q&A Processing - - - - - - - - - - - - - - - - - diff --git a/config/tasks/globals/EMAIL_LEAD_DRAFTING_TASK/1.0.0.yaml b/config/tasks/globals/EMAIL_LEAD_DRAFTING_TASK/1.0.0.yaml deleted file mode 100644 index d958958..0000000 --- a/config/tasks/globals/EMAIL_LEAD_DRAFTING_TASK/1.0.0.yaml +++ /dev/null @@ -1,35 +0,0 @@ -version: "1.0.0" -name: "Email Lead Draft Creation" -task_description: > - Craft a highly personalized email using the lead's name, job title, company information, and any relevant personal or - company achievements when available. The email should speak directly to the lead's interests and the needs - of their company. - This mail is the consequence of a first conversation. You have information available from that conversation in the - - SPIN-context (in between triple %) - - personal and company information (in between triple $) - Information might be missing however, as it might not be gathered in that first conversation. - Don't use any salutations or closing remarks, nor too complex sentences. - - Our Company and Product: - - Company Name: {company} - - Products: {products} - - Product information: {product_information} - - {customer_role}'s Identification: - $$${Identification}$$$ - - SPIN context: - %%%{SPIN}%%% - - {custom_description} -expected_output: > - A personalized email draft that: - - Addresses the lead by name - - Acknowledges their role and company - - Highlights how {company} can meet their specific needs or interests - {customer_expected_output} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "Email Drafting Task towards a Lead" - changes: "Initial version" diff --git a/config/tasks/globals/EMAIL_LEAD_ENGAGEMENT_TASK/1.0.0.yaml b/config/tasks/globals/EMAIL_LEAD_ENGAGEMENT_TASK/1.0.0.yaml deleted file mode 100644 index 1302c57..0000000 --- a/config/tasks/globals/EMAIL_LEAD_ENGAGEMENT_TASK/1.0.0.yaml +++ /dev/null @@ -1,28 +0,0 @@ -version: "1.0.0" -name: "Email Lead Engagement Creation" -task_description: > - Review a personalized email and optimize it with strong CTAs and engagement hooks. Keep in mind that this email is - the consequence of a first conversation. - Don't use any salutations or closing remarks, nor too complex sentences. Keep it short and to the point. - Don't use any salutations or closing remarks, nor too complex sentences. - Ensure the email encourages the lead to schedule a meeting or take - another desired action immediately. - - Our Company and Product: - - Company Name: {company} - - Products: {products} - - Product information: {product_information} - - Engagement options: - {engagement_options} - - {custom_description} -expected_output: > - An optimized email ready for sending, complete with: - - Strong CTAs - - Strategically placed engagement hooks that encourage immediate action -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "Make an Email draft more engaging" - changes: "Initial version" diff --git a/config/tasks/globals/IDENTIFICATION_DETECTION_TASK/1.0.0.yaml b/config/tasks/globals/IDENTIFICATION_DETECTION_TASK/1.0.0.yaml deleted file mode 100644 index d8ca17d..0000000 --- a/config/tasks/globals/IDENTIFICATION_DETECTION_TASK/1.0.0.yaml +++ /dev/null @@ -1,24 +0,0 @@ -version: "1.0.0" -name: "Identification Gathering" -task_description: > - You are asked to gather lead information in a conversation with a new prospect. This is information about the person - participating in the conversation, and information on the company he or she is working for. Try to be as precise as - possible. - Take into account information already gathered in the historic lead info (between triple backquotes) and add - information found in the latest reply. Also, some identification information may be given by the end user. - - historic lead info: - ```{historic_lead_info}``` - latest reply: - {query} - identification: - {identification} - - {custom_description} -expected_output: > - -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "A Task that gathers identification information from a conversation" - changes: "Initial version" diff --git a/config/tasks/globals/IDENTIFICATION_QUESTIONS_TASK/1.0.0.yaml b/config/tasks/globals/IDENTIFICATION_QUESTIONS_TASK/1.0.0.yaml deleted file mode 100644 index 624c033..0000000 --- a/config/tasks/globals/IDENTIFICATION_QUESTIONS_TASK/1.0.0.yaml +++ /dev/null @@ -1,19 +0,0 @@ -version: "1.0.0" -name: "Define Identification Questions" -task_description: > - Gather the identification information gathered by your team mates. Ensure no information in the historic lead - information (in between triple backquotes) and the latest reply of the user is lost. - Define questions to be asked to complete the personal and company information for the end user in the conversation. - historic lead info: - ```{historic_lead_info}``` - latest reply: - {query} - - {custom_description} -expected_output: > - -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "A Task to define identification (person & company) questions" - changes: "Initial version" diff --git a/config/tasks/globals/RAG_CONSOLIDATION_TASK/1.0.0.yaml b/config/tasks/globals/RAG_CONSOLIDATION_TASK/1.0.0.yaml deleted file mode 100644 index a70f1e1..0000000 --- a/config/tasks/globals/RAG_CONSOLIDATION_TASK/1.0.0.yaml +++ /dev/null @@ -1,27 +0,0 @@ -version: "1.0.0" -name: "Rag Consolidation" -task_description: > - Your teams have collected answers to a user's query (in between triple backquotes), and collected additional follow-up - questions (in between triple %) to reach their goals. Ensure the answers are provided, and select a maximum of - {nr_of_questions} out of the additional questions to be asked in order not to overwhelm the user. The questions are - in no specific order, so don't just pick the first ones. Make a good mixture of different types of questions, - different topics or subjects! - Questions are to be asked when your team proposes questions. You ensure both answers and additional questions are - bundled into 1 clear communication back to the user. Use {language} for your consolidated communication. - Be sure to format your answer in markdown when appropriate. Ensure enumerations or bulleted lists are formatted as - lists in markdown. - {custom_description} - - Anwers: - ```{prepared_answers}``` - - Additional Questions: - %%%{additional_questions}%%% - -expected_output: > - {custom_expected_output} -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "A Task to consolidate questions and answers" - changes: "Initial version" diff --git a/config/tasks/globals/RAG_PROOFREADING_TASK/1.0.0.yaml b/config/tasks/globals/RAG_PROOFREADING_TASK/1.0.0.yaml new file mode 100644 index 0000000..17322bc --- /dev/null +++ b/config/tasks/globals/RAG_PROOFREADING_TASK/1.0.0.yaml @@ -0,0 +1,26 @@ +version: "1.0.0" +name: "RAG QA Task" +task_description: > + You have to improve this first draft answering the following question: + + £££ + {question} + £££ + + We want you to pay extra attention and adapt to the following requirements: + + - The answer uses the following Tone of Voice: {tone_of_voice}, i.e. {tone_of_voice_context} + - The answer is adapted to the following Language Level: {language_level}, i.e. {language_level_context} + - The answer is suited to be {conversation_purpose}, i.e. {conversation_purpose_context} + - And we want the answer to have the following depth: {response_depth}, i.e. {response_depth_context} + + Ensure the following {language} is used. + If there was insufficient information to answer, answer "I have insufficient information to answer this + question." and give the appropriate indication. +expected_output: > + Your answer. +metadata: + author: "Josako" + date_added: "2025-01-08" + description: "A Task that gives RAG-based answers" + changes: "Initial version" diff --git a/config/tasks/globals/RAG_TASK/1.1.0.yaml b/config/tasks/globals/RAG_TASK/1.1.0.yaml index 6a7351c..8887007 100644 --- a/config/tasks/globals/RAG_TASK/1.1.0.yaml +++ b/config/tasks/globals/RAG_TASK/1.1.0.yaml @@ -7,19 +7,9 @@ task_description: > {question} £££ - Base your answer on the following context (in between triple $): - - $$$ - {context} - $$$ - - Take into account the following history of the conversation (in between triple €): - - €€€ - {history} - €€€ - - The HUMAN parts indicate the interactions by the end user, the AI parts are your interactions. + Base your answer on the context below, in between triple '$'. + Take into account the history of the conversion , in between triple '€'. The parts in the history preceded by 'HUMAN' + indicate the interactions by the end user, the parts preceded with 'AI' are your interactions. Best Practices are: @@ -27,11 +17,29 @@ task_description: > - Always focus your answer on the actual question. - Try not to repeat your historic answers, unless absolutely necessary. - Always be friendly and helpful for the end user. + + Tune your answer with the following: + + - You use the following Tone of Voice for your answer: {tone_of_voice}, i.e. {tone_of_voice_context} + - You use the following Language Level for your answer: {language_level}, i.e. {language_level_context} + - The purpose of the conversation is to be {conversation_purpose}, i.e. {conversation_purpose_context} + - We expect you to answer with the following depth: {response_depth}, i.e. {response_depth_context} {custom_description} + Use the following {language} in your communication. If the question cannot be answered using the given context, answer "I have insufficient information to answer this question." and give the appropriate indication. + + Context: + $$$ + {context} + $$$ + + History: + €€€ + {history} + €€€ expected_output: > Your answer. metadata: diff --git a/config/tasks/globals/SPIN_DETECT_TASK/1.0.0.yaml b/config/tasks/globals/SPIN_DETECT_TASK/1.0.0.yaml deleted file mode 100644 index f496764..0000000 --- a/config/tasks/globals/SPIN_DETECT_TASK/1.0.0.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: "1.0.0" -name: "SPIN Information Detection" -task_description: > - Complement the historic SPIN context (in between triple backquotes) with information found in the latest reply of the - end user. - {custom_description} - Use the following {tenant_language} to define the SPIN-elements. - Historic SPIN: - ```{historic_spin}``` - Latest reply: - {query} -expected_output: > - -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "A Task that performs SPIN Information Detection" - changes: "Initial version" diff --git a/config/tasks/globals/SPIN_QUESTIONS_TASK/1.0.0.yaml b/config/tasks/globals/SPIN_QUESTIONS_TASK/1.0.0.yaml deleted file mode 100644 index 87f722f..0000000 --- a/config/tasks/globals/SPIN_QUESTIONS_TASK/1.0.0.yaml +++ /dev/null @@ -1,20 +0,0 @@ -version: "1.0.0" -name: "SPIN Question Identification" -task_description: > - Revise the final SPIN provided by your colleague, and ensure no information is lost from the histoic SPIN and the - latest reply from the user. Define the top questions that need to be asked to understand the full SPIN context - of the customer. If you think this user could be a potential customer, please indicate so. - {custom_description} - Use the following {tenant_language} to define the SPIN-elements. If you have a satisfying SPIN context, just skip and - don't ask for more information or confirmation. - Historic SPIN: - ```{historic_spin}``` - Latest reply: - {query} -expected_output: > - -metadata: - author: "Josako" - date_added: "2025-01-08" - description: "A Task that identifies questions to complete the SPIN context in a conversation" - changes: "Initial version" diff --git a/config/type_defs/agent_types.py b/config/type_defs/agent_types.py index a64b1c5..d30d67d 100644 --- a/config/type_defs/agent_types.py +++ b/config/type_defs/agent_types.py @@ -1,32 +1,12 @@ # Agent Types AGENT_TYPES = { - "EMAIL_CONTENT_AGENT": { - "name": "Email Content Agent", - "description": "An Agent that writes engaging emails.", - }, - "EMAIL_ENGAGEMENT_AGENT": { - "name": "Email Engagement Agent", - "description": "An Agent that ensures the email is engaging and lead to maximal desired action", - }, - "IDENTIFICATION_AGENT": { - "name": "Identification Agent", - "description": "An Agent that gathers identification information", - }, "RAG_AGENT": { "name": "Rag Agent", "description": "An Agent that does RAG based on a user's question, RAG content & history", }, - "RAG_COMMUNICATION_AGENT": { - "name": "Rag Communication Agent", - "description": "An Agent that consolidates both answers and questions in a consistent reply", - }, - "SPIN_DETECTION_AGENT": { - "name": "SPIN Sales Assistant", - "description": "An Agent that detects SPIN information in an ongoing conversation", - }, - "SPIN_SALES_SPECIALIST_AGENT": { - "name": "SPIN Sales Specialist", - "description": "An Agent that asks for Follow-up questions for SPIN-process", + "RAG_PROOFREADER_AGENT": { + "name": "Rag Proofreader Agent", + "description": "An Agent that checks the quality of RAG answers and adapts when required", }, "TRAICIE_HR_BP_AGENT": { "name": "Traicie HR BP Agent", diff --git a/config/type_defs/specialist_types.py b/config/type_defs/specialist_types.py index a7274f0..6d5f9be 100644 --- a/config/type_defs/specialist_types.py +++ b/config/type_defs/specialist_types.py @@ -9,10 +9,6 @@ SPECIALIST_TYPES = { "description": "Q&A through Partner RAG Specialist (for documentation purposes)", "partner": "evie_partner" }, - "SPIN_SPECIALIST": { - "name": "Spin Sales Specialist", - "description": "A specialist that allows to answer user queries, try to get SPIN-information and Identification", - }, "TRAICIE_ROLE_DEFINITION_SPECIALIST": { "name": "Traicie Role Definition Specialist", "description": "Assistant Defining Competencies and KO Criteria", diff --git a/config/type_defs/task_types.py b/config/type_defs/task_types.py index 3c7df5a..a602d5c 100644 --- a/config/type_defs/task_types.py +++ b/config/type_defs/task_types.py @@ -1,36 +1,16 @@ # Agent Types TASK_TYPES = { - "EMAIL_LEAD_DRAFTING_TASK": { - "name": "Email Lead Draft Creation", - "description": "Email Drafting Task towards a Lead", - }, - "EMAIL_LEAD_ENGAGEMENT_TASK": { - "name": "Email Lead Engagement Creation", - "description": "Make an Email draft more engaging", - }, - "IDENTIFICATION_DETECTION_TASK": { - "name": "Identification Gathering", - "description": "A Task that gathers identification information from a conversation", - }, - "IDENTIFICATION_QUESTIONS_TASK": { - "name": "Define Identification Questions", - "description": "A Task to define identification (person & company) questions", - }, "RAG_TASK": { "name": "RAG Task", "description": "A Task that gives RAG-based answers", }, - "SPIN_DETECT_TASK": { - "name": "SPIN Information Detection", - "description": "A Task that performs SPIN Information Detection", + "ADVANCED_RAG_TASK": { + "name": "Advanced RAG Task", + "description": "A Task that gives RAG-based answers taking into account previous questions, tone of voice and language level", }, - "SPIN_QUESTIONS_TASK": { - "name": "SPIN Question Identification", - "description": "A Task that identifies questions to complete the SPIN context in a conversation", - }, - "RAG_CONSOLIDATION_TASK": { - "name": "RAG Consolidation", - "description": "A Task to consolidate questions and answers", + "RAG_PROOFREADING_TASK": { + "name": "Rag Proofreading Task", + "description": "A Task that performs RAG Proofreading", }, "TRAICIE_GET_COMPETENCIES_TASK": { "name": "Traicie Get Competencies", diff --git a/config/user_actions/globals/SHARE_PROFESSIONAL_CONTACT_DATA/1.0.0.yaml b/config/user_actions/globals/SHARE_PROFESSIONAL_CONTACT_DATA/1.0.0.yaml new file mode 100644 index 0000000..f3049b3 --- /dev/null +++ b/config/user_actions/globals/SHARE_PROFESSIONAL_CONTACT_DATA/1.0.0.yaml @@ -0,0 +1,9 @@ +type: "SHARE_PROFESSIONAL_CONTACT_DATA" +version: "1.0.0" +name: "Share Professional Contact Data" +icon: "account_circle" +title: "Share Contact Data" +action_type: "specialist_form" +configuration: + specialist_form_name: "PROFESSIONAL_CONTACT_FORM" + specialist_form_version: "1.0.0" diff --git a/eveai_app/views/interaction_forms.py b/eveai_app/views/interaction_forms.py index 783f2df..d31be67 100644 --- a/eveai_app/views/interaction_forms.py +++ b/eveai_app/views/interaction_forms.py @@ -2,8 +2,8 @@ from flask import session from flask_wtf import FlaskForm from wtforms import (StringField, BooleanField, SelectField, TextAreaField) from wtforms.fields.datetime import DateField -from wtforms.fields.numeric import IntegerField -from wtforms.validators import DataRequired, Length, Optional +from wtforms.fields.numeric import IntegerField, FloatField +from wtforms.validators import DataRequired, Length, Optional, NumberRange from wtforms_sqlalchemy.fields import QuerySelectMultipleField @@ -91,6 +91,16 @@ class EditEveAIAgentForm(BaseEditComponentForm): role = TextAreaField('Role', validators=[Optional()]) goal = TextAreaField('Goal', validators=[Optional()]) backstory = TextAreaField('Backstory', validators=[Optional()]) + temperature = FloatField('Temperature', validators=[Optional(), NumberRange(min=0, max=1)]) + llm_model = SelectField('LLM Model', validators=[Optional()]) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + agent_config = cache_manager.agents_config_cache.get_config(self.type, self.type_version) + if agent_config.get('allowed_models', None): + self.llm_model.choices = agent_config.allowed_models + else: + self.llm_model.choices = agent_config.get('full_model_name', 'mistral.mistral-medium-latest') class EditEveAITaskForm(BaseEditComponentForm): diff --git a/eveai_chat_workers/definitions/response_depth/response_depth_v1_0.py b/eveai_chat_workers/definitions/response_depth/response_depth_v1_0.py index 086c2fa..4b7974c 100644 --- a/eveai_chat_workers/definitions/response_depth/response_depth_v1_0.py +++ b/eveai_chat_workers/definitions/response_depth/response_depth_v1_0.py @@ -1,17 +1,17 @@ RESPONSE_DEPTH = [ { "name": "Concise", - "description": "Short, direct answers. No extra explanation or context.", + "description": "Short, direct answers. No extra explanation or context. Remove unnecessary details. Only a few sentences.", "when_to_use": "Quick queries, urgent requests, or when the user prefers brevity." }, { "name": "Balanced", - "description": "Clear answers with minimal context or next steps. Not too short, not too detailed.", + "description": "Clear answers with minimal context or next steps. Not too short, not too detailed. Max 2 paragraphs.", "when_to_use": "General interactions, FAQs, or when the user needs a mix of speed and clarity." }, { "name": "Detailed", - "description": "Comprehensive answers with background, examples, or step-by-step guidance.", + "description": "Comprehensive answers with background, examples, ... the answer can be detailed with chapters, paragraphs, ...", "when_to_use": "Complex topics, tutorials, or when the user requests in-depth information." } ] diff --git a/eveai_chat_workers/outputs/globals/rag/rag_v1_0.py b/eveai_chat_workers/outputs/globals/rag/rag_v1_0.py index 0f66f66..fc18464 100644 --- a/eveai_chat_workers/outputs/globals/rag/rag_v1_0.py +++ b/eveai_chat_workers/outputs/globals/rag/rag_v1_0.py @@ -4,7 +4,7 @@ from pydantic import BaseModel, Field class RAGOutput(BaseModel): - answer: str = Field(None, description="Answer to the questions asked, in Markdown format.") + answer: str = Field(None, description="Final answer to the question asked, in Markdown format.") insufficient_info: bool = Field(None, description="An indication if there's insufficient information to answer") model_config = {