-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy path.env.example
More file actions
224 lines (209 loc) · 11 KB
/
Copy path.env.example
File metadata and controls
224 lines (209 loc) · 11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# =============================================================================
# Required
# =============================================================================
ODDISH_DATABASE_URL=postgresql+asyncpg://postgres.[project-ref]:[db-password]@[host]:[port]/[database]
# Organization whose admins may change deployment-wide operator settings such
# as model concurrency and shared-channel Slack escalation. A bare value matches
# the org's internal id; prefix with "slug:" to match the org slug, e.g.
# "slug:abundant". Fails closed when unset. The Modal backend defaults this to
# the Abundant org's internal id "8ebde5d0" (see ENV_VARS in modal_app.py).
# ODDISH_OPERATOR_ORG_ID=8ebde5d0
# Clerk domain used for JWT verification (JWKS)
CLERK_DOMAIN=clerk.oddish.app
CLERK_WEBHOOK_SECRET=...
# Optional explicit JWT issuer override (defaults to https://CLERK_DOMAIN)
# CLERK_ISSUER=
# Optional audience enforcement for Clerk JWTs
# CLERK_JWT_AUDIENCE=
# =============================================================================
# Required runtime/storage settings (ODDISH_* from oddish core settings)
# =============================================================================
# Bucket defaults to "data" and region to "us-east-1"; override only if your
# S3-compatible backend uses different names.
# ODDISH_S3_BUCKET=data
# ODDISH_S3_REGION=us-east-1
ODDISH_S3_ACCESS_KEY=...
ODDISH_S3_SECRET_KEY=...
ODDISH_S3_ENDPOINT_URL=...
# =============================================================================
# Sauron S3 mirror (optional)
# =============================================================================
# When configured, oddish workers also upload trial artifacts to sauron's
# AWS S3 bucket in sauron's expected layout. Uses AWS_ACCESS_KEY_ID and
# AWS_SECRET_ACCESS_KEY from environment for credentials (e.g. from the
# aws-credentials Modal secret).
# Disabled when ODDISH_SAURON_S3_BUCKET is empty.
# ODDISH_SAURON_S3_BUCKET=abundant-github-workflows-bucket
# ODDISH_SAURON_S3_ORG=oddish # top-level segment for CLI runs: {org}/runs/run-{id}/
# =============================================================================
# EC2 Harbor backend (optional, CPU-only)
# =============================================================================
# Opt-in one-instance-per-trial backend. Daytona remains the default for hosted
# CPU tasks; EC2 runs only when a request explicitly selects --env ec2. V1 uses
# public-IP, key-only SSH and requires pre-existing AWS infrastructure.
# ODDISH_EC2_ENABLED=true
# ODDISH_EC2_REGION=us-east-1
# ODDISH_EC2_AMI_ID=ami-...
# ODDISH_EC2_INSTANCE_TYPE=m7i-flex.large
# ODDISH_EC2_SUBNET_ID=subnet-...
# ODDISH_EC2_SECURITY_GROUP_IDS=["sg-..."]
# ODDISH_EC2_KEY_NAME=oddish-harbor
# ODDISH_EC2_SSH_USER=ubuntu
# Optional platform-owned instance-profile name or ARN. Enabling this exposes
# the profile to sandbox code via IMDSv2; keep its permissions task-scoped.
# ODDISH_EC2_INSTANCE_PROFILE=oddish-harbor-sandbox
# ODDISH_EC2_ROOT_VOLUME_SIZE_GB=80
# ODDISH_EC2_USE_PUBLIC_IP=true
# ODDISH_EC2_BOOTSTRAP_DOCKER=true
# ODDISH_EC2_MAX_CONCURRENT_INSTANCES=16
# Deploy-time Modal secret names (the secrets themselves are not stored here):
# ODDISH_EC2_CONTROL_SECRET_NAME=oddish-ec2-control
# ODDISH_EC2_SSH_SECRET_NAME=oddish-ec2-ssh
# The control secret contains ODDISH_EC2_AWS_ACCESS_KEY_ID,
# ODDISH_EC2_AWS_SECRET_ACCESS_KEY, and optional ODDISH_EC2_AWS_SESSION_TOKEN.
# The SSH secret contains only ODDISH_EC2_SSH_PRIVATE_KEY.
# The matching security group must admit TCP/22 from the Modal worker path.
# EC2 control credentials need least-privilege sts:GetCallerIdentity plus
# RunInstances, DescribeInstances, DescribeInstanceStatus, DescribeImages,
# CreateTags, and TerminateInstances.
# Add iam:PassRole for the exact role only when ODDISH_EC2_INSTANCE_PROFILE is
# configured. IMDSv2 is always required: hop limit 1 lets host cloud-init fetch
# the launch SSH key, while configured profiles use hop limit 2 so Harbor's
# Docker containers can receive replies.
# =============================================================================
# GKE TPU backend (optional)
# =============================================================================
# Runs TPU trials on a GKE Autopilot cluster. Set ODDISH_GKE_CLUSTER_NAME to
# register the backend and enable --env gke; tasks whose task.toml declares
# [environment.tpu] route here automatically. Worker credentials come from the
# oddish-gcp Modal secret (GOOGLE_APPLICATION_CREDENTIALS_JSON). Deployment
# targets region us-east5 (zone us-east5-b), the only location with preemptible
# TPU v6e DWS flex-start capacity.
# ODDISH_GKE_CLUSTER_NAME=oddish-tpu
# ODDISH_GKE_REGION=us-east5
# ODDISH_GKE_PROJECT_ID=...
# ODDISH_GKE_NAMESPACE=oddish-trials
# ODDISH_GKE_REGISTRY_LOCATION=us-east5
# ODDISH_GKE_REGISTRY_NAME=oddish-envs
# ODDISH_GKE_FLEX_START=true
# ODDISH_GKE_POD_READY_TIMEOUT_SEC=3600
# =============================================================================
# LLM/Sandbox provider keys
# =============================================================================
# Azure OpenAI is the default for OpenAI-family jobs.
# Use an OpenAI-compatible endpoint such as *.openai.azure.com/openai/v1 or
# *.services.ai.azure.com/openai/v1. Do not use the Foundry project endpoint
# ending in /api/projects/<project>.
# ODDISH_OPENAI_PROVIDER=azure
# AZURE_OPENAI_API_KEY=
# AZURE_OPENAI_ENDPOINT=https://YOUR-RESOURCE.openai.azure.com/openai/v1
# AZURE_OPENAI_API_VERSION=
# ODDISH_AZURE_OPENAI_DEPLOYMENTS={"openai/gpt-5.4":"azure-gpt-5-4","gpt-5.4":"azure-gpt-5-4"}
#
# Public OpenAI is explicit opt-in only.
# ODDISH_OPENAI_PROVIDER=openai
# OPENAI_API_KEY=
# GEMINI_API_KEY=
# DAYTONA_API_KEY=
#
# oddish runs Claude through AWS Bedrock by default — provide
# AWS_BEARER_TOKEN_BEDROCK. The Modal image sets CLAUDE_CODE_USE_BEDROCK=1.
# AWS_BEARER_TOKEN_BEDROCK=
#
# Separate Anthropic key for --model anthropic-hdo/<claude-model>. Injected as
# ANTHROPIC_API_KEY for that trial (overwriting the platform key / Bedrock
# route) so Claude Code uses the direct Anthropic API with this credential.
# ANTHROPIC_HDO_API_KEY=
#
# z.ai / GLM auth token for GLM models on the claude-code harness
# (e.g. --model zai/glm-x-preview[1m]). Referenced as ${ZAI_API_KEY};
# optionally override the endpoint via ZAI_BASE_URL.
# ZAI_API_KEY=
#
# MiniMax auth token for MiniMax M-series models on the claude-code harness
# (e.g. --model minimax/MiniMax-M3). Referenced as ${MINIMAX_API_KEY};
# optionally override the endpoint via MINIMAX_BASE_URL
# (default https://api.minimax.io/anthropic).
# MINIMAX_API_KEY=
#
# Moonshot auth token for Kimi K2.7 Code on the claude-code harness
# (e.g. --model moonshot/kimi-k2.7-code). Referenced as ${MOONSHOT_API_KEY};
# optionally override the endpoint via MOONSHOT_BASE_URL
# (default https://api.moonshot.ai/anthropic).
# MOONSHOT_API_KEY=
#
# Fireworks auth token. Consolidation route for GLM / MiniMax / Kimi (and other
# open models) on the claude-code harness via Fireworks' single
# Anthropic-compatible endpoint (e.g. --model fireworks/glm-5.2,
# fireworks/minimax-m3, fireworks/kimi-k2.7-code). Referenced as
# ${FIREWORKS_API_KEY}; optionally override the endpoint via FIREWORKS_BASE_URL
# (default https://api.fireworks.ai/inference).
# FIREWORKS_API_KEY=
#
# xAI auth token for Harbor's grok-build agent
# (e.g. --agent grok-build --model xai/redacted-model). Harbor reads
# XAI_API_KEY from the runtime environment/Modal secret and persists only the
# env var name in its Grok config.
# XAI_API_KEY=
#
# Meta auth token for mini-swe-agent evals on Meta's OpenAI-compatible API
# (e.g. --agent mini-swe-agent --model meta/<model>). Referenced as
# ${META_API_KEY}; optionally override the endpoint via META_BASE_URL
# (default https://api.ai.meta.com/v1).
# META_API_KEY=
# Optional x-session-id controls. Defaults to oddish-eval--<random-run-id>;
# set eval name for e.g. swe-marathon--<random-run-id>, or set a full session
# id explicitly.
# ODDISH_META_EVAL_NAME=SWE Marathon
# ODDISH_META_SESSION_ID=swe-marathon--123456
# GitHub integration (task/experiment PR refresh endpoints)
# GITHUB_TOKEN=
# Registry-auth data key (optional). Fernet key encrypting per-run container
# registry tokens as they cross the queue (see oddish.registry_auth). Mounted on
# both the API and worker (e.g. via the oddish-prod Modal secret). When unset, a
# key is derived from ODDISH_DATABASE_URL so encryption still applies; set this to
# rotate independently. Generate with:
# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# ODDISH_REGISTRY_AUTH_KEY=
# Optional CORS allowlist, comma-separated
# CORS_ALLOWED_ORIGINS=http://localhost:3000,https://www.oddish.app
# Optional dashboard URL used by GitHub notifier links
# ODDISH_DASHBOARD_URL=https://www.oddish.app
# Optional deterministic Slack expense and failure notifications.
# Thresholds are hardcoded module constants (not env-configurable): experiment
# spend milestones every $500, any trial over $100 pings the webhook in-channel
# with an @-mention prefix, and a trial over $1,000 escalates that same mention
# line to a hardcoded always-ping list. Cost alerts (milestones, expensive
# trials) post to the webhook only -- they no longer DM or email anyone. The
# email delivery channel has been removed entirely.
# SLACK_EXPENSE_WEBHOOK_URL=
# DM-only alerts -- trial failed, QA failed, experiment failed -- never touch
# the webhook and are delivered solely via SLACK_ALERT_BOT_TOKEN, matched to
# Slack accounts by account email. The same bot token also resolves the
# in-channel @-mentions above, so users:read.email is needed even when only
# cost alerts are configured (chat:write and im:write cover the DM path).
# SLACK_ALERT_BOT_TOKEN=xoxb-...
# On by default for the production app; off by default on preview apps. Set this
# to true to opt a preview in (also requires at least one delivery channel).
# ODDISH_ENABLE_SLACK_EXPENSE_NOTIFICATIONS=true
# Optional named Modal secret used only by the notification function.
# ODDISH_SLACK_EXPENSE_SECRET_NAME=
# ODDISH_SLACK_EXPENSE_SECRET_ENVIRONMENT=preview
# Optional Slack app unfurls for task, experiment, and public share links.
# Create a Slack app with bot scopes links:read + links:write, subscribe it to
# the link_shared event for your dashboard domain, and set its Events API URL to
# https://<backend>/webhooks/slack/events. This lean integration binds one
# manually-installed Slack workspace to one Oddish org.
# ODDISH_SLACK_UNFURL_ENABLED=true
# ODDISH_SLACK_UNFURL_SIGNING_SECRET=
# ODDISH_SLACK_UNFURL_BOT_TOKEN=xoxb-...
# ODDISH_SLACK_UNFURL_ORG_ID=
# Optional defense-in-depth workspace and comma-separated channel allowlists.
# ODDISH_SLACK_UNFURL_TEAM_ID=
# ODDISH_SLACK_UNFURL_ALLOWED_CHANNELS=C012345,C067890
# Must match the registered domain. Falls back to ODDISH_DASHBOARD_URL, then www.
# ODDISH_SLACK_UNFURL_DASHBOARD_URL=https://www.oddish.app
# Optional Modal worker queue tuning
# Nop/oracle trials do not call model providers, so hosted deployments can
# give their dedicated queue more Modal capacity without raising model queues.
# ODDISH_MODAL_NOP_ORACLE_CONCURRENCY=256