Files
tripocli/AGENTS.md
T
Mrpzx 977f97995a tripocli v2.0.0:Tripo AI 3D 生成与加工 CLI(面向 Agent 与开发者,纯 Python 标准库、零第三方依赖)
覆盖文生 3D、图生 3D、多视图、批量生成,以及重拓扑、绑定、动画、智能分割、
纹理、PBR、智能 UV、部件补全、格式导出与下载。

代码组织:一个功能一个模块(tripo/features/),入口薄壳 tripocli.py。
2026-10-13 19:22:54 +08:00

136 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md
给接手这个项目的 AI Agent / 开发者看的说明。**要做任何事之前先读完本文件。**
---
## 1. 这是什么
`tripocli` —— 把 Tripo AI 的 3D 生成与加工能力封装成命令行工具,供 Agent 与开发者调用。
纯 Python 3 标准库,**零第三方依赖**。
覆盖能力:文生 3D、图生 3D、多视图、批量生成,以及重拓扑、绑定、动画、智能分割、纹理、PBR、
智能 UV、部件补全、格式导出与下载。
## 2. 代码结构(重要约定)
**一个功能 = 一个文件。** 新增能力不要往单个大文件里塞。
```
tripocli.py # 入口薄壳(只有十几行)
tripo/
├── cli.py # argparse 装配 + 分发 + 错误处理
├── client.py # HTTP:请求头、重试、凭据解析、轮询、下载
├── auth.py # cookie → JWT(纯 HTTP)
├── accounts.py # 多账号凭据存储
├── config.py # 全局设置(API 地址 / device id)
├── s3.py # SigV4 直传
├── server.py + web/ # tripocli serve(本地账号管理页)
├── update.py # 自我更新(tripocli update)
└── features/ # 每个功能一个模块
```
新增一个命令的标准做法:
1. 在 `tripo/features/` 下新建 `xxx.py`;
2. 模块里定义 `NAME`、`HELP`、`add_arguments(parser)`、`run(ctx)`(多子命令的模块改用 `register(subparsers)`);
3. 在 `tripo/features/__init__.py` 的 import 和 `MODULES` 列表里各加一行;
4. 用真实请求验证后再交付。
## 3. 安装
```bash
cd <项目目录>
pip install . # 装成全局命令
pyenv rehash # ← pyenv 用户必须执行,否则报 tripocli: command not found
```
不想安装也可以直接用项目里的入口:`<项目目录>/tripocli --version`。
> 若 `pip install .` 报 `invalid command 'bdist_wheel'`,说明环境缺打包后端,执行 `pip install wheel` 后重试。
> (`tripocli` 本体零依赖,这只影响安装过程。)
## 4. 更新(本节是「更新怎么做」的唯一依据)
**首选:一条命令。**
```bash
tripocli update # 从记住的源码目录重装全局 CLI(pyenv 会自动 rehash)
tripocli update --check # 只看状态:源码目录 / 已安装版本 / 是否需要更新
tripocli update --dry-run # 只打印将执行的命令
tripocli update --from <项目目录> # 首次指定源码目录(会记住,之后不用再传)
```
改完源码后跑一次 `tripocli update`,全局命令就更新到最新。
源码目录首次自动识别(运行 `tripocli` 时所处的项目目录),并记录在
`~/.tripo/config.json` 的 `install_source`。
### 4.1 手工方式(等价,update 不可用时)
```bash
cd <项目目录>
git pull # 若有 git 仓库
pip install . && pyenv rehash # 重新安装
```
只拿到新目录/压缩包(未用 git)时:用新目录**整体覆盖**旧目录,再执行上面的安装命令;
如果一直是「直接用项目里的入口」的方式,覆盖完即生效,无需安装。
### 4.2 更新后必须做的验证
```bash
tripocli --version # 版本号是否为预期
tripocli account list # 凭据是否仍在(在 ~/.tripo/accounts.json,更新代码不会动它)
tripocli balance # 能否正常调通接口
```
### 4.3 两个容易踩的坑
- **副本优先级**:在项目目录内执行 `tripocli` 会优先用**项目里的代码**(cwd 优先);
在其它目录执行才用 `pip` 装的那份。所以「更新后行为没变」多半是在项目目录里跑到了旧副本,或没重新安装。
- **pyenv rehash**:装/卸命令后不 `rehash`,pyenv 的 shim 找不到新命令(`tripocli update` 会自动做)。
## 5. 凭据
凭据在 `~/.tripo/accounts.json`(权限 600),与代码分离,**更新代码不会丢失**。
只需一次浏览器 cookie,CLI 自行续期 15 分钟的 JWT(cookie 约 30 天有效)。
```bash
tripocli account add --cookie "ory_kratos_session=..."
tripocli account list
tripocli serve --open # 网页版账号管理
```
多账号时默认会在「当前账号额度不足」时自动切换下一个账号重试;如需关闭,传 `--no-fallback`(或设 `TRIPO_AUTO_FALLBACK=0`)。
**永远不要把 cookie / token 写进代码、文档或提交记录。**
## 6. 验证改动(真实调用,不要只做静态检查)
```bash
tripocli --json balance # 最快连通性检查
tripocli --json text -p "a wooden crate" --smart-mesh --wait -o /tmp/t.glb
tripocli --json project <project_id> # 拿 model_url
```
注意:后处理算子(remesh/rig/pbr/texture/uv…)会为项目新建 operator,
**同一项目必须等上一个算子 `success`** 才能提交下一个,否则报 `2021`。
## 7. 构建游戏场景与 3D 应用的性能与工程红线(必读)
当用户要求用 `tripocli` 生成资产并搭建游戏场景(Web Three.js / Godot / Unity)时,必须遵守以下已验证规范:
1. **严禁把未减面的 200 万面默认高模直接批量塞进场景**:
- 生成场景建筑/树木/道具时优先加 `--face-limit 15000` 或 `--smart-mesh` 从源头控制面数;
- 对已下载的高模做本地减面时,**不要只跑 `gltf-transform optimize`**(其默认 `--simplify-error 0.0001` 过严,几乎不减面,只做 Draco 压缩,解压后显存里仍是七八十万面/个);必须显式执行 `npx gltf-transform simplify in.glb tmp.glb --ratio 0.025 --error 0.06 && npx gltf-transform draco tmp.glb out.glb`(角色蒙皮网格用 `--ratio 0.12 --error 0.02`)。
2. **严禁在 `normalize` 后用 `position.set(x, 0, z)` 覆盖 `position.y`**:
- Tripo 模型原点在几何中心,必须用外层 `Group` 包装后再设 `(x, groundY, z)`,否则所有建筑和树木会半截埋入地下。
3. **骨骼动画**:`animate` 产出的 GLB 在 `project.operator.retarget[]` 中,且只含骨骼轨道不含 Mesh,需与 `rig` 本体模型合并播放;测量 `SkinnedMesh` 高度时必须用 `isBone` 的世界坐标而非默认 `Box3.setFromObject`。
4. **文生图额度保护**:`tripocli img` 默认 `--amount 1`(一次一张),除非用户明确要求多张,否则不要调高。
## 8. 建议的下一步(尚未做,需项目所有者决定)
1. `git init` + 首次提交,推到私有仓库 → 更新变成 `git pull`;
2. 需要对外分发时发布到 PyPI → 别人可用 `pip install -U tripocli`(当前该名字在 PyPI 上未被占用);
3. 接口契约见 `TRIPO_API_SPEC.md`;命令说明见 `README.md`。