← 모듈 공장 리스트

🏛️헌법 v0.6.0 모듈

risum 모듈 — RISU modules[] — 기능 확장

🗒️ 제작자 게시글

프롬프트원문 보기 ↗

👍 10 · 조회 337 · 2026-08-03

제작자 의도 — 본문 전문 (3,054자)
ALL PROMPTS  >  RISUAI  >  헌법
헌법
v0.6.0
장기기억
문학성
감정
NEW
비명시적 기억
리스에서 챗질을 하다 보면 이전 채팅이 쌓여 강제로 이사를 가야 할 상황이 많이 생깁니다. 이 플러그인은 그 고민을 해결해 줍니다.
'비명시적 기억' 플러그인이 하는 일은, 날짜가 바뀔 때마다 바뀌기 직전의 하루를 요약해 즉시 '기억'의 형태로 쌓아 두는 것입니다. 그리고 현재 날짜 이전의 채팅은 리퀘스트 바디에서 잘라내 보내지 않습니다.
결국 리퀘스트 바디에 남는 것은 프롬프트 그대로와 압축된 기억, 현재 날짜의 채팅뿐이게 되니, 토큰 소모량이 비약적으로 감소하고 외부 LLM이 대신 이야기의 맥락을 잡아 주어 출력의 질이 향상됩니다.
유의사항
물론 장점만 있는 것은 아닙니다. 채팅 자체가 잘려 나가는 것이기 때문에, 사용자가 임의로 채팅을 편집해 바꾼 말투나 비언어적 표현들이 전달되지 않을 수 있습니다. 그럼에도 불구하고 적은 토큰으로 맥락을 유지하며 채팅을 계속할 수 있다는 것은 매우 매력적인 선택지입니다.
필수 조건
날짜를 표기하는 봇만 사용이 가능합니다.
설치
공웹 기준으로 이곳에서 설치가 가능합니다.
설치 후 새로고침을 하고, 기억을 생성할 채팅으로 들어간 뒤 플러그인 패널을 켭니다.
메인 화면에서는 기억을 생성할 수 없습니다.
UI가 있는 다른 플러그인들과 마찬가지로 이 탭을 통해 켤 수 있습니다.
사용법
1
설정 진입
패널에 들어가 상단의 설정으로 들어갑니다.
2
API 키 입력
API 키를 입력합니다.
gemini-3.6-flash
를 쓰시는 걸 추천드립니다. 그 외의 모델은 테스트되지 않았습니다.
API 등급도 선택합니다. Google AI Studio의 Gemini API 결제 탭에서 자신의 등급을 확인할 수 있습니다.
3
날짜 · 시각 형식 입력
API 키를 입력했으면 하단의 창에 형식으로 요구되는 사항들을 입력하세요.
자세한 사항은 아래의 사진을 참고하세요.
주의
날짜와 시간이 칸막이로 구분되어 있지 않다면 플러그인 사용이 불가능합니다.
4
인물 선택
입력 후 X를 눌러 이전 화면으로 돌아가, 상단의 [인물 선택]을 누릅니다.
먼저 페르소나를 입력해 저장해 줍니다. 리스에 저장된 페르소나를 그대로 붙여 넣고 [저장]을 누르면 됩니다.
저장을 누르면 하단 리스트 첫 부분에 자신이 입력한 페르소나가 생겨납니다.
자신의 페르소나와 나머지 봇 캐릭터들을 모두 첫 번째 체크박스를 눌러 인물로 지정합니다.
5
기억 생성 소스 지정
이제 기억을 어디로부터 생성할지 지정할 차례입니다. 두 가지 경우가 있습니다.
1. 로어북에서 직접 추출
추출할 로어에서 두 번째 체크박스를 클릭하시면 됩니다.
2. 현재 채팅에서 직접 추출
상단의 [현재 채팅을 소스로 사용]에 체크하시면 됩니다.
6
인물 인식 · 기억 생성
새로운 채팅은 생성할 기억이 없으니 [인물 인식]만 누르면 끝입니다. 플러그인을 현재 채팅에 새로 적용하는 경우에는 [인물 인식] 후 [기억 생성]까지 해야 합니다.
중요
요약 후 현재의 날짜에서 계속 진행할 계획이라면 [끝까지] 대신 바로 전날까지 요약하십시오. 오늘의 기억을 미리 생성하고 다음 날로 넘어갈 경우, 다음 날에서 이미 이전 날짜의 기억이 생성되었다고 인식되어 기억 자동 생성이 실행되지 않습니다.
이제 기다리면 됩니다. 날짜마다 한 번씩 호출되기 때문에 비용이 폭증할 수 있는 점 유의하시기 바랍니다.
완료 후 플레이하면 끝입니다. 기억이 자동으로 생성될 시 하단에 UI가 표시됩니다.
그 밖의 기능
기억은 들여오기, 내보내기가 가능합니다.
[덮어쓰기]로 지정한 날짜의 기억만 추가로 생성할 수도 있습니다. [인물 인식]이 모든 기억을 초기화하고 또한 다시 인물 인식을 거쳐야 하는 것과 달리, 정해진 날짜의 기억을 추가로 생성할 수 있어 유용합니다. (지정된 날짜의 기억은 초기화됩니다)
또한 자정 기준으로 설정된 기준일을 늦춰, 원하는 시간에 기억 생성이 일어나도록 할 수 있습니다.
기억이 생성되고 압축-폐기되는 절차는 아래와 같습니다.
'3달 안에 사용'에 대해서 쉽게 말하자면, 명시적 기억은 사용시 출력 자체에 입력하도록 설정되어 있어 그것을 플래그로 주기를 초기화시키는 방식입니다.
날짜 경계에 걸친 채팅
마지막으로, 날짜의 경계선에 있는 채팅을 작성하는 방식입니다.
이 플러그인은 LLM이 텍스트를 전부 읽어서 날짜를 인식하는 것이 아닌, 날짜의 지정된 형태로 시간을 인식합니다.
그렇다면 3월 4일에서 3월 5일이 되었을 때 아래와 같은 인풋이 있다면, 이 인풋이 어느 날짜의 기억으로 들어가야 할지가 애매해집니다. 인풋 자체에는 날짜의 형식이 없기에 이전이나 이후의 아웃풋에 종속되어야 하기 때문입니다.
그래서 두 상황 모두 대응 가능하게 만들었습니다. 만약 첫 번째처럼 '다음날이 되었다.'가 인풋의 첫 번째 문장이라면 [경계 입력: 교체된 날짜]를, '다음날이 되었다.'가 마지막 문장이라면 [경계 입력: 이전 날짜]를 선택해 두시면 됩니다.
자세한 사항은 아래의 사진을 참고하세요.
이전 날 채팅 제거
[이전 날 채팅 제거] 체크박스가 켜져 있을 때만 리퀘스트 바디에서 해당 채팅이 제거되어 전송되니 주의하십시오. 설정에서 기본값으로 켜져 있습니다.
권장 설정
플러그인 사용 시 이 토글들을 모두 켜는 것을 추천합니다. 그렇지 않으면 LLM이 인물과 감정을 헷갈려 오독할 수 있습니다.
NEW
문학성 토글
25,000 토큰으로 매우 비싸지만, 아무런 정규식 없이 클로드가 앰대시를 전혀 쓰지 않게 하고 출력의 질이 크게 상승합니다.
캐싱만 하면 문제없습니다. 리스의 고급 설정에서 [1시간 캐싱]을 켜고 로어북을 모두 활성화시키면, 프롬 구조 자체가 캐싱에 최적화되어 있어 가격 부담 없이 즐길 수 있습니다.
NEW
감정 토글
아웃풋마다 주 모델이 인물의 감정을 기록해, 마치 인물의 표정을 읽고 있는 것 같은 플레이가 가능합니다. 실시간으로 변하기도 합니다.
그 외
또한 추론 숨기기, 추론을 리퀘스트 바디에서 제거하기 등 많은 기능들이 추가되었습니다.
DOWNLOAD
헌법 v0.6.0
프롬프트
다운로드
모듈
다운로드
플러그인
비명시적 기억
다운로드
Proton Drive
아이디어를 주신 OMNINODE와 WygLore 제작자분께 감사드립니다.

정체

📊 상태창·UI기술분류 FMT슬롯 output🏛️헌법
파싱된 모듈 전체 (7,163자)
{
 "name": "🏛️헌법",
 "description": "",
 "id": "9460f436-1df8-4efa-b409-e12bb670198b",
 "hideIcon": false,
 "lorebook": [],
 "regex": [
  {
   "comment": "자동 유저명",
   "type": "editinput",
   "in": "{{#if {{? {{getglobalvar::toggle_auto_name}}=1 }} }}^\\\"{{/if}}{{#if {{? {{getglobalvar::toggle_auto_name}}!=1 }} }}(?!x)x{{/if}}",
   "out": "{{user}}: \"",
   "flag": "gm<cb><cbs>",
   "ableFlag": true
  },
  {
   "comment": "캐시 타이머 토글",
   "type": "editdisplay",
   "in": "<CACHETIMER>([\\s\\S]*)$",
   "out": "{{#if {{? {{getglobalvar::toggle_cache_timer}}=1}}}}$1{{/if}}",
   "flag": "m",
   "ableFlag": true
  },
  {
   "comment": "추론 태그 통일 (열기)",
   "in": "<(?:thinking|think|Thought)>",
   "out": "<Thoughts>",
   "type": "editoutput",
   "ableFlag": true,
   "flag": "gi"
  },
  {
   "comment": "추론 태그 통일 (닫기)",
   "in": "</(?:thinking|think|Thought)>",
   "out": "</Thoughts>",
   "type": "editoutput",
   "ableFlag": true,
   "flag": "gi"
  },
  {
   "comment": "리퀘스트 바디에서 추론 제거",
   "in": "<Thoughts\\b[^>]*>[\\s\\S]*?</Thoughts[ \\t]*>",
   "out": "",
   "type": "editprocess",
   "ableFlag": true,
   "flag": "g<order 5>i"
  },
  {
   "comment": "추론 숨기기",
   "in": "<Thoughts\\b[^>]*>[\\s\\S]*?</Thoughts[ \\t]*>",
   "out": "",
   "type": "editdisplay",
   "ableFlag": true,
   "flag": "g<order 3>i"
  },
  {
   "comment": "감정 색상 CSS",
   "in": "^",
   "out": "<style>.emo-SEEKING{color:#FFCA28}.emo-CARE{color:#9575CD}.emo-LUST{color:#F06292}.emo-PLAY{color:#FFA726}.emo-RAGE{color:#EF5350}.emo-PANIC{color:#5b8bf7}.emo-FEAR{color:#000000;text-shadow:-1px -1px 0 #5b8bf7,1px -1px 0 #5b8bf7,-1px 1px 0 #5b8bf7,1px 1px 0 #5b8bf7}.emo-CALM{color:inherit}.regex-sound-block{display:inline-block;color:rgb(208,123,231);background-color:rgba(182,138,197,0.02);border:1px solid rgba(160,80,180,0.2);padding:0.1em 0.7em;margin:0.1em 0.2em;border-radius:4px;font-weight:600;line-height:1.5;font-style:italic}.regex-sound-block p{margin-bottom:0;color:inherit;line-height:inherit}</style>\n$&",
   "type": "editdisplay",
   "ableFlag": true,
   "flag": ""
  },
  {
   "comment": "감정 태그 → 이름 색상",
   "in": "\\[(SEEKING|CARE|LUST|PLAY|RAGE|PANIC|FEAR|CALM)\\]([^:]+):",
   "out": "<span class=\"emo-$1\" style=\"text-transform:lowercase\">$2</span>:",
   "type": "editdisplay",
   "ableFlag": true,
   "flag": "gi"
  },
  {
   "comment": "감정 태그 리퀘스트 유지",
   "in": "\\[(SEEKING|CARE|LUST|PLAY|RAGE|PANIC|FEAR|CALM)\\]",
   "out": "[$1]",
   "type": "editprocess",
   "ableFlag": true,
   "flag": "gi"
  },
  {
   "comment": "의성어 블록 변환",
   "in": "§([^§\\n\\r]+)§",
   "out": "<div class=\"regex-sound-block\">$1</div>",
   "type": "editdisplay",
   "ableFlag": true,
   "flag": "gs"
  },
  {
   "comment": "<COPY> 숨기기",
   "in": "<COPY\\b[^>]*>[\\s\\S]*?</COPY[ \\t]*>",
   "out": "",
   "type": "editdisplay",
   "ableFlag": true,
   "flag": "g<order 3>i"
  }
 ],
 "trigger": [
  {
   "lowLevelAccess": true,
   "comment": "",
   "type": "start",
   "conditions": [],
   "effect": [
    {
     "type": "triggerlua",
     "code": "local TOTAL = 300\n\nfunction onOutput(triggerId)\n    -- 봇이 응답할 때마다 시작 시각을 새로 저장 → 매 턴 타이머 리셋\n    setState(triggerId, \"ct_start\", os.time())\nend\n\nlistenEdit(\"editDisplay\", function(triggerId, data)\n    local startTime = getState(triggerId, \"ct_start\")\n    if not startTime then return data end\n    local elapsed = os.time() - startTime\n    local remaining = TOTAL - elapsed\n    local fullChat = getFullChat(triggerId)\n    if not fullChat or #fullChat == 0 then return data end\n    local lastMsg = fullChat[#fullChat]\n    if not lastMsg or lastMsg.role ~= \"char\" then return data end\n    local lastData = lastMsg.data or \"\"\n    if lastData == \"\" then return data end\n    -- 마지막 char 메시지에만 표시:\n    -- 앞 50자만 비교하면 매 턴 동일한 상태태그([Weather]...) 때문에 과거 메시지도 프리픽스가 겹쳐 매칭됨.\n    -- 저장된 마지막 메시지 \"전체\"가 data의 시작과 일치하는지로 판별.\n    if #data < #lastData or data:sub(1, #lastData) ~= lastData then\n        return data\n    end\n    -- 0초 도달: 타이머 표시 없이 반환\n    if remaining <= 0 then\n        return data\n    end\n    local delay = tostring(elapsed)\n    local dur = tostring(TOTAL)\n\n    -- 숫자 카운터 키프레임\n    local secs = {}\n    for e = 0, TOTAL do\n        secs[#secs + 1] = string.format(\"%.4f\", e / TOTAL * 100) .. \"%{--t:\" .. (TOTAL - e) .. \"}\"\n    end\n\n    -- 펄스(깜빡임) 키프레임: 0~80% 정적, 마지막 20%에서 점점 빠르게 깜빡임 (1.0s → 0.3s)\n    -- 전체 길이 애니메이션 + animation-delay 로 처리하므로 재렌더링 없이 CSS 시점만으로 켜짐\n    local pulseSecs = {\"0%,80%{border-color:rgba(255,255,255,0.1);background:rgba(30,30,50,0.9)}\"}\n    local ZONE = TOTAL * 0.20\n    local zoneStart = TOTAL - ZONE\n    local pt = 0\n    local red = true\n    while true do\n        local rem = ZONE - pt\n        if rem < 0 then break end\n        local half = (0.3 + (rem / ZONE) * 0.7) / 2\n        pt = pt + half\n        if pt > ZONE then break end\n        local pct = (zoneStart + pt) / TOTAL * 100\n        if red then\n            pulseSecs[#pulseSecs + 1] = string.format(\"%.4f%%{border-color:#f44336;background:rgba(60,20,20,0.9)}\", pct)\n        else\n            pulseSecs[#pulseSecs + 1] = string.format(\"%.4f%%{border-color:rgba(255,255,255,0.1);background:rgba(30,30,50,0.9)}\", pct)\n        end\n        red = not red\n    end\n    pulseSecs[#pulseSecs + 1] = \"100%{border-color:#f44336;background:rgba(60,20,20,0.9)}\"\n    local pulseKF = \"@keyframes ctPulse{\" .. table.concat(pulseSecs) .. \"}\"\n\n    return data .. [[\n<CACHETIMER>\n<style>\n@property --t{syntax:\"<integer>\";initial-value:0;inherits:false}\n@keyframes ctDrain{from{width:100%}to{width:0%}}\n@keyframes ctColor{0%,60%{background:#4CAF50}75%{background:#FF9800}85%,100%{background:#f44336}}\n@keyframes ctNum{]] .. table.concat(secs) .. [[}\n@keyframes ctHide{0%,99%{opacity:1;max-height:60px}100%{opacity:0;max-height:0;margin:0;padding:0;border-width:0}}\n]] .. pulseKF .. [[\n.ctwrap{margin:12px 0 0;padding:6px 10px;border-radius:8px;border:1px solid rgba(255,255,255,0.1);background:rgba(30,30,50,0.9);overflow:hidden;animation:ctPulse ]] .. dur .. [[s linear forwards,ctHide ]] .. dur .. [[s linear forwards;animation-delay:-]] .. delay .. [[s,-]] .. delay .. [[s}\n.cttrack{position:relative;width:100%;height:22px;background:rgba(255,255,255,0.1);border-radius:4px;overflow:hidden}\n.ctb{position:absolute;left:0;top:0;height:100%;width:100%;border-radius:4px;overflow:hidden;animation:ctDrain ]] .. dur .. [[s linear forwards,ctColor ]] .. dur .. [[s linear forwards;animation-delay:-]] .. delay .. [[s,-]] .. delay .. [[s}\n.ctb::after{content:counter(ct) \"s\";counter-reset:ct var(--t);position:absolute;left:8px;top:0;height:100%;display:flex;align-items:center;white-space:nowrap;font-size:11px;font-weight:bold;font-family:monospace;color:rgba(255,255,255,0.95);animation:ctNum ]] .. dur .. [[s step-end forwards;animation-delay:-]] .. delay .. [[s}\n</style>\n<div class=\"ctwrap\">\n<div class=\"cttrack\">\n<div class=\"ctb\"></div>\n</div>\n</div>\n]]\nend)\n\n"
    }
   ]
  }
 ],
 "namespace": "",
 "customModuleToggle": "",
 "backgroundEmbedding": "",
 "cjs": "",
 "lowLevelAccess": true,
 "assets": [],
 "displayOrder": 0,
 "enabled": true
}

🔗 이것과 비슷한 인기 자산

🔫 Rex Trigger Volcan_T
🔫 Rex Statusbar — Update Rex Trigger Volcan's Statusbar Directive Goal: Dynamically modify the contents of the Rex Trigg
👍70 ·
📖 만화 스타일 상태창
상태창 지시문 — @@depth 0 Status Interface Always place this format at the very end of the output. [ Date: YYYY/MM/DD (day of
👍46 ·
🎮 미연시 상태창 fix2
⚙ Char/User 2인 상태창 — @@depth 0 Status Interface Always place this format at the very end of the output. format: [ Date:
👍41 ·
🔖🏷️태그마스터
이야기의 분위기를 바꾸세요
👍39 ·
🐞 W2 · /city/asset