環境變數
roundtable init 會在 roundtable.config.ts 旁邊寫出一個 .env.example。
把它複製成 .env 並填好,設定檔就會從行程的環境變數讀到這些值。
cp .env.example .envBun 會自己載入 .env,所以不需要 dotenv 這一步。
roundtable 指令要在專案目錄裡執行,因為設定檔也是在那裡找的。
init 寫出的 .gitignore 已經列了 .env,所以這個檔案不會進 Git。
| 變數 | 值從哪裡來 | 給誰用 |
|---|---|---|
DISCORD_TOKEN |
Discord developer portal 上,你的應用程式的 Bot 頁面。 | discord.token |
DISCORD_GUILD_ID |
在 Discord 開啟開發者模式,在伺服器上按右鍵,複製它的 id。 | discord.guild |
DISCORD_ENTRY_CHANNEL_ID |
同樣的做法:在協調者要住的頻道上按右鍵,複製它的 id。 | discord.entryChannel |
OWNER_ID |
你自己,也就是唯一能改動一切的 owner:在你的名字上按右鍵,選 Copy User ID。 | owner.id |
OWNER_NAME |
你的名字,agent 會這樣稱呼你。 | owner.name |
DATABASE_URL |
PostgreSQL。檔案裡的預設值跟 init 寫出的 docker-compose.yml 一致:postgres://roundtable:roundtable@localhost:5432/roundtable。 |
database.url |
MODEL |
agent 使用的模型,寫成 <provider>/<id>。檔案裡建議的是 anthropic/claude-sonnet-5-5。 |
model |
PUBLIC_URL |
能從網際網路連到這個行程的位址。agent 的頭像從這裡提供。 | http.publicUrl |
ANTHROPIC_API_KEY |
供應商的 API key。檔案裡是註解掉的;見下面。 | 由模型登入讀取,設定檔不讀。 |
前八個變數,由 roundtable.config.ts 透過它的 env("NAME") 輔助函式設定。
你可以用同樣的方式讀更多變數:那個檔案就是普通的 TypeScript。
Discord 的值一步一步怎麼拿,見設定 Discord bot。
roundtable doctor 和 roundtable start 把 .env.example 裡每一行沒有註解掉的 NAME=,都當成必填。
變數沒有值,或值是空白,環境檢查就會失敗:
✗ environment: no value for DISCORD_TOKEN, DISCORD_GUILD_ID, DISCORD_ENTRY_CHANNEL_ID, OWNER_ID, OWNER_NAME, DATABASE_URL, MODEL, PUBLIC_URL. Copy .env.example to .env and fill them in; .env.example says where each one comes from..env 已經存在時,修正的那一行會寫成 Fill them in .env,不再有複製的步驟。
專案裡沒有 .env.example 的話,這項檢查會略過。
ANTHROPIC_API_KEY 是註解掉的,所以是選填。
改用 Pi 登入的話就不用填。
兩種做法都在模型裡說明。
你自己在 .env.example 加了變數,doctor 也會開始要求它。
前面加 # 註解掉,它就變成選填。
值是空的會怎樣
Section titled “值是空的會怎樣”設定檔會把沒設的變數變成空字串,而每個必填設定都必須是非空字串。
所以 .env 裡留空的值,在檢查設定時也會被抓到:
config owner.id: expected a non-empty string, got "". Fix the value in roundtable.config.ts.PUBLIC_URL 必須是 http:// 或 https:// 開頭的位址。
doctor 會檢查它的格式是否正確。
加上 --reachable 時,它還會真的請求這個位址,而這只有在 bot 執行中才會有回應。
旗標見 CLI,訊息見錯誤。
行程監聽 http.port,沒改的話是 3000。
PUBLIC_URL 的位址必須能通到那裡,例如透過通道(tunnel)。