skills/compute/fine-tuning/SKILL.md
# Model Fine-Tuning ## Metadata - **Category**: compute - **SDK**: `@0glabs/0g-serving-broker` ^0.6.5 (CLI-based workflow) - **Activation Triggers**: "fine-tune", "train model", "custom model", "model training" ## Purpose Fine-tune AI models on 0G's distributed GPU network. Upload training data, configure parameters, monitor training, and download the resulting model. **Currently testnet only.** ## Prerequisites - Node.js >= 22 - `@0glabs/0g-serving-broker` CLI installed globally - Testnet
npx skillsauth add 0gfoundation/0g-agent-skills skills/compute/fine-tuningInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
4 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
@0glabs/0g-serving-broker ^0.6.5 (CLI-based workflow)Fine-tune AI models on 0G's distributed GPU network. Upload training data, configure parameters, monitor training, and download the resulting model. Currently testnet only.
@0glabs/0g-serving-broker CLI installed globallyDelivered status before downloadingFinished status before decryptingprocessResponse() param order: (providerAddress, chatID, usageData)ZG-Res-Key header first, body as fallback (chatbot only)Init -> SettingUp -> SetUp -> Training -> Trained -> Delivering -> Delivered -> UserAcknowledged -> Finished
|
Failed
| Status | Description | Action |
| ------------------ | ------------------ | -------------- |
| Init | Task submitted | Wait |
| SettingUp | Provider preparing | Wait |
| Training | Model training | Monitor logs |
| Delivered | Result uploaded | Download model |
| UserAcknowledged | Download confirmed | Wait for key |
| Finished | Complete | Decrypt model |
| Failed | Task failed | Check logs |
0g-compute-cli fine-tuning list-providers
# Official testnet provider: 0xf07240Efa67755B5311bc75784a061eDB47165Dd
0g-compute-cli fine-tuning list-models
# Available: distilbert-base-uncased (Text Classification)
0g-compute-cli fine-tuning upload --data-path ./my_dataset.json
# Output: Root hash: 0xabc123...
0g-compute-cli fine-tuning calculate-token \
--model distilbert-base-uncased \
--dataset-path ./my_dataset.json \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd
0g-compute-cli transfer-fund \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--amount 1
0g-compute-cli fine-tuning create-task \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--model distilbert-base-uncased \
--dataset 0xabc123... \
--config-path ./config.json \
--data-size 1000000
# Output: Created Task ID: 6b607314-88b0-4fef-91e7-43227a54de57
0g-compute-cli fine-tuning get-task \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task 6b607314-88b0-4fef-91e7-43227a54de57
# View training logs
0g-compute-cli fine-tuning get-log \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task 6b607314-88b0-4fef-91e7-43227a54de57
0g-compute-cli fine-tuning acknowledge-model \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task-id 6b607314-88b0-4fef-91e7-43227a54de57 \
--data-path ./encrypted_model.bin
0g-compute-cli fine-tuning decrypt-model \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task-id 6b607314-88b0-4fef-91e7-43227a54de57 \
--encrypted-model ./encrypted_model.bin \
--output ./my_model.zip
unzip ./my_model.zip -d ./my_fine_tuned_model/
import { ethers } from 'ethers';
import { createZGComputeNetworkBroker } from '@0glabs/0g-serving-broker';
import 'dotenv/config';
async function checkFineTuningAccount(providerAddress: string) {
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const broker = await createZGComputeNetworkBroker(wallet);
// Transfer funds for fine-tuning
await broker.ledger.transferFund(providerAddress, 'fine-tuning', ethers.parseEther('1'));
// Check sub-account (returns [subAccountTuple, refundsArray])
const [account, refunds] = await broker.fineTuning.getAccountWithDetail(providerAddress);
// Tuple: [0]=user, [1]=provider, [2]=balance, ...
console.log(`Fine-tuning balance: ${ethers.formatEther(account[2])} 0G`);
}
async function monitorTask(providerAddress: string, taskId: string) {
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const broker = await createZGComputeNetworkBroker(wallet);
const pollInterval = 30000; // 30 seconds
const maxAttempts = 120; // 1 hour max
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
// Check task status via CLI or SDK
console.log(`Polling task ${taskId} (attempt ${attempt + 1})...`);
// In practice, use CLI: 0g-compute-cli fine-tuning get-task
// SDK integration for status checking may vary
await new Promise((resolve) => setTimeout(resolve, pollInterval));
} catch (error) {
console.error('Status check failed:', error);
if (attempt === maxAttempts - 1) throw error;
}
}
}
0.000000000000000001 0G per byte0g-compute-cli fine-tuning calculate-token# BAD: Creating task while another is running
0g-compute-cli fine-tuning create-task ... # Error: provider busy
# BAD: Downloading before Delivered status
0g-compute-cli fine-tuning acknowledge-model ... # Will fail
# BAD: Decrypting before Finished status
0g-compute-cli fine-tuning decrypt-model ... # Key not available yet
// BAD: Hardcoding private keys
const wallet = new ethers.Wallet('0xabc123...', provider); // NEVER do this
// BAD: ethers v5 syntax
const provider = new ethers.providers.JsonRpcProvider(url); // v5!
| Error | Cause | Fix |
| --------------------------- | --------------------- | ------------------------------ |
| Provider busy | Previous task running | Wait or use different provider |
| Insufficient balance | Sub-account empty | Transfer more funds |
| Dataset validation failed | Wrong format | Check dataset structure |
| Decryption failed | Wrong status or key | Wait for Finished status |
| Task failed | Config or data issue | Check logs for details |
| Provider not acknowledged | First-time provider | acknowledgeProviderSigner() |
development
# Upload File to 0G Storage ## Metadata - **Category**: storage - **SDK**: `@0glabs/0g-ts-sdk` ^0.3.3, `ethers` ^6.13.0 - **Activation Triggers**: "upload file", "store on 0G", "ZgFile", "save to storage" ## Purpose Upload files to 0G decentralized storage using the ZgFile API and Indexer. Files are split into chunks, organized as a Merkle tree, and distributed across storage nodes. Returns a root hash for later retrieval. ## Prerequisites - Node.js >= 18 - `@0glabs/0g-ts-sdk` and `ethers`
development
# Merkle Verification ## Metadata - **Category**: storage - **SDK**: `@0glabs/0g-ts-sdk` ^0.3.3 - **Activation Triggers**: "verify file", "merkle proof", "data integrity", "root hash", "check file" ## Purpose Compute root hashes and verify data integrity for files stored on 0G Storage. Uses Merkle tree proofs to cryptographically verify that downloaded data matches what was originally uploaded. ## Prerequisites - Node.js >= 18 - `@0glabs/0g-ts-sdk` installed ## Quick Workflow 1. Create
development
# Download File from 0G Storage ## Metadata - **Category**: storage - **SDK**: `@0glabs/0g-ts-sdk` ^0.3.3, `ethers` ^6.13.0 - **Activation Triggers**: "download file", "retrieve from 0G", "get file", "fetch from storage" ## Purpose Download and verify files from 0G decentralized storage using a root hash. Supports verified downloads with Merkle proof validation to ensure data integrity. ## Prerequisites - Node.js >= 18 - `@0glabs/0g-ts-sdk` installed - Root hash of the file to download - `
development
# Storage + Chain Integration ## Metadata - **Category**: cross-layer - **SDK**: `@0glabs/0g-ts-sdk` ^0.3.3, `ethers` ^6.13.0 - **Activation Triggers**: "on-chain reference", "NFT metadata on 0G", "store hash on-chain", "registry contract", "chain and storage" ## Purpose Combine 0G Storage with 0G Chain smart contracts to create on-chain references to off-chain data. Common patterns include NFT metadata storage, content registries, and verifiable document systems. ## Prerequisites - Node