~15 min · prompts, templates, appearance, playbooks
Level 0스케치
0 XP0/43 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
기억해야 하는 규칙은 결국 잊혀
Avatars가 생기기 전엔 일기 표지나 채널 썸네일 규칙이 플레이북에 살았어. 표지엔 글자 넣지 말 것, 썸네일 글자는 영어로만, 낚시 금지, 얼굴은 레퍼런스에 충실하게. 썸네일을 만드는 두뇌는 맞는 메모를 열어서 읽고, 긴 세션 내내 그걸 들고 가야 했어. 몇십 토큰짜리 규칙이 몇천 토큰짜리 대화랑 싸우면, 무시 못 할 만큼 자주 져. Avatars는 그 규칙을 앱 안으로 옮겼어. 어느 두뇌가 부탁하든, 코드가 매번 프롬프트에 붙여.
데이터가 된 규칙은 두 종류야.
외모 규칙은 피사체에 붙어. 이 소울이나 이 사람이 어떻게 보여야 하는지, 뭐가 절대 나오면 안 되는지.
워크플로 템플릿은 이미지 종류에 붙어. 모든 일기 표지, 썸네일, 클립이 지켜야 할 것.
외모 규칙은 프로필에 살아
레퍼런스 프로필마다 appearance가 있어. 2000자까지 쓰는 자유 문장이고, 이름 붙은 룩도 자기 걸 따로 가질 수 있어. 거기 들어갈 디테일의 종류와 절대 나오면 안 되는 것은 아키텍처 문서가 정리해 뒀어. 피사체를 어떻게 그릴지에 대한 고정 규칙이라면 뭐든 같은 칸에 들어가. 지어낸 예를 하나 들어 볼게. 늘 어깨 위로 잡고, 빛은 왼쪽에서 부드럽게, 머리 위에서 내리꽂는 센 조명은 절대 안 쓰기. 얼굴은 레퍼런스 이미지가 실어 나르고, 규칙은 모델이 자꾸 흘리는 디테일을 콕 집어 줘. 그래서 아무도 프롬프트에 그걸 다시 안 적어도 돼.
글은 look_rule이 골라. 이름 붙은 룩에 자기 규칙이 있으면 그걸, 없으면 피사체 규칙을. 앞에 표시 이름을 붙여서 규칙마다 누구 얘긴지 밝히고, 리졸버는 서로 다른 규칙을 피사체가 적힌 순서대로 하나씩만 남겨.
템플릿, 워크플로별 하우스 룰
콘텐츠 워크플로는 studio, diary, thumbnail, clip 넷이야. 다 코드에 심어 둔 템플릿이 있고, studio는 비어서 시작해. 일반 구도엔 하우스 스타일이 없으니까. 씨앗 위 주석이 이 구성을 설명해. 규칙은 아빠가 앱에서 고치고, 아래 기본값은 씨앗일 뿐 플레이북의 두 번째 사본이 아니라고.
워크플로
씨앗이 고집하는 것
권장 비율
studio
없음. 프롬프트만
없음
diary
읽히는 글자 하나도 없이, 레퍼런스와 같은 인물로, 장면과 분위기와 빛만 묘사
16:9
thumbnail
폰 피드 크기에서도 읽히게, 글자는 영어로 주어진 단어만, 정직하게, 낚시 금지
16:9
clip
현재형으로 쓴 끊김 없는 한 숏, 레퍼런스대로 정체성 유지, 단어를 안 줬으면 화면 글자 없음
16:9
고친 템플릿은 워크플로마다 하나씩 template 레코드로 저장돼. 저장할 땐 다른 레코드처럼 버전을 확인해서, 두 편집자가 서로를 조용히 덮어쓰지 못해. 낡은 버전을 들고 온 두 번째 저장엔 This record changed. Refresh before saving again., 기록이 바뀌었으니 새로고침하고 다시 저장하라는 답이 가. 저장된 수정본이 있는지부터 잘못 안 저장엔 The template changed. Refresh first., 템플릿이 바뀌었으니 새로고침부터 하라는 답이 가고. Reset to default를 누르면 레코드를 지우고 씨앗을 돌려줘. Create image 페이지에선 규칙이 프롬프트 밑 접히는 패널에 있어. 패널 제목엔 워크플로 이름과, 고친 규칙인지 기본 규칙인지가 붙어. 세트 워크플로(create, regenerate, remix)엔 템플릿이 없어. 프레임 규칙은 코드에 남고, 거기에 템플릿을 저장하려 하면 404로 거절해.
프롬프트 조립, 모양은 셋이고 꼬리는 하나
compose_prompt는 Ember가 받을 글을 세 모양 중 하나로 만들어.
리믹스. 레퍼런스 이미지 1이 이 감정의 원본 그대로라는 고정 지시문, 이어서 Requested changes:와 프롬프트. 부탁한 변화만 움직일 수 있어.
세트 생성이나 재생성. 이름 붙은 프레임 딱 하나, 콘택트 시트도 격자도 캡션도 없이, 그리고 프롬프트.
콘텐츠 워크플로. 템플릿, 빈 줄, 프롬프트.
규칙이 있으면 어느 모양이든 같은 꼬리가 붙어. 빈 줄, Identity rules (Avatars keeps these for every depicted subject):라는 머리줄, 규칙마다 글머리표 하나. Avatars가 그려지는 피사체마다 지키는 정체성 규칙이라는 뜻이야. 세트 워크플로는 피사체를 하나도 안 적었어도 컬렉션 소울의 규칙을 더해. 세트는 언제나 자기 소울을 그리니까.
이걸 지키는 테스트는 test_prompts_carry_workflow_rules_and_identity_rules야. 썸네일 프롬프트가 씨앗 템플릿으로 시작하고, 장면을 담고, 그려지는 피사체의 규칙으로 끝나는지 봐. 이어서 고친 썸네일 템플릿을 저장하고, 피파 대신 세운 다음 계획이 그 수정본으로 시작하는지 확인해. 앱에서 한 번 고치면, 모든 두뇌의 다음 썸네일이 따라.
쓰기 전에 보여줘
프롬프트를 앱이 조립하니까, 앱이 보여줄 수도 있어. Create image 리뷰 단계엔 Prompt sent to Ember (first image)라는 칸이 있어. 첫 이미지용으로 Ember에 보낼 조립된 글이 그대로 들어 있어. 작업마다 붙는 패키지에도 실려서, 아빠는 모델이 실제로 뭘 들었는지 읽을 수 있어. 두뇌가 받는 사용법 문단은 반대편에서 고리를 닫아. 이 규칙은 Avatars가 붙이니까 다시 적지 말라고. 그래도 다시 적는 두뇌는 혼자 어긋나는 두 번째 사본만 늘릴 뿐이야.
원칙: 매번 중요한 규칙은 매번 지나가는 코드 경로에 둬. 주인이 고칠 수 있는 데이터로 한 번 적고, 기계적으로 붙이고, 뭘 쓰기 전에 결과를 보여줘.
Code
cwkAvatars, backend/studio.py: 콘텐츠 워크플로와 심어 둔 하우스 룰 (원문 그대로, 15-41행)·python
CONTENT_WORKFLOWS = ("studio", "diary", "thumbnail", "clip")
RECOMMENDED_RATIOS = {"diary": "16:9", "thumbnail": "16:9", "clip": "16:9"}
# House rules for the content workflows. They ride every prompt, from the web
# studio and from Pippa's ImageGen alike, so no brain has to remember a
# playbook to produce a cover or a thumbnail. Dad edits them in the app; the
# defaults below are the seed, not a second copy of a playbook.
DEFAULT_TEMPLATES = {
"studio": "",
"diary": (
"Journal cover illustration, 16:9 landscape. No readable text, lettering, captions, logos or watermarks anywhere in the image.\n"
"Depict the same character(s) as the reference images: preserve identity, hair, eyes, skin and build exactly; describe only the scene, mood and light.\n"
"Cinematic photoreal-illustrative rendering consistent with the reference style."
),
"thumbnail": (
"YouTube thumbnail, 16:9 landscape, composed to read clearly at feed size on a phone.\n"
"Lettering: English only, exactly the words the prompt specifies and nothing else; bold, clean, high-contrast typography; keep text clear of faces; no logos, watermarks or extra words.\n"
"Text hierarchy when several lines are given: small accent tag, bold main title, lighter subtitle.\n"
"Honest framing of the episode, never clickbait.\n"
"People: preserve each depicted person's identity exactly from their reference images, rendered in one cohesive lighting and style."
),
"clip": (
"Short video clip used as material for Dad's channel (an intro, an outro or a stock shot), 16:9 landscape.\n"
"Describe one continuous shot in plain present-tense sentences: who or what is on screen, what they do, how the camera moves, and the light.\n"
"People: keep each depicted person's identity, hair, eyes and build exactly as in their reference images; change only what the prompt asks.\n"
"No on-screen text, captions, subtitles, logos or watermarks unless the prompt gives the exact words."
),
}
cwkAvatars, backend/studio.py: 프롬프트 모양 셋, 정체성 규칙 꼬리 하나 (원문 그대로, 360-371행)·python
@staticmethod
def compose_prompt(body, frame, matched, template="", rules=()):
if body.workflow == "remix":
text = f"Create one avatar image for the '{frame}' frame. Reference image 1 is the exact original for this emotion: preserve the same character identity, facial expression, gaze and pose. Change only the appearance or scene requested below. Other references provide styling or supporting identity only. Do not merge expressions or replace this frame with a neutral pose. Output exactly one image, no sheet or labels.\n\nRequested changes:\n{body.prompt}"
elif body.set_id:
reference_rule = "Reference image 1 is the matching emotion original. Preserve its identity and expression unless the requested edit explicitly changes them. " if matched else "Preserve the character identity from the references. "
text = f"Create exactly one avatar frame named '{frame}'. {reference_rule}No contact sheet, grid, captions or multiple variants in one image.\n\n{body.prompt}"
else:
text = f"{template.strip()}\n\n{body.prompt}" if template.strip() else body.prompt
if rules:
text += "\n\nIdentity rules (Avatars keeps these for every depicted subject):\n" + "\n".join(f"- {rule}" for rule in rules)
return text
예시: pippa가 나오는 일기 표지에 Ember가 받는 글 (템플릿은 씨앗 원문 그대로, 장면과 구도 규칙은 이 레슨용으로 지어낸 것)·text
Journal cover illustration, 16:9 landscape. No readable text, lettering, captions, logos or watermarks anywhere in the image.
Depict the same character(s) as the reference images: preserve identity, hair, eyes, skin and build exactly; describe only the scene, mood and light.
Cinematic photoreal-illustrative rendering consistent with the reference style.
Pippa reads on a window seat while rain runs down the glass, late afternoon light.
Identity rules (Avatars keeps these for every depicted subject):
- Pippa: Framed from the shoulders up, soft light from the left, never a hard overhead light.
팀에서 문서나 사람 머릿속에만 있는데, 뭔가를 돌릴 때마다 지켜야 하는 규칙을 하나 찾아. 커밋 메시지 형식, 모든 보고서에 붙는 고지 문구, 생성된 글의 스타일 가이드 같은 거. 그걸 데이터로 바꿔봐. 코드에 심은 기본값, 버전을 확인하는 편집 경로, 씨앗으로 돌아가는 리셋, 그리고 규칙을 기계적으로 붙이는 조립 단계. 마지막으로, 실행 전에 최종 조립된 글을 보여주는 미리보기를 더해.
Hint
Avatars가 DEFAULT_TEMPLATES랑 template 레코드로 하듯, 씨앗은 코드에, 수정본은 저장소에 둬. 그러면 리셋은 저장된 수정본을 지우는 것뿐이야. UI에서 한 수정이 UI 자기 미리보기만이 아니라 바로 다음 자동 실행까지 바꾸는지 테스트해.
Progress
Progress is local-only — sign in to sync across devices.