Reportar modelo real en no-streaming + prewarm de mcp-server-fetch
- engine.py: process_message ahora incluye model/modelUsage en el dict de retorno (no solo en el evento SSE), para que el camino no-streaming (cronjobs -> _report_usage) reporte el modelo real a consumo_acaicode en vez de "unknown". - Dockerfile: precalentar `uvx mcp-server-fetch` en build (como appuser) para que la cache de uv quede en la imagen y el MCP fetch no se quede sin arrancar por timeout en frio tras un rebuild. - mcp.json: startup_timeout de fetch 15 -> 30s como margen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -56,6 +56,13 @@ USER appuser
|
|||||||
# Descargar Chromium como appuser (queda en ~/.cache/ms-playwright/)
|
# Descargar Chromium como appuser (queda en ~/.cache/ms-playwright/)
|
||||||
RUN cd mcp-server && npx playwright install chromium
|
RUN cd mcp-server && npx playwright install chromium
|
||||||
|
|
||||||
|
# Precalentar mcp-server-fetch como appuser: uvx descarga ~43 paquetes la
|
||||||
|
# primera vez, lo que en frio supera el startup_timeout del MCP. Lo dejamos
|
||||||
|
# cacheado en ~/.cache/uv dentro de la imagen para que arranque rapido en
|
||||||
|
# runtime (igual que Chromium). El server lee stdin; con </dev/null sale tras
|
||||||
|
# instalar. `|| true` para no romper el build si sale != 0.
|
||||||
|
RUN timeout 180 uvx mcp-server-fetch </dev/null >/dev/null 2>&1 || true
|
||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
|
|||||||
2
mcp.json
2
mcp.json
@@ -19,7 +19,7 @@
|
|||||||
"command": "uvx",
|
"command": "uvx",
|
||||||
"args": ["mcp-server-fetch"],
|
"args": ["mcp-server-fetch"],
|
||||||
"timeout": 30,
|
"timeout": 30,
|
||||||
"startup_timeout": 15
|
"startup_timeout": 30
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -267,6 +267,21 @@ class OrchestratorEngine:
|
|||||||
"status": "completed",
|
"status": "completed",
|
||||||
"usage": usage,
|
"usage": usage,
|
||||||
"total_cost_usd": round(cost_usd, 6),
|
"total_cost_usd": round(cost_usd, 6),
|
||||||
|
# Modelo + tarifas realmente usadas. Se incluyen tambien aqui (ademas
|
||||||
|
# del evento SSE EXECUTION_COMPLETED) para que el camino NO streaming
|
||||||
|
# (cronjobs -> _report_usage) reporte el modelo correcto a
|
||||||
|
# consumo_acaicode en vez de "unknown".
|
||||||
|
"model": model_used,
|
||||||
|
"modelUsage": {
|
||||||
|
model_used: {
|
||||||
|
"inputTokens": total_input,
|
||||||
|
"outputTokens": total_output,
|
||||||
|
"costUSD": round(cost_usd, 6),
|
||||||
|
"inputCost1M": cost_info["input_cost_1m"],
|
||||||
|
"outputCost1M": cost_info["output_cost_1m"],
|
||||||
|
"reasoningEffort": self.agent_profile.reasoning_effort or "",
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def _error_result(self, session: SessionState, error: str) -> dict[str, Any]:
|
def _error_result(self, session: SessionState, error: str) -> dict[str, Any]:
|
||||||
|
|||||||
Reference in New Issue
Block a user