Together webhooks events
'Together AI webhooks events for inference, fine-tuning, and model deployment.From its SKILL.md
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill together-webhooks-eventsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
4.1 KB, 895 tokens by cl100k_base, as published. Nobody here has run it
Together AI Webhooks & Events
Overview
Together AI delivers webhook callbacks for asynchronous operations including fine-tuning jobs, batch inference, and model lifecycle events. Subscribe to events for fine-tune completion, job failures, model deprecation notices, and batch processing status to build automated ML pipelines without polling the jobs API.
Webhook Registration
const response = await fetch("https://api.together.xyz/v1/webhooks", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.TOGETHER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
url: "https://yourapp.com/webhooks/together",
events: ["fine_tune.completed", "fine_tune.failed", "model.deprecated", "batch.done"],
secret: process.env.TOGETHER_WEBHOOK_SECRET,
}),
});
Signature Verification
import crypto from "crypto";
import { Request, Response, NextFunction } from "express";
function verifyTogetherSignature(req: Request, res: Response, next: NextFunction) {
const signature = req.headers["x-together-signature"] as string;
const expected = crypto.createHmac("sha256", process.env.TOGETHER_WEBHOOK_SECRET!)
.update(req.body).digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).json({ error: "Invalid signature" });
}
next();
}
Event Handler
import express from "express";
const app = express();
app.post("/webhooks/together", express.raw({ type: "application/json" }), verifyTogetherSignature, (req, res) => {
const event = JSON.parse(req.body.toString());
res.status(200).json({ received: true });
switch (event.type) {
case "fine_tune.completed":
deployModel(event.data.fine_tune_id, event.data.model_name); break;
case "fine_tune.failed":
alertTeam(event.data.fine_tune_id, event.data.error_message); break;
case "model.deprecated":
migratePipelines(event.data.model_id, event.data.replacement_model); break;
case "batch.done":
collectResults(event.data.batch_id, event.data.output_url); break;
}
});
Event Types
| Event | Payload Fields | Use Case |
|---|---|---|
fine_tune.completed | fine_tune_id, model_name, eval_loss | Auto-deploy fine-tuned model |
fine_tune.failed | fine_tune_id, error_message, step | Alert team and retry with adjusted params |
model.deprecated | model_id, replacement_model, sunset_date | Migrate inference pipelines proactively |
batch.done | batch_id, output_url, total_tokens | Download batch results and update billing |
fine_tune.checkpoint | fine_tune_id, step, loss | Monitor training progress in real time |
Retry & Idempotency
const processed = new Set<string>();
async function handleIdempotent(event: { id: string; type: string; data: any }) {
if (processed.has(event.id)) return;
await routeEvent(event);
processed.add(event.id);
if (processed.size > 10_000) {
const entries = Array.from(processed);
entries.slice(0, entries.length - 10_000).forEach((id) => processed.delete(id));
}
}
Error Handling
| Issue | Cause | Fix |
|---|---|---|
401 Unauthorized | Invalid or expired API key | Rotate key at api.together.xyz |
| Fine-tune stuck | Training data format issues | Validate JSONL before submission |
| Batch timeout | Large batch exceeds time limit | Split into smaller batches |
| Model not found | Deprecated without migration | Check model.deprecated events proactively |
Resources
- Together AI Docs
- Fine-tuning Guide
Next Steps
See together-security-basics.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.