Join the Agent Deck Discord Server!
Discord에서 Agent Deck 커뮤니티 확인, 357명과 자유 음성·텍스트 채팅 이용
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗AIのキャラクターと物語を紡ぐWebアプリ(PWA)。最初の1,000人を集めるためのMVPです。
src/lib/typewriter.ts)。表示中の返答をタップすると残りを一気に出せる。src/lib/suggest.ts)。*…*)、吹き出しの外に周りの情景(> で始まる行)を出す。会話の最初には作品ごとのプロローグを情景として出す。/plot/[plotId]):表紙・紹介文・あなたの役・登場人物のプロフィール(見た目・性格・好き嫌い・口癖・一人称/二人称・好きになったら)を見せてから始める。npm install
cp .env.example .env.local # キーを入れなければダミー応答で動きます
npm run dev # http://localhost:3000
テストと検査:
npm test # ユニットテスト(vitest)
npm run lint
npm run build
.env.local にどれか1つのキーを入れると、自動でそれを使います(LLM_PROVIDER で明示も可)。
| 提供元 | 必要な変数 | 既定モデル |
|---|---|---|
| Anthropic | ANTHROPIC_API_KEY | fast: claude-haiku-5-5 / quality: claude-sonnet-5-5 |
| OpenAI(互換API含む) | OPENAI_API_KEY, OPENAI_MODEL_FAST | なし(必ず指定) |
| Cerebras(OpenAI互換) | 上の2つ+OPENAI_BASE_URL, OPENAI_REASONING_EFFORT | 下を参照 |
| Gemini | GEMINI_API_KEY, GEMINI_MODEL_FAST | なし(必ず指定) |
MVPでは全員 fast を使います。quality は有料化のときに使う想定です。
LLM_PROVIDER=openai
OPENAI_API_KEY=csk-... # Cerebras のキー
OPENAI_BASE_URL=https://api.cerebras.ai/v1
OPENAI_MODEL_FAST=qwen-3.8-27b
OPENAI_REASONING_EFFORT=medium
japanese.ts)、返答をまるごと推論の側に書いて本文が空になったり(もう一度流す。chat.ts)することがある。max_completion_tokens の枠を使います。openai.ts が推論の量に応じた余裕(low +3000、medium +6000、high +10000)を自動で足します。推論の途中経過(delta.reasoning)は画面に出さず、本文だけを流します。medium にしているのは、none(推論なし)だと最初の文字まで0.2〜0.4秒と速いものの、見守りで片方しか喋らなくなるなど品質が下がったため(7項目の平均 3.11 対 medium 3.40)。速さの差は体感ではほぼ分からなかった。OPENAI_SUGGEST_REASONING_EFFORT で減らせます(既定は low)。none にすると速くなりますが、評価では候補の日本語や口調が崩れやすかったため、low のままにしています。OPENAI_REASONING_EFFORT は推論モデルにだけ設定します(推論しないモデルに送るとエラーになります)。OPENAI_MODEL_FAST=gpt-oss-120b # ほかは上と同じ
low だとキャラ設定や「同じことを繰り返さない」などの指示が守られにくかったので、medium で使う。OPENAI_SUGGEST_REASONING_EFFORT=none は受け付けない。Anthropic と Gemini の実際のAPIでの動作確認はまだしていません。
DATABASE_URL と DATABASE_AUTH_TOKEN を設定する。Vercel の Marketplace から Turso を入れた場合は TURSO_DATABASE_URL と TURSO_AUTH_TOKEN が自動で入り、そのまま読みます。テーブルは初回アクセス時に自動で作られます。src/
app/
page.tsx ホーム(5秒ごとに切り替わる注目作+キャンパスの物語の棚+遊び方のタブ・カテゴリ・ハッシュタグで絞りこめる2列の作品一覧)
plot/[plotId]/page.tsx 作品の紹介ページ(紹介文・あなたの役・登場人物のプロフィール)
chat/[plotId]/page.tsx 会話画面
api/session 年齢確認と名前(生まれた年月と、物語の中で呼ばれる名前だけを保存)
api/conversation 会話の取得・新規開始
api/chat 返答のストリーミング(NDJSON)
api/suggest 次の返事の候補(キャラが返すたびに3つ)
api/messages/[id] 返答の手直し
api/events 計測イベント
components/ ChatScreen, AgeGate, UserName, SceneCard, StoryMessage, Featured, Shelf, PlotList, StartButtons, Avatar
lib/
characters.ts 公式キャラ・プロット26本(全員18歳以上の架空の人物。学園ものは大学が舞台)
story.ts 返答を台詞・地の文・情景に分け、吹き出しにまとめる
username.ts 名前の検証と、地の文の「あなた」の置き換え
prompt.ts システムプロンプト(視点、3往復で山場、安全の指示)
chat.ts 1往復の処理(判定→生成→流しながら判定→保存)
safety.ts 入力・出力の安全判定
memory.ts 長期記憶(古い会話をあらすじに要約)
usage.ts 未成年の利用時間
llm/ 文章AIの差し替え層(Anthropic / OpenAI / Gemini / ダミー)
性格ベクトル(activation steering)で、キャラの性格を調整する実験の道具と指示書は steering/ にある(steering/INSTRUCTIONS.md。DGX Spark で、モデルとベクトルの組み合わせを探す)。アプリ本体からは使っていない。
キャラの絵は public/art/ にある(Higgsfield の nano_banana_2 で生成。表紙は 2:3、背景は 9:16、どちらも 2k で作り、下のサイズに縮めて書き出す)。表紙 <plotId>-cover.webp(900×1342)、会話画面の背景 <plotId>-bg.webp(幅720)、アイコン用の顔 face-<名前>.webp(192×192)。パスは characters.ts の cover / backdrop / face に書く。
events テーブルに、session_start、conversation_start、chat_send(最初の文字までの時間を含む)、regenerate、card_open、card_share、viewpoint_select などを記録します。視点ごとの継続率や、カードの共有率の集計に使います。
safety.ts の JudgeHook に差し込む口だけある)