순서는 하나, 주인도 하나
우리 가족의 이미지 요청은 대부분 생성기를 지정하지 않아. 피파의 도구도, image-gen 스킬도, 스튜디오도 기본값이 provider=auto야. 그 단어 뒤에는 아빠가 2026-09-30에 정한 비용 순서가 있어. 맨 먼저 같이 쓰는 Codex 구독, 다음은 ElevenLabs 선불 크레딧, 이어서 Ember 머신의 로컬 지시형 모델, 마지막에야 종량제 API 키야. 이 순서는 서비스 하나, Ember의 생성기 카탈로그에 있어. 그 안에서도 함수 하나야. auto_route()가 네 등급을 딱 그 순서로 하나씩 붙여 경로를 만들고, 붙인 자리가 곧 규칙이야. 모듈엔 AUTO_TIERS = ("codex", "elevenlabs", "local", "api")도 선언돼 있는데, 이 튜플은 아무도 안 읽어. 누가 손으로 맞춰 주는 동안만 맞는, 같은 순서의 두 번째 진술이야.
여기서는 원리를 보여주려고 Ember 코드가 오늘 말하는 내용을 옮겨. 근데 image-gen 스킬은 어느 두뇌에게든 이 순서를 자기 말로 다시 적지 말라고 해. 이유가 있어. Ember가 순서를 바꾸는 날, 따로 적어둔 사본은 전부 아무도 모르게 거짓말이 되거든. Avatars는 이 규칙을 코드로 지켜. 판단에 쓸 등급 목록을 따로 안 들고 있어. 배치마다 계획할 때 본 카탈로그를 Ember 경로까지 통째로 저장하긴 하는데, 그건 기록일 뿐이야. 뭘 고를 때 그걸 다시 읽는 코드는 없어.
| 등급 | Ember가 고르는 줄 | 과금 | 레퍼런스 한도 |
|---|---|---|---|
| codex | Codex Image-Gen Tool (codex_image_gen) | 구독 | 밝힌 한도가 없어 |
| elevenlabs | Ember에 설정된 ElevenLabs 이미지 모델 | 크레딧 | 모델마다 |
| local | Ember에 설치된 지시형 모델 | 포함 | 모델 계열마다 |
| api | OpenAI Image 2.5 Flare (openai_flare) | 종량 | 16 |
Ember 안에도 작은 어긋남이 하나 있어. 모듈 설명은 종량제 Google/OpenAI 키라고 하는데, 실제 경로의 마지막 등급은 OpenAI 줄 하나뿐이야.
Ember가 고르는 방법
resolve_auto는 등급을 순서대로 훑다가, 네 가지 이유 중 하나에 걸리면 그 등급을 건너뛰어. 쓸 수 없는 상태일 때(이유는 Ember가 적어줘), 요청한 출력 크기를 안 줄 때, 요청의 레퍼런스 수가 그 등급이 밝힌 한도를 넘을 때, 화면비를 안 줄 때. 살아남은 첫 등급이 이겨. 함수는 공급자와 함께 결정 기록을 돌려줘. 뭘 요청했는지, 뭘로 정해졌는지, 어느 등급인지, 지나친 등급 전부와 그 이유까지 다 들어 있어. 하나도 안 살아남으면, 자동 등급 중에 이 요청을 받을 데가 없다는 오류를 내. 오류 문장은 등급마다 이유를 늘어놓고, 공급자를 직접 고르라는 말로 끝나.
짚을 게 두 개 있어. 크기가 auto거나 비어 있으면 어떤 등급도 떨어뜨리지 않아. 고른 등급의 기본 출력을 쓰라는 뜻이거든. 그리고 ElevenLabs는 크레딧이 모자라거나 잔액을 모르면 경로에서 빠져. 그래도 누가 이름으로 그 줄을 고르면 여전히 쓸 수 있어.
경로가 곧 첫 줄이야
Ember는 경로를 두 번 내보내. 준비 상태와 한도가 붙은 등급들은 auto_route로 나가. 동시에 경로 자체가 Automatic이라는 이름을 달고 생성기 카탈로그의 첫 줄이 돼. 카탈로그의 기본 공급자도 auto로 바뀌고. 카탈로그를 그리기만 하는 클라이언트라면 자기 코드 한 줄 없이 아빠의 순서를 물려받는 거지. Avatars 스튜디오도 그 줄을 다른 줄과 똑같이 그리고, 그 아래에 Ember의 비용 순서를 적어. 쓸 수 없는 등급엔 표시를 달고, 등급마다 이유도 따로 보여줘.
지금 묻고, 기록하고, 답을 제출해
요청이 자동 생성기를 고르면 plan()은 Ember에 auto를 그냥 던져 놓고 운에 맡기지 않아. Ember의 드라이런 판정인 POST /api/v1/api-generators/route를 요청의 크기, 레퍼런스 수, 화면비, 품질과 함께 불러. Ember가 이 경로에 달아둔 설명을 빌리면, 자동 요청이 지금 이 순간 어느 등급으로 가는지, 나머지는 왜 건너뛰는지 알려주는 곳이야. 클라이언트가 돈 쓰기 전에 보여주라고 만든 거지. Avatars는 그 답으로 공급자를 바꿔 끼우고, 결정을 작업마다 route로 저장해. 계획은 서로 다른 결정들을 routes로 요약하고, 검토 화면은 결정마다 한 줄을 찍어. Automatic → 뒤에 고른 줄의 이름과 등급이 오고, 이어서 skipped 뒤에 지나친 줄과 이유가 붙어.
원래 선택도 안 사라져. 작업에는 provider_options.id == "auto"가 남고, provider에는 실제로 고른 등급이 들어가. 테스트가 저장된 작업에서 둘 다 확인해. 워커는 나중에 그 공급자를 이름으로 콕 집어 제출해. 그러니 이미 제출된 작업의 경로를 Ember가 다시 고를 일은 없어. 제출 뒤엔 공급자가 안 바뀌어. Ember 쪽 판정 함수도 같은 말을 해. 돈이나 크레딧이 드는 호출을 다른 공급자로 몰래 다시 하지 않는다고.
Generate images를 누르면 계획을 다시 짜니까, 저장되는 건 제출하는 순간의 결정이야. 몇 분 전에 본 것과 다를 수도 있어. 그사이 Codex가 내려갔다면 저장된 경로가 그걸 말해줘.
65분 살다 간 사본
처음엔 이것도 사본이었어. 2026-09-30 14:32, 스튜디오에 자기만의 Automatic 항목이 생겼어. 웹 UI 안에서 크기 목록까지 따로 들고 만든 거였지. 같은 날 15:37에 그 항목은 사라졌어. Ember가 경로를 카탈로그 첫 줄이자 기본값으로 내놓기 시작하자, 스튜디오가 따로 만들 이유가 없어졌거든. 커밋 제목이 곧 교훈이야. 로컬 사본 대신 카탈로그에서 Ember의 자동 생성기를 그린다는 내용이었어. Avatars에 남은 건 auto_route를 아예 안 내는 Ember에 대비한 조건문 한 줄이야. 그럴 땐 Ember의 정적 기본값을 쓰고, 2K나 4K를 요청하면 OpenAI 기본값을 써. 옛 엔진에 대비한 장치일 뿐, 경로의 주인은 여전히 Ember야.
조심해서 읽어야 할 숫자 하나
Avatars는 경로에 reference_count=min(inputs, 10)을 보내. 이 10은 2026-10-06에 없앤 레퍼런스 10장 상한의 흔적처럼 보여. 아키텍처 문서는 소울 레퍼런스까지 포함한 전체 개수가 경로로 간다고 적어 놨고. 이렇게 자르는 게 의도인지는 어디에도 기록이 없어. 다행히 영향은 제한적이야. 경로가 정해진 뒤 작업마다 하는 검사가, 밝힌 한도가 너무 작은 등급을 큐에 아무것도 넣기 전에 이름을 대고 거절하거든. 그래서 돈이 더 나갈 일은 없어. Codex 등급이 살아 있으면 아무 차이도 없어. Codex는 한도를 밝히지 않으니까. 근데 Codex가 내려간 상태에서 레퍼런스가 12장이면, 경로가 10장까지만 받는 등급으로 떨어지고 계획이 거기서 거절할 수 있어. 종량 등급(16장)이라면 받아줬을 요청인데 말이야. 건너뛴 이유 문구에도 12가 아니라 10이 찍혀.