// config.go – Konfiguration, Clients und gemeinsame Verbindungen package config import ( "fmt" "log" "os" openai "github.com/sashabaranov/go-openai" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "gopkg.in/yaml.v3" ) type Config struct { Qdrant struct { Host string `yaml:"host"` Port string `yaml:"port"` APIKey string `yaml:"api_key"` Collection string `yaml:"collection"` } `yaml:"qdrant"` Embedding struct { URL string `yaml:"url"` Model string `yaml:"model"` Dimensions uint64 `yaml:"dimensions"` } `yaml:"embedding"` Chat struct { URL string `yaml:"url"` Model string `yaml:"model"` } `yaml:"chat"` Discord struct { Token string `yaml:"token"` GuildID string `yaml:"guild_id"` } `yaml:"discord"` BrainRoot string `yaml:"brain_root"` TopK uint64 `yaml:"top_k"` ScoreThreshold float32 `yaml:"score_threshold"` } var Cfg Config // NewQdrantConn öffnet eine gRPC-Verbindung zur Qdrant-Instanz. // Der Aufrufer ist verantwortlich für conn.Close(). func NewQdrantConn() *grpc.ClientConn { conn, err := grpc.Dial( fmt.Sprintf("%s:%s", Cfg.Qdrant.Host, Cfg.Qdrant.Port), grpc.WithTransportCredentials(insecure.NewCredentials()), ) if err != nil { log.Fatalf("❌ Qdrant Verbindung fehlgeschlagen: %v", err) } return conn } // NewEmbeddingClient erstellt einen Client für LocalAI (Embeddings). func NewEmbeddingClient() *openai.Client { c := openai.DefaultConfig("localai") c.BaseURL = Cfg.Embedding.URL return openai.NewClientWithConfig(c) } // NewChatClient erstellt einen Client für Chat-Completion (LocalAI). func NewChatClient() *openai.Client { c := openai.DefaultConfig("localai") c.BaseURL = Cfg.Chat.URL return openai.NewClientWithConfig(c) } // LoadConfig liest config.yml aus dem aktuellen Verzeichnis. func LoadConfig() { data, err := os.ReadFile("config.yml") if err != nil { log.Fatalf("❌ config.yml nicht gefunden: %v\n Lege config.yml im selben Verzeichnis an.", err) } if err := yaml.Unmarshal(data, &Cfg); err != nil { log.Fatalf("❌ config.yml ungültig: %v", err) } }