fix: version 4.0.5 -- Propuestas de IA grandes ya no quedan cortadas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,12 @@
|
|||||||
# Changelog - project.linkedcorp.net
|
# Changelog - project.linkedcorp.net
|
||||||
|
|
||||||
|
## [4.0.5] - 2026-10-23
|
||||||
|
### Fixed
|
||||||
|
- "No se pudo generar un plan con tareas": con 4.000 tokens de tope, una propuesta grande (con
|
||||||
|
el razonamiento del modelo) podía quedar cortada y llegar sin actividades. Tope subido a
|
||||||
|
12.000 (solo se cobra lo usado) y, si aun así se corta, se informa con un mensaje claro. El log
|
||||||
|
registra el motivo de fin de cada llamada.
|
||||||
|
|
||||||
## [4.0.4] - 2026-10-23
|
## [4.0.4] - 2026-10-23
|
||||||
### Changed
|
### Changed
|
||||||
- "Nuevo con IA" también detecta cuando lo pedido ya existe como actividad o tarea dentro de otro
|
- "Nuevo con IA" también detecta cuando lo pedido ya existe como actividad o tarea dentro de otro
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "project-linkedcorp-backend",
|
"name": "project-linkedcorp-backend",
|
||||||
"version": "4.0.4",
|
"version": "4.0.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "src/server.js",
|
"main": "src/server.js",
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ export async function generateProjectPlan(projectId, description, lang, user) {
|
|||||||
].filter(Boolean).join('\n'),
|
].filter(Boolean).join('\n'),
|
||||||
toolName: 'plan_de_proyecto',
|
toolName: 'plan_de_proyecto',
|
||||||
schema: { type: 'object', properties: { activities: ACTIVITIES_SCHEMA }, required: ['activities'] },
|
schema: { type: 'object', properties: { activities: ACTIVITIES_SCHEMA }, required: ['activities'] },
|
||||||
maxTokens: 4000,
|
maxTokens: 12000,
|
||||||
});
|
});
|
||||||
await logAudit({ userId: user.id, action: 'ai_plan', entityType: 'project', entityId: projectId });
|
await logAudit({ userId: user.id, action: 'ai_plan', entityType: 'project', entityId: projectId });
|
||||||
return { activities: cleanPlan(result.activities) };
|
return { activities: cleanPlan(result.activities) };
|
||||||
@@ -192,7 +192,7 @@ export async function proposeNewProject({ objective, startDate, lang }, user) {
|
|||||||
},
|
},
|
||||||
required: ['isProject'],
|
required: ['isProject'],
|
||||||
},
|
},
|
||||||
maxTokens: 4000,
|
maxTokens: 12000,
|
||||||
});
|
});
|
||||||
await logAudit({ userId: user.id, action: 'ai_new_project', entityType: 'project', entityId: null });
|
await logAudit({ userId: user.id, action: 'ai_new_project', entityType: 'project', entityId: null });
|
||||||
if (!result.isProject) throw new HttpError(422, 'Solo puedo ayudarte a crear proyectos. Describe el objetivo de un proyecto de trabajo.');
|
if (!result.isProject) throw new HttpError(422, 'Solo puedo ayudarte a crear proyectos. Describe el objetivo de un proyecto de trabajo.');
|
||||||
|
|||||||
@@ -40,7 +40,9 @@ export async function askStructured({ system, prompt, toolName, schema, maxToken
|
|||||||
throw new HttpError(502, `Servicio de IA: ${detail}`);
|
throw new HttpError(502, `Servicio de IA: ${detail}`);
|
||||||
}
|
}
|
||||||
// Consumo real de cada llamada (para estimar costos: ver precios del modelo en la consola).
|
// Consumo real de cada llamada (para estimar costos: ver precios del modelo en la consola).
|
||||||
console.log(`[ai] ${config.model} tokens entrada=${body?.usage?.input_tokens} salida=${body?.usage?.output_tokens}`);
|
console.log(`[ai] ${config.model} tokens entrada=${body?.usage?.input_tokens} salida=${body?.usage?.output_tokens} fin=${body?.stop_reason}`);
|
||||||
|
// Respuesta cortada por el tope de tokens: el JSON de la herramienta llega incompleto.
|
||||||
|
if (body?.stop_reason === 'max_tokens') throw new HttpError(502, 'La respuesta de la IA fue demasiado larga y quedo incompleta. Intenta con un objetivo mas acotado.');
|
||||||
const tool = body?.content?.find((c) => c.type === 'tool_use');
|
const tool = body?.content?.find((c) => c.type === 'tool_use');
|
||||||
if (!tool?.input) throw new HttpError(502, 'La IA no devolvio un resultado valido');
|
if (!tool?.input) throw new HttpError(502, 'La IA no devolvio un resultado valido');
|
||||||
return tool.input;
|
return tool.input;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "project-linkedcorp-frontend",
|
"name": "project-linkedcorp-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "4.0.4",
|
"version": "4.0.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
Reference in New Issue
Block a user