Stack: FastAPI + React/TypeScript + SQLite + GPT-4o Features: Radar géopolitique, Marchés, Régime Macro, Journal de Bord MTM, Rapport IA, Super Contexte (base de raisonnement évolutive), Boucle feedback IA. Deploy: Docker + docker-compose + nginx pour openfin.open-squared.tech Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
from fastapi import APIRouter
|
|
from pydantic import BaseModel
|
|
from typing import Dict, Any, Optional
|
|
import os
|
|
from services.database import get_all_config, set_config, get_sources, update_sources, get_analysis_config, save_analysis_config
|
|
|
|
router = APIRouter(prefix="/api/config", tags=["config"])
|
|
|
|
|
|
class ApiKeysRequest(BaseModel):
|
|
openai_api_key: Optional[str] = None
|
|
newsapi_key: Optional[str] = None
|
|
eia_api_key: Optional[str] = None
|
|
fred_api_key: Optional[str] = None
|
|
|
|
|
|
class SourcesRequest(BaseModel):
|
|
sources: Dict[str, Any]
|
|
|
|
|
|
class SettingsRequest(BaseModel):
|
|
ai_enabled: Optional[str] = None
|
|
ai_auto_rescore: Optional[str] = None
|
|
|
|
|
|
class AnalysisConfigRequest(BaseModel):
|
|
top_n: Optional[int] = None
|
|
category_filter: Optional[str] = None
|
|
template: Optional[str] = None
|
|
|
|
|
|
@router.get("/")
|
|
def get_config_all():
|
|
return get_all_config()
|
|
|
|
|
|
@router.get("/sources")
|
|
def list_sources():
|
|
return get_sources()
|
|
|
|
|
|
@router.put("/sources")
|
|
def update_sources_endpoint(req: SourcesRequest):
|
|
update_sources(req.sources)
|
|
return {"status": "ok", "updated": len(req.sources)}
|
|
|
|
|
|
@router.put("/api-keys")
|
|
def update_api_keys(req: ApiKeysRequest):
|
|
updated = []
|
|
if req.openai_api_key is not None:
|
|
set_config("openai_api_key", req.openai_api_key)
|
|
os.environ["OPENAI_API_KEY"] = req.openai_api_key
|
|
updated.append("openai")
|
|
if req.newsapi_key is not None:
|
|
set_config("newsapi_key", req.newsapi_key)
|
|
updated.append("newsapi")
|
|
if req.eia_api_key is not None:
|
|
set_config("eia_api_key", req.eia_api_key)
|
|
updated.append("eia")
|
|
if req.fred_api_key is not None:
|
|
set_config("fred_api_key", req.fred_api_key)
|
|
updated.append("fred")
|
|
return {"status": "ok", "updated": updated}
|
|
|
|
|
|
@router.put("/settings")
|
|
def update_settings(req: SettingsRequest):
|
|
if req.ai_enabled is not None:
|
|
set_config("ai_enabled", req.ai_enabled)
|
|
if req.ai_auto_rescore is not None:
|
|
set_config("ai_auto_rescore", req.ai_auto_rescore)
|
|
return {"status": "ok"}
|
|
|
|
|
|
@router.get("/analysis")
|
|
def get_analysis_config_endpoint():
|
|
return get_analysis_config()
|
|
|
|
|
|
@router.put("/analysis")
|
|
def save_analysis_config_endpoint(req: AnalysisConfigRequest):
|
|
current = get_analysis_config()
|
|
if req.top_n is not None:
|
|
current["top_n"] = req.top_n
|
|
if req.category_filter is not None:
|
|
current["category_filter"] = req.category_filter
|
|
if req.template is not None:
|
|
current["template"] = req.template
|
|
save_analysis_config(current)
|
|
return {"status": "ok", "config": current}
|