entrenar/hf_pipeline/export/
publish_pipeline.rs1use crate::hf_pipeline::error::FetchError;
7use crate::hf_pipeline::export::gguf_writer::GgufQuantization;
8use crate::hf_pipeline::export::pipeline::{quantize_and_export, QuantExportResult};
9use crate::hf_pipeline::export::weights::ModelWeights;
10use crate::hf_pipeline::publish::config::PublishConfig;
11use crate::hf_pipeline::publish::publisher::HfPublisher;
12use crate::hf_pipeline::publish::result::{PublishError, PublishResult};
13use std::path::Path;
14
15#[derive(Debug, Clone)]
17pub struct QuantPublishResult {
18 pub export: QuantExportResult,
20 pub publish: PublishResult,
22}
23
24pub fn quantize_export_publish(
32 weights: &ModelWeights,
33 quantization: GgufQuantization,
34 publish_config: PublishConfig,
35 output_dir: impl AsRef<Path>,
36) -> std::result::Result<QuantPublishResult, QuantPublishError> {
37 let output_dir = output_dir.as_ref();
38 let filename = "model.gguf";
39
40 let export_result = quantize_and_export(weights, quantization, output_dir, filename)
42 .map_err(QuantPublishError::Export)?;
43
44 let publisher = HfPublisher::new(publish_config).map_err(QuantPublishError::Publish)?;
46
47 let gguf_path = output_dir.join(filename);
48 let files: Vec<(&Path, &str)> = vec![(&gguf_path, filename)];
49
50 let mut publish_result = publisher.publish(&files, None).map_err(QuantPublishError::Publish)?;
52
53 if let Some(readme) = &export_result.readme {
55 publisher
56 .upload_bytes(readme.as_bytes(), "README.md")
57 .map_err(QuantPublishError::Publish)?;
58 publish_result.model_card_generated = true;
59 }
60
61 Ok(QuantPublishResult { export: export_result, publish: publish_result })
62}
63
64#[derive(Debug, thiserror::Error)]
66pub enum QuantPublishError {
67 #[error("Export failed: {0}")]
69 Export(FetchError),
70
71 #[error("Publish failed: {0}")]
73 Publish(PublishError),
74}