Skip to content

Conversation

@ilopezluna
Copy link
Contributor

@ilopezluna ilopezluna commented Oct 15, 2025

fixes #223

How to use it:

docker model ls | grep smollm2
ai/smollm2                      361.82 M    IQ2_XXS/Q4_K_M  llama         354bf30d0aa3  6 months ago  256.35 MiB  

docker model inspect ai/smollm2
{
    "id": "sha256:354bf30d0aa3af413d2aa5ae4f23c66d78980072d1e07a5b0d776e9606a2f0b9",
    "tags": [
        "ai/smollm2"
    ],
    "created": 1742816981,
    "config": {
        "format": "gguf",
        "quantization": "IQ2_XXS/Q4_K_M",
        "parameters": "361.82 M",
        "architecture": "llama",
        "size": "256.35 MiB"
    }
}


docker model package --from ai/smollm2 --context-size 2048 ignaciolopezluna020/smollm2:2k
INFO[0000] Successfully initialized store               
Reading model from store: "ai/smollm2"
INFO[0000] Getting model by reference: ai/smollm2       
Creating builder from existing model
Setting context size 2048
Creating lightweight model variant...
INFO[0000] Writing lightweight model variant            
Model variant created successfully


docker model ls | grep smollm2
ai/smollm2                      361.82 M    IQ2_XXS/Q4_K_M  llama         354bf30d0aa3  6 months ago  256.35 MiB  
ignaciolopezluna020/smollm2:2k  361.82 M    IQ2_XXS/Q4_K_M  llama         7522a58ecdbd  6 months ago  256.35 MiB  


docker model inspect ignaciolopezluna020/smollm2:2k
{
    "id": "sha256:7522a58ecdbda6cdeea5480bebd456329e65fc4bec7cd9484193a2813d4b3413",
    "tags": [
        "ignaciolopezluna020/smollm2:2k"
    ],
    "created": 1742816981,
    "config": {
        "format": "gguf",
        "quantization": "IQ2_XXS/Q4_K_M",
        "parameters": "361.82 M",
        "architecture": "llama",
        "size": "256.35 MiB",
        "context_size": 2048
    }
}

This pull request adds support for creating new model variants by repackaging an existing model, allowing users to make config-only modifications (such as changing context size) without re-uploading or duplicating large model files. It introduces a new --from flag to the docker model package command, implements lightweight repackaging logic, and ensures that only config changes (with no new files) use this optimized path. The changes also include new tests for the repackaging workflow.

New packaging source and CLI enhancements:

  • Added a --from <model> flag to the docker model package command, allowing users to repackage an existing model as a new variant. The CLI now validates that only one of --gguf, --safetensors-dir, or --from is provided.

Builder and distribution logic:

  • Introduced the FromModel function in the builder package to create a new builder from an existing model artifact, enabling modifications such as changing config or adding layers. Also added a Model() method to access the underlying model artifact.
  • Added logic in the CLI to detect config-only modifications and, when appropriate, use a new lightweight repackaging path that avoids copying model layers.

Lightweight repackaging implementation:

  • Implemented WriteLightweightModel in the distribution client and WriteLightweight in the local store, enabling efficient creation of new model variants by writing only the manifest and config when all layers already exist in the store.

Testing and validation:

  • Added comprehensive tests to verify the repackaging workflow, ensuring that config changes and additional layers are handled correctly and that the lightweight repackaging path preserves layers and media types.

Dependency and import updates:

  • Imported the distribution package in the CLI to support the new distribution client functionality.

Summary by Sourcery

Introduce lightweight repackaging of existing Docker model artifacts to enable config-only variants without duplicating layer data. Add a new --from flag to docker model package, implement builder and store support for writing only manifest and config, and update CLI logic and documentation accordingly.

New Features:

  • Add --from flag to docker model package for creating variants from existing models
  • Support lightweight repackaging path that writes only manifest and config for config-only changes

Enhancements:

  • Implement builder.FromModel, Builder.Model, and Builder.HasOnlyConfigChanges to enable repackaging workflows
  • Introduce WriteLightweightModel in distribution client and WriteLightweight in local store to avoid copying unchanged layer blobs
  • Update CLI to detect config-only modifications and route to optimized repackaging path

Documentation:

  • Update CLI reference and documentation to describe the --from flag and repackaging workflow

Tests:

  • Add comprehensive tests for WriteLightweight store behavior, builder FromModel functionality, and CLI repackaging scenarios including error handling

Copilot AI review requested due to automatic review settings October 15, 2025 16:35
@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Oct 15, 2025

Reviewer's Guide

This PR enables creating new model variants by repackaging an existing model with config-only changes (e.g., context size) via a new --from flag and a lightweight repackaging path that avoids duplicating layer data.

Sequence diagram for lightweight model repackaging workflow

sequenceDiagram
    actor User
    participant CLI
    participant DistributionClient
    participant LocalStore
    User->>CLI: Run 'docker model package --from <model> --context-size <tokens> <new_tag>'
    CLI->>DistributionClient: Initialize builder from existing model
    CLI->>DistributionClient: Set new config (e.g., context size)
    CLI->>DistributionClient: Detect config-only change
    CLI->>DistributionClient: Call WriteLightweightModel()
    DistributionClient->>LocalStore: WriteLightweight(model, tags)
    LocalStore->>LocalStore: Verify layers exist
    LocalStore->>LocalStore: Write manifest and config only
    DistributionClient->>CLI: Confirm model variant creation
Loading

Class diagram for updated Builder and DistributionClient classes

classDiagram
    class Builder {
        - model: ModelArtifact
        - originalLayers: v1.Layer[]
        + FromGGUF(path)
        + FromSafetensors(paths)
        + FromModel(model)
        + WithLicense(path)
        + WithContextSize(size)
        + WithMultimodalProjector(path)
        + WithChatTemplateFile(path)
        + WithConfigArchive(path)
        + WithDirTar(path)
        + Model()
        + Build(ctx, target, pw)
        + HasOnlyConfigChanges()
    }
    class DistributionClient {
        + WriteLightweightModel(model, tags)
    }
    Builder "1" -- "1" ModelArtifact
    DistributionClient "1" -- "1" LocalStore
Loading

Class diagram for LocalStore with WriteLightweight method

classDiagram
    class LocalStore {
        + Write(model, tags, writer)
        + WriteLightweight(model, tags)
        + Read(reference)
        + hasBlob(digest)
        + writeConfigFile(model)
        + WriteManifest(digest, manifest)
        + AddTags(digest, tags)
    }
Loading

File-Level Changes

Change Details Files
Enhance CLI with --from flag and lightweight repackaging
  • Extended package command to accept --from and enforce mutual exclusivity with --gguf/--safetensors-dir
  • Added initializeBuilder to handle building from existing model artifact
  • Detect config-only modifications and invoke WriteLightweightModel for optimized path
cmd/cli/commands/package.go
Extend builder package for model-based chaining
  • Introduce FromModel to create builder from existing artifact
  • Capture original layer list and expose Model()
  • Implement HasOnlyConfigChanges to detect when only config differs
pkg/distribution/builder/builder.go
Implement lightweight repackaging in distribution client and store
  • Add Client.WriteLightweightModel wrapper
  • Implement LocalStore.WriteLightweight to write only manifest/config after verifying blobs exist
pkg/distribution/distribution/client.go
pkg/distribution/internal/store/store.go
Add comprehensive tests for repackaging workflow
  • Test WriteLightweight in store under success, missing blobs, multiple tags, multimodal projector, index integrity
  • Add builder tests for FromModel, config-only changes, additional layers and error handling
pkg/distribution/internal/store/store_test.go
pkg/distribution/builder/builder_test.go
Update documentation to include new --from option
  • Revise usage and long help in model_package reference YAML/MD
  • Add --from to options tables and model command listing
cmd/cli/docs/reference/docker_model_package.yaml
cmd/cli/docs/reference/model_package.md
cmd/cli/docs/reference/model.md

Assessment against linked issues

Issue Objective Addressed Explanation
#223 Provide a CLI or API to persistently configure model runtime parameters (such as context size, temperature, max_tokens) for a model instance, so that these settings are retained across restarts.
#223 Enable users to modify and persist model configuration (e.g., context size) without requiring a full model reload or manual hacks, and without duplicating large model files.
#223 Update documentation to reflect the new CLI/API functionality for persistent model configuration, including usage of the new --from flag and config-only repackaging.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Adds a repackaging workflow to create lightweight model variants from existing models, enabling config-only changes (e.g., context size) without re-uploading layers.

  • Introduces --from to docker model package and validation for mutually exclusive sources.
  • Adds builder.FromModel/Model, distribution client WriteLightweightModel, and LocalStore.WriteLightweight to write only config+manifest when layers already exist.
  • Adds builder tests covering FromModel with config changes and additional layers.

Reviewed Changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
pkg/distribution/internal/store/store.go Implements WriteLightweight to write only config and manifest, verifying layers exist.
pkg/distribution/distribution/client.go Adds WriteLightweightModel that delegates to store.
pkg/distribution/builder/builder_test.go Adds tests for creating a builder from an existing model and modifying or extending it.
pkg/distribution/builder/builder.go Adds FromModel and Model getters to support repackaging.
cmd/cli/commands/package.go Adds --from flag, source validation, repackaging path selection, and calls into distribution client for lightweight writes.

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment on lines 272 to 281
diffID, err := layer.DiffID()
if err != nil {
return fmt.Errorf("getting layer diffID: %w", err)
}
hasBlob, err := s.hasBlob(diffID)
if err != nil {
return fmt.Errorf("checking if layer %s exists: %w", diffID, err)
}
if !hasBlob {
return fmt.Errorf("layer %s not found in store, cannot use lightweight write", diffID)
Copy link

Copilot AI Oct 15, 2025

Choose a reason for hiding this comment

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

Checking for existing layers via DiffID can force decompression and rehash of each layer, which undermines the 'lightweight' path. Prefer using layer.Digest() (compressed hash) for existence checks to avoid recomputation and to match typical content store keys. Example change: use digest, err := layer.Digest(); has, err := s.hasBlob(digest).

Suggested change
diffID, err := layer.DiffID()
if err != nil {
return fmt.Errorf("getting layer diffID: %w", err)
}
hasBlob, err := s.hasBlob(diffID)
if err != nil {
return fmt.Errorf("checking if layer %s exists: %w", diffID, err)
}
if !hasBlob {
return fmt.Errorf("layer %s not found in store, cannot use lightweight write", diffID)
digest, err := layer.Digest()
if err != nil {
return fmt.Errorf("getting layer digest: %w", err)
}
hasBlob, err := s.hasBlob(digest)
if err != nil {
return fmt.Errorf("checking if layer %s exists: %w", digest, err)
}
if !hasBlob {
return fmt.Errorf("layer %s not found in store, cannot use lightweight write", digest)

Copilot uses AI. Check for mistakes.
Copy link

@juangcarmona juangcarmona left a comment

Choose a reason for hiding this comment

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

Great job! It will work for many of us. Thanks!

@aleksmelnikov
Copy link

It will be good if the 'docker model ls' can output context_size directly to avoid having to carry out an inspection for this parameter by 'docker model inspect'.

@ilopezluna
Copy link
Contributor Author

It will be good if the 'docker model ls' can output context_size directly to avoid having to carry out an inspection for this parameter by 'docker model inspect'.

I think that's a great idea, I'll open an issue, in case anyone of you would like to contribute feel free to open a PR!

@ilopezluna
Copy link
Contributor Author

@aleksmelnikov this is the issue: #246

# Conflicts:
#	cmd/cli/commands/package.go
#	cmd/cli/docs/reference/docker_model_package.yaml
#	cmd/cli/docs/reference/model.md
#	cmd/cli/docs/reference/model_package.md
Copilot AI review requested due to automatic review settings October 20, 2025 08:19
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Copilot AI review requested due to automatic review settings October 20, 2025 09:05
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Copilot AI review requested due to automatic review settings October 20, 2025 10:45
@ilopezluna ilopezluna changed the title [WIP] Package context size Package context size Oct 20, 2025
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Copilot AI review requested due to automatic review settings October 20, 2025 11:05
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

cmd/cli/commands/package.go:1

  • The HasOnlyConfigChanges check is performed before applying layer-affecting options like --dir-tar. If the user supplies --from and --dir-tar, HasOnlyConfigChanges will incorrectly evaluate to true and the lightweight branch will run, silently ignoring the requested dir-tar additions. Move the processing of all potential layer additions (e.g., --dir-tar, --license, --multimodal-projector, etc.) before computing useLightweight, or guard the lightweight path with len(opts.dirTarPaths) == 0 (and other layer-affecting flags) to ensure we don't skip requested layers.
package commands

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@ilopezluna ilopezluna marked this pull request as ready for review October 20, 2025 11:46
Copilot AI review requested due to automatic review settings October 20, 2025 11:46
Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey there - I've reviewed your changes and they look great!

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location> `pkg/distribution/builder/builder.go:154-163` </location>
<code_context>
+// HasOnlyConfigChanges returns true if the builder was created from an existing model
</code_context>

<issue_to_address>
**issue (bug_risk):** HasOnlyConfigChanges may return false negatives if Layers() returns layers in a different order.

If Layers() does not guarantee order, sort or normalize layers by digest before comparing to ensure accurate results.
</issue_to_address>

### Comment 2
<location> `pkg/distribution/internal/store/store.go:271-280` </location>
<code_context>
+		return fmt.Errorf("getting layers: %w", err)
+	}
+
+	for _, layer := range layers {
+		digest, err := layer.Digest()
+		if err != nil {
+			return fmt.Errorf("getting layer digest: %w", err)
+		}
+		hasBlob, err := s.hasBlob(digest)
+		if err != nil {
+			return fmt.Errorf("checking if layer %s exists: %w", digest, err)
+		}
+		if !hasBlob {
+			return fmt.Errorf("layer %s not found in store, cannot use lightweight write", digest)
+		}
</code_context>

<issue_to_address>
**suggestion:** The WriteLightweight method does not handle concurrent writes or partial failures.

Failures between writing config, manifest, or tags may leave the store inconsistent. Please implement rollback or atomic operations, or clearly document the risk of partial writes.

Suggested implementation:

```golang
/*
WriteLightweight writes only the manifest and config for a model, assuming layers already exist in the store.
This is used for config-only modifications where the layer data hasn't changed.

Note: This method attempts to rollback config/manifest/tag writes if a failure occurs, but does not guarantee atomicity across all files.
Concurrent writes may still result in inconsistent state. Use with caution if strong consistency is required.
*/
func (s *LocalStore) WriteLightweight(mdl v1.Image, tags []string) error {

```

```golang
	// Write the config JSON file
	var writtenFiles []string

	configPath := s.configPath(mdl)
	if err := s.writeConfig(mdl, configPath); err != nil {
		return fmt.Errorf("writing config: %w", err)
	}
	writtenFiles = append(writtenFiles, configPath)

	manifestPath := s.manifestPath(mdl)
	if err := s.writeManifest(mdl, manifestPath); err != nil {
		// Rollback config
		_ = s.removeFile(configPath)
		return fmt.Errorf("writing manifest: %w", err)
	}
	writtenFiles = append(writtenFiles, manifestPath)

	for _, tag := range tags {
		tagPath := s.tagPath(tag)
		if err := s.writeTag(mdl, tagPath); err != nil {
			// Rollback manifest and config
			for _, f := range writtenFiles {
				_ = s.removeFile(f)
			}
			return fmt.Errorf("writing tag %s: %w", tag, err)
		}
		writtenFiles = append(writtenFiles, tagPath)
	}

	return nil

```

You will need to implement the following helper methods in your `LocalStore` type if they do not already exist:
- `configPath(mdl v1.Image) string`
- `manifestPath(mdl v1.Image) string`
- `tagPath(tag string) string`
- `writeConfig(mdl v1.Image, path string) error`
- `writeManifest(mdl v1.Image, path string) error`
- `writeTag(mdl v1.Image, path string) error`
- `removeFile(path string) error` (should safely remove a file if it exists)

If your codebase already has similar helpers, adjust the calls accordingly.
</issue_to_address>

### Comment 3
<location> `pkg/distribution/internal/store/store.go:302` </location>
<code_context>
+	if err := s.WriteManifest(digest, rm); err != nil {
+		return fmt.Errorf("write manifest: %w", err)
+	}
+	if err := s.AddTags(digest.String(), tags); err != nil {
+		return fmt.Errorf("adding tags: %w", err)
+	}
</code_context>

<issue_to_address>
**question (bug_risk):** AddTags is called after writing the manifest, which could lead to untagged manifests on failure.

If AddTags fails, the manifest remains in the store without any tag reference. Please review if this orphaned state is acceptable or if additional cleanup should be implemented.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +271 to +280
for _, layer := range layers {
digest, err := layer.Digest()
if err != nil {
return fmt.Errorf("getting layer digest: %w", err)
}
hasBlob, err := s.hasBlob(digest)
if err != nil {
return fmt.Errorf("checking if layer %s exists: %w", digest, err)
}
if !hasBlob {
Copy link
Contributor

Choose a reason for hiding this comment

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

suggestion: The WriteLightweight method does not handle concurrent writes or partial failures.

Failures between writing config, manifest, or tags may leave the store inconsistent. Please implement rollback or atomic operations, or clearly document the risk of partial writes.

Suggested implementation:

/*
WriteLightweight writes only the manifest and config for a model, assuming layers already exist in the store.
This is used for config-only modifications where the layer data hasn't changed.

Note: This method attempts to rollback config/manifest/tag writes if a failure occurs, but does not guarantee atomicity across all files.
Concurrent writes may still result in inconsistent state. Use with caution if strong consistency is required.
*/
func (s *LocalStore) WriteLightweight(mdl v1.Image, tags []string) error {
	// Write the config JSON file
	var writtenFiles []string

	configPath := s.configPath(mdl)
	if err := s.writeConfig(mdl, configPath); err != nil {
		return fmt.Errorf("writing config: %w", err)
	}
	writtenFiles = append(writtenFiles, configPath)

	manifestPath := s.manifestPath(mdl)
	if err := s.writeManifest(mdl, manifestPath); err != nil {
		// Rollback config
		_ = s.removeFile(configPath)
		return fmt.Errorf("writing manifest: %w", err)
	}
	writtenFiles = append(writtenFiles, manifestPath)

	for _, tag := range tags {
		tagPath := s.tagPath(tag)
		if err := s.writeTag(mdl, tagPath); err != nil {
			// Rollback manifest and config
			for _, f := range writtenFiles {
				_ = s.removeFile(f)
			}
			return fmt.Errorf("writing tag %s: %w", tag, err)
		}
		writtenFiles = append(writtenFiles, tagPath)
	}

	return nil

You will need to implement the following helper methods in your LocalStore type if they do not already exist:

  • configPath(mdl v1.Image) string
  • manifestPath(mdl v1.Image) string
  • tagPath(tag string) string
  • writeConfig(mdl v1.Image, path string) error
  • writeManifest(mdl v1.Image, path string) error
  • writeTag(mdl v1.Image, path string) error
  • removeFile(path string) error (should safely remove a file if it exists)

If your codebase already has similar helpers, adjust the calls accordingly.

if err := s.WriteManifest(digest, rm); err != nil {
return fmt.Errorf("write manifest: %w", err)
}
if err := s.AddTags(digest.String(), tags); err != nil {
Copy link
Contributor

Choose a reason for hiding this comment

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

question (bug_risk): AddTags is called after writing the manifest, which could lead to untagged manifests on failure.

If AddTags fails, the manifest remains in the store without any tag reference. Please review if this orphaned state is acceptable or if additional cleanup should be implemented.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

cmd/cli/commands/package.go:1

  • The lightweight decision is made before processing --dir-tar paths, so using --from together with --dir-tar can incorrectly take the lightweight path and silently ignore the requested tar layers. Consider either including the presence of dirTarPaths in the decision (e.g., useLightweight := opts.fromModel != \"\" && len(opts.dirTarPaths) == 0 && pkg.HasOnlyConfigChanges()) or moving the dir-tar processing before evaluating HasOnlyConfigChanges.
package commands

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Copy link
Contributor

@ericcurtin ericcurtin left a comment

Choose a reason for hiding this comment

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

LGTM, worth reading through the bot comments to see if they are worth picking up.

@ilopezluna
Copy link
Contributor Author

LGTM, worth reading through the bot comments to see if they are worth picking up.

@ericcurtin the comments related to leaving the store in an inconsistent state, while true, are not related to this PR, as the store.Write method is already not atomic and it does not has a rollback mechanism.
I open an issue to address it in a separated PR

@ilopezluna ilopezluna merged commit 0f68b49 into main Oct 20, 2025
9 checks passed
@ilopezluna ilopezluna deleted the package-context-size branch October 20, 2025 12:51
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.

Persistent model configuration (max_tokens, temperature, etc.)

5 participants