File size: 2,512 Bytes
c045254
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""Pydantic schemas for knowledge graph endpoints."""

from pydantic import BaseModel, ConfigDict, Field


class LONode(BaseModel):
    """A learning outcome node in the knowledge graph."""
    
    lo_id: str = Field(..., description="Learning outcome ID")
    title: str = Field(..., description="Learning outcome title")
    grade: int = Field(..., ge=6, le=8, description="Grade level")
    subject: str = Field(..., description="Subject name")
    chapter: str = Field(..., description="Chapter name")
    difficulty: str = Field(..., description="Difficulty level")
    bloom_level: str = Field(..., description="Bloom taxonomy level")


class LORelationship(BaseModel):
    """A relationship between learning outcomes."""
    
    from_lo_id: str = Field(..., description="Source learning outcome ID")
    to_lo_id: str = Field(..., description="Target learning outcome ID")
    relationship_type: str = Field(..., description="Type of relationship")
    strength: float = Field(..., ge=0.0, le=1.0, description="Relationship strength")


class KnowledgeGraphResponse(BaseModel):
    """Response for knowledge graph queries."""
    
    model_config = ConfigDict(extra="forbid")
    
    lo_id: str = Field(..., description="Queried learning outcome ID")
    source: str = Field(default="knowledge_graph", description="Data source")
    timestamp: str = Field(..., description="Response timestamp")
    
    # Core LO information
    lo_info: LONode = Field(..., description="Learning outcome details")
    
    # Graph relationships
    prerequisites: list[LONode] = Field(default_factory=list, description="Prerequisite learning outcomes")
    successors: list[LONode] = Field(default_factory=list, description="Dependent learning outcomes")
    
    # Metadata
    prerequisite_count: int = Field(..., ge=0, description="Number of prerequisites")
    successor_count: int = Field(..., ge=0, description="Number of successors")
    depth_from_root: int = Field(..., ge=0, description="Depth in dependency chain")


class KnowledgeGraphRequest(BaseModel):
    """Request for knowledge graph queries."""
    
    model_config = ConfigDict(extra="forbid")
    
    lo_id: str = Field(..., description="Learning outcome ID to query")
    include_prerequisites: bool = Field(default=True, description="Include prerequisite LOs")
    include_successors: bool = Field(default=True, description="Include successor LOs")
    max_depth: int = Field(default=2, ge=1, le=5, description="Maximum depth to traverse")