Saltar al contenido principal
Utiliza el ajuste fino cuando quieras adaptar un modelo base a tus propios ejemplos de entrenamiento y estilo operativo. Los endpoints de ajuste fino crean un trabajo asíncrono a partir de archivos JSONL subidos y devuelven un ID de modelo cuando el entrenamiento finaliza exitosamente. Los endpoints de ajuste fino están marcados como SOLO ADMINISTRADOR en la referencia de API generada. Utiliza una clave de API con los permisos requeridos.

Antes de comenzar

Prepara:
EntradaDescripción
Archivo de entrenamientoUn archivo JSONL con tus ejemplos de entrenamiento. Súbelo con purpose: "fine-tune".
Archivo de validaciónDatos de validación JSONL opcionales. Súbelo con purpose: "fine-tune".
Modelo baseEl ID del modelo que deseas ajustar, por ejemplo meetkai:functionary-medium.
Los trabajos de ajuste fino pueden devolver estos estados:
validating_files -> queued -> running -> succeeded
                          \-> failed
                          \-> cancelled

Paso 1 - Sube tus archivos de entrenamiento

Sube cada archivo JSONL con la API de Archivos y purpose: "fine-tune".
import { SDK } from '@meetkai/mka1';

const mka1 = new SDK({
  bearerAuth: 'Bearer <mka1-api-key>',
});

const requestOptions = {
  headers: {
    'X-On-Behalf-Of': '<end-user-id>',
  },
};

const trainingFile = await mka1.llm.files.upload(
  {
    file: Bun.file('./fine-tuning-train.jsonl'),
    purpose: 'fine-tune',
  },
  requestOptions
);

const validationFile = await mka1.llm.files.upload(
  {
    file: Bun.file('./fine-tuning-validation.jsonl'),
    purpose: 'fine-tune',
  },
  requestOptions
);

console.log(trainingFile.id);
console.log(validationFile.id);
Guarda los IDs de archivo devueltos. Los pasarás a la API de Ajuste Fino en el siguiente paso.

Paso 2 - Crea un trabajo de ajuste fino

Llama a mka1.llm.fineTuning.create con el modelo base y el ID de tu archivo de entrenamiento subido. Agrega un archivo de validación, sufijo, metadatos y configuraciones de método cuando lo necesites.
const job = await mka1.llm.fineTuning.create(
  {
    model: 'gpt-5',
    trainingFile: trainingFile.id,
    validationFile: validationFile.id,
    suffix: 'support-bot',
    seed: 42,
    method: {
      type: 'supervised',
      supervised: {
        hyperparameters: {
          nEpochs: 3,
        },
      },
    },
    metadata: {
      experiment: 'support-bot-v1',
    },
  },
  requestOptions
);

console.log(job.id);            // "ftjob_aa87e2b1112a455b8deabed784372198"
console.log(job.status);        // "validating_files" | "queued" | "running" | ...
console.log(job.fineTunedModel); // null hasta que el trabajo finalice exitosamente

Paso 3 - Consultar el estado del trabajo

Recupera el trabajo hasta que alcance succeeded, failed o cancelled.
async function waitForFineTuningJob(
  fineTuningJobId: string,
  timeoutMs = 30 * 60_000
) {
  const terminalStatuses = new Set(['succeeded', 'failed', 'cancelled']);
  const start = Date.now();

  while (Date.now() - start < timeoutMs) {
    const current = await mka1.llm.fineTuning.retrieve(
      { fineTuningJobId },
      requestOptions
    );

    if (terminalStatuses.has(current.status)) {
      return current;
    }

    await new Promise((resolve) => setTimeout(resolve, 10_000));
  }

  throw new Error(`El trabajo de ajuste fino ${fineTuningJobId} no finalizó a tiempo`);
}

const completedJob = await waitForFineTuningJob(job.id);

if (completedJob.status === 'succeeded') {
  console.log(completedJob.fineTunedModel);
} else {
  console.log(completedJob.error);
}
También puedes paginar por todos los trabajos con mka1.llm.fineTuning.list({ limit, after }).

Paso 4 - Inspecciona eventos y checkpoints de entrenamiento

Utiliza los eventos para ver registros de entrenamiento y actualizaciones de métricas. Utiliza los checkpoints para inspeccionar puntos intermedios del modelo y sus métricas.
const events = await mka1.llm.fineTuning.listEvents(
  {
    fineTuningJobId: job.id,
    limit: 20,
  },
  requestOptions
);

for (const event of events.data) {
  console.log(event.createdAt, event.level, event.message, event.data);
}

const checkpoints = await mka1.llm.fineTuning.listCheckpoints(
  {
    fineTuningJobId: job.id,
    limit: 10,
  },
  requestOptions
);

for (const checkpoint of checkpoints.data) {
  console.log(
    checkpoint.stepNumber,
    checkpoint.fineTunedModelCheckpoint,
    checkpoint.metrics
  );
}
Las métricas de los checkpoints pueden incluir train_loss, train_mean_token_accuracy, valid_loss, valid_mean_token_accuracy, full_valid_loss y full_valid_mean_token_accuracy.

Paso 5 - Pausar, reanudar o cancelar un trabajo

Utiliza pause cuando necesites detener temporalmente un trabajo en ejecución. Utiliza resume para continuarlo. Utiliza cancel para detenerlo permanentemente.
await mka1.llm.fineTuning.pause(
  { fineTuningJobId: job.id },
  requestOptions
);

await mka1.llm.fineTuning.resume(
  { fineTuningJobId: job.id },
  requestOptions
);

await mka1.llm.fineTuning.cancel(
  { fineTuningJobId: job.id },
  requestOptions
);

Paso 6 - Usa el modelo ajustado

Cuando el trabajo alcance succeeded, job.fineTunedModel contendrá el nuevo ID de modelo. Pasa ese ID de modelo a una solicitud de Respuestas.
const response = await mka1.llm.responses.create(
  {
    model: completedJob.fineTunedModel!,
    input: 'Escribe una respuesta de soporte para un envío retrasado.',
  },
  requestOptions
);

console.log(response.outputText);

Referencia de API

Para ver el esquema completo de solicitudes y respuestas, abre el grupo de Ajuste Fino en la Referencia de API.