settings.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from typing import Annotated
  2. from fastapi import APIRouter, Header, status
  3. from fastapi.responses import JSONResponse
  4. from openhands.core.logger import openhands_logger as logger
  5. from openhands.server.settings import Settings
  6. from openhands.server.shared import config, openhands_config
  7. from openhands.storage.settings_store import SettingsStore
  8. from openhands.utils.import_utils import get_impl
  9. app = APIRouter(prefix='/api')
  10. SettingsStoreImpl = get_impl(SettingsStore, openhands_config.settings_store_class) # type: ignore
  11. @app.get('/settings')
  12. async def load_settings(
  13. github_auth: Annotated[str | None, Header()] = None,
  14. ) -> Settings | None:
  15. try:
  16. settings_store = await SettingsStoreImpl.get_instance(config, github_auth)
  17. settings = await settings_store.load()
  18. if settings:
  19. # For security reasons we don't ever send the api key to the client
  20. settings.llm_api_key = None
  21. return settings
  22. except Exception as e:
  23. logger.warning(f'Invalid token: {e}')
  24. return JSONResponse(
  25. status_code=status.HTTP_401_UNAUTHORIZED,
  26. content={'error': 'Invalid token'},
  27. )
  28. @app.post('/settings')
  29. async def store_settings(
  30. settings: Settings,
  31. github_auth: Annotated[str | None, Header()] = None,
  32. ) -> bool:
  33. try:
  34. settings_store = await SettingsStoreImpl.get_instance(config, github_auth)
  35. existing_settings = await settings_store.load()
  36. if existing_settings:
  37. if settings.llm_api_key is None:
  38. settings.llm_api_key = existing_settings.llm_api_key
  39. return await settings_store.store(settings)
  40. except Exception as e:
  41. logger.warning(f'Invalid token: {e}')
  42. return JSONResponse(
  43. status_code=status.HTTP_401_UNAUTHORIZED,
  44. content={'error': 'Invalid token'},
  45. )