summaryrefslogtreecommitdiff
path: root/internal/llm/provider.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/llm/provider.go')
-rw-r--r--internal/llm/provider.go39
1 files changed, 33 insertions, 6 deletions
diff --git a/internal/llm/provider.go b/internal/llm/provider.go
index a87d815..f7dad31 100644
--- a/internal/llm/provider.go
+++ b/internal/llm/provider.go
@@ -3,7 +3,8 @@ package llm
import (
"context"
"errors"
- "os"
+ "os"
+ "strings"
)
// Message represents a chat-style prompt message.
@@ -17,6 +18,10 @@ type Message struct {
type Client interface {
// Chat sends chat messages and returns the assistant text.
Chat(ctx context.Context, messages []Message, opts ...RequestOption) (string, error)
+ // Name returns the provider's short name (e.g., "openai", "ollama").
+ Name() string
+ // DefaultModel returns the configured default model name.
+ DefaultModel() string
}
// Options for a request. Providers may ignore unsupported fields.
@@ -38,11 +43,33 @@ func WithStop(stop ...string) RequestOption {
}
// NewDefault returns the default provider using environment configuration.
-// Currently this is the OpenAI provider using OPENAI_API_KEY.
+// Selection order:
+// 1) HEXAI_LLM_PROVIDER=openai|ollama
+// 2) If OPENAI_API_KEY is set -> OpenAI
+// 3) If any OLLAMA_* vars are set -> Ollama
func NewDefault() (Client, error) {
- apiKey := os.Getenv("OPENAI_API_KEY")
- if apiKey == "" {
- return nil, errors.New("OPENAI_API_KEY is not set")
+ // Explicit provider selection
+ if p := strings.ToLower(strings.TrimSpace(os.Getenv("HEXAI_LLM_PROVIDER"))); p != "" {
+ switch p {
+ case "openai":
+ apiKey := os.Getenv("OPENAI_API_KEY")
+ if apiKey == "" {
+ return nil, errors.New("OPENAI_API_KEY is not set")
+ }
+ return newOpenAIFromEnv(apiKey), nil
+ case "ollama":
+ return newOllamaFromEnv(), nil
+ default:
+ return nil, errors.New("unknown HEXAI_LLM_PROVIDER: " + p)
+ }
}
- return newOpenAIFromEnv(apiKey), nil
+
+ // Auto-detect
+ if apiKey := os.Getenv("OPENAI_API_KEY"); apiKey != "" {
+ return newOpenAIFromEnv(apiKey), nil
+ }
+ if os.Getenv("OLLAMA_BASE_URL") != "" || os.Getenv("OLLAMA_HOST") != "" || os.Getenv("OLLAMA_MODEL") != "" {
+ return newOllamaFromEnv(), nil
+ }
+ return nil, errors.New("no LLM provider configured (set OPENAI_API_KEY or HEXAI_LLM_PROVIDER/OLLAMA_*)")
}