Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 36 additions & 5 deletions catalog/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"path/filepath"
"sort"
"time"

"gopkg.in/yaml.v3"
)

// Build reads per-model YAML files from providersDir, resolves extends
Expand All @@ -17,6 +19,8 @@ import (
func Build(providersDir, distDir string) error {
entries := make(map[string]Entry)

providerMetas := readProviderMetas(providersDir)

pattern := filepath.Join(providersDir, "*", "models", "*.yaml")
matches, err := filepath.Glob(pattern)
if err != nil {
Expand Down Expand Up @@ -59,8 +63,7 @@ func Build(providersDir, distDir string) error {

fmt.Printf("Built catalog with %d entries at %s\n", len(entries), outputPath)

// Generate per-provider slices and manifest
if err := generateProviderSlicesAndManifest(entries, jsonData, distDir); err != nil {
if err := generateProviderSlicesAndManifest(entries, jsonData, distDir, providerMetas); err != nil {
return err
}

Expand Down Expand Up @@ -88,7 +91,26 @@ func groupByProvider(entries map[string]Entry) map[string]map[string]Entry {

// generateProviderSlicesAndManifest writes per-provider JSON slices to
// dist/providers/<id>.json and a manifest to dist/manifest.json.
func generateProviderSlicesAndManifest(entries map[string]Entry, catalogJSON []byte, distDir string) error {
func readProviderMetas(providersDir string) map[string]ProviderMeta {
metas := make(map[string]ProviderMeta)
pattern := filepath.Join(providersDir, "*", "provider.yaml")
matches, _ := filepath.Glob(pattern)
for _, path := range matches {
data, err := os.ReadFile(filepath.Clean(path))
if err != nil {
continue
}
var meta ProviderMeta
if err := yaml.Unmarshal(data, &meta); err != nil {
continue
}
providerDir := filepath.Base(filepath.Dir(path))
metas[providerDir] = meta
}
return metas
}

func generateProviderSlicesAndManifest(entries map[string]Entry, catalogJSON []byte, distDir string, providerMetas map[string]ProviderMeta) error {
providersDir := filepath.Join(distDir, "providers")
if err := os.MkdirAll(providersDir, 0o750); err != nil {
return fmt.Errorf("create providers dir: %w", err)
Expand Down Expand Up @@ -119,11 +141,20 @@ func generateProviderSlicesAndManifest(entries map[string]Entry, catalogJSON []b
return fmt.Errorf("write %s: %w", slicePath, err)
}

manifestProviders = append(manifestProviders, ManifestProvider{
mp := ManifestProvider{
ID: id,
ModelCount: len(sliceEntries),
SHA256: sha256Hex(sliceJSON),
})
}
if meta, ok := providerMetas[id]; ok {
mp.DisplayName = meta.DisplayName
mp.LogoURL = meta.LogoURL
mp.Logo = meta.Logo
mp.Category = meta.Category
mp.Description = meta.Description
mp.CompanyName = meta.CompanyName
}
manifestProviders = append(manifestProviders, mp)
}

now := time.Now().UTC()
Expand Down
22 changes: 19 additions & 3 deletions catalog/manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,25 @@ type Manifest struct {

// ManifestProvider holds metadata for a single provider slice.
type ManifestProvider struct {
ID string `json:"id"`
ModelCount int `json:"model_count"`
SHA256 string `json:"sha256"`
ID string `json:"id"`
ModelCount int `json:"model_count"`
SHA256 string `json:"sha256"`
DisplayName string `json:"display_name,omitempty"`
LogoURL string `json:"logo_url,omitempty"`
Logo string `json:"logo,omitempty"`
Category string `json:"category,omitempty"`
Description string `json:"description,omitempty"`
CompanyName string `json:"company_name,omitempty"`
}

// ProviderMeta holds provider-level metadata read from provider.yaml.
type ProviderMeta struct {
DisplayName string `yaml:"display_name" json:"display_name"`
LogoURL string `yaml:"logo_url" json:"logo_url"`
Logo string `yaml:"logo" json:"logo"`
Category string `yaml:"category" json:"category"`
Description string `yaml:"description" json:"description"`
CompanyName string `yaml:"company_name" json:"company_name"`
}

// ManifestStats holds aggregate counts.
Expand Down
Loading
Loading