Auto-Plan: Driver OpenRouter refactorizado con providers nuevos y params Gemma 4 (s48)
Resumen
Sesión 48 (2026-05-03, v1.0.62+). Cierre del tuning hardware del LXC 100 y reapertura de la vía OpenRouter para el A/B económico contra el self-host. Tres cambios concretos:
- Extracción del driver OpenRouter de
autoplan.pyablueprints/services/openrouter_driver.py. - Provider order configurable vía env
OPENROUTER_PROVIDER_ORDER. - Parámetros de sampling actualizados a los oficiales de Google para Gemma 4.
Contexto: cierre del tuning hardware
El LXC 100 (EPYC self-host) fue el eje de las sesiones 44-48. Al llegar a s48, el techo de rendimiento confirmado es:
- 24 tps decode (receta s47g:
--flash-attn off, KV q8_0, imagen 560px sin pseudo-thinking) - 4:45 min por plano de 70 racks, 100% calidad de detección
- Sin mejora posible con palancas reversibles: speculative decoding y
--cache-reusebloqueados upstream porllama.cpp #19712(speculative+multimodal sin merge a fecha s48)
Conclusión operativa: para bajar de 3 min hace falta un cambio upstream que no depende del equipo. Se reabre OpenRouter para medir el otro extremo con datos reales en producción.
Cambio 1 — Extracción del driver
autoplan.py había llegado a >500 LOC con el driver inline. Se extrae a blueprints/services/openrouter_driver.py (78 líneas). Motivaciones:
- Descongestiona
autoplan.py(Regla 5 del proyecto: módulos < 500 LOC). - Prepara reutilización desde CNS y Help en el futuro.
- Facilita testeo aislado del driver.
AutoPlanService._analyze_with_openrouter queda como thin wrapper de una línea que importa y llama a openrouter_driver.analyze_blueprint.
Cambio 2 — Provider order configurable
Antes (s40)
Providers hardcodeados: ["deepinfra", "parasail"].
Después (s48)
provider_order = [
p.strip() for p in os.environ.get("OPENROUTER_PROVIDER_ORDER", "DekaLLM,Novita,Ionstream").split(",")
]
Default DekaLLM,Novita,Ionstream: los 3 providers nuevos disponibles en mayo 2026 para google/gemma-4-26b-a4b-it no testeados en s40.
Providers excluidos del default por comportamiento conocido:
| Provider | Problema |
|---|---|
deepinfra | Baja detección (verificado s40) |
parasail | Recorta resolución de imagen |
cloudflare | Ídem parasail |
google / vertex | Timeouts |
El cambio de provider no requiere redeploy de código — basta con cambiar OPENROUTER_PROVIDER_ORDER en Dokploy.
Cambio 3 — Parámetros de sampling oficiales Gemma 4
| Parámetro | Antes (s40) | Después (s48) | Fuente |
|---|---|---|---|
temperature | 0.1 (Gemini Flash heredado) | 1.0 | Receta oficial Google Gemma 4 |
top_p | — | 0.95 | Receta oficial Google Gemma 4 |
top_k | — | 64 (via extra_body) | Receta oficial Google Gemma 4 |
Objetivo: alinear OpenRouter con la receta s47g del self-host. Con sampling idéntico, la única variable que varía en el A/B es el proveedor de inferencia (OpenRouter vs Ollama local).
Activación y operación
Switch a OpenRouter (sin redeploy)
# En Dokploy → env vars de la app
AUTOPLAN_PROVIDER=openrouter
OPENROUTER_API_KEY=sk-or-v1-...
OPENROUTER_PROVIDER_ORDER=DekaLLM,Novita,Ionstream # opcional, este es el default
Iterar providers sin tocar código
OPENROUTER_PROVIDER_ORDER=Novita,DekaLLM # cambiar orden
OPENROUTER_PROVIDER_ORDER=Ionstream # probar uno solo
Reversión a self-host s47g (~30 segundos)
AUTOPLAN_PROVIDER=ollama
# + redeploy en Dokploy
Objetivo A/B
El server EPYC fue una apuesta para validar la viabilidad económica del self-host vs APIs gestionadas. Con el techo s47g confirmado (4:45 min / 100%) y el coste estimado de OpenRouter (~$0.003 por plano), el A/B permite decidir con datos reales:
- ¿OpenRouter iguala la calidad de detección del self-host?
- ¿El coste por plano justifica delegar la inferencia?
- ¿Qué provider del tier “barato” de OpenRouter es más fiable?
Archivos modificados
| Archivo | Tipo de cambio |
|---|---|
blueprints/services/openrouter_driver.py | Nuevo (78 LOC) |
blueprints/services/autoplan.py | Refactor: -67 LOC inline, +2 LOC wrapper |
CHANGELOG.md | Entrada v1.0.62+ |
RELEASE_NOTES.md | Entrada v1.0.62+ |
Véase también
- [[entity—blueprints—service—openrouter-driver]]
- [[entity—blueprints—model—aiprompt]]
- [[entity—blueprints—service—autoplan]]
- [[feature—autoplan—ollama-s47g]]
- [[runbook—autoplan—switch-provider]]