에반게리온의 MAGI 시스템을 재현한 Tauri v2 데스크톱 앱을 만들어줘. 질문(提訴)을 넣으면 세 대의 MAGI가 각각 판단하고, 일부러 연출한 딜레이와 효과음을 거쳐 다수결로 決議(承認/否決/保留)를 낸다. 백엔드는 단순하게, 프론트엔드 완성도가 핵심이다.
openai/gpt-6-luna| 유닛 | 원작 설정 | 모델 | 연결 |
|---|---|---|---|
| MELCHIOR-1 | 科学者としての赤木ナオコ | Jev typesafe/jev-1.13 | OpenRouter Decisions API POST https://openrouter.ai/api/alpha/decisions |
| BALTHASAR-2 | 母としての赤木ナオコ | Laya (오픈소스, 로컬) | laya-serve → POST http://127.0.0.1:8000/v1/systemone |
| CASPER-3 | 女としての赤木ナオコ | GPT-6 Luna | OpenRouter Chat POST https://openrouter.ai/api/v1/chat/completions |
{model, state, questions}를 받아 타입이 있는 답과 보정된 확률을 돌려준다.
questions.verdict = {type:"choice", instructions:"<유닛 관점>: should this proposal be approved?", criteria:{approve, reject, conditional}}answers.verdict = {type:"choice", choice:"reject", probabilities:{approve:0.27, reject:0.68, conditional:0.05}, confidence}. score는 {score, legend, probabilities:{"0":..}}, noul은 {noul: 0~1}. 구버전은 distribution 필드를 쓰니 둘 다 파싱할 것.VERDICT: APPROVE|REJECT|CONDITIONAL, 이어서 180단어 이내 근거, 질문과 같은 언어로 답한다. CONDITIONAL로 도망가지 말고 단호하게 판단하라고 명시하고, 파싱은 관대하게(承認/否決/승인/반대 등도 인식).OPENROUTER_API_KEY 환경변수를 쓴다.보드와 기록에는 원본 이름(MELCHIOR-1 등)과 원작 설정 문구만 표시한다. 모델명, 코드네임, 제공자는 설정 화면에만 둔다.
CODE : 473 / FILE : MAGI_SYS / EXTENTION : 3023 / EX_MODE / PRIORITY. 심의마다 번호를 바꾸고 끝나면 집계를 표시.VOTE REJECT 否決 · 67.9% · 0.2s.SYNC 43.2% 진행 표시), 결과(承認 #45e38a, 否決 #ff3b2f, 保留 #ffb31a, 큰 명조 한자가 튀어나오듯 등장), 오류(어두운 바탕에 断絶), 오프라인. 결정 모델 유닛은 패널에 P = 0.679처럼 확률 표시.상단바(MAGI 로고, 가동 유닛 수, 시계, 음향 토글, SYS CONFIG) / 좌측 보드 / 우측 審議記録 패널(약 450px) / 하단 입력줄([提訴] 태그, textarea, 送信 버튼).
window.confirm()은 Tauri macOS 웹뷰에서 동작하지 않으니 절대 쓰지 말 것. 심의 중에는 비활성.議題を入力せよ, 빈 기록은 NO RECORD / 審議記録なし. "~하면 ~합니다" 같은 친절한 안내 문구는 쓰지 말 것.세 유닛을 병렬로 호출하되, 결과는 최소 딜레이(기본 4.5초)가 지나기 전에는 공개하지 않는다. 이후 도착 순서대로 약 1.1초 간격(약간의 무작위)으로 하나씩 공개하고, 集計中를 거쳐 決議를 낸다. 결의 규칙은 유효표의 과반. 오류나 오프라인 유닛은 표에서 제외하고, 유효표가 없으면 不能. 딜레이, 공개 간격, 타임아웃은 설정에서 조정.
애니메이션 원본 음원은 저작권 문제로 번들하지 말 것. Web Audio로 합성한 기본음을 넣는다: boot, submit, thinking(무작위 삑 루프), unit, approve(상승 화음), reject(톱니파 경보), error. 슬롯별로 사용자 음원(mp3/wav/ogg/m4a)을 LOAD해서 앱 데이터 폴더의 sounds/<슬롯>.<확장자>로 저장하고, 폴더를 열 수 있게 하고, 파일을 직접 넣어도 인식할 것. WebKit은 사용자 입력 전에는 오디오를 막으므로 첫 입력 때 AudioContext를 unlock할 것.
커맨드: magi_decide(System One POST, 원본 JSON 반환), magi_query(OpenAI 호환 chat), list_models, load_config/save_config(앱 설정 폴더에 JSON, 권한 600), load_sounds/save_sound/remove_sound/get_sounds_dir. 연결 실패, 타임아웃, HTTP 오류는 짧은 메시지(LINK DOWN, TIMEOUT, HTTP 401: ...)로 변환한다. 설정 파일에 version을 두고 구버전 유닛 설정은 버린다.
OpenRouter 키, 유닛별 설정(ENGINE, ONLINE, PROVIDER, 로컬 ENDPOINT/KEY, MODEL, TEMPERATURE는 chat일 때만, 페르소나 또는 판단 관점 문구), 심의 설정, 오디오 설정. TEST 버튼: 결정 유닛은 실제 noul 질문 한 번을 보내 확인하고, chat 유닛은 모델 목록에 해당 모델이 있는지 확인.
scripts/laya-serve.sh와 npm run laya: uv로 laya/.venv에 laya[serve]를 설치하고 LAYA_HOST=127.0.0.1로 실행(기본값 0.0.0.0은 쓰지 말 것).src/dev-mock.ts: Tauri 밖(npm run dev)에서 열리면 mockIPC로 가짜 응답을 돌려 브라우저만으로 UI를 확인할 수 있게. Jev/Laya와 같은 응답 형식을 흉내낸다.cargo tauri icon으로 생성. 창 크기 1480×920(최소 1100×700), 배경 검정.#[ignore], 로컬 Laya 대상).tsc --noEmit, cargo check, cargo test 통과laya-serve를 띄워 Rust 커맨드로 한국어 질문에 확률 응답이 오는지 확인npm run tauri dev로 실제 앱이 뜨는지 확인tauri dev를 돌리고 있을 수 있다. 포트 기준으로 프로세스를 죽이지 말고, 직접 띄운 PID만 정리할 것.
comments (0)