// src/arkor/trainer.ts
import { createTrainer } from "arkor";
const SLACK_WEBHOOK = process.env.SLACK_WEBHOOK_URL;
async function postSlack(text: string): Promise<void> {
if (!SLACK_WEBHOOK) return;
try {
await fetch(SLACK_WEBHOOK, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ text }),
});
} catch (err) {
console.warn("slack post failed:", err);
}
}
export const trainer = createTrainer({
name: "support-bot-v2",
model: "unsloth/gemma-4-E4B-it",
dataset: { type: "huggingface", name: "arkorlab/triage-demo" },
lora: { r: 32, alpha: 64, maxLength: 2048, loadIn4bit: true },
maxSteps: 500,
learningRate: 2e-4,
callbacks: {
onLog: ({ step, loss }) => {
if (loss !== null && Number.isFinite(loss)) {
console.log(`step=${step} loss=${loss.toFixed(4)}`);
}
},
onCompleted: async ({ job, artifacts }) => {
await postSlack(`✓ ${job.name} done (${artifacts.length} artifact(s))`);
},
onFailed: async ({ job, error }) => {
await postSlack(`✗ ${job.name} failed: ${error}`);
},
},
});