zip 묶음 — 카드+모듈+이미지 동봉 — 풀어서 개별 임포트
조회 1841 · 2026-05-17
https://arca.live/b/characterai/171181679
최신버전 가이드북
✦ ─── RISUAI MODULE PATTERN ─── ✦
LUA · AXLLM · ASSET DELEGATION
Aux-Model Asset Output
IMPLEMENTATION GUIDE
캐릭터 이미지 & 상태창 출력을 보조 모델에 위임하는
검증된 Lua 구현 패턴 — 메인 모델은 내러티브만, 보조 모델은 후처리 JSON Patch
✦ by CANISTER ✦
✦ ─── ✦ ─── ✦
11
SECTIONS
05
CORE PATTERNS
07
PITFALLS
14
CHECKLIST
─── 가장 먼저 읽어주세요 ───
아래 내용 어려워 보여도 OK
md 파일 넣고 "해줘" 하면 끝
아래 기술 설명은 LLM이 참고하는 거예요.
당신이 이해할 필요 없습니다.
md 파일 다운받아 LLM에 첨부하고, 만들고 싶은 봇 정보만 자연어로 알려주면 됩니다.
1. 다운로드
md 파일 받기
(아래 DOWNLOAD)
2. LLM에 첨부
Claude·GPT·Codex
아무거나 OK
3. "해줘"
봇 정보 알려주고
"만들어줘" 한마디
예시 한 마디
"md 첨부했어. 우리 봇 캐릭터 A, B 있고
SFW emotion은 ... 야.
가이드대로 만들어줘.
"
↓ 더 자세한 사용법과 프롬프트 템플릿은
HOW TO USE 섹션
에 있어요 (스크롤)
───
───
CONTENTS
목차
01
왜 두 모델 분리인가
02
전체 아키텍처
03
토글 레이아웃
04
Lua 트리거 구조
05
5가지 핵심 패턴
06
리롤 버튼 규칙
07
strip_thinking + Fallback
08
Inline 폴백
09
함정과 주의사항
10
최소 스켈레톤
11
체크리스트
01
왜 두 모델 분리인가
캐릭터 봇이
<sometag="Character_emotion">
같은 이미지 태그를 출력해야 하는데, 메인 모델에 시키면 흔히 다음 문제가 생깁니다:
▸
잘못된 캐릭터 / 잘못된 emotion 출력
▸
아예 태그를 빼먹음
▸
asset list에 없는 hallucinated emotion 이름
▸
"태그 출력 방법" 가이드가 매 턴 프롬프트를 inflate
SOLUTION
메인 모델은
내러티브 + 대사만
쓰고, 보조 모델(
axLLM
)이 후처리 단계에서 태그를 삽입. 보조 모델은 완성된 내러티브를 보고 "어느 줄에 어떤 태그?" 만 답하면 되므로 훨씬 제약하기 쉽습니다.
02
전체 아키텍처
User prompt ──
┌────────────────────────────────────┐
│
MAIN MODEL
│
│
• 내러티브 & 대사
│
│
• (Main Mode) 태그도 직접 출력
│
└──────────────┬─────────────────────┘
▼
┌────────────────────────────────────┐
│
onOutput(id)
— Lua hook
│
│
1. 마지막 char 메시지 읽기
│
│
2. build_prompt: rules + chars +
│
│
numbered narrative
│
│
3.
axLLM(id, msgs)
→ JSON patches
│
│
4. apply_patches → setChat
│
└────────────────────────────────────┘
┌─── 수동 리롤 버튼 ───────────────────────────────┐
│
listenEdit("editDisplay") → 마지막 메시지 부착
│
│
onButtonClick → 같은 흐름 수동 실행
│
└──────────────────────────────────────────────────┘
03
토글 레이아웃
네임스페이스 prefix 하나 정해서 (
MYBOT_
등) 일관 사용:
=
My Bot Asset System=group
MYBOT_ASSET_MODE
=
에셋 출력=select=꺼짐,
메인 모델,
보조모델
MYBOT_STATUS
=
상태창=select=꺼짐,
메인 모델,
보조모델
MYBOT_NSFW
=
NSFW(on/off)
MYBOT_LIMIT
=
태그 제한=select=무제한,1개,3개,5개
=
My Bot Asset System=groupEnd
모드 타입
값 구성
특징
3-state
0=꺼짐 · 1=메인 · 2=보조
모듈 silently disabled 가능
2-state
0=메인 · 1=보조
단순. OFF는 모듈 자체 비활성
WARNING
모드 값 의미가 모듈마다 다름.
mode == "0"
이 OFF인지 메인인지 컨벤션 확인 후 게이트 작성.
04
Lua 트리거 구조
모듈은
단일 trigger
(type:
start
,
lowLevelAccess: true
) 안에 모든 Lua 통합:
-- ============ 봇별 Config (REPLACE) ============
local
SFW_EMOTIONS =
"smile, happy, sad, angry, ..."
local
NSFW_POSITIONS =
"kiss, embrace, ..."
local
CHARACTERS = {
{ prefix =
"Alice"
, emotions = SFW_EMOTIONS, ctype =
"main"
},
{ prefix =
"Bob"
, emotions = SFW_EMOTIONS, ctype =
"main"
},
}
local
KOR_TO_ENG = { [
"앨리스"
]=
"Alice"
, [
"밥"
]=
"Bob"
}
-- ============ Helpers ============
local function
number_lines
(content) ...
end
local function
strip_thinking
(raw) ...
end
local function
try_inline_fallback
(raw, original) ...
end
local function
apply_patches
(content, patches) ...
end
-- ============ Hooks ============
onOutput = async(
function
(id) ...
end
)
-- 자동 처리
onButtonClick = async(
function
(id, data) ...
end
)
-- 리롤
listenEdit
(
"editDisplay"
,
function
(id, data, meta) ...
end
)
-- 버튼 부착
05
5가지 핵심 패턴
우선순위 순
★ 최대 효과
5.1 Line-Number + JSON Patch
모든 내러티브 라인에 번호 붙이고, 보조 모델에게 JSON만 받기:
local function
number_lines
(content)
local
lines, n = {}, 0
for
line
in
(content ..
"\n"
):gmatch(
"([^\n]*)\n"
)
do
n = n + 1
lines[#lines+1] =
"["
.. n ..
"] "
.. line
end
return
table.concat(lines,
"\n"
), n
end
프롬프트 예시:
# Insert <mytag> tags. Output ONLY JSON array.
## Format
[{"line":5,"tag":"<mytag=\"Alice_smile\">"},
{"line":12,"tag":"<mytag=\"Bob_serious\">"}]
## Characters
- Alice (앨리스)
Emotions: smile, happy, sad, ...
## Narrative
[1] Alice walked into the room.
[2] "Bob, you're late again," she said with a frown.
...
apply_patches()
가 결정론적으로 N번 라인 앞에 태그 삽입. 보조 모델은 절대 내러티브를 다시 쓰지 않음 —
위치만
고름.
5.2 Dynamic Whitelist 주입
현재 토글에서 허용된 캐릭터/emotion만 프롬프트에 노출. NSFW OFF → NSFW 리스트 자체를 안 보이게. 모델이 모르는 옵션은 출력 못 함.
5.3 메인 Suppression 카운터 절
보조 모드(zip 455,441B · 원본 Download 2026-08-06T22-06-06-380Z.zip