from typing import List, Optional from pydantic import BaseModel, Field, conint, confloat class PotentialValue(BaseModel): """A potential value within an exploration axis""" value: str = Field(..., description="The specific value within the axis") relevance_score: confloat(ge=0, le=100) = Field(..., description="Relevance score from 0-100") contextual_rationale: str = Field(..., description="Explanation of the value's relevance") class InnovativeValue(BaseModel): """An innovative value within an emergent axis""" value: str = Field(..., description="The innovative value within the emergent axis") innovation_score: confloat(ge=0, le=100) = Field(..., description="Innovation score from 0-100") discovery_potential: str = Field(..., description="Description of potential discoveries") class StandardAxis(BaseModel): """A standard exploration axis""" name: str = Field(..., description="Name of the standard axis") current_values: List[str] = Field(default_factory=list, description="Currently selected values") potential_values: List[PotentialValue] = Field(..., description="Potential values for exploration") axis_constraints: List[str] = Field(..., description="Constraints for this axis") class EmergentAxis(BaseModel): """An emergent exploration axis""" name: str = Field(..., description="Name of the emergent axis") parent_axis: str = Field(..., description="Parent axis from which this emerged") innovative_values: List[InnovativeValue] = Field(..., description="Innovative values for exploration") class ZoomTrajectory(BaseModel): """A trajectory for zooming into specific aspects""" target_axis: str = Field(..., description="Target axis for zooming") zoom_value: str = Field(..., description="Specific value to zoom into") unlocked_dimensions: List[str] = Field(..., description="New dimensions unlocked by zooming") depth_increment: conint(ge=1, le=3) = Field(..., description="Depth increase (1-3)") class DezoomPathway(BaseModel): """A pathway for zooming out to broader context""" removal_tuple: dict = Field(..., description="Axis-value pair to remove") contextual_expansion: str = Field(..., description="Description of broader context") new_possibility_vectors: List[str] = Field(..., description="New possibilities unlocked") class ExplorationSummary(BaseModel): """Summary of the current exploration state""" current_context: str = Field(..., description="Current exploration context") complexity_level: conint(ge=0, le=10) = Field(..., description="Complexity level (0-10)") class KnowledgeAxes(BaseModel): """Collection of exploration axes""" standard_axes: List[StandardAxis] = Field(..., description="Standard exploration axes") emergent_axes: List[EmergentAxis] = Field(default_factory=list, description="Emergent exploration axes") class NavigationStrategies(BaseModel): """Available navigation strategies""" zoom_trajectories: List[ZoomTrajectory] = Field(..., description="Paths for deeper exploration") dezoom_pathways: List[DezoomPathway] = Field(..., description="Paths for broader exploration") class MetaInsights(BaseModel): """Meta-level insights about the exploration""" exploration_efficiency: confloat(ge=0, le=100) = Field(..., description="Overall efficiency score") knowledge_gap_indicators: List[str] = Field(..., description="Identified knowledge gaps") recommended_next_steps: List[str] = Field(..., description="Recommended next steps") class ExplorationResponse(BaseModel): """Complete exploration response structure""" exploration_summary: ExplorationSummary = Field(..., description="Summary of exploration state") knowledge_axes: KnowledgeAxes = Field(..., description="Exploration axes") navigation_strategies: NavigationStrategies = Field(..., description="Navigation options") meta_insights: MetaInsights = Field(..., description="Meta-level insights")