Feat: openrouter fetch/update free model list
This commit is contained in:
		
							
								
								
									
										64
									
								
								llmapi/or.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								llmapi/or.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| package llmapi | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"log/slog" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	ormodelsLink = "https://openrouter.ai/api/v1/models" | ||||
| 	ORFreeModels = []string{ | ||||
| 		"google/gemini-2.0-flash-exp:free", | ||||
| 		"deepseek/deepseek-chat-v3-0324:free", | ||||
| 		"mistralai/mistral-small-3.2-24b-instruct:free", | ||||
| 		"qwen/qwen3-14b:free", | ||||
| 		"google/gemma-3-27b-it:free", | ||||
| 		"meta-llama/llama-3.3-70b-instruct:free", | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func ListORModels() ([]string, error) { | ||||
| 	resp, err := http.Get(ormodelsLink) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
| 	if resp.StatusCode != 200 { | ||||
| 		err := fmt.Errorf("failed to fetch or models; status: %s", resp.Status) | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	data := &ORModels{} | ||||
| 	if err := json.NewDecoder(resp.Body).Decode(data); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	freeModels := data.ListFree() | ||||
| 	return freeModels, nil | ||||
| } | ||||
|  | ||||
| func ORModelListUpdateTicker(ctx context.Context) { | ||||
| 	ticker := time.NewTicker(time.Hour * 2) | ||||
| 	freeModels, err := ListORModels() | ||||
| 	slog.Info("updated free models list", "list", freeModels) | ||||
| 	if err != nil { | ||||
| 		slog.Error("failed to update free models list", "list", freeModels) | ||||
| 	} | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-ctx.Done(): | ||||
| 			return | ||||
| 		case <-ticker.C: | ||||
| 			freeModels, err := ListORModels() | ||||
| 			slog.Info("updated free models list", "list", freeModels) | ||||
| 			if err != nil { | ||||
| 				slog.Error("failed to update free models list", "list", freeModels) | ||||
| 				// log | ||||
| 				continue | ||||
| 			} | ||||
| 			ORFreeModels = freeModels | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder