ai.go
package assist
import (
"fmt"
"log"
"github.com/readysite/readysite/pkg/assistant"
"github.com/readysite/readysite/pkg/assistant/providers/anthropic"
"github.com/readysite/readysite/pkg/assistant/providers/mock"
"github.com/readysite/readysite/pkg/assistant/providers/openai"
"github.com/readysite/readysite/website/internal/helpers"
"github.com/readysite/readysite/website/models"
)
// GetAssistant returns an AI assistant based on settings.
func GetAssistant() (*assistant.Assistant, error) {
provider := helpers.GetSetting(models.SettingAIProvider)
apiKey := helpers.GetSetting(models.SettingAIAPIKey)
log.Printf("[ASSIST] GetAssistant: provider=%s hasKey=%v", provider, apiKey != "")
switch provider {
case "anthropic":
if apiKey == "" {
return nil, fmt.Errorf("Anthropic API key not configured. Please add your API key in Settings.")
}
ai, err := anthropic.New(apiKey)
if err != nil {
return nil, fmt.Errorf("Failed to initialize Anthropic: %v", err)
}
return ai, nil
case "openai":
if apiKey == "" {
return nil, fmt.Errorf("OpenAI API key not configured. Please add your API key in Settings.")
}
ai, err := openai.New(apiKey)
if err != nil {
return nil, fmt.Errorf("Failed to initialize OpenAI: %v", err)
}
return ai, nil
case "mock":
return mock.New(mock.Config{
Response: "This is a mock response. Configure a real AI provider (Anthropic) in Settings to enable AI features.",
}), nil
default:
return nil, fmt.Errorf("No AI provider configured. Please set up an AI provider in Settings.")
}
}
// GetModel returns the configured AI model.
func GetModel() string {
model := helpers.GetSetting(models.SettingAIModel)
if model == "" {
provider := helpers.GetSetting(models.SettingAIProvider)
switch provider {
case "anthropic":
return "claude-sonnet-4-5-20250929"
case "openai":
return "gpt-4o"
default:
return "mock"
}
}
return model
}
// IsConfigured returns true if AI is properly configured with a valid API key.
func IsConfigured() bool {
provider := helpers.GetSetting(models.SettingAIProvider)
apiKey := helpers.GetSetting(models.SettingAIAPIKey)
return provider != "" && provider != "mock" && apiKey != ""
}
// GetProviderName returns a human-readable name for the current AI provider.
func GetProviderName() string {
provider := helpers.GetSetting(models.SettingAIProvider)
if provider == "" {
return "Not configured"
}
switch provider {
case "anthropic":
return "Anthropic (Claude)"
case "openai":
return "OpenAI"
case "mock":
return "Mock (Testing)"
default:
return provider
}
}