"""Request model for concept suggest endpoint."""
from pydantic import BaseModel, Field, field_validator
import langcodes
# Supported language codes (ISO 639-1)
[docs]
SUPPORTED_LANGUAGES = {
"en", # English
"de", # German
"es", # Spanish
"fr", # French
"pt", # Portuguese
"it", # Italian
"da", # Danish
}
[docs]
class SuggestRequest(BaseModel):
"""
Request model for /api/v1/concepts/suggest/ endpoint.
This endpoint provides concept suggestions based on a search query.
Supported languages: English (en), German (de), Spanish (es), French (fr),
Portuguese (pt), Italian (it), Danish (da)
Example:
>>> request = SuggestRequest(query="carbon", language="en")
>>> params = request.to_query_params()
>>> # {'query': 'carbon', 'language': 'en'}
"""
[docs]
query: str = Field(
...,
min_length=1,
max_length=500,
description="Search query string for concept suggestions"
)
[docs]
language: str = Field(
...,
min_length=2,
max_length=2,
description="ISO 639-1 language code (en, de, es, fr, pt, it, da)"
)
@field_validator("query")
@classmethod
[docs]
def validate_query(cls, v: str) -> str:
"""Validate and clean the query string."""
# Strip whitespace
v = v.strip()
if not v:
raise ValueError("Query cannot be empty or only whitespace")
return v
@field_validator("language")
@classmethod
[docs]
def validate_language(cls, v: str) -> str:
"""Validate language code against supported languages."""
# Convert to lowercase
v = v.lower().strip()
if not v:
raise ValueError("Language code is required")
# Validate it's a valid ISO 639-1 language code
if not langcodes.tag_is_valid(v):
raise ValueError(f"Invalid language code: {v}")
# Check if it's in our supported list
if v not in SUPPORTED_LANGUAGES:
supported = ", ".join(sorted(SUPPORTED_LANGUAGES))
raise ValueError(
f"Language '{v}' is not supported. "
f"Supported languages: {supported}"
)
return v
[docs]
def to_query_params(self) -> dict[str, str]:
"""
Convert request model to query parameters dictionary.
Returns:
Dictionary of query parameters ready for URL encoding
"""
return {
"query": self.query,
"language": self.language
}
[docs]
model_config = {
"json_schema_extra": {
"examples": [
{
"query": "carbon",
"language": "en"
},
{
"query": "sustainability",
"language": "de"
}
]
}
}