Updated GWDG SAIA to its new API key portal and added Whisper v3 Large (#1125)

This commit is contained in:
Thorsten Sommer authored and GitHub committed 2026-10-28 14:14:36 +01:00
1 parent bf54b8cd0d
commit 8251d797ff
9 files changed
+30 -17

No files matched your search

@@ -1,4 +1,3 @@
using AIStudio.Chat;
using AIStudio.Components;
using AIStudio.Dialogs;
using AIStudio.Dialogs.Settings;
@@ -3,13 +3,16 @@ using AIStudio.Provider;
namespace AIStudio.Models.Hosting.Hosts;
/// <summary>
/// The GWDG's academic cloud, which resells commercial models next to the open weights it runs.
/// The GWDG's academic cloud, which runs open weights and names them plainly.
/// </summary>
/// <remarks>
/// This is the host the transport rule was written for. It offers Claude and GPT under the very
/// names their vendors use -- "claude-sonnet-5", "gpt-5.5" -- so the rules recognize them and
/// answer with everything those models can do at their vendor. Everything except the API: a request
/// goes to Göttingen, not to San Francisco, and the Responses API is not served there.
/// This is the host the transport rule was written for. The commercial models the GWDG obtains
/// from Microsoft Azure, Claude and GPT among them, are not generally available through its API:
/// its documentation lists open weights only, and its models endpoint has never answered with them.
/// An organization which gets them anyway receives them under the very names their vendors use --
/// "claude-sonnet-5", "gpt-5.5" -- so the rules recognize them and answer with everything those
/// models can do at their vendor. Everything except the API: a request goes to Göttingen, not to
/// San Francisco, and the Responses API is not served there.
///
/// The old code arrived at the same answer by having the open weights rules notice a Claude name
/// and call the Anthropic rules, then correct the result. Here the recognizing and the correcting
@@ -22,5 +25,5 @@ public sealed class HostGWDG : ModelHost
public override LLMProviders Provider => LLMProviders.GWDG;
/// <inheritdoc />
public override ModelSource Source => new("https://docs.hpc.gwdg.de/services/saia/index.html", new DateOnly(2026, 9, 11), "Open weights and resold commercial models alike are named plainly, and all of them are served through the OpenAI-compatible chat completion API.");
public override ModelSource Source => new("https://docs.hpc.gwdg.de/services/ai-services/saia/index.html", new DateOnly(2026, 10, 28), "Open weights are named plainly and served through the OpenAI-compatible API; the commercial models obtained from Azure reach the same API through a translation layer, but are not generally available for API usage.");
}
@@ -10,7 +10,7 @@ public sealed class ProviderGWDG() : BaseProvider(LLMProviders.GWDG, new Uri("ht
{
private static readonly ILogger<ProviderGWDG> LOGGER = Program.LOGGER_FACTORY.CreateLogger<ProviderGWDG>();
// Source: https://docs.hpc.gwdg.de/services/saia/index.html#embeddings
// Source: https://docs.hpc.gwdg.de/services/ai-services/saia/index.html#embeddings
private static readonly Model[] KNOWN_EMBEDDING_MODELS =
[
new("e5-mistral-7b-instruct", "E5 Mistral 7B Instruct"),
@@ -18,10 +18,11 @@ public sealed class ProviderGWDG() : BaseProvider(LLMProviders.GWDG, new Uri("ht
new("qwen3-embedding-4b", "Qwen3 Embedding 4B"),
];
// Source: https://docs.hpc.gwdg.de/services/saia/index.html#voice-to-text
// Source: https://docs.hpc.gwdg.de/services/ai-services/saia/index.html#voice-to-text
private static readonly Model[] KNOWN_TRANSCRIPTION_MODELS =
[
new("whisper-large-v2", "Whisper v2 Large"),
new("whisper-large-v3", "Whisper v3 Large"),
];
#region Implementation of IProvider
@@ -188,7 +188,7 @@ public static class LLMProvidersExtensions
LLMProviders.SELF_HOSTED => Confidence.SELF_HOSTED.WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
LLMProviders.HELMHOLTZ => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
LLMProviders.GWDG => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://docs.hpc.gwdg.de/services/chat-ai/data-privacy/index.html").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
LLMProviders.GWDG => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://docs.hpc.gwdg.de/services/ai-services/chat-ai/data-privacy/index.html").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
_ => Confidence.UNKNOWN.WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
};
@@ -428,7 +428,7 @@ public static class LLMProvidersExtensions
LLMProviders.HUGGINGFACE => "https://huggingface.co/login",
LLMProviders.HELMHOLTZ => "https://sdlaml.pages.jsc.fz-juelich.de/ai/guides/blablador_api_access/#step-1-register-on-gitlab",
LLMProviders.GWDG => "https://docs.hpc.gwdg.de/services/saia/index.html#api-request",
LLMProviders.GWDG => "https://saia.gwdg.de",
_ => string.Empty,
};
@@ -451,6 +451,8 @@ public static class LLMProvidersExtensions
LLMProviders.IONOS => "https://dcd.ionos.com/latest/?page=dcd-ai-model-hub",
LLMProviders.REQUESTY => "https://app.requesty.ai/",
LLMProviders.GWDG => "https://saia.gwdg.de/keys",
_ => string.Empty,
};
@@ -472,6 +474,8 @@ public static class LLMProvidersExtensions
LLMProviders.IONOS => true,
LLMProviders.REQUESTY => true,
LLMProviders.GWDG => true,
_ => false,
};
@@ -10,6 +10,7 @@
- Added Requesty as a new LLM provider for chats, embeddings, and transcriptions. Requesty is an AI gateway from the United Kingdom that gives you models from many providers with a single API key. Because where your data is processed depends on the model you choose, you set its trust level yourself. Thanks, Thibault Jaigu (`Thibaultjaigu`), for this first contribution.
- Added [llmman](https://github.com/llmmanorg/llmman) as a new option for the models you host yourself. llmman runs open models on your own computer or server, and AI Studio can use them for chats, embeddings, and transcriptions. Thanks, Eric Curtin (`ericcurtin`), for this first contribution.
- Added support for Mistral Large 4.
- Added the speech-to-text model Whisper v3 Large for GWDG SAIA, which you can now select next to Whisper v2 Large.
- Added transcription of audio and video files in local data sources. When you select such files, for example with the pattern `*.mp3` or `*`, AI Studio sends them to your transcription provider and adds the transcripts to the index. It keeps each transcript, so an unchanged recording is transcribed only once. Thanks, Paul Koudelka (`PaulKoudelka`), for this contribution.
- Added backups of all your data. Under Data Backup & Restore, on the information page and in the settings, you save your chats, settings, plugins, and the index of your data sources into a single file, for example, to take everything to a new computer. Restoring such a backup replaces your data when AI Studio restarts, or you add only its chats to the ones you have. API keys and passwords never go into a backup, and after a restore, AI Studio tells you where to enter them again. Thanks, Jens Erler (`j-erler`), for this contribution.
- Added organization-wide management for backups. IT departments can prevent users from backing up their data or from restoring a backup. A backup leaves out what the configurations of your organization bring along, such as their providers and plugins, so nothing appears twice after a restore.
@@ -85,6 +86,7 @@
- Changed the banner on the start page to a fresh design that shows what AI Studio can do today.
- Changed when a chat you add to a workspace in the workspace list appears there. Like any other new chat, it now appears once there is something to keep, for example, your first message, instead of right away.
- Changed the name of the Slide Planner Assistant to Slide Assistant. With a PowerPoint template, it now creates the slides themselves, not just a plan for them.
- Changed the link for getting an API key for GWDG SAIA to the new portal of the GWDG, where you request and manage your keys. The browser button next to a GWDG SAIA provider in the settings now opens your keys there, too.
- Fixed a warning about the confidence level that stayed in the dialog for adding a local data source, even after you chose an embedding provider that meets it. The dialog now checks again whenever you change either of them, so a warning also appears when you switch to a provider that falls short.
- Fixed the list of data sources squeezing their names into a very narrow column when you opened it from a chat or from the background embeddings page, so the names were hard to read.
- Fixed two confidence levels sharing the same name in the German user interface. Moderate is called "Mäßig" again, and Medium stays "Mittel".
@@ -94,6 +94,7 @@ GWDG | internvl2.5-8b | CHAT_COMPLETION_API, FUNCTION_CALLING, TEXT_INPUT, TEXT_
GWDG | meta-llama-3.1-8b-instruct | CHAT_COMPLETION_API, FUNCTION_CALLING, TEXT_INPUT, TEXT_OUTPUT | CHAT | 131072 | (unknown) | (unknown) | (unknown)
GWDG | qwen3-235b-a22b | CHAT_COMPLETION_API, FUNCTION_CALLING, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
GWDG | whisper-large-v2 | SPEECH_INPUT, TEXT_OUTPUT | TRANSCRIPTION | (unknown) | (unknown) | (unknown) | (unknown)
GWDG | whisper-large-v3 | SPEECH_INPUT, TEXT_OUTPUT | TRANSCRIPTION | (unknown) | (unknown) | (unknown) | (unknown)
HELMHOLTZ | 01 - GPT-5.5 - great overall performance | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, REASONING_BY_DEFAULT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | 1050000 | (unknown) | TIKTOKEN o200k_base | DEVELOPER
HELMHOLTZ | 1 - Llama3 405 the best general model | CHAT_COMPLETION_API, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
HELMHOLTZ | 10 - Muse Glimmer 30b - the newest META model | ALWAYS_REASONING, CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown) | (unknown)
+1 -1
View File
@@ -18,7 +18,7 @@ public enum CorpusOrigin
/// <summary>
/// The app carries this model in a built-in list, such as the aliases Anthropic answers to but
/// does not list, or the transcription model GWDG serves without naming it.
/// does not list, or the transcription models GWDG serves without naming them.
/// </summary>
BUILT_INTO_THE_APP,
+4 -2
View File
@@ -269,8 +269,9 @@ public static class ModelCorpus
/// <summary>
/// Providers that serve other vendors' models under their plain names, without a prefix. GWDG
/// is the case that brought this up: next to open weights it resells Claude and GPT models.
/// Blablador answers with a whole sentence instead of an ID.
/// is the case that brought this up: next to open weights it obtains Claude and GPT models from
/// Azure, which are not generally available through its API but keep their vendors' names where
/// an organization gets them. Blablador answers with a whole sentence instead of an ID.
/// </summary>
private static readonly CorpusEntry[] RESELLER_ENTRIES =
[
@@ -283,6 +284,7 @@ public static class ModelCorpus
new(GWDG, "internvl2.5-8b", NAMED_BY_A_RULE),
new(GWDG, "e5-mistral-7b-instruct", NAMED_BY_NO_RULE),
new(GWDG, "whisper-large-v2", BUILT_INTO_THE_APP),
new(GWDG, "whisper-large-v3", BUILT_INTO_THE_APP),
new(HELMHOLTZ, "1 - Llama3 405 the best general model", QUOTED_AS_A_NAME_SHAPE),
new(HELMHOLTZ, "01 - GPT-5.5 - great overall performance", QUOTED_AS_A_NAME_SHAPE),
new(HELMHOLTZ, "10 - Muse Glimmer 30b - the newest META model", QUOTED_AS_A_NAME_SHAPE),
+4 -3
View File
@@ -195,9 +195,10 @@ public sealed class ModelHostTests
public void AResellerLeavesTheNameAloneAndOnlyTakesTheApiAway()
{
//
// This is the GWDG case: it offers Claude and GPT under the names their vendors use, so the
// rules recognize them and answer with everything those models can do. Everything except
// the API -- the request goes to Göttingen, and the Responses API is not served there.
// This is the GWDG case: where it serves Claude or GPT, it does so under the names their
// vendors use, so the rules recognize them and answer with everything those models can do.
// Everything except the API -- the request goes to Göttingen, and the Responses API is not
// served there.
//
var atItsVendor = new ModelProfile { Capabilities = Capability.TEXT_INPUT | Capability.FUNCTION_CALLING | Capability.RESPONSES_API };
var throughTheReseller = Transport(LLMProviders.GWDG, atItsVendor);