Configuration Guide

August 16, 2026 · View on GitHub

This document is synced to the current code + config files in this repo.


Default Layers (Source of Truth)

Configuration values are resolved in this order (later wins):

  1. Dataclass defaults in code:
    • shinka/core/config.py (EvolutionConfig)
    • shinka/database/dbase.py (DatabaseConfig)
    • shinka/launch/scheduler.py (LocalJobConfig, SlurmDockerJobConfig, SlurmCondaJobConfig)
  2. Hydra preset YAMLs in shinka/configs/
  3. Task/cluster/variant overrides from Hydra composition
  4. CLI overrides (shinka_launch ... key=value, or shinka_run --set ...)
  5. Authoritative shinka_run flags (--results_dir, --num_generations)

Runtime Config Objects

EvolutionConfig (shinka.core.EvolutionConfig)

Concurrency is configured on ShinkaEvolveRunner, not on EvolutionConfig.

ParameterTypeDefaultDescription
task_sys_msgOptional[str]"You are an expert optimization and algorithm design assistant. Improve the program while preserving correctness and immutable regions."Task-specific system prompt.
patch_typesList[str]['diff', 'full', 'cross']Patch formats; supports diff, full, cross.
patch_type_probsList[float][0.6, 0.3, 0.1]Sampling probabilities for patch_types (must sum to 1).
num_generationsint50Target number of generations.
max_patch_resamplesint3Max patch resample loops per novelty attempt.
max_patch_attemptsint1Max attempts to produce a syntactically valid patch.
job_typestr'local'Job backend: local, slurm_docker, slurm_conda.
languagestr'python'Language tag for prompts + file handling.
llm_modelsList[str]['gpt-5-mini', 'gemini-3-flash-preview', 'gemini-3.1-pro-preview', 'gpt-5.4']Mutation model pool.
llm_dynamic_selectionOptional[Union[str, BanditBase]]'ucb'Dynamic model selection (fixed, ucb, ucb1, thompson, or bandit object).
llm_dynamic_selection_kwargsdict{'cost_aware_coef': 0.5}kwargs forwarded to selected bandit.
llm_kwargsdict{'temperatures': [0.0, 0.5, 1.0], 'max_tokens': 16384}kwargs forwarded to LLM calls.
meta_rec_intervalOptional[int]10Generation interval for meta recommendations.
meta_llm_modelsOptional[List[str]]NoneModel pool for meta-recommendations.
meta_llm_kwargsdict{}kwargs for meta-recommendation LLM calls.
meta_max_recommendationsint5Max recommendations produced per meta step.
sample_single_meta_recboolTrueWhether to sample one recommendation when multiple exist.
embedding_modelOptional[str]'text-embedding-3-small'Embedding model for code similarity. Also supports local/<model>@http(s)://host[:port]/v1 for local OpenAI-compatible embedding endpoints, with optional ?api_key_env=ENV_VAR for per-model credentials.
init_program_pathOptional[str]'initial.py'Initial program path.
results_dirOptional[str]NoneResults directory; auto-assigned when None.
enable_wandb_loggingboolFalseMirror evolution metrics to W&B. Existing SQLite and WebUI logging remains enabled. Install the wandb extra first.
wandb_projectOptional[str]'shinka-evolve'W&B project used when wandb logging is enabled.
wandb_entityOptional[str]NoneOptional W&B entity/team.
wandb_groupOptional[str]NoneOptional W&B run group.
wandb_nameOptional[str]NoneOptional W&B run name; defaults to the results directory name.
wandb_modeOptional[str]NoneOptional W&B mode, e.g. offline or disabled.
wandb_tagsList[str][]Optional W&B tags.
wandb_notesOptional[str]NoneOptional W&B run notes.
wandb_dirOptional[str]NoneOptional local W&B directory; defaults to results_dir.
wandb_run_idOptional[str]NoneOptional W&B run ID; otherwise generated and persisted in the results directory.
wandb_resumestr'allow'W&B resume policy used with the persisted run ID.
wandb_configDict[str, Any]{}Extra W&B config values merged into the run config.
max_novelty_attemptsint3Max novelty loops per generation.
code_embed_sim_thresholdfloat0.99Similarity threshold used by novelty checks.
novelty_llm_modelsOptional[List[str]]NoneOptional novelty-judge model pool.
novelty_llm_kwargsdict{}kwargs for novelty-judge LLM calls.
use_text_feedbackboolFalseInclude text feedback in mutation prompts.
max_api_costsOptional[float]NoneAPI budget cap in USD; stops new submissions at cap.
enable_controlled_oversubscriptionboolFalseEnable bounded proposal oversubscription when proposal generation is slower than evaluation.
proposal_target_modestr'adaptive'Proposal target controller mode: adaptive or fixed.
proposal_target_min_samplesint5Minimum completed timing samples required before adaptive targeting activates.
proposal_target_ratio_capfloat2.0Maximum sampling/evaluation ratio used by the adaptive controller.
proposal_buffer_maxint2Maximum extra proposal jobs above max_evaluation_jobs.
proposal_target_hard_capOptional[int]NoneAbsolute cap for the adaptive proposal target.
proposal_target_ewma_alphafloat0.3EWMA smoothing factor for proposal/evaluation timing estimates.
inspiration_sort_orderstr'ascending'Inspiration ordering (ascending, chronological, none).
evolve_promptsboolFalseEnable system-prompt evolution.
prompt_patch_typesList[str]['diff', 'full']Patch formats for prompt evolution.
prompt_patch_type_probsList[float][0.7, 0.3]Sampling probabilities for prompt patch formats.
prompt_evolution_intervalOptional[int]NonePrompt-evolution interval in generations.
prompt_archive_sizeint10Prompt archive size.
prompt_llm_modelsOptional[List[str]]NonePrompt-evolution model pool (falls back to llm_models).
prompt_llm_kwargsdict{}kwargs for prompt-evolution LLM calls.
prompt_ucb_exploration_constantfloat1.0UCB exploration constant for prompt sampler.
prompt_epsilonfloat0.1Epsilon-greedy exploration for prompt sampler.
prompt_evo_top_k_programsint3Number of top programs used during prompt evolution.
prompt_percentile_recompute_intervalint20Generations between prompt percentile recomputations.

W&B logging examples:

# Install the optional integration.
pip install 'shinka-evolve[wandb]'

# Authenticate online runs. In CI, provide this through a secret manager.
export WANDB_API_KEY=<your-api-key>

# Add W&B metrics and a compact final table alongside the WebUI database.
shinka_run --task-dir examples/circle_packing --results_dir results/circle_wandb --num_generations 20 \
  --set evo.enable_wandb_logging=true \
  --set evo.wandb_project=shinka-evolve

Population and island snapshots use the monotonic population/evaluated_count axis. They include counts, correctness, scores, cumulative cost/*, and cumulative timing/*_total. Raw evaluated candidates use score/individual and individual/* fields without binding those events to generation. Administrative island copies remain in population/table counts but are excluded from evaluated count, candidate history, and costs. The compact population/final_table omits program code, embeddings, and unrestricted metadata. When a results directory is resumed, its .wandb_run_id is reused with wandb_resume='allow' by default. Online mode uses credentials from wandb login or WANDB_API_KEY; set wandb_mode=offline to record locally without uploading. W&B failures are non-fatal and do not alter the existing database or WebUI path.

The integration disables W&B console, Git, code, requirements, machine, and system-stat capture. Its run config contains only an explicit allowlist of safe scalar experiment settings; wandb_config remains an explicit extension and is recursively redacted for secret-like keys. Arbitrary wandb_config values cross the upload boundary when their keys are not recognized as sensitive, so do not put secrets or private data there. Candidate events omit private metrics and include at most 64 public numeric metrics whose full keys are at most 128 characters; secret-like keys are discarded. Population snapshots use a compact database aggregate on a dedicated serialized telemetry worker, run at most once every five seconds, and overlapping refresh requests are coalesced. If the bounded raw-candidate queue saturates, the newest candidate event is dropped with a rate-limited warning; population and final snapshots remain authoritative.

DatabaseConfig (shinka.database.DatabaseConfig)

ParameterTypeDefaultDescription
db_pathOptional[str]NoneSQLite DB path.
num_islandsint2Number of islands.
archive_sizeint40Global archive size cap.
elite_selection_ratiofloat0.3Fraction of elite inspirations.
num_archive_inspirationsint1Number of archive inspirations sampled.
num_top_k_inspirationsint1Number of top-k inspirations sampled.
migration_intervalint10Generations between migration events.
migration_ratefloat0.0Fraction of programs migrated at migration events.
island_elitismboolTruePreserve best programs on islands.
enforce_island_separationboolTrueRestrict inspiration sampling to source island.
island_selection_strategystr'uniform'Island sampler: uniform, equal, proportional, weighted.
enable_dynamic_islandsboolFalseEnable stagnation-triggered island spawning.
stagnation_thresholdint100No-improvement generations before spawn.
island_spawn_strategystr'initial'Spawn seed: initial, best, archive_random.
island_spawn_subtree_sizeint1Number of copied programs when spawning.
parent_selection_strategystr'weighted'Parent selector: weighted, power_law, beam_search.
exploitation_alphafloat1.0Power-law strength for parent selection.
exploitation_ratiofloat0.2Probability of selecting from archive.
parent_selection_lambdafloat10.0Sigmoid sharpness for weighted parent selection.
num_beamsint5Beam count for beam-search parent selection.
archive_selection_strategystr'fitness'Archive replacement strategy: fitness or crowding.
archive_criteriaDict[str, float]{'combined_score': 1.0}Weighted criteria for fitness archive scoring.

Job Configs (shinka.launch.*JobConfig)

JobConfig base fields:

ParameterTypeDefaultDescription
eval_program_pathOptional[str]'evaluate.py'Evaluation script path.
extra_cmd_argsDict[str, Any]{}Extra CLI args forwarded to eval script.

LocalJobConfig adds:

ParameterTypeDefaultDescription
timeOptional[str]NoneOptional timeout (HH:MM:SS).
conda_envOptional[str]NoneOptional conda env for local execution.
activate_scriptOptional[str]NoneOptional sourceable env script, e.g. .venv/bin/activate.

SlurmDockerJobConfig adds:

ParameterTypeDefaultDescription
imagestr'ubuntu:latest'Docker image.
image_tar_pathOptional[str]NoneOptional image tar for upload/load.
docker_flagsstr''Extra docker flags.
partitionstr'gpu'SLURM partition.
timestr'01:00:00'SLURM time limit.
cpusint1CPU request.
gpusint1GPU request.
memOptional[str]'8G'Memory request.

SlurmCondaJobConfig / SlurmEnvJobConfig add:

ParameterTypeDefaultDescription
conda_envstr''Conda environment name.
activate_scriptOptional[str]NoneSourceable env script path, e.g. .venv/bin/activate.
modulesOptional[List[str]]NoneModules to load (normalized to [] at runtime).
partitionstr'gpu'SLURM partition.
timestr'01:00:00'SLURM time limit.
cpusint1CPU request.
gpusint1GPU request.
memOptional[str]'8G'Memory request.

conda_env and activate_script are mutually exclusive.


Hydra Presets

Evolution Presets

All shinka/configs/evolution/*.yaml set runner-level concurrency at the top level and override EvolutionConfig defaults only for listed evo_config keys.

shinka/configs/evolution/small_budget.yaml

max_evaluation_jobs: 1
max_proposal_jobs: 2
max_db_workers: 2

evo_config:
  patch_types: ["diff", "full"]
  patch_type_probs: [0.5, 0.5]
  num_generations: 20
  max_patch_attempts: 10
  llm_models: ["gpt-4.1"]
  llm_dynamic_selection: null
  embedding_model: "text-embedding-3-small"
  enable_controlled_oversubscription: false
  results_dir: ${output_dir}

shinka/configs/evolution/medium_budget.yaml

max_evaluation_jobs: 4
max_proposal_jobs: 6
max_db_workers: 2

evo_config:
  patch_types: ["diff", "full", "cross"]
  patch_type_probs: [0.6, 0.3, 0.1]
  num_generations: 50
  max_patch_resamples: 3
  max_patch_attempts: 1
  llm_models:
    - "gpt-5-mini"
    - "gemini-3-flash-preview"
    - "gemini-3.1-pro-preview"
    - "gpt-5.4"
  llm_dynamic_selection: ucb
  llm_dynamic_selection_kwargs:
    cost_aware_coef: 0.5
  llm_kwargs:
    temperatures: [0.0, 0.5, 1.0]
    max_tokens: 16384
  meta_rec_interval: 10
  embedding_model: "text-embedding-3-small"
  code_embed_sim_threshold: 0.99
  enable_controlled_oversubscription: false
  proposal_target_mode: adaptive
  proposal_target_min_samples: 5
  proposal_target_ratio_cap: 2.0
  proposal_buffer_max: 2
  proposal_target_ewma_alpha: 0.3
  results_dir: ${output_dir}

shinka/configs/evolution/large_budget.yaml

max_evaluation_jobs: 6
max_proposal_jobs: 8
max_db_workers: 2

evo_config:
  patch_types: ["diff", "full", "cross"]
  patch_type_probs: [0.4, 0.4, 0.2]
  num_generations: 300
  max_patch_resamples: 3
  max_patch_attempts: 3
  llm_models:
    - "gpt-4.1"
    - "gpt-4.1-mini"
    - "gpt-4.1-nano"
    - "us.anthropic.claude-sonnet-4-6-v1:0"
    - "o4-mini"
  llm_dynamic_selection: ucb
  llm_kwargs:
    temperatures: [0.0, 0.5, 1.0]
    max_tokens: 16384
  meta_rec_interval: 10
  meta_llm_models: ["gpt-4.1"]
  meta_llm_kwargs:
    temperatures: [0.0]
  embedding_model: "text-embedding-3-small"
  enable_controlled_oversubscription: false
  proposal_target_mode: adaptive
  proposal_target_min_samples: 5
  proposal_target_ratio_cap: 2.0
  proposal_buffer_max: 2
  proposal_target_hard_cap: 8
  proposal_target_ewma_alpha: 0.3
  results_dir: ${output_dir}

Controlled Oversubscription

When proposal generation is slower than evaluation, Shinka can keep extra proposal tasks in flight so evaluation workers spend less time idle.

  • max_evaluation_jobs still caps evaluation concurrency.
  • max_proposal_jobs becomes the hard ceiling for proposal generation tasks.
  • the controller raises the proposal target above evaluation concurrency only when observed sampling_seconds > evaluation_seconds
  • the oversubscription is bounded by proposal_buffer_max, proposal_target_ratio_cap, proposal_target_hard_cap, and max_proposal_jobs

Recommended starting point:

max_evaluation_jobs: 5
max_proposal_jobs: 7
max_db_workers: 2

evo_config:
  enable_controlled_oversubscription: true
  proposal_target_mode: adaptive
  proposal_target_min_samples: 5
  proposal_target_ratio_cap: 2.0
  proposal_buffer_max: 2
  proposal_target_hard_cap: 7
  proposal_target_ewma_alpha: 0.3

Use max_proposal_jobs: 1 if you want sync-like proposal behavior with no proposal backlog.

Database Presets

All shinka/configs/database/*.yaml override DatabaseConfig defaults only for listed keys.

shinka/configs/database/island_small.yaml

db_config:
  db_path: "evolution_db.sqlite"
  num_islands: 2
  archive_size: 20
  exploitation_ratio: 0.2
  elite_selection_ratio: 0.3
  num_archive_inspirations: 4
  num_top_k_inspirations: 2
  migration_interval: 10
  migration_rate: 0.1
  island_elitism: true

shinka/configs/database/island_medium.yaml

db_config:
  db_path: "evolution_db.sqlite"
  num_islands: 2
  archive_size: 40
  elite_selection_ratio: 0.3
  num_archive_inspirations: 1
  num_top_k_inspirations: 1
  migration_interval: 10
  migration_rate: 0.0
  island_elitism: true
  enforce_island_separation: true
  parent_selection_strategy: "weighted"
  parent_selection_lambda: 10.0

shinka/configs/database/island_large.yaml

db_config:
  db_path: "evolution_db.sqlite"
  num_islands: 5
  archive_size: 40
  elite_selection_ratio: 0.3
  num_archive_inspirations: 4
  num_top_k_inspirations: 2
  migration_interval: 10
  migration_rate: 0.1
  island_elitism: true
  parent_selection_strategy: "weighted"
  exploitation_alpha: 1.0
  exploitation_ratio: 0.2
  parent_selection_lambda: 10.0

Cluster Presets

  • shinka/configs/cluster/local.yaml
    • job_config: LocalJobConfig
    • job_config.eval_program_path: ${distributed_job_config.eval_program_path}
    • evo_config.job_type: "local"
  • shinka/configs/cluster/remote.yaml
    • job_config: ${distributed_job_config}
  • shinka/configs/cluster/gcp.yaml
    • inherits remote
    • overrides distributed_job_config.partition: "a3,aisci"

Task Presets (Current)

Only these task files currently exist:

  • shinka/configs/task/circle_packing.yaml
  • shinka/configs/task/novelty_generator.yaml

Both define task-specific evaluate_function, distributed_job_config, and evo_config task prompt/init path.


Current Hydra Composition Defaults

shinka/configs/config.yaml defaults chain:

defaults:
  - _self_
  - database@_global_: island_medium
  - evolution@_global_: medium_budget
  - task@_global_: circle_packing
  - cluster@_global_: local
  - variant@_global_: default

So default shinka_launch behavior is a neutral medium shared baseline on the circle_packing task with variant=default. Example-heavy stacks remain available via explicit variants such as variant=circle_packing_example.


shinka_run Config File Schema

shinka_run --config-fname <yaml> accepts:

  • Namespaces: evo, db, job (aliases: evo_config, db_config, job_config)
  • Runner keys: max_evaluation_jobs, max_proposal_jobs, max_db_workers, verbose, debug

Precedence for shinka_run:

  1. defaults from CLI builder
  2. config YAML (--config-fname)
  3. --set overrides
  4. authoritative flags:
    • --results_dir always sets evo.results_dir
    • --num_generations always sets evo.num_generations

Config Directory Structure

shinka/configs/
├── config.yaml
├── cluster/
│   ├── gcp.yaml
│   ├── local.yaml
│   └── remote.yaml
├── database/
│   ├── island_large.yaml
│   ├── island_medium.yaml
│   └── island_small.yaml
├── evolution/
│   ├── large_budget.yaml
│   ├── medium_budget.yaml
│   └── small_budget.yaml
├── task/
│   ├── circle_packing.yaml
│   └── novelty_generator.yaml
└── variant/
    ├── circle_packing_example.yaml
    ├── default.yaml
    └── novelty_generator_example.yaml

Quick Valid Overrides

Hydra launch:

shinka_launch \
  task=novelty_generator \
  database=island_medium \
  evolution=medium_budget \
  cluster=local \
  evo_config.num_generations=50 \
  evo_config.max_api_costs=25.0

shinka_run:

shinka_run \
  --task-dir examples/circle_packing \
  --results_dir results/circle_agent \
  --num_generations 40 \
  --max-evaluation-jobs 6 \
  --set evo.llm_models='["gpt-5-mini","gemini-3-flash-preview"]' \
  --set evo.llm_dynamic_selection=ucb \
  --set db.num_islands=2