Skip to content

Commit 3933fe6

Browse files
luoyigeluoyige
authored andcommitted
refactor(jiume): import codex pet avatars
1 parent 3bc0bfd commit 3933fe6

15 files changed

Lines changed: 732 additions & 3524 deletions

File tree

README.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,10 @@ What should happen:
5555
3. The JiuMe desktop avatar appears.
5656
4. You can click the avatar and send a one-line task.
5757

58-
No API key is required for the first local run. If you later want generated avatars or hosted model providers, add credentials in Setup or export:
58+
No API key is required for the first local run. Avatar art comes from a Codex pet package. Generate one with the local `hatch-pet` skill or download an existing Codex pet project, then import the folder or ZIP in Setup:
5959

6060
```bash
61-
export JIUME_OPENAI_API_KEY="..."
62-
export JIUME_OPENAI_BASE_URL="https://api.openai.com/v1"
63-
export JIUME_IMAGE_MODEL="gpt-image-2"
64-
export JIUME_IMAGE_PROVIDER="auto"
61+
.venv/bin/jiume-setup --pet ~/.codex/pets/my-pet --enable
6562
```
6663

6764
For a UI-only smoke test:

README_CN.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,10 @@ uv pip install -e ".[test]"
5555
3. JiuMe 桌面头像出现。
5656
4. 你可以单击头像并发送一句话任务。
5757

58-
第一次本地运行不需要 API Key。之后如果想接入生成头像或托管模型,可以在 Setup 里填写,也可以导出环境变量
58+
第一次本地运行不需要 API Key。头像资产来自 Codex pet 包:用本机 `hatch-pet` skill 生成,或下载现成 Codex pet 项目,然后在 Setup 里导入目录或 ZIP
5959

6060
```bash
61-
export JIUME_OPENAI_API_KEY="..."
62-
export JIUME_OPENAI_BASE_URL="https://api.openai.com/v1"
63-
export JIUME_IMAGE_MODEL="gpt-image-2"
64-
export JIUME_IMAGE_PROVIDER="auto"
61+
.venv/bin/jiume-setup --pet ~/.codex/pets/my-pet --enable
6562
```
6663

6764
如果只想离线查看头像 UI:

docs/en/JiuMe.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,15 @@ Manually set the avatar state while testing:
6969
.venv/bin/jiume-state sleep
7070
```
7171

72-
## Optional Image Provider
72+
## Avatar Pet Package
7373

74-
Image generation is optional. Without credentials, JiuMe still opens with local avatar assets.
74+
JiuMe does not generate avatar art in-app. Generate a Codex pet with `hatch-pet` or download an existing Codex pet package, then import its folder or ZIP:
7575

7676
```bash
77-
export JIUME_OPENAI_API_KEY="..."
78-
export JIUME_OPENAI_BASE_URL="https://api.openai.com/v1"
79-
export JIUME_IMAGE_MODEL="gpt-image-2"
80-
export JIUME_IMAGE_PROVIDER="auto"
77+
.venv/bin/jiume-setup --pet ~/.codex/pets/my-pet --enable
8178
```
8279

83-
Setup can persist these values to `~/.jiuwenswarm/jiume/config.env`.
80+
The package must contain `pet.json` and `spritesheet.webp`.
8481

8582
## Local Data
8683

docs/zh/JiuMe.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,15 @@ JiuMe 会把 Agent 过程映射成简单状态:idle、thinking、working、wai
6969
.venv/bin/jiume-state sleep
7070
```
7171

72-
## 可选图片服务
72+
## 头像 Pet 包
7373

74-
图片生成是可选能力。没有配置凭证时,JiuMe 仍会使用本地头像资产打开。
74+
JiuMe 不再在应用内生成头像。请用 `hatch-pet` 生成 Codex pet,或下载现成 Codex pet 包,然后导入目录或 ZIP:
7575

7676
```bash
77-
export JIUME_OPENAI_API_KEY="..."
78-
export JIUME_OPENAI_BASE_URL="https://api.openai.com/v1"
79-
export JIUME_IMAGE_MODEL="gpt-image-2"
80-
export JIUME_IMAGE_PROVIDER="auto"
77+
.venv/bin/jiume-setup --pet ~/.codex/pets/my-pet --enable
8178
```
8279

83-
Setup 也可以把这些值保存到 `~/.jiuwenswarm/jiume/config.env`
80+
包内需要包含 `pet.json``spritesheet.webp`
8481

8582
## 本地数据
8683

jiume/api/web_handlers.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ async def _handler(ws: Any, req_id: str, params: Any, session_id: str) -> None:
5353
def _job(job: DistillationJob) -> dict[str, Any]:
5454
return job.to_dict()
5555

56+
def _avatar_generation_removed(message: str) -> dict[str, Any]:
57+
raise ValueError(message)
58+
5659
channel.register_method(
5760
"twin.list",
5861
_wrap(lambda p: {"twins": store.list_twins(), "activeTwinId": store.get_active_twin_id()}),
@@ -68,16 +71,29 @@ def _job(job: DistillationJob) -> dict[str, Any]:
6871

6972
channel.register_method(
7073
"twin.avatar.upload_source",
71-
_wrap(lambda p: {"upload": avatars.upload_source(_twin_id(p, store), p)}),
74+
_wrap(lambda _p: _avatar_generation_removed("photo avatar generation was removed; import a Codex pet package")),
7275
)
7376
channel.register_method(
7477
"twin.avatar.generate",
75-
_wrap(lambda p: {"job": avatars.generate_avatar(_twin_id(p, store), str(p.get("provider") or "auto"))}),
78+
_wrap(lambda _p: _avatar_generation_removed("avatar generation was removed; import a Codex pet package")),
7679
)
7780
channel.register_method(
7881
"twin.avatar.job_get",
7982
_wrap(lambda p: {"job": avatars.get_job(_twin_id(p, store), str(p.get("job_id") or p.get("jobId") or ""))}),
8083
)
84+
channel.register_method("twin.avatar.list_pets", _wrap(lambda _p: {"pets": avatars.list_pets()}))
85+
channel.register_method(
86+
"twin.avatar.import_pet",
87+
_wrap(
88+
lambda p: {
89+
"job": avatars.import_pet(
90+
_twin_id(p, store),
91+
pet_id=str(p.get("petId") or p.get("pet_id") or "").strip() or None,
92+
source_path=str(p.get("sourcePath") or p.get("source_path") or "").strip() or None,
93+
)
94+
}
95+
),
96+
)
8197
channel.register_method(
8298
"twin.avatar.get_manifest",
8399
_wrap(lambda p: {"manifest": avatars.get_manifest(_twin_id(p, store))}),

0 commit comments

Comments
 (0)