pub struct ModelService {
repo: Arc<dyn ModelRepository>,
}Expand description
Service for model operations.
This service provides high-level model management by delegating
to the injected ModelRepository. It adds no business logic
beyond what the repository provides - it’s a thin facade.
Fields§
§repo: Arc<dyn ModelRepository>Implementations§
Source§impl ModelService
impl ModelService
Sourcepub fn new(repo: Arc<dyn ModelRepository>) -> Self
pub fn new(repo: Arc<dyn ModelRepository>) -> Self
Create a new model service with the given repository.
Sourcepub async fn get(&self, identifier: &str) -> Result<Option<Model>, CoreError>
pub async fn get(&self, identifier: &str) -> Result<Option<Model>, CoreError>
Get a model by its identifier (id, name, or HF ID).
Sourcepub async fn get_by_id(&self, id: i64) -> Result<Option<Model>, CoreError>
pub async fn get_by_id(&self, id: i64) -> Result<Option<Model>, CoreError>
Get a model by its database ID.
Sourcepub async fn get_by_name(&self, name: &str) -> Result<Option<Model>, CoreError>
pub async fn get_by_name(&self, name: &str) -> Result<Option<Model>, CoreError>
Get a model by name.
Sourcepub async fn find_by_identifier(
&self,
identifier: &str,
) -> Result<Model, CoreError>
pub async fn find_by_identifier( &self, identifier: &str, ) -> Result<Model, CoreError>
Find a model by identifier (id, name, or HF ID). Returns error if not found.
Sourcepub async fn find_by_name(&self, name: &str) -> Result<Model, CoreError>
pub async fn find_by_name(&self, name: &str) -> Result<Model, CoreError>
Find a model by name. Returns error if not found.
Sourcepub async fn import_from_file(
&self,
file_path: &Path,
gguf_parser: &dyn GgufParserPort,
param_count_override: Option<f64>,
) -> Result<Model, CoreError>
pub async fn import_from_file( &self, file_path: &Path, gguf_parser: &dyn GgufParserPort, param_count_override: Option<f64>, ) -> Result<Model, CoreError>
Import a model from a local GGUF file with full metadata extraction.
Validates file, parses GGUF metadata, detects capabilities, and registers with rich metadata. This is the canonical way to add local models.
§Arguments
file_path- Absolute path to the GGUF filegguf_parser- Parser implementation for metadata extractionparam_count_override- Optional user override for parameter count
§Returns
Returns the registered Model with full metadata, or validation error.
§Design
This method orchestrates:
- File validation (existence, extension)
- GGUF metadata parsing (architecture, quantization, context)
- Capability detection (reasoning, tool-calling from metadata)
- Chat template inference (additional capability signals)
- Auto-tag generation from detected capabilities
- Model persistence with complete
NewModelstruct
Sourcepub async fn remove(&self, identifier: &str) -> Result<Model, CoreError>
pub async fn remove(&self, identifier: &str) -> Result<Model, CoreError>
Remove a model by identifier. Returns the removed model.
List all unique tags used across all models.
Sourcepub async fn add_tag(&self, model_id: i64, tag: String) -> Result<(), CoreError>
pub async fn add_tag(&self, model_id: i64, tag: String) -> Result<(), CoreError>
Add a tag to a model.
If the tag already exists on the model, this is a no-op.
Sourcepub async fn remove_tag(
&self,
model_id: i64,
tag: &str,
) -> Result<(), CoreError>
pub async fn remove_tag( &self, model_id: i64, tag: &str, ) -> Result<(), CoreError>
Remove a tag from a model.
If the tag doesn’t exist on the model, this is a no-op.
Get all tags for a specific model.
Sourcepub async fn get_by_tag(&self, tag: &str) -> Result<Vec<Model>, CoreError>
pub async fn get_by_tag(&self, tag: &str) -> Result<Vec<Model>, CoreError>
Get all models that have a specific tag.
Sourcepub async fn get_filter_options(&self) -> Result<ModelFilterOptions, CoreError>
pub async fn get_filter_options(&self) -> Result<ModelFilterOptions, CoreError>
Get filter options aggregated from all models.
Returns distinct quantizations, parameter count range, and context length range for use in the GUI filter popover.
Note: Uses in-memory aggregation for simplicity. This is acceptable for typical model libraries (<100 models). Revisit if libraries grow large.
Sourcepub async fn bootstrap_capabilities(&self) -> Result<(), CoreError>
pub async fn bootstrap_capabilities(&self) -> Result<(), CoreError>
Backfill capabilities for models that don’t have them set.
This runs on startup to handle models with unknown capabilities. Only infers if capabilities are empty (0/unknown).
§INVARIANT
Never overwrite explicitly-set capabilities. Only infer when unknown.