Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,37 @@
CRS_PROJ_DIR = Path("/out/crs/proj")
OSS_SRC_DIR = Path(os.getenv("SRC", "/src"))
CRS_SRC_DIR = Path("/out/crs/src")
CRS_CODEQL_DB_DIR = Path("/out/crs/codeql-db")


def run_ossfuzz_build():
env = os.environ.copy()
subprocess.run(["/usr/local/bin/compile"], env=env, check=True)
def build_and_create_codeql_database():
"""Run OSS-Fuzz compile under CodeQL trace.

This both builds the target (jars, fuzz harnesses → /out) and creates the
CodeQL database, in a single invocation. Running compile twice (once normally,
once under trace) would cause Maven to skip recompilation on the second run,
leaving the CodeQL database with stub-only classes.
"""
print(f"Creating CodeQL database from {OSS_SRC_DIR}")
if CRS_CODEQL_DB_DIR.exists():
shutil.rmtree(CRS_CODEQL_DB_DIR)

result = subprocess.run(
[
"codeql", "database", "create",
str(CRS_CODEQL_DB_DIR),
"--language=java",
f"--source-root={OSS_SRC_DIR}",
"--command=/usr/local/bin/compile",
"--overwrite",
],
check=True,
)

if CRS_CODEQL_DB_DIR.exists():
print(f"CodeQL database created at {CRS_CODEQL_DB_DIR}")
else:
print(f"WARNING: CodeQL database creation failed (ret={result.returncode})")


def prepare_crs_src():
Expand All @@ -28,10 +54,12 @@ def submit_build_outputs():
subprocess.run(["libCRS", "submit-build-output", "/out", "build"], check=True)
subprocess.run(["libCRS", "submit-build-output", str(CRS_PROJ_DIR), "crs/proj"], check=True)
subprocess.run(["libCRS", "submit-build-output", str(CRS_SRC_DIR), "crs/src"], check=True)
if CRS_CODEQL_DB_DIR.exists():
subprocess.run(["libCRS", "submit-build-output", str(CRS_CODEQL_DB_DIR), "crs/codeql-db"], check=True)


def main():
run_ossfuzz_build()
build_and_create_codeql_database()
prepare_crs_src()
submit_build_outputs()

Expand Down
231 changes: 115 additions & 116 deletions crs/Dockerfile.crs
Original file line number Diff line number Diff line change
Expand Up @@ -77,89 +77,89 @@ RUN mkdir /classpath && mkdir /classpath/atl-jazzer && \
#################################################################################
## Staged Images - Prebuilt atl-libafl-jazzer
#################################################################################
FROM aixcc_afc_builder_base AS atl_jazzer_libafl_builder

# libAFL requires bindgen which requires libclang.
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y libclang-dev

COPY fuzzers/atl-libafl-jazzer /app/crs-cp-java/fuzzers/atl-libafl-jazzer
COPY fuzzers/jazzer-libafl /app/crs-cp-java/fuzzers/jazzer-libafl
WORKDIR /app/crs-cp-java/fuzzers/atl-libafl-jazzer
RUN yes | adduser --disabled-password builder && \
chown -R builder . && chown -R builder ../jazzer-libafl/

USER builder:builder
# Install Rust.
RUN curl https://sh.rustup.rs -sSf | sh -s -- --component llvm-tools --default-toolchain nightly-2025-06-04 -y
ENV PATH="/home/builder/.cargo/bin:${PATH}"
RUN ln -sf /home/builder/.rustup/toolchains/nightly-2025-06-04-x86_64-unknown-linux-gnu /home/builder/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu
RUN echo "build --java_runtime_version=local_jdk_17" >> .bazelrc \
&& echo "build --cxxopt=-stdlib=libc++" >> .bazelrc \
&& echo "build --linkopt=-lc++" >> .bazelrc
RUN echo "build --experimental_repository_downloader_retries=5" >> .bazelrc \
&& echo "build --http_timeout_scaling=2" >> .bazelrc \
&& echo "build --repository_cache=/home/builder/.cache/bazel-repo" >> .bazelrc
RUN bazel build \
//src/main/java/com/code_intelligence/jazzer:jazzer_standalone_deploy.jar \
//deploy:jazzer-api \
//deploy:jazzer-junit \
//launcher:jazzer
RUN mkdir out && \
cp $(bazel cquery --output=files //src/main/java/com/code_intelligence/jazzer:jazzer_standalone_deploy.jar) out/jazzer_agent_deploy.jar && \
cp $(bazel cquery --output=files //launcher:jazzer) out/jazzer_driver && \
cp $(bazel cquery --output=files //deploy:jazzer-api) out/jazzer_api_deploy.jar && \
cp $(bazel cquery --output=files //deploy:jazzer-junit) out/jazzer_junit.jar

USER root
RUN mkdir /classpath && mkdir /classpath/atl-libafl-jazzer && \
cp out/jazzer_agent_deploy.jar /classpath/atl-libafl-jazzer/jazzer_standalone_deploy.jar && \
cp out/jazzer_driver /classpath/atl-libafl-jazzer/jazzer && \
cp out/jazzer_junit.jar /classpath/atl-libafl-jazzer/ && \
cp out/jazzer_api_deploy.jar /classpath/atl-libafl-jazzer/
#FROM aixcc_afc_builder_base AS atl_jazzer_libafl_builder
#
## libAFL requires bindgen which requires libclang.
#ENV DEBIAN_FRONTEND=noninteractive
#RUN apt-get update && apt-get install -y libclang-dev
#
#COPY fuzzers/atl-libafl-jazzer /app/crs-cp-java/fuzzers/atl-libafl-jazzer
#COPY fuzzers/jazzer-libafl /app/crs-cp-java/fuzzers/jazzer-libafl
#WORKDIR /app/crs-cp-java/fuzzers/atl-libafl-jazzer
#RUN yes | adduser --disabled-password builder && \
# chown -R builder . && chown -R builder ../jazzer-libafl/
#
#USER builder:builder
## Install Rust.
#RUN curl https://sh.rustup.rs -sSf | sh -s -- --component llvm-tools --default-toolchain nightly-2025-06-04 -y
#ENV PATH="/home/builder/.cargo/bin:${PATH}"
#RUN ln -sf /home/builder/.rustup/toolchains/nightly-2025-06-04-x86_64-unknown-linux-gnu /home/builder/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu
#RUN echo "build --java_runtime_version=local_jdk_17" >> .bazelrc \
# && echo "build --cxxopt=-stdlib=libc++" >> .bazelrc \
# && echo "build --linkopt=-lc++" >> .bazelrc
#RUN echo "build --experimental_repository_downloader_retries=5" >> .bazelrc \
# && echo "build --http_timeout_scaling=2" >> .bazelrc \
# && echo "build --repository_cache=/home/builder/.cache/bazel-repo" >> .bazelrc
#RUN bazel build \
# //src/main/java/com/code_intelligence/jazzer:jazzer_standalone_deploy.jar \
# //deploy:jazzer-api \
# //deploy:jazzer-junit \
# //launcher:jazzer
#RUN mkdir out && \
# cp $(bazel cquery --output=files //src/main/java/com/code_intelligence/jazzer:jazzer_standalone_deploy.jar) out/jazzer_agent_deploy.jar && \
# cp $(bazel cquery --output=files //launcher:jazzer) out/jazzer_driver && \
# cp $(bazel cquery --output=files //deploy:jazzer-api) out/jazzer_api_deploy.jar && \
# cp $(bazel cquery --output=files //deploy:jazzer-junit) out/jazzer_junit.jar
#
#USER root
#RUN mkdir /classpath && mkdir /classpath/atl-libafl-jazzer && \
# cp out/jazzer_agent_deploy.jar /classpath/atl-libafl-jazzer/jazzer_standalone_deploy.jar && \
# cp out/jazzer_driver /classpath/atl-libafl-jazzer/jazzer && \
# cp out/jazzer_junit.jar /classpath/atl-libafl-jazzer/ && \
# cp out/jazzer_api_deploy.jar /classpath/atl-libafl-jazzer/

#################################################################################
## Staged Images - Concolic Engine Build (/graal-jdk)
#################################################################################
FROM ubuntu:20.04 AS espresso_builder
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
curl \
python3.9 \
python3-pip \
git \
zip \
wget \
build-essential \
libstdc++-9-dev

# copy mx
COPY concolic/graal-concolic/mx /mx

ENV PATH="/mx:$PATH"
RUN echo Y | mx fetch-jdk labsjdk-ce-21
RUN python3 -mpip install ninja_syntax

WORKDIR /graal-jdk
RUN wget https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6-linux-x86_64.tar.gz && \
tar -xzvf cmake-3.31.6-linux-x86_64.tar.gz && \
cp -r cmake-3.31.6-linux-x86_64/* /usr/ && \
rm -rf cmake-3.31.6-linux-x86_64

# graal espresso
COPY concolic/graal-concolic/graal-jdk-25-14 /graal-jdk
COPY concolic/graal-concolic/docker-scripts /docker-scripts
WORKDIR /graal-jdk
RUN chmod +x /docker-scripts/*

# put mx deps
COPY --from=graal_deps /root/.mx /root/.mx

ENV MODE="jvm-ce"
ENV PREPARE_CMD="pushd /graal-jdk/espresso && mx --env=$MODE build --targets LLVM_TOOLCHAIN && mx --env $MODE create-generated-sources"
RUN /docker-scripts/init_dev.sh /bin/bash -c "$PREPARE_CMD"
ENV BUILD_CMD="pushd /graal-jdk/espresso && export MX_BUILD_EXPLODED=$MX_BUILD_EXPLODED && mx --env $MODE create-generated-sources && mx --env $MODE build"
RUN /docker-scripts/init_dev.sh /bin/bash -c "$BUILD_CMD"
#FROM ubuntu:20.04 AS espresso_builder
#ARG DEBIAN_FRONTEND=noninteractive
#RUN apt-get update && apt-get install -y \
# curl \
# python3.9 \
# python3-pip \
# git \
# zip \
# wget \
# build-essential \
# libstdc++-9-dev
#
## copy mx
#COPY concolic/graal-concolic/mx /mx
#
#ENV PATH="/mx:$PATH"
#RUN echo Y | mx fetch-jdk labsjdk-ce-21
#RUN python3 -mpip install ninja_syntax
#
#WORKDIR /graal-jdk
#RUN wget https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6-linux-x86_64.tar.gz && \
# tar -xzvf cmake-3.31.6-linux-x86_64.tar.gz && \
# cp -r cmake-3.31.6-linux-x86_64/* /usr/ && \
# rm -rf cmake-3.31.6-linux-x86_64
#
## graal espresso
#COPY concolic/graal-concolic/graal-jdk-25-14 /graal-jdk
#COPY concolic/graal-concolic/docker-scripts /docker-scripts
#WORKDIR /graal-jdk
#RUN chmod +x /docker-scripts/*
#
## put mx deps
#COPY --from=graal_deps /root/.mx /root/.mx
#
#ENV MODE="jvm-ce"
#ENV PREPARE_CMD="pushd /graal-jdk/espresso && mx --env=$MODE build --targets LLVM_TOOLCHAIN && mx --env $MODE create-generated-sources"
#RUN /docker-scripts/init_dev.sh /bin/bash -c "$PREPARE_CMD"
#ENV BUILD_CMD="pushd /graal-jdk/espresso && export MX_BUILD_EXPLODED=$MX_BUILD_EXPLODED && mx --env $MODE create-generated-sources && mx --env $MODE build"
#RUN /docker-scripts/init_dev.sh /bin/bash -c "$BUILD_CMD"

#################################################################################
## Staged Images - Prebuilt Joern (Public)
Expand Down Expand Up @@ -200,13 +200,26 @@ RUN mkdir -p $JAVA_CRS_SRC && chmod -R 0755 $JAVA_CRS_SRC
## CRS-java fuzzer binaries
COPY --from=aixcc_jazzer_builder /classpath/aixcc-jazzer /classpath/aixcc-jazzer
COPY --from=atl_jazzer_builder /classpath/atl-jazzer /classpath/atl-jazzer
COPY --from=atl_jazzer_libafl_builder /classpath/atl-libafl-jazzer /classpath/atl-libafl-jazzer
#COPY --from=atl_jazzer_libafl_builder /classpath/atl-libafl-jazzer /classpath/atl-libafl-jazzer
COPY ./fuzzers/mock-jazzer /classpath/mock-jazzer
ENV AIXCC_JAZZER_DIR=/classpath/aixcc-jazzer
ENV ATL_JAZZER_DIR=/classpath/atl-jazzer
ENV ATL_JAZZER_LIBAFL_DIR=/classpath/atl-libafl-jazzer
ENV ATL_MOCK_JAZZER_DIR=/classpath/mock-jazzer

## CRS-java atl-asm and atl-soot (must run before pip install coordinates)
COPY ./prebuilt ${JAVA_CRS_SRC}/prebuilt
RUN cd ${JAVA_CRS_SRC}/prebuilt && \
./mvn_install.sh
ENV JACOCO_CLI_DIR=${JAVA_CRS_SRC}/prebuilt/jacococli

## joern
COPY --from=joern_builder /opt/joern ${JAVA_CRS_SRC}/joern
ENV JOERN_DIR=${JAVA_CRS_SRC}/joern/Joern
ENV JOERN_CLI=$JOERN_DIR/joern-cli
ENV JAVA2CPG=$JOERN_DIR/joern-cli/frontends/javasrc2cpg/bin
ENV PATH=$PATH:$JAVA_HOME/bin:$JOERN_CLI:$JAVA2CPG

## crs python package deps
COPY ./libs ${JAVA_CRS_SRC}/libs
RUN /venv/bin/pip install --no-cache-dir \
Expand All @@ -223,19 +236,6 @@ RUN /venv/bin/pip install --no-cache-dir \
${JAVA_CRS_SRC}/libs/claude-code-sdk-python && \
rm -rf /root/.cache/pip

## joern
COPY --from=joern_builder /opt/joern ${JAVA_CRS_SRC}/joern
ENV JOERN_DIR=${JAVA_CRS_SRC}/joern/Joern
ENV JOERN_CLI=$JOERN_DIR/joern-cli
ENV JAVA2CPG=$JOERN_DIR/joern-cli/frontends/javasrc2cpg/bin
ENV PATH=$PATH:$JAVA_HOME/bin:$JOERN_CLI:$JAVA2CPG

## CRS-java atl-asm and atl-soot
COPY ./prebuilt ${JAVA_CRS_SRC}/prebuilt
RUN cd ${JAVA_CRS_SRC}/prebuilt && \
./mvn_install.sh
ENV JACOCO_CLI_DIR=${JAVA_CRS_SRC}/prebuilt/jacococli

## jazzer-llm-augmented
COPY ./jazzer-llm-augmented ${JAVA_CRS_SRC}/jazzer-llm-augmented
#RUN cd ${JAVA_CRS_SRC}/jazzer-llm-augmented/ProgramExecutionTracer && \
Expand All @@ -254,6 +254,12 @@ COPY ./codeql ${JAVA_CRS_SRC}/codeql
RUN cd ${JAVA_CRS_SRC}/codeql && \
./init.sh

## filtering-agent (LLM-powered exploitability assessment)
COPY ./filtering-agent ${JAVA_CRS_SRC}/filtering-agent
RUN cd ${JAVA_CRS_SRC}/filtering-agent && \
if [ -f requirements.txt ]; then /venv/bin/pip install --no-cache-dir -r requirements.txt; fi && \
rm -rf /root/.cache/pip

## llm-poc-gen
COPY ./llm-poc-gen ${JAVA_CRS_SRC}/llm-poc-gen
ENV PATH=${PATH}:/root/.local/bin
Expand All @@ -271,21 +277,21 @@ RUN cd ${JAVA_CRS_SRC}/expkit && \
/venv/bin/pip install -e . && \
rm -rf /root/.cache/pip

## Build espresso-JDK-dependent components
## concolic executor engine (espresso-jdk & runtime)
# copy binary only
COPY --from=espresso_builder /graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/ /graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/
# copy only the executor and provider
COPY ./concolic/graal-concolic/executor /graal-jdk/concolic/graal-concolic/executor
COPY ./concolic/graal-concolic/provider /graal-jdk/concolic/graal-concolic/provider
COPY ./concolic/graal-concolic/scheduler /graal-jdk/concolic/graal-concolic/scheduler
RUN cd /graal-jdk/concolic/graal-concolic/executor && \
JAVA_HOME=/graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/graalvm-espresso-jvm-ce-openjdk-21.0.2+13.1/ ./gradlew build && \
/venv/bin/pip install --no-cache-dir -r /graal-jdk/concolic/graal-concolic/executor/scripts/requirements.txt && \
cd /graal-jdk/concolic/graal-concolic/provider && \
JAVA_HOME=/graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/graalvm-espresso-jvm-ce-openjdk-21.0.2+13.1/ ./gradlew build && \
rm -rf /root/.cache/coursier && \
rm -rf /root/.cache/pip
### Build espresso-JDK-dependent components
### concolic executor engine (espresso-jdk & runtime)
## copy binary only
#COPY --from=espresso_builder /graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/ /graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/
## copy only the executor and provider
#COPY ./concolic/graal-concolic/executor /graal-jdk/concolic/graal-concolic/executor
#COPY ./concolic/graal-concolic/provider /graal-jdk/concolic/graal-concolic/provider
#COPY ./concolic/graal-concolic/scheduler /graal-jdk/concolic/graal-concolic/scheduler
#RUN cd /graal-jdk/concolic/graal-concolic/executor && \
# JAVA_HOME=/graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/graalvm-espresso-jvm-ce-openjdk-21.0.2+13.1/ ./gradlew build && \
# /venv/bin/pip install --no-cache-dir -r /graal-jdk/concolic/graal-concolic/executor/scripts/requirements.txt && \
# cd /graal-jdk/concolic/graal-concolic/provider && \
# JAVA_HOME=/graal-jdk/sdk/mxbuild/linux-amd64/GRAALVM_ESPRESSO_JVM_CE_JAVA21/graalvm-espresso-jvm-ce-openjdk-21.0.2+13.1/ ./gradlew build && \
# rm -rf /root/.cache/coursier && \
# rm -rf /root/.cache/pip

## dictgen
COPY ./dictgen ${JAVA_CRS_SRC}/dictgen
Expand Down Expand Up @@ -330,13 +336,11 @@ RUN cd ${JAVA_CRS_SRC}/deepgen/jvm/stuck-point-analyzer && \
rm -rf /root/.cache/pip

## crs-java main entry
COPY ./*.sh ./*.py ./requirements.txt ./jazzer_driver_stub ./crs-java.config ./sink-targets.txt ${JAVA_CRS_SRC}/
COPY ./*.sh ./*.py ./requirements.txt ./jazzer_driver_stub ./crs-java.config ${JAVA_CRS_SRC}/
COPY ./javacrs_modules ${JAVA_CRS_SRC}/javacrs_modules
COPY ./tests ${JAVA_CRS_SRC}/tests
RUN /venv/bin/pip install --no-cache-dir -r ${JAVA_CRS_SRC}/requirements.txt && \
rm -rf /root/.cache/pip
ENV JAVA_CRS_SINK_TARGET_CONF=${JAVA_CRS_SRC}/sink-targets.txt
ENV JAVA_CRS_CUSTOM_SINK_YAML=${JAVA_CRS_SRC}/codeql/sink_definitions.yml

## git setup
# git/python-git will not work if CP repo is of unknown user:
Expand All @@ -352,10 +356,5 @@ COPY --from=aixcc_afc_builder_base /usr/local/bin/jazzer_driver /classpath/raw-j
COPY --from=aixcc_afc_builder_base /usr/local/bin/jazzer_junit.jar /classpath/raw-jazzer/
COPY --from=aixcc_afc_builder_base /usr/local/lib/jazzer_api_deploy.jar /classpath/raw-jazzer/

COPY ssmode-lpg.toml ${JAVA_CRS_SRC}/ssmode-lpg.toml
COPY ssmode-sink.txt ${JAVA_CRS_SRC}/ssmode-sink.txt
RUN mkdir -p ${JAVA_CRS_SRC}/llm-poc-gen/eval/sheet && \
cp ${JAVA_CRS_SRC}/ssmode-lpg.toml ${JAVA_CRS_SRC}/llm-poc-gen/eval/sheet/cpv.toml

WORKDIR ${JAVA_CRS_SRC}
CMD ${JAVA_CRS_SRC}/run-crs-java.sh
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@
"enabled": true,
"exp_time": 300,
"monitor_interval": 3,
"gen_models": "o3:2,claude-opus-4-20250514:1,gemini-2.5-pro-preview-05-06:1,grok-3-mini-beta:1,none:15",
"x_models": "gpt-4.1:2,claude-sonnet-4-20250514:1,gemini-2.5-flash-preview-05-20:1,grok-3-mini-beta:1"
"gen_model": "gpt-5"
},
"stub": {
"enabled": false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@
"enabled": true,
"exp_time": 300,
"monitor_interval": 3,
"gen_models": "o3:2,claude-opus-4-20250514:1,gemini-2.5-pro-preview-05-06:1,grok-3-mini-beta:1,none:15",
"x_models": "gpt-4.1:2,claude-sonnet-4-20250514:1,gemini-2.5-flash-preview-05-20:1,grok-3-mini-beta:1"
"gen_model": "gpt-5"
},
"stub": {
"enabled": false
Expand Down
3 changes: 1 addition & 2 deletions crs/assets/r2-test-config/r2-apache-commons-compress.config
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@
"enabled": true,
"exp_time": 300,
"monitor_interval": 3,
"gen_models": "o3:2,claude-opus-4-20250514:1,gemini-2.5-pro-preview-05-06:1,grok-3-mini-beta:1,none:15",
"x_models": "gpt-4.1:2,claude-sonnet-4-20250514:1,gemini-2.5-flash-preview-05-20:1,grok-3-mini-beta:1"
"gen_model": "gpt-5"
},
"stub": {
"enabled": false
Expand Down
3 changes: 1 addition & 2 deletions crs/assets/r2-test-config/r2-zookeeper-diff-1.config
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@
"enabled": true,
"exp_time": 300,
"monitor_interval": 3,
"gen_models": "o3:2,claude-opus-4-20250514:1,gemini-2.5-pro-preview-05-06:1,grok-3-mini-beta:1,none:15",
"x_models": "gpt-4.1:2,claude-sonnet-4-20250514:1,gemini-2.5-flash-preview-05-20:1,grok-3-mini-beta:1"
"gen_model": "gpt-5"
},
"stub": {
"enabled": false
Expand Down
3 changes: 1 addition & 2 deletions crs/assets/r2-test-config/r2-zookeeper.config
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@
"enabled": true,
"exp_time": 300,
"monitor_interval": 3,
"gen_models": "o3:2,claude-opus-4-20250514:1,gemini-2.5-pro-preview-05-06:1,grok-3-mini-beta:1,none:15",
"x_models": "gpt-4.1:2,claude-sonnet-4-20250514:1,gemini-2.5-flash-preview-05-20:1,grok-3-mini-beta:1"
"gen_model": "gpt-5"
},
"stub": {
"enabled": false
Expand Down
Loading