mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-10 22:54:43 +02:00
refactor(stt): unifie le jeton Ghostfolio — source client unique, appel côté serveur (#41)
Avant : jeton Ghostfolio en double (config client pour l'intent vocal + secret k8s pour
le contexte serveur). Désormais une SEULE source — la config client — transmise au
serveur, qui fait tous les appels Ghostfolio (un seul code, lecture seule).
Serveur :
- sources.py : cœur _ghostfolio_fetch(token) partagé ; ghostfolio_block (contexte) et
ghostfolio_phrase (intent) acceptent un jeton par requête (priorité client > env).
- app.py : /v1/ask accepte `secrets` (jetons client) passés aux sources ; nouvel
endpoint POST /v1/portfolio {token} → valeur du portefeuille.
- bump 0.4.0 → 0.5.0.
Client :
- api.py : ServerClient.secrets transmis dans /v1/ask ; méthode portfolio() → /v1/portfolio.
- cli.py : _make_client renseigne secrets["ghostfolio_token"] depuis [ghostfolio].
- ui/app.py : l'intent « combien ghostfolio » appelle client.portfolio (serveur).
- supprime portal/ghostfolio.py (client) — l'appel API vit côté serveur.
- config : [ghostfolio] = juste access_token (transmis au serveur).
- bump 0.12.0 → 0.13.0.
Le secret k8s STT_GHOSTFOLIO_TOKEN devient un simple fallback. Validé bout-en-bout
contre une instance serveur locale + Ghostfolio réel : « …vaut environ 16 520 EUR. »
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
ae4d5bd20e
commit
e49b4fc3ba
11 changed files with 121 additions and 113 deletions
|
|
@ -23,7 +23,7 @@ from stt_server.contexts import CONTEXTS, assemble, get_context
|
|||
from stt_server.knowledge import Knowledge
|
||||
from stt_server.longterm import LongTermMemory
|
||||
from stt_server.memory import SessionStore
|
||||
from stt_server.sources import fetch_blocks
|
||||
from stt_server.sources import fetch_blocks, ghostfolio_phrase
|
||||
|
||||
log = logging.getLogger("stt_server")
|
||||
# uvicorn ne configure que ses propres loggers : on attache notre handler en INFO
|
||||
|
|
@ -59,6 +59,11 @@ class AskRequest(BaseModel):
|
|||
model: str | None = None # alias LiteLLM ; défaut serveur si absent
|
||||
session_id: str | None = None # mémoire court-terme : fil de conversation
|
||||
context: str | None = None # contexte présélectionné (funk/ghostfolio/…)
|
||||
secrets: dict | None = None # jetons client (ex. {"ghostfolio_token": …})
|
||||
|
||||
|
||||
class PortfolioRequest(BaseModel):
|
||||
token: str | None = None # jeton Ghostfolio fourni par le client (sinon env)
|
||||
|
||||
|
||||
class AskReply(BaseModel):
|
||||
|
|
@ -98,6 +103,18 @@ async def v1_memory_health() -> dict:
|
|||
return await longterm.health()
|
||||
|
||||
|
||||
@app.post("/v1/portfolio")
|
||||
async def v1_portfolio(req: PortfolioRequest) -> dict:
|
||||
"""Valeur du portefeuille Ghostfolio (intent vocal client → serveur).
|
||||
|
||||
Le serveur fait l'appel Ghostfolio avec le jeton fourni par le client (sinon le
|
||||
jeton serveur `STT_GHOSTFOLIO_TOKEN`). Un seul code Ghostfolio, lecture seule.
|
||||
"""
|
||||
async with httpx.AsyncClient() as c:
|
||||
summary = await ghostfolio_phrase(c, req.token)
|
||||
return {"summary": summary}
|
||||
|
||||
|
||||
@app.post("/v1/reset")
|
||||
async def v1_reset(req: AskRequest) -> dict:
|
||||
if req.session_id:
|
||||
|
|
@ -130,7 +147,7 @@ async def v1_ask(req: AskRequest, background: BackgroundTasks) -> AskReply:
|
|||
live = tuple(s for s in ctx.sources if s != "docs")
|
||||
if live:
|
||||
async with httpx.AsyncClient() as c:
|
||||
blocks = await fetch_blocks(c, live)
|
||||
blocks = await fetch_blocks(c, live, secrets=req.secrets)
|
||||
t_recall = time.perf_counter()
|
||||
system, ctx_debug = assemble(ctx, blocks=blocks, docs=docs, memories=memories)
|
||||
try:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue