Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
7.3 KiB
JSON

{"repo": "agentrebench/agentre-bench", "files": {"harness/config.py": {"05d6691bc8d67c8c6ad9788d6b085f61e837cfc9": {"t": 1786068512.177879, "n": 6913, "h": "8fc4c74738e4db5a", "c": "from __future__ import annotations\n\nimport os\nfrom dataclasses import dataclass, field\nfrom pathlib import Path\n\nENV_KEY_MAP = {\n \"anthropic\": \"ANTHROPIC_API_KEY\",\n \"openai\": \"OPENAI_API_KEY\",\n \"gemini\": \"GOOGLE_API_KEY\",\n \"deepseek\": \"DEEPSEEK_API_KEY\",\n \"glm\": \"GLM_API_KEY\",\n \"moonshot\": \"MOONSHOT_API_KEY\",\n}\n\nAPI_FILE_LABEL_MAP = {\n \"anthropic\": \"ANTHROPIC_API_KEY\",\n \"claude\": \"ANTHROPIC_API_KEY\",\n \"fable\": \"ANTHROPIC_API_KEY\",\n \"openai\": \"OPENAI_API_KEY\",\n \"google\": \"GOOGLE_API_KEY\",\n \"gemini\": \"GOOGLE_API_KEY\",\n \"deepseek\": \"DEEPSEEK_API_KEY\",\n \"moonshot\": \"MOONSHOT_API_KEY\",\n \"kimi\": \"MOONSHOT_API_KEY\",\n \"glm\": \"GLM_API_KEY\",\n}\n\nDEFAULT_TOOLS = [\n \"file\", \"strings\", \"readelf\", \"objdump\", \"nm\", \"hexdump\", \"xxd\", \"entropy\",\n \"pe_info\",\n]\n\n\ndef _load_dotenv(project_root: Path) -> None:\n \"\"\"Load .env file from project root into os.environ (without overwriting).\"\"\"\n env_path = project_root / \".env\"\n if not env_path.is_file():\n return\n with open(env_path) as f:\n for line in f:\n line = line.strip()\n if not line or line.startswith(\"#\"):\n continue\n if \"=\" not in line:\n continue\n key, _, value = line.partition(\"=\")\n key = key.strip()\n value = value.strip()\n # Strip surrounding quotes\n if len(value) >= 2 and value[0] == value[-1] and value[0] in ('\"', \"'\"):\n value = value[1:-1]\n # Don't overwrite existing env vars (CLI/shell takes priority)\n if key not in os.environ:\n os.environ[key] = value\n\n\ndef _read_api_file(api_path: Path) -> dict[str, str]:\n \"\"\"Read the repo-local ``api`` key file without mutating the environment.\n\n The private development file uses friendly labels such as ``Claude:`` and\n ``Kimi:``, while .env uses conventional environment-variable names. Both\n forms are accepted here. Values are never logged or included in config\n serialization.\n \"\"\"\n if not api_path.is_file():\n return {}\n\n keys: dict[str, str] = {}\n with open(api_path) as f:\n for raw_line in f:\n line = raw_line.strip()\n if not line or line.startswith(\"#\"):\n continue\n if line.startswith(\"export \"):\n line = line[len(\"export \"):].lstrip()\n\n equals = line.find(\"=\")\n colon = line.find(\":\")\n separators = [i for i in (equals, colon) if i >= 0]\n if not separators:\n # The private benchmark key file may put an Anthropic key on\n # the line below a human-readable ``Claude: <model>`` label.\n # Recognize the provider-specific key prefix so the actual key\n # supersedes that descriptor.\n if line.startswith(\"sk-ant-\"):\n keys[\"ANTHROPIC_API_KEY\"] = line\n continue\n split_at = min(separators)\n label = line[:split_at].strip()\n value = line[split_at + 1:].strip()\n if len(value) >= 2 and value[0] == value[-1] and value[0] in ('\"', \"'\"):\n value = value[1:-1]\n if not value:\n continue\n\n normalized = \"\".join(ch for ch in label.lower() if ch.isalnum())\n env_name = API_FILE_LABEL_MAP.get(normalized)\n if env_name is None and label.upper() in ENV_KEY_MAP.values():\n env_name = label.upper()\n if env_name:\n keys[env_name] = value\n return keys\n\n\n@dataclass\nclass BenchmarkConfig:\n project_root: Path\n workspace_dir: Path # binaries/\n ground_truths_dir: Path\n\n model: str = \"claude-opus-4-6\"\n provider: str = \"anthropic\"\n api_key: str = \"\"\n\n max_tool_calls: int = 25\n tool_timeout_seconds: int = 30\n max_output_chars: int = 50000\n max_tokens: int = 4096\n\n # Provider-specific reasoning knobs (forwarded via create_provider).\n reasoning_effort: str | None = None # OpenAI reasoning models\n thinking_effort: str | None = None # Anthropic thinking models\n\n docker_image: str = \"agentre-bench-tools:latest\"\n # None = native host arch; set \"linux/amd64\" on x86 runners to pin.\n docker_platform: str | None = None\n use_docker: bool = True\n\n # Seconds to sleep between tasks. Useful for providers with strict\n # per-minute token caps (e.g. Gemini free tier).\n inter_task_sleep_seconds: float = 0.0\n\n allowed_tools: list[str] = field(default_factory=lambda: list(DEFAULT_TOOLS))\n\n # Optional custom manifest path (defaults to project_root / \"tasks.json\").\n manifest_path: Path | None = None\n # Optional private key file. Defaults to project_root / \"api\" when present.\n api_file: Path | None = None\n\n results_dir: Path = field(default=None)\n verbose: bool = False\n resume: bool = False\n\n def __post_init__(self):\n self.project_root = Path(self.project_root).resolve()\n self.workspace_dir = Path(self.workspace_dir).resolve()\n self.ground_truths_dir = Path(self.ground_truths_dir).resolve()\n if self.api_file is None:\n default_api_file = self.project_root / \"api\"\n self.api_file = default_api_file if default_api_file.is_file() else None\n else:\n self.api_file = Path(self.api_file).resolve()\n\n if self.results_dir is None:\n # Namespace by provider/model to avoid overwriting across runs\n safe_model = self.model.replace(\"/\", \"_\").replace(\":\", \"_\")\n self.results_dir = self.project_root / \"results\" / f\"{self.provider}_{safe_model}\"\n else:\n self.results_dir = Path(self.results_dir).resolve()\n\n # Load .env file so API keys are available via env vars\n _load_dotenv(self.project_root)\n\n def resolve_api_key(self) -> str:\n # 1. Explicit --api-key flag (highest priority)\n if self.api_key:\n return self.api_key\n # 2. Repo-local api file requested for development benchmark runs.\n env_var = ENV_KEY_MAP.get(self.provider)\n if env_var and self.api_file:\n key = _read_api_file(self.api_file).get(env_var, \"\")\n if key:\n return key\n # 3. Environment variable (includes values loaded from .env)\n if env_var:\n key = os.environ.get(env_var, \"\")\n if key:\n return key\n raise ValueError(\n f\"No API key for provider {self.provider!r}. \"\n f\"Set {ENV_KEY_MAP.get(self.provider, 'PROVIDER_API_KEY')} in .env or environment, \"\n f\"or pass --api-key.\"\n )\n\n @property\n def agent_outputs_dir(self) -> Path:\n return self.results_dir / \"agent_outputs\"\n\n @property\n def transcripts_dir(self) -> Path:\n return self.results_dir / \"transcripts\"\n"}}}}