79 lines
3.6 KiB
Python
79 lines
3.6 KiB
Python
from fastapi import APIRouter, HTTPException
|
|
from loguru import logger
|
|
|
|
from api.models import SettingsResponse, SettingsUpdate
|
|
from open_notebook.domain.content_settings import ContentSettings
|
|
from open_notebook.exceptions import InvalidInputError
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/settings", response_model=SettingsResponse)
|
|
async def get_settings():
|
|
"""Get all application settings."""
|
|
try:
|
|
settings: ContentSettings = await ContentSettings.get_instance() # type: ignore[assignment]
|
|
|
|
return SettingsResponse(
|
|
default_content_processing_engine_doc=settings.default_content_processing_engine_doc,
|
|
default_content_processing_engine_url=settings.default_content_processing_engine_url,
|
|
default_embedding_option=settings.default_embedding_option,
|
|
auto_delete_files=settings.auto_delete_files,
|
|
youtube_preferred_languages=settings.youtube_preferred_languages,
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"Error fetching settings: {str(e)}")
|
|
raise HTTPException(status_code=500, detail=f"Error fetching settings: {str(e)}")
|
|
|
|
|
|
@router.put("/settings", response_model=SettingsResponse)
|
|
async def update_settings(settings_update: SettingsUpdate):
|
|
"""Update application settings."""
|
|
try:
|
|
settings: ContentSettings = await ContentSettings.get_instance() # type: ignore[assignment]
|
|
|
|
# Update only provided fields
|
|
if settings_update.default_content_processing_engine_doc is not None:
|
|
# Cast to proper literal type
|
|
from typing import Literal, cast
|
|
settings.default_content_processing_engine_doc = cast(
|
|
Literal["auto", "docling", "simple"],
|
|
settings_update.default_content_processing_engine_doc
|
|
)
|
|
if settings_update.default_content_processing_engine_url is not None:
|
|
from typing import Literal, cast
|
|
settings.default_content_processing_engine_url = cast(
|
|
Literal["auto", "firecrawl", "jina", "simple"],
|
|
settings_update.default_content_processing_engine_url
|
|
)
|
|
if settings_update.default_embedding_option is not None:
|
|
from typing import Literal, cast
|
|
settings.default_embedding_option = cast(
|
|
Literal["ask", "always", "never"],
|
|
settings_update.default_embedding_option
|
|
)
|
|
if settings_update.auto_delete_files is not None:
|
|
from typing import Literal, cast
|
|
settings.auto_delete_files = cast(
|
|
Literal["yes", "no"],
|
|
settings_update.auto_delete_files
|
|
)
|
|
if settings_update.youtube_preferred_languages is not None:
|
|
settings.youtube_preferred_languages = settings_update.youtube_preferred_languages
|
|
|
|
await settings.update()
|
|
|
|
return SettingsResponse(
|
|
default_content_processing_engine_doc=settings.default_content_processing_engine_doc,
|
|
default_content_processing_engine_url=settings.default_content_processing_engine_url,
|
|
default_embedding_option=settings.default_embedding_option,
|
|
auto_delete_files=settings.auto_delete_files,
|
|
youtube_preferred_languages=settings.youtube_preferred_languages,
|
|
)
|
|
except HTTPException:
|
|
raise
|
|
except InvalidInputError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
except Exception as e:
|
|
logger.error(f"Error updating settings: {str(e)}")
|
|
raise HTTPException(status_code=500, detail=f"Error updating settings: {str(e)}") |