Skip to content

Config doc autogen#2718

Merged
djsaunde merged 21 commits into
mainfrom
config-doc-autogen
Jun 18, 2025
Merged

Config doc autogen#2718
djsaunde merged 21 commits into
mainfrom
config-doc-autogen

Conversation

@djsaunde

@djsaunde djsaunde commented May 24, 2025

Copy link
Copy Markdown
Collaborator

Description

Motivation and Context

We have a large, manually maintained config reference in our docs. Why not autogen from our pydantic models? This enables us to have a single source of truth.

How has this been tested?

Local quarto build + render.

Screenshots (if appropriate)

Once docs preview is live, check that out.

Types of changes

Docs, python script for autogen.

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Added automatic generation of detailed configuration documentation in markdown format.
    • Introduced a comprehensive validation module consolidating configuration checks for improved reliability.
  • Improvements

    • Enhanced all configuration schemas with rich field descriptions for better clarity and introspection.
    • Updated sidebar navigation to reference the new configuration documentation file.
    • Improved quantization and reinforcement learning configuration descriptions for clarity.
    • Corrected documentation hyperlink to match actual file extension.
  • Bug Fixes

    • Corrected sidebar link to point to the updated configuration reference document.
  • Chores

    • Configured version control to ignore generated configuration documentation files.
    • Updated CI workflow triggers to include schema source files and documentation generation scripts.
  • Refactor

    • Moved complex validation logic from configuration models into a centralized validation module for improved maintainability.
    • Simplified configuration models by removing embedded validation, focusing on schema definitions.
    • Standardized and clarified field descriptions across all schema files.
  • Style

    • Removed redundant inline comments and standardized code style in enums and schema definitions.

@djsaunde djsaunde self-assigned this May 24, 2025
@coderabbitai

coderabbitai Bot commented May 24, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

This update introduces a new script to auto-generate Quarto documentation from Pydantic models, restructures configuration schemas to use rich field-level descriptions, and moves complex validation logic into modular mixin classes. Configuration and documentation-related files are updated to reflect these changes, enhancing clarity, introspection, and maintainability of the configuration system.

Changes

File(s) Change Summary
_quarto.yml, docs/.gitignore Updated Quarto config to run a pre-render script and changed sidebar doc reference; .gitignore now ignores generated config-reference.qmd.
docs/scripts/generate_config_docs.py Added script to auto-generate Quarto markdown documentation from Pydantic models, supporting nested/inherited fields and grouping by logical blocks.
src/axolotl/utils/schemas/config.py Refactored AxolotlInputConfig: all fields now use Field with detailed descriptions; removed most validators; added ValidationMixin inheritance; retained only dataset serializer.
src/axolotl/utils/schemas/validation.py New module introducing mixin classes for modular, comprehensive Pydantic validation logic across config aspects; ValidationMixin aggregates all validators for Axolotl configs.
src/axolotl/utils/schemas/datasets.py Updated all model fields to use Field with descriptive json_schema_extra; no logic changes.
src/axolotl/utils/schemas/deprecated.py Added json_schema_extra descriptions to RemappedParameters fields; reordered some fields for clarity.
src/axolotl/utils/schemas/enums.py Removed inline pylint disables from enum members; added module-level pylint directive; no functional changes.
src/axolotl/utils/schemas/integrations.py Updated all integration config fields to use Field with descriptive json_schema_extra; no logic changes.
src/axolotl/utils/schemas/model.py Updated ModelInputConfig and ModelOutputConfig fields to use Field with detailed descriptions; no logic changes.
src/axolotl/utils/schemas/peft.py Added/updated json_schema_extra descriptions for many fields in LoftQConfig, PeftConfig, LoraConfig, and ReLoRAConfig; improved documentation.
src/axolotl/utils/schemas/quantization.py Enhanced field descriptions for QATConfig and PTQConfig regarding quantization types and semantics; no logic changes.
src/axolotl/utils/schemas/training.py All HyperparametersConfig fields now use Field with json_schema_extra descriptions; improved documentation, no logic changes.
src/axolotl/utils/schemas/trl.py Reworded and standardized json_schema_extra descriptions for TRLConfig fields; no functional changes.
docs/config.qmd Deleted comprehensive configuration reference file; replaced by auto-generated config-reference.qmd.
docs/dataset-formats/conversation.qmd, docs/dataset-formats/inst_tune.qmd, docs/dataset_loading.qmd, docs/getting-started.qmd Updated documentation links to point from config.qmd to config-reference.qmd.
README.md, .runpod/README.md Updated configuration guide URLs to point to config-reference.html.
docs/quantize.qmd Corrected hyperlink extension from .md to .qmd for QAT documentation link.
.github/workflows/preview-docs.yml Updated workflow triggers to include new script and schema files; removed --no-deps from pip install command.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Quarto
    participant PreRenderScript as generate_config_docs.py
    participant PydanticModels

    User->>Quarto: Render documentation
    Quarto->>PreRenderScript: Run as pre-render step
    PreRenderScript->>PydanticModels: Introspect config models
    PydanticModels-->>PreRenderScript: Provide field metadata, including nested/inherited fields
    PreRenderScript-->>Quarto: Output config-reference.qmd
    Quarto-->>User: Serve updated documentation
Loading
sequenceDiagram
    participant ConfigLoader
    participant AxolotlInputConfig
    participant ValidationMixin

    ConfigLoader->>AxolotlInputConfig: Load config data
    AxolotlInputConfig->>ValidationMixin: Run all validators (from mixins)
    ValidationMixin-->>AxolotlInputConfig: Raise errors/warnings or adjust fields as needed
    AxolotlInputConfig-->>ConfigLoader: Return validated config instance
Loading

Possibly related PRs

Suggested labels

ready to merge

Suggested reviewers

  • winglian

Poem

A whisk of the paw, a hop in the docs,
Now schemas are clearer, with less paradox.
Fields wear their meanings, like carrots in rows,
Validation’s a garden where consistency grows.
With scripts that auto-write, and mixins anew—
This bunny’s configuration is shiny and true!
🥕✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3b0685d and 254d237.

📒 Files selected for processing (1)
  • docs/scripts/generate_config_docs.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.11.9)
docs/scripts/generate_config_docs.py

278-281: Use a single if statement instead of nested if statements

(SIM102)


531-535: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


630-632: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (9)
  • GitHub Check: PyTest (3.11, 2.5.1)
  • GitHub Check: pre-commit
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.6.0)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: preview
  • GitHub Check: pre-commit
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@djsaunde djsaunde force-pushed the config-doc-autogen branch from 1b80549 to 705b078 Compare May 24, 2025 02:01
@codecov

codecov Bot commented May 24, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 84.21053% with 129 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/axolotl/utils/schemas/validation.py 76.55% 128 Missing ⚠️
src/axolotl/utils/schemas/config.py 99.15% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@djsaunde djsaunde force-pushed the config-doc-autogen branch 2 times, most recently from 9242fb6 to bc4ecc0 Compare June 17, 2025 01:42
@djsaunde djsaunde marked this pull request as ready for review June 17, 2025 02:14
@djsaunde

Copy link
Copy Markdown
Collaborator Author

Moving to ready for review so I can generate + share the website preview.

@djsaunde djsaunde requested review from NanoCode012, salmanmohammadi and winglian and removed request for winglian June 17, 2025 02:17

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🔭 Outside diff range comments (2)
src/axolotl/utils/schemas/quantization.py (2)

36-44: Validator rejects default & None values

validate_dtype runs in mode="before" for optional fields.
When the user omits activation_dtype, the raw value is None; when they omit weight_dtype, the raw value is the Enum default.
Both fall through to the final raise ValueError, making QATConfig() impossible.

-        if v == "int4":
+        if v is None or isinstance(v, TorchIntDType):
+            return v
+        if v == "int4":
             return TorchIntDType.int4

Apply the same guard to PTQConfig.


67-74: PTQConfig validator ignores the documented uintX dtypes

The description states that weight_dtype may be any uint[1-7], but the validator only whitelists "int4"/"int8". Extend the validator to handle the TorchIntDType.uint* variants or remove them from the description.

🧹 Nitpick comments (8)
_quarto.yml (1)

239-239: Sidebar entry could break local preview if the file hasn’t been generated yet

During a first-time quarto preview developers will see a 404 until the pre-render step finishes successfully.
Consider committing a very small placeholder file (e.g. an HTML comment) so the link resolves even when the generation step is skipped.

src/axolotl/utils/schemas/trl.py (1)

11-16: Truncated description string

The beta field’s description ends abruptly with “Use”.

-    "description": "Beta parameter for the RL training. Same as `rl_beta`. Use"
+    "description": "Beta (KL-penalty) coefficient for RL training. Same semantics as `rl_beta`.",

Without a complete sentence the autogenerated docs look unpolished.

src/axolotl/utils/schemas/datasets.py (1)

56-61: Field name type shadows Python built-in

While Pydantic permits this, accessing the attribute (dataset.type) inside model methods can be confusing and hampers IDE auto-completion.
Consider renaming to prompt_type (update validators accordingly) to avoid the shadow.

src/axolotl/utils/schemas/integrations.py (2)

15-18: Document use_mlflow with Field for parity

All other MLFlowConfig fields now use Field with json_schema_extra. use_mlflow is still a bare annotation, so it will be absent from the autogenerated descriptions. Wrap it in Field(..., json_schema_extra={"description": "Enable or disable MLflow integration."}) to keep documentation uniform.


160-178: Inconsistent metadata key (help vs description)

RayConfig uses json_schema_extra={"help": ...} whereas every other model now standardises on the description key. The generator script only looks for description, so these three texts will silently disappear from the docs. Rename the key to description.

src/axolotl/utils/schemas/training.py (1)

81-86: optim_args accepts str but doc says “Dictionary”

Type annotation allows str | dict[str, Any], yet the description mentions only a dictionary.
Either drop str from the type or expand the description (e.g. “str (YAML/JSON) or dict”).

src/axolotl/utils/schemas/model.py (1)

45-50: Typo: “mistral-common tokenizer” wording

Minor wording polish – consider “the Mistral common tokenizer” for clarity.

src/axolotl/utils/schemas/peft.py (1)

520-523: Error message lists the same flag three times

Typo makes the message misleading:

-"lora_mlp_kernel, lora_mlp_kernel, and lora_mlp_kernel are not compatible with 8-bit LoRA"
+"lora_mlp_kernel, lora_qkv_kernel, and lora_o_kernel are not compatible with 8-bit LoRA"
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ba62aa6 and 214c6e4.

📒 Files selected for processing (14)
  • _quarto.yml (2 hunks)
  • docs/.gitignore (1 hunks)
  • docs/scripts/generate_config_docs.py (1 hunks)
  • src/axolotl/utils/schemas/config.py (9 hunks)
  • src/axolotl/utils/schemas/datasets.py (2 hunks)
  • src/axolotl/utils/schemas/deprecated.py (1 hunks)
  • src/axolotl/utils/schemas/enums.py (2 hunks)
  • src/axolotl/utils/schemas/integrations.py (3 hunks)
  • src/axolotl/utils/schemas/model.py (2 hunks)
  • src/axolotl/utils/schemas/peft.py (3 hunks)
  • src/axolotl/utils/schemas/quantization.py (2 hunks)
  • src/axolotl/utils/schemas/training.py (2 hunks)
  • src/axolotl/utils/schemas/trl.py (3 hunks)
  • src/axolotl/utils/schemas/validation.py (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
src/axolotl/utils/schemas/quantization.py (1)
src/axolotl/utils/schemas/enums.py (1)
  • TorchIntDType (10-21)
src/axolotl/utils/schemas/validation.py (1)
src/axolotl/utils/schemas/enums.py (3)
  • ChatTemplate (35-67)
  • RingAttnFunc (82-90)
  • RLType (24-32)
🪛 Ruff (0.11.9)
src/axolotl/utils/schemas/validation.py

133-134: Use a single if statement instead of nested if statements

(SIM102)


406-414: Use a single if statement instead of nested if statements

(SIM102)


501-506: Use a single if statement instead of nested if statements

(SIM102)


515-520: Use a single if statement instead of nested if statements

(SIM102)


582-587: Use a single if statement instead of nested if statements

(SIM102)


744-750: Use a single if statement instead of nested if statements

(SIM102)

docs/scripts/generate_config_docs.py

28-28: Use of functools.lru_cache or functools.cache on methods can lead to memory leaks

(B019)


181-184: Use a single if statement instead of nested if statements

(SIM102)


424-428: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


523-525: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (6)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: PyTest (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.6.0)
🔇 Additional comments (6)
docs/.gitignore (1)

5-5: Ensure the ignored filename matches the generator output exactly

The generator script writes to docs/config-reference.qmd (note the docs/ prefix) while the ignore rule omits the directory prefix.
If the script ever runs from a different working directory (e.g., CI) it could emit the file under docs/, which would then be tracked by Git.

- config-reference.qmd
+ docs/config-reference.qmd
_quarto.yml (1)

3-3: Make pre-render script path portable & executable

pre-render: docs/scripts/generate_config_docs.py is interpreted by Quarto as a command, not a Python module.
Ensure the file is:

  1. chmod +x and starts with the correct she-bang (#!/usr/bin/env python3), or
  2. Invoked explicitly via the interpreter:
pre-render: python docs/scripts/generate_config_docs.py

Otherwise the site build will fail on environments that don’t automatically treat “*.py” files as executables.

src/axolotl/utils/schemas/enums.py (1)

3-3: Module-level pylint disable is 👍

Moving the directive here reduces noise in the enum definitions themselves.

src/axolotl/utils/schemas/deprecated.py (2)

62-75: Alias direction may break attribute access

The field name is overrides_of_model_config with alias "model_config".
Inside python cfg.overrides_of_model_config works, but existing code that does cfg.model_config will no longer compile unless model_config is also defined as a property or model_config is accessed through cfg["model_config"].

Please grep the codebase for .model_config attribute access or add populate_by_name=True / an explicit property.


76-89: Same alias concern for model_type & model_revision

The same caveat applies to type_of_model/model_type and revision_of_model/model_revision. Verify call-sites or flip the alias if the attribute name should stay model_type.

src/axolotl/utils/schemas/config.py (1)

1-10: Nothing to flag on this file.

Comment thread src/axolotl/utils/schemas/enums.py
Comment thread src/axolotl/utils/schemas/datasets.py Outdated
Comment thread docs/scripts/generate_config_docs.py Outdated
Comment thread src/axolotl/utils/schemas/validation.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
docs/scripts/generate_config_docs.py (2)

63-88: _extract_nested_type discards multi-type unions

The helper returns only the first non-None member (int | str | Noneint), which loses information and can mis-document fields. Consider:

• Returning Union[int, str] (stringified) when multiple concrete types exist, or
• Falling back to Any with an explanatory comment.

This keeps the generated reference accurate.


638-641: Ensure output directory exists before writing

The script assumes docs/ is present. A fresh checkout or altered build path
will raise FileNotFoundError.

+    from pathlib import Path
...
-    with open("docs/config-reference.qmd", "w", encoding="utf-8") as f:
+    Path("docs").mkdir(parents=True, exist_ok=True)
+    with open("docs/config-reference.qmd", "w", encoding="utf-8") as f:

Minor but avoids brittle CI failures.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 214c6e4 and 3829088.

📒 Files selected for processing (1)
  • docs/scripts/generate_config_docs.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.11.9)
docs/scripts/generate_config_docs.py

179-182: Use a single if statement instead of nested if statements

(SIM102)


422-426: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


521-523: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: pre-commit
  • GitHub Check: PyTest (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.6.0)
  • GitHub Check: pre-commit
🔇 Additional comments (1)
docs/scripts/generate_config_docs.py (1)

27-44: 👍 Cached-method issue resolved

The problematic @lru_cache decorator that previously broke instance binding has been removed. The method now works correctly with the explicit _class_fields_cache.

Comment thread docs/scripts/generate_config_docs.py
Comment thread docs/scripts/generate_config_docs.py Outdated
Comment thread docs/scripts/generate_config_docs.py
@coderabbitai

coderabbitai Bot commented Jun 17, 2025

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/axolotl-ai-cloud/axolotl/issues/comments/2906299037","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.2 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThis update introduces a new script to auto-generate Quarto documentation from Pydantic models, restructures configuration schemas to use rich field-level descriptions, and moves complex validation logic into modular mixin classes. Configuration and documentation-related files are updated to reflect these changes, enhancing clarity, introspection, and maintainability of the configuration system.\n\n## Changes\n\n| File(s)                                                                                       | Change Summary                                                                                                                                                                                                                 |\n|-----------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| _quarto.yml, docs/.gitignore                                                                  | Updated Quarto config to run a pre-render script and changed sidebar doc reference; .gitignore now ignores generated config-reference.qmd.                                              |\n| docs/scripts/generate_config_docs.py                                                          | Added script to auto-generate Quarto markdown documentation from Pydantic models, supporting nested/inherited fields and grouping by logical blocks.                                    |\n| src/axolotl/utils/schemas/config.py                                                           | Refactored AxolotlInputConfig: all fields now use Field with detailed descriptions; removed most validators; added ValidationMixin inheritance; retained only dataset serializer.        |\n| src/axolotl/utils/schemas/validation.py                                                       | New module introducing mixin classes for modular, comprehensive Pydantic validation logic across config aspects; ValidationMixin aggregates all validators for Axolotl configs.         |\n| src/axolotl/utils/schemas/datasets.py                                                         | Updated all model fields to use Field with descriptive json_schema_extra; no logic changes.                                                                                            |\n| src/axolotl/utils/schemas/deprecated.py                                                       | Added json_schema_extra descriptions to RemappedParameters fields; reordered some fields for clarity.                                                                                   |\n| src/axolotl/utils/schemas/enums.py                                                            | Removed inline pylint disables from enum members; added module-level pylint directive; no functional changes.                                                                           |\n| src/axolotl/utils/schemas/integrations.py                                                     | Updated all integration config fields to use Field with descriptive json_schema_extra; no logic changes.                                                                                |\n| src/axolotl/utils/schemas/model.py                                                            | Updated ModelInputConfig and ModelOutputConfig fields to use Field with detailed descriptions; no logic changes.                                                                        |\n| src/axolotl/utils/schemas/peft.py                                                             | Added/updated json_schema_extra descriptions for many fields in LoftQConfig, PeftConfig, LoraConfig, and ReLoRAConfig; improved documentation.                                         |\n| src/axolotl/utils/schemas/quantization.py                                                     | Enhanced field descriptions for QATConfig and PTQConfig regarding quantization types and semantics; no logic changes.                                                                   |\n| src/axolotl/utils/schemas/training.py                                                         | All HyperparametersConfig fields now use Field with json_schema_extra descriptions; improved documentation, no logic changes.                                                           |\n| src/axolotl/utils/schemas/trl.py                                                              | Reworded and standardized json_schema_extra descriptions for TRLConfig fields; no functional changes.                                                                                   |\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant User\n    participant Quarto\n    participant PreRenderScript as generate_config_docs.py\n    participant PydanticModels\n\n    User->>Quarto: Render documentation\n    Quarto->>PreRenderScript: Run as pre-render step\n    PreRenderScript->>PydanticModels: Introspect config models\n    PydanticModels-->>PreRenderScript: Provide field metadata, including nested/inherited fields\n    PreRenderScript-->>Quarto: Output config-reference.qmd\n    Quarto-->>User: Serve updated documentation\n```\n\n```mermaid\nsequenceDiagram\n    participant ConfigLoader\n    participant AxolotlInputConfig\n    participant ValidationMixin\n\n    ConfigLoader->>AxolotlInputConfig: Load config data\n    AxolotlInputConfig->>ValidationMixin: Run all validators (from mixins)\n    ValidationMixin-->>AxolotlInputConfig: Raise errors/warnings or adjust fields as needed\n    AxolotlInputConfig-->>ConfigLoader: Return validated config instance\n```\n\n## Possibly related PRs\n\n- [axolotl-ai-cloud/axolotl#2133](https://github.com/axolotl-ai-cloud/axolotl/pull/2133): Refactors trainer builder into modular files, related to overall codebase modularization efforts.\n- [axolotl-ai-cloud/axolotl#2780](https://github.com/axolotl-ai-cloud/axolotl/pull/2780): Adds support for mistral-common tokenizer and related config fields and validators; overlaps with schema and validation changes here.\n\n## Poem\n\n> A whisk of the paw, a hop in the docs,  \n> Now schemas are clearer, with less paradox.  \n> Fields wear their meanings, like carrots in rows,  \n> Validation’s a garden where consistency grows.  \n> With scripts that auto-write, and mixins anew—  \n> This bunny’s configuration is shiny and true!  \n> 🥕✨\n\n<!-- walkthrough_end -->\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->\n<!-- finishing_touch_checkbox_start -->\n\n<details open=\"true\">\n<summary>✨ Finishing Touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate Docstrings\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n<!-- tips_start -->\n\n---\n\nThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<details>\n<summary>🪧 Tips</summary>\n\n### Chat\n\nThere are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=axolotl-ai-cloud/axolotl&utm_content=2718):\n\n- Review comments: Directly reply to a review comment made by CodeRabbit. Example:\n  - `I pushed a fix in commit <commit_id>, please review it.`\n  - `Explain this complex logic.`\n  - `Open a follow-up GitHub issue for this discussion.`\n- Files and specific lines of code (under the \"Files changed\" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:\n  - `@coderabbitai explain this code block.`\n  -\t`@coderabbitai modularize this function.`\n- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:\n  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`\n  - `@coderabbitai read src/utils.ts and explain its main purpose.`\n  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`\n  - `@coderabbitai help me debug CodeRabbit configuration file.`\n\n### Support\n\nNeed help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.\n\nNote: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.\n\n### CodeRabbit Commands (Invoked using PR comments)\n\n- `@coderabbitai pause` to pause the reviews on a PR.\n- `@coderabbitai resume` to resume the paused reviews.\n- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.\n- `@coderabbitai full review` to do a full review from scratch and review all the files again.\n- `@coderabbitai summary` to regenerate the summary of the PR.\n- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.\n- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.\n- `@coderabbitai resolve` resolve all the CodeRabbit review comments.\n- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.\n- `@coderabbitai help` to get help.\n\n### Other keywords and placeholders\n\n- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.\n- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.\n- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.\n\n### CodeRabbit Configuration File (`.coderabbit.yaml`)\n\n- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.\n- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.\n- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`\n\n### Documentation and Community\n\n- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.\n- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.\n- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.\n\n</details>\n\n<!-- tips_end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"cause":{}}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
docs/scripts/generate_config_docs.py (2)

82-90: Still using class names for recursion guard – collisions remain
The visited set keys on model_class.__name__; different classes that share the same name will collide and either skip models or trigger wrong recursion termination. Use the class object itself.


462-465: Raw default value interpolation can emit invalid YAML

field_line += f" = {field_info['default']}" directly stringifies Python objects; complex types or strings containing : will break the generated YAML.

-            if field_info.get("default") is not None:
-                field_line += f" = {field_info['default']}"
+            default_val = field_info.get("default")
+            if default_val is not None:
+                import yaml
+                field_line += f" = {yaml.safe_dump(default_val, default_flow_style=True).strip()}"

Same issue appears later when building line for the non-expanded path.

Also applies to: 595-597

🧹 Nitpick comments (2)
src/axolotl/utils/schemas/validation.py (1)

395-400: Mismatch between comment, validation message, and supported-metrics set

The in-code comment says only 4 metrics are supported, yet SUPPORTED_METRICS includes "perplexity" and the runtime check enforces the larger set.
Please reconcile to avoid confusing users and reviewers.

docs/scripts/generate_config_docs.py (1)

45-48: Guard issubclass against non-class inputs

issubclass raises TypeError when type_obj is not a class (e.g. a typing construct).
Wrap the call:

-        return inspect.isclass(type_obj) and issubclass(type_obj, BaseModel)
+        try:
+            return inspect.isclass(type_obj) and issubclass(type_obj, BaseModel)
+        except TypeError:
+            return False
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3829088 and 169894b.

📒 Files selected for processing (3)
  • docs/scripts/generate_config_docs.py (1 hunks)
  • src/axolotl/utils/schemas/datasets.py (2 hunks)
  • src/axolotl/utils/schemas/validation.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/axolotl/utils/schemas/datasets.py
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/axolotl/utils/schemas/validation.py (2)
src/axolotl/utils/schemas/enums.py (3)
  • ChatTemplate (35-67)
  • RingAttnFunc (82-90)
  • RLType (24-32)
src/axolotl/utils/schemas/datasets.py (1)
  • check_chat_template_config (196-216)
🪛 Ruff (0.11.9)
docs/scripts/generate_config_docs.py

165-168: Use a single if statement instead of nested if statements

(SIM102)


408-412: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


507-509: Use a single if statement instead of nested if statements

(SIM102)

src/axolotl/utils/schemas/validation.py

133-134: Use a single if statement instead of nested if statements

(SIM102)


406-414: Use a single if statement instead of nested if statements

(SIM102)


501-506: Use a single if statement instead of nested if statements

(SIM102)


515-520: Use a single if statement instead of nested if statements

(SIM102)


582-587: Use a single if statement instead of nested if statements

(SIM102)


744-750: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (6)
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: PyTest (3.11, 2.6.0)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.5.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)

Comment on lines +619 to +626
def check_kto_config(cls, data):
if data.get("rl") == "kto":
if data.get("sample_packing") or data.get("eval_sample_packing"):
raise ValueError("sample_packing is not supported with kto")

if data.get("remove_unused_columns") is not False:
raise ValueError("Set `remove_unused_columns: False` when using kto")
return data

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Enum comparison will silently fail

check_kto_config compares data.get("rl") to the string "kto".
After Pydantic parsing this field will usually hold the RLType.KTO enum member, so the equality test will be False and the validation never runs.

-        if data.get("rl") == "kto":
+        if data.get("rl") in (RLType.KTO, "kto"):

Apply the same pattern for other enum checks ("grpo", etc.).

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def check_kto_config(cls, data):
if data.get("rl") == "kto":
if data.get("sample_packing") or data.get("eval_sample_packing"):
raise ValueError("sample_packing is not supported with kto")
if data.get("remove_unused_columns") is not False:
raise ValueError("Set `remove_unused_columns: False` when using kto")
return data
def check_kto_config(cls, data):
- if data.get("rl") == "kto":
+ if data.get("rl") in (RLType.KTO, "kto"):
if data.get("sample_packing") or data.get("eval_sample_packing"):
raise ValueError("sample_packing is not supported with kto")
if data.get("remove_unused_columns") is not False:
raise ValueError("Set `remove_unused_columns: False` when using kto")
return data
🤖 Prompt for AI Agents
In src/axolotl/utils/schemas/validation.py around lines 619 to 626, the method
check_kto_config compares data.get("rl") to the string "kto", but after Pydantic
parsing this field will be an enum member RLType.KTO, causing the equality check
to fail silently. To fix this, update the comparison to check against the enum
member RLType.KTO instead of the string "kto". Apply the same enum member
comparison pattern for other similar enum checks like "grpo" elsewhere in the
code.

@winglian

Copy link
Copy Markdown
Collaborator

@djsaunde We should update the workflows/preview-docs.yml to use _quarto.yml instead of _quarto.yAml to pickup the changes.
as well as

- docs/scripts/generate_config_docs.py
- src/axolotl/utils/schemas/**.py

@djsaunde

Copy link
Copy Markdown
Collaborator Author

@djsaunde We should update the workflows/preview-docs.yml to use _quarto.yml instead of _quarto.yAml to pickup the changes. as well as

- docs/scripts/generate_config_docs.py
- src/axolotl/utils/schemas/**.py

Great catch! I was wondering where the preview was 😅

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
docs/scripts/generate_config_docs.py (1)

462-466: Default value emission still unsafe for complex literals

Interpolating field_info['default'] directly can output invalid YAML (e.g. strings with :).
Serialize with repr() or yaml.safe_dump() instead — this is the same issue flagged earlier.

src/axolotl/utils/schemas/validation.py (1)

620-626: Enum comparison will silently fail

check_kto_config compares data.get("rl") to the string "kto".
After Pydantic parsing this field is usually RLType.KTO, so the check is bypassed.

-        if data.get("rl") == "kto":
+        if data.get("rl") in (RLType.KTO, "kto"):

Apply the same enum-aware pattern for other RLType comparisons.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3829088 and 720a3e7.

📒 Files selected for processing (4)
  • .github/workflows/preview-docs.yml (1 hunks)
  • docs/scripts/generate_config_docs.py (1 hunks)
  • src/axolotl/utils/schemas/datasets.py (2 hunks)
  • src/axolotl/utils/schemas/validation.py (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • .github/workflows/preview-docs.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/axolotl/utils/schemas/datasets.py
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/axolotl/utils/schemas/validation.py (2)
src/axolotl/utils/schemas/enums.py (3)
  • ChatTemplate (35-67)
  • RingAttnFunc (82-90)
  • RLType (24-32)
src/axolotl/utils/schemas/datasets.py (1)
  • check_chat_template_config (196-216)
🪛 Ruff (0.11.9)
docs/scripts/generate_config_docs.py

165-168: Use a single if statement instead of nested if statements

(SIM102)


408-412: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


507-509: Use a single if statement instead of nested if statements

(SIM102)

src/axolotl/utils/schemas/validation.py

133-134: Use a single if statement instead of nested if statements

(SIM102)


406-414: Use a single if statement instead of nested if statements

(SIM102)


501-506: Use a single if statement instead of nested if statements

(SIM102)


515-520: Use a single if statement instead of nested if statements

(SIM102)


582-587: Use a single if statement instead of nested if statements

(SIM102)


744-750: Use a single if statement instead of nested if statements

(SIM102)

🪛 GitHub Actions: Preview
docs/scripts/generate_config_docs.py

[error] 16-16: ModuleNotFoundError: No module named 'torch' when importing in generate_config_docs.py at line 16.

⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: pre-commit
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.6.0)
  • GitHub Check: pre-commit

Comment thread docs/scripts/generate_config_docs.py
@djsaunde djsaunde removed the request for review from salmanmohammadi June 17, 2025 17:18
@djsaunde djsaunde force-pushed the config-doc-autogen branch from bc0846b to 52a9d4f Compare June 17, 2025 17:50
@github-actions

github-actions Bot commented Jun 17, 2025

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot temporarily deployed to preview June 17, 2025 17:55 Inactive

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (3)
docs/scripts/generate_config_docs.py (2)

462-466: Default value emission still unsafe for complex YAML – reuse earlier fix

Past review already pointed out that directly concatenating field_info['default']
produces invalid YAML for strings with : or multiline lists. The code is
unchanged.

Re-emit with repr() or yaml.safe_dump():

-            if field_info.get("default") is not None:
-                field_line += f" = {field_info['default']}"
+            default_val = field_info.get("default")
+            if default_val is not None:
+                field_line += f" = {repr(default_val)}"

14-17: Importing AxolotlInputConfig at module import time drags heavy deps into the docs job

AxolotlInputConfig transitively imports torch and other GPU-specific
packages. A docs-only CI environment (or local Quarto preview) rarely has
these installed, causing immediate ModuleNotFoundError.

Lazy-load the model inside main() or stub-inject missing heavies before
import:

-import inspect
+import inspect
+import sys, types
 ...
-from axolotl.utils.schemas.config import AxolotlInputConfig
+
+# Guard heavy deps so docs build on slim environments
+try:
+    from axolotl.utils.schemas.config import AxolotlInputConfig
+except ModuleNotFoundError as exc:
+    if exc.name == "torch":
+        sys.modules["torch"] = types.ModuleType("torch")  # minimal stub
+        from axolotl.utils.schemas.config import AxolotlInputConfig
+    else:
+        raise
src/axolotl/utils/schemas/validation.py (1)

619-626: Use enum comparison for rl field in check_kto_config.
After Pydantic parsing, data.get("rl") will be an RLType member rather than a raw string. Comparing to the string "kto" may never trigger. Update the check to:

- if data.get("rl") == "kto":
+ if data.get("rl") == RLType.KTO:

or support both:

- if data.get("rl") == "kto":
+ if data.get("rl") in (RLType.KTO, "kto"):
🧹 Nitpick comments (3)
docs/scripts/generate_config_docs.py (1)

52-69: Minor: combine nested if statements for clarity

Ruff SIM102 raised this – the nested if blocks for filtering Union could be
collapsed into a single condition with and, reducing indentation noise.
Low-impact, optional.

src/axolotl/utils/schemas/validation.py (2)

95-100: Remove or address TODO in check_eval_packing.
The TODO suggests additional dataset checks but is unimplemented. Please implement the intended validation or remove the comment to reduce technical debt.


132-140: Flatten nested conditions for clarity.
In check_mm_prepare, the nested if blocks can be combined:

- if data.get("skip_prepare_dataset"):
-     if data.get("remove_unused_columns") is None:
+ if data.get("skip_prepare_dataset") and data.get("remove_unused_columns") is None:
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 720a3e7 and 52a9d4f.

📒 Files selected for processing (15)
  • .github/workflows/preview-docs.yml (2 hunks)
  • _quarto.yml (2 hunks)
  • docs/.gitignore (1 hunks)
  • docs/scripts/generate_config_docs.py (1 hunks)
  • src/axolotl/utils/schemas/config.py (9 hunks)
  • src/axolotl/utils/schemas/datasets.py (2 hunks)
  • src/axolotl/utils/schemas/deprecated.py (1 hunks)
  • src/axolotl/utils/schemas/enums.py (2 hunks)
  • src/axolotl/utils/schemas/integrations.py (3 hunks)
  • src/axolotl/utils/schemas/model.py (2 hunks)
  • src/axolotl/utils/schemas/peft.py (3 hunks)
  • src/axolotl/utils/schemas/quantization.py (2 hunks)
  • src/axolotl/utils/schemas/training.py (2 hunks)
  • src/axolotl/utils/schemas/trl.py (3 hunks)
  • src/axolotl/utils/schemas/validation.py (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/axolotl/utils/schemas/integrations.py
🚧 Files skipped from review as they are similar to previous changes (11)
  • docs/.gitignore
  • .github/workflows/preview-docs.yml
  • src/axolotl/utils/schemas/trl.py
  • _quarto.yml
  • src/axolotl/utils/schemas/enums.py
  • src/axolotl/utils/schemas/datasets.py
  • src/axolotl/utils/schemas/training.py
  • src/axolotl/utils/schemas/model.py
  • src/axolotl/utils/schemas/deprecated.py
  • src/axolotl/utils/schemas/quantization.py
  • src/axolotl/utils/schemas/peft.py
🧰 Additional context used
🧬 Code Graph Analysis (3)
docs/scripts/generate_config_docs.py (1)
src/axolotl/utils/schemas/config.py (1)
  • AxolotlInputConfig (55-832)
src/axolotl/utils/schemas/config.py (8)
src/axolotl/utils/schemas/validation.py (1)
  • ValidationMixin (1060-1073)
src/axolotl/utils/schemas/vllm.py (1)
  • VllmConfig (8-55)
src/axolotl/utils/logging.py (1)
  • get_logger (53-62)
src/axolotl/prompt_strategies/dpo/chat_template.py (1)
  • default (9-124)
src/axolotl/utils/schemas/enums.py (3)
  • RLType (24-32)
  • RingAttnFunc (82-90)
  • ChatTemplate (35-67)
src/axolotl/utils/schemas/datasets.py (5)
  • SFTDataset (45-216)
  • DPODataset (244-252)
  • KTODataset (278-286)
  • StepwiseSupervisedDataset (255-264)
  • PretrainingDataset (219-229)
src/axolotl/utils/schemas/model.py (1)
  • SpecialTokensConfig (97-104)
src/axolotl/utils/mistral_tokenizer.py (1)
  • chat_template (139-141)
src/axolotl/utils/schemas/validation.py (2)
src/axolotl/utils/schemas/enums.py (3)
  • ChatTemplate (35-67)
  • RingAttnFunc (82-90)
  • RLType (24-32)
src/axolotl/utils/schemas/datasets.py (1)
  • check_chat_template_config (196-216)
🪛 Ruff (0.11.9)
docs/scripts/generate_config_docs.py

165-168: Use a single if statement instead of nested if statements

(SIM102)


408-412: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


507-509: Use a single if statement instead of nested if statements

(SIM102)

src/axolotl/utils/schemas/validation.py

133-134: Use a single if statement instead of nested if statements

(SIM102)


406-414: Use a single if statement instead of nested if statements

(SIM102)


501-506: Use a single if statement instead of nested if statements

(SIM102)


515-520: Use a single if statement instead of nested if statements

(SIM102)


582-587: Use a single if statement instead of nested if statements

(SIM102)


744-750: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (6)
  • GitHub Check: PyTest (3.11, 2.6.0)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.5.1)
🔇 Additional comments (2)
src/axolotl/utils/schemas/config.py (1)

290-300: Docstring/default mismatch for eval_causal_lm_metrics

The description lists a non-empty default
['sacrebleu', 'comet', 'ter', 'chrf', 'perplexity']
but the field’s runtime default is None.

Either drop the default list from the description or set it via default_factory=list(...) so behaviour and docs stay in sync.

src/axolotl/utils/schemas/validation.py (1)

329-337: Validation logic corrected for deprecated parameters.
The unreachable branch in check_neftune has been fixed to properly detect when both parameters are set. This resolves the prior duplicate condition issue.

Comment thread src/axolotl/utils/schemas/config.py
Comment thread docs/scripts/generate_config_docs.py Outdated
Comment thread src/axolotl/utils/schemas/validation.py
@github-actions github-actions Bot temporarily deployed to preview June 17, 2025 18:25 Inactive

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (5)
src/axolotl/utils/schemas/validation.py (3)

327-337: Unreachable branch in check_neftune – duplicate condition

The elif branch tests the same condition as the if branch, making it unreachable. The intended logic should check if both parameters are present.

-    elif data.get("noisy_embedding_alpha") and not data.get("neftune_noise_alpha"):
+    elif data.get("noisy_embedding_alpha") and data.get("neftune_noise_alpha"):

512-524: Fix typo in error message

The error message incorrectly repeats lora_mlp_kernel three times.

-    "lora_mlp_kernel, lora_mlp_kernel, and lora_mlp_kernel are not compatible with 8-bit LoRA"
+    "lora_mlp_kernel, lora_qkv_kernel, and lora_o_kernel are not compatible with 8-bit LoRA"

619-626: Fix enum comparison that will silently fail

The method compares data.get("rl") to the string "kto", but after Pydantic parsing this field will be the enum member RLType.KTO.

-        if data.get("rl") == "kto":
+        if data.get("rl") in (RLType.KTO, "kto"):
docs/scripts/generate_config_docs.py (2)

8-16: Handle missing torch dependency in docs CI

The import of AxolotlInputConfig pulls in torch, which is not available in the docs CI environment.

Add this before the import to stub torch:

+import sys
+import types
+
+# Stub torch for docs generation
+try:
+    import torch  # noqa: F401
+except ModuleNotFoundError:
+    sys.modules["torch"] = types.ModuleType("torch")
+    sys.modules["torch"].__dict__["__getattr__"] = lambda *_: None
+
 from axolotl.utils.schemas.config import AxolotlInputConfig

462-467: Unsafe default value emission for complex types

Directly interpolating the default value can produce invalid YAML for complex types like strings with colons or multiline lists.

-            if field_info.get("default") is not None:
-                field_line += f" = {field_info['default']}"
+            default_val = field_info.get("default")
+            if default_val is not None:
+                field_line += f" = {repr(default_val)}"
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 52a9d4f and b984d03.

📒 Files selected for processing (3)
  • docs/quantize.qmd (1 hunks)
  • docs/scripts/generate_config_docs.py (1 hunks)
  • src/axolotl/utils/schemas/validation.py (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • docs/quantize.qmd
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/axolotl/utils/schemas/validation.py (2)
src/axolotl/utils/schemas/enums.py (3)
  • ChatTemplate (35-67)
  • RingAttnFunc (82-90)
  • RLType (24-32)
src/axolotl/utils/schemas/datasets.py (1)
  • check_chat_template_config (196-216)
🪛 Ruff (0.11.9)
src/axolotl/utils/schemas/validation.py

133-134: Use a single if statement instead of nested if statements

(SIM102)


406-414: Use a single if statement instead of nested if statements

(SIM102)


501-506: Use a single if statement instead of nested if statements

(SIM102)


515-520: Use a single if statement instead of nested if statements

(SIM102)


582-587: Use a single if statement instead of nested if statements

(SIM102)


744-750: Use a single if statement instead of nested if statements

(SIM102)

docs/scripts/generate_config_docs.py

165-168: Use a single if statement instead of nested if statements

(SIM102)


408-412: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)


507-509: Use a single if statement instead of nested if statements

(SIM102)

⏰ Context from checks skipped due to timeout of 90000ms (9)
  • GitHub Check: preview
  • GitHub Check: PyTest from Source Dist (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.7.1)
  • GitHub Check: PyTest from Source Dist (3.11, 2.7.1)
  • GitHub Check: PyTest (3.11, 2.5.1)
  • GitHub Check: PyTest (3.11, 2.6.0)
  • GitHub Check: PyTest from Source Dist (3.11, 2.6.0)
  • GitHub Check: pre-commit
  • GitHub Check: pre-commit

Comment thread src/axolotl/utils/schemas/validation.py
Comment thread docs/scripts/generate_config_docs.py
@github-actions github-actions Bot temporarily deployed to preview June 18, 2025 12:20 Inactive

@winglian winglian left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks great. thanks!

@djsaunde djsaunde force-pushed the config-doc-autogen branch from 70bca22 to ba84445 Compare June 18, 2025 17:20
@djsaunde djsaunde force-pushed the config-doc-autogen branch from ba84445 to 3b0685d Compare June 18, 2025 18:05

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
src/axolotl/utils/schemas/validation.py (2)

620-637: Enum comparison will still silently fail – use RLType not raw strings

data.get("rl") == "kto" / "grpo" will be False after Pydantic casts the field to RLType, so these validations are skipped.
Replace the checks with enum-aware variants:

-        if data.get("rl") == "kto":
+        if data.get("rl") in (RLType.KTO, "kto"):
...
-        if (
-            data.get("rl") == "grpo"
+        if (
+            data.get("rl") in (RLType.GRPO, "grpo")

579-591: Duplicate validator – keep one, drop the other

check_lora_kernel_8bit (this block) repeats the logic already implemented in check_lora_8bit (514-524).
Remove this copy to avoid diverging fixes and needless execution.

🧹 Nitpick comments (1)
docs/scripts/generate_config_docs.py (1)

97-99: Inconsistent field declaration – drops schema metadata

mean_resizing_embeddings is the only boolean option defined without Field(...).
As a result it will be missing from the autogenerated JSON-schema and docs.
Declare it via Field(default=False, json_schema_extra={...}) to stay in sync with the rest of the config.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ba84445 and 3b0685d.

📒 Files selected for processing (23)
  • .github/workflows/preview-docs.yml (2 hunks)
  • .runpod/README.md (1 hunks)
  • README.md (1 hunks)
  • _quarto.yml (2 hunks)
  • docs/.gitignore (1 hunks)
  • docs/config.qmd (0 hunks)
  • docs/dataset-formats/conversation.qmd (2 hunks)
  • docs/dataset-formats/inst_tune.qmd (1 hunks)
  • docs/dataset_loading.qmd (1 hunks)
  • docs/getting-started.qmd (2 hunks)
  • docs/quantize.qmd (1 hunks)
  • docs/scripts/generate_config_docs.py (1 hunks)
  • src/axolotl/utils/schemas/config.py (9 hunks)
  • src/axolotl/utils/schemas/datasets.py (2 hunks)
  • src/axolotl/utils/schemas/deprecated.py (1 hunks)
  • src/axolotl/utils/schemas/enums.py (2 hunks)
  • src/axolotl/utils/schemas/integrations.py (3 hunks)
  • src/axolotl/utils/schemas/model.py (2 hunks)
  • src/axolotl/utils/schemas/peft.py (3 hunks)
  • src/axolotl/utils/schemas/quantization.py (2 hunks)
  • src/axolotl/utils/schemas/training.py (2 hunks)
  • src/axolotl/utils/schemas/trl.py (3 hunks)
  • src/axolotl/utils/schemas/validation.py (1 hunks)
💤 Files with no reviewable changes (1)
  • docs/config.qmd
✅ Files skipped from review due to trivial changes (6)
  • docs/getting-started.qmd
  • docs/dataset-formats/inst_tune.qmd
  • README.md
  • .runpod/README.md
  • docs/dataset-formats/conversation.qmd
  • docs/dataset_loading.qmd
🚧 Files skipped from review as they are similar to previous changes (14)
  • docs/quantize.qmd
  • docs/.gitignore
  • .github/workflows/preview-docs.yml
  • _quarto.yml
  • src/axolotl/utils/schemas/enums.py
  • src/axolotl/utils/schemas/trl.py
  • src/axolotl/utils/schemas/integrations.py
  • src/axolotl/utils/schemas/deprecated.py
  • src/axolotl/utils/schemas/training.py
  • src/axolotl/utils/schemas/config.py
  • src/axolotl/utils/schemas/datasets.py
  • src/axolotl/utils/schemas/quantization.py
  • src/axolotl/utils/schemas/model.py
  • src/axolotl/utils/schemas/peft.py
🧰 Additional context used
🪛 Ruff (0.11.9)
docs/scripts/generate_config_docs.py

924-925: Use a single if statement instead of nested if statements

(SIM102)


1044-1045: Use a single if statement instead of nested if statements

(SIM102)


1084-1089: Use a single if statement instead of nested if statements

Combine if statements using and

(SIM102)

src/axolotl/utils/schemas/validation.py

133-134: Use a single if statement instead of nested if statements

(SIM102)


406-414: Use a single if statement instead of nested if statements

(SIM102)


501-506: Use a single if statement instead of nested if statements

(SIM102)


515-520: Use a single if statement instead of nested if statements

(SIM102)


582-587: Use a single if statement instead of nested if statements

(SIM102)


744-750: Use a single if statement instead of nested if statements

(SIM102)

@github-actions github-actions Bot temporarily deployed to preview June 18, 2025 18:13 Inactive
@github-actions github-actions Bot temporarily deployed to preview June 18, 2025 18:24 Inactive
@djsaunde djsaunde merged commit 9d5bfc1 into main Jun 18, 2025
12 of 14 checks passed
@djsaunde djsaunde deleted the config-doc-autogen branch June 18, 2025 19:36
@djsaunde

Copy link
Copy Markdown
Collaborator Author

Follow-up work: Reorder / rethink grouping of config classes / fields s.t. the most important bits are displayed near the top of the generated config reference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants