Merge branch 'feature/Add_User_Actions_to_Specialist_Interaction' into develop
This commit is contained in:
@@ -122,6 +122,8 @@ class EveAIAgent(db.Model):
|
|||||||
role = db.Column(db.Text, nullable=True)
|
role = db.Column(db.Text, nullable=True)
|
||||||
goal = db.Column(db.Text, nullable=True)
|
goal = db.Column(db.Text, nullable=True)
|
||||||
backstory = 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)
|
tuning = db.Column(db.Boolean, nullable=True, default=False)
|
||||||
configuration = db.Column(JSONB, nullable=True)
|
configuration = db.Column(JSONB, nullable=True)
|
||||||
arguments = db.Column(JSONB, nullable=True)
|
arguments = db.Column(JSONB, nullable=True)
|
||||||
|
|||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -7,19 +7,20 @@ goal: >
|
|||||||
of the current conversation.
|
of the current conversation.
|
||||||
{custom_goal}
|
{custom_goal}
|
||||||
backstory: >
|
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 the primary contact for {tenant_name}, and have been it's spokesperson for a very long time. You are used to
|
||||||
You are a very good communicator.
|
addressing customers, prospects, press, ...
|
||||||
We want you to answer using the following Tone of Voice: {tone_of_voice} - {tone_of_voice_context}.
|
You are known by {name}, and can be addressed by this name, or 'you'.
|
||||||
And we want you to answer using the following Language Level: {language_level} - {language_level_context}.
|
You are a very good communicator, that knows how to adapt his style to the public your interacting with.
|
||||||
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 always stay correct and polite, whatever happens. And you ensure no discriminating language is used.
|
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
|
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
|
language the context provided to you is in. You are participating in a conversation, not writing e.g. an email or
|
||||||
include a salutation or closing greeting in your answer.
|
essay. Do not include a salutation or closing greeting in your answer.
|
||||||
{custom_backstory}
|
{custom_backstory}
|
||||||
full_model_name: "mistral.mistral-medium-latest"
|
full_model_name: "mistral.mistral-medium-latest"
|
||||||
|
allowed_models:
|
||||||
|
- "mistral.mistral-small-latest"
|
||||||
|
- "mistral.mistral-medium-latest"
|
||||||
|
- "mistral.magistral-medium-latest"
|
||||||
temperature: 0.4
|
temperature: 0.4
|
||||||
metadata:
|
metadata:
|
||||||
author: "Josako"
|
author: "Josako"
|
||||||
|
|||||||
@@ -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"
|
|
||||||
24
config/agents/globals/RAG_PROOFREADER_AGENT/1.0.0.yaml
Normal file
24
config/agents/globals/RAG_PROOFREADER_AGENT/1.0.0.yaml
Normal file
@@ -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"
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -28,16 +28,6 @@ fields:
|
|||||||
type: "str"
|
type: "str"
|
||||||
description: "Job Title"
|
description: "Job Title"
|
||||||
required: false
|
required: false
|
||||||
address:
|
|
||||||
name: "Address"
|
|
||||||
type: "str"
|
|
||||||
description: "Your Address"
|
|
||||||
required: false
|
|
||||||
zip:
|
|
||||||
name: "Postal Code"
|
|
||||||
type: "str"
|
|
||||||
description: "Postal Code"
|
|
||||||
required: false
|
|
||||||
city:
|
city:
|
||||||
name: "City"
|
name: "City"
|
||||||
type: "str"
|
type: "str"
|
||||||
|
|||||||
@@ -67,9 +67,13 @@ results:
|
|||||||
agents:
|
agents:
|
||||||
- type: "RAG_AGENT"
|
- type: "RAG_AGENT"
|
||||||
version: "1.2"
|
version: "1.2"
|
||||||
|
- type: "RAG_PROOFREADER_AGENT"
|
||||||
|
version: "1.0"
|
||||||
tasks:
|
tasks:
|
||||||
- type: "RAG_TASK"
|
- type: "RAG_TASK"
|
||||||
version: "1.1"
|
version: "1.1"
|
||||||
|
- type: "RAG_PROOFREADING_TASK"
|
||||||
|
version: "1.0"
|
||||||
metadata:
|
metadata:
|
||||||
author: "Josako"
|
author: "Josako"
|
||||||
date_added: "2025-01-08"
|
date_added: "2025-01-08"
|
||||||
|
|||||||
@@ -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"
|
|
||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 387 KiB |
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
26
config/tasks/globals/RAG_PROOFREADING_TASK/1.0.0.yaml
Normal file
26
config/tasks/globals/RAG_PROOFREADING_TASK/1.0.0.yaml
Normal file
@@ -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"
|
||||||
@@ -7,19 +7,9 @@ task_description: >
|
|||||||
{question}
|
{question}
|
||||||
£££
|
£££
|
||||||
|
|
||||||
Base your answer on the following context (in between triple $):
|
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.
|
||||||
{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.
|
|
||||||
|
|
||||||
Best Practices are:
|
Best Practices are:
|
||||||
|
|
||||||
@@ -28,10 +18,28 @@ task_description: >
|
|||||||
- Try not to repeat your historic answers, unless absolutely necessary.
|
- Try not to repeat your historic answers, unless absolutely necessary.
|
||||||
- Always be friendly and helpful for the end user.
|
- 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}
|
{custom_description}
|
||||||
|
|
||||||
Use the following {language} in your communication.
|
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
|
If the question cannot be answered using the given context, answer "I have insufficient information to answer this
|
||||||
question." and give the appropriate indication.
|
question." and give the appropriate indication.
|
||||||
|
|
||||||
|
Context:
|
||||||
|
$$$
|
||||||
|
{context}
|
||||||
|
$$$
|
||||||
|
|
||||||
|
History:
|
||||||
|
€€€
|
||||||
|
{history}
|
||||||
|
€€€
|
||||||
expected_output: >
|
expected_output: >
|
||||||
Your answer.
|
Your answer.
|
||||||
metadata:
|
metadata:
|
||||||
|
|||||||
@@ -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"
|
|
||||||
@@ -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"
|
|
||||||
@@ -1,32 +1,12 @@
|
|||||||
# Agent Types
|
# Agent Types
|
||||||
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": {
|
"RAG_AGENT": {
|
||||||
"name": "Rag Agent",
|
"name": "Rag Agent",
|
||||||
"description": "An Agent that does RAG based on a user's question, RAG content & history",
|
"description": "An Agent that does RAG based on a user's question, RAG content & history",
|
||||||
},
|
},
|
||||||
"RAG_COMMUNICATION_AGENT": {
|
"RAG_PROOFREADER_AGENT": {
|
||||||
"name": "Rag Communication Agent",
|
"name": "Rag Proofreader Agent",
|
||||||
"description": "An Agent that consolidates both answers and questions in a consistent reply",
|
"description": "An Agent that checks the quality of RAG answers and adapts when required",
|
||||||
},
|
|
||||||
"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",
|
|
||||||
},
|
},
|
||||||
"TRAICIE_HR_BP_AGENT": {
|
"TRAICIE_HR_BP_AGENT": {
|
||||||
"name": "Traicie HR BP Agent",
|
"name": "Traicie HR BP Agent",
|
||||||
|
|||||||
@@ -9,10 +9,6 @@ SPECIALIST_TYPES = {
|
|||||||
"description": "Q&A through Partner RAG Specialist (for documentation purposes)",
|
"description": "Q&A through Partner RAG Specialist (for documentation purposes)",
|
||||||
"partner": "evie_partner"
|
"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": {
|
"TRAICIE_ROLE_DEFINITION_SPECIALIST": {
|
||||||
"name": "Traicie Role Definition Specialist",
|
"name": "Traicie Role Definition Specialist",
|
||||||
"description": "Assistant Defining Competencies and KO Criteria",
|
"description": "Assistant Defining Competencies and KO Criteria",
|
||||||
|
|||||||
@@ -1,36 +1,16 @@
|
|||||||
# Agent Types
|
# Agent Types
|
||||||
TASK_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": {
|
"RAG_TASK": {
|
||||||
"name": "RAG Task",
|
"name": "RAG Task",
|
||||||
"description": "A Task that gives RAG-based answers",
|
"description": "A Task that gives RAG-based answers",
|
||||||
},
|
},
|
||||||
"SPIN_DETECT_TASK": {
|
"ADVANCED_RAG_TASK": {
|
||||||
"name": "SPIN Information Detection",
|
"name": "Advanced RAG Task",
|
||||||
"description": "A Task that performs SPIN Information Detection",
|
"description": "A Task that gives RAG-based answers taking into account previous questions, tone of voice and language level",
|
||||||
},
|
},
|
||||||
"SPIN_QUESTIONS_TASK": {
|
"RAG_PROOFREADING_TASK": {
|
||||||
"name": "SPIN Question Identification",
|
"name": "Rag Proofreading Task",
|
||||||
"description": "A Task that identifies questions to complete the SPIN context in a conversation",
|
"description": "A Task that performs RAG Proofreading",
|
||||||
},
|
|
||||||
"RAG_CONSOLIDATION_TASK": {
|
|
||||||
"name": "RAG Consolidation",
|
|
||||||
"description": "A Task to consolidate questions and answers",
|
|
||||||
},
|
},
|
||||||
"TRAICIE_GET_COMPETENCIES_TASK": {
|
"TRAICIE_GET_COMPETENCIES_TASK": {
|
||||||
"name": "Traicie Get Competencies",
|
"name": "Traicie Get Competencies",
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -2,8 +2,8 @@ from flask import session
|
|||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
from wtforms import (StringField, BooleanField, SelectField, TextAreaField)
|
from wtforms import (StringField, BooleanField, SelectField, TextAreaField)
|
||||||
from wtforms.fields.datetime import DateField
|
from wtforms.fields.datetime import DateField
|
||||||
from wtforms.fields.numeric import IntegerField
|
from wtforms.fields.numeric import IntegerField, FloatField
|
||||||
from wtforms.validators import DataRequired, Length, Optional
|
from wtforms.validators import DataRequired, Length, Optional, NumberRange
|
||||||
|
|
||||||
from wtforms_sqlalchemy.fields import QuerySelectMultipleField
|
from wtforms_sqlalchemy.fields import QuerySelectMultipleField
|
||||||
|
|
||||||
@@ -91,6 +91,16 @@ class EditEveAIAgentForm(BaseEditComponentForm):
|
|||||||
role = TextAreaField('Role', validators=[Optional()])
|
role = TextAreaField('Role', validators=[Optional()])
|
||||||
goal = TextAreaField('Goal', validators=[Optional()])
|
goal = TextAreaField('Goal', validators=[Optional()])
|
||||||
backstory = TextAreaField('Backstory', 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):
|
class EditEveAITaskForm(BaseEditComponentForm):
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
RESPONSE_DEPTH = [
|
RESPONSE_DEPTH = [
|
||||||
{
|
{
|
||||||
"name": "Concise",
|
"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."
|
"when_to_use": "Quick queries, urgent requests, or when the user prefers brevity."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Balanced",
|
"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."
|
"when_to_use": "General interactions, FAQs, or when the user needs a mix of speed and clarity."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Detailed",
|
"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."
|
"when_to_use": "Complex topics, tutorials, or when the user requests in-depth information."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from pydantic import BaseModel, Field
|
|||||||
|
|
||||||
|
|
||||||
class RAGOutput(BaseModel):
|
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")
|
insufficient_info: bool = Field(None, description="An indication if there's insufficient information to answer")
|
||||||
|
|
||||||
model_config = {
|
model_config = {
|
||||||
|
|||||||
Reference in New Issue
Block a user