skills/compute/provider-discovery/SKILL.md
# Provider Discovery ## Metadata - **Category**: compute - **SDK**: `@0glabs/0g-serving-broker` ^0.6.5, `ethers` ^6.13.0 - **Activation Triggers**: "list providers", "find provider", "verify provider", "TEE", "available models" ## Purpose Discover, filter, and verify compute providers on the 0G network. List available services by type (chatbot, text-to-image, speech-to-text), check TEE verification status, and acknowledge providers before first use. ## Prerequisites - Node.js >= 22 - `@0
npx skillsauth add 0gfoundation/0g-agent-skills skills/compute/provider-discoveryInstall 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, ethers ^6.13.0Discover, filter, and verify compute providers on the 0G network. List available services by type (chatbot, text-to-image, speech-to-text), check TEE verification status, and acknowledge providers before first use.
@0glabs/0g-serving-broker and ethers installed.env with PRIVATE_KEY, RPC_URLbroker.inference.listService()acknowledgeProviderSigner)import { ethers } from 'ethers';
import { createZGComputeNetworkBroker } from '@0glabs/0g-serving-broker';
import 'dotenv/config';
async function listProviders() {
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 services = await broker.inference.listService();
// Services are returned as tuple arrays:
// [0] = providerAddress, [1] = serviceType, [2] = url,
// [6] = model, [10] = teeVerified
const chatbotServices = services.filter((s: any) => s[1] === 'chatbot');
const imageServices = services.filter((s: any) => s[1] === 'text-to-image');
const speechServices = services.filter((s: any) => s[1] === 'speech-to-text');
console.log(`Chatbot providers: ${chatbotServices.length}`);
chatbotServices.forEach((s: any) => {
console.log(` ${s[0]} — model: ${s[6]}, TEE: ${s[10]}`);
});
console.log(`Image providers: ${imageServices.length}`);
console.log(`Speech providers: ${speechServices.length}`);
return { chatbotServices, imageServices, speechServices };
}
async function findVerifiedProvider(serviceType: 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 services = await broker.inference.listService();
// Filter by type and TEE status (tuple: [0]=addr, [1]=type, [6]=model, [10]=tee)
const filtered = services.filter((s: any) => s[1] === serviceType && s[10] === true);
if (filtered.length === 0) {
throw new Error(`No TEE-verified ${serviceType} providers found`);
}
const selected = filtered[0];
const providerAddress = selected[0];
const model = selected[6];
console.log(`Selected provider: ${providerAddress}`);
console.log(`Model: ${model}`);
console.log(`TEE verified: ${selected[10]}`);
return { providerAddress, model, raw: selected };
}
async function acknowledgeProvider(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);
// One-time setup per provider
await broker.inference.acknowledgeProviderSigner(providerAddress);
console.log(`Provider ${providerAddress} acknowledged`);
}
async function getServiceInfo(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);
const { endpoint, model } = await broker.inference.getServiceMetadata(providerAddress);
console.log(`Endpoint: ${endpoint}`);
console.log(`Model: ${model}`);
return { endpoint, model };
}
async function safeProviderSetup(serviceType: 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);
try {
const services = await broker.inference.listService();
// Tuple: [0]=providerAddress, [1]=serviceType, [6]=model
const filtered = services.filter((s: any) => s[1] === serviceType);
if (filtered.length === 0) {
throw new Error(`No ${serviceType} providers available`);
}
const selected = filtered[0];
const providerAddress = selected[0];
try {
await broker.inference.acknowledgeProviderSigner(providerAddress);
console.log('Provider acknowledged successfully');
} catch (ackError) {
console.warn('Acknowledgment failed (may already be acknowledged):', ackError);
}
return { providerAddress, model: selected[6], raw: selected };
} catch (error) {
console.error('Provider discovery failed:', error);
throw error;
}
}
| Provider | Service Type | Models | | -------- | -------------- | ----------------------------------- | | Various | chatbot | DeepSeek V3.1, Qwen, Gemma, GPT-OSS | | Various | text-to-image | Flux Turbo | | Various | speech-to-text | Whisper Large V3 |
Provider availability varies. Use
listService()to check current providers.
| Service Type | Status | | -------------- | -------------------------- | | chatbot | Available (e.g., Qwen 2.5) | | text-to-image | Limited availability | | speech-to-text | Limited availability |
# List inference providers
0g-compute-cli inference list-providers
# List fine-tuning providers
0g-compute-cli fine-tuning list-providers
# Acknowledge a provider
0g-compute-cli inference acknowledge-provider --provider <ADDR>
// BAD: Skipping acknowledgment
const headers = await broker.inference.getRequestHeaders(providerAddress);
// Will fail if provider not acknowledged
// BAD: Not checking TEE for sensitive workloads
const services = await broker.inference.listService();
const anyProvider = services[0]; // Could be unverified! Check s[10] for TEE status
// BAD: Hardcoding provider addresses without verification
const PROVIDER = '0x123...'; // May be offline or decommissioned
// BAD: ethers v5 syntax
const provider = new ethers.providers.JsonRpcProvider(url); // v5!
| Error | Cause | Fix |
| --------------------------- | ------------------------ | ---------------------------------- |
| Provider not acknowledged | First-time use | Call acknowledgeProviderSigner() |
| No providers found | Wrong network or filters | Check RPC_URL and service type |
| TEE verification failed | Provider not TEE-enabled | Choose a different provider |
| Service unavailable | Provider offline | Try another provider |
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