Skip to content

Add macros to Configuration schema #149

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 30, 2025
Merged

Add macros to Configuration schema #149

merged 2 commits into from
May 30, 2025

Conversation

mostlygeek
Copy link
Owner

@mostlygeek mostlygeek commented May 27, 2025

Ref: #141, #148

  • Reduce boilerplate and repetitive values
  • Compatible with current configurations
  • Macros will be replaced in cmd, cmdStop, proxy, and checkEndpoint
  • Special, automatic values ${PORT} can be used in macros

Add support for defining and using macro in the configuration:

macros: 
  llamasvr: "/path/to/llama-server/llama-server-293924 --port ${PORT} --host 127.0.0.1"
  quantKV: "--cache-type-k q8_0 --cache-type-v q8_0"
  mpath: "/path/to/my/mnt/drive/models"
models: 
  "llama":
    cmd: |
      ${llamasvr}
      ${quantKV}
       -m "${mpath}/llama-8B.gguf"

The cmd will come out as: /path/to/llama-server/llama-server-293924 --port 5800 --host 127.0.0.1 --cache-type-k q8_0 --cache-type-v q8_0 -m "/path/to/my/mnt/drive/models/llama-8B.gguf"

Summary by CodeRabbit

  • New Features

    • Added support for user-defined macros in configuration files, enabling flexible macro substitution in model fields.
    • Enhanced validation and error handling for macro usage, including detection of unknown or reserved macros.
  • Documentation

    • Simplified the configuration example in the README and added a concise overview of key features, with a link to detailed documentation.
  • Tests

    • Introduced new tests to verify correct macro expansion and error handling for unknown macros in configuration files.

Copy link

coderabbitai bot commented May 27, 2025

## Walkthrough

A macro substitution mechanism was introduced to the configuration system, allowing user-defined macros in model configuration fields. The `Config` struct now includes a `Macros` map, and macro validation, substitution, and error handling were added to the config loader. Corresponding tests were implemented to verify correct macro expansion and error reporting. The README was updated to simplify configuration examples and point to external documentation.

## Changes

| File(s)                          | Change Summary                                                                                                  |
|---------------------------------|----------------------------------------------------------------------------------------------------------------|
| proxy/config.go                 | Added `Macros` field to `Config` struct; enhanced `LoadConfigFromReader` with macro validation, substitution, and error handling for unknown and reserved macros. |
| proxy/config_test.go            | Updated existing tests and added new tests for macro replacement, validation, and error handling in config loading. |
| README.md                      | Simplified configuration example by removing detailed YAML and replacing it with a concise bullet list and a link to full docs. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant ConfigLoader
    participant ModelConfig

    User->>ConfigLoader: Provide config YAML (with macros)
    ConfigLoader->>ConfigLoader: Parse macros and validate names/values
    ConfigLoader->>ModelConfig: Substitute macros in fields (cmd, cmdStop, proxy, checkEndpoint)
    ConfigLoader->>ConfigLoader: Substitute ${PORT} if present and increment port
    ConfigLoader->>ConfigLoader: Check for unreplaced/unknown macros
    ConfigLoader-->>User: Return loaded Config or error

Possibly related PRs

  • Automatic Port Numbers  #117: Introduced automatic ${PORT} substitution and startPort configuration; this PR generalizes that mechanism to support arbitrary user-defined macros with validation and error handling.

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

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.

<details>
<summary>❤️ Share</summary>

- [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)
- [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)
- [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)
- [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)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=mostlygeek/llama-swap&utm_content=149):

- 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](https://www.coderabbit.ai/contact-us/support) 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](https://docs.coderabbit.ai/finishing-touches/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.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@mostlygeek mostlygeek changed the title Add macros to Configuration schema (#141, #148) Add macros to Configuration schema May 27, 2025
@mostlygeek mostlygeek added enhancement New feature or request configuration related to configuration of llama-swap labels May 27, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
proxy/config.go (1)

192-202: Consider including checkEndpoint in PORT substitution for consistency.

Currently, user-defined macros are replaced in checkEndpoint (line 189), but the special ${PORT} macro is not (lines 199-201). This inconsistency could confuse users who might expect ${PORT} to work in all fields where macros are supported.

Consider adding checkEndpoint to the PORT substitution:

 			modelConfig.Cmd = strings.ReplaceAll(modelConfig.Cmd, "${PORT}", nextPortStr)
 			modelConfig.CmdStop = strings.ReplaceAll(modelConfig.CmdStop, "${PORT}", nextPortStr)
 			modelConfig.Proxy = strings.ReplaceAll(modelConfig.Proxy, "${PORT}", nextPortStr)
+			modelConfig.CheckEndpoint = strings.ReplaceAll(modelConfig.CheckEndpoint, "${PORT}", nextPortStr)
proxy/config_test.go (1)

372-441: Comprehensive error testing with table-driven approach.

The table-driven test structure effectively covers error cases for unknown macros in all supported fields. Good practice!

Consider removing the commented debug line:

 			assert.Contains(t, err.Error(), "unknown macro '${unknownMacro}' found in model1."+tt.field)
-			//t.Log(err)
 		})
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 25f3dc2 and eb95b25.

📒 Files selected for processing (2)
  • proxy/config.go (4 hunks)
  • proxy/config_test.go (5 hunks)
🔇 Additional comments (6)
proxy/config.go (4)

71-73: LGTM!

The Macros field is well-placed and properly documented.


183-191: Well-implemented macro substitution logic.

The implementation correctly handles macro replacement in all relevant model fields and maintains proper order of operations to support nested macros.


207-225: Excellent unknown macro detection implementation.

The validation correctly identifies any unreplaced macros after all substitutions and provides clear error messages with the specific field location.


157-165: ⚠️ Potential issue

Fix off-by-one error in length validation.

The length checks are inconsistent with the comments. The code rejects values at exactly 64 and 1024 characters, while the comments indicate these should be the maximum allowed lengths.

Apply this diff to fix the length validation:

-		if len(macroName) >= 64 {
+		if len(macroName) > 64 {
 			return Config{}, fmt.Errorf("macro name '%s' exceeds maximum length of 63 characters", macroName)
 		}
 		if !macroNameRegex.MatchString(macroName) {
 			return Config{}, fmt.Errorf("macro name '%s' contains invalid characters, must match pattern ^[a-zA-Z0-9_-]+$", macroName)
 		}
-		if len(macroValue) >= 1024 {
+		if len(macroValue) > 1024 {
 			return Config{}, fmt.Errorf("macro value for '%s' exceeds maximum length of 1024 characters", macroName)
 		}

Also update the error messages to match:

-			return Config{}, fmt.Errorf("macro name '%s' exceeds maximum length of 63 characters", macroName)
+			return Config{}, fmt.Errorf("macro name '%s' exceeds maximum length of 64 characters", macroName)

Likely an incorrect or invalid review comment.

proxy/config_test.go (2)

22-83: LGTM! Test properly validates macro functionality.

The test correctly includes macros in the configuration and verifies that the macro substitution works as expected.


340-370: Excellent test coverage for complex macro scenarios.

This test effectively validates:

  • Multiple macro substitutions
  • Nested macros (${autoPort} containing ${PORT})
  • Multi-line command handling
  • Macro substitution in both cmd and cmdStop fields

Great test design!

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
README.md (1)

60-70: Enhance clarity and example coverage for macros.

  • The phrase “very powerful” can be softened (e.g., “highly capable” or “extremely flexible”) to avoid overused intensifiers.
  • Since macros are the key feature introduced by this PR, consider adding a minimal macros section directly below the config.yaml snippet to illustrate their definition and usage. For example:
macros:
  llamaSrv: "/app/llama-server -hf bartowski/SmolLM2-135M-Instruct-GGUF:Q4_K_M"
models:
  "example-model":
    cmd: |
      ${llamaSrv}
      --port ${PORT}

This will help users immediately see how to declare and reference their own macros without having to jump to the wiki.

🧰 Tools
🪛 LanguageTool

[style] ~60-~60: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ..._K_M --port ${PORT} ``` But also very powerful: - ⚡ groups to run multiple models a...

(EN_WEAK_ADJECTIVE)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eb95b25 and 0a88192.

📒 Files selected for processing (1)
  • README.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
README.md

[style] ~60-~60: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ..._K_M --port ${PORT} ``` But also very powerful: - ⚡ groups to run multiple models a...

(EN_WEAK_ADJECTIVE)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: run-tests
🔇 Additional comments (2)
README.md (2)

51-51: Correct use of ${PORT} placeholder.
This concise snippet demonstrates the intended automatic port substitution via ${PORT} in model commands, aligning with the new macro system.


58-58: Consistent ${PORT} usage.
The second model example correctly applies the ${PORT} placeholder. Good consistency across examples.

@mostlygeek mostlygeek merged commit 1ac6499 into main May 30, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
configuration related to configuration of llama-swap enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant