|
1 | 1 | """OpenHands harness agent wired to Harbor's OpenHands CLI with shared baseline tooling.""" |
2 | 2 |
|
| 3 | +import os |
| 4 | + |
| 5 | +from harbor.agents import utils as harbor_utils |
3 | 6 | from harbor.agents.installed.openhands import OpenHands |
4 | 7 |
|
5 | 8 | from ..base import BaselineHarnessMixin |
6 | 9 |
|
| 10 | +# Codex model names (LiteLLM/Harbor don't know these); we map them to OPENAI_API_KEY |
| 11 | +# so Harbor's get_api_key_var_names_from_model_name can resolve the key. |
| 12 | +_CODEX_MODEL_PREFIXES = ("gpt-5.3-codex", "gpt53codex", "codex") |
| 13 | + |
| 14 | + |
| 15 | +def _get_api_key_var_names_from_model_name(model_name: str) -> list[str]: |
| 16 | + """Wrap Harbor's resolver so Codex models map to OPENAI_API_KEY or CODEX_API_KEY.""" |
| 17 | + lower = (model_name or "").strip().lower() |
| 18 | + if lower in _CODEX_MODEL_PREFIXES or (lower and "codex" in lower and "gpt" in lower): |
| 19 | + if os.environ.get("CODEX_API_KEY"): |
| 20 | + return ["CODEX_API_KEY"] |
| 21 | + if os.environ.get("OPENAI_API_KEY"): |
| 22 | + return ["OPENAI_API_KEY"] |
| 23 | + # Harbor will raise "Unset API variable"; prefer telling user to set CODEX_API_KEY |
| 24 | + return ["CODEX_API_KEY"] |
| 25 | + return _original_get_api_key_var_names(model_name) |
| 26 | + |
| 27 | + |
| 28 | +# Apply once at import so Harbor's OpenHands sees it. Harbor's openhands.py does |
| 29 | +# "from harbor.agents.utils import get_api_key_var_names_from_model_name", so we |
| 30 | +# must patch the openhands module's reference too (utils patch alone is not seen there). |
| 31 | +_original_get_api_key_var_names = harbor_utils.get_api_key_var_names_from_model_name |
| 32 | +harbor_utils.get_api_key_var_names_from_model_name = _get_api_key_var_names_from_model_name |
| 33 | +import sys |
| 34 | +_openhands_mod = sys.modules.get("harbor.agents.installed.openhands") |
| 35 | +if _openhands_mod is not None: |
| 36 | + _openhands_mod.get_api_key_var_names_from_model_name = _get_api_key_var_names_from_model_name |
| 37 | + |
7 | 38 |
|
8 | 39 | class OpenHandsHarnessAgent(BaselineHarnessMixin, OpenHands): |
9 | 40 | """OpenHands CLI agent extended with evaluation context and MCP wiring.""" |
0 commit comments