wangzhibo
2026-08-30 c8515170fd399b4d2dfaebb59128d4674e58915e
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
59
60
61
from typing import Any, Literal
 
from pydantic import BaseModel, Field
 
 
class SceneAnalyzeRequest(BaseModel):
    timestamp: int
    audio_blob: str = Field(description="Base64 encoded audio or placeholder")
    device_id: str
    context_hints: dict[str, Any] = Field(default_factory=dict)
 
 
class SceneAnalyzeResponse(BaseModel):
    scene: str
    confidence: float
    greeting_strategy: Literal["contextual", "generic"]
    suggested_intent: str
 
 
class DialogueStreamPayload(BaseModel):
    dialogue_id: str
    text: str
    audio_url: str | None = None
    intent_type: str
    difficulty_level: str
 
 
class MqttHeader(BaseModel):
    version: str | None = None
    device_id: str
    req_id: str | None = None
    timestamp: int
    ttl: int | None = None
 
 
class MqttCommand(BaseModel):
    header: MqttHeader
    action: str
    payload: dict[str, Any] = Field(default_factory=dict)
 
 
class MqttReport(BaseModel):
    header: MqttHeader
    msg_type: Literal["state", "event", "log", "ack", "progress"]
    payload: dict[str, Any] = Field(default_factory=dict)
 
 
class DeviceState(BaseModel):
    device_id: str
    cpu: float | None = None
    mem: float | None = None
    battery: float | None = None
    net: str | None = None
    mode: str | None = None
    last_seen: int
 
 
class InitTaskRequest(BaseModel):
    device_id: str
    course_id: str | None = None
    force: bool = False