diff --git a/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.js b/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.js index 355ffe6..cffde35 100644 --- a/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.js +++ b/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.js @@ -56,9 +56,26 @@ async function runMigrations(db) { t.uuid('conversation_id').notNullable().references('id').inTable('sec_conversations').onDelete('CASCADE'); t.string('role', 20).notNullable(); // user | assistant | system t.text('content').notNullable(); + t.text('usage_tokens').nullable(); // telemetria de tokens (JSON) + t.string('provider_used', 40).nullable(); // provedor LLM usado na resposta + t.string('model_used', 80).nullable(); // modelo LLM usado na resposta t.timestamps(true, true); }); } + // ── sec_messages — telemetria: garante colunas em tabelas pré-existentes ──── + // (o insert em brain.ts grava usage_tokens/provider_used/model_used; sem este + // bloco, bancos criados antes dessas colunas quebram com 42703.) + if (await db.schema.hasTable('sec_messages')) { + if (!(await db.schema.hasColumn('sec_messages', 'usage_tokens'))) { + await db.schema.alterTable('sec_messages', (t) => { t.text('usage_tokens').nullable(); }); + } + if (!(await db.schema.hasColumn('sec_messages', 'provider_used'))) { + await db.schema.alterTable('sec_messages', (t) => { t.string('provider_used', 40).nullable(); }); + } + if (!(await db.schema.hasColumn('sec_messages', 'model_used'))) { + await db.schema.alterTable('sec_messages', (t) => { t.string('model_used', 80).nullable(); }); + } + } // ── sec_brain_nodes — adiciona node_model se ainda não existe ──────────── if (await db.schema.hasTable('sec_brain_nodes')) { if (!(await db.schema.hasColumn('sec_brain_nodes', 'node_model'))) { diff --git a/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.ts b/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.ts index ee11bb3..6347307 100644 --- a/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.ts +++ b/newwhats.clube67.com/newwhats.local/plugins/secretaria/migrate.ts @@ -59,10 +59,28 @@ export async function runMigrations(db: Knex): Promise { t.uuid('conversation_id').notNullable().references('id').inTable('sec_conversations').onDelete('CASCADE') t.string('role', 20).notNullable() // user | assistant | system t.text('content').notNullable() + t.text('usage_tokens').nullable() // telemetria de tokens (JSON) + t.string('provider_used', 40).nullable() // provedor LLM usado na resposta + t.string('model_used', 80).nullable() // modelo LLM usado na resposta t.timestamps(true, true) }) } + // ── sec_messages — telemetria: garante colunas em tabelas pré-existentes ──── + // (o insert em brain.ts grava usage_tokens/provider_used/model_used; sem este + // bloco, bancos criados antes dessas colunas quebram com 42703.) + if (await db.schema.hasTable('sec_messages')) { + if (!(await db.schema.hasColumn('sec_messages', 'usage_tokens'))) { + await db.schema.alterTable('sec_messages', (t) => { t.text('usage_tokens').nullable() }) + } + if (!(await db.schema.hasColumn('sec_messages', 'provider_used'))) { + await db.schema.alterTable('sec_messages', (t) => { t.string('provider_used', 40).nullable() }) + } + if (!(await db.schema.hasColumn('sec_messages', 'model_used'))) { + await db.schema.alterTable('sec_messages', (t) => { t.string('model_used', 80).nullable() }) + } + } + // ── sec_brain_nodes — adiciona node_model se ainda não existe ──────────── if (await db.schema.hasTable('sec_brain_nodes')) { if (!(await db.schema.hasColumn('sec_brain_nodes', 'node_model'))) {