59 lines
2.7 KiB
Python
59 lines
2.7 KiB
Python
# btk_mcp_module/models.py
|
|
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel, Field, HttpUrl
|
|
|
|
|
|
class BtkSearchRequest(BaseModel):
|
|
"""Request model for searching BTK Board decisions."""
|
|
|
|
keywords: str = Field("", description="Keywords searched in decision title/content metadata.")
|
|
decision_no: str = Field("", description="BTK decision number, e.g. 2026/DK-THD/91.")
|
|
decision_date: str = Field("", description="Decision date as YYYY-MM-DD.")
|
|
publication_date: str = Field("", description="Publication date as YYYY-MM-DD.")
|
|
relevant_unit: str = Field("", description="Related BTK department name.")
|
|
page: int = Field(1, ge=1, description="Page number for results.")
|
|
pageSize: int = Field(10, ge=1, le=50, description="Results per page.")
|
|
|
|
|
|
class BtkDecisionSummary(BaseModel):
|
|
"""Summary of a BTK Board decision from search results."""
|
|
|
|
id: str = Field("", description="BTK content ID.")
|
|
title: str = Field("", description="Decision title.")
|
|
slug: str = Field("", description="BTK content slug.")
|
|
decision_no: Optional[str] = Field(None, description="Decision number.")
|
|
decision_date: Optional[str] = Field(None, description="Decision date.")
|
|
publication_date: Optional[str] = Field(None, description="Publication date.")
|
|
relevant_unit: Optional[str] = Field(None, description="Related BTK department.")
|
|
pdf_url: Optional[HttpUrl] = Field(None, description="Direct URL of the decision PDF.")
|
|
original_filename: Optional[str] = Field(None, description="Original PDF filename when available.")
|
|
|
|
|
|
class BtkSearchResult(BaseModel):
|
|
"""Response model for BTK Board decision search results."""
|
|
|
|
decisions: List[BtkDecisionSummary] = Field(default_factory=list)
|
|
total_results: int = Field(0, description="Total number of matching results.")
|
|
page: int = Field(1, description="Current page.")
|
|
pageSize: int = Field(10, description="Results per page.")
|
|
total_pages: int = Field(0, description="Total result pages.")
|
|
query_url: str = Field("", description="BTK API URL used for the search.")
|
|
|
|
|
|
class BtkDocumentMarkdown(BaseModel):
|
|
"""BTK decision PDF converted to paginated Markdown."""
|
|
|
|
source_url: HttpUrl = Field(description="Source PDF URL.")
|
|
markdown_chunk: Optional[str] = Field(None, description="A chunk of the Markdown content.")
|
|
current_page: int = Field(1, description="Current Markdown chunk page.")
|
|
total_pages: int = Field(1, description="Total Markdown chunk pages.")
|
|
is_paginated: bool = Field(False, description="True when content spans multiple chunks.")
|
|
error_message: Optional[str] = Field(None, description="Error message, if retrieval failed.")
|
|
|
|
class Config:
|
|
json_encoders = {
|
|
HttpUrl: str
|
|
}
|