This framework is designed to create your own experiments with LLMs and code vulnerability benchmarks.
Jupyter Notebook
2
140 commits
updated Oct 10, 2026
✨ Features | ⚡️ Quickstart | 📦 Installation | 📊 Metrics | 📚 Datasets | 📜 Citation
I will help you there:
A comprehensive framework for benchmarking Large Language Models on static code analysis and vulnerability detection tasks. This framework supports multiple LLM models, datasets, and evaluation metrics for binary and multi-class classification tasks.
git clone <your-repo-url>
cd llm4codesec-framework
git submodule update --init --recursive
cp .default.env .env
Put your hugging face token in HF_TOKEN. You can get your token here
Your .env should looks like:
PYTHONPATH=src/
LOG_LEVEL=INFO
LOG_FORMAT='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
HF_TOKEN='hf_blabla...'
PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
If you plan to use the vLLM backend, ensure vLLM is installed and you are running on Linux with CUDA support.
Watch carefully for any warning/errors logs! You might get wrong results in case of incorrect configuration
./build_docker.sh
./run_full_benchmark.sh
./build_docker.sh
alias run_benchmark="docker-compose run --rm llm4codesec-benchmark python"
# CASTLE experiments
run_benchmark entrypoints/run_setup_castle_dataset.py
for plan in small_models_binary small_models_multiclass large_models_binary large_models_multiclass; do
run_benchmark -m cli run-plan castle --plan $plan
done
# CVEFixes experiments
run_benchmark entrypoints/run_setup_cvefixes_datasets.py \
--database-path datasets_processed/cvefixes/CVEfixes.db \
--languages C Java Python
for plan in small_models_binary small_models_multiclass large_models_binary large_models_multiclass; do
run_benchmark -m cli run-plan cvefixes --plan $plan
done
Check for actual instruction here
Use docker cuda ready VPC image. For example in selectel
./build_docker.sh
Install only the dependencies for your chosen backend:
# HuggingFace transformers backend
uv sync --extra hf
# vLLM backend (Linux/CUDA only)
uv sync --extra vllm
# llama.cpp backend
uv sync --extra llama-cpp
# Multiple backends at once
uv sync --extra hf --extra vllm
PYTHONPATH=src python -m cli run-plan castle --plan quick_test
# Split config mode (shared models/prompts + explicit experiments/datasets)
PYTHONPATH=src python -m cli run-plan castle \
--config-dir src/configs/shared \
--experiments-config src/configs/castle/experiments.json \
--datasets-config src/configs/castle/datasets.json \
--plan quick_test
PYTHONPATH=src python -m cli run-plan cvefixes \
--plan quick_test \
--sample-limit 100 \
--output-dir results/cvefixes_test
PYTHONPATH=src python -m cli run-plan jitvul \
--plan quick_test \
--sample-limit 100 \
--output-dir results/jitvul_test
PYTHONPATH=src python -m cli run-plan vulbench \
--plan quick_test \
--output-dir results/vulbench_test
# Dedicated sampling-parameter sweep configs
python -m cli run-plan castle \
--config-dir src/configs/parameter_sweeps \
--plan sampling_sweep_quick
python -m cli run-plan cvefixes \
--config-dir src/configs/parameter_sweeps \
--plan sampling_sweep_binary
# Run all sampling sweep plans in sequence through Docker
bash scripts/run_parameter_sweeps.sh
# Build processed datasets for the ContextAssembler compare-rankings study
bash scripts/run_context_assembler_compare_rankings.sh
# Quick validation of the compare-rankings configs with shared models/prompts
PYTHONPATH=src python -m cli run-plan context_assembler \
--config-dir src/configs/shared \
--experiments-config src/configs/context_assembler_compare_rankings/experiments.json \
--datasets-config src/configs/context_assembler_compare_rankings/datasets.json \
quick_smoke_test
# Full compare-rankings evaluation across requested vLLM models
PYTHONPATH=src python -m cli run-plan context_assembler \
--config-dir src/configs/shared \
--experiments-config src/configs/context_assembler_compare_rankings/experiments.json \
--datasets-config src/configs/context_assembler_compare_rankings/datasets.json \
vllm_compare_rankings
# Apple Silicon smoke test with llama.cpp and a smaller Qwen3 4B GGUF quant
PYTHONPATH=src python -m cli run-plan context_assembler \
--config-dir src/configs/shared \
--experiments-config src/configs/context_assembler_compare_rankings/experiments.json \
--datasets-config src/configs/context_assembler_compare_rankings/datasets.json \
llama_cpp_m1_smoke_test
The benchmark config schema now supports these model-level generation settings:
temperaturetop_ptop_kmin_ppresence_penaltyrepetition_penaltyUse the dedicated sweep configs in src/configs/parameter_sweeps to study one parameter at a time on existing datasets without changing the default shared model catalog.
Backend notes:
vllm applies all of the parameters above.hf currently applies temperature, top_p, top_k, and repetition_penalty.llama_cpp applies supported parameters exposed by the installed binding and logs a warning for unsupported ones.import json
import pandas as pd
# Load results
with open('./results/benchmark_report_20241203_143022.json', 'r') as f:
results = json.load(f)
# Print summary
print(f"Model: {results['benchmark_info']['model_name']}")
print(f"Accuracy: {results['metrics']['accuracy']:.4f}")
print(f"F1-Score: {results['metrics']['f1_score']:.4f}")
# Load predictions for detailed analysis
predictions_df = pd.read_csv('./results/predictions_20241203_143022.csv')
print(predictions_df.groupby(['true_label', 'predicted_label']).size())
Additional documentation can be found in docs/ directory
If you use this framework in your research, please cite:
@article{gladkikh2026llm4codesec,
title={LLM4CodeSec: A Framework for Evaluating the Effectiveness of Large Language Models in Source Code Vulnerability Detection},
author={Gladkikh, Kirill I. and Zakharov, Aleksei A. and Zakharova, Irina G.},
journal={International Journal of Open Information Technologies},
volume={14},
number={3},
pages={94--100},
year={2026},
url={https://cyberleninka.ru/article/n/llm4codesec-a-framework-for-evaluating-the-effectiveness-of-large-language-models-in-source-code-vulnerability-detection}
}
This framework is designed to create your own experiments with LLMs and code vulnerability benchmarks.
Jupyter Notebook
2
140 commits
updated Oct 10, 2026
✨ Features | ⚡️ Quickstart | 📦 Installation | 📊 Metrics | 📚 Datasets | 📜 Citation
I will help you there:
A comprehensive framework for benchmarking Large Language Models on static code analysis and vulnerability detection tasks. This framework supports multiple LLM models, datasets, and evaluation metrics for binary and multi-class classification tasks.
git clone <your-repo-url>
cd llm4codesec-framework
git submodule update --init --recursive
cp .default.env .env
Put your hugging face token in HF_TOKEN. You can get your token here
Your .env should looks like:
PYTHONPATH=src/
LOG_LEVEL=INFO
LOG_FORMAT='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
HF_TOKEN='hf_blabla...'
PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
If you plan to use the vLLM backend, ensure vLLM is installed and you are running on Linux with CUDA support.
Watch carefully for any warning/errors logs! You might get wrong results in case of incorrect configuration
./build_docker.sh
./run_full_benchmark.sh
./build_docker.sh
alias run_benchmark="docker-compose run --rm llm4codesec-benchmark python"
# CASTLE experiments
run_benchmark entrypoints/run_setup_castle_dataset.py
for plan in small_models_binary small_models_multiclass large_models_binary large_models_multiclass; do
run_benchmark -m cli run-plan castle --plan $plan
done
# CVEFixes experiments
run_benchmark entrypoints/run_setup_cvefixes_datasets.py \
--database-path datasets_processed/cvefixes/CVEfixes.db \
--languages C Java Python
for plan in small_models_binary small_models_multiclass large_models_binary large_models_multiclass; do
run_benchmark -m cli run-plan cvefixes --plan $plan
done
Check for actual instruction here
Use docker cuda ready VPC image. For example in selectel
./build_docker.sh
Install only the dependencies for your chosen backend:
# HuggingFace transformers backend
uv sync --extra hf
# vLLM backend (Linux/CUDA only)
uv sync --extra vllm
# llama.cpp backend
uv sync --extra llama-cpp
# Multiple backends at once
uv sync --extra hf --extra vllm
PYTHONPATH=src python -m cli run-plan castle --plan quick_test
# Split config mode (shared models/prompts + explicit experiments/datasets)
PYTHONPATH=src python -m cli run-plan castle \
--config-dir src/configs/shared \
--experiments-config src/configs/castle/experiments.json \
--datasets-config src/configs/castle/datasets.json \
--plan quick_test
PYTHONPATH=src python -m cli run-plan cvefixes \
--plan quick_test \
--sample-limit 100 \
--output-dir results/cvefixes_test
PYTHONPATH=src python -m cli run-plan jitvul \
--plan quick_test \
--sample-limit 100 \
--output-dir results/jitvul_test
PYTHONPATH=src python -m cli run-plan vulbench \
--plan quick_test \
--output-dir results/vulbench_test
# Dedicated sampling-parameter sweep configs
python -m cli run-plan castle \
--config-dir src/configs/parameter_sweeps \
--plan sampling_sweep_quick
python -m cli run-plan cvefixes \
--config-dir src/configs/parameter_sweeps \
--plan sampling_sweep_binary
# Run all sampling sweep plans in sequence through Docker
bash scripts/run_parameter_sweeps.sh
# Build processed datasets for the ContextAssembler compare-rankings study
bash scripts/run_context_assembler_compare_rankings.sh
# Quick validation of the compare-rankings configs with shared models/prompts
PYTHONPATH=src python -m cli run-plan context_assembler \
--config-dir src/configs/shared \
--experiments-config src/configs/context_assembler_compare_rankings/experiments.json \
--datasets-config src/configs/context_assembler_compare_rankings/datasets.json \
quick_smoke_test
# Full compare-rankings evaluation across requested vLLM models
PYTHONPATH=src python -m cli run-plan context_assembler \
--config-dir src/configs/shared \
--experiments-config src/configs/context_assembler_compare_rankings/experiments.json \
--datasets-config src/configs/context_assembler_compare_rankings/datasets.json \
vllm_compare_rankings
# Apple Silicon smoke test with llama.cpp and a smaller Qwen3 4B GGUF quant
PYTHONPATH=src python -m cli run-plan context_assembler \
--config-dir src/configs/shared \
--experiments-config src/configs/context_assembler_compare_rankings/experiments.json \
--datasets-config src/configs/context_assembler_compare_rankings/datasets.json \
llama_cpp_m1_smoke_test
The benchmark config schema now supports these model-level generation settings:
temperaturetop_ptop_kmin_ppresence_penaltyrepetition_penaltyUse the dedicated sweep configs in src/configs/parameter_sweeps to study one parameter at a time on existing datasets without changing the default shared model catalog.
Backend notes:
vllm applies all of the parameters above.hf currently applies temperature, top_p, top_k, and repetition_penalty.llama_cpp applies supported parameters exposed by the installed binding and logs a warning for unsupported ones.import json
import pandas as pd
# Load results
with open('./results/benchmark_report_20241203_143022.json', 'r') as f:
results = json.load(f)
# Print summary
print(f"Model: {results['benchmark_info']['model_name']}")
print(f"Accuracy: {results['metrics']['accuracy']:.4f}")
print(f"F1-Score: {results['metrics']['f1_score']:.4f}")
# Load predictions for detailed analysis
predictions_df = pd.read_csv('./results/predictions_20241203_143022.csv')
print(predictions_df.groupby(['true_label', 'predicted_label']).size())
Additional documentation can be found in docs/ directory
If you use this framework in your research, please cite:
@article{gladkikh2026llm4codesec,
title={LLM4CodeSec: A Framework for Evaluating the Effectiveness of Large Language Models in Source Code Vulnerability Detection},
author={Gladkikh, Kirill I. and Zakharov, Aleksei A. and Zakharova, Irina G.},
journal={International Journal of Open Information Technologies},
volume={14},
number={3},
pages={94--100},
year={2026},
url={https://cyberleninka.ru/article/n/llm4codesec-a-framework-for-evaluating-the-effectiveness-of-large-language-models-in-source-code-vulnerability-detection}
}