Nora / app /models.py
GitHub Action
Deploy clean version of Nora
59bd45e
"""Data models for Voice Text Processor.
This module defines all Pydantic data models used throughout the application
for data validation, serialization, and API request/response handling.
Requirements: 4.1, 4.2, 4.3, 5.1, 5.2, 5.3, 6.1, 6.2, 6.3, 6.4
"""
from typing import Optional, List, Literal
from pydantic import BaseModel, Field
class MoodData(BaseModel):
"""Mood data structure.
Represents the emotional state extracted from user input.
Attributes:
type: The type/name of the emotion (e.g., "开心", "焦虑")
intensity: Emotion intensity on a scale of 1-10
keywords: List of keywords associated with the emotion
Requirements: 4.1, 4.2, 4.3
"""
type: Optional[str] = None
intensity: Optional[int] = Field(None, ge=1, le=10)
keywords: List[str] = Field(default_factory=list)
class InspirationData(BaseModel):
"""Inspiration data structure.
Represents an idea or inspiration extracted from user input.
Attributes:
core_idea: The core idea/concept (max 20 characters)
tags: List of tags for categorization (max 5 tags)
category: Category of the inspiration
Requirements: 5.1, 5.2, 5.3
"""
core_idea: str = Field(..., max_length=20)
tags: List[str] = Field(default_factory=list, max_length=5)
category: Literal["工作", "生活", "学习", "创意"]
class TodoData(BaseModel):
"""Todo item data structure.
Represents a task/todo item extracted from user input.
Attributes:
task: Description of the task
time: Time information (preserved as original expression)
location: Location information
status: Task status (defaults to "pending")
Requirements: 6.1, 6.2, 6.3, 6.4
"""
task: str
time: Optional[str] = None
location: Optional[str] = None
status: str = "pending"
class ParsedData(BaseModel):
"""Parsed data structure.
Contains all structured data extracted from semantic parsing.
Attributes:
mood: Extracted mood data (optional)
inspirations: List of extracted inspirations
todos: List of extracted todo items
"""
mood: Optional[MoodData] = None
inspirations: List[InspirationData] = Field(default_factory=list)
todos: List[TodoData] = Field(default_factory=list)
class RecordData(BaseModel):
"""Complete record data structure.
Represents a complete user input record with all metadata and parsed data.
Attributes:
record_id: Unique identifier for the record
timestamp: ISO 8601 timestamp of when the record was created
input_type: Type of input (audio or text)
original_text: The original or transcribed text
parsed_data: Structured data extracted from the text
"""
record_id: str
timestamp: str
input_type: Literal["audio", "text"]
original_text: str
parsed_data: ParsedData
class ProcessResponse(BaseModel):
"""API response model for /api/process endpoint.
Represents the response returned to clients after processing input.
Attributes:
record_id: Unique identifier for the processed record
timestamp: ISO 8601 timestamp of when processing completed
mood: Extracted mood data (optional)
inspirations: List of extracted inspirations
todos: List of extracted todo items
error: Error message if processing failed (optional)
"""
record_id: str
timestamp: str
mood: Optional[MoodData] = None
inspirations: List[InspirationData] = Field(default_factory=list)
todos: List[TodoData] = Field(default_factory=list)
error: Optional[str] = None