DISCORD_TOKEN=your_bot_token_here DISCORD_CLIENT_ID=your_application_client_id_here # Optional: set this while developing so slash commands update instantly in one server. DISCORD_GUILD_ID=your_test_server_id_here # Main SQLite. Tests can point this at /tmp without touching the live DB. DATABASE_PATH=database.sqlite # 動かすサーバー。ここに無いサーバーでは機能を出さず、その場で退出する。 # 空にすると制限しない (設定ミスで全サーバーから出ていかないための安全弁)。 # 挙動を確かめてから退出を有効にしたいときは ALLOWED_GUILDS_LEAVE=false にする # (機能のゲートだけ効いて、退出はしない)。 ALLOWED_GUILDS=1255359848644608035 ALLOWED_GUILDS_LEAVE=true # Optional: normal message trigger. OSS_TARGET_USERNAME= OSS_TRIGGER_TEXT= OSS_RESPONSE_TEXT= # Optional: message archive + search index (/index, /search). ARCHIVE_DB_PATH=archive.sqlite # 構造化した原文とagentのチェックポイント。未指定なら元DB名から導出する。 # ATOM_MEMORY_PATH=archive.sqlite.atoms.sqlite # AGENT_RUNTIME_PATH=database.sqlite.agents.sqlite ARCHIVE_TZ_OFFSET_HOURS=9 ARCHIVE_FETCH_DELAY_MS=150 ARCHIVE_REGEX_BUDGET=300000 # /index を使える人を ID で追加する (カンマ区切り)。 # サーバーの ManageGuild を渡すとサーバー名変更や Webhook まで付いてしまうので、 # bot の管理コマンドだけ渡したいときはこちら。 ARCHIVE_ADMIN_USERS= # リアクションを「誰が押したか」まで記録するか (info action:reactions で使う)。 # 過去ぶんは埋めない — users.fetch() は絵文字1つにつき API 1回なので、既存ログ全体に # 掛けると取り込み時間もレート制限も跳ね上がる。リアクションが動いた時点で # 1メッセージぶんだけ拾い、押した人が25人を超える絵文字は数だけにする。 ARCHIVE_REACTION_USERS=1 # 話題抽出 (search mode:count by:term)。実データで一度チューニングする前提の値 ARCHIVE_TERM_SCAN_CAP=4000 # 1回に走査する発言数の上限 ARCHIVE_TERM_SLICES=48 # 期間を何等分して層化抽出するか ARCHIVE_TERM_BASELINE_SAMPLE=20000 # 比較用にサーバー全体から取る標本数 ARCHIVE_TERM_BASELINE_TTL_MS=21600000 ARCHIVE_TERM_PRIOR=400 # log-odds の事前分布の強さ ARCHIVE_TERM_MIN_DF=3 # この件数未満の語は出さない ARCHIVE_TERM_MIN_RATE=0.002 # 走査件数に対する出現率の下限 ARCHIVE_TERM_MIN_RATIO=1.5 # 全体比がこれ未満の語は出さない # Optional: AI agent. Set OPENROUTER_API_KEY to enable it (mention the bot to use it). OPENROUTER_API_KEY= AI_MODEL=deepseek/deepseek-v4-flash-0731 AGENT_MODEL= # AI Writer: source-grounded descriptions, collections and relationship Atoms. # Uses the shared OpenRouter credentials. Transport batching does not define topics. MEMORY_WRITER_ENABLED=true MEMORY_WRITER_MODEL=inclusionai/ling-3.0-flash MEMORY_WRITER_BATCH_MESSAGES=60 MEMORY_WRITER_BATCH_BYTES=60000 # Up to 7 days in one transport batch, still bounded by messages and bytes. MEMORY_WRITER_BATCH_WINDOW_MS=604800000 # Includes searches and the final plan; fewer calls are used when sufficient. MEMORY_WRITER_MAX_STEPS=6 MEMORY_WRITER_QUIET_MS=60000 MEMORY_WRITER_TIMEOUT_MS=120000 MEMORY_WRITER_OUTPUT_TOKENS=8000 # Optional daily Writer API cap in USD. Empty means no monetary cap; 0 pauses paid calls. MEMORY_WRITER_DAILY_USD= # Enable contextual Atom embeddings. Other guilds keep the local encoder. MEMORY_EMBEDDINGS=true MEMORY_EMBEDDING_DIMENSIONS=384 # Evex experiment: enable after full archive verification, then use --start. MEMORY_DREAMING_ENABLED=false MEMORY_DREAMING_GUILDS=1255359848644608035 # Dream guilds use OpenRouter qwen/qwen3-embedding-8b, separately from E5. MEMORY_DREAMING_EMBEDDING_DIMENSIONS=4096 # low / high / max のうち真ん中。thinking を切るなら AGENT_THINKING=false AGENT_REASONING_EFFORT=high AGENT_THINKING=true # ユーザー間の使用量制限は固定レートでの換算トークン。実際の請求額ではない。 # OpenRouterの実usage.costと未確定予約は共通AI費用台帳へ別に記録する。 AGENT_TOKEN_WEIGHT_CACHED=0.2 AGENT_TOKEN_WEIGHT_OUTPUT=2.0 # ドル ↔ 換算トークンの換算レート。換算トークン1個 = キャッシュミス入力1トークン AGENT_PRICE_IN_PER_MTOK=0.14 # 上限は換算USD。OpenRouterの支払上限を保証する値ではない。 # 0 で無制限。実行中に変えるなら /agentlimit set。統治未初期化サーバーの管理者は # 判定を通らないが、統治初期化後はManageGuildではなくtrusted roleの回数枠を使う。 # 個別に上げるなら /agentlimit grant user:@someone usd:1.0 AGENT_GLOBAL_DAILY_USD=0.5 # 全体/24h AGENT_USER_DAILY_USD=0.05 # 1人あたり/24h AGENT_REQUEST_USD=0.02 # 1リクエストの換算使用量 AGENT_USER_WINDOW_MS=86400000 # 暦の日ではなく移動窓 AGENT_GLOBAL_WINDOW_MS=86400000 AGENT_EXEMPT_USERS= # 費用ではなくメモリの番人。1リクエストごとに Chrome の隔離タブを開くので、 # 同時に何十本も走ると 12GiB を食い潰す。トークンでは同時実行数は縛れない。 AGENT_MAX_CONCURRENT=3 # 1メッセージあたりの本文の長さ AGENT_MESSAGE_CHARS=300 # ツール出力の1メッセージあたり AGENT_PRELOAD_CHARS=800 # 最初から渡す直近の会話は切らない側に寄せる AGENT_PRELOAD_MESSAGES=30 # max_tokens には思考ぶんも含まれる。小さいと本文が空で返ってくる # (回答自体は1000字までなので、ここはほぼ思考の枠) AGENT_MAX_OUTPUT_TOKENS=40000 # 応答が来ないソケットを畳むための保険。1回の呼び出しにだけ掛かり、 # 超えても失敗にせず引き直す。 AGENT_HTTP_TIMEOUT_MS=180000 # リクエスト全体の締め切り。費用を止めるのはトークンの予算で、こちらは # 「同時実行の枠を何時間も押さえさせない」ための壁。超えたら打ち切るのではなく # ツールを外すだけなので、答えはその場の材料で必ず書かれる (実測の重い実行は11往復)。 AGENT_DEADLINE_MS=600000 # 経過表示の秒は でクライアント側が進めるので編集は要らない。 # ここはツールが切り替わったときの編集をまとめる待ち時間 AGENT_PROGRESS_INTERVAL_MS=1000 # 外付け Chrome (deckide が 9222 に常駐させている共有ブラウザに相乗りする) AGENT_BROWSER=true AGENT_BROWSER_CDP_HOST=127.0.0.1 AGENT_BROWSER_CDP_PORT=9222 AGENT_BROWSER_TEXT_CHARS=4000 AGENT_BROWSER_TIMEOUT_MS=30000 # web 検索 (browser action:"search")。エンジンのページを開いて結果を抜くだけなので API キーは不要。 # 空白区切りで前から試し、結果が取れなければ次に落とす。クエリは末尾に足すので `?q=` まで書く。 AGENT_BROWSER_SEARCH_URLS=https://lite.duckduckgo.com/lite/?q= https://www.bing.com/search?q= # 1回の検索でモデルに渡す件数と抜粋の長さ。ここがそのまま毎回のトークン。 AGENT_BROWSER_SEARCH_RESULTS=5 AGENT_BROWSER_SEARCH_SNIPPET_CHARS=180 # クリック・入力・eval・生 CDP を誰に許すか。ここに書いた ID だけ (既定は誰にも出さない)。 # 「サーバー管理」権限では許可しない — 生 CDP は共有 Chrome のログイン済み # セッションに届くので、モデレータ全員に配れる権限ではない。 AGENT_BROWSER_FULL_FOR_ALL=false AGENT_BROWSER_TRUSTED_USERS= # 内部ネットワーク (RFC1918 / ループバック / 169.254.169.254 など) への到達を許すか。 # 有効にしても file: / data: / chrome: は開けない。既定のまま false を強く推奨。 AGENT_BROWSER_ALLOW_LOCAL=false # AI governance. Initial enforcement is shadow; switch to live only after # /governance status reports all required Discord permissions. GOVERNANCE_ENABLED=true GOVERNANCE_OPERATOR_USERS= GOVERNANCE_DRAFTER_MODEL= # empty = AI_MODEL GOVERNANCE_JUDGE_MODELS= # comma-separated models; last fills policy-defined seats GOVERNANCE_APPEAL_MODELS= # separate appeal panel model list # bootstrapは常にshadowです。権限確認後に /governance enforcement mode:live を使います。 # 国会の開会間隔・1回の議題数・継続審議の上限・自律起案の可否は憲法の # governance-rules (parliament) にあり、env varでも運営panelでも変えられません。 # 変えるには改憲手続を通します。 # 法令集はDiscordではなくCloudflare Worker + D1 です (worker/README.md)。 # 未設定なら押し込みを行わず、統治機能はDiscord内だけで動きます。 GOVERNANCE_LAW_API_URL= GOVERNANCE_LAW_API_TOKEN= GOVERNANCE_LAW_SITE_URL= GOVERNANCE_GENERAL_DAILY_CALLS=20 GOVERNANCE_TRUSTED_DAILY_CALLS=200 # 投票開始・執行承認・答弁/上訴の通知上限(移動24時間窓、0で停止)。 # 通知先はコードで固定され、AIの出力からrole/user mentionを作りません。 GOVERNANCE_NOTIFICATION_EVERYONE_DAILY_LIMIT=3 GOVERNANCE_NOTIFICATION_TRUSTED_DAILY_LIMIT=10 GOVERNANCE_NOTIFICATION_USER_DAILY_LIMIT=5 GOVERNANCE_SCHEDULER_INTERVAL_MS=60000 GOVERNANCE_MAX_OUTPUT_TOKENS=8000 GOVERNANCE_HTTP_TIMEOUT_MS=120000 GOVERNANCE_MAX_CONCURRENT=2 # 意味検索 (ローカル埋め込み。外部 API は使わない) SEMANTIC_SEARCH=true SEMANTIC_PYTHON_BIN=.venv/bin/python SEMANTIC_MODEL_NAME=intfloat/multilingual-e5-small # ベクトル化の単位は「会話のまとまり」。1発言では主張が入りきらない。 # 無言がこれ以上続いたら切る / 発言数・文字数の上限でも切る SEMANTIC_CHUNK_GAP_MS=900000 SEMANTIC_CHUNK_MAX_MESSAGES=20 SEMANTIC_CHUNK_MAX_CHARS=1200 # まとまり1つで 400 トークン前後になるので 192 では切れる SEMANTIC_MAX_LENGTH=384 SEMANTIC_THREADS=4 # バックフィル時の torch スレッド数 SEMANTIC_BATCH_SIZE=32 SEMANTIC_SLEEP_MS=120 # バッチ間の休み (bot と Chrome に CPU を譲る) SEMANTIC_MIN_CHARS=10 # まとまり全体がこれより短ければ埋め込まない SEMANTIC_IDLE_MS=600000 # 使われないと Python を落とす (常駐させない) SEMANTIC_MAX_CANDIDATES=150000 # 走査する候補数の上限。超えたら絞れと返す SEMANTIC_RELATIVE_CUTOFF=0.1 # 1位からこれ以上落ちた候補は捨てる SEMANTIC_SWEEP_CRON=0 40 4 * * * # 夜間に新規分を追随 # Optional: reply "きもち" to analyze the referenced message's emotions. EMOTION_TRIGGER_TEXT=きもち EMOTION_PYTHON_BIN=python3 EMOTION_MODEL_NAME=neuralnaut/deberta-wrime-emotions EMOTION_MAX_LENGTH=128 EMOTION_ANALYSIS_TIMEOUT_MS=180000 # --- 自作モデル (/model evex) --- # 推論は bot とは別プロセス。CPU 推論をイベントループ上で回すと Discord の REST が # 全部落ちるので、127.0.0.1 で待ち受ける常駐プロセスに投げる。 # 立てるのは deploy/sakana-mimic.service。落ちていても bot は止まらない。 MIMIC_URL=http://127.0.0.1:8765 MIMIC_TIMEOUT_MS=60000 MIMIC_MAX_NEW_TOKENS=200 # speakers.json を置いた場所 (pack.mjs が出す 3 ファイルのディレクトリ)。 # これが読めないと、誰の発言かをモデルに渡せなくなる。 MIMIC_CORPUS_DIR=mimic