2.5 KB
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
	}
}
← Back