package main import ( "encoding/json" "fmt" "net/http" ) 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", } ) type ORModel struct { ID string `json:"id"` CanonicalSlug string `json:"canonical_slug"` HuggingFaceID string `json:"hugging_face_id"` Name string `json:"name"` Created int `json:"created"` Description string `json:"description"` ContextLength int `json:"context_length"` Architecture struct { Modality string `json:"modality"` InputModalities []string `json:"input_modalities"` OutputModalities []string `json:"output_modalities"` Tokenizer string `json:"tokenizer"` InstructType any `json:"instruct_type"` } `json:"architecture"` Pricing struct { Prompt string `json:"prompt"` Completion string `json:"completion"` Request string `json:"request"` Image string `json:"image"` Audio string `json:"audio"` WebSearch string `json:"web_search"` InternalReasoning string `json:"internal_reasoning"` } `json:"pricing,omitempty"` TopProvider struct { ContextLength int `json:"context_length"` MaxCompletionTokens int `json:"max_completion_tokens"` IsModerated bool `json:"is_moderated"` } `json:"top_provider"` PerRequestLimits any `json:"per_request_limits"` SupportedParameters []string `json:"supported_parameters"` } // https://openrouter.ai/api/v1/models type ORModels struct { Data []ORModel `json:"data"` } func (orm *ORModels) ListFree() []string { resp := []string{} for _, model := range orm.Data { if model.Pricing.Prompt == "0" && model.Pricing.Request == "0" && model.Pricing.Completion == "0" { resp = append(resp, model.ID) } } return resp } 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 }