# slate.env.example -- copy this to slate.env, then fill in your own values. # # cp slate.env.example slate.env # # edit slate.env # ./run.sh # # slate.env holds your secrets. It is already ignored by git, so it is never # committed. Do not share it or paste it anywhere. Every value below is for # YOUR own accounts; you pay your own bills. # # Only ONE value is truly required to start: DISCORD_TOKEN. Everything else adds # a feature. What each knob does, why it exists, and where to get it is spelled # out in plain words in docs/configuration.md. This file is the short version. # --------------------------------------------------------------------------- # 1. Discord (required) # --------------------------------------------------------------------------- # Your bot login token from the Discord Developer Portal # (Applications -> your app -> Bot -> Reset Token). REQUIRED. DISCORD_TOKEN= # Which channels Slate listens in, as a comma-separated list of channel IDs. # Leave this EMPTY and Slate only answers direct messages and @mentions. # To get a channel ID: turn on Discord Developer Mode, right-click a channel, # then "Copy Channel ID". DISCORD_CHANNEL_IDS= # How many past back-and-forth turns Slate keeps in the live conversation. # Default 20. Higher = more memory, more cost per reply. DISCORD_HISTORY=20 # Other bot IDs Slate is allowed to talk to (comma-separated). Leave empty to # ignore all other bots. Only needed if you run a second cooperating bot. TRUSTED_BOT_IDS= # A file path to also write logs to. Leave empty to log to the screen only. # In Docker this is set to /dev/stdout for you. DISCORD_LOG= # --------------------------------------------------------------------------- # 2. The writing brain: Claude (recommended) or your own Ollama # --------------------------------------------------------------------------- # Slate needs one language model to talk and to keep the storyboard. Pick ONE # of the two paths below. # # Path A -- Claude through Cloudflare AI Gateway (recommended): set CF_AIG_TOKEN # and CF_GATEWAY_ENDPOINT, and set DISCORD_MODEL to a Claude model. # Path B -- A local Ollama model (no cloud, no bill): leave CF_AIG_TOKEN EMPTY, # set OLLAMA_BASE_URL and DISCORD_MODEL to your Ollama model. # The model id Slate uses to think and write. # Claude path example: claude-sonnet-4-6 # Ollama path example: qwen3.6:27b-ctx8k DISCORD_MODEL=claude-sonnet-4-6 # Cloudflare AI Gateway API token (the Claude path). Set this to use Claude. # Leave EMPTY to fall back to Ollama. Make one in the Cloudflare dashboard: # AI -> AI Gateway -> your gateway -> API keys. CF_AIG_TOKEN= # Your AI Gateway compatibility URL. Slate uses it to reach Claude. Looks like: # https://gateway.ai.cloudflare.com/v1///compat/chat/completions CF_GATEWAY_ENDPOINT= # Where your local Ollama server listens (the Ollama path). Only used when # CF_AIG_TOKEN is empty. Default is a local Ollama on the same machine. OLLAMA_BASE_URL=http://localhost:11434/v1 # --------------------------------------------------------------------------- # 3. The Studio (needed to render films) # --------------------------------------------------------------------------- # Slate writes storyboards on its own, but to turn one into a video it hands the # job to a Vivijure Studio. Point Slate at your Studio here. Leave VIVIJURE_API_URL # empty and Slate still plans films; it just cannot press "render". # Your Studio web address (the vivijure control plane you deployed). # Example: https://vivijure.example.com VIVIJURE_API_URL= # The Studio's API token. REQUIRED whenever VIVIJURE_API_URL is set: the Studio # checks it on every call Slate makes (bundle, cast, portrait, render, status), # and Slate refuses to start without it. Your Studio prints/mints this when you # deploy it; paste the same value here. STUDIO_API_TOKEN= # OPTIONAL, additive hardening: if you ALSO front your Studio with Cloudflare # Access, add an Access SERVICE TOKEN so Slate can pass that outer door. Create # one in Cloudflare: Zero Trust -> Access -> Service Auth -> Service Tokens. # Leave both empty if your Studio has no Access (the common case). CF_ACCESS_CLIENT_ID= CF_ACCESS_CLIENT_SECRET= # --------------------------------------------------------------------------- # 4. Saved memory: Cloudflare D1 (recommended) # --------------------------------------------------------------------------- # D1 is a small cloud database. Slate uses it to remember every project storyboard, # history, and pending renders, so nothing is lost on restart. # Create one with: npx wrangler d1 create slate-sessions (this prints the id). # A Cloudflare API token with the "D1 Edit" permission. # Make one at: dash.cloudflare.com -> My Profile -> API Tokens. CF_D1_TOKEN= # Your Cloudflare account id (dash.cloudflare.com, right sidebar on any zone). CF_D1_ACCOUNT_ID= # The database id printed when you ran "wrangler d1 create". CF_D1_DATABASE_ID= # --------------------------------------------------------------------------- # 5. Pictures: the image generator (optional) # --------------------------------------------------------------------------- # The base URL of the image service Slate calls for character portraits and # scene thumbnails. Default is our public playground; point it at your own if # you run one. Portrait uploads flow through this service, so Slate itself needs # no storage keys. LLM_API_URL=https://play.skyphusion.org # --------------------------------------------------------------------------- # 6. Web search + knowledge base (optional) # --------------------------------------------------------------------------- # Slate can look things up on the web and search a knowledge base you feed it # with "!learn". Both come from the separate slate-search Worker (see # search-worker/ and docs/configuration.md). Leave these empty to run without # search; Slate still writes and renders. # The web address of your deployed slate-search Worker. SEARCH_WORKER_URL= # REQUIRED whenever SEARCH_WORKER_URL is set: four distinct passwords (>= 16 chars # each; `openssl rand -hex 32`). Each MUST match the Worker secret of the same name. # Leave all five (URL + secrets) empty to run without search. SEARCH_SECRET= KNOWLEDGE_SECRET= FETCH_SECRET= MEMORY_SECRET= # --------------------------------------------------------------------------- # 7. Shipping logs to a bucket (optional) # --------------------------------------------------------------------------- # Slate can also ship its logs to the separate slate-logs Worker (see log-worker/). # Leave these empty to keep logs on the screen / in DISCORD_LOG only. # The web address of your deployed slate-logs Worker. LOG_WORKER_URL= # A shared password Slate sends to that Worker. It MUST match the LOG_SECRET you # set on the Worker. LOG_SECRET= # A label attached to shipped log lines, so one bucket can hold several services. LOG_SERVICE=slate