Added Requesty as a provider (#1006)

Co-authored-by: Thorsten Sommer <SommerEngineering@users.noreply.github.com>
This commit is contained in:
Thibault JaiguandThorsten Sommer authored and GitHub committed 2026-10-13 08:29:06 +02:00
1 parent f912af321f
commit 2bd3d41421
44 files changed
+518 -65

No files matched your search

@@ -195,6 +195,12 @@ PERPLEXITY | sonar-deep-research | ALWAYS_REASONING, CHAT_COMPLETION_API, MULTIP
PERPLEXITY | sonar-pro | CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
PERPLEXITY | sonar-reasoning | ALWAYS_REASONING, CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
PERPLEXITY | sonar-reasoning-pro | ALWAYS_REASONING, CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
REQUESTY | anthropic/claude-opus-5 | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, REASONING_BY_DEFAULT, TEXT_INPUT, TEXT_OUTPUT | CHAT | 1000000 | 600 per request | PROVIDER_API /v1/messages/count_tokens | (unknown)
REQUESTY | bedrock/claude-opus-5@eu-central-1 | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, REASONING_BY_DEFAULT, TEXT_INPUT, TEXT_OUTPUT | CHAT | 1000000 | 600 per request | PROVIDER_API /v1/messages/count_tokens | (unknown)
REQUESTY | claude-opus-5@eu | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, REASONING_BY_DEFAULT, TEXT_INPUT, TEXT_OUTPUT | CHAT | 1000000 | 600 per request | PROVIDER_API /v1/messages/count_tokens | (unknown)
REQUESTY | google/gemma-4-31b-it | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, OPTIONAL_REASONING, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
REQUESTY | novita/qwen/qwen3.8-max | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, REASONING_BY_DEFAULT, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
REQUESTY | openai/gpt-6-sol:flex | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, REASONING_BY_DEFAULT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | 1050000 | (unknown) | (unknown) | DEVELOPER
SELF_HOSTED | | (nothing) | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
SELF_HOSTED | --- | CHAT_COMPLETION_API, FUNCTION_CALLING, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
SELF_HOSTED | 01-ai/yi-large | CHAT_COMPLETION_API, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
+6
View File
@@ -240,6 +240,12 @@ public static class ModelCorpus
new(LITE_LLM, "azure/gpt-5.6", QUOTED_AS_A_NAME_SHAPE),
new(LITE_LLM, "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", NAMED_BY_NO_RULE),
new(LITE_LLM, "the-fast-one", NAMED_BY_NO_RULE),
new(REQUESTY, "anthropic/claude-opus-5", QUOTED_AS_A_NAME_SHAPE),
new(REQUESTY, "google/gemma-4-31b-it", NAMED_BY_A_RULE),
new(REQUESTY, "bedrock/claude-opus-5@eu-central-1", QUOTED_AS_A_NAME_SHAPE),
new(REQUESTY, "claude-opus-5@eu", QUOTED_AS_A_NAME_SHAPE),
new(REQUESTY, "openai/gpt-6-sol:flex", QUOTED_AS_A_NAME_SHAPE),
new(REQUESTY, "novita/qwen/qwen3.8-max", QUOTED_AS_A_NAME_SHAPE),
];
/// <summary>
@@ -54,6 +54,8 @@ public sealed class HostNamingTests
Assert.That(HostNaming.VendorOfOrganization("Qwen"), Is.EqualTo(ModelVendor.ALIBABA));
Assert.That(HostNaming.VendorOfOrganization("deepseek-ai"), Is.EqualTo(ModelVendor.DEEP_SEEK));
Assert.That(HostNaming.VendorOfOrganization("HuggingFaceTB"), Is.EqualTo(ModelVendor.HUGGING_FACE));
Assert.That(HostNaming.VendorOfOrganization("zai"), Is.EqualTo(ModelVendor.Z_AI));
Assert.That(HostNaming.VendorOfOrganization("minimaxi"), Is.EqualTo(ModelVendor.MINIMAX));
Assert.That(HostNaming.VendorOfOrganization("somebody-else"), Is.EqualTo(ModelVendor.UNKNOWN));
});
}
@@ -111,6 +113,31 @@ public sealed class HostNamingTests
});
}
[Test]
public void TheRegionSuffixComesOffAndTheModelStaysWhatItWas()
{
var taken = HostNaming.TryStripRegionSuffix(new ModelId("bedrock/claude-opus-5@eu-central-1"), out var inner);
Assert.Multiple(() =>
{
Assert.That(taken, Is.True);
Assert.That(inner.Original, Is.EqualTo("bedrock/claude-opus-5"));
});
}
[TestCase("bedrock/claude-opus-5", TestName = "A name without an at sign has no region to take off")]
[TestCase("@eu", TestName = "A region with nothing in front of it is not a wrapping")]
public void WhatCarriesNoRegionIsLeftAlone(string modelId)
{
var taken = HostNaming.TryStripRegionSuffix(new ModelId(modelId), out var inner);
Assert.Multiple(() =>
{
Assert.That(taken, Is.False);
Assert.That(inner.Original, Is.EqualTo(modelId));
});
}
[Test]
public void AMenuPositionComesOff()
{
@@ -78,6 +78,55 @@ public sealed class ModelHostTests
});
}
[Test]
public void ARequestyNameLosesItsRegionAndTheCloudRunningIt()
{
var unwrapped = Unwrap(LLMProviders.REQUESTY, "bedrock/claude-opus-5@eu-central-1", out var vendor);
Assert.Multiple(() =>
{
Assert.That(unwrapped.Original, Is.EqualTo("claude-opus-5"));
Assert.That(vendor, Is.Null, "Bedrock runs the model; it did not build it.");
});
}
[Test]
public void ARequestyManagedPolicyOnlyLosesItsRegion()
{
var unwrapped = Unwrap(LLMProviders.REQUESTY, "claude-opus-5@eu", out var vendor);
Assert.Multiple(() =>
{
Assert.That(unwrapped.Original, Is.EqualTo("claude-opus-5"));
Assert.That(vendor, Is.Null);
});
}
[Test]
public void TheRequestyServiceTierComesOffAndTheVendorStays()
{
var unwrapped = Unwrap(LLMProviders.REQUESTY, "openai/gpt-6-sol:flex", out var vendor);
Assert.Multiple(() =>
{
Assert.That(unwrapped.Original, Is.EqualTo("gpt-6-sol"));
Assert.That(vendor, Is.EqualTo(ModelVendor.OPEN_AI));
});
}
[TestCase("novita/qwen/qwen3.8-max", "qwen3.8-max", ModelVendor.ALIBABA, TestName = "Behind the cloud, the organization from the hub names the vendor")]
[TestCase("azure/openai/text-embedding-3-large@francecentral", "text-embedding-3-large", ModelVendor.OPEN_AI, TestName = "Behind the cloud and before the region, the organization names the vendor")]
public void TheInnermostRequestyOrganizationNamesTheVendor(string modelId, string expectedModel, ModelVendor expectedVendor)
{
var unwrapped = Unwrap(LLMProviders.REQUESTY, modelId, out var vendor);
Assert.Multiple(() =>
{
Assert.That(unwrapped.Original, Is.EqualTo(expectedModel));
Assert.That(vendor, Is.EqualTo(expectedVendor));
});
}
[Test]
public void TheFireworksAccountPathComesOffWholeWithoutAnybodyCountingItsSegments()
{
@@ -2,6 +2,7 @@ using System.Text.Json;
using AIStudio.Provider.Groq;
using AIStudio.Provider.OpenRouter;
using AIStudio.Provider.Requesty;
using MistralModelsResponse = AIStudio.Provider.Mistral.ModelsResponse;
using SelfHostedModelsResponse = AIStudio.Provider.SelfHosted.ModelsResponse;
@@ -105,6 +106,19 @@ public sealed class ModelListMetadataTests
Assert.That(response.Data[0].ContextWindowTokens, Is.EqualTo(131_072));
}
[Test]
public void RequestyStatesTheWindowAsTheContextWindow()
{
var response = JsonSerializer.Deserialize<RequestyModelsResponse>("""
{
"object": "list",
"data": [ { "id": "openai/gpt-4o-mini", "object": "model", "api": "chat", "context_window": 128000, "max_output_tokens": 16384 } ]
}
""", AS_THE_PROVIDERS_READ_IT);
Assert.That(response.Data[0].ContextWindowTokens, Is.EqualTo(128_000));
}
[Test]
public void MistralStatesTheWindowAsAMaximumLength()
{