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