FreakForever
added difficulty levels
cbc259d
Raw
History Blame
2.49 kB
"""
Data models for the Cashflow Multi-Agent RL Environment.
Models:
- Invoice: A bill from a vendor
- Receivable: Expected payment from a customer
- VendorProfile: Vendor negotiation traits
- NegotiationResult: Outcome of a negotiate action
- CashflowmanagerAction: CFO's decision (pay/defer/partial/negotiate/credit)
- CashflowmanagerObservation: What the CFO sees after each step
- Transition: Full (state, action, reward, reasoning) tuple for training
"""
from pydantic import BaseModel, Field
from typing import List, Dict, Any, Optional
from openenv.core.env_server.types import Action, Observation
class Invoice(BaseModel):
id: str
vendor_id: str
amount: float
due_in: int
late_fee: float
min_payment: float
interest: float
status: str = "unpaid" # unpaid, partial, negotiating, deferred, paid
class Receivable(BaseModel):
id: str
customer_id: str
amount: float
expected_in: int
probability: float
class VendorProfile(BaseModel):
id: str
name: str
trust_score: float # 0.0 to 1.0
negotiation_flexibility: float # 0.0 to 1.0
class NegotiationResult(BaseModel):
"""Outcome from the Vendor Agent when CFO chooses 'negotiate'."""
accepted: bool = False
success_probability: float = 0.0
vendor_message: str = ""
is_predatory: bool = False
extension_days: int = 0
class CashflowmanagerAction(Action):
type: str = Field(..., description="pay, defer, partial, negotiate, credit")
invoice_id: Optional[str] = None
amount: Optional[float] = 0.0
memo: Optional[str] = None
class CashflowmanagerObservation(Observation):
day: int
cash: float
credit_used: float
credit_limit: float = 5000.0
invoices: List[Invoice]
receivables: List[Receivable]
vendor_profiles: Dict[str, Any] = Field(default_factory=dict)
advisor_memos: Dict[str, Any] = Field(default_factory=dict)
advisor_messages: Dict[str, str] = Field(default_factory=dict)
negotiation_result: Optional[NegotiationResult] = None
world_events: List[str] = Field(default_factory=list)
reward: float = 0.0
done: bool = False
metadata: Dict[str, Any] = Field(default_factory=dict)
class Transition(BaseModel):
"""Full training transition for RL/SFT data collection."""
day: int
state_summary: str
advisor_memos: Dict[str, Any]
action: Dict[str, Any]
reward: float
reasoning: str = ""
next_state_summary: str = ""