fetcher_openrouter.go

v0.7.0
Doc Versions Source
1
package tui
2
3
import (
4
	"encoding/json"
5
6
	"sourcecraft.dev/bigbes/claudio/cache"
7
	"sourcecraft.dev/bigbes/claudio/provider/openrouter"
8
)
9
10
type openrouterFetcher struct {
11
	apiKey string
12
}
13
14
func (f openrouterFetcher) ProviderKey() string { return "openrouter" }
15
16
func (f openrouterFetcher) FetchAndCategorize(cdb *cache.DB) (CategorizedResult, error) {
17
	var models []openrouter.ORModel
18
19
	// Try cache (apply post-cache filter).
20
	if cdb != nil {
21
		if data, ok := cdb.GetModels(f.ProviderKey()); ok {
22
			if json.Unmarshal(data, &models) != nil {
23
				models = nil
24
			} else {
25
				models = openrouter.FilterAgentCompatible(models)
26
			}
27
		}
28
	}
29
30
	// Fetch from API on cache miss.
31
	if models == nil {
32
		var err error
33
		models, err = openrouter.ListModels(f.apiKey)
34
		if err != nil {
35
			return CategorizedResult{}, err
36
		}
37
		saveCacheModels(cdb, f.ProviderKey(), models)
38
	}
39
40
	categories, grouped := openrouter.CategorizeModels(models)
41
	items := make(map[string][]PickerItem)
42
	for cat, orms := range grouped {
43
		for _, orm := range orms {
44
			items[cat] = append(items[cat], PickerItem{ID: orm.ID, Name: orm.DisplayName(), ContextLength: orm.ContextLength})
45
		}
46
	}
47
48
	result := CategorizedResult{
49
		Families: categories,
50
		Items:    items,
51
	}
52
53
	// Prepend "Recent" from provider-scoped table.
54
	prependRecentModels(cdb, f.ProviderKey(), &result)
55
56
	// Popular provider drill-down.
57
	provNames, provGrouped := openrouter.GroupPopularByProvider(models)
58
	provItems := make(map[string][]PickerItem)
59
	for prov, orms := range provGrouped {
60
		for _, orm := range orms {
61
			provItems[prov] = append(provItems[prov], PickerItem{ID: orm.ID, Name: orm.DisplayName(), ContextLength: orm.ContextLength})
62
		}
63
	}
64
	result.PopularProviders = provNames
65
	result.PopularProviderModels = provItems
66
	result.AllModelIDs = openrouter.AllModelIDs(models)
67
68
	return result, nil
69
}
70

Source Files