Changeset 0.7.0 (#37)
This commit is contained in:
@@ -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})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user