@@ -6,7 +6,10 @@ import (
66 "fmt"
77 "os"
88
9- "github.com/Siddhant-K-code/distill/pkg/embedding/openai"
9+ "github.com/Siddhant-K-code/distill/pkg/embedding"
10+ _ "github.com/Siddhant-K-code/distill/pkg/embedding/cohere"
11+ _ "github.com/Siddhant-K-code/distill/pkg/embedding/ollama"
12+ _ "github.com/Siddhant-K-code/distill/pkg/embedding/openai"
1013 "github.com/Siddhant-K-code/distill/pkg/memory"
1114 "github.com/spf13/cobra"
1215 "github.com/spf13/viper"
@@ -67,15 +70,17 @@ func init() {
6770 memoryStoreCmd .Flags ().String ("source" , "" , "Source of the memory (e.g., code_review, docs)" )
6871 memoryStoreCmd .Flags ().StringSlice ("tags" , nil , "Tags for the memory" )
6972 memoryStoreCmd .Flags ().String ("session-id" , "" , "Session ID" )
70- memoryStoreCmd .Flags ().String ("openai-key" , "" , "OpenAI API key for embeddings (or OPENAI_API_KEY)" )
73+ memoryStoreCmd .Flags ().String ("openai-key" , "" , "API key for embeddings (or OPENAI_API_KEY / COHERE_API_KEY)" )
74+ memoryStoreCmd .Flags ().String ("embedding-provider" , "" , "Embedding provider (openai, ollama, cohere)" )
7175
7276 // Recall flags
7377 memoryRecallCmd .Flags ().String ("query" , "" , "Query text" )
7478 memoryRecallCmd .Flags ().StringSlice ("tags" , nil , "Filter by tags" )
7579 memoryRecallCmd .Flags ().Int ("max-results" , 10 , "Maximum results to return" )
7680 memoryRecallCmd .Flags ().Int ("max-tokens" , 0 , "Maximum token budget (0 = unlimited)" )
7781 memoryRecallCmd .Flags ().Float64 ("recency-weight" , 0.3 , "Weight for recency vs relevance (0-1)" )
78- memoryRecallCmd .Flags ().String ("openai-key" , "" , "OpenAI API key for embeddings (or OPENAI_API_KEY)" )
82+ memoryRecallCmd .Flags ().String ("openai-key" , "" , "API key for embeddings (or OPENAI_API_KEY / COHERE_API_KEY)" )
83+ memoryRecallCmd .Flags ().String ("embedding-provider" , "" , "Embedding provider (openai, ollama, cohere)" )
7984
8085 // Forget flags
8186 memoryForgetCmd .Flags ().StringSlice ("tags" , nil , "Remove memories with these tags" )
@@ -92,6 +97,47 @@ func openMemoryStore(cmd *cobra.Command) (*memory.SQLiteStore, error) {
9297 return memory .NewSQLiteStore (dbPath , cfg )
9398}
9499
100+ // createEmbedder builds an embedding.Provider from CLI flags and config.
101+ func createEmbedder (cmd * cobra.Command ) (embedding.Provider , error ) {
102+ apiKey , _ := cmd .Flags ().GetString ("openai-key" )
103+ if apiKey == "" {
104+ apiKey = os .Getenv ("OPENAI_API_KEY" )
105+ }
106+
107+ providerName , _ := cmd .Flags ().GetString ("embedding-provider" )
108+ if providerName == "" {
109+ providerName = viper .GetString ("embedding.provider" )
110+ }
111+ if providerName == "" {
112+ providerName = "openai"
113+ }
114+
115+ // Ollama doesn't need an API key
116+ needsKey := providerName == "openai" || providerName == "cohere"
117+ if needsKey && apiKey == "" {
118+ if providerName == "cohere" {
119+ apiKey = os .Getenv ("COHERE_API_KEY" )
120+ }
121+ if apiKey == "" {
122+ return nil , nil // no key available, skip embedding
123+ }
124+ }
125+
126+ model := viper .GetString ("embedding.model" )
127+ if model == "" {
128+ model = "text-embedding-3-small"
129+ }
130+ baseURL := viper .GetString ("embedding.base_url" )
131+
132+ return embedding .NewProvider (embedding.ProviderConfig {
133+ Type : embedding .ProviderType (providerName ),
134+ APIKey : apiKey ,
135+ Model : model ,
136+ BaseURL : baseURL ,
137+ CacheSize : - 1 ,
138+ })
139+ }
140+
95141func runMemoryStore (cmd * cobra.Command , args []string ) error {
96142 text , _ := cmd .Flags ().GetString ("text" )
97143 if text == "" {
@@ -101,10 +147,6 @@ func runMemoryStore(cmd *cobra.Command, args []string) error {
101147 source , _ := cmd .Flags ().GetString ("source" )
102148 tags , _ := cmd .Flags ().GetStringSlice ("tags" )
103149 sessionID , _ := cmd .Flags ().GetString ("session-id" )
104- openaiKey , _ := cmd .Flags ().GetString ("openai-key" )
105- if openaiKey == "" {
106- openaiKey = os .Getenv ("OPENAI_API_KEY" )
107- }
108150
109151 store , err := openMemoryStore (cmd )
110152 if err != nil {
@@ -118,16 +160,12 @@ func runMemoryStore(cmd *cobra.Command, args []string) error {
118160 Tags : tags ,
119161 }
120162
121- // Generate embedding if OpenAI key is available
122- if openaiKey != "" {
123- model := viper .GetString ("embedding.model" )
124- if model == "" {
125- model = "text-embedding-3-small"
126- }
127- embedder , err := openai .NewClient (openai.Config {APIKey : openaiKey , Model : model })
128- if err != nil {
129- return fmt .Errorf ("create embedder: %w" , err )
130- }
163+ // Generate embedding if a provider is available
164+ embedder , err := createEmbedder (cmd )
165+ if err != nil {
166+ return fmt .Errorf ("create embedder: %w" , err )
167+ }
168+ if embedder != nil {
131169 emb , err := embedder .Embed (context .Background (), text )
132170 if err != nil {
133171 return fmt .Errorf ("embed text: %w" , err )
@@ -158,10 +196,6 @@ func runMemoryRecall(cmd *cobra.Command, args []string) error {
158196 maxResults , _ := cmd .Flags ().GetInt ("max-results" )
159197 maxTokens , _ := cmd .Flags ().GetInt ("max-tokens" )
160198 recencyWeight , _ := cmd .Flags ().GetFloat64 ("recency-weight" )
161- openaiKey , _ := cmd .Flags ().GetString ("openai-key" )
162- if openaiKey == "" {
163- openaiKey = os .Getenv ("OPENAI_API_KEY" )
164- }
165199
166200 store , err := openMemoryStore (cmd )
167201 if err != nil {
@@ -177,16 +211,12 @@ func runMemoryRecall(cmd *cobra.Command, args []string) error {
177211 RecencyWeight : recencyWeight ,
178212 }
179213
180- // Generate query embedding if OpenAI key is available
181- if openaiKey != "" {
182- model := viper .GetString ("embedding.model" )
183- if model == "" {
184- model = "text-embedding-3-small"
185- }
186- embedder , err := openai .NewClient (openai.Config {APIKey : openaiKey , Model : model })
187- if err != nil {
188- return fmt .Errorf ("create embedder: %w" , err )
189- }
214+ // Generate query embedding if a provider is available
215+ embedder , err := createEmbedder (cmd )
216+ if err != nil {
217+ return fmt .Errorf ("create embedder: %w" , err )
218+ }
219+ if embedder != nil {
190220 emb , err := embedder .Embed (context .Background (), query )
191221 if err != nil {
192222 return fmt .Errorf ("embed query: %w" , err )
0 commit comments