File size: 4,894 Bytes
67f8819
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
"""
Chat API Pydantic schemas for request/response validation.

Per @specs/001-chatbot-mcp/contracts/openapi.yaml
"""
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from datetime import datetime
from uuid import UUID


# =============================================================================
# Request Schemas
# =============================================================================

class ChatRequest(BaseModel):
    """
    Request schema for chat endpoint.

    Per @specs/001-chatbot-mcp/contracts/openapi.yaml
    """
    conversation_id: Optional[UUID] = Field(
        default=None,
        description="Optional conversation ID to continue existing chat. If not provided, a new conversation is created."
    )
    message: str = Field(
        ...,
        min_length=1,
        max_length=5000,
        description="User's message content"
    )

    class Config:
        json_schema_extra = {
            "example": {
                "conversation_id": None,
                "message": "Add a task to buy groceries"
            }
        }


# =============================================================================
# Response Schemas
# =============================================================================

class Message(BaseModel):
    """
    Message schema for chat responses.

    Represents a single message in the conversation.
    Per @specs/001-chatbot-mcp/data-model.md
    """
    id: UUID = Field(..., description="Unique message identifier")
    role: str = Field(..., description="Message role: 'user' or 'assistant'")
    content: str = Field(..., description="Message content")
    created_at: datetime = Field(..., description="Timestamp when message was created")

    class Config:
        json_schema_extra = {
            "example": {
                "id": "123e4567-e89b-12d3-a456-426614174000",
                "role": "assistant",
                "content": "I've added a task 'Buy groceries' to your list.",
                "created_at": "2026-01-11T22:00:00Z"
            }
        }


class TaskSummary(BaseModel):
    """
    Task summary schema for chat responses.

    Simplified task representation returned in chat responses.
    Per @specs/001-chatbot-mcp/contracts/openapi.yaml
    """
    id: UUID = Field(..., description="Task ID")
    title: str = Field(..., description="Task title")
    description: Optional[str] = Field(None, description="Task description")
    completed: bool = Field(..., description="Task completion status")

    class Config:
        json_schema_extra = {
            "example": {
                "id": "123e4567-e89b-12d3-a456-426614174000",
                "title": "Buy groceries",
                "description": None,
                "completed": False
            }
        }


class ChatResponse(BaseModel):
    """
    Response schema for chat endpoint.

    Per @specs/001-chatbot-mcp/contracts/openapi.yaml
    """
    conversation_id: UUID = Field(..., description="Conversation ID (new or existing)")
    message: Message = Field(..., description="Assistant's response message")
    tasks: Optional[List[TaskSummary]] = Field(
        default=None,
        description="List of tasks affected by the chat (optional, for context)"
    )

    class Config:
        json_schema_extra = {
            "example": {
                "conversation_id": "123e4567-e89b-12d3-a456-426614174000",
                "message": {
                    "id": "123e4567-e89b-12d3-a456-426614174001",
                    "role": "assistant",
                    "content": "I've added a task 'Buy groceries' to your list.",
                    "created_at": "2026-01-11T22:00:00Z"
                },
                "tasks": [
                    {
                        "id": "123e4567-e89b-12d3-a456-426614174002",
                        "title": "Buy groceries",
                        "description": None,
                        "completed": False
                    }
                ]
            }
        }


# =============================================================================
# Error Schemas
# =============================================================================

class ChatError(BaseModel):
    """
    Error response schema for chat endpoint.

    Returned when chat processing fails.
    """
    error: str = Field(..., description="Error message")
    detail: Optional[str] = Field(None, description="Detailed error information")
    conversation_id: Optional[UUID] = Field(
        None,
        description="Conversation ID if error occurred during existing conversation"
    )

    class Config:
        json_schema_extra = {
            "example": {
                "error": "Failed to process chat message",
                "detail": "OpenAI API timeout",
                "conversation_id": None
            }
        }