| from enum import Enum |
| from typing import List, Optional, Dict, Any |
| from pydantic import BaseModel, Field |
| from openenv.core.env_server.types import Action, Observation |
|
|
| class ActionType(str, Enum): |
| enrich_lead = "enrich_lead" |
| check_crm = "check_crm" |
| update_lead_score = "update_lead_score" |
| route_to_rep = "route_to_rep" |
| merge_with_account = "merge_with_account" |
| flag_reengagement = "flag_reengagement" |
| disqualify = "disqualify" |
| add_to_nurture = "add_to_nurture" |
| request_more_info = "request_more_info" |
| escalate_to_manager = "escalate_to_manager" |
|
|
| class RevOpsAction(Action): |
| action_type: ActionType |
| score: Optional[int] = Field(None, description="Score to assign (0-100) used with update_lead_score") |
| rep_id: Optional[str] = Field(None, description="ID of the rep to route to") |
| account_id: Optional[str] = Field(None, description="ID of the account to merge with") |
| opportunity_id: Optional[str] = Field(None, description="ID of the related opportunity") |
| disqualification_reason: Optional[str] = Field(None, description="Reason for disqualification") |
| note: Optional[str] = Field(None, description="Additional notes or context") |
|
|
| class LeadData(BaseModel): |
| id: str |
| name: Optional[str] = None |
| title: Optional[str] = None |
| email: Optional[str] = None |
| company: Optional[str] = None |
| message: Optional[str] = None |
| source: Optional[str] = None |
| score: Optional[int] = None |
|
|
| class EnrichmentData(BaseModel): |
| enriched: bool = False |
| company_size: Optional[str] = None |
| revenue: Optional[str] = None |
| industry: Optional[str] = None |
| region: Optional[str] = None |
| tier: Optional[str] = None |
|
|
| class OpportunityHistory(BaseModel): |
| opportunity_id: str |
| status: str |
| amount: int |
| assigned_rep_id: str |
| closed_date: Optional[str] = None |
|
|
| class CRMState(BaseModel): |
| checked: bool = False |
| existing_accounts: List[Dict[str, Any]] = [] |
| opportunities: List[OpportunityHistory] = [] |
| |
| class Rep(BaseModel): |
| rep_id: str |
| name: str |
| segment: str |
| territory: str |
| capacity: str |
|
|
| class RevOpsObservation(Observation): |
| task_id: str = "task_easy" |
| lead: LeadData = Field(default_factory=lambda: LeadData(id="dummy")) |
| enrichment: EnrichmentData = Field(default_factory=EnrichmentData) |
| crm: CRMState = Field(default_factory=CRMState) |
| reps: List[Rep] = Field(default_factory=list) |
| icp_criteria: str = "" |
| sla_time_remaining_minutes: int = 60 |
| last_action_feedback: Optional[str] = None |
|
|
| class RevOpsReward(BaseModel): |
| value: float |
| message: str |
|
|
| class RevOpsState(BaseModel): |
| observation: RevOpsObservation |
| action_history: List[RevOpsAction] |
| accumulated_reward: float |
| is_done: bool |
| grader_score: Optional[float] = None |
|
|