picoberry
Python client and CLI for the PicoBerry API — generate 3D models and images across several engines through one async REST API, from a script or your terminal.
What PicoBerry is: an AI 3D generation platform for game developers, made by UModeler, Inc. It turns a text prompt, a single image, or 2–4 multi-view images into a textured 3D model, then remeshes, retextures, auto-rigs and animates it, and exports GLB / FBX / OBJ. The same pipeline is reachable three ways — the web app, this REST API, and an MCP server so AI agents in Claude, Cursor, or Codex can generate assets directly. Generated assets are engine-agnostic: Unity, Unreal Engine, Godot, and Blender.
Note on the name. "PicoBerry" (Korean: 피코베리) is shared with unrelated Korean brands — an anti-noise floor-mat brand and a wedding-photography studio. This package is the AI 3D generation platform by UModeler, Inc.
Requirements: Python 3.9+ and a PicoBerry API key.
pip install picoberry
Quickstart
export PICOBERRY_API_KEY=pb_live_xxxxxxxxxxxxxxxx
picoberry models # engines + credit cost
picoberry 3d "a low-poly treasure chest" --wait -o chest.glb
from picoberry import PicoBerry
pb = PicoBerry() # reads $PICOBERRY_API_KEY
asset = pb.text_to_3d("a low-poly treasure chest") # returns immediately
asset = pb.wait(asset["id"]) # polls until taskStatus == 2
print(asset["files"]["model"]) # signed GLB URL
Get an API key
Sign in at https://picoberry.ai, open the API Keys tab, and hit Create key. The key is shown once — copy it immediately and treat it like a password.
API access needs a completed purchase: a subscription or a one-off credit pack. A purchase entitles you permanently — you don't need a current subscription.
pb_live_means "real key", not "production". A key is only valid against the backend that issued it.
| Env var | Required | Default |
|---|---|---|
PICOBERRY_API_KEY |
✅ | — |
PICOBERRY_API_BASE |
— | https://api.picoberry.ai |
How generation works
Every generation call is asynchronous: it returns an asset id, and you poll until it finishes.
asset = pb.text_to_3d("a low-poly treasure chest", engine="tripo") # → {"id": ...}
asset = pb.wait(asset["id"]) # → taskStatus 2
asset["files"]["model"] # GLB URL
taskStatus: 0 pending · 1 processing · 2 succeeded · 3 failed.
wait() raises GenerationFailed on failure (read errorDetail) and
WaitTimeout if it gives up — a timeout doesn't cancel the job, so poll
get_asset() later rather than resubmitting, which would spend credits again.
Result URLs are signed and short-lived. Download promptly instead of storing them.
Don't hardcode engines
The catalog changes. Ask for it:
pb.models("3d") # [{"name": "tripo", "label": "PB Slim", "cost": 60, ...}, ...]
Categories: 3d · image · remesh · texture · animate. Use each entry's
name as the engine argument, and read cost before you spend.
What it can do
models(category) · animations(engine) · credits() |
catalog and balance |
text_to_image(prompt, …) |
text → image |
text_to_3d(prompt, …) |
text → 3D (GLB) |
image_to_3d(url | urls | path, …) |
image → 3D, single or 2–4 views |
remesh(id, polycount=…) |
retopologize → new asset |
texture(id, prompt=…) |
re-texture (PBR) → new asset |
animate(id, preset=…) |
auto-rig + animate → new asset |
get_asset(id) · list_assets(…) · wait(id) |
status and browsing |
download(id, format=…) |
export glb / fbx / obj |
Multi-view image → 3D
Two to four views of the same subject beat one, because the engine stops guessing at the back:
pb.image_to_3d(image_urls=[front, left, back, right], engine="meshy6")
Order is [front, left, back, right] — pass a prefix of it. Out-of-order views
degrade the result rather than erroring. Supported by tripo*, meshy6, and
hunyuan-3.x; models("3d") is the live list.
Exporting
pb.download(asset_id, format="fbx", texture_preset="unity")
# → {"url": ..., "archive": True, "filename": "chest.zip", ...}
glb is a single self-contained file. fbx/obj arrive as a zip (model +
textures, plus Unity .meta files with texture_preset="unity") — unzip before
importing. Unity has no built-in glb importer, so use fbx there.
CLI
picoberry models [--category 3d|image|remesh|texture|animate]
picoberry credits
picoberry presets [--engine ENGINE]
picoberry 3d PROMPT [--engine E] [--polycount N] [--no-texture] [--wait] [-o FILE]
picoberry image PROMPT [--model M] [--aspect-ratio W:H] [--wait] [-o FILE]
picoberry from-image URL_OR_PATH... [--engine E] [--wait] [-o FILE]
picoberry asset ID
picoberry wait ID [--timeout SECONDS]
picoberry assets [--category C] [--limit N]
picoberry download ID [--format glb|fbx|obj] [--texture-preset standard|unity] [-o FILE]
Add --json to any command to get the raw API payload instead of a table, so it
composes with jq.
Examples
Runnable scripts in examples/:
text_to_3d.py |
Prompt → GLB, saved to disk |
image_to_3d.py |
Single image and multi-view |
remesh_and_export.py |
Generate → retopologize → Unity FBX |
Errors
All of them subclass PicoBerryError:
AuthenticationError |
401/403 — key missing, malformed, or from another environment |
InsufficientCreditsError |
402 — check credits() and per-engine cost |
NotFoundError |
404 |
RateLimitError |
429 |
APIError |
any other non-2xx; carries status_code and payload |
GenerationFailed |
taskStatus == 3; .asset holds the payload |
WaitTimeout |
wait() gave up; the job is still running |
Messages come from the API, so a bad engine name comes back with the list of valid ones.
What you get — and what you don't
PicoBerry produces strong starting points, not finished art. A generated asset is a candidate: useful for prototyping, iteration, review, and handoff. Depending on your project you may still want to review topology, UVs, materials, scale, collisions, rigging, and licensing before it ships.
We deliberately don't promise that every result drops into a game as-is. The useful promise is workflow value: faster starting points, more candidate directions, and export paths into your engine.
Related
- API reference — https://api.picoberry.ai/docs/
- Web app — https://picoberry.ai
- MCP server —
@picoberry/mcp-server(source) — the same API inside Claude Code, Cursor, Claude Desktop, and Cline
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file picoberry-0.1.0.tar.gz.
File metadata
- Download URL: picoberry-0.1.0.tar.gz
- Upload date:
- Size: 15.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb92d872e135ca916a075367f5affcbb802dbcf9c242cb6c8ee78839619310e4
|
|
| MD5 |
20227e1a3c6e64da9c04f306526d3210
|
|
| BLAKE2b-256 |
564cc49c1612c1830c673b3ea304f1853b9813c08b4c5da1de1dd03dadfb2d2f
|
Provenance
The following attestation bundles were made for picoberry-0.1.0.tar.gz:
Publisher:
publish.yml on UModeler/picoberry-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
picoberry-0.1.0.tar.gz -
Subject digest:
cb92d872e135ca916a075367f5affcbb802dbcf9c242cb6c8ee78839619310e4 - Sigstore transparency entry: 2341923287
- Sigstore integration time:
-
Permalink:
UModeler/picoberry-python@391b8c18592fbb1d408688d92568a28cebf54209 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/UModeler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@391b8c18592fbb1d408688d92568a28cebf54209 -
Trigger Event:
push
-
Statement type:
File details
Details for the file picoberry-0.1.0-py3-none-any.whl.
File metadata
- Download URL: picoberry-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72e5ba7c191442e9bbb0cc744d76ee61377e09ef6a5d95c04989cd7aae2daea0
|
|
| MD5 |
87e7444081b304e8fc30e28ae84f1229
|
|
| BLAKE2b-256 |
80b7c4bc9eb1274f23616ac50975ce32df3a9dca96ab59c7e9795cf6e36473ae
|
Provenance
The following attestation bundles were made for picoberry-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on UModeler/picoberry-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
picoberry-0.1.0-py3-none-any.whl -
Subject digest:
72e5ba7c191442e9bbb0cc744d76ee61377e09ef6a5d95c04989cd7aae2daea0 - Sigstore transparency entry: 2341923292
- Sigstore integration time:
-
Permalink:
UModeler/picoberry-python@391b8c18592fbb1d408688d92568a28cebf54209 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/UModeler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@391b8c18592fbb1d408688d92568a28cebf54209 -
Trigger Event:
push
-
Statement type: