mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 22:24:42 +02:00
* feat(stt): mémoire long-terme sémantique via Qdrant (5b) Serveur : longterm.py — collection Qdrant stt-memory (embeddings Qwen3 gpu-01, dim auto, Cosine), recall top-k injecté au prompt, remember des tours user. Tout dégrade proprement si Qdrant/embeddings injoignables (la mémoire court-terme tient). Env STT_MEMORY_LONGTERM, STT_QDRANT_URL, STT_EMBED_URL, STT_MEMORY_TOPK. Testé en process : dégradation OK (Qdrant down → mem=0, pas de crash, court-terme tient). Qdrant réparé le 17/06 (5c). Recherche sémantique réelle à valider sur cluster. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT * feat(stt): endpoint /v1/memory/health + upsert Qdrant synchrone - /v1/memory/health sonde activement embeddings + Qdrant + collection et expose les erreurs (recall/remember dégradent en silence → indébogables). Permet de diagnostiquer la mémoire long-terme sans kubectl exec. - remember() : upsert avec ?wait=true → le souvenir est immédiatement cherchable (sans wait, Qdrant met l'écriture en file → un recall cross-session immédiat pouvait le rater). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT * docs(stt): 5b mémoire long-terme validée en prod + backlog nomic-embed-text - Rappel cross-session confirmé (« Felix » retrouvé dans une nouvelle session), points_count vérifié via /v1/memory/health. - Note du fix upsert ?wait=true et de l'endpoint de diagnostic. - Roadmap : 5d (nomic-embed-text dim 768) en backlog qualité ; états haut/bas du doc mis à jour (déployé + validé sur cible). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT * feat(stt): embeddings dédiés nomic-embed-text sur gpu-01 (:1238) + migration auto Remplace Qwen3 (chat réutilisé, dim 4096, peu discriminant) par un modèle d'embedding spécialisé nomic-embed-text (dim 768) pour la mémoire long-terme. Ansible (rôle llama_server) : - nouvelle instance optionnelle `llama-embed` (llama_embed_enabled) servant un modèle d'embedding dédié sur :1238, GPU ; télécharge le GGUF si absent. - activée sur gpu-01 (host_vars) : nomic-embed-text-v1.5 f16. STT-server : - STT_EMBED_URL → :1238, STT_EMBED_MODEL → nomic-embed-text (deployment + config). - _ensure_collection détecte le changement de dimension (4096→768) et recrée automatiquement la collection stt-memory (anciens vecteurs incomparables) — pas de drop manuel. Docs : llama_server README, rag.md, stt.md (5d ✅), CLAUDE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT * fix(stt): désactiver le mode thinking de Qwen3 (/no_think) — content vide / 502 Qwen3 est un modèle « thinking » : il dépensait tout le budget max_tokens en reasoning_content → content vide, ou partait en raisonnement long → timeout (502 "upstream LiteLLM : " avec message vide). Diagnostic : appel direct LiteLLM en 0.87s mais content="" et tout dans reasoning_content. - brain.py : ajoute le token de contrôle `/no_think` au system prompt (configurable STT_DISABLE_THINKING, défaut true ; inoffensif pour non-Qwen). - brain.py : filet de sécurité — si content vide, récupère reasoning_content au lieu de renvoyer "". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013FmcxGsyXZXogiAHQLjnZT --------- Co-authored-by: Claude <noreply@anthropic.com>
48 lines
2.2 KiB
Python
48 lines
2.2 KiB
Python
"""Configuration du STT-server — via variables d'environnement (12-factor / k8s)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
|
|
class Settings:
|
|
# LiteLLM (s01) — joint en IP directe depuis le cluster (cf. open-webui).
|
|
litellm_url: str = os.getenv(
|
|
"STT_LITELLM_URL", "http://192.168.10.1:4000/v1/chat/completions"
|
|
)
|
|
litellm_key: str = os.getenv("STT_LITELLM_KEY", "lm-studio")
|
|
# Modèle par défaut + alias LiteLLM autorisés (le client peut en demander un par requête)
|
|
model: str = os.getenv("STT_MODEL", "hermes-default")
|
|
allowed_models: list[str] = [
|
|
m.strip()
|
|
for m in os.getenv(
|
|
"STT_ALLOWED_MODELS",
|
|
"hermes-default,qwen3-8b,claude-sonnet-4-6,claude-opus-4-7",
|
|
).split(",")
|
|
if m.strip()
|
|
]
|
|
|
|
system_prompt: str = os.getenv(
|
|
"STT_SYSTEM_PROMPT",
|
|
"Tu es Hermes, l'assistant vocal du homelab Funk. "
|
|
"Réponds toujours en français, de façon concise (2-3 phrases maximum), "
|
|
"sans markdown ni listes.",
|
|
)
|
|
max_tokens: int = int(os.getenv("STT_MAX_TOKENS", "200"))
|
|
temperature: float = float(os.getenv("STT_TEMPERATURE", "0.7"))
|
|
request_timeout: float = float(os.getenv("STT_REQUEST_TIMEOUT", "60"))
|
|
# Qwen3 est un modèle « thinking » → ajoute `/no_think` pour désactiver le raisonnement
|
|
# (sinon content vide / timeout). Inoffensif pour les modèles non-Qwen.
|
|
disable_thinking: bool = os.getenv("STT_DISABLE_THINKING", "true").lower() == "true"
|
|
|
|
# Mémoire long-terme (Qdrant) — dégrade proprement si Qdrant/embeddings injoignables
|
|
memory_longterm: bool = os.getenv("STT_MEMORY_LONGTERM", "true").lower() == "true"
|
|
qdrant_url: str = os.getenv("STT_QDRANT_URL", "http://192.168.10.1:6333")
|
|
qdrant_collection: str = os.getenv("STT_QDRANT_COLLECTION", "stt-memory")
|
|
# Embeddings : instance dédiée nomic-embed-text sur llama-server gpu-01 (:1238, dim 768).
|
|
embed_url: str = os.getenv("STT_EMBED_URL", "http://192.168.10.20:1238/v1/embeddings")
|
|
embed_model: str = os.getenv("STT_EMBED_MODEL", "nomic-embed-text")
|
|
memory_top_k: int = int(os.getenv("STT_MEMORY_TOPK", "3"))
|
|
|
|
|
|
settings = Settings()
|