After installation, use prompts such as:
Create a low poly knight in a front-view T-pose on white, then send it to Tripo.Generate every low poly asset needed for a soccer match.Use these example images to define the style, then prepare the asset for Tripo.Create a stylized horse for Tripo and download it as FBX.
Before the Tripo step, the reference image stays editable.
Expected behavior:
- generate the reference image first
- let the user request image changes
- revise the current image instead of jumping straight to Tripo
- ask for Tripo confirmation only after the current reference image is approved
Typical examples:
Make the saber teeth longerKeep the pose but make the fur darkerUse a more stylized low poly look
The plugin should not spend Tripo credits until the approved reference image is ready.
This repository stays plugin-only on purpose.
The skill is designed to keep the workflow inside Codex:
- use native Codex image generation for the reference image
- prefer the built-in Codex image tool (
imagegen/ Imagen) for that step - respond to the user in the user's language instead of forcing English prompts
- continue the same turn after the image is generated instead of stopping on the image alone
- use the current Codex tool environment for the next step
- call the official Tripo API directly
- avoid Playwright and browser automation for Tripo
- call the Tripo wallet endpoint before paid generation or conversion tasks when available
- ask for confirmation before launching Tripo 3D generation when the reference image is ready
- continue responding after the image tool call instead of stopping on the generated image alone
- continue directly to the Tripo API after the user confirms
- once the Tripo task starts, tell the user immediately and give a best-effort wait estimate before continuing to poll
- prefer the local
show_3d_asset_widgetMCP tool for preview - fall back to the local preview URL only if the widget tool is unavailable
If TRIPO_API_KEY is missing, the plugin should stop before the Tripo step and ask for setup.
Better fallback wording:
I can continue and do the full Tripo handoff if you paste your TRIPO_API_KEY here. If you do not have API access yet, use the official docs: https://platform.tripo3d.ai/docs/introduction and get your key here: https://platform.tripo3d.ai/api-keys
That wording should be localized to the user's language during the real conversation.
Recommended confirmation prompt:
- when a reliable estimate exists:
The reference image is ready. Do you want me to launch the Tripo 3D generation now? Estimated Tripo cost: <credits> credits (~$<usd>). - when no reliable exact estimate exists from the current official docs or workspace:
The reference image is ready. Do you want me to launch the Tripo 3D generation now? I do not have a verified exact per-task credit amount from the current official Tripo docs, so I will only proceed after your approval.
Recommended task-start wording:
- for a standard image-to-model path:
Tripo 3D generation started. Estimated wait: usually seconds for a standard single-image task. The current official Tripo API docs I could verify do not expose an exact ETA field, so this remains a best-effort estimate while I poll the task. - for a higher-detail, multi-view, or follow-up conversion path:
Tripo 3D generation started. Estimated wait: longer than the default single-image path because this request needs extra processing. The current official Tripo API docs I could verify do not expose an exact ETA field, so this remains a best-effort estimate while I poll the task.
I checked current official Tripo sources and verified two stable billing facts:
- new API keys start with 2,000 free credits
- additional API credits are priced at $0.01 each
I did not find a verified official per-task credit table in the currently accessible official sources, so the plugin should not invent an exact credit number when that information is unavailable.
I also did not find a verified exact API ETA field in the currently accessible official docs, so the plugin should not present a wait time as an exact server ETA. It should give a best-effort estimate instead.
When the Tripo wallet endpoint is available, the plugin should:
- retrieve the current balance before any paid task
- try the fallback wallet path candidates instead of assuming only one hard-coded route
- report the balance before asking for final approval
- tell the user to recharge if the balance is zero
- tell the user when the balance appears lower than a known estimate
- say clearly when the balance could not be verified
The plugin should support a download format choice for Tripo output.
- default format:
glb - additional API conversion formats:
fbx,gltf,obj,stl,usdz
Behavior:
- if the user does not specify a format, download
glb - if
AGENTS.mddefines a default download format and the user did not override it, use that format - if the user asks for another supported format, finish the generation task first, then run the Tripo
convert_modeltask - if the API returns a zip for the converted format, download the zip and report that file path
After a model is downloaded, the plugin should prefer the local preview widget in Codex.
The bundled viewer lives here:
viewer/index.html
Recommended flow:
- let the plugin bootstrap start the local server automatically
- save previewable files inside
outputs/ - read
.codex-runtime/viewer.jsonwhen present and use itsviewerUrlBaseandentryPath - build the viewer URL with
?model=/outputs/.../file.glb - let the viewer expose generated assets through its built-in dropdown and mini asset picker instead of showing a raw load-path field
- call
show_3d_asset_widgetwith that viewer URL when the widget tool is available - let the widget request fullscreen on mount and point its open-in-app target at the local viewer
- return the localhost URL as a Markdown link only when the widget tool is unavailable
- if the conversion output is a zip, extract it first and preview the first supported asset inside
Practical note:
- the widget is delivered through the plugin's local MCP server, not through Playwright
- the local viewer server is delivered through the plugin's Node bootstrap, not through Python
- the widget can ask the host for fullscreen with
window.openai.requestDisplayMode(...), but the host still decides whether to grant that request - the widget also sets the host open-in-app target to the local viewer URL
The local viewer is intended for:
glbgltffbxobjstlusdz