168 lines
4.9 KiB
Go
168 lines
4.9 KiB
Go
package config
|
|
|
|
import "fmt"
|
|
|
|
type ModelFamily string
|
|
|
|
const (
|
|
FamilyQwen3 ModelFamily = "qwen3"
|
|
FamilyQwen35 ModelFamily = "qwen3.5"
|
|
FamilyLlama ModelFamily = "llama"
|
|
FamilyMistral ModelFamily = "mistral"
|
|
)
|
|
|
|
type ModelCapability int
|
|
|
|
const (
|
|
CapabilitySimple ModelCapability = iota
|
|
CapabilityMedium
|
|
CapabilityComplex
|
|
CapabilityAdvanced
|
|
)
|
|
|
|
type Model struct {
|
|
Name string `yaml:"name"`
|
|
Family ModelFamily `yaml:"family"`
|
|
DisplayName string `yaml:"display_name"`
|
|
Size string `yaml:"size"`
|
|
Parameters string `yaml:"parameters"`
|
|
ContextSize int `yaml:"context_size"`
|
|
Capability ModelCapability `yaml:"capability"`
|
|
Speed float64 `yaml:"speed"` // 1.0 = baseline
|
|
UseCases []string `yaml:"use_cases"`
|
|
Description string `yaml:"description"`
|
|
Default bool `yaml:"default,omitempty"`
|
|
}
|
|
|
|
type ModelConfig struct {
|
|
Models []Model `yaml:"models"`
|
|
DefaultModel string `yaml:"default_model"`
|
|
FallbackChain []string `yaml:"fallback_chain"`
|
|
AutoSelect bool `yaml:"auto_select"`
|
|
EmbedModel string `yaml:"embed_model,omitempty"`
|
|
}
|
|
|
|
func DefaultModels() []Model {
|
|
return []Model{
|
|
{
|
|
Name: "qwen3.5:0.8b",
|
|
Family: FamilyQwen35,
|
|
DisplayName: "Qwen 3.5 0.8B",
|
|
Size: "0.8B",
|
|
Parameters: "0.8 billion",
|
|
ContextSize: 262144,
|
|
Capability: CapabilitySimple,
|
|
Speed: 4.0,
|
|
UseCases: []string{"quick_answers", "simple_tools", "single_file_edits"},
|
|
Description: "Fast, lightweight model for simple tasks and quick answers",
|
|
Default: false,
|
|
},
|
|
{
|
|
Name: "qwen3.5:2b",
|
|
Family: FamilyQwen35,
|
|
DisplayName: "Qwen 3.5 2B",
|
|
Size: "2B",
|
|
Parameters: "2 billion",
|
|
ContextSize: 262144,
|
|
Capability: CapabilityMedium,
|
|
Speed: 2.5,
|
|
UseCases: []string{"code_completion", "simple_refactoring", "explanations"},
|
|
Description: "Balanced model for medium complexity tasks",
|
|
Default: true,
|
|
},
|
|
{
|
|
Name: "qwen3.5:4b",
|
|
Family: FamilyQwen35,
|
|
DisplayName: "Qwen 3.5 4B",
|
|
Size: "4B",
|
|
Parameters: "4 billion",
|
|
ContextSize: 262144,
|
|
Capability: CapabilityComplex,
|
|
Speed: 1.5,
|
|
UseCases: []string{"multi_step_reasoning", "code_review", "debugging", "refactoring"},
|
|
Description: "Capable model for complex reasoning and code analysis",
|
|
Default: false,
|
|
},
|
|
{
|
|
Name: "qwen3.5:9b",
|
|
Family: FamilyQwen35,
|
|
DisplayName: "Qwen 3.5 9B",
|
|
Size: "9B",
|
|
Parameters: "9 billion",
|
|
ContextSize: 262144,
|
|
Capability: CapabilityAdvanced,
|
|
Speed: 1.0,
|
|
UseCases: []string{"complex_reasoning", "architecture", "full_stack", "advanced_debugging"},
|
|
Description: "Full capability model for advanced tasks",
|
|
Default: false,
|
|
},
|
|
}
|
|
}
|
|
|
|
func DefaultModelConfig() ModelConfig {
|
|
models := DefaultModels()
|
|
return ModelConfig{
|
|
Models: models,
|
|
DefaultModel: "qwen3.5:2b",
|
|
FallbackChain: []string{"qwen3.5:2b", "qwen3.5:0.8b", "qwen3.5:4b", "qwen3.5:9b"},
|
|
AutoSelect: true,
|
|
EmbedModel: "nomic-embed-text",
|
|
}
|
|
}
|
|
|
|
func (m *Model) IsSimpleTask() bool {
|
|
return m.Capability <= CapabilityMedium
|
|
}
|
|
|
|
func (m *Model) IsComplexTask() bool {
|
|
return m.Capability >= CapabilityComplex
|
|
}
|
|
|
|
func (mc *ModelConfig) GetModel(name string) (*Model, error) {
|
|
for _, m := range mc.Models {
|
|
if m.Name == name {
|
|
return &m, nil
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("model not found: %s", name)
|
|
}
|
|
|
|
func (mc *ModelConfig) GetDefaultModel() *Model {
|
|
for _, m := range mc.Models {
|
|
if m.Default {
|
|
return &m
|
|
}
|
|
}
|
|
if len(mc.Models) > 0 {
|
|
return &mc.Models[len(mc.Models)-1]
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (mc *ModelConfig) SelectModelForTask(taskComplexity string) string {
|
|
if !mc.AutoSelect {
|
|
return mc.DefaultModel
|
|
}
|
|
|
|
switch taskComplexity {
|
|
case "simple":
|
|
return mc.Models[0].Name
|
|
case "medium":
|
|
for _, m := range mc.Models {
|
|
if m.Capability == CapabilityMedium {
|
|
return m.Name
|
|
}
|
|
}
|
|
case "complex":
|
|
for _, m := range mc.Models {
|
|
if m.Capability == CapabilityComplex {
|
|
return m.Name
|
|
}
|
|
}
|
|
case "advanced":
|
|
return mc.DefaultModel
|
|
}
|
|
|
|
return mc.DefaultModel
|
|
}
|