Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 103 additions & 3 deletions providers/anthropic/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,99 @@ import "github.com/petal-labs/iris/core"

// Model constants for Anthropic Claude models.
const (
// Claude 4.7 series (latest)
ModelClaudeOpus47 core.ModelID = "claude-opus-4-7"

// Claude 4.6 series
ModelClaudeSonnet46 core.ModelID = "claude-sonnet-4-6"
ModelClaudeSonnet46Thinking core.ModelID = "claude-sonnet-4-6-thinking"
ModelClaudeOpus46 core.ModelID = "claude-opus-4-6"
ModelClaudeOpus46Thinking core.ModelID = "claude-opus-4-6-thinking"

// Claude 4.5 series
ModelClaudeSonnet45 core.ModelID = "claude-sonnet-4-5"
ModelClaudeHaiku45 core.ModelID = "claude-haiku-4-5"
ModelClaudeOpus45 core.ModelID = "claude-opus-4-5"
ModelClaudeSonnet45 core.ModelID = "claude-sonnet-4-5"
ModelClaudeSonnet45Thinking core.ModelID = "claude-sonnet-4-5-thinking"
ModelClaudeHaiku45 core.ModelID = "claude-haiku-4-5"
ModelClaudeOpus45 core.ModelID = "claude-opus-4-5"
ModelClaudeOpus45Thinking core.ModelID = "claude-opus-4-5-thinking"

// Claude 3.5 series (legacy)
ModelClaude35HaikuLatest core.ModelID = "claude-3-5-haiku-latest"
)

// models is the static list of supported models.
var models = []core.ModelInfo{
// Claude 4.7 series (latest)
{
ID: ModelClaudeOpus47,
DisplayName: "Claude Opus 4.7",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
// Claude 4.6 series
{
ID: ModelClaudeSonnet46,
DisplayName: "Claude Sonnet 4.6",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
ID: ModelClaudeSonnet46Thinking,
DisplayName: "Claude Sonnet 4.6 (Thinking)",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
ID: ModelClaudeOpus46,
DisplayName: "Claude Opus 4.6",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
ID: ModelClaudeOpus46Thinking,
DisplayName: "Claude Opus 4.6 (Thinking)",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
// Claude 4.5 series
{
ID: ModelClaudeSonnet45,
DisplayName: "Claude Sonnet 4.5",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
ID: ModelClaudeSonnet45Thinking,
DisplayName: "Claude Sonnet 4.5 (Thinking)",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
Expand All @@ -29,11 +107,33 @@ var models = []core.ModelInfo{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
ID: ModelClaudeOpus45,
DisplayName: "Claude Opus 4.5",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
{
ID: ModelClaudeOpus45Thinking,
DisplayName: "Claude Opus 4.5 (Thinking)",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
},
},
// Claude 3.5 series (legacy)
{
ID: ModelClaude35HaikuLatest,
DisplayName: "Claude 3.5 Haiku",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
Expand Down
2 changes: 1 addition & 1 deletion providers/anthropic/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func (p *Anthropic) Models() []core.ModelInfo {
// Supports reports whether the provider supports the given feature.
func (p *Anthropic) Supports(feature core.Feature) bool {
switch feature {
case core.FeatureChat, core.FeatureChatStreaming, core.FeatureToolCalling:
case core.FeatureChat, core.FeatureChatStreaming, core.FeatureToolCalling, core.FeatureReasoning:
return true
default:
return false
Expand Down
15 changes: 12 additions & 3 deletions providers/anthropic/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ func TestModels(t *testing.T) {
p := New("test-key")
models := p.Models()

if len(models) != 3 {
t.Errorf("Models() count = %d, want 3", len(models))
if len(models) != 11 {
t.Errorf("Models() count = %d, want 11", len(models))
}

// Verify model IDs
Expand All @@ -83,9 +83,17 @@ func TestModels(t *testing.T) {
}

expected := []core.ModelID{
ModelClaudeOpus47,
ModelClaudeSonnet46,
ModelClaudeSonnet46Thinking,
ModelClaudeOpus46,
ModelClaudeOpus46Thinking,
ModelClaudeSonnet45,
ModelClaudeSonnet45Thinking,
ModelClaudeHaiku45,
ModelClaudeOpus45,
ModelClaudeOpus45Thinking,
ModelClaude35HaikuLatest,
}

for _, id := range expected {
Expand Down Expand Up @@ -120,7 +128,7 @@ func TestSupports(t *testing.T) {
{core.FeatureChat, true},
{core.FeatureChatStreaming, true},
{core.FeatureToolCalling, true},
{core.FeatureReasoning, false},
{core.FeatureReasoning, true},
{core.FeatureBuiltInTools, false},
{core.FeatureResponseChain, false},
{core.Feature("unknown"), false},
Expand Down Expand Up @@ -203,6 +211,7 @@ func TestModelCapabilities(t *testing.T) {
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureToolCalling,
core.FeatureReasoning,
}

for _, cap := range expected {
Expand Down
50 changes: 39 additions & 11 deletions providers/gemini/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,39 @@ import "github.com/petal-labs/iris/core"

// Model constants for Google Gemini models.
const (
// Gemini 3.1 series (preview)
ModelGemini31FlashImagePreview core.ModelID = "gemini-3.1-flash-image-preview"

// Gemini 3 series (preview)
ModelGemini3Pro core.ModelID = "gemini-3-pro-preview"
ModelGemini3Flash core.ModelID = "gemini-3-flash-preview"
ModelGemini3Pro core.ModelID = "gemini-3-pro-preview"
ModelGemini3Flash core.ModelID = "gemini-3-flash-preview"
ModelGemini3ProImage core.ModelID = "gemini-3-pro-image-preview"

// Gemini 2.5 series
ModelGemini25Flash core.ModelID = "gemini-2.5-flash"
ModelGemini25FlashLite core.ModelID = "gemini-2.5-flash-lite"
ModelGemini25Pro core.ModelID = "gemini-2.5-pro"

// Gemini 2.0 series
ModelGemini20FlashLite core.ModelID = "gemini-2.0-flash-lite"

// Image generation models (Nano Banana)
ModelGemini25FlashImage core.ModelID = "gemini-2.5-flash-image" // Nano Banana - fast/efficient
ModelGemini3ProImage core.ModelID = "gemini-3-pro-image-preview" // Nano Banana Pro - professional with reasoning
ModelGemini25FlashImage core.ModelID = "gemini-2.5-flash-image"
)

// models is the static list of supported models.
var models = []core.ModelInfo{
// Gemini 3.1 series (preview)
{
ID: ModelGemini31FlashImagePreview,
DisplayName: "Gemini 3.1 Flash Image Preview",
Capabilities: []core.Feature{
core.FeatureChat,
core.FeatureChatStreaming,
core.FeatureImageGeneration,
},
},
// Gemini 3 series (preview)
{
ID: ModelGemini3Pro,
DisplayName: "Gemini 3 Pro Preview",
Expand All @@ -41,6 +58,14 @@ var models = []core.ModelInfo{
core.FeatureReasoning,
},
},
{
ID: ModelGemini3ProImage,
DisplayName: "Gemini 3 Pro Image Preview (Nano Banana Pro)",
Capabilities: []core.Feature{
core.FeatureImageGeneration,
},
},
// Gemini 2.5 series
{
ID: ModelGemini25Flash,
DisplayName: "Gemini 2.5 Flash",
Expand Down Expand Up @@ -71,17 +96,19 @@ var models = []core.ModelInfo{
core.FeatureReasoning,
},
},
// Image generation models (Nano Banana)
// Gemini 2.0 series
{
ID: ModelGemini25FlashImage,
DisplayName: "Gemini 2.5 Flash Image (Nano Banana)",
ID: ModelGemini20FlashLite,
DisplayName: "Gemini 2.0 Flash Lite",
Capabilities: []core.Feature{
core.FeatureImageGeneration,
core.FeatureChat,
core.FeatureChatStreaming,
},
},
// Image generation models (Nano Banana)
{
ID: ModelGemini3ProImage,
DisplayName: "Gemini 3 Pro Image Preview (Nano Banana Pro)",
ID: ModelGemini25FlashImage,
DisplayName: "Gemini 2.5 Flash Image (Nano Banana)",
Capabilities: []core.Feature{
core.FeatureImageGeneration,
},
Expand All @@ -107,5 +134,6 @@ func GetModelInfo(id core.ModelID) *core.ModelInfo {

// isGemini3Model returns true if the model is a Gemini 3 series model.
func isGemini3Model(model string) bool {
return model == string(ModelGemini3Pro) || model == string(ModelGemini3Flash)
return model == string(ModelGemini3Pro) || model == string(ModelGemini3Flash) ||
model == string(ModelGemini3ProImage) || model == string(ModelGemini31FlashImagePreview)
}
8 changes: 5 additions & 3 deletions providers/gemini/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ func TestModels(t *testing.T) {
p := New("test-key")
models := p.Models()

if len(models) != 7 {
t.Errorf("Models() count = %d, want 7", len(models))
if len(models) != 9 {
t.Errorf("Models() count = %d, want 9", len(models))
}

// Verify model IDs
Expand All @@ -74,13 +74,15 @@ func TestModels(t *testing.T) {
}

expected := []core.ModelID{
ModelGemini31FlashImagePreview,
ModelGemini3Pro,
ModelGemini3Flash,
ModelGemini3ProImage,
ModelGemini25Flash,
ModelGemini25FlashLite,
ModelGemini25Pro,
ModelGemini20FlashLite,
ModelGemini25FlashImage,
ModelGemini3ProImage,
}

for _, id := range expected {
Expand Down
Loading
Loading