summaryrefslogtreecommitdiffhomepage
path: root/internal/llm/models
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-21 19:59:35 +0200
committerGitHub <[email protected]>2025-04-21 19:59:35 +0200
commitf33dff87725764af0b675b5e5b2e011b21c14c90 (patch)
tree4fe2c022305f13775f2cab3cdd80cd808259765b /internal/llm/models
parent6b1c64bcc75b89c530294b6a2d4404682b435d56 (diff)
parent3a6a26981a8074b6ab0eaadb520db986e04799ff (diff)
downloadopencode-f33dff87725764af0b675b5e5b2e011b21c14c90.tar.gz
opencode-f33dff87725764af0b675b5e5b2e011b21c14c90.zip
Merge pull request #27 from kujtimiihoxha/opencode
OpenCode - Initial Implementation
Diffstat (limited to 'internal/llm/models')
-rw-r--r--internal/llm/models/anthropic.go77
-rw-r--r--internal/llm/models/gemini.go63
-rw-r--r--internal/llm/models/models.go151
-rw-r--r--internal/llm/models/openai.go169
4 files changed, 363 insertions, 97 deletions
diff --git a/internal/llm/models/anthropic.go b/internal/llm/models/anthropic.go
new file mode 100644
index 000000000..87e9b4c89
--- /dev/null
+++ b/internal/llm/models/anthropic.go
@@ -0,0 +1,77 @@
+package models
+
+const (
+ ProviderAnthropic ModelProvider = "anthropic"
+
+ // Models
+ Claude35Sonnet ModelID = "claude-3.5-sonnet"
+ Claude3Haiku ModelID = "claude-3-haiku"
+ Claude37Sonnet ModelID = "claude-3.7-sonnet"
+ Claude35Haiku ModelID = "claude-3.5-haiku"
+ Claude3Opus ModelID = "claude-3-opus"
+)
+
+var AnthropicModels = map[ModelID]Model{
+ // Anthropic
+ Claude35Sonnet: {
+ ID: Claude35Sonnet,
+ Name: "Claude 3.5 Sonnet",
+ Provider: ProviderAnthropic,
+ APIModel: "claude-3-5-sonnet-latest",
+ CostPer1MIn: 3.0,
+ CostPer1MInCached: 3.75,
+ CostPer1MOutCached: 0.30,
+ CostPer1MOut: 15.0,
+ ContextWindow: 200000,
+ DefaultMaxTokens: 5000,
+ },
+ Claude3Haiku: {
+ ID: Claude3Haiku,
+ Name: "Claude 3 Haiku",
+ Provider: ProviderAnthropic,
+ APIModel: "claude-3-haiku-latest",
+ CostPer1MIn: 0.25,
+ CostPer1MInCached: 0.30,
+ CostPer1MOutCached: 0.03,
+ CostPer1MOut: 1.25,
+ ContextWindow: 200000,
+ DefaultMaxTokens: 5000,
+ },
+ Claude37Sonnet: {
+ ID: Claude37Sonnet,
+ Name: "Claude 3.7 Sonnet",
+ Provider: ProviderAnthropic,
+ APIModel: "claude-3-7-sonnet-latest",
+ CostPer1MIn: 3.0,
+ CostPer1MInCached: 3.75,
+ CostPer1MOutCached: 0.30,
+ CostPer1MOut: 15.0,
+ ContextWindow: 200000,
+ DefaultMaxTokens: 50000,
+ CanReason: true,
+ },
+ Claude35Haiku: {
+ ID: Claude35Haiku,
+ Name: "Claude 3.5 Haiku",
+ Provider: ProviderAnthropic,
+ APIModel: "claude-3-5-haiku-latest",
+ CostPer1MIn: 0.80,
+ CostPer1MInCached: 1.0,
+ CostPer1MOutCached: 0.08,
+ CostPer1MOut: 4.0,
+ ContextWindow: 200000,
+ DefaultMaxTokens: 4096,
+ },
+ Claude3Opus: {
+ ID: Claude3Opus,
+ Name: "Claude 3 Opus",
+ Provider: ProviderAnthropic,
+ APIModel: "claude-3-opus-latest",
+ CostPer1MIn: 15.0,
+ CostPer1MInCached: 18.75,
+ CostPer1MOutCached: 1.50,
+ CostPer1MOut: 75.0,
+ ContextWindow: 200000,
+ DefaultMaxTokens: 4096,
+ },
+}
diff --git a/internal/llm/models/gemini.go b/internal/llm/models/gemini.go
new file mode 100644
index 000000000..00bf7387f
--- /dev/null
+++ b/internal/llm/models/gemini.go
@@ -0,0 +1,63 @@
+package models
+
+const (
+ ProviderGemini ModelProvider = "gemini"
+
+ // Models
+ Gemini25Flash ModelID = "gemini-2.5-flash"
+ Gemini25 ModelID = "gemini-2.5"
+ Gemini20Flash ModelID = "gemini-2.0-flash"
+ Gemini20FlashLite ModelID = "gemini-2.0-flash-lite"
+)
+
+var GeminiModels = map[ModelID]Model{
+ Gemini25Flash: {
+ ID: Gemini25Flash,
+ Name: "Gemini 2.5 Flash",
+ Provider: ProviderGemini,
+ APIModel: "gemini-2.5-flash-preview-04-17",
+ CostPer1MIn: 0.15,
+ CostPer1MInCached: 0,
+ CostPer1MOutCached: 0,
+ CostPer1MOut: 0.60,
+ ContextWindow: 1000000,
+ DefaultMaxTokens: 50000,
+ },
+ Gemini25: {
+ ID: Gemini25,
+ Name: "Gemini 2.5 Pro",
+ Provider: ProviderGemini,
+ APIModel: "gemini-2.5-pro-preview-03-25",
+ CostPer1MIn: 1.25,
+ CostPer1MInCached: 0,
+ CostPer1MOutCached: 0,
+ CostPer1MOut: 10,
+ ContextWindow: 1000000,
+ DefaultMaxTokens: 50000,
+ },
+
+ Gemini20Flash: {
+ ID: Gemini20Flash,
+ Name: "Gemini 2.0 Flash",
+ Provider: ProviderGemini,
+ APIModel: "gemini-2.0-flash",
+ CostPer1MIn: 0.10,
+ CostPer1MInCached: 0,
+ CostPer1MOutCached: 0,
+ CostPer1MOut: 0.40,
+ ContextWindow: 1000000,
+ DefaultMaxTokens: 6000,
+ },
+ Gemini20FlashLite: {
+ ID: Gemini20FlashLite,
+ Name: "Gemini 2.0 Flash Lite",
+ Provider: ProviderGemini,
+ APIModel: "gemini-2.0-flash-lite",
+ CostPer1MIn: 0.05,
+ CostPer1MInCached: 0,
+ CostPer1MOutCached: 0,
+ CostPer1MOut: 0.30,
+ ContextWindow: 1000000,
+ DefaultMaxTokens: 6000,
+ },
+}
diff --git a/internal/llm/models/models.go b/internal/llm/models/models.go
index 140693237..cccbd2765 100644
--- a/internal/llm/models/models.go
+++ b/internal/llm/models/models.go
@@ -1,5 +1,7 @@
package models
+import "maps"
+
type (
ModelID string
ModelProvider string
@@ -14,21 +16,13 @@ type Model struct {
CostPer1MOut float64 `json:"cost_per_1m_out"`
CostPer1MInCached float64 `json:"cost_per_1m_in_cached"`
CostPer1MOutCached float64 `json:"cost_per_1m_out_cached"`
+ ContextWindow int64 `json:"context_window"`
+ DefaultMaxTokens int64 `json:"default_max_tokens"`
+ CanReason bool `json:"can_reason"`
}
// Model IDs
-const (
- // Anthropic
- Claude35Sonnet ModelID = "claude-3.5-sonnet"
- Claude3Haiku ModelID = "claude-3-haiku"
- Claude37Sonnet ModelID = "claude-3.7-sonnet"
- // OpenAI
- GPT41 ModelID = "gpt-4.1"
-
- // GEMINI
- GEMINI25 ModelID = "gemini-2.5"
- GRMINI20Flash ModelID = "gemini-2.0-flash"
-
+const ( // GEMINI
// GROQ
QWENQwq ModelID = "qwen-qwq"
@@ -37,94 +31,51 @@ const (
)
const (
- ProviderOpenAI ModelProvider = "openai"
- ProviderAnthropic ModelProvider = "anthropic"
- ProviderBedrock ModelProvider = "bedrock"
- ProviderGemini ModelProvider = "gemini"
- ProviderGROQ ModelProvider = "groq"
+ ProviderBedrock ModelProvider = "bedrock"
+ ProviderGROQ ModelProvider = "groq"
+
+ // ForTests
+ ProviderMock ModelProvider = "__mock"
)
var SupportedModels = map[ModelID]Model{
- // Anthropic
- Claude35Sonnet: {
- ID: Claude35Sonnet,
- Name: "Claude 3.5 Sonnet",
- Provider: ProviderAnthropic,
- APIModel: "claude-3-5-sonnet-latest",
- CostPer1MIn: 3.0,
- CostPer1MInCached: 3.75,
- CostPer1MOutCached: 0.30,
- CostPer1MOut: 15.0,
- },
- Claude3Haiku: {
- ID: Claude3Haiku,
- Name: "Claude 3 Haiku",
- Provider: ProviderAnthropic,
- APIModel: "claude-3-haiku-latest",
- CostPer1MIn: 0.80,
- CostPer1MInCached: 1,
- CostPer1MOutCached: 0.08,
- CostPer1MOut: 4,
- },
- Claude37Sonnet: {
- ID: Claude37Sonnet,
- Name: "Claude 3.7 Sonnet",
- Provider: ProviderAnthropic,
- APIModel: "claude-3-7-sonnet-latest",
- CostPer1MIn: 3.0,
- CostPer1MInCached: 3.75,
- CostPer1MOutCached: 0.30,
- CostPer1MOut: 15.0,
- },
-
- // OpenAI
- GPT41: {
- ID: GPT41,
- Name: "GPT-4.1",
- Provider: ProviderOpenAI,
- APIModel: "gpt-4.1",
- CostPer1MIn: 2.00,
- CostPer1MInCached: 0.50,
- CostPer1MOutCached: 0,
- CostPer1MOut: 8.00,
- },
-
- // GEMINI
- GEMINI25: {
- ID: GEMINI25,
- Name: "Gemini 2.5 Pro",
- Provider: ProviderGemini,
- APIModel: "gemini-2.5-pro-exp-03-25",
- CostPer1MIn: 0,
- CostPer1MInCached: 0,
- CostPer1MOutCached: 0,
- CostPer1MOut: 0,
- },
-
- GRMINI20Flash: {
- ID: GRMINI20Flash,
- Name: "Gemini 2.0 Flash",
- Provider: ProviderGemini,
- APIModel: "gemini-2.0-flash",
- CostPer1MIn: 0.1,
- CostPer1MInCached: 0,
- CostPer1MOutCached: 0.025,
- CostPer1MOut: 0.4,
- },
-
- // GROQ
- QWENQwq: {
- ID: QWENQwq,
- Name: "Qwen Qwq",
- Provider: ProviderGROQ,
- APIModel: "qwen-qwq-32b",
- CostPer1MIn: 0,
- CostPer1MInCached: 0,
- CostPer1MOutCached: 0,
- CostPer1MOut: 0,
- },
-
- // Bedrock
+ //
+ // // GEMINI
+ // GEMINI25: {
+ // ID: GEMINI25,
+ // Name: "Gemini 2.5 Pro",
+ // Provider: ProviderGemini,
+ // APIModel: "gemini-2.5-pro-exp-03-25",
+ // CostPer1MIn: 0,
+ // CostPer1MInCached: 0,
+ // CostPer1MOutCached: 0,
+ // CostPer1MOut: 0,
+ // },
+ //
+ // GRMINI20Flash: {
+ // ID: GRMINI20Flash,
+ // Name: "Gemini 2.0 Flash",
+ // Provider: ProviderGemini,
+ // APIModel: "gemini-2.0-flash",
+ // CostPer1MIn: 0.1,
+ // CostPer1MInCached: 0,
+ // CostPer1MOutCached: 0.025,
+ // CostPer1MOut: 0.4,
+ // },
+ //
+ // // GROQ
+ // QWENQwq: {
+ // ID: QWENQwq,
+ // Name: "Qwen Qwq",
+ // Provider: ProviderGROQ,
+ // APIModel: "qwen-qwq-32b",
+ // CostPer1MIn: 0,
+ // CostPer1MInCached: 0,
+ // CostPer1MOutCached: 0,
+ // CostPer1MOut: 0,
+ // },
+ //
+ // // Bedrock
BedrockClaude37Sonnet: {
ID: BedrockClaude37Sonnet,
Name: "Bedrock: Claude 3.7 Sonnet",
@@ -136,3 +87,9 @@ var SupportedModels = map[ModelID]Model{
CostPer1MOut: 15.0,
},
}
+
+func init() {
+ maps.Copy(SupportedModels, AnthropicModels)
+ maps.Copy(SupportedModels, OpenAIModels)
+ maps.Copy(SupportedModels, GeminiModels)
+}
diff --git a/internal/llm/models/openai.go b/internal/llm/models/openai.go
new file mode 100644
index 000000000..f0cbb298c
--- /dev/null
+++ b/internal/llm/models/openai.go
@@ -0,0 +1,169 @@
+package models
+
+const (
+ ProviderOpenAI ModelProvider = "openai"
+
+ GPT41 ModelID = "gpt-4.1"
+ GPT41Mini ModelID = "gpt-4.1-mini"
+ GPT41Nano ModelID = "gpt-4.1-nano"
+ GPT45Preview ModelID = "gpt-4.5-preview"
+ GPT4o ModelID = "gpt-4o"
+ GPT4oMini ModelID = "gpt-4o-mini"
+ O1 ModelID = "o1"
+ O1Pro ModelID = "o1-pro"
+ O1Mini ModelID = "o1-mini"
+ O3 ModelID = "o3"
+ O3Mini ModelID = "o3-mini"
+ O4Mini ModelID = "o4-mini"
+)
+
+var OpenAIModels = map[ModelID]Model{
+ GPT41: {
+ ID: GPT41,
+ Name: "GPT 4.1",
+ Provider: ProviderOpenAI,
+ APIModel: "gpt-4.1",
+ CostPer1MIn: 2.00,
+ CostPer1MInCached: 0.50,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 8.00,
+ ContextWindow: 1_047_576,
+ DefaultMaxTokens: 20000,
+ },
+ GPT41Mini: {
+ ID: GPT41Mini,
+ Name: "GPT 4.1 mini",
+ Provider: ProviderOpenAI,
+ APIModel: "gpt-4.1",
+ CostPer1MIn: 0.40,
+ CostPer1MInCached: 0.10,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 1.60,
+ ContextWindow: 200_000,
+ DefaultMaxTokens: 20000,
+ },
+ GPT41Nano: {
+ ID: GPT41Nano,
+ Name: "GPT 4.1 nano",
+ Provider: ProviderOpenAI,
+ APIModel: "gpt-4.1-nano",
+ CostPer1MIn: 0.10,
+ CostPer1MInCached: 0.025,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 0.40,
+ ContextWindow: 1_047_576,
+ DefaultMaxTokens: 20000,
+ },
+ GPT45Preview: {
+ ID: GPT45Preview,
+ Name: "GPT 4.5 preview",
+ Provider: ProviderOpenAI,
+ APIModel: "gpt-4.5-preview",
+ CostPer1MIn: 75.00,
+ CostPer1MInCached: 37.50,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 150.00,
+ ContextWindow: 128_000,
+ DefaultMaxTokens: 15000,
+ },
+ GPT4o: {
+ ID: GPT4o,
+ Name: "GPT 4o",
+ Provider: ProviderOpenAI,
+ APIModel: "gpt-4o",
+ CostPer1MIn: 2.50,
+ CostPer1MInCached: 1.25,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 10.00,
+ ContextWindow: 128_000,
+ DefaultMaxTokens: 4096,
+ },
+ GPT4oMini: {
+ ID: GPT4oMini,
+ Name: "GPT 4o mini",
+ Provider: ProviderOpenAI,
+ APIModel: "gpt-4o-mini",
+ CostPer1MIn: 0.15,
+ CostPer1MInCached: 0.075,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 0.60,
+ ContextWindow: 128_000,
+ },
+ O1: {
+ ID: O1,
+ Name: "O1",
+ Provider: ProviderOpenAI,
+ APIModel: "o1",
+ CostPer1MIn: 15.00,
+ CostPer1MInCached: 7.50,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 60.00,
+ ContextWindow: 200_000,
+ DefaultMaxTokens: 50000,
+ CanReason: true,
+ },
+ O1Pro: {
+ ID: O1Pro,
+ Name: "o1 pro",
+ Provider: ProviderOpenAI,
+ APIModel: "o1-pro",
+ CostPer1MIn: 150.00,
+ CostPer1MInCached: 0.0,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 600.00,
+ ContextWindow: 200_000,
+ DefaultMaxTokens: 50000,
+ CanReason: true,
+ },
+ O1Mini: {
+ ID: O1Mini,
+ Name: "o1 mini",
+ Provider: ProviderOpenAI,
+ APIModel: "o1-mini",
+ CostPer1MIn: 1.10,
+ CostPer1MInCached: 0.55,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 4.40,
+ ContextWindow: 128_000,
+ DefaultMaxTokens: 50000,
+ CanReason: true,
+ },
+ O3: {
+ ID: O3,
+ Name: "o3",
+ Provider: ProviderOpenAI,
+ APIModel: "o3",
+ CostPer1MIn: 10.00,
+ CostPer1MInCached: 2.50,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 40.00,
+ ContextWindow: 200_000,
+ CanReason: true,
+ },
+ O3Mini: {
+ ID: O3Mini,
+ Name: "o3 mini",
+ Provider: ProviderOpenAI,
+ APIModel: "o3-mini",
+ CostPer1MIn: 1.10,
+ CostPer1MInCached: 0.55,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 4.40,
+ ContextWindow: 200_000,
+ DefaultMaxTokens: 50000,
+ CanReason: true,
+ },
+ O4Mini: {
+ ID: O4Mini,
+ Name: "o4 mini",
+ Provider: ProviderOpenAI,
+ APIModel: "o4-mini",
+ CostPer1MIn: 1.10,
+ CostPer1MInCached: 0.275,
+ CostPer1MOutCached: 0.0,
+ CostPer1MOut: 4.40,
+ ContextWindow: 128_000,
+ DefaultMaxTokens: 50000,
+ CanReason: true,
+ },
+}