112 lines
2.3 KiB
Python
112 lines
2.3 KiB
Python
from datetime import datetime
|
|
from typing import Optional
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
# --- Session Rating Schemas ---
|
|
|
|
class SessionRatingCreate(BaseModel):
|
|
rating: int = Field(..., ge=1, le=5)
|
|
comment: Optional[str] = Field(None, max_length=500)
|
|
|
|
|
|
class SessionRatingResponse(BaseModel):
|
|
id: str
|
|
session_id: str
|
|
rating: int
|
|
comment: Optional[str]
|
|
created_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class FlowRatingItem(BaseModel):
|
|
"""Anonymous feedback item — no user_name for privacy."""
|
|
rating: int
|
|
comment: Optional[str]
|
|
created_at: datetime
|
|
|
|
|
|
# --- Step Feedback Schema ---
|
|
|
|
class StepFeedbackCreate(BaseModel):
|
|
session_id: str
|
|
was_helpful: bool
|
|
|
|
|
|
# --- Analytics Response Schemas ---
|
|
|
|
class OutcomeBreakdown(BaseModel):
|
|
resolved: int = 0
|
|
escalated: int = 0
|
|
workaround: int = 0
|
|
unresolved: int = 0
|
|
|
|
|
|
class AnalyticsSummary(BaseModel):
|
|
total_sessions: int
|
|
completed_sessions: int
|
|
completion_rate: float
|
|
median_duration_minutes: float
|
|
active_engineers: int = 0
|
|
outcome_breakdown: OutcomeBreakdown
|
|
|
|
|
|
class TimeSeriesPoint(BaseModel):
|
|
date: str
|
|
sessions: int = 0
|
|
resolved: int = 0
|
|
escalated: int = 0
|
|
workaround: int = 0
|
|
unresolved: int = 0
|
|
|
|
|
|
class TopFlow(BaseModel):
|
|
tree_id: str
|
|
name: str
|
|
sessions: int
|
|
completion_rate: float
|
|
median_duration_minutes: float
|
|
avg_csat: Optional[float] = None
|
|
|
|
|
|
class TopEngineer(BaseModel):
|
|
user_id: str
|
|
name: str
|
|
sessions: int
|
|
completion_rate: float
|
|
median_duration_minutes: float
|
|
|
|
|
|
class TeamAnalyticsResponse(BaseModel):
|
|
summary: AnalyticsSummary
|
|
time_series: list[TimeSeriesPoint]
|
|
top_flows: list[TopFlow]
|
|
top_engineers: list[TopEngineer]
|
|
|
|
|
|
class PersonalAnalyticsResponse(BaseModel):
|
|
summary: AnalyticsSummary
|
|
time_series: list[TimeSeriesPoint]
|
|
top_flows: list[TopFlow]
|
|
|
|
|
|
class StepFeedbackSummary(BaseModel):
|
|
node_id: str
|
|
node_title: str
|
|
helpful_yes: int
|
|
helpful_no: int
|
|
helpful_rate: float
|
|
visit_count: int = 0
|
|
dropoff_count: int = 0
|
|
dropoff_rate: float = 0.0
|
|
|
|
|
|
class FlowAnalyticsResponse(BaseModel):
|
|
summary: AnalyticsSummary
|
|
avg_csat: Optional[float]
|
|
total_ratings: int
|
|
time_series: list[TimeSeriesPoint]
|
|
step_feedback: list[StepFeedbackSummary]
|
|
recent_comments: list[FlowRatingItem]
|