Files
wehub-resource-sync e9a2f726c9
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.13) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:29:51 +08:00

64 lines
2.4 KiB
Swift

// PR — Downloads model card. Decodes `/admin/api/hf/model-info` and
// `/admin/api/ms/model-info`. Both endpoints share the same envelope
// (modelo card + metadata) so a single DTO handles both.
//
// All metadata fields are optional because:
// • `model_card` is always present (server normalizes empty to "")
// • MS doesn't surface `params` (server returns null for it)
// • MS doesn't surface `is_adapter` at all (HF-only field)
// • Even on HF, some repos omit pipeline_tag or have zero downloads/likes
//
// Future tabs (Files, Tags) would decode `files` and `tags` here — left
// out for now since v1 ships a single Card view.
import Foundation
struct ModelCardDTO: Decodable, Equatable, Sendable {
/// Raw Markdown body of the model's README. May be empty when the
/// upstream repo doesn't ship one.
let modelCard: String
/// HF-style pipeline tag, e.g. "text-generation", "automatic-speech-recognition".
/// Renders as a colored pill in the sheet's metadata row.
let pipelineTag: String?
/// Server-formatted parameter count, e.g. "7B", "13B". Already
/// display-ready — never reformat client-side.
let paramsFormatted: String?
/// Server-formatted total weight size on disk, e.g. "4.2 GB".
let sizeFormatted: String?
/// Lifetime download count from the upstream API.
let downloads: Int?
/// Lifetime like/star count from the upstream API.
let likes: Int?
/// HF-only: true when the repo is a LoRA / PEFT adapter rather than
/// a full model. The sheet renders a warning banner and hides the
/// Download button so the user doesn't accidentally pull an adapter
/// they can't run standalone.
let isAdapter: Bool?
/// Per-file listing — name + size in bytes + server-formatted size.
/// Drives the Files tab. Always present for HF; MS returns the same
/// shape but the sheet hides the Files tab for MS to match the HTML
/// admin's behavior (MS repos are usually opaque sharded blobs).
let files: [ModelCardFile]?
/// Free-form tag strings from the upstream API. Drives the Tags tab
/// for both sources.
let tags: [String]?
}
/// One entry in `ModelCardDTO.files`. `sizeFormatted` is already
/// display-ready ("4.2 GB", "1.5 MB"); never reformat client-side.
struct ModelCardFile: Decodable, Equatable, Sendable, Identifiable {
let name: String
let size: Int64
let sizeFormatted: String?
var id: String { name }
}