mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 14:38:12 +02:00
Repris d'AJEAN c05a0a9f et e44b6139. Les deux délais MCP, jusqu'ici codés en dur (20 s pour se connecter, 120 s pour un appel d'outil), deviennent des réglages globaux : clé bkState mcp_timeouts, bornes 1 à 3600 s, routes GET /api/mcp/timeouts et POST /api/mcp/timeouts/save. L'enregistrement ferme les sessions ouvertes pour que le nouveau délai de connexion s'applique dès la suivante. Un lancement npx/uvx garde au moins mcpConnectTimeoutCold. Un appel prend le réglage global, toujours remplacé par le callTimeoutSec du serveur, puis allongé par l'argument timeout de l'outil. Le plafond d'un appel suit la borne des réglages (1 h au lieu de 30 min) : un délai réglé à 3600 s n'est plus rogné en silence. Une valeur rangée hors bornes ou illisible retombe sur la borne ou le défaut. Le délai par serveur passe par /api/mcp/save (callTimeoutSec, 0 à 3600, vide = réglage global), revient dans /api/mcp et n'est plus perdu à l'enregistrement. L'interface gagne deux lignes dans la carte « Serveurs MCP », au style des réglages (sans bordure, un seul enregistrement par modification), et un champ « délai d'un appel d'outil » dans la fenêtre d'édition d'un serveur. index.html régénéré par tools/assemble-ui. Quand la façade tient les serveurs MCP (LOKI_MCP=rust), elle sert aussi les nouvelles routes : c'est son pool qu'il faut fermer quand les délais changent. Le journal de parité MCP couvre la lecture des délais, leur effet sur la connexion et l'appel, et les deux routes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
90 lines
2.8 KiB
Go
90 lines
2.8 KiB
Go
package loki
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Délais MCP réglables depuis l'UI (repris d'AJEAN c05a0a9f) : connexion d'une
|
|
// session et appel d'outil, en secondes, communs à tous les serveurs. Un
|
|
// serveur peut remplacer le délai d'appel par le sien (CallTimeoutSec), et un
|
|
// lancement npx/uvx garde au moins mcpConnectTimeoutCold pour se connecter.
|
|
|
|
// MCPTimeouts : les délais globaux, en secondes. Stockés dans bkState sous
|
|
// la clé mcpTimeoutsKey ; zéro (ou clé absente) = valeur par défaut.
|
|
type MCPTimeouts struct {
|
|
// Connect borne l'établissement d'une session (handshake initialize +
|
|
// tools/list). Un serveur qui rame ne doit pas figer le tour de chat.
|
|
Connect int `json:"connect"`
|
|
// Call borne un appel d'outil MCP.
|
|
Call int `json:"call"`
|
|
}
|
|
|
|
const (
|
|
// Valeurs par défaut, en secondes (les anciennes constantes).
|
|
mcpConnectTimeoutDefault = 20
|
|
mcpCallTimeoutDefault = 120
|
|
// mcpTimeoutMaxSec : borne haute des réglages (1 h), globaux comme par
|
|
// serveur.
|
|
mcpTimeoutMaxSec = 3600
|
|
mcpTimeoutsKey = "mcp_timeouts"
|
|
)
|
|
|
|
// LoadMCPTimeouts lit les délais globaux. Une valeur absente, nulle ou
|
|
// illisible retombe sur son défaut ; une valeur hors bornes (base modifiée à
|
|
// la main) est ramenée à mcpTimeoutMaxSec.
|
|
func LoadMCPTimeouts() MCPTimeouts {
|
|
var t MCPTimeouts
|
|
if !getJSON(bkState, mcpTimeoutsKey, &t) {
|
|
t = MCPTimeouts{}
|
|
}
|
|
return t.normalized()
|
|
}
|
|
|
|
func (t MCPTimeouts) normalized() MCPTimeouts {
|
|
fix := func(v, def int) int {
|
|
switch {
|
|
case v <= 0:
|
|
return def
|
|
case v > mcpTimeoutMaxSec:
|
|
return mcpTimeoutMaxSec
|
|
}
|
|
return v
|
|
}
|
|
return MCPTimeouts{
|
|
Connect: fix(t.Connect, mcpConnectTimeoutDefault),
|
|
Call: fix(t.Call, mcpCallTimeoutDefault),
|
|
}
|
|
}
|
|
|
|
// SaveMCPTimeouts enregistre les délais globaux (valeurs déjà validées par
|
|
// l'appelant ; normalisées par sûreté).
|
|
func SaveMCPTimeouts(t MCPTimeouts) error {
|
|
mcpConfigMu.Lock()
|
|
defer mcpConfigMu.Unlock()
|
|
return putJSON(bkState, mcpTimeoutsKey, t.normalized())
|
|
}
|
|
|
|
// connect et call : les délais en durées.
|
|
func (t MCPTimeouts) connect() time.Duration { return time.Duration(t.Connect) * time.Second }
|
|
func (t MCPTimeouts) call() time.Duration { return time.Duration(t.Call) * time.Second }
|
|
|
|
// mcpTimeoutsError : le refus d'un réglage hors bornes, nil sinon. Même texte
|
|
// pour la façade (mcp/mod.rs).
|
|
func mcpTimeoutsError(t MCPTimeouts) string {
|
|
if t.Connect < 1 || t.Connect > mcpTimeoutMaxSec {
|
|
return "connexion : 1 à 3600 s"
|
|
}
|
|
if t.Call < 1 || t.Call > mcpTimeoutMaxSec {
|
|
return "appel d'outil : 1 à 3600 s"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// mcpCallTimeoutSecError : le refus d'un délai par serveur hors bornes.
|
|
func mcpCallTimeoutSecError(sec int) string {
|
|
if sec < 0 || sec > mcpTimeoutMaxSec {
|
|
return "délai d'un appel : 0 à 3600 s (vide = réglage global)"
|
|
}
|
|
return ""
|
|
}
|