Changeset 0.7.0 (#37)

This commit is contained in:
2026-02-21 12:43:33 +00:00
parent 925b70f98c
commit a95e246cd7
18 changed files with 1424 additions and 115 deletions

View File

@@ -432,6 +432,9 @@ func (h *APIConfigHandler) ListEnabledModels(c *gin.Context) {
ConfigID string `json:"config_id"`
Capabilities providers.ModelCapabilities `json:"capabilities"`
Pricing *providers.ModelPricing `json:"pricing,omitempty"`
IsPreset bool `json:"is_preset,omitempty"`
PresetID string `json:"preset_id,omitempty"`
PresetScope string `json:"preset_scope,omitempty"`
}
models := make([]enabledModel, 0)
@@ -532,6 +535,90 @@ func (h *APIConfigHandler) ListEnabledModels(c *gin.Context) {
}
}
// ── 3. Active presets (global + user's personal + shared) ──
presetRows, err := database.DB.Query(`
SELECT mp.id, mp.name, mp.description, mp.base_model_id, mp.api_config_id,
mp.icon, mp.scope, mp.temperature, mp.max_tokens,
COALESCE(ac.provider, '') as provider, COALESCE(ac.name, '') as provider_name
FROM model_presets mp
LEFT JOIN api_configs ac ON mp.api_config_id = ac.id
WHERE mp.is_active = true
AND (
mp.scope = 'global'
OR (mp.scope = 'personal' AND mp.created_by = $1)
OR (mp.scope = 'personal' AND mp.is_shared = true)
)
ORDER BY mp.scope ASC, mp.name ASC
`, userID)
if err == nil {
defer presetRows.Close()
for presetRows.Next() {
var presetID, name, description, baseModelID, icon, scope, provID, provName string
var apiConfigID *string
var temp *float64
var maxTok *int
if err := presetRows.Scan(&presetID, &name, &description, &baseModelID, &apiConfigID,
&icon, &scope, &temp, &maxTok, &provID, &provName); err != nil {
continue
}
// Inherit capabilities from the base model already loaded in sections 1/2
var caps providers.ModelCapabilities
capsFound := false
for _, existing := range models {
if existing.ModelID == baseModelID {
caps = existing.Capabilities
capsFound = true
break
}
}
if !capsFound {
// Base model not in enabled list — try synced model_configs
var capsJSON []byte
err := database.DB.QueryRow(`
SELECT capabilities FROM model_configs
WHERE model_id = $1 ORDER BY updated_at DESC LIMIT 1
`, baseModelID).Scan(&capsJSON)
if err == nil && len(capsJSON) > 0 {
_ = json.Unmarshal(capsJSON, &caps)
capsFound = true
}
}
if !capsFound {
var found bool
caps, found = providers.LookupKnownModel(baseModelID)
if !found {
caps = providers.InferCapabilities(baseModelID)
}
}
caps.MaxOutputTokens = providers.ResolveMaxOutput(baseModelID, caps)
cfgID := ""
if apiConfigID != nil {
cfgID = *apiConfigID
}
// Build display name: "icon Name (base-model)"
displayName := name
if icon != "" {
displayName = icon + " " + name
}
models = append(models, enabledModel{
ID: presetID,
ModelID: baseModelID,
DisplayName: &displayName,
Provider: provID,
ProviderName: provName,
ConfigID: cfgID,
Capabilities: caps,
IsPreset: true,
PresetID: presetID,
PresetScope: scope,
})
}
}
c.JSON(http.StatusOK, gin.H{"models": models})
}