feat(components): add mittwald AI Hosting chat and embedding provider#6646
feat(components): add mittwald AI Hosting chat and embedding provider#6646twiesing wants to merge 2 commits into
Conversation
Add an OpenAI-compatible provider for mittwald AI Hosting: - ChatMittwald chat model node - MittwaldEmbedding embedding node - shared mittwaldAIHostingApi credential (API key) - model lists in models.json (chat + embedding) Models are loaded via the standard models.json mechanism, matching the other providers. The base URL defaults to the public AI Hosting endpoint and can be overridden per node.
There was a problem hiding this comment.
Code Review
This pull request introduces integration with mittwald AI Hosting, adding a new credential, a chat model node, an embedding node, and updating the models configuration. The review feedback suggests correcting a potential typo in a model name ('Ministral' vs 'Mistral') and adding validation when parsing the temperature input to prevent assigning NaN to the model configuration.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| "label": "Ministral-3-14B-Instruct-2512", | ||
| "name": "Ministral-3-14B-Instruct-2512" |
There was a problem hiding this comment.
There seems to be a typo in the model name. Ministral should likely be Mistral. Using an incorrect model name will cause API requests to fail.
| "label": "Ministral-3-14B-Instruct-2512", | |
| "name": "Ministral-3-14B-Instruct-2512" | |
| "label": "Mistral-3-14B-Instruct-2512", | |
| "name": "Mistral-3-14B-Instruct-2512" |
| const obj: ChatOpenAIFields = { | ||
| temperature: parseFloat(temperature), | ||
| model: modelName, | ||
| apiKey: mittwaldApiKey, | ||
| streaming: streaming ?? true | ||
| } |
There was a problem hiding this comment.
The temperature is initialized directly with parseFloat. If the temperature input is empty or invalid, this will result in NaN, which can cause runtime errors. It's safer to parse and validate the value before assigning it to the ChatOpenAI object, only setting it if it's a valid number.
| const obj: ChatOpenAIFields = { | |
| temperature: parseFloat(temperature), | |
| model: modelName, | |
| apiKey: mittwaldApiKey, | |
| streaming: streaming ?? true | |
| } | |
| const obj: ChatOpenAIFields = { | |
| model: modelName, | |
| apiKey: mittwaldApiKey, | |
| streaming: streaming ?? true | |
| }; | |
| const temp = parseFloat(temperature); | |
| if (!isNaN(temp)) obj.temperature = temp; |
Summary
Adds an OpenAI-compatible provider for mittwald AI Hosting:
type: 'password')models.jsonfor bothchatandembeddingDetails
/v1/chat/completions,/v1/embeddings,/v1/models), so both nodes wrapChatOpenAI/OpenAIEmbeddingsfrom@langchain/openai, following the existing Cerebras/Sambanova pattern.models.jsonmechanism (getModels), consistent with the other providers rather than a live API fetch.https://llm.aihosting.mittwald.de/v1and can be overridden per node via the Base Path field.checkDenyListis applied to the base URL in both nodes, matching the SSRF hardening used by ChatOpenAICustom / Ollama / LocalAI.Testing
pnpm --filter flowise-components build(tsc) passeseslint --max-warnings 0clean on the new filesprettier --checkclean