|
|
from pydantic import BaseModel, EmailStr, Field, field_validator, ConfigDict |
|
|
from typing import Optional, Literal, List |
|
|
from datetime import datetime |
|
|
from fastapi import FastAPI, UploadFile, File |
|
|
|
|
|
|
|
|
|
|
|
class UserCreate(BaseModel): |
|
|
username: str = Field(..., min_length=3, max_length=50) |
|
|
email: EmailStr = Field(...) |
|
|
password: str = Field(..., min_length=6, max_length=72) |
|
|
|
|
|
@field_validator('password') |
|
|
def validate_password(cls, v): |
|
|
if len(v.encode("utf-8")) > 72: |
|
|
raise ValueError('Password cannot exceed 72 bytes') |
|
|
return v |
|
|
|
|
|
class LoginRequest(BaseModel): |
|
|
email: EmailStr |
|
|
password: str |
|
|
|
|
|
class Token(BaseModel): |
|
|
access_token: str |
|
|
token_type: str |
|
|
|
|
|
class LoginResponse(Token): |
|
|
username: str |
|
|
|
|
|
|
|
|
|
|
|
class Quiz_input(BaseModel): |
|
|
parsed_doc: str |
|
|
user_prompt: str |
|
|
|
|
|
|
|
|
class QuizQuestion(BaseModel): |
|
|
question: str |
|
|
options: List[str] = Field(..., min_items=2) |
|
|
answer: str = Field(..., description="Correct answer key") |
|
|
explanation: str |
|
|
User_response: str = Field("", alias="User_response") |
|
|
|
|
|
class QuizOutput(BaseModel): |
|
|
quiz: List[QuizQuestion] = Field(..., description="A list of 10 generated MCQ questions.") |
|
|
|
|
|
class IngestRequest(BaseModel): |
|
|
parsed_doc: str = Field(..., description="The main document content to embed") |
|
|
user_prompt: Optional[str] = None |
|
|
id: Optional[str] = None |
|
|
|
|
|
|
|
|
class ChatMessage(BaseModel): |
|
|
role: Literal["user", "assistant", "system"] = Field(..., description="Role of the message sender") |
|
|
content: str = Field(..., min_length=1, description="Message content") |
|
|
|
|
|
class AI_chat_input(BaseModel): |
|
|
messages: List[ChatMessage] = Field(..., description="Conversation history") |
|
|
context: str = Field(..., description="The content of the note/document to chat about") |
|
|
session_id: str | None = Field( |
|
|
None, description="The unique ID of the current chat session (optional)." |
|
|
) |
|
|
|
|
|
class SessionCreate(BaseModel): |
|
|
pdf_id: int |
|
|
name: str = "New Chat" |
|
|
|
|
|
class SessionResponse(BaseModel): |
|
|
id: str |
|
|
name: str |
|
|
created_at: datetime |
|
|
pdf_id: int |
|
|
|
|
|
class MessageResponse(BaseModel): |
|
|
id: int |
|
|
role: str |
|
|
content: str |
|
|
created_at: datetime |
|
|
|
|
|
|
|
|
|
|
|
class pdf_input(BaseModel): |
|
|
file: UploadFile = File(..., description="The PDF file to be ingested.") |
|
|
|
|
|
class NoteInfo(BaseModel): |
|
|
id: int |
|
|
filename: str |
|
|
created_at: datetime |
|
|
|
|
|
|
|
|
class VapiConfigRequest(BaseModel): |
|
|
name: str |
|
|
job_role: str |
|
|
experience: str |
|
|
level: str |