$ -weight: 500;">git clone https://github.com/dwzhu-pku/PaperBanana.-weight: 500;">git
cd PaperBanana
-weight: 500;">git clone https://github.com/dwzhu-pku/PaperBanana.-weight: 500;">git
cd PaperBanana
-weight: 500;">git clone https://github.com/dwzhu-pku/PaperBanana.-weight: 500;">git
cd PaperBanana
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/-weight: 500;">install.ps1 | iex"
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/-weight: 500;">install.ps1 | iex"
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/-weight: 500;">install.ps1 | iex"
-weight: 500;">curl -LsSf https://astral.sh/uv/-weight: 500;">install.sh | sh
-weight: 500;">curl -LsSf https://astral.sh/uv/-weight: 500;">install.sh | sh
-weight: 500;">curl -LsSf https://astral.sh/uv/-weight: 500;">install.sh | sh
-weight: 500;">curl -LsSf https://astral.sh/uv/-weight: 500;">install.sh | sh
-weight: 500;">curl -LsSf https://astral.sh/uv/-weight: 500;">install.sh | sh
-weight: 500;">curl -LsSf https://astral.sh/uv/-weight: 500;">install.sh | sh
uv venv
.venv\Scripts\activate
uv python -weight: 500;">install 3.12
uv -weight: 500;">pip -weight: 500;">install -r requirements.txt
uv venv
.venv\Scripts\activate
uv python -weight: 500;">install 3.12
uv -weight: 500;">pip -weight: 500;">install -r requirements.txt
uv venv
.venv\Scripts\activate
uv python -weight: 500;">install 3.12
uv -weight: 500;">pip -weight: 500;">install -r requirements.txt
uv venv
source .venv/bin/activate
uv python -weight: 500;">install 3.12
uv -weight: 500;">pip -weight: 500;">install -r requirements.txt
uv venv
source .venv/bin/activate
uv python -weight: 500;">install 3.12
uv -weight: 500;">pip -weight: 500;">install -r requirements.txt
uv venv
source .venv/bin/activate
uv python -weight: 500;">install 3.12
uv -weight: 500;">pip -weight: 500;">install -r requirements.txt
defaults: main_model_name: "google/gemini-2.5-pro" image_gen_model_name: "google/imagen-3" api_keys: google_api_key: "tu-clave-aqui" # openrouter_api_key: "tu-clave-openrouter"
defaults: main_model_name: "google/gemini-2.5-pro" image_gen_model_name: "google/imagen-3" api_keys: google_api_key: "tu-clave-aqui" # openrouter_api_key: "tu-clave-openrouter"
defaults: main_model_name: "google/gemini-2.5-pro" image_gen_model_name: "google/imagen-3" api_keys: google_api_key: "tu-clave-aqui" # openrouter_api_key: "tu-clave-openrouter"
python main.py \ --dataset_name "PaperBananaBench" \ --task_name "diagram" \ --split_name "test" \ --exp_mode "dev_full" \ --retrieval_setting "auto"
python main.py \ --dataset_name "PaperBananaBench" \ --task_name "diagram" \ --split_name "test" \ --exp_mode "dev_full" \ --retrieval_setting "auto"
python main.py \ --dataset_name "PaperBananaBench" \ --task_name "diagram" \ --split_name "test" \ --exp_mode "dev_full" \ --retrieval_setting "auto"
streamlit run demo.py
streamlit run demo.py
streamlit run demo.py
import subprocess
import json
from pathlib import Path def generate_figure(figure_id, method_text, caption, mode="dev_full"): spec = { "figure_id": figure_id, "method": method_text, "caption": caption, } spec_path = Path(f"tmp/{figure_id}.json") spec_path.parent.mkdir(exist_ok=True) spec_path.write_text(json.dumps(spec, ensure_ascii=False)) subprocess.run([ "python", "main.py", "--task_name", "diagram", "--exp_mode", mode, "--retrieval_setting", "auto", "--input_spec", str(spec_path), ], check=True) figuras = json.loads(Path("paper/figures.json").read_text())
for f in figuras: generate_figure(f["id"], f["method"], f["caption"])
import subprocess
import json
from pathlib import Path def generate_figure(figure_id, method_text, caption, mode="dev_full"): spec = { "figure_id": figure_id, "method": method_text, "caption": caption, } spec_path = Path(f"tmp/{figure_id}.json") spec_path.parent.mkdir(exist_ok=True) spec_path.write_text(json.dumps(spec, ensure_ascii=False)) subprocess.run([ "python", "main.py", "--task_name", "diagram", "--exp_mode", mode, "--retrieval_setting", "auto", "--input_spec", str(spec_path), ], check=True) figuras = json.loads(Path("paper/figures.json").read_text())
for f in figuras: generate_figure(f["id"], f["method"], f["caption"])
import subprocess
import json
from pathlib import Path def generate_figure(figure_id, method_text, caption, mode="dev_full"): spec = { "figure_id": figure_id, "method": method_text, "caption": caption, } spec_path = Path(f"tmp/{figure_id}.json") spec_path.parent.mkdir(exist_ok=True) spec_path.write_text(json.dumps(spec, ensure_ascii=False)) subprocess.run([ "python", "main.py", "--task_name", "diagram", "--exp_mode", mode, "--retrieval_setting", "auto", "--input_spec", str(spec_path), ], check=True) figuras = json.loads(Path("paper/figures.json").read_text())
for f in figuras: generate_figure(f["id"], f["method"], f["caption"]) - Retriever Agent — identifica diagramas de referencia relevantes en una colección curada para guiar a los agentes siguientes. Es el paso que le da el carácter reference-driven al sistema.- Planner Agent — traduce el contenido del método y la intención comunicativa en descripciones textuales detalladas, usando in-context learning con los ejemplos recuperados.- Stylist Agent — refina las descripciones para que cumplan con estándares estéticos académicos, usando guías de estilo sintetizadas automáticamente.- Visualizer Agent — transforma esas descripciones en imágenes reales mediante modelos generativos de última generación.- Critic Agent — cierra un bucle de refinamiento iterativo con el Visualizer, criticando el resultado y pidiendo mejoras en varias rondas. - task_name — diagram para ilustraciones conceptuales, plot para gráficos de datos.- exp_mode — determina qué agentes intervienen. vanilla genera directo sin planificar, dev_planner añade planificación, dev_full corre el pipeline completo con los cinco agentes.- retrieval_setting — auto, manual, random o none. Con none se salta el Retriever. - Necesitás borradores rápidos de diagramas conceptuales para discutir con coautores antes de encargar la versión final.- Trabajás con papers iterativos donde la arquitectura cambia seguido y rehacer figuras manualmente es costoso.- Buscás explorar múltiples estilos visuales para la misma idea y comparar en paralelo.- Querés aprovechar modelos de visión de frontera sin construir tu propio pipeline de agentes. - Necesitás gráficos editables en formato vectorial con precisión milimétrica. PaperBanana produce imágenes rasterizadas; para SVG editable existen otras opciones.- Tu figura depende de datos exactos que deben ser matemáticamente precisos, como curvas de rendimiento o barras de error. Para plots estadísticos rigurosos seguís necesitando matplotlib, seaborn o ggplot.- Tenés requisitos estrictos de accesibilidad, branding corporativo o cumplimiento gráfico que exigen control pixel a pixel.- Operás sin conexión o en un entorno sin APIs externas. El framework depende de modelos en la nube. - PaperVizAgent — la versión original publicada por Google Research que dio origen a PaperBanana. Útil como referencia del diseño inicial del pipeline.- AutoFigure-Edit — proyecto de ResearAI enfocado en la edición automática de figuras existentes, complementario a la generación desde cero.- Paper2Any — de OpenDCAI, explora la conversión directa de contenido de paper a diversos formatos visuales.- Edit-Banana — del BIT-DataLab, orientado a figuras editables, algo que PaperBanana aún no cubre nativamente.- PaperBanana-Pro — fork comunitario con soporte mejorado para chino y un pipeline más estable para usuarios finales. - Repositorio oficial de PaperBanana en GitHub- Sitio oficial del proyecto- Paper de PaperBanana en Hugging Face- Demo interactivo en Hugging Face Spaces- Dataset PaperBananaBench- PaperVizAgent, versión original de Google Research- Instalación de uv (Astral)