Observed since 20 Oct, 22:11 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
@0gfoundation/0g-compute-ts-sdk
TS SDK for 0G Compute Network
📦 Package renamed: As of v0.8.0, this package is published as
@0gfoundation/0g-compute-ts-sdk. The previous package name@0glabs/0g-serving-brokeris now deprecated and re-exports this package; please update your dependency and imports.
Access compute resources from 0G Private Computer - a decentralized marketplace that connects developers with affordable, verifiable AI inference and fine-tuning services.
# Using pnpm (recommended)
pnpm add @0gfoundation/0g-compute-ts-sdk
# Using npm
npm install @0gfoundation/0g-compute-ts-sdk
# Using yarn
yarn add @0gfoundation/0g-compute-ts-sdk
# Install globally for CLI access
pnpm add @0gfoundation/0g-compute-ts-sdk -g
The fastest way to get started:
# Launch the Web UI
0g-compute-cli ui start-web
Open http://localhost:3090 in your browser to:
# Setup network
0g-compute-cli setup-network
# Login with your wallet
0g-compute-cli login
# Deposit funds
0g-compute-cli deposit --amount 10
# List available providers
0g-compute-cli inference list-providers
# Transfer funds to a provider
0g-compute-cli transfer-fund --provider <PROVIDER_ADDRESS> --amount 5
# Acknowledge provider before use
0g-compute-cli inference acknowledge-provider --provider <PROVIDER_ADDRESS>
# Get API secret for direct access
0g-compute-cli inference get-secret --provider <PROVIDER_ADDRESS>
# Generate API key with a specific token ID (0-254)
0g-compute-cli inference get-secret --provider <PROVIDER_ADDRESS> --token-id 5
import { ethers } from 'ethers'
import { createZGComputeNetworkBroker } from '@0gfoundation/0g-compute-ts-sdk'
// Initialize
const provider = new ethers.JsonRpcProvider('https://evmrpc-testnet.0g.ai')
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider)
const broker = await createZGComputeNetworkBroker(wallet)
// Discover services
const services = await broker.inference.listService()
// Fund your account
await broker.ledger.depositFund(10)
// Acknowledge provider
await broker.inference.acknowledgeProviderSigner(providerAddress)
// Get service metadata. `model` here is the provider's DEFAULT model.
// A provider may serve multiple models — see "Multi-model providers" below to
// list them and select a specific one.
const { endpoint, model } =
await broker.inference.getServiceMetadata(providerAddress)
// Generate auth headers
const headers = await broker.inference.getRequestHeaders(providerAddress)
// Make request (OpenAI compatible)
const response = await fetch(`${endpoint}/chat/completions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...headers },
body: JSON.stringify({
model,
messages: [{ role: 'user', content: 'Hello!' }],
}),
})
// Or make async request (support images-generations and images-edits)
// Async endpoints live under /v1/async instead of /v1/proxy
const asyncBase = endpoint.replace('/v1/proxy', '/v1/async')
const requestBody = {
model,
prompt: 'A cute baby sea otter',
n: 1,
size: '512x512',
response_format: 'b64_json',
}
// Step 1 — submit the job
const submitHeaders = await broker.inference.getRequestHeaders(
providerAddress,
JSON.stringify(requestBody)
)
const submitRes = await fetch(`${asyncBase}/images/generations`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...submitHeaders },
body: JSON.stringify(requestBody),
})
// 202 Accepted → { jobId: "uuid", status: "pending" }
const { jobId } = await submitRes.json()
// Step 2 — poll until done
let job
do {
const retryAfter = job?.retryAfter ?? 5
await new Promise((r) => setTimeout(r, retryAfter * 1000))
const pollHeaders =
await broker.inference.getRequestHeaders(providerAddress)
const pollRes = await fetch(`${asyncBase}/jobs/${jobId}`, {
headers: pollHeaders,
})
const retryAfterHeader = pollRes.headers.get('Retry-After')
job = {
...(await pollRes.json()),
retryAfter: retryAfterHeader ? Number(retryAfterHeader) : 5,
}
} while (job.status === 'pending' || job.status === 'processing')
if (job.status === 'failed') throw new Error(job.errorMessage)
// job.data — raw provider response, e.g. { data: [{ b64_json: "..." }] }
A single provider can serve multiple models behind one address (each with
its own pricing). getServiceMetadata() returns only the provider's default
model; use getProviderModels() to discover the full catalog, then pass the
chosen model id to getServiceMetadata(addr, modelId) (or set it as model in
the request body).
// Discover the models a provider serves (live, from its /v1/models endpoint)
const catalog = await broker.inference.getProviderModels(providerAddress)
if (catalog.multiModel) {
catalog.models.forEach((m) =>
console.log(m.id, m.canonical_id ?? '', m.type ?? '')
)
}
// Select a specific model (forwarded as-is; the provider validates it and bills that model's price)
const { endpoint, model } = await broker.inference.getServiceMetadata(
providerAddress,
'zai-org/GLM-5.1-FP8' // one of catalog.models[].id
)
const headers = await broker.inference.getRequestHeaders(providerAddress)
await fetch(`${endpoint}/chat/completions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...headers },
body: JSON.stringify({
model, // the selected model
messages: [{ role: 'user', content: 'Hello!' }],
}),
})
The CLI mirrors this: 0g-compute-cli inference list-providers marks multi-model
providers, and 0g-compute-cli inference get-models --provider <addr> lists a
provider's models.
After obtaining a secret with 0g-compute-cli inference get-secret, use any OpenAI-compatible client:
import OpenAI from 'openai'
const client = new OpenAI({
baseURL: `${serviceUrl}/v1/proxy`,
apiKey: 'app-sk-<YOUR_SECRET>',
})
const completion = await client.chat.completions.create({
model: 'model-name',
messages: [{ role: 'user', content: 'Hello!' }],
})
0G Private Computer uses a two-tier account system:
# Check account balance
0g-compute-cli get-account
# Deposit to main account
0g-compute-cli deposit --amount 10
# Transfer to provider sub-account
0g-compute-cli transfer-fund --provider <PROVIDER_ADDRESS> --amount 5
# Request refund from sub-accounts (24-hour lock period)
0g-compute-cli retrieve-fund
# Withdraw to wallet
0g-compute-cli refund --amount 5
Customize AI models with your own data:
# List available providers
0g-compute-cli fine-tuning list-providers
# List available models
0g-compute-cli fine-tuning list-models
# Upload your dataset
0g-compute-cli fine-tuning upload --data-path ./my-dataset
# Create fine-tuning task
0g-compute-cli fine-tuning create-task \
--provider <PROVIDER_ADDRESS> \
--model distilbert-base-uncased \
--dataset <DATASET_ROOT_HASH> \
--config-path ./config.json \
--data-size <SIZE>
# Monitor progress
0g-compute-cli fine-tuning get-task --provider <PROVIDER_ADDRESS> --task <TASK_ID>
# Download and decrypt result
0g-compute-cli fine-tuning acknowledge-model --provider <PROVIDER_ADDRESS> --task-id <TASK_ID> --data-path ./model
0g-compute-cli fine-tuning decrypt-model --provider <PROVIDER_ADDRESS> --task-id <TASK_ID> --encrypted-model ./model --output ./model.zip
Service providers can manage their deployed containers and configurations remotely using the controller CLI.
# Reset saved endpoint configuration
0g-compute-cli controller reset-controller-endpoint
# View all container status
0g-compute-cli controller status
# Start/stop/restart specific containers
0g-compute-cli controller start --container broker
0g-compute-cli controller stop --container event
0g-compute-cli controller restart --container ingress
# Available containers: broker, event, ingress, prometheus-init, prometheus
The controller manages three types of configurations:
| Type | Description | Format |
|---|---|---|
core | Broker + Event shared config | YAML |
ingress | Nginx ingress environment variables | JSON |
prometheus | Prometheus monitoring config | YAML (auto base64 encoded) |
# Get configuration
0g-compute-cli controller get-config --type core --output config.yaml
0g-compute-cli controller get-config --type ingress
0g-compute-cli controller get-config --type prometheus --decode # decode base64
# Update configuration
# core: updates config AND restarts broker+event
0g-compute-cli controller update-config --type core --config config.yaml
# ingress: provide JSON file with env vars
# Example env.json: {"DOMAIN": "example.com", "PORT": "443"}
0g-compute-cli controller update-config --type ingress --config env.json
# prometheus: provide YAML file (auto base64 encoded)
0g-compute-cli controller update-config --type prometheus --config prometheus.yml
# Manage admin wallet whitelist
0g-compute-cli controller list-admins
0g-compute-cli controller add-admin --address 0x...
0g-compute-cli controller remove-admin --address 0x...
# Manage IP whitelist
0g-compute-cli controller list-ips
0g-compute-cli controller add-ip --ip 192.168.1.100
0g-compute-cli controller add-ip --ip 10.0.0.0/8 # CIDR supported
0g-compute-cli controller remove-ip --ip 192.168.1.100
# View current image info
0g-compute-cli controller image-info
# Pull latest image and recreate broker+event containers
0g-compute-cli controller update-images
| Network | RPC Endpoint |
|---|---|
| Testnet | https://evmrpc-testnet.0g.ai |
| Mainnet | https://evmrpc.0g.ai |
For browser environments, you'll need polyfills for Node.js built-in modules:
pnpm add -D vite-plugin-node-polyfills
// vite.config.js
import { nodePolyfills } from 'vite-plugin-node-polyfills'
export default {
plugins: [
nodePolyfills({
include: ['crypto', 'stream', 'util', 'buffer', 'process'],
globals: { Buffer: true, global: true, process: true },
}),
],
}
# Check which account needs funds
0g-compute-cli get-account
# Deposit to main account
0g-compute-cli deposit --amount 10
# Transfer to provider
0g-compute-cli transfer-fund --provider <ADDRESS> --amount 5
0g-compute-cli inference acknowledge-provider --provider <PROVIDER_ADDRESS>
0g-compute-cli ui start-web --port 3091
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
utilEnvironment{
"local_name": "util",
"alias": false,
"peer_metadata": null
} | ^0.12.5 | runtime |
axiosEnvironment{
"local_name": "axios",
"alias": false,
"peer_metadata": null
} | ^1.7.9 | runtime |
chalkEnvironment{
"local_name": "chalk",
"alias": false,
"peer_metadata": null
} | ^4.1.2 | runtime |
tslibEnvironment{
"local_name": "tslib",
"alias": false,
"peer_metadata": null
} | ^2.6.2 | runtime |
brotliEnvironment{
"local_name": "brotli",
"alias": false,
"peer_metadata": null
} | ^1.3.3 | runtime |
bufferEnvironment{
"local_name": "buffer",
"alias": false,
"peer_metadata": null
} | ^6.0.3 | runtime |
dotenvEnvironment{
"local_name": "dotenv",
"alias": false,
"peer_metadata": null
} | 16.4.7 | runtime |
adm-zipEnvironment{
"local_name": "adm-zip",
"alias": false,
"peer_metadata": null
} | ^0.5.16 | runtime |
eciesjsEnvironment{
"local_name": "eciesjs",
"alias": false,
"peer_metadata": null
} | ^0.4.13 | runtime |
expressEnvironment{
"local_name": "express",
"alias": false,
"peer_metadata": null
} | 5.1.0 | runtime |
promptsEnvironment{
"local_name": "prompts",
"alias": false,
"peer_metadata": null
} | ^2.4.2 | runtime |
commanderEnvironment{
"local_name": "commander",
"alias": false,
"peer_metadata": null
} | ^13.0.0 | runtime |
crypto-jsEnvironment{
"local_name": "crypto-js",
"alias": false,
"peer_metadata": null
} | ^4.2.0 | runtime |
form-dataEnvironment{
"local_name": "form-data",
"alias": false,
"peer_metadata": null
} | ^4.0.1 | runtime |
cli-table3Environment{
"local_name": "cli-table3",
"alias": false,
"peer_metadata": null
} | ^0.6.5 | runtime |
circomlibjsEnvironment{
"local_name": "circomlibjs",
"alias": false,
"peer_metadata": null
} | ^0.1.6 | runtime |
update-notifierEnvironment{
"local_name": "update-notifier",
"alias": false,
"peer_metadata": null
} | ^7.3.1 | runtime |
crypto-browserifyEnvironment{
"local_name": "crypto-browserify",
"alias": false,
"peer_metadata": null
} | ^3.12.1 | runtime |
stream-browserifyEnvironment{
"local_name": "stream-browserify",
"alias": false,
"peer_metadata": null
} | ^3.0.0 | runtime |
@ethersproject/bytesEnvironment{
"local_name": "@ethersproject/bytes",
"alias": false,
"peer_metadata": null
} | ^5.7.0 | runtime |
@ethersproject/keccak256Environment{
"local_name": "@ethersproject/keccak256",
"alias": false,
"peer_metadata": null
} | ^5.7.0 | runtime |
chaiEnvironment{
"local_name": "chai",
"alias": false,
"peer_metadata": null
} | ^4.3.7 | development |
mochaEnvironment{
"local_name": "mocha",
"alias": false,
"peer_metadata": null
} | ^10.2.0 | development |
sinonEnvironment{
"local_name": "sinon",
"alias": false,
"peer_metadata": null
} | ^19.0.2 | development |
eslintEnvironment{
"local_name": "eslint",
"alias": false,
"peer_metadata": null
} | ^9.30.1 | development |
openaiEnvironment{
"local_name": "openai",
"alias": false,
"peer_metadata": null
} | ^4.78.1 | development |
rollupEnvironment{
"local_name": "rollup",
"alias": false,
"peer_metadata": null
} | ^3.30.0 | development |
globalsEnvironment{
"local_name": "globals",
"alias": false,
"peer_metadata": null
} | ^16.3.0 | development |
js-sha3Environment{
"local_name": "js-sha3",
"alias": false,
"peer_metadata": null
} | ^0.9.1 | development |
ts-nodeEnvironment{
"local_name": "ts-node",
"alias": false,
"peer_metadata": null
} | ^10.9.1 | development |
typedocEnvironment{
"local_name": "typedoc",
"alias": false,
"peer_metadata": null
} | ^0.26.10 | development |
typechainEnvironment{
"local_name": "typechain",
"alias": false,
"peer_metadata": null
} | ^8.3.1 | development |
uglify-jsEnvironment{
"local_name": "uglify-js",
"alias": false,
"peer_metadata": null
} | ^3.17.4 | development |
@eslint/jsEnvironment{
"local_name": "@eslint/js",
"alias": false,
"peer_metadata": null
} | ^9.30.1 | development |
typescriptEnvironment{
"local_name": "typescript",
"alias": false,
"peer_metadata": null
} | ^5.6.2 | development |
@types/chaiEnvironment{
"local_name": "@types/chai",
"alias": false,
"peer_metadata": null
} | ^4.3.7 | development |
@types/nodeEnvironment{
"local_name": "@types/node",
"alias": false,
"peer_metadata": null
} | ^20.5.9 | development |
@types/mochaEnvironment{
"local_name": "@types/mocha",
"alias": false,
"peer_metadata": null
} | ^10.0.1 | development |
@types/sinonEnvironment{
"local_name": "@types/sinon",
"alias": false,
"peer_metadata": null
} | ^17.0.4 | development |
@types/brotliEnvironment{
"local_name": "@types/brotli",
"alias": false,
"peer_metadata": null
} | ^1.3.4 | development |
@types/adm-zipEnvironment{
"local_name": "@types/adm-zip",
"alias": false,
"peer_metadata": null
} | ^0.5.7 | development |
@types/expressEnvironment{
"local_name": "@types/express",
"alias": false,
"peer_metadata": null
} | ^5.0.2 | development |
@types/promptsEnvironment{
"local_name": "@types/prompts",
"alias": false,
"peer_metadata": null
} | ^2.4.9 | development |
@types/crypto-jsEnvironment{
"local_name": "@types/crypto-js",
"alias": false,
"peer_metadata": null
} | ^4.2.2 | development |
rollup-plugin-dtsEnvironment{
"local_name": "rollup-plugin-dts",
"alias": false,
"peer_metadata": null
} | ^6.1.1 | development |
typescript-eslintEnvironment{
"local_name": "typescript-eslint",
"alias": false,
"peer_metadata": null
} | ^8.36.0 | development |
@types/circomlibjsEnvironment{
"local_name": "@types/circomlibjs",
"alias": false,
"peer_metadata": null
} | ^0.1.6 | development |
@rollup/plugin-jsonEnvironment{
"local_name": "@rollup/plugin-json",
"alias": false,
"peer_metadata": null
} | ^6.1.0 | development |
@typechain/ethers-v6Environment{
"local_name": "@typechain/ethers-v6",
"alias": false,
"peer_metadata": null
} | ^0.5.0 | development |
@types/update-notifierEnvironment{
"local_name": "@types/update-notifier",
"alias": false,
"peer_metadata": null
} | ^6.0.8 | development |
@rollup/plugin-commonjsEnvironment{
"local_name": "@rollup/plugin-commonjs",
"alias": false,
"peer_metadata": null
} | ^28.0.1 | development |
@rollup/plugin-typescriptEnvironment{
"local_name": "@rollup/plugin-typescript",
"alias": false,
"peer_metadata": null
} | ^12.1.1 | development |
@rollup/plugin-node-resolveEnvironment{
"local_name": "@rollup/plugin-node-resolve",
"alias": false,
"peer_metadata": null
} | ^15.3.0 | development |
rollup-plugin-polyfill-nodeEnvironment{
"local_name": "rollup-plugin-polyfill-node",
"alias": false,
"peer_metadata": null
} | ^0.13.0 | development |
ethersEnvironment{
"local_name": "ethers",
"alias": false,
"peer_metadata": null
} | ^6.13.1 | peer |
crypto-jsEnvironment{
"local_name": "crypto-js",
"alias": false,
"peer_metadata": null
} | ^4.2.0 | peer |
circomlibjsEnvironment{
"local_name": "circomlibjs",
"alias": false,
"peer_metadata": null
} | ^0.1.6 | peer |
@types/crypto-jsEnvironment{
"local_name": "@types/crypto-js",
"alias": false,
"peer_metadata": null
} | ^4.2.2 | peer |
@types/circomlibjsEnvironment{
"local_name": "@types/circomlibjs",
"alias": false,
"peer_metadata": null
} | ^0.1.6 | peer |
Source distribution
{
"shasum": "667bf0ff324e59c6b17fc7f68cea46c0b3bedfc4",
"tarball": "https://registry.npmjs.org/@0gfoundation/0g-compute-ts-sdk/-/0g-compute-ts-sdk-0.8.4.tgz",
"fileCount": 1343,
"integrity": "sha512-73KtjKpAo/xkQCnFFkQVWUgpWyM5dqY6k3k+ylN7Mpqzqoqhm1fdQcUFg5loz524cbdrtS6DdRTameMMu4tm1Q==",
"signatures": [
{
"sig": "MEYCIQCtl/0WQSPsJVheYe+ymgFYvAL+rvyIW7bfNikui1GlpgIhAKP1TvPbjV6Wwah30gBa5ERihnnIeCfcvj8zG8b3iR78",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"unpackedSize": 63028210
}Shared repository data · GitHub
Observed since 20 Oct, 22:11 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:e4c8e707be2d7e927b97b089a856fab941aba24ac185219c2fe075da9d8aef64