mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-09-27 03:53:36 +00:00
Merge daed24f31f into 4baf21656a
This commit is contained in:
commit
54a6e48120
@ -118,6 +118,7 @@ MindWork AI Studio is a free desktop app for macOS, Windows, and Linux. It provi
|
|||||||
- [Hetzner](https://experiments.hetzner.com) (experimental inference API running open-source models in the EU)
|
- [Hetzner](https://experiments.hetzner.com) (experimental inference API running open-source models in the EU)
|
||||||
- [IONOS](https://cloud.ionos.com/managed/ai-model-hub) (AI Model Hub running open-source models in Germany)
|
- [IONOS](https://cloud.ionos.com/managed/ai-model-hub) (AI Model Hub running open-source models in Germany)
|
||||||
- [LiteLLM](https://www.litellm.ai/) (an AI gateway you run yourself, in front of models from many providers)
|
- [LiteLLM](https://www.litellm.ai/) (an AI gateway you run yourself, in front of models from many providers)
|
||||||
|
- [Requesty](https://www.requesty.ai/) (an AI gateway with one API key for models from many providers)
|
||||||
- [Hugging Face](https://huggingface.co/) using their [inference providers](https://huggingface.co/docs/inference-providers/index) such as Cerebras, Nebius, Sambanova, Novita, Hyperbolic, Together AI, Fireworks, Hugging Face
|
- [Hugging Face](https://huggingface.co/) using their [inference providers](https://huggingface.co/docs/inference-providers/index) such as Cerebras, Nebius, Sambanova, Novita, Hyperbolic, Together AI, Fireworks, Hugging Face
|
||||||
- Self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), and [vLLM](https://github.com/vllm-project/vllm)
|
- Self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), and [vLLM](https://github.com/vllm-project/vllm)
|
||||||
- [Groq](https://groq.com/)
|
- [Groq](https://groq.com/)
|
||||||
|
|||||||
@ -9301,9 +9301,6 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1024253064"] = "Welcome to MindWork AI
|
|||||||
-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.
|
-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider."
|
||||||
|
|
||||||
-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.
|
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1301599515"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities."
|
|
||||||
|
|
||||||
-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.
|
-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life."
|
||||||
|
|
||||||
@ -9355,6 +9352,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3341379752"] = "Cost-effective"
|
|||||||
-- Flexibility
|
-- Flexibility
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility"
|
||||||
|
|
||||||
|
-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3834261447"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities."
|
||||||
|
|
||||||
-- Privacy
|
-- Privacy
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy"
|
||||||
|
|
||||||
|
|||||||
24
app/MindWork AI Studio/Models/Hosting/Hosts/HostRequesty.cs
Normal file
24
app/MindWork AI Studio/Models/Hosting/Hosts/HostRequesty.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using AIStudio.Models.Matching;
|
||||||
|
using AIStudio.Provider;
|
||||||
|
|
||||||
|
namespace AIStudio.Models.Hosting.Hosts;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Requesty, a gateway which serves other people's models and says whose they are.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Most names come as "vendor/model", the same shape OpenRouter uses, so the prefix is taken off
|
||||||
|
/// and the vendor stated. Requesty also lists managed routing policies such as "gpt-5-mini@eu",
|
||||||
|
/// which carry no prefix at all. Those have nothing to take off and go to the rules as they are.
|
||||||
|
/// </remarks>
|
||||||
|
public sealed class HostRequesty : ModelHost
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override LLMProviders Provider => LLMProviders.REQUESTY;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override ModelSource Source => new("https://docs.requesty.ai/features/managed-policies", new DateOnly(2026, 9, 25), "Models are named \"vendor/model\", apart from managed policies such as \"gpt-5-mini@eu\", and all of them are served through the OpenAI-compatible chat completion API.");
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool TryUnwrap(in ModelId id, out ModelId inner, out ModelVendor? declaredVendor) => HostNaming.TrySplitOrganization(id, out inner, out declaredVendor);
|
||||||
|
}
|
||||||
@ -63,7 +63,7 @@ public partial class Home : MSGComponentBase
|
|||||||
this.itemsAdvantages = [
|
this.itemsAdvantages = [
|
||||||
new(this.T("Free of charge"), this.T("The app is free to use, both for personal and commercial purposes.")),
|
new(this.T("Free of charge"), this.T("The app is free to use, both for personal and commercial purposes.")),
|
||||||
new(this.T("Democratization of AI"), this.T("We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models.")),
|
new(this.T("Democratization of AI"), this.T("We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models.")),
|
||||||
new(this.T("Independence"), this.T("You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.")),
|
new(this.T("Independence"), this.T("You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.")),
|
||||||
new(this.T("Assistants"), this.T("You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants.")),
|
new(this.T("Assistants"), this.T("You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants.")),
|
||||||
new(this.T("Unrestricted usage"), this.T("Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API.")),
|
new(this.T("Unrestricted usage"), this.T("Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API.")),
|
||||||
new(this.T("Cost-effective"), this.T("You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit.")),
|
new(this.T("Cost-effective"), this.T("You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit.")),
|
||||||
|
|||||||
@ -906,8 +906,8 @@ CONFIG["SETTINGS"] = {}
|
|||||||
-- Configure a custom confidence scheme.
|
-- Configure a custom confidence scheme.
|
||||||
-- This is used when DataConfidence.ConfidenceScheme is set to CUSTOM.
|
-- This is used when DataConfidence.ConfidenceScheme is set to CUSTOM.
|
||||||
-- Allowed provider keys are: OPEN_AI, ANTHROPIC, MISTRAL, GOOGLE, X, DEEP_SEEK, ALIBABA_CLOUD,
|
-- Allowed provider keys are: OPEN_AI, ANTHROPIC, MISTRAL, GOOGLE, X, DEEP_SEEK, ALIBABA_CLOUD,
|
||||||
-- PERPLEXITY, OPEN_ROUTER, HETZNER, IONOS, LITE_LLM, FIREWORKS, GROQ, HUGGINGFACE, SELF_HOSTED,
|
-- PERPLEXITY, OPEN_ROUTER, HETZNER, IONOS, LITE_LLM, REQUESTY, FIREWORKS, GROQ, HUGGINGFACE,
|
||||||
-- HELMHOLTZ, GWDG
|
-- SELF_HOSTED, HELMHOLTZ, GWDG
|
||||||
-- Allowed confidence values are: UNTRUSTED, VERY_LOW, LOW, MODERATE, MEDIUM, HIGH
|
-- Allowed confidence values are: UNTRUSTED, VERY_LOW, LOW, MODERATE, MEDIUM, HIGH
|
||||||
--
|
--
|
||||||
-- Replaces, does not merge: a configuration with a higher priority replaces the whole
|
-- Replaces, does not merge: a configuration with a higher priority replaces the whole
|
||||||
@ -927,6 +927,7 @@ CONFIG["SETTINGS"] = {}
|
|||||||
-- ["HETZNER"] = "HIGH",
|
-- ["HETZNER"] = "HIGH",
|
||||||
-- ["IONOS"] = "HIGH",
|
-- ["IONOS"] = "HIGH",
|
||||||
-- ["LITE_LLM"] = "MODERATE",
|
-- ["LITE_LLM"] = "MODERATE",
|
||||||
|
-- ["REQUESTY"] = "MODERATE",
|
||||||
-- ["FIREWORKS"] = "MODERATE",
|
-- ["FIREWORKS"] = "MODERATE",
|
||||||
-- ["GROQ"] = "MODERATE",
|
-- ["GROQ"] = "MODERATE",
|
||||||
-- ["HUGGINGFACE"] = "MODERATE",
|
-- ["HUGGINGFACE"] = "MODERATE",
|
||||||
|
|||||||
@ -9303,9 +9303,6 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1024253064"] = "Willkommen bei MindWork
|
|||||||
-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.
|
-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Vielen Dank, dass Sie MindWork AI Studio für Ihre KI-Anwendungen in Betracht ziehen. Diese App wurde entwickelt, um Ihnen die Nutzung von leistungsstarken Sprachmodellen (LLMs) zu ermöglichen. Bitte beachten Sie, dass die App kein integriertes LLM enthält. Stattdessen benötigen Sie einen API-Schlüssel von einem passenden Anbieter."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Vielen Dank, dass Sie MindWork AI Studio für Ihre KI-Anwendungen in Betracht ziehen. Diese App wurde entwickelt, um Ihnen die Nutzung von leistungsstarken Sprachmodellen (LLMs) zu ermöglichen. Bitte beachten Sie, dass die App kein integriertes LLM enthält. Stattdessen benötigen Sie einen API-Schlüssel von einem passenden Anbieter."
|
||||||
|
|
||||||
-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.
|
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1301599515"] = "Sie sind nicht an einen einzigen Anbieter gebunden. Stattdessen können Sie den Anbieter wählen, der am besten zu Ihren Anforderungen passt. Derzeit unterstützen wir OpenAI (GPT5, o1 usw.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimentell), IONOS, LiteLLM, Hugging Face, Groq, Fireworks sowie selbst gehostete Modelle mit vLLM, llama.cpp, ollama oder LM Studio. Für Wissenschaftlerinnen und Wissenschaftler sowie Mitarbeitende von Forschungseinrichtungen unterstützen wir außerdem die KI-Dienste von Helmholtz und GWDG. Diese sind über föderierte Logins wie eduGAIN für alle 18 Helmholtz-Zentren, die Max-Planck-Gesellschaft, die meisten deutschen sowie viele internationale Universitäten verfügbar."
|
|
||||||
|
|
||||||
-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.
|
-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "Die App benötigt nur wenig Speicherplatz für die Installation und verwendet wenig Arbeitsspeicher. Außerdem hat sie einen minimalen Einfluss auf die Systemressourcen, was sich positiv auf die Akkulaufzeit auswirkt."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "Die App benötigt nur wenig Speicherplatz für die Installation und verwendet wenig Arbeitsspeicher. Außerdem hat sie einen minimalen Einfluss auf die Systemressourcen, was sich positiv auf die Akkulaufzeit auswirkt."
|
||||||
|
|
||||||
@ -9357,6 +9354,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3341379752"] = "Kosteneffizient"
|
|||||||
-- Flexibility
|
-- Flexibility
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibilität"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibilität"
|
||||||
|
|
||||||
|
-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3834261447"] = "Sie sind nicht an einen einzigen Anbieter gebunden. Stattdessen können Sie den Anbieter wählen, der am besten zu Ihren Anforderungen passt. Derzeit unterstützen wir OpenAI (GPT5, o1 usw.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimentell), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks sowie selbst gehostete Modelle mit vLLM, llama.cpp, ollama oder LM Studio. Für Wissenschaftlerinnen und Wissenschaftler sowie Mitarbeitende von Forschungseinrichtungen unterstützen wir außerdem die KI-Dienste von Helmholtz und GWDG. Diese sind über föderierte Logins wie eduGAIN für alle 18 Helmholtz-Zentren, die Max-Planck-Gesellschaft, die meisten deutschen sowie viele internationale Universitäten verfügbar."
|
||||||
|
|
||||||
-- Privacy
|
-- Privacy
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Datenschutz"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Datenschutz"
|
||||||
|
|
||||||
|
|||||||
@ -9303,9 +9303,6 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1024253064"] = "Welcome to MindWork AI
|
|||||||
-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.
|
-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider."
|
||||||
|
|
||||||
-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.
|
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1301599515"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities."
|
|
||||||
|
|
||||||
-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.
|
-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life."
|
||||||
|
|
||||||
@ -9357,6 +9354,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3341379752"] = "Cost-effective"
|
|||||||
-- Flexibility
|
-- Flexibility
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility"
|
||||||
|
|
||||||
|
-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3834261447"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT5, o1, etc.), Perplexity, Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), OpenRouter, Hetzner (experimental), IONOS, LiteLLM, Requesty, Hugging Face, Groq, Fireworks, and self-hosted models using vLLM, llama.cpp, ollama, or LM Studio. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities."
|
||||||
|
|
||||||
-- Privacy
|
-- Privacy
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy"
|
||||||
|
|
||||||
|
|||||||
@ -109,7 +109,7 @@ MODELS = {}
|
|||||||
-- -- the same name means different things depending on who serves it.
|
-- -- the same name means different things depending on who serves it.
|
||||||
-- -- Allowed values are: OPEN_AI, ANTHROPIC, MISTRAL, GOOGLE, X, DEEP_SEEK,
|
-- -- Allowed values are: OPEN_AI, ANTHROPIC, MISTRAL, GOOGLE, X, DEEP_SEEK,
|
||||||
-- -- ALIBABA_CLOUD, PERPLEXITY, OPEN_ROUTER, HETZNER, IONOS, LITE_LLM,
|
-- -- ALIBABA_CLOUD, PERPLEXITY, OPEN_ROUTER, HETZNER, IONOS, LITE_LLM,
|
||||||
-- -- FIREWORKS, GROQ, HUGGINGFACE, SELF_HOSTED, HELMHOLTZ, GWDG
|
-- -- REQUESTY, FIREWORKS, GROQ, HUGGINGFACE, SELF_HOSTED, HELMHOLTZ, GWDG
|
||||||
-- ["ONLY_ON"] = "SELF_HOSTED",
|
-- ["ONLY_ON"] = "SELF_HOSTED",
|
||||||
--
|
--
|
||||||
-- -- Optional: restrict this entry to models of one vendor. Only gateways
|
-- -- Optional: restrict this entry to models of one vendor. Only gateways
|
||||||
|
|||||||
@ -19,6 +19,7 @@ public enum LLMProviders
|
|||||||
HETZNER = 16,
|
HETZNER = 16,
|
||||||
IONOS = 17,
|
IONOS = 17,
|
||||||
LITE_LLM = 18,
|
LITE_LLM = 18,
|
||||||
|
REQUESTY = 19,
|
||||||
|
|
||||||
FIREWORKS = 5,
|
FIREWORKS = 5,
|
||||||
GROQ = 6,
|
GROQ = 6,
|
||||||
|
|||||||
@ -14,6 +14,7 @@ using AIStudio.Provider.Mistral;
|
|||||||
using AIStudio.Provider.OpenAI;
|
using AIStudio.Provider.OpenAI;
|
||||||
using AIStudio.Provider.OpenRouter;
|
using AIStudio.Provider.OpenRouter;
|
||||||
using AIStudio.Provider.Perplexity;
|
using AIStudio.Provider.Perplexity;
|
||||||
|
using AIStudio.Provider.Requesty;
|
||||||
using AIStudio.Provider.SelfHosted;
|
using AIStudio.Provider.SelfHosted;
|
||||||
using AIStudio.Provider.X;
|
using AIStudio.Provider.X;
|
||||||
using AIStudio.Settings;
|
using AIStudio.Settings;
|
||||||
@ -62,6 +63,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.HETZNER => "Hetzner (Experimental)",
|
LLMProviders.HETZNER => "Hetzner (Experimental)",
|
||||||
LLMProviders.IONOS => "IONOS",
|
LLMProviders.IONOS => "IONOS",
|
||||||
LLMProviders.LITE_LLM => "LiteLLM",
|
LLMProviders.LITE_LLM => "LiteLLM",
|
||||||
|
LLMProviders.REQUESTY => "Requesty",
|
||||||
|
|
||||||
LLMProviders.GROQ => "Groq",
|
LLMProviders.GROQ => "Groq",
|
||||||
LLMProviders.FIREWORKS => "Fireworks.ai",
|
LLMProviders.FIREWORKS => "Fireworks.ai",
|
||||||
@ -100,6 +102,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.HETZNER => "Hetzner",
|
LLMProviders.HETZNER => "Hetzner",
|
||||||
LLMProviders.IONOS => "IONOS",
|
LLMProviders.IONOS => "IONOS",
|
||||||
LLMProviders.LITE_LLM => "LiteLLM",
|
LLMProviders.LITE_LLM => "LiteLLM",
|
||||||
|
LLMProviders.REQUESTY => "Requesty",
|
||||||
|
|
||||||
LLMProviders.GROQ => "Groq",
|
LLMProviders.GROQ => "Groq",
|
||||||
LLMProviders.FIREWORKS => "Fireworks.ai",
|
LLMProviders.FIREWORKS => "Fireworks.ai",
|
||||||
@ -170,6 +173,8 @@ public static class LLMProvidersExtensions
|
|||||||
// of a self-hosted model here and let the user assign the level themselves.
|
// of a self-hosted model here and let the user assign the level themselves.
|
||||||
LLMProviders.LITE_LLM => Confidence.USER_OPERATED_GATEWAY.WithSources("https://docs.litellm.ai/docs/data_security").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
|
LLMProviders.LITE_LLM => Confidence.USER_OPERATED_GATEWAY.WithSources("https://docs.litellm.ai/docs/data_security").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
|
||||||
|
|
||||||
|
LLMProviders.REQUESTY => Confidence.UNKNOWN.WithSources("https://www.requesty.ai/privacy", "https://www.requesty.ai/terms").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
|
||||||
|
|
||||||
LLMProviders.SELF_HOSTED => Confidence.SELF_HOSTED.WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
|
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.HELMHOLTZ => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)),
|
||||||
@ -208,6 +213,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.DEEP_SEEK => false,
|
LLMProviders.DEEP_SEEK => false,
|
||||||
LLMProviders.PERPLEXITY => false,
|
LLMProviders.PERPLEXITY => false,
|
||||||
LLMProviders.HETZNER => false,
|
LLMProviders.HETZNER => false,
|
||||||
|
LLMProviders.REQUESTY => false,
|
||||||
|
|
||||||
//
|
//
|
||||||
// Hugging Face serves embeddings, but not through the router endpoint we chat with: that
|
// Hugging Face serves embeddings, but not through the router endpoint we chat with: that
|
||||||
@ -254,6 +260,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.X => false,
|
LLMProviders.X => false,
|
||||||
LLMProviders.DEEP_SEEK => false,
|
LLMProviders.DEEP_SEEK => false,
|
||||||
LLMProviders.PERPLEXITY => false,
|
LLMProviders.PERPLEXITY => false,
|
||||||
|
LLMProviders.REQUESTY => false,
|
||||||
|
|
||||||
//
|
//
|
||||||
// Hugging Face transcribes audio, but like embeddings, not through the router endpoint we
|
// Hugging Face transcribes audio, but like embeddings, not through the router endpoint we
|
||||||
@ -319,6 +326,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.HETZNER => new ProviderHetzner { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
LLMProviders.HETZNER => new ProviderHetzner { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
||||||
LLMProviders.IONOS => new ProviderIONOS { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
LLMProviders.IONOS => new ProviderIONOS { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
||||||
LLMProviders.LITE_LLM => new ProviderLiteLLM(hostname) { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
LLMProviders.LITE_LLM => new ProviderLiteLLM(hostname) { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
||||||
|
LLMProviders.REQUESTY => new ProviderRequesty { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
||||||
|
|
||||||
LLMProviders.GROQ => new ProviderGroq { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
LLMProviders.GROQ => new ProviderGroq { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
||||||
LLMProviders.FIREWORKS => new ProviderFireworks { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
LLMProviders.FIREWORKS => new ProviderFireworks { InstanceName = instanceName, ConfiguredProviderId = configuredProviderId, AdditionalJsonApiParameters = expertProviderApiParameter, TokenizerPath = tokenizerPath, IsEnterpriseConfiguration = isEnterpriseConfiguration },
|
||||||
@ -357,6 +365,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.OPEN_ROUTER => "https://openrouter.ai/keys",
|
LLMProviders.OPEN_ROUTER => "https://openrouter.ai/keys",
|
||||||
LLMProviders.HETZNER => "https://experiments.hetzner.com",
|
LLMProviders.HETZNER => "https://experiments.hetzner.com",
|
||||||
LLMProviders.IONOS => "https://cloud.ionos.com/compute/sign-up",
|
LLMProviders.IONOS => "https://cloud.ionos.com/compute/sign-up",
|
||||||
|
LLMProviders.REQUESTY => "https://app.requesty.ai/api-keys",
|
||||||
|
|
||||||
LLMProviders.GROQ => "https://console.groq.com/",
|
LLMProviders.GROQ => "https://console.groq.com/",
|
||||||
LLMProviders.FIREWORKS => "https://fireworks.ai/login",
|
LLMProviders.FIREWORKS => "https://fireworks.ai/login",
|
||||||
@ -384,6 +393,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.HUGGINGFACE => "https://huggingface.co/settings/billing",
|
LLMProviders.HUGGINGFACE => "https://huggingface.co/settings/billing",
|
||||||
LLMProviders.HETZNER => "https://experiments.hetzner.com",
|
LLMProviders.HETZNER => "https://experiments.hetzner.com",
|
||||||
LLMProviders.IONOS => "https://dcd.ionos.com/latest/?page=dcd-ai-model-hub",
|
LLMProviders.IONOS => "https://dcd.ionos.com/latest/?page=dcd-ai-model-hub",
|
||||||
|
LLMProviders.REQUESTY => "https://app.requesty.ai/",
|
||||||
|
|
||||||
_ => string.Empty,
|
_ => string.Empty,
|
||||||
};
|
};
|
||||||
@ -404,6 +414,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.HUGGINGFACE => true,
|
LLMProviders.HUGGINGFACE => true,
|
||||||
LLMProviders.HETZNER => true,
|
LLMProviders.HETZNER => true,
|
||||||
LLMProviders.IONOS => true,
|
LLMProviders.IONOS => true,
|
||||||
|
LLMProviders.REQUESTY => true,
|
||||||
|
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
@ -473,6 +484,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.HETZNER => true,
|
LLMProviders.HETZNER => true,
|
||||||
LLMProviders.IONOS => true,
|
LLMProviders.IONOS => true,
|
||||||
LLMProviders.LITE_LLM => true,
|
LLMProviders.LITE_LLM => true,
|
||||||
|
LLMProviders.REQUESTY => true,
|
||||||
|
|
||||||
LLMProviders.GROQ => true,
|
LLMProviders.GROQ => true,
|
||||||
LLMProviders.FIREWORKS => true,
|
LLMProviders.FIREWORKS => true,
|
||||||
@ -502,6 +514,7 @@ public static class LLMProvidersExtensions
|
|||||||
LLMProviders.OPEN_ROUTER => true,
|
LLMProviders.OPEN_ROUTER => true,
|
||||||
LLMProviders.HETZNER => true,
|
LLMProviders.HETZNER => true,
|
||||||
LLMProviders.IONOS => true,
|
LLMProviders.IONOS => true,
|
||||||
|
LLMProviders.REQUESTY => true,
|
||||||
|
|
||||||
LLMProviders.GROQ => true,
|
LLMProviders.GROQ => true,
|
||||||
LLMProviders.FIREWORKS => true,
|
LLMProviders.FIREWORKS => true,
|
||||||
|
|||||||
@ -31,6 +31,7 @@ public static class LLMProvidersIconExtensions
|
|||||||
LLMProviders.HETZNER => $"{ICON_ROOT}/hetzner.svg",
|
LLMProviders.HETZNER => $"{ICON_ROOT}/hetzner.svg",
|
||||||
LLMProviders.IONOS => $"{ICON_ROOT}/ionos.svg",
|
LLMProviders.IONOS => $"{ICON_ROOT}/ionos.svg",
|
||||||
LLMProviders.LITE_LLM => $"{ICON_ROOT}/litellm.svg",
|
LLMProviders.LITE_LLM => $"{ICON_ROOT}/litellm.svg",
|
||||||
|
LLMProviders.REQUESTY => $"{ICON_ROOT}/requesty.svg",
|
||||||
LLMProviders.GROQ => $"{ICON_ROOT}/groq.svg",
|
LLMProviders.GROQ => $"{ICON_ROOT}/groq.svg",
|
||||||
LLMProviders.FIREWORKS => $"{ICON_ROOT}/fireworks.svg",
|
LLMProviders.FIREWORKS => $"{ICON_ROOT}/fireworks.svg",
|
||||||
LLMProviders.HUGGINGFACE => $"{ICON_ROOT}/hugging-face.svg",
|
LLMProviders.HUGGINGFACE => $"{ICON_ROOT}/hugging-face.svg",
|
||||||
|
|||||||
@ -108,6 +108,7 @@ public static class ReasoningDispatcher
|
|||||||
LLMProviders.HETZNER or
|
LLMProviders.HETZNER or
|
||||||
LLMProviders.IONOS or
|
LLMProviders.IONOS or
|
||||||
LLMProviders.LITE_LLM or
|
LLMProviders.LITE_LLM or
|
||||||
|
LLMProviders.REQUESTY or
|
||||||
LLMProviders.X or
|
LLMProviders.X or
|
||||||
LLMProviders.DEEP_SEEK or
|
LLMProviders.DEEP_SEEK or
|
||||||
LLMProviders.GROQ or
|
LLMProviders.GROQ or
|
||||||
|
|||||||
162
app/MindWork AI Studio/Provider/Requesty/ProviderRequesty.cs
Normal file
162
app/MindWork AI Studio/Provider/Requesty/ProviderRequesty.cs
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
using AIStudio.Chat;
|
||||||
|
using AIStudio.Models.Live;
|
||||||
|
using AIStudio.Provider.OpenAI;
|
||||||
|
using AIStudio.Settings;
|
||||||
|
|
||||||
|
namespace AIStudio.Provider.Requesty;
|
||||||
|
|
||||||
|
public sealed class ProviderRequesty() : BaseProvider(LLMProviders.REQUESTY, new Uri("https://router.requesty.ai/v1/"), ExternalHttpTrustPolicy.SYSTEM_TRUST_ONLY, LOGGER)
|
||||||
|
{
|
||||||
|
private const string PROJECT_WEBSITE = "https://github.com/MindWorkAI/AI-Studio";
|
||||||
|
private const string PROJECT_NAME = "MindWork AI Studio";
|
||||||
|
|
||||||
|
private static readonly ILogger<ProviderRequesty> LOGGER = Program.LOGGER_FACTORY.CreateLogger<ProviderRequesty>();
|
||||||
|
|
||||||
|
#region Implementation of IProvider
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override string Id => LLMProviders.REQUESTY.ToSecretId();
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override string InstanceName { get; set; } = "Requesty";
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool HasModelLoadingCapability => true;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override async IAsyncEnumerable<ContentStreamChunk> StreamChatCompletion(Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await foreach (var content in this.StreamOpenAICompatibleChatCompletion<ChatCompletionAPIRequest, ChatCompletionDeltaStreamLine, NoChatCompletionAnnotationStreamLine>(
|
||||||
|
"Requesty",
|
||||||
|
chatModel,
|
||||||
|
chatThread,
|
||||||
|
settingsManager,
|
||||||
|
async (systemPrompt, apiParameters, tools) =>
|
||||||
|
{
|
||||||
|
// Build the list of messages:
|
||||||
|
var messages = await chatThread.Blocks.BuildMessagesUsingNestedImageUrlAsync(this.CreateSettingsProvider(chatModel));
|
||||||
|
|
||||||
|
return new ChatCompletionAPIRequest
|
||||||
|
{
|
||||||
|
Model = chatModel.Id,
|
||||||
|
|
||||||
|
// Build the messages:
|
||||||
|
// - First of all the system prompt
|
||||||
|
// - Then none-empty user and AI messages
|
||||||
|
Messages = [systemPrompt, ..messages],
|
||||||
|
|
||||||
|
// Right now, we only support streaming completions:
|
||||||
|
Stream = true,
|
||||||
|
Tools = tools,
|
||||||
|
AdditionalApiParameters = apiParameters
|
||||||
|
};
|
||||||
|
},
|
||||||
|
headersAction: headers =>
|
||||||
|
{
|
||||||
|
// Set custom headers for project identification:
|
||||||
|
headers.Add("HTTP-Referer", PROJECT_WEBSITE);
|
||||||
|
headers.Add("X-Title", PROJECT_NAME);
|
||||||
|
},
|
||||||
|
token: token))
|
||||||
|
yield return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override async IAsyncEnumerable<ImageURL> StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, [EnumeratorCancellation] CancellationToken token = default)
|
||||||
|
{
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Task<TranscriptionResult> TranscribeAudioAsync(Model transcriptionModel, string audioFilePath, SettingsManager settingsManager, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return Task.FromResult(TranscriptionResult.Failure());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inhertidoc />
|
||||||
|
public override Task<IReadOnlyList<IReadOnlyList<float>>> EmbedTextAsync(Model embeddingModel, SettingsManager settingsManager, CancellationToken token = default, params List<string> texts)
|
||||||
|
{
|
||||||
|
throw this.CreateEmbeddingsNotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Task<ModelLoadResult> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return this.LoadModels(SecretStoreType.LLM_PROVIDER, apiKeyProvisional, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Task<ModelLoadResult> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return Task.FromResult(ModelLoadResult.FromModels([]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Task<ModelLoadResult> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return Task.FromResult(ModelLoadResult.FromModels([]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Task<ModelLoadResult> GetTranscriptionModels(string? apiKeyProvisional = null, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
return Task.FromResult(ModelLoadResult.FromModels([]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads the managed policies and the full model catalog, and offers both as one list.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Requesty lists its managed policies, such as "gpt-5-mini@eu", on a route of their own, and
|
||||||
|
/// the catalog does not contain them. Both lists are read before anything is reported, because
|
||||||
|
/// what is reported replaces everything this instance said before. When the managed route
|
||||||
|
/// fails, the catalog alone is still offered.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="storeType">Where the API key is stored.</param>
|
||||||
|
/// <param name="apiKeyProvisional">An API key which is not stored yet.</param>
|
||||||
|
/// <param name="token">The cancellation token to use.</param>
|
||||||
|
/// <returns>The chat models.</returns>
|
||||||
|
private async Task<ModelLoadResult> LoadModels(SecretStoreType storeType, string? apiKeyProvisional, CancellationToken token)
|
||||||
|
{
|
||||||
|
IList<RequestyModel> managedModels = [];
|
||||||
|
await this.LoadModelsResponse<RequestyModelsResponse>(
|
||||||
|
storeType,
|
||||||
|
"models/managed",
|
||||||
|
modelResponse =>
|
||||||
|
{
|
||||||
|
managedModels = modelResponse.Data;
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
apiKeyProvisional,
|
||||||
|
requestConfigurator: ConfigureRequest,
|
||||||
|
token: token);
|
||||||
|
|
||||||
|
return await this.LoadModelsResponse<RequestyModelsResponse>(
|
||||||
|
storeType,
|
||||||
|
"models",
|
||||||
|
modelResponse => managedModels.Concat(modelResponse.Data)
|
||||||
|
.DistinctBy(n => n.Id)
|
||||||
|
.Select(n => new Model(n.Id, null))
|
||||||
|
.Where(model => model.IsChatModel(this.Provider)),
|
||||||
|
apiKeyProvisional,
|
||||||
|
requestConfigurator: ConfigureRequest,
|
||||||
|
listingFactory: modelResponse => managedModels.Concat(modelResponse.Data)
|
||||||
|
.DistinctBy(n => n.Id)
|
||||||
|
.Select(n => ModelListing.For(n.Id, n.ContextWindowTokens)),
|
||||||
|
token: token);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ConfigureRequest(HttpRequestMessage request, string secretKey)
|
||||||
|
{
|
||||||
|
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey);
|
||||||
|
request.Headers.Add("HTTP-Referer", PROJECT_WEBSITE);
|
||||||
|
request.Headers.Add("X-Title", PROJECT_NAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
10
app/MindWork AI Studio/Provider/Requesty/RequestyModel.cs
Normal file
10
app/MindWork AI Studio/Provider/Requesty/RequestyModel.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace AIStudio.Provider.Requesty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A data model for a Requesty model from the API.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Id">The model's ID.</param>
|
||||||
|
/// <param name="ContextWindowTokens">How much the model reads and writes in one conversation, in tokens.</param>
|
||||||
|
public readonly record struct RequestyModel(string Id, [property: JsonPropertyName("context_window")] int? ContextWindowTokens);
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
namespace AIStudio.Provider.Requesty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A data model for the response from the Requesty models endpoints.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Data">The list of models.</param>
|
||||||
|
public readonly record struct RequestyModelsResponse(IList<RequestyModel> Data);
|
||||||
@ -40,6 +40,7 @@
|
|||||||
- Added an optional API key to every server you host yourself, among them LM Studio, llama.cpp, and whisper.cpp. Such a server may ask for one itself or sit behind a login your organization placed in front of it. So far, only Ollama and vLLM could be given a key.
|
- Added an optional API key to every server you host yourself, among them LM Studio, llama.cpp, and whisper.cpp. Such a server may ask for one itself or sit behind a login your organization placed in front of it. So far, only Ollama and vLLM could be given a key.
|
||||||
- Added a setting for the audio quality used when your speech and your audio and video files are transcribed. AI Studio prepares every recording before it goes to your transcription provider, and you now decide how much detail it keeps: a lower quality travels faster, a higher one gives the transcription model more to work with. You find it in the app settings, right below your transcription provider. Thanks, Dominic Neuburg (`donework`), for this contribution.
|
- Added a setting for the audio quality used when your speech and your audio and video files are transcribed. AI Studio prepares every recording before it goes to your transcription provider, and you now decide how much detail it keeps: a lower quality travels faster, a higher one gives the transcription model more to work with. You find it in the app settings, right below your transcription provider. Thanks, Dominic Neuburg (`donework`), for this contribution.
|
||||||
- Added organization-wide management for the audio quality used when transcribing. IT departments can set the quality their organization works with and lock it, or leave it as a default their colleagues are free to change.
|
- Added organization-wide management for the audio quality used when transcribing. IT departments can set the quality their organization works with and lock it, or leave it as a default their colleagues are free to change.
|
||||||
|
- Added Requesty as a new LLM provider for chats. Requesty is an AI gateway that gives you models from many providers with one API key. The model list includes its managed routing policies, such as models kept in the EU. We have not evaluated its trust level yet.
|
||||||
- Improved loading web content in the assistants: it now uses the same reader as the Read Web Page tool, which extracts the main content of a page more reliably and skips navigation and boilerplate. Pages from your own network, including local servers, keep working as before. When a page cannot be read, AI Studio now says why instead of leaving the field empty.
|
- Improved loading web content in the assistants: it now uses the same reader as the Read Web Page tool, which extracts the main content of a page more reliably and skips navigation and boilerplate. Pages from your own network, including local servers, keep working as before. When a page cannot be read, AI Studio now says why instead of leaving the field empty.
|
||||||
- Improved the app icon. The previous one was generated by an image model; the new one was created based on it and keeps the familiar green landscape with the chat bubble. Because it is now a vector drawing, it stays sharp everywhere it appears: in your taskbar or dock, in the window list, and on the start screen while AI Studio is loading.
|
- Improved the app icon. The previous one was generated by an image model; the new one was created based on it and keeps the familiar green landscape with the chat bubble. Because it is now a vector drawing, it stays sharp everywhere it appears: in your taskbar or dock, in the window list, and on the start screen while AI Studio is loading.
|
||||||
- Improved how AI Studio works out what a model can do. Every model family now stands on its own, together with the page it was read from, and our build refuses rules which contradict each other or name no source. That way, mistakes are caught before they ever reach you.
|
- Improved how AI Studio works out what a model can do. Every model family now stands on its own, together with the page it was read from, and our build refuses rules which contradict each other or name no source. That way, mistakes are caught before they ever reach you.
|
||||||
|
|||||||
@ -9,6 +9,7 @@ All provider icons are shipped with AI Studio and loaded locally. No icon trigge
|
|||||||
- `openai*.svg` uses the OpenAI mark path from [Simple Icons 15.15.0](https://github.com/simple-icons/simple-icons/blob/15.15.0/icons/openai.svg) and black/white variants following the [OpenAI Design Guidelines](https://openai.com/brand/).
|
- `openai*.svg` uses the OpenAI mark path from [Simple Icons 15.15.0](https://github.com/simple-icons/simple-icons/blob/15.15.0/icons/openai.svg) and black/white variants following the [OpenAI Design Guidelines](https://openai.com/brand/).
|
||||||
- `fireworks.svg` is adapted from the [Fireworks AI site icon](https://fireworks.ai/icon0.svg).
|
- `fireworks.svg` is adapted from the [Fireworks AI site icon](https://fireworks.ai/icon0.svg).
|
||||||
- `groq.svg` is adapted from the [Groq site icon](https://groq.com/favicon.svg).
|
- `groq.svg` is adapted from the [Groq site icon](https://groq.com/favicon.svg).
|
||||||
|
- `requesty.svg` is adapted from the [Requesty site icon](https://www.requesty.ai/apple-icon.png).
|
||||||
- `litellm.svg` is the bullet train emoji from [Twemoji 17.0.3](https://github.com/jdecked/twemoji/tree/v17.0.3), licensed under [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). LiteLLM has no mark of its own and identifies itself with that emoji. Retrieved on 2026-08-30.
|
- `litellm.svg` is the bullet train emoji from [Twemoji 17.0.3](https://github.com/jdecked/twemoji/tree/v17.0.3), licensed under [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). LiteLLM has no mark of its own and identifies itself with that emoji. Retrieved on 2026-08-30.
|
||||||
- `provider*.svg` and `self-hosted*.svg` are neutral project-owned fallback graphics.
|
- `provider*.svg` and `self-hosted*.svg` are neutral project-owned fallback graphics.
|
||||||
- `gwdg.svg`, `openrouter.svg`, `google.svg` and `helmholtz.svg` were created by taking the official logo from their respective websites as images and creating a svg from them.
|
- `gwdg.svg`, `openrouter.svg`, `google.svg` and `helmholtz.svg` were created by taking the official logo from their respective websites as images and creating a svg from them.
|
||||||
|
|||||||
@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g transform="rotate(-5 12 12)"><path d="M4.5 3h15A2.5 2.5 0 0122 5.5v10a2.5 2.5 0 01-2.5 2.5h-8.25L7.5 22v-4h-3A2.5 2.5 0 012 15.5v-10A2.5 2.5 0 014.5 3z" fill="#1A73F5"/><path d="M6.5 7.5l4 2.75-4 2.75" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8"/><path d="M12.5 14.5h4.5" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 487 B |
@ -189,6 +189,8 @@ 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)
|
PERPLEXITY | sonar-pro | CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (unknown) | (unknown) | (unknown)
|
||||||
PERPLEXITY | sonar-reasoning | ALWAYS_REASONING, CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (unknown) | (unknown) | (unknown)
|
PERPLEXITY | sonar-reasoning | ALWAYS_REASONING, CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (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)
|
PERPLEXITY | sonar-reasoning-pro | ALWAYS_REASONING, CHAT_COMPLETION_API, MULTIPLE_IMAGE_INPUT, TEXT_INPUT, TEXT_OUTPUT, WEB_SEARCH | CHAT | (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
|
||||||
|
REQUESTY | google/gemma-4-31b-it | CHAT_COMPLETION_API, FUNCTION_CALLING, MULTIPLE_IMAGE_INPUT, OPTIONAL_REASONING, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown)
|
||||||
SELF_HOSTED | | (nothing) | CHAT | (unknown) | (unknown) | (unknown)
|
SELF_HOSTED | | (nothing) | CHAT | (unknown) | (unknown) | (unknown)
|
||||||
SELF_HOSTED | --- | CHAT_COMPLETION_API, FUNCTION_CALLING, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown)
|
SELF_HOSTED | --- | CHAT_COMPLETION_API, FUNCTION_CALLING, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown)
|
||||||
SELF_HOSTED | 01-ai/yi-large | CHAT_COMPLETION_API, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown)
|
SELF_HOSTED | 01-ai/yi-large | CHAT_COMPLETION_API, TEXT_INPUT, TEXT_OUTPUT | CHAT | (unknown) | (unknown) | (unknown)
|
||||||
|
|||||||
@ -237,6 +237,8 @@ public static class ModelCorpus
|
|||||||
new(LITE_LLM, "azure/gpt-5.6", QUOTED_AS_A_NAME_SHAPE),
|
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, "bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0", NAMED_BY_NO_RULE),
|
||||||
new(LITE_LLM, "the-fast-one", 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),
|
||||||
];
|
];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -2,6 +2,7 @@ using System.Text.Json;
|
|||||||
|
|
||||||
using AIStudio.Provider.Groq;
|
using AIStudio.Provider.Groq;
|
||||||
using AIStudio.Provider.OpenRouter;
|
using AIStudio.Provider.OpenRouter;
|
||||||
|
using AIStudio.Provider.Requesty;
|
||||||
|
|
||||||
using MistralModelsResponse = AIStudio.Provider.Mistral.ModelsResponse;
|
using MistralModelsResponse = AIStudio.Provider.Mistral.ModelsResponse;
|
||||||
using SelfHostedModelsResponse = AIStudio.Provider.SelfHosted.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));
|
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]
|
[Test]
|
||||||
public void MistralStatesTheWindowAsAMaximumLength()
|
public void MistralStatesTheWindowAsAMaximumLength()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -108,7 +108,7 @@ Both are documented for administrators in `documentation/Enterprise IT.md`. Mode
|
|||||||
|
|
||||||
## Live Metadata From The Model Lists
|
## Live Metadata From The Model Lists
|
||||||
|
|
||||||
Some providers state the context window in the model list they answer with anyway. AI Studio reads it where it is there: OpenRouter (`context_length`), Groq (`context_window`), Mistral (`max_context_length`), the Hugging Face router (per inference provider), and any OpenAI-compatible self-hosted engine that fills `max_model_len`, which vLLM does.
|
Some providers state the context window in the model list they answer with anyway. AI Studio reads it where it is there: OpenRouter (`context_length`), Groq (`context_window`), Requesty (`context_window`), Mistral (`max_context_length`), the Hugging Face router (per inference provider), and any OpenAI-compatible self-hosted engine that fills `max_model_len`, which vLLM does.
|
||||||
|
|
||||||
Three things to know when adding another one:
|
Three things to know when adding another one:
|
||||||
|
|
||||||
|
|||||||
@ -31,8 +31,8 @@
|
|||||||
<li>
|
<li>
|
||||||
Independence: You are not tied to any single provider. Choose the providers that best
|
Independence: You are not tied to any single provider. Choose the providers that best
|
||||||
suit your needs, including OpenAI, Perplexity, Mistral, Anthropic, Google Gemini, xAI,
|
suit your needs, including OpenAI, Perplexity, Mistral, Anthropic, Google Gemini, xAI,
|
||||||
DeepSeek, Alibaba Cloud, OpenRouter, Hetzner, IONOS, LiteLLM, Hugging Face, Groq,
|
DeepSeek, Alibaba Cloud, OpenRouter, Hetzner, IONOS, LiteLLM, Requesty, Hugging Face,
|
||||||
Fireworks, Helmholtz, GWDG, and self-hosted models.
|
Groq, Fireworks, Helmholtz, GWDG, and self-hosted models.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Assistants: Use ready-made assistants for common business and other tasks without writing prompts yourself.
|
Assistants: Use ready-made assistants for common business and other tasks without writing prompts yourself.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user