fetch.go

v0.5.1
Doc Versions Source
1
package tui
2
3
import (
4
	"encoding/json"
5
	"fmt"
6
7
	tea "github.com/charmbracelet/bubbletea"
8
	"sourcecraft.dev/bigbes/claudio/vkproxy"
9
)
10
11
var errZipNotFound = fmt.Errorf("claude-code-config.zip not found")
12
13
func (m Model) loadVKProxyModels(forceRefresh bool) ([]vkproxy.ProxyModel, error) {
14
	// Try cache first (unless forcing refresh).
15
	if !forceRefresh && m.cache != nil {
16
		if data, ok := m.cache.GetModels("vkproxy"); ok {
17
			var models []vkproxy.ProxyModel
18
			if json.Unmarshal(data, &models) == nil && len(models) > 0 {
19
				return models, nil
20
			}
21
		}
22
	}
23
24
	// Parse from zip.
25
	zipPath := vkproxy.FindZip()
26
	if zipPath == "" {
27
		return nil, errZipNotFound
28
	}
29
	return m.loadVKProxyModelsFromPath(zipPath)
30
}
31
32
func (m Model) loadVKProxyModelsFromPath(zipPath string) ([]vkproxy.ProxyModel, error) {
33
	models, err := vkproxy.ParseZip(zipPath)
34
	if err != nil {
35
		return nil, err
36
	}
37
	if len(models) == 0 {
38
		return nil, fmt.Errorf("no models found in zip")
39
	}
40
41
	// Update cache.
42
	if m.cache != nil {
43
		if data, err := json.Marshal(models); err == nil {
44
			m.cache.SetModels("vkproxy", data)
45
		}
46
	}
47
	return models, nil
48
}
49
50
func (m Model) startVKProxyPicker() (tea.Model, tea.Cmd) {
51
	return m.startVKProxyPickerWithRefresh(false)
52
}
53
54
func (m Model) startVKProxyPickerWithRefresh(forceRefresh bool) (tea.Model, tea.Cmd) {
55
	models, err := m.loadVKProxyModels(forceRefresh)
56
	if err == errZipNotFound {
57
		return m.showZipFilePicker()
58
	}
59
	if err != nil {
60
		m.modelsErr = err
61
		m.phase = phaseSelect
62
		return m, nil
63
	}
64
	return m.showVKProxyModels(models)
65
}
66
67
func (m Model) showVKProxyModels(models []vkproxy.ProxyModel) (tea.Model, tea.Cmd) {
68
	// Save common config (auth, base_url, env) from first model.
69
	pc := m.cfg.Providers["vkproxy"]
70
	pc.APIKey = models[0].AuthToken
71
	pc.BaseURL = models[0].BaseURL
72
	if pc.Env == nil {
73
		pc.Env = make(map[string]string)
74
	}
75
	if models[0].CustomHeaders != "" {
76
		pc.Env["ANTHROPIC_CUSTOM_HEADERS"] = models[0].CustomHeaders
77
	}
78
	if models[0].ProxyUser != "" {
79
		pc.Env["VK_LLM_PROXY_USER"] = models[0].ProxyUser
80
	}
81
	m.cfg.Providers["vkproxy"] = pc
82
	m.cfg.ActiveProvider = "vkproxy"
83
84
	// Group models by provider for the two-column picker.
85
	providers, grouped := vkproxy.GroupByProvider(models)
86
	familyMap := make(map[string][]PickerItem)
87
	for prov, pms := range grouped {
88
		for _, pm := range pms {
89
			familyMap[prov] = append(familyMap[prov], PickerItem{
90
				ID:            pm.ModelID,
91
				Name:          pm.Name,
92
				ContextLength: pm.ContextWindow,
93
			})
94
		}
95
	}
96
97
	m.phase = phaseSelectModel
98
	m.pickerProvider = "vkproxy"
99
	m.families = providers
100
	m.familyModels = familyMap
101
	m.preSelectModel()
102
	return m, nil
103
}
104

Source Files