1.9 KiB
1.9 KiB
Plan: API Key pro Agent
Übersicht
Statt einem globalen API-Key pro User wird der Key pro Agent zugewiesen. Kein Key = kein Chat. Saubere Trennung.
Datenbank
Neue Tabelle agent_api_keys
CREATE TABLE agent_api_keys (
user_id TEXT NOT NULL,
agent_id TEXT NOT NULL,
key_id TEXT NOT NULL,
UNIQUE(user_id, agent_id)
);
Neue DB-Methoden
SetAgentApiKey(string userId, string agentId, string keyId)GetAgentApiKey(string userId, string agentId)→ key_id oder nullGetAgentApiKeyRecord(string userId, string agentId)→ vollständiges ApiKey-Objekt
Migration
- Bestehende
users.selected_api_key_idWerte → inagent_api_keysfür alle Agents des Users übernehmen (einmalig) users.selected_api_key_idbleibt vorerst in der Tabelle (kein DROP), wird aber nicht mehr aktiv genutzt
Backend (Endpoints)
Angepasste Endpoints
PUT /api/api-keys/select/{keyId}→ neuer Query-Parameter?agentId=xxxGET /api/api-keys/selected→ neuer Query-Parameter?agentId=xxx
Chat/Services
ChatEndpoint→GetAgentApiKeyRecord(userId, agentId)stattGetUserSelectedApiKey(userId)TelegramService→GetAgentApiKeyRecord(userId, agentId)stattGetUserSelectedApiKey(userId)CronjobService→GetAgentApiKeyRecord(userId, agentId)stattGetUserSelectedApiKey(userId)
Fehler-Handling
- Kein Key für Agent zugewiesen → Fehlermeldung: "Kein API Key für diesen Agent zugewiesen"
- Kein Fallback auf globalen Key
Frontend
Key-Switch-Modal
- Bekommt
agentIdals Parameter (aus aktuellem Chat/Session) - Select-Call sendet
agentIdmit - Zeigt aktuell zugewiesenen Key für diesen Agent
Usage-Badge
- Zeigt den Key des aktuellen Agents (nicht den globalen)
API-Calls
selectApiKey(keyId, agentId)→PUT /api/api-keys/select/{keyId}?agentId={agentId}getSelectedApiKey(agentId)→GET /api/api-keys/selected?agentId={agentId}