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
}
}
|