Vai al contenuto principale
Un agente AI che controlla un wallet su Base può generare la propria API key Venice senza intervento umano. L’agente acquisisce VVV, ne effettua lo staking, firma un token di validazione a breve durata emesso da Venice e invia il token firmato per ricevere una nuova API key associata al wallet di staking. Questa guida illustra l’intero flusso end-to-end e copre le opzioni di finanziamento per pagare effettivamente l’inferenza una volta generata la chiave.

Prerequisiti

  • Un wallet EVM su Base controllato dall’agente (chiave privata in una variabile d’ambiente o in un secret manager).
  • Una piccola quantità di ETH su Base per il gas (lo staking richiede due transazioni: approve poi stake).
  • Qualsiasi quantità non zero di VVV in staking. L’endpoint di minting richiede solo che il wallet abbia un saldo sVVV non zero, quindi 1 VVV è sufficiente per generare una chiave. Consulta Pagare l’inferenza per ciò che ti serve per chiamare effettivamente gli endpoint a pagamento.
Usa un wallet dedicato per l’agente piuttosto che un wallet di tesoreria. La chiave privata del wallet firma ogni richiesta di token Venice, quindi il suo blast radius dovrebbe essere piccolo.

Passaggi

1

Acquisisci VVV

Invia VVV al wallet dell’agente, o fai eseguire all’agente uno swap su un DEX come Aerodrome o Uniswap.Contratto del token VVV su Base: 0xacfE6019Ed1A7Dc6f7B508C02d1b04ec88cC21bf
2

Effettua lo staking di VVV con Venice

Esegui lo staking dei VVV nello smart contract di staking Venice all’indirizzo 0x321b7ff75154472B18EDb199033fF4D116F340Ff. Sono due transazioni:
  1. approve(spender, amount) sul token VVV, dove spender è il contratto di staking.
  2. stake(amount) sul contratto di staking.
Smart Contract Staking
Quando la seconda transazione viene confermata, il saldo VVV del wallet diminuisce e il suo saldo sVVV aumenta della stessa quantità. L’endpoint di minting legge il saldo sVVV per confermare che il wallet ha effettuato lo staking.
3

Richiedi un token di validazione

Chiama GET /api/v1/api_keys/generate_web3_key per ottenere un token a breve durata firmato da Venice. L’endpoint non è autenticato.
curl --request GET \
  --url https://api.venice.ai/api/v1/api_keys/generate_web3_key
La risposta contiene un campo token. Il token scade 15 minuti dopo l’emissione, quindi firmalo e invialo ben prima.
4

Firma il token con il wallet di staking

Firma la stringa raw del token con il wallet che detiene i VVV in staking. Si tratta di un personal_sign standard sui byte del token. Sia ethers.Wallet.signMessage(token) sia account.signMessage({ message: token }) di viem producono la firma corretta.
5

Genera l'API key

Esegui POST con address, signature e token allo stesso endpoint, insieme al tipo di chiave che desideri.
curl --request POST \
  --url https://api.venice.ai/api/v1/api_keys/generate_web3_key \
  --header 'Content-Type: application/json' \
  --data '{
    "address": "<wallet address>",
    "signature": "<signed token>",
    "token": "<unsigned token>",
    "apiKeyType": "INFERENCE",
    "description": "Agent key minted on <date>"
  }'
Campi obbligatori: address, signature, token, apiKeyType (INFERENCE o ADMIN).Campi opzionali: description, expiresAt, consumptionLimit (limita la spesa totale su questa chiave, in usd, vcu o diem).In caso di successo, la risposta contiene la stringa apiKey generata. Conservala nel secret store dell’agente e usala come un normale Bearer token (Authorization: Bearer <key>).

Esempio end-to-end

L’esempio qui sotto usa un wallet reale da una variabile d’ambiente piuttosto che uno generato casualmente. Un wallet casuale non ha VVV in staking e il minting verrà rifiutato con l’errore Wallet has no staked VVV on Base.
import { ethers } from "ethers"

const wallet = new ethers.Wallet(process.env.WALLET_PRIVATE_KEY!)
const address = wallet.address

const tokenResponse = await fetch("https://api.venice.ai/api/v1/api_keys/generate_web3_key")
const { data: { token } } = await tokenResponse.json()

const signature = await wallet.signMessage(token)

const mintResponse = await fetch("https://api.venice.ai/api/v1/api_keys/generate_web3_key", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    address,
    signature,
    token,
    apiKeyType: "INFERENCE",
    description: "Agent key",
  }),
})

const result = await mintResponse.json()
if (!mintResponse.ok) {
  throw new Error(`Mint failed: ${result.error}`)
}

console.log("Minted key:", result.data.apiKey)

Riferimento errori

L’endpoint restituisce messaggi di errore specifici e azionabili. Mappali nell’agente in modo che possa decidere se ritentare, richiedere un nuovo token o fermarsi.
StatoIl messaggio di errore contieneSignificatoCosa fare
400Invalid wallet addressIl campo address non è un indirizzo EVM valido.Correggi l’indirizzo e reinvia.
400JWT has expiredIl token di validazione è scaduto prima che tu lo firmassi e lo inviassi.Richiedi un nuovo token, firmalo e invialo immediatamente.
400JWT signature is invalidIl token non è stato firmato da Venice (probabilmente manomesso o fabbricato).Usa sempre un token nuovo dall’endpoint GET.
400JWT claims are invalidL’issuer o l’audience del token non corrispondono a ciò che Venice si aspetta.Usa il token non modificato restituito dall’endpoint GET.
400JWT is malformedIl token inviato non è un JWT.Assicurati di inviare la stringa token esatta restituita dall’endpoint GET.
400Wallet signature does not matchLa signature non corrisponde all’address per il token fornito.Firma i byte raw del token con il wallet che possiede address.
400Could not verify wallet signatureLa chiamata RPC per verificare la firma è fallita (transitoria).Ritenta con backoff.
400Wallet has no staked VVV on BaseIl wallet ha saldo sVVV pari a zero.Effettua prima lo staking di VVV, poi ritenta.

Pagare l’inferenza

Generare una chiave e poter chiamare gli endpoint a pagamento con essa sono due cose distinte. Una chiave appena generata si autentica correttamente ma non può chiamare gli endpoint a pagamento (come /chat/completions) finché l’account del wallet non ha un saldo spendibile. La chiave generata può spendere dall’account utente in questo ordine di priorità: DIEM, poi crediti in bundle, poi USD.
Fonte di finanziamentoAutonoma?Come
DIEM dallo staking VVVL’allocazione giornaliera di DIEM del wallet è proporzionale alla sua quota nel pool di staking. L’account ha bisogno di almeno 0,1 DIEM in staking perché qualsiasi DIEM sia spendibile. Stake maggiori guadagnano proporzionalmente più DIEM giornalieri, aggiornati ogni epoca (00:00 UTC).
USD via StripeNo (browser)Accedi a venice.ai con lo stesso wallet (Sign-In-With-Ethereum). La dashboard trova il record utente esistente. Aggiungi crediti in Settings, API.
Abbonamento crypto CoinbaseNo (browser)Stesso sign-in con il wallet, poi sottoscrivi tramite la dashboard. Il flusso reindirizza a Coinbase Commerce per il pagamento effettivo, quindi non può essere guidato da uno script.
Onramp CoinbaseNo (browser)Stesso sign-in con il wallet, poi usa il widget di onramp nella dashboard. Ospitato sulla UI di Coinbase.
Se l’agente ha bisogno di un percorso di finanziamento completamente crypto-native e headless, le opzioni più pulite sono:
  1. Effettuare lo staking di più VVV in modo che l’allocazione giornaliera di DIEM copra la spesa dell’agente. La chiave generata lo riconosce automaticamente.
  2. Usare il flusso wallet x402 al posto dell’API key. Con x402 l’agente firma un messaggio Sign-In-With-X per richiesta, ricarica direttamente con USDC su Base o Solana tramite POST /api/v1/x402/top-up e paga per richiesta. Il saldo USDC x402 è legato al wallet, non all’utente, quindi non appare come saldo per la Bearer key generata, ma consente allo stesso wallet di pagare l’inferenza in modo programmatico.

Risorse correlate

Crypto e agenti

Usa Venice sia come provider di modelli sia come layer RPC blockchain per agenti autonomi.

Autenticazione wallet x402

Paga per richiesta con USDC su Base o Solana, senza API key.

Endpoint Generate Web3 API Key

Riferimento dell’endpoint di minting.

Guida API key standard

Per gli utenti che preferiscono generare una chiave dalla dashboard.