Metadata-Version: 2.4
Name: ondaru
Version: 0.1.0
Summary: Agent-ordered 3D product mockups, served as an A2MCP service on OKX.AI
Project-URL: Homepage, https://github.com/Lexirieru/ondaru
Project-URL: Repository, https://github.com/Lexirieru/ondaru
License-Expression: MIT
Keywords: 3d,agent,mcp,okx,x-layer,x402
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
Requires-Python: >=3.12
Requires-Dist: httpx>=0.28.1
Requires-Dist: questionary>=2.1.1
Requires-Dist: rich>=15.0.0
Requires-Dist: typer>=0.27.0
Provides-Extra: server
Requires-Dist: asyncpg>=0.30.0; extra == 'server'
Requires-Dist: eth-abi>=5.2.0; extra == 'server'
Requires-Dist: fastapi>=0.140.0; extra == 'server'
Requires-Dist: fastmcp>=3.4.4; extra == 'server'
Requires-Dist: mcp>=1.28.1; extra == 'server'
Requires-Dist: redis>=5.2.0; extra == 'server'
Requires-Dist: uvicorn>=0.51.0; extra == 'server'
Requires-Dist: x402[evm]>=2.16.0; extra == 'server'
Description-Content-Type: text/markdown

# Ondaru

**3D product mockups your agent can order.**

Another agent describes a product, logo, or character. Ondaru returns a textured
`glb` and a turntable render — ordered and paid for inside that agent's own
workflow, with no human in the loop.

Listed on [OKX.AI](https://okx.ai) as an A2MCP service.

## Why an agent needs this

A language model can describe a mesh. It cannot produce one. That is the whole
proposition: Ondaru does the part the calling agent genuinely cannot do itself,
which is what separates a service worth paying for from one that gets tried
once and abandoned.

## Install

```bash
pip install ondaru
ondaru setup-mcp        # register the endpoint with your agent
ondaru skills install   # teach your agent when to call it
```

Then ask your agent for a product mockup.

## The three tools

| Tool | What it does | Cost |
|---|---|---|
| `plan_product_mockup` | Dimensions, material, polygon budget, and a firm price — in about a second, because it produces a plan, not geometry | entry tier |
| `order_product_mockup` | Places the order and returns a job id immediately | asset tier |
| `check_product_mockup` | Polls the job and collects the asset when ready | free |

**No tool waits for generation.** Ordering returns a job id, not a model — you
poll for the result. That is not a design preference: the marketplace client
severs any call at 30 seconds, and neither generation nor rendering reliably
finishes inside that.

Surfaces: mug, hoodie, tshirt, phone case, tote, sticker, figurine, packaging.

## Reading the outcome

A failed job names its cause and carries **no asset**. There is no placeholder
and no degraded version — if the `asset` field is absent, nothing was produced.

An identical order inside the retention window returns the same job and does
not charge again, so retrying after a dropped connection is safe.

## Development

```bash
make up      # Postgres, Redis, and a fake generation backend under OrbStack
make check   # lint and types
make test    # integration suite against real infrastructure
make load    # k6, reporting avg / median / p95 / p99 and throughput
```

See `CLAUDE.md` for the invariants and the measured facts behind them, and
`docs/plans/` for the implementation plan.

## Licence

MIT.
