package llmapi import ( "gralias/config" "gralias/models" "log/slog" ) type OpenRouterResp struct { ID string `json:"id"` Provider string `json:"provider"` Model string `json:"model"` Object string `json:"object"` Created int `json:"created"` Choices []struct { Logprobs any `json:"logprobs"` FinishReason string `json:"finish_reason"` NativeFinishReason string `json:"native_finish_reason"` Index int `json:"index"` Message struct { Role string `json:"role"` Content string `json:"content"` Refusal any `json:"refusal"` Reasoning any `json:"reasoning"` } `json:"message"` } `json:"choices"` Usage struct { PromptTokens int `json:"prompt_tokens"` CompletionTokens int `json:"completion_tokens"` TotalTokens int `json:"total_tokens"` } `json:"usage"` } type DSResp struct { ID string `json:"id"` Choices []struct { Text string `json:"text"` Index int `json:"index"` FinishReason string `json:"finish_reason"` } `json:"choices"` Created int `json:"created"` Model string `json:"model"` SystemFingerprint string `json:"system_fingerprint"` Object string `json:"object"` } type LLMResp struct { Index int `json:"index"` Content string `json:"content"` Tokens []any `json:"tokens"` IDSlot int `json:"id_slot"` Stop bool `json:"stop"` Model string `json:"model"` TokensPredicted int `json:"tokens_predicted"` TokensEvaluated int `json:"tokens_evaluated"` Prompt string `json:"prompt"` HasNewLine bool `json:"has_new_line"` Truncated bool `json:"truncated"` StopType string `json:"stop_type"` StoppingWord string `json:"stopping_word"` TokensCached int `json:"tokens_cached"` } type MimeResp struct { Clue string `json:"clue"` Number string `json:"number"` Answer []string `json:"words_I_mean_my_team_to_open"` } type GusserResp struct { Guesses []string `json:"guesses"` CouldBe []string `json:"could_be"` } type Bot struct { Role string `json:"role"` Team string `json:"team"` cfg *config.Config `json:"-"` RoomID string `json:"room_id"` // can we get a room from here? BotName string `json:"bot_name"` log *slog.Logger `json:"-"` LLMParser RespParser `json:"-"` // channels for communicaton // channels are not serializable // SignalsCh chan bool // DoneCh chan bool } func (b *Bot) ToPlayer() *models.Player { return &models.Player{ Role: models.StrToUserRole(b.Role), Team: models.StrToUserTeam(b.Team), RoomID: &b.RoomID, Username: b.BotName, IsBot: true, } } 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 }