Dan Walsh
Testing and performance optimisations
124b5b5
raw
history blame
4.05 kB
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel, Field, HttpUrl
from typing import Optional, Union
from app.services.summariser import SummariserService
from app.services.url_extractor import URLExtractorService
from app.services.cache import hash_text, get_cached_summary, cache_summary
router = APIRouter()
class TextSummaryRequest(BaseModel):
text: str = Field(..., min_length=10, description="The text to summarise")
max_length: Optional[int] = Field(150, ge=30, le=500, description="Maximum length of the summary")
min_length: Optional[int] = Field(50, ge=10, le=200, description="Minimum length of the summary")
do_sample: Optional[bool] = Field(False, description="Whether to use sampling for generation")
temperature: Optional[float] = Field(1.0, ge=0.7, le=2.0, description="Sampling temperature")
class URLSummaryRequest(BaseModel):
url: HttpUrl = Field(..., description="The URL to extract content from and summarise")
max_length: Optional[int] = Field(150, ge=30, le=500, description="Maximum length of the summary")
min_length: Optional[int] = Field(50, ge=10, le=200, description="Minimum length of the summary")
do_sample: Optional[bool] = Field(False, description="Whether to use sampling for generation")
temperature: Optional[float] = Field(1.0, ge=0.7, le=2.0, description="Sampling temperature")
class SummaryResponse(BaseModel):
original_text_length: int
summary: str
summary_length: int
source_type: str = "text" # "text" or "url"
source_url: Optional[str] = None
@router.post("/summarise", response_model=SummaryResponse)
async def summarise_text(request: TextSummaryRequest):
try:
# Check cache first
text_hash = hash_text(request.text)
cached_summary = get_cached_summary(
text_hash,
request.max_length,
request.min_length,
request.do_sample,
request.temperature
)
if cached_summary:
return cached_summary
# If not in cache, generate summary
summariser = SummariserService()
summary = summariser.summarise(
text=request.text,
max_length=request.max_length,
min_length=request.min_length,
do_sample=request.do_sample,
temperature=request.temperature
)
result = {
"original_text_length": len(request.text),
"summary": summary,
"summary_length": len(summary),
"source_type": "text"
}
# Cache the result
cache_summary(
text_hash,
request.max_length,
request.min_length,
request.do_sample,
request.temperature,
result
)
return result
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.post("/summarise-url", response_model=SummaryResponse)
async def summarise_url(request: URLSummaryRequest):
try:
# Extract content from URL
url_extractor = URLExtractorService()
content = await url_extractor.extract_content(str(request.url))
if not content or len(content) < 100:
raise HTTPException(status_code=422, detail="Could not extract sufficient content from the URL")
# Summarise the extracted content
summariser = SummariserService()
summary = summariser.summarise(
text=content,
max_length=request.max_length,
min_length=request.min_length,
do_sample=request.do_sample,
temperature=request.temperature
)
return {
"original_text_length": len(content),
"summary": summary,
"summary_length": len(summary),
"source_type": "url",
"source_url": str(request.url)
}
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))