Add projects
This commit is contained in:
parent
2d3a9ad623
commit
8b607dd700
1802 changed files with 503346 additions and 2 deletions
362
backend/internal/registry/model_definitions.go
Normal file
362
backend/internal/registry/model_definitions.go
Normal file
|
|
@ -0,0 +1,362 @@
|
|||
// Package registry provides model definitions and lookup helpers for various AI providers.
|
||||
// Static model metadata is loaded from the embedded models.json file and can be refreshed from network.
|
||||
package registry
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
codexBuiltinImage15ModelID = "gpt-image-1.5"
|
||||
codexBuiltinImageModelID = "gpt-image-2"
|
||||
xaiBuiltinImageModelID = "grok-imagine-image"
|
||||
xaiBuiltinImageQualityModelID = "grok-imagine-image-quality"
|
||||
xaiBuiltinImage20ModelID = "grok-imagine-image-2.0"
|
||||
xaiBuiltinVideoModelID = "grok-imagine-video"
|
||||
xaiBuiltinVideo15ModelID = "grok-imagine-video-1.5"
|
||||
xaiBuiltinVideo15PreviewID = "grok-imagine-video-1.5-preview"
|
||||
)
|
||||
|
||||
// staticModelsJSON mirrors the top-level structure of models.json.
|
||||
type staticModelsJSON struct {
|
||||
Claude []*ModelInfo `json:"claude"`
|
||||
Gemini []*ModelInfo `json:"gemini"`
|
||||
Vertex []*ModelInfo `json:"vertex"`
|
||||
AIStudio []*ModelInfo `json:"aistudio"`
|
||||
CodexFree []*ModelInfo `json:"codex-free"`
|
||||
CodexTeam []*ModelInfo `json:"codex-team"`
|
||||
CodexPlus []*ModelInfo `json:"codex-plus"`
|
||||
CodexPro []*ModelInfo `json:"codex-pro"`
|
||||
Kimi []*ModelInfo `json:"kimi"`
|
||||
Antigravity []*ModelInfo `json:"antigravity"`
|
||||
XAI []*ModelInfo `json:"xai"`
|
||||
}
|
||||
|
||||
// GetClaudeModels returns the standard Claude model definitions.
|
||||
func GetClaudeModels() []*ModelInfo {
|
||||
return cloneModelInfos(getModels().Claude)
|
||||
}
|
||||
|
||||
// GetGeminiModels returns the standard Gemini model definitions.
|
||||
func GetGeminiModels() []*ModelInfo {
|
||||
return cloneModelInfos(getModels().Gemini)
|
||||
}
|
||||
|
||||
// GetGeminiVertexModels returns Gemini model definitions for Vertex AI.
|
||||
func GetGeminiVertexModels() []*ModelInfo {
|
||||
return cloneModelInfos(getModels().Vertex)
|
||||
}
|
||||
|
||||
// GetAIStudioModels returns model definitions for AI Studio.
|
||||
func GetAIStudioModels() []*ModelInfo {
|
||||
return cloneModelInfos(getModels().AIStudio)
|
||||
}
|
||||
|
||||
// GetCodexFreeModels returns model definitions for the Codex free plan tier.
|
||||
func GetCodexFreeModels() []*ModelInfo {
|
||||
return WithCodexBuiltins(cloneModelInfos(getModels().CodexFree))
|
||||
}
|
||||
|
||||
// GetCodexTeamModels returns model definitions for the Codex team plan tier.
|
||||
func GetCodexTeamModels() []*ModelInfo {
|
||||
return WithCodexBuiltins(cloneModelInfos(getModels().CodexTeam))
|
||||
}
|
||||
|
||||
// GetCodexPlusModels returns model definitions for the Codex plus plan tier.
|
||||
func GetCodexPlusModels() []*ModelInfo {
|
||||
return WithCodexBuiltins(cloneModelInfos(getModels().CodexPlus))
|
||||
}
|
||||
|
||||
// GetCodexProModels returns model definitions for the Codex pro plan tier.
|
||||
func GetCodexProModels() []*ModelInfo {
|
||||
return WithCodexBuiltins(cloneModelInfos(getModels().CodexPro))
|
||||
}
|
||||
|
||||
// GetKimiModels returns the standard Kimi (Moonshot AI) model definitions.
|
||||
func GetKimiModels() []*ModelInfo {
|
||||
return cloneModelInfos(getModels().Kimi)
|
||||
}
|
||||
|
||||
// GetAntigravityModels returns the standard Antigravity model definitions.
|
||||
func GetAntigravityModels() []*ModelInfo {
|
||||
return cloneModelInfos(getModels().Antigravity)
|
||||
}
|
||||
|
||||
// AntigravityWebSearchModelFor returns the Antigravity model that should run a
|
||||
// native web search request for modelID.
|
||||
func AntigravityWebSearchModelFor(modelID string) string {
|
||||
modelID = normalizeAntigravityCapabilityModelID(modelID)
|
||||
if modelID == "" {
|
||||
return ""
|
||||
}
|
||||
for _, model := range GetGlobalRegistry().GetAvailableModelsByProvider("antigravity") {
|
||||
if model == nil {
|
||||
continue
|
||||
}
|
||||
currentModelID := normalizeAntigravityCapabilityModelID(model.ID)
|
||||
if currentModelID == "" {
|
||||
continue
|
||||
}
|
||||
if currentModelID == modelID {
|
||||
if model.SupportsWebSearch {
|
||||
return currentModelID
|
||||
}
|
||||
return ""
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// GetXAIModels returns the standard xAI Grok model definitions.
|
||||
func GetXAIModels() []*ModelInfo {
|
||||
return WithXAIBuiltins(cloneModelInfos(getModels().XAI))
|
||||
}
|
||||
|
||||
// WithCodexBuiltins injects hard-coded Codex-only model definitions that should
|
||||
// not depend on remote models.json updates. Built-ins replace any matching IDs
|
||||
// already present in the provided slice.
|
||||
func WithCodexBuiltins(models []*ModelInfo) []*ModelInfo {
|
||||
return upsertModelInfos(models, codexBuiltinImage15ModelInfo(), codexBuiltinImageModelInfo())
|
||||
}
|
||||
|
||||
// WithXAIBuiltins injects hard-coded xAI image/video model definitions that should
|
||||
// not depend on remote models.json updates.
|
||||
func WithXAIBuiltins(models []*ModelInfo) []*ModelInfo {
|
||||
return upsertModelInfos(models, xaiBuiltinImageModelInfo(), xaiBuiltinImageQualityModelInfo(), xaiBuiltinImage20ModelInfo(), xaiBuiltinVideoModelInfo(), xaiBuiltinVideo15ModelInfo(), xaiBuiltinVideo15PreviewModelInfo())
|
||||
}
|
||||
|
||||
func normalizeAntigravityCapabilityModelID(modelID string) string {
|
||||
modelID = strings.ToLower(strings.TrimSpace(modelID))
|
||||
if open := strings.LastIndex(modelID, "("); open >= 0 && strings.HasSuffix(modelID, ")") {
|
||||
modelID = strings.TrimSpace(modelID[:open])
|
||||
}
|
||||
return modelID
|
||||
}
|
||||
|
||||
func codexBuiltinImage15ModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: codexBuiltinImage15ModelID,
|
||||
Object: "model",
|
||||
Created: 1704067200, // 2024-01-01
|
||||
OwnedBy: "openai",
|
||||
Type: "openai",
|
||||
DisplayName: "GPT Image 1.5",
|
||||
Version: codexBuiltinImage15ModelID,
|
||||
}
|
||||
}
|
||||
|
||||
func codexBuiltinImageModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: codexBuiltinImageModelID,
|
||||
Object: "model",
|
||||
Created: 1704067200, // 2024-01-01
|
||||
OwnedBy: "openai",
|
||||
Type: "openai",
|
||||
DisplayName: "GPT Image 2",
|
||||
Version: codexBuiltinImageModelID,
|
||||
}
|
||||
}
|
||||
|
||||
func xaiBuiltinImageModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: xaiBuiltinImageModelID,
|
||||
Object: "model",
|
||||
Created: 1735689600, // 2025-01-01
|
||||
OwnedBy: "xai",
|
||||
Type: "xai",
|
||||
DisplayName: "Grok Imagine Image",
|
||||
Name: xaiBuiltinImageModelID,
|
||||
Description: "xAI Grok image generation model.",
|
||||
}
|
||||
}
|
||||
|
||||
func xaiBuiltinImageQualityModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: xaiBuiltinImageQualityModelID,
|
||||
Object: "model",
|
||||
Created: 1735689600, // 2025-01-01
|
||||
OwnedBy: "xai",
|
||||
Type: "xai",
|
||||
DisplayName: "Grok Imagine Image Quality",
|
||||
Name: xaiBuiltinImageQualityModelID,
|
||||
Description: "xAI Grok higher-fidelity image generation model.",
|
||||
}
|
||||
}
|
||||
|
||||
func xaiBuiltinImage20ModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: xaiBuiltinImage20ModelID,
|
||||
Object: "model",
|
||||
Created: 1786060800, // 2026-08-07
|
||||
OwnedBy: "xai",
|
||||
Type: "xai",
|
||||
DisplayName: "Grok Imagine Image 2.0",
|
||||
Name: xaiBuiltinImage20ModelID,
|
||||
Description: "xAI Grok image generation model.",
|
||||
}
|
||||
}
|
||||
|
||||
func xaiBuiltinVideoModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: xaiBuiltinVideoModelID,
|
||||
Object: "model",
|
||||
Created: 1735689600, // 2025-01-01
|
||||
OwnedBy: "xai",
|
||||
Type: "xai",
|
||||
DisplayName: "Grok Imagine Video",
|
||||
Name: xaiBuiltinVideoModelID,
|
||||
Description: "xAI Grok video generation model.",
|
||||
}
|
||||
}
|
||||
|
||||
func xaiBuiltinVideo15ModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: xaiBuiltinVideo15ModelID,
|
||||
Object: "model",
|
||||
Created: 1735689600, // 2025-01-01
|
||||
OwnedBy: "xai",
|
||||
Type: "xai",
|
||||
DisplayName: "Grok Imagine Video 1.5",
|
||||
Name: xaiBuiltinVideo15ModelID,
|
||||
Description: "xAI Grok video generation model.",
|
||||
}
|
||||
}
|
||||
|
||||
func xaiBuiltinVideo15PreviewModelInfo() *ModelInfo {
|
||||
return &ModelInfo{
|
||||
ID: xaiBuiltinVideo15PreviewID,
|
||||
Object: "model",
|
||||
Created: 1735689600, // 2025-01-01
|
||||
OwnedBy: "xai",
|
||||
Type: "xai",
|
||||
DisplayName: "Grok Imagine Video 1.5 Preview",
|
||||
Name: xaiBuiltinVideo15PreviewID,
|
||||
Description: "Compatibility alias for the xAI Grok video generation model.",
|
||||
}
|
||||
}
|
||||
|
||||
func upsertModelInfos(models []*ModelInfo, extras ...*ModelInfo) []*ModelInfo {
|
||||
if len(extras) == 0 {
|
||||
return models
|
||||
}
|
||||
|
||||
extraIDs := make(map[string]struct{}, len(extras))
|
||||
extraList := make([]*ModelInfo, 0, len(extras))
|
||||
for _, extra := range extras {
|
||||
if extra == nil {
|
||||
continue
|
||||
}
|
||||
id := strings.TrimSpace(extra.ID)
|
||||
if id == "" {
|
||||
continue
|
||||
}
|
||||
key := strings.ToLower(id)
|
||||
if _, exists := extraIDs[key]; exists {
|
||||
continue
|
||||
}
|
||||
extraIDs[key] = struct{}{}
|
||||
extraList = append(extraList, cloneModelInfo(extra))
|
||||
}
|
||||
|
||||
if len(extraList) == 0 {
|
||||
return models
|
||||
}
|
||||
|
||||
filtered := make([]*ModelInfo, 0, len(models)+len(extraList))
|
||||
for _, model := range models {
|
||||
if model == nil {
|
||||
continue
|
||||
}
|
||||
id := strings.TrimSpace(model.ID)
|
||||
if id == "" {
|
||||
continue
|
||||
}
|
||||
if _, exists := extraIDs[strings.ToLower(id)]; exists {
|
||||
continue
|
||||
}
|
||||
filtered = append(filtered, model)
|
||||
}
|
||||
|
||||
filtered = append(filtered, extraList...)
|
||||
return filtered
|
||||
}
|
||||
|
||||
// cloneModelInfos returns a shallow copy of the slice with each element deep-cloned.
|
||||
func cloneModelInfos(models []*ModelInfo) []*ModelInfo {
|
||||
if len(models) == 0 {
|
||||
return nil
|
||||
}
|
||||
out := make([]*ModelInfo, len(models))
|
||||
for i, m := range models {
|
||||
out[i] = cloneModelInfo(m)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// GetStaticModelDefinitionsByChannel returns static model definitions for a given channel/provider.
|
||||
// It returns nil when the channel is unknown.
|
||||
//
|
||||
// Supported channels:
|
||||
// - claude
|
||||
// - gemini
|
||||
// - gemini-interactions
|
||||
// - vertex
|
||||
// - aistudio
|
||||
// - codex
|
||||
// - kimi
|
||||
// - antigravity
|
||||
// - xai
|
||||
func GetStaticModelDefinitionsByChannel(channel string) []*ModelInfo {
|
||||
key := strings.ToLower(strings.TrimSpace(channel))
|
||||
switch key {
|
||||
case "claude":
|
||||
return GetClaudeModels()
|
||||
case "gemini":
|
||||
return GetGeminiModels()
|
||||
case "gemini-interactions":
|
||||
return GetGeminiModels()
|
||||
case "vertex":
|
||||
return GetGeminiVertexModels()
|
||||
case "aistudio":
|
||||
return GetAIStudioModels()
|
||||
case "codex":
|
||||
return GetCodexProModels()
|
||||
case "kimi":
|
||||
return GetKimiModels()
|
||||
case "antigravity":
|
||||
return GetAntigravityModels()
|
||||
case "xai", "x-ai", "grok":
|
||||
return GetXAIModels()
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// LookupStaticModelInfo searches all static model definitions for a model by ID.
|
||||
// Returns nil if no matching model is found.
|
||||
func LookupStaticModelInfo(modelID string) *ModelInfo {
|
||||
if modelID == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
data := getModels()
|
||||
allModels := [][]*ModelInfo{
|
||||
data.Claude,
|
||||
data.Gemini,
|
||||
data.Vertex,
|
||||
data.AIStudio,
|
||||
data.CodexPro,
|
||||
data.Kimi,
|
||||
data.Antigravity,
|
||||
data.XAI,
|
||||
}
|
||||
for _, models := range allModels {
|
||||
for _, m := range models {
|
||||
if m != nil && m.ID == modelID {
|
||||
return cloneModelInfo(m)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Loading…
Reference in a new issue