chatbot-deploy / models /response_models.py
umar-30's picture
Deploy RAG chatbot backend API
53ae001
Raw History Blame Contribute Delete
6.48 kB
"""
Response Models for RAG Agent API
Pydantic models for API responses.
Models:
SourceReference: Reference to a documentation source
QueryResponse: Successful query response with answer and sources
ErrorResponse: Error response with details
"""
from pydantic import BaseModel, Field, HttpUrl
from typing import List, Optional
class SourceReference(BaseModel):
"""
Reference to a documentation source used in answer generation.
Attributes:
url: URL of the source documentation page
page_title: Human-readable title of the page
relevance_score: Similarity score from vector search (0.0-1.0)
chunk_index: Position of chunk within the page (optional)
Example:
{
"url": "https://docs.ros.org/...",
"page_title": "Writing a simple publisher",
"relevance_score": 0.8642,
"chunk_index": 2
}
"""
url: str = Field(
...,
description="URL of the source documentation page"
)
page_title: str = Field(
...,
min_length=1,
description="Human-readable title of the documentation page"
)
relevance_score: float = Field(
...,
ge=0.0,
le=1.0,
description="Similarity score from vector search (0.0-1.0, higher is more relevant)"
)
chunk_index: Optional[int] = Field(
default=None,
ge=0,
description="Position of the chunk within the page (0-indexed)"
)
model_config = {
"json_schema_extra": {
"examples": [
{
"url": "https://docs.ros.org/en/rolling/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher.html",
"page_title": "Writing a simple publisher (Python)",
"relevance_score": 0.8642,
"chunk_index": 2
}
]
}
}
class QueryResponse(BaseModel):
"""
Successful response to a query request.
Attributes:
query: Original user query (echoed back)
answer: Generated natural language answer
sources: List of source references (deduplicated by URL)
model_used: Actual OpenAI model used for generation
tokens_used: Total tokens consumed (prompt + completion)
retrieval_count: Number of chunks retrieved before deduplication
Example:
{
"query": "How do I create a ROS 2 publisher?",
"answer": "To create a ROS 2 publisher...",
"sources": [...],
"model_used": "gpt-3.5-turbo",
"tokens_used": 456,
"retrieval_count": 5
}
"""
query: str = Field(
...,
description="Original user query (echoed back)"
)
answer: str = Field(
...,
min_length=1,
description="Generated natural language answer"
)
sources: List[SourceReference] = Field(
...,
description="List of source references (deduplicated by URL)"
)
model_used: str = Field(
...,
description="Actual OpenAI model used for generation"
)
tokens_used: int = Field(
...,
ge=0,
description="Total tokens consumed (prompt + completion)"
)
retrieval_count: int = Field(
...,
ge=0,
description="Number of chunks retrieved before deduplication"
)
model_config = {
"json_schema_extra": {
"examples": [
{
"query": "How do I create a ROS 2 publisher in Python?",
"answer": "To create a ROS 2 publisher in Python, you need to import rclpy, create a node class, and use create_publisher()...",
"sources": [
{
"url": "https://docs.ros.org/en/rolling/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher.html",
"page_title": "Writing a simple publisher (Python)",
"relevance_score": 0.8642,
"chunk_index": 2
}
],
"model_used": "gpt-3.5-turbo",
"tokens_used": 456,
"retrieval_count": 5
}
]
}
}
class ErrorResponse(BaseModel):
"""
Error response for failed requests.
Attributes:
error: Error flag (always True for error responses)
error_type: Error classification (ValidationError, RetrievalError, etc.)
error_message: Human-readable error description
query: Original query if available
status_code: HTTP status code
Example:
{
"error": true,
"error_type": "ValidationError",
"error_message": "Query cannot be empty",
"query": "",
"status_code": 422
}
"""
error: bool = Field(
default=True,
description="Error flag (always True for error responses)"
)
error_type: str = Field(
...,
min_length=1,
description="Error classification"
)
error_message: str = Field(
...,
min_length=1,
description="Human-readable error description"
)
query: Optional[str] = Field(
default=None,
description="Original query if available"
)
status_code: int = Field(
...,
ge=400,
le=599,
description="HTTP status code"
)
model_config = {
"json_schema_extra": {
"examples": [
{
"error": True,
"error_type": "ValidationError",
"error_message": "Query cannot be empty or whitespace only",
"query": "",
"status_code": 422
},
{
"error": True,
"error_type": "RetrievalError",
"error_message": "Vector database is currently unavailable",
"query": "How do I create a publisher?",
"status_code": 503
}
]
}
}