Files
wehub-resource-sync 7a0da7932b
Backwards Compatibility / Verify Encryption Constants (push) Waiting to run
Backwards Compatibility / PyPI Version Compatibility (push) Waiting to run
Backwards Compatibility / Database Migration Tests (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
CodeQL Advanced / Analyze (python) (push) Waiting to run
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Blocked by required conditions
Docker Tests (Consolidated) / detect-changes (push) Waiting to run
Docker Tests (Consolidated) / Build Test Image (push) Waiting to run
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Blocked by required conditions
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Blocked by required conditions
Docker Tests (Consolidated) / Accessibility Tests (push) Blocked by required conditions
Docker Tests (Consolidated) / LLM Unit Tests (push) Blocked by required conditions
Docker Tests (Consolidated) / LLM Example Tests (push) Blocked by required conditions
Docker Tests (Consolidated) / Production Image Smoke Test (push) Blocked by required conditions
Docker Tests (Consolidated) / Infrastructure Tests (push) Blocked by required conditions
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Waiting to run
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:08:55 +08:00

322 lines
10 KiB
Python
Executable File

#!/usr/bin/env python
"""
Run benchmarks with Gemini Flash via OpenRouter.
This script updates the database LLM configuration and then runs benchmarks
with Gemini Flash via OpenRouter.
Usage:
# Install dependencies with PDM
cd /path/to/local-deep-research
pdm install
# Run the script with PDM
pdm run python examples/optimization/run_gemini_benchmark.py --api-key "your-openrouter-api-key" --examples 10
"""
import argparse
import sys
import time
from datetime import datetime, UTC
from pathlib import Path
from typing import Any, Dict, List, Optional
from loguru import logger
# Add the src directory to the Python path
project_root = str(Path(__file__).parent.parent.parent.resolve())
sys.path.insert(0, str(Path(project_root) / "src"))
# Loguru automatically handles logging configuration
def setup_gemini_config(api_key: Optional[str] = None) -> Dict[str, Any]:
"""
Create a configuration for using Gemini Flash via OpenRouter.
Args:
api_key: OpenRouter API key (optional, will try to get from database if not provided)
Returns:
Dictionary with Gemini configuration
"""
# Import database utilities
from local_deep_research.utilities.db_utils import (
get_db_setting,
update_db_setting,
)
# Check if API key exists in database
if not api_key:
api_key = get_db_setting("llm.openai_endpoint.api_key")
if not api_key:
logger.error("No API key found in database and none provided")
return {}
# Create configuration
config = {
"model_name": "google/gemini-2.0-flash",
"provider": "openai_endpoint",
"endpoint_url": "https://openrouter.ai/api/v1",
"api_key": api_key,
}
# Update database with this configuration
update_db_setting("llm.model", config["model_name"])
update_db_setting("llm.provider", config["provider"])
update_db_setting("llm.openai_endpoint.url", config["endpoint_url"])
update_db_setting("llm.openai_endpoint.api_key", config["api_key"])
# Log configuration
logger.info("LLM configuration updated to use Gemini Flash via OpenRouter")
logger.info(f"Model: {config['model_name']}")
logger.info(f"Provider: {config['provider']}")
return config
def run_benchmarks(
examples: int = 5,
benchmarks: List[str] = None,
api_key: Optional[str] = None,
output_dir: Optional[str] = None,
search_iterations: int = 2,
questions_per_iteration: int = 3,
search_tool: str = "searxng",
) -> Dict[str, Any]:
"""
Run benchmarks with Gemini Flash via OpenRouter.
Args:
examples: Number of examples to evaluate for each benchmark
benchmarks: List of benchmarks to run (defaults to ["simpleqa", "browsecomp"])
api_key: OpenRouter API key
output_dir: Directory to save results
search_iterations: Number of search iterations per query
questions_per_iteration: Number of questions per iteration
search_tool: Search engine to use
Returns:
Dictionary with benchmark results
"""
# Import benchmark functions
from local_deep_research.benchmarks.benchmark_functions import (
evaluate_browsecomp,
evaluate_simpleqa,
)
# Set up Gemini configuration
gemini_config = setup_gemini_config(api_key)
if not gemini_config:
return {"error": "Failed to set up Gemini configuration"}
# Create timestamp for output
timestamp = datetime.now(UTC).strftime("%Y%m%d_%H%M%S")
if not output_dir:
output_dir = str(
Path(project_root)
/ "benchmark_results"
/ f"gemini_eval_{timestamp}"
)
Path(output_dir).mkdir(parents=True, exist_ok=True)
# Set benchmark list
if not benchmarks:
benchmarks = ["simpleqa", "browsecomp"]
results = {}
# Run each benchmark
for benchmark in benchmarks:
start_time = time.time()
try:
if benchmark.lower() == "simpleqa":
logger.info(
f"Running SimpleQA benchmark with {examples} examples"
)
benchmark_results = evaluate_simpleqa(
num_examples=examples,
search_iterations=search_iterations,
questions_per_iteration=questions_per_iteration,
search_tool=search_tool,
search_model=gemini_config["model_name"],
search_provider=gemini_config["provider"],
endpoint_url=gemini_config["endpoint_url"],
output_dir=str(Path(output_dir) / "simpleqa"),
)
elif benchmark.lower() == "browsecomp":
logger.info(
f"Running BrowseComp benchmark with {examples} examples"
)
benchmark_results = evaluate_browsecomp(
num_examples=examples,
search_iterations=search_iterations,
questions_per_iteration=questions_per_iteration,
search_tool=search_tool,
search_model=gemini_config["model_name"],
search_provider=gemini_config["provider"],
endpoint_url=gemini_config["endpoint_url"],
output_dir=str(Path(output_dir) / "browsecomp"),
)
else:
logger.warning(f"Unknown benchmark: {benchmark}")
continue
duration = time.time() - start_time
# Log results
logger.info(
f"{benchmark} benchmark completed in {duration:.1f} seconds"
)
if isinstance(benchmark_results, dict):
accuracy = benchmark_results.get("accuracy", "N/A")
logger.info(f"{benchmark} accuracy: {accuracy}")
# Add to results
results[benchmark] = {
"results": benchmark_results,
"duration": duration,
}
except Exception as e:
logger.exception(f"Error running {benchmark} benchmark")
import traceback
traceback.print_exc()
results[benchmark] = {
"error": str(e),
}
# Generate summary
logger.info("=" * 50)
logger.info("BENCHMARK SUMMARY")
logger.info("=" * 50)
logger.info(f"Model: {gemini_config.get('model_name')}")
logger.info(f"Examples per benchmark: {examples}")
for benchmark, benchmark_results in results.items():
if "error" in benchmark_results:
logger.info(f"{benchmark}: ERROR - {benchmark_results['error']}")
else:
accuracy = benchmark_results.get("results", {}).get(
"accuracy", "N/A"
)
duration = benchmark_results.get("duration", 0)
logger.info(
f"{benchmark}: Accuracy = {accuracy}, Duration = {duration:.1f}s"
)
logger.info(f"Results saved to: {output_dir}")
logger.info("=" * 50)
# Save summary to a file
summary_file = str(Path(output_dir) / "benchmark_summary.json")
try:
import json
with open(summary_file, "w", encoding="utf-8") as f:
json.dump(
{
"timestamp": timestamp,
"model": gemini_config.get("model_name"),
"provider": gemini_config.get("provider"),
"examples": examples,
"benchmarks": [b for b in benchmarks],
"results": {
b: {
"accuracy": (
r.get("results", {}).get("accuracy", None)
if "error" not in r
else None
),
"duration": r.get("duration", 0)
if "error" not in r
else 0,
"error": r.get("error", None)
if "error" in r
else None,
}
for b, r in results.items()
},
},
f,
indent=2,
)
logger.info(f"Summary saved to {summary_file}")
except Exception:
logger.exception("Error saving summary")
return {
"status": "complete",
"results": results,
"output_dir": output_dir,
}
def main():
"""Main function to parse arguments and run benchmarks."""
parser = argparse.ArgumentParser(
description="Run benchmarks with Gemini Flash via OpenRouter"
)
# Benchmark configuration
parser.add_argument(
"--examples",
type=int,
default=5,
help="Number of examples for each benchmark",
)
parser.add_argument(
"--benchmarks",
nargs="+",
choices=["simpleqa", "browsecomp"],
help="Benchmarks to run (default: both)",
)
parser.add_argument(
"--search-iterations",
type=int,
default=2,
help="Number of search iterations",
)
parser.add_argument(
"--questions-per-iteration",
type=int,
default=3,
help="Questions per iteration",
)
parser.add_argument(
"--search-tool", default="searxng", help="Search tool to use"
)
# API key
parser.add_argument(
"--api-key", help="OpenRouter API key (optional if already in database)"
)
# Output directory
parser.add_argument(
"--output-dir", help="Directory to save results (optional)"
)
args = parser.parse_args()
# Run benchmarks
results = run_benchmarks(
examples=args.examples,
benchmarks=args.benchmarks,
api_key=args.api_key,
output_dir=args.output_dir,
search_iterations=args.search_iterations,
questions_per_iteration=args.questions_per_iteration,
search_tool=args.search_tool,
)
return 0 if results.get("status") == "complete" else 1
if __name__ == "__main__":
sys.exit(main())