using static AIStudio.Provider.LLMProviders;
namespace AIStudio.Tests.Models.Corpus;
///
/// The models of the corpus no rule answers for, and why each of them is all right that way.
///
///
/// Hugging Face carries more than a hundred thousand models. Writing a rule for each is not a goal
/// anybody could reach, so the question was never whether models fall through to the default but
/// which ones may. This list is that decision, written down: every model here was looked at once,
/// and leaving it to the default was the answer.
///
/// It exists because the alternative is silence. A family nobody got round to and a family nobody
/// wanted look exactly the same from the outside -- both are simply missing -- and the difference
/// only survives if somebody writes it down. The verification run reads this list, and a test holds
/// it against the rules from both sides: nothing falls through unlisted, and nothing stays listed
/// once a rule does answer for it.
///
/// What the default says is that a model reads and writes text, speaks the chat completion API, and
/// calls functions. The last part is a guess, and the one that matters: the models where it goes
/// the wrong way are named in WithoutToolCallingFamily instead of being left here.
///
public static class LeftToTheDefault
{
///
/// A model whose answer the default already gets right, word for word.
///
private const string THE_DEFAULT_SAYS_THE_SAME = "The default answers exactly what the rules for it answer today: text in, text out, and tool calling.";
///
/// A model which keeps what it needs and loses what was extra.
///
private const string THE_DEFAULT_KEEPS_WHAT_MATTERS = "A family we decided not to write down. The default keeps the chat and the tool calling; what it drops is the thinking, which a person turns back on in the expert settings and an organization states in a model plugin.";
///
/// A model which reads more than text, and is told it does not.
///
private const string THE_DEFAULT_DROPS_THE_MODALITIES = "A family we decided not to write down. The default cannot know what it reads besides text, so images have to be turned on by hand -- in the expert settings, or for everybody through a model plugin.";
///
/// Something a provider answered with which was never the name of a model.
///
private const string NOT_A_MODEL_AT_ALL = "Not a model name. It is in the corpus because providers really answer with it, and the rules have to stay quiet rather than invent something.";
///
/// Every model which reaches the global default on purpose.
///
public static readonly IReadOnlyList ENTRIES =
[
//
// Families whose answer the default already is. Writing them down would add a file and
// change nothing about a single answer.
//
new(SELF_HOSTED, "olmo3:7b", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "falcon3:10b", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "falcon-h1-1.5b-tool-calling", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "salamandra-7b-instruct-tools", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "ling-1t", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "inclusionai/ling-mini-2.0", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "starling-lm:7b", THE_DEFAULT_SAYS_THE_SAME),
new(SELF_HOSTED, "phi3:14b", "The Phi rules were written for the fourth generation and the ones before it already reached the default, which answers them the same as it does today."),
//
// Families which lose their thinking to the default. It is the ability a person misses
// least: the model still answers, and the answer still carries the thinking -- it is only
// not announced, so the thinking settings stay hidden.
//
new(SELF_HOSTED, "olmo-3-32b-think", THE_DEFAULT_KEEPS_WHAT_MATTERS),
new(SELF_HOSTED, "seed-oss:36b", THE_DEFAULT_KEEPS_WHAT_MATTERS),
new(SELF_HOSTED, "ring-1t", THE_DEFAULT_KEEPS_WHAT_MATTERS),
new(SELF_HOSTED, "smollm3:3b", THE_DEFAULT_KEEPS_WHAT_MATTERS),
new(HUGGINGFACE, "HuggingFaceTB/SmolLM3-3B", THE_DEFAULT_KEEPS_WHAT_MATTERS),
new(SELF_HOSTED, "internlm3:8b", THE_DEFAULT_KEEPS_WHAT_MATTERS),
//
// Families which read more than text. These are the ones the decision costs something:
// until somebody says otherwise, the chat will not offer to send them a picture.
//
new(SELF_HOSTED, "internvl3-8b", THE_DEFAULT_DROPS_THE_MODALITIES),
new(GWDG, "internvl2.5-8b", THE_DEFAULT_DROPS_THE_MODALITIES),
new(SELF_HOSTED, "apertus-1.5-8b", "A family we decided not to write down, and the one which loses the most by it: it reads images and listens to audio, and the default knows about neither."),
//
// Names which were never models.
//
new(OPEN_AI, "", NOT_A_MODEL_AT_ALL),
new(SELF_HOSTED, " ", NOT_A_MODEL_AT_ALL),
new(SELF_HOSTED, "---", NOT_A_MODEL_AT_ALL),
new(NONE, "gpt-5.6", "A model without a provider. There is no way to reach it, so there is nothing to say about how it could be used."),
new(LITE_LLM, "the-fast-one", "A freely chosen LiteLLM alias. Nothing in the name says what is behind it, which is what the default exists for."),
new(SELF_HOSTED, "a-model-nobody-has-heard-of", "The corpus entry for the default itself. It has to reach it, or the default would never be measured."),
//
// Still to do rather than decided.
//
new(LITE_LLM, "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", "Not a decision: the LiteLLM host cannot take the Bedrock spelling apart yet, because the vendor sits behind a dot rather than a slash. ExpectedChanges holds the answer it has to arrive at."),
];
}