feat: add action registry with code-based action definitions
Includes 17 actions with: - Allowed roles - Required/optional fields - AI action costs - Backend handlers - Confirmation requirements
This commit is contained in:
parent
e947e248e2
commit
fced248dfc
2 changed files with 373 additions and 0 deletions
372
src/actions/mod.rs
Normal file
372
src/actions/mod.rs
Normal file
|
|
@ -0,0 +1,372 @@
|
|||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct ActionDefinition {
|
||||
pub action_code: String,
|
||||
pub intent: String,
|
||||
pub allowed_roles: Vec<String>,
|
||||
pub requires_login: bool,
|
||||
pub requires_verification: bool,
|
||||
pub requires_confirmation: bool,
|
||||
pub required_fields: Vec<String>,
|
||||
pub optional_fields: Vec<String>,
|
||||
pub feature_code: String,
|
||||
pub ai_action_cost: i32,
|
||||
pub uses_llm: bool,
|
||||
pub backend_handler: String,
|
||||
}
|
||||
|
||||
pub fn get_action_registry() -> Vec<ActionDefinition> {
|
||||
vec![
|
||||
ActionDefinition {
|
||||
action_code: "search_kb".to_string(),
|
||||
intent: "search_kb".to_string(),
|
||||
allowed_roles: vec![
|
||||
"COMPANY".to_string(),
|
||||
"JOB_SEEKER".to_string(),
|
||||
"CUSTOMER".to_string(),
|
||||
"PHOTOGRAPHER".to_string(),
|
||||
"MAKEUP_ARTIST".to_string(),
|
||||
"TUTOR".to_string(),
|
||||
"DEVELOPER".to_string(),
|
||||
"VIDEO_EDITOR".to_string(),
|
||||
"GRAPHIC_DESIGNER".to_string(),
|
||||
"SOCIAL_MEDIA_MANAGER".to_string(),
|
||||
"FITNESS_TRAINER".to_string(),
|
||||
"CATERING_SERVICES".to_string(),
|
||||
"UGC_CONTENT_CREATOR".to_string(),
|
||||
],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec!["query".to_string()],
|
||||
optional_fields: vec![],
|
||||
feature_code: "search_kb".to_string(),
|
||||
ai_action_cost: 0,
|
||||
uses_llm: false,
|
||||
backend_handler: "kb.search".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "generate_job_description".to_string(),
|
||||
intent: "generate_job_description".to_string(),
|
||||
allowed_roles: vec!["COMPANY".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: true,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec!["role_title".to_string()],
|
||||
optional_fields: vec![
|
||||
"seniority".to_string(),
|
||||
"department".to_string(),
|
||||
"employment_type".to_string(),
|
||||
"required_skills".to_string(),
|
||||
"responsibilities".to_string(),
|
||||
],
|
||||
feature_code: "generate_job_description".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "ai.generate_job_description".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "create_job_draft".to_string(),
|
||||
intent: "create_job_draft".to_string(),
|
||||
allowed_roles: vec!["COMPANY".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: true,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec![
|
||||
"job_title".to_string(),
|
||||
"location".to_string(),
|
||||
"experience".to_string(),
|
||||
],
|
||||
optional_fields: vec![
|
||||
"salary".to_string(),
|
||||
"job_type".to_string(),
|
||||
"skills".to_string(),
|
||||
"description".to_string(),
|
||||
],
|
||||
feature_code: "create_job_draft".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "jobs.create_draft".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "fill_company_profile_form".to_string(),
|
||||
intent: "fill_company_profile_form".to_string(),
|
||||
allowed_roles: vec!["COMPANY".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec![],
|
||||
optional_fields: vec![
|
||||
"company_name".to_string(),
|
||||
"industry".to_string(),
|
||||
"location".to_string(),
|
||||
"description".to_string(),
|
||||
],
|
||||
feature_code: "fill_company_profile_form".to_string(),
|
||||
ai_action_cost: 1,
|
||||
uses_llm: true,
|
||||
backend_handler: "company.fill_profile".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "improve_company_profile".to_string(),
|
||||
intent: "improve_company_profile".to_string(),
|
||||
allowed_roles: vec!["COMPANY".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: true,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec!["current_description".to_string()],
|
||||
optional_fields: vec![],
|
||||
feature_code: "improve_company_profile".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "company.improve_profile".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "improve_resume_summary".to_string(),
|
||||
intent: "improve_resume_summary".to_string(),
|
||||
allowed_roles: vec!["JOB_SEEKER".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec!["current_summary".to_string()],
|
||||
optional_fields: vec!["target_role".to_string()],
|
||||
feature_code: "improve_resume_summary".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "job_seeker.improve_resume".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "generate_cover_letter".to_string(),
|
||||
intent: "generate_cover_letter".to_string(),
|
||||
allowed_roles: vec!["JOB_SEEKER".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec!["job_title".to_string()],
|
||||
optional_fields: vec![
|
||||
"company_name".to_string(),
|
||||
"applicant_skills".to_string(),
|
||||
"tone".to_string(),
|
||||
],
|
||||
feature_code: "generate_cover_letter".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "ai.generate_cover_letter".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "improve_jobseeker_profile".to_string(),
|
||||
intent: "improve_jobseeker_profile".to_string(),
|
||||
allowed_roles: vec!["JOB_SEEKER".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec!["current_content".to_string()],
|
||||
optional_fields: vec!["profile_type".to_string()],
|
||||
feature_code: "improve_jobseeker_profile".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "job_seeker.improve_profile".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "create_customer_requirement_draft".to_string(),
|
||||
intent: "create_customer_requirement_draft".to_string(),
|
||||
allowed_roles: vec!["CUSTOMER".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec!["service_type".to_string()],
|
||||
optional_fields: vec![
|
||||
"event_type".to_string(),
|
||||
"location".to_string(),
|
||||
"date".to_string(),
|
||||
"budget".to_string(),
|
||||
"description".to_string(),
|
||||
],
|
||||
feature_code: "create_requirement_draft".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "customers.create_requirement".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "improve_requirement_description".to_string(),
|
||||
intent: "improve_requirement_description".to_string(),
|
||||
allowed_roles: vec!["CUSTOMER".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec!["current_description".to_string()],
|
||||
optional_fields: vec![],
|
||||
feature_code: "improve_requirement".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "customers.improve_requirement".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "improve_professional_profile".to_string(),
|
||||
intent: "improve_professional_profile".to_string(),
|
||||
allowed_roles: vec![
|
||||
"PHOTOGRAPHER".to_string(),
|
||||
"MAKEUP_ARTIST".to_string(),
|
||||
"TUTOR".to_string(),
|
||||
"DEVELOPER".to_string(),
|
||||
"VIDEO_EDITOR".to_string(),
|
||||
"GRAPHIC_DESIGNER".to_string(),
|
||||
"SOCIAL_MEDIA_MANAGER".to_string(),
|
||||
"FITNESS_TRAINER".to_string(),
|
||||
"CATERING_SERVICES".to_string(),
|
||||
"UGC_CONTENT_CREATOR".to_string(),
|
||||
],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: true,
|
||||
required_fields: vec!["current_description".to_string()],
|
||||
optional_fields: vec!["specialization".to_string()],
|
||||
feature_code: "improve_professional_profile".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "professional.improve_profile".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "generate_service_description".to_string(),
|
||||
intent: "generate_service_description".to_string(),
|
||||
allowed_roles: vec![
|
||||
"PHOTOGRAPHER".to_string(),
|
||||
"MAKEUP_ARTIST".to_string(),
|
||||
"TUTOR".to_string(),
|
||||
"DEVELOPER".to_string(),
|
||||
"VIDEO_EDITOR".to_string(),
|
||||
"GRAPHIC_DESIGNER".to_string(),
|
||||
"SOCIAL_MEDIA_MANAGER".to_string(),
|
||||
"FITNESS_TRAINER".to_string(),
|
||||
"CATERING_SERVICES".to_string(),
|
||||
"UGC_CONTENT_CREATOR".to_string(),
|
||||
],
|
||||
requires_login: true,
|
||||
requires_verification: true,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec![
|
||||
"service_type".to_string(),
|
||||
"experience".to_string(),
|
||||
"location".to_string(),
|
||||
],
|
||||
optional_fields: vec![
|
||||
"specialization".to_string(),
|
||||
"pricing".to_string(),
|
||||
"availability".to_string(),
|
||||
],
|
||||
feature_code: "generate_service_description".to_string(),
|
||||
ai_action_cost: 2,
|
||||
uses_llm: true,
|
||||
backend_handler: "professional.generate_service".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "request_professional_contact".to_string(),
|
||||
intent: "request_professional_contact".to_string(),
|
||||
allowed_roles: vec![
|
||||
"PHOTOGRAPHER".to_string(),
|
||||
"MAKEUP_ARTIST".to_string(),
|
||||
"TUTOR".to_string(),
|
||||
"DEVELOPER".to_string(),
|
||||
"VIDEO_EDITOR".to_string(),
|
||||
"GRAPHIC_DESIGNER".to_string(),
|
||||
"SOCIAL_MEDIA_MANAGER".to_string(),
|
||||
"FITNESS_TRAINER".to_string(),
|
||||
"CATERING_SERVICES".to_string(),
|
||||
"UGC_CONTENT_CREATOR".to_string(),
|
||||
],
|
||||
requires_login: true,
|
||||
requires_verification: true,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec!["requirement_id".to_string()],
|
||||
optional_fields: vec![],
|
||||
feature_code: "request_contact".to_string(),
|
||||
ai_action_cost: 0,
|
||||
uses_llm: false,
|
||||
backend_handler: "leads.request_contact".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "support_ticket_summary".to_string(),
|
||||
intent: "support_ticket_summary".to_string(),
|
||||
allowed_roles: vec!["ADMIN".to_string(), "EMPLOYEE".to_string()],
|
||||
requires_login: true,
|
||||
requires_verification: true,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec!["ticket_id".to_string()],
|
||||
optional_fields: vec![],
|
||||
feature_code: "support_ticket_summary".to_string(),
|
||||
ai_action_cost: 1,
|
||||
uses_llm: true,
|
||||
backend_handler: "support.summarize_ticket".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "explain_plan_limits".to_string(),
|
||||
intent: "explain_plan_limits".to_string(),
|
||||
allowed_roles: vec![
|
||||
"COMPANY".to_string(),
|
||||
"JOB_SEEKER".to_string(),
|
||||
"CUSTOMER".to_string(),
|
||||
"PHOTOGRAPHER".to_string(),
|
||||
"MAKEUP_ARTIST".to_string(),
|
||||
"TUTOR".to_string(),
|
||||
"DEVELOPER".to_string(),
|
||||
"VIDEO_EDITOR".to_string(),
|
||||
"GRAPHIC_DESIGNER".to_string(),
|
||||
"SOCIAL_MEDIA_MANAGER".to_string(),
|
||||
"FITNESS_TRAINER".to_string(),
|
||||
"CATERING_SERVICES".to_string(),
|
||||
"UGC_CONTENT_CREATOR".to_string(),
|
||||
],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec![],
|
||||
optional_fields: vec![],
|
||||
feature_code: "explain_plan_limits".to_string(),
|
||||
ai_action_cost: 0,
|
||||
uses_llm: false,
|
||||
backend_handler: "ai.explain_plan".to_string(),
|
||||
},
|
||||
ActionDefinition {
|
||||
action_code: "check_ai_pack_balance".to_string(),
|
||||
intent: "check_ai_pack_balance".to_string(),
|
||||
allowed_roles: vec![
|
||||
"COMPANY".to_string(),
|
||||
"JOB_SEEKER".to_string(),
|
||||
"CUSTOMER".to_string(),
|
||||
"PHOTOGRAPHER".to_string(),
|
||||
"MAKEUP_ARTIST".to_string(),
|
||||
"TUTOR".to_string(),
|
||||
"DEVELOPER".to_string(),
|
||||
"VIDEO_EDITOR".to_string(),
|
||||
"GRAPHIC_DESIGNER".to_string(),
|
||||
"SOCIAL_MEDIA_MANAGER".to_string(),
|
||||
"FITNESS_TRAINER".to_string(),
|
||||
"CATERING_SERVICES".to_string(),
|
||||
"UGC_CONTENT_CREATOR".to_string(),
|
||||
],
|
||||
requires_login: true,
|
||||
requires_verification: false,
|
||||
requires_confirmation: false,
|
||||
required_fields: vec![],
|
||||
optional_fields: vec![],
|
||||
feature_code: "check_ai_balance".to_string(),
|
||||
ai_action_cost: 0,
|
||||
uses_llm: false,
|
||||
backend_handler: "ai.check_balance".to_string(),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
pub fn get_action(action_code: &str) -> Option<ActionDefinition> {
|
||||
get_action_registry()
|
||||
.into_iter()
|
||||
.find(|a| a.action_code == action_code)
|
||||
}
|
||||
|
||||
pub fn get_actions_for_role(role: &str) -> Vec<ActionDefinition> {
|
||||
get_action_registry()
|
||||
.into_iter()
|
||||
.filter(|a| a.allowed_roles.contains(&role.to_string()))
|
||||
.collect()
|
||||
}
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
mod actions;
|
||||
mod chat;
|
||||
mod config;
|
||||
mod cover_letter;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue