(
self,
instruction: str,
environment: BaseEnvironment,
context: AgentContext,
)
| 232 | def _resolve_api_key_env(self) -> dict[str, str]: |
| 233 | """Resolve the correct API key env var(s) based on model provider prefix.""" |
| 234 | model_id = self.model_name or self._default_model |
| 235 | provider_name = model_id.split("/", 1)[0] if "/" in model_id else "openrouter" |
| 236 | |
| 237 | env_var = _PROVIDER_KEY_MAP.get(provider_name, "OPENROUTER_API_KEY") |
| 238 | key_value = self._original_env.get(env_var) or os.environ.get(env_var, "") |
| 239 | |
| 240 | env = {} |
| 241 | if key_value: |
| 242 | env[env_var] = key_value |
| 243 | # OpenCode's google provider expects GOOGLE_GENERATIVE_AI_API_KEY |
| 244 | if provider_name in ("gemini", "google"): |
| 245 | env["GOOGLE_GENERATIVE_AI_API_KEY"] = key_value |
| 246 | return env |
| 247 | |
| 248 | async def run( |
| 249 | self, |
| 250 | instruction: str, |
| 251 | environment: BaseEnvironment, |
| 252 | context: AgentContext, |
| 253 | ) -> None: |
| 254 | self._last_instruction = instruction |
| 255 | escaped_instruction = shlex.quote(instruction) |
| 256 | |
| 257 | env = self._resolve_api_key_env() |
| 258 | env["OPENCODE_YOLO"] = "true" |
| 259 | env["OPENCODE_DANGEROUSLY_SKIP_PERMISSIONS"] = "true" |
| 260 | env = {k: v for k, v in env.items() if v} |
| 261 | |
| 262 | opencode_config = self._build_opencode_config() |
| 263 | config_json = json.dumps(opencode_config, indent=2) |
| 264 | escaped_config = shlex.quote(config_json) |
| 265 | |
| 266 | model_name = self.model_name or self._default_model |
| 267 | # Remap provider prefix for OpenCode CLI (e.g. gemini/ → google/) |
| 268 | if "/" in model_name: |
| 269 | raw_provider, model_suffix = model_name.split("/", 1) |
| 270 | remapped = self._PROVIDER_REMAP.get(raw_provider) |
| 271 | if remapped: |
| 272 | model_name = f"{remapped}/{model_suffix}" |
| 273 | |
| 274 | prefix = self._log_prefix |
| 275 | log_file = self._log_file |
| 276 | |
| 277 | setup_command = ( |
| 278 | f"echo {escaped_config} > /app/opencode.json && " |
| 279 | f"echo '[{prefix}-setup] Wrote /app/opencode.json'" |
| 280 | ) |
| 281 | |
| 282 | await self.exec_as_agent(environment, command=setup_command, env=env) |
| 283 | |
| 284 | escaped_model = shlex.quote(model_name) |
| 285 | continue_instruction = shlex.quote( |
| 286 | "You were previously working on this task but stopped early. " |
| 287 | "There is still time remaining. Check the current game state with " |
| 288 | "sdk.getState() and CONTINUE training. Do NOT write a summary — " |
| 289 | "keep grinding. " + instruction |
| 290 | ) |
| 291 |
nothing calls this directly
no test coverage detected