[I] [BUG] Missing Model–Provider Compatibility Validation [hertzbeat]</span></a></span> </h1> <p class="darkgray font13"> <span class="sender pipe"><a href="/search?l=notifications@hertzbeat.apache.org&q=from:%22via+GitHub%22" rel="nofollow"><span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">via GitHub</span></span></a></span> <span class="date"><a href="/search?l=notifications@hertzbeat.apache.org&q=date:20260120" rel="nofollow">Tue, 20 Jan 2026 03:24:17 -0800</a></span> </p> </div> <div itemprop="articleBody" class="msgBody"> <!--X-Body-of-Message--> <pre> Naman-870 opened a new issue, #3991: URL: <a rel="nofollow" href="https://github.com/apache/hertzbeat/issues/3991">https://github.com/apache/hertzbeat/issues/3991</a></pre><pre> ### Is there an existing issue for this? - [x] I have searched the existing issues ### Current Behavior HertzBeat AI is configured with: AI Provider: DeepSeek Base URL: <a rel="nofollow" href="https://api.deepseek.com/v1">https://api.deepseek.com/v1</a> Model: deepseek-reasoner Valid API Key Backend logs show repeated errors: 400 Bad Request from POST <a rel="nofollow" href="https://api.deepseek.com/v1/chat/completions">https://api.deepseek.com/v1/chat/completions</a> org.springframework.ai.chat.model.MessageAggregator - Aggregation Error No actionable error message is returned to the user: The response body from DeepSeek is not logged The root cause (invalid request schema / unsupported model) is hidden HertzBeat allows selecting deepseek-reasoner even though it is not fully compatible with the current Spring AI chat request format. ### Expected Behavior HertzBeat should validate model–provider compatibility before sending requests: Incompatible models (e.g., deepseek-reasoner) should be blocked or warned about Supported models (e.g., deepseek-chat) should work without errors. If an incompatible model is selected: HertzBeat should fail gracefully with a clear message, such as: ### Steps To Reproduce Deploy or run HertzBeat v1.8.0. Open the HertzBeat Web UI. Navigate to Settings → AI Assistant (or AI Provider configuration page). Configure the AI provider with the following values: Provider: DeepSeek Base URL: <a rel="nofollow" href="https://api.deepseek.com/v1">https://api.deepseek.com/v1</a> API Key: (valid DeepSeek API key) Model: deepseek-reasoner Save the configuration. Open the AI Assistant / Chatbot in the UI. Enter any prompt (for example: Hello or Test message). ### Environment ```markdown HertzBeat version(s): v1.8.0 AI Integration: HertzBeat AI Assistant (Spring AI based) AI Provider: DeepSeek Model: deepseek-reasoner API Base URL: <a rel="nofollow" href="https://api.deepseek.com/v1">https://api.deepseek.com/v1</a> Deployment Mode: Standalone / Docker (choose one if needed) Backend Runtime: Java 17 Spring Boot (Reactive WebClient) Frontend: HertzBeat Web UI Operating System: Linux (or your actual OS if different) Network: Direct internet access (no proxy) Control Environment (Working Configuration) AI Provider: DeepSeek Model: deepseek-chat Result: Works as expected If you want, I can: Adjust this to match Docker / Kubernetes specifically Shorten it to a minimal issue template Add log level / debug flags Just say 👍 ``` ### Debug logs 2026-01-15 10:59:54 [reactor-http-epoll-6] ERROR org.springframework.ai.chat.model.MessageAggregator - Aggregation Error 2026-01-15T10:59:54.454975323+08:00 org.springframework.web.reactive.function.client.WebClientResponseException$BadRequest: 400 Bad Request from POST <a rel="nofollow" href="https://api.deepseek.com/v1/chat/completions">https://api.deepseek.com/v1/chat/completions</a> 2026-01-15T10:59:54.454980895+08:00 at org.springframework.web.reactive.function.client.WebClientResponseException.create(WebClientResponseException.java:321) 2026-01-15T10:59:54.454984579+08:00 Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 2026-01-15T10:59:54.454988119+08:00 Error has been observed at the following site(s): 2026-01-15T10:59:54.454993791+08:00 *__checkpoint ⇢ 400 BAD_REQUEST from POST <a rel="nofollow" href="https://api.deepseek.com/v1/chat/completions">https://api.deepseek.com/v1/chat/completions</a> [DefaultWebClient] 2026-01-15T10:59:54.454997134+08:00 Original Stack Trace: 2026-01-15T10:59:54.455000107+08:00 at org.springframework.web.reactive.function.client.WebClientResponseException.create(WebClientResponseException.java:321) 2026-01-15T10:59:54.455004059+08:00 at org.springframework.web.reactive.function.client.DefaultClientResponse.lambda$createException$1(DefaultClientResponse.java:214) 2026-01-15T10:59:54.455009769+08:00 at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106) 2026-01-15T10:59:54.455013059+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455017461+08:00 at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162) 2026-01-15T10:59:54.455021209+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455024290+08:00 at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:122) 2026-01-15T10:59:54.455027221+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455030505+08:00 at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137) 2026-01-15T10:59:54.455033460+08:00 at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129) 2026-01-15T10:59:54.455036399+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455039333+08:00 at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137) 2026-01-15T10:59:54.455047352+08:00 at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) 2026-01-15T10:59:54.455050492+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455094141+08:00 at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137) 2026-01-15T10:59:54.455097479+08:00 at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129) 2026-01-15T10:59:54.455100441+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455103420+08:00 at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137) 2026-01-15T10:59:54.455106315+08:00 at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:118) 2026-01-15T10:59:54.455109264+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onNext(TracingSubscriber.java:68) 2026-01-15T10:59:54.455112217+08:00 at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137) 2026-01-15T10:59:54.455115304+08:00 at reactor.core.publisher.Operators$BaseFluxToMonoOperator.completePossiblyEmpty(Operators.java:2097) 2026-01-15T10:59:54.455118507+08:00 at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:145) 2026-01-15T10:59:54.455121434+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onComplete(TracingSubscriber.java:92) 2026-01-15T10:59:54.455124791+08:00 at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) 2026-01-15T10:59:54.455127657+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onComplete(TracingSubscriber.java:92) 2026-01-15T10:59:54.455130597+08:00 at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260) 2026-01-15T10:59:54.455133667+08:00 at io.opentelemetry.instrumentation.reactor.v3_1.TracingSubscriber.onComplete(TracingSubscriber.java:92) 2026-01-15T10:59:54.455136638+08:00 at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) 2026-01-15T10:59:54.455139612+08:00 at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:413) 2026-01-15T10:59:54.455142561+08:00 at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:455) 2026-01-15T10:59:54.455145454+08:00 at reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:509) 2026-01-15T10:59:54.455148455+08:00 at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:819) ### Anything else? Observed Behavior When Switching Model Model deepseek-chat works fine Model deepseek-reasoner fails with 400 This confirms the issue is model compatibility, not API key or URL. Possible Root Cause (Optional but Helpful) You can add this to help maintainers quickly understand the issue: Possible root cause: HertzBeat uses Spring AI’s OpenAI-style chat request schema. DeepSeek deepseek-reasoner model expects a different request format and rejects the request, resulting in 400 Bad Request. Spring AI Message Aggregator may generate unsupported fields. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@hertzbeat.apache.org.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@hertzbeat.apache.org For additional commands, e-mail: notifications-h...@hertzbeat.apache.org </pre> </div> <div class="msgButtons margintopdouble"> <ul class="overflow"> <li class="msgButtonItems"><a class="button buttonleft " accesskey="p" href="msg15242.html">Previous message</a></li> <li class="msgButtonItems textaligncenter"><a class="button" accesskey="c" href="index.html#15246">View by thread</a></li> <li class="msgButtonItems textaligncenter"><a class="button" accesskey="i" href="maillist.html#15246">View by date</a></li> <li class="msgButtonItems textalignright"><a class="button buttonright " accesskey="n" href="msg15331.html">Next message</a></li> </ul> </div> <a name="tslice"></a> <div class="tSliceList margintopdouble"> <ul class="icons monospace"> <li class="icons-email tSliceCur"><span class="subject">[I] [BUG] <title>Missing Model–Provider Compatibility Val...</span> <span class="sender italic">via GitHub</span></li> <li><ul> <li class="icons-email"><span class="subject"><a href="msg15331.html">Re: [I] [BUG] <title>Missing Model–Provider Compatib...</a></span> <span class="sender italic">via GitHub</span></li> <li class="icons-email"><span class="subject"><a href="msg15333.html">Re: [I] [BUG] <title>Missing Model–Provider Compatib...</a></span> <span class="sender italic">via GitHub</span></li> <li class="icons-email"><span class="subject"><a href="msg15339.html">Re: [I] [BUG] <title>Missing Model–Provider Compatib...</a></span> <span class="sender italic">via GitHub</span></li> <li class="icons-email"><span class="subject"><a href="msg15340.html">Re: [I] [BUG] <title>Missing Model–Provider Compatib...</a></span> <span class="sender italic">via GitHub</span></li> </ul> </ul> </div> <div class="overflow msgActions margintopdouble"> <div class="msgReply" > <h2> Reply via email to </h2> <form method="POST" action="/mailto.php"> <input type="hidden" name="subject" value="[I] [BUG] <title>Missing Model–Provider Compatibility Validation [hertzbeat]"> <input type="hidden" name="msgid" value="I_kwDOGyeqAs7ke0u4@gitbox.apache.org"> <input type="hidden" name="relpath" value="notifications@hertzbeat.apache.org/msg15246.html"> <input type="submit" value=" via GitHub "> </form> </div> </div> </div> <div class="aside" role="complementary"> <div class="logo"> <a href="/"><img src="/logo.png" width=247 height=88 alt="The Mail Archive"></a> </div> <form class="overflow" action="/search" method="get"> <input type="hidden" name="l" value="notifications@hertzbeat.apache.org"> <label class="hidden" for="q">Search the site</label> <input class="submittext" type="text" id="q" name="q" placeholder="Search notifications"> <input class="submitbutton" name="submit" type="image" src="/submit.png" alt="Submit"> </form> <div class="nav margintop" id="nav" role="navigation"> <ul class="icons font16"> <li class="icons-home"><a href="/">The Mail Archive home</a></li> <li class="icons-list"><a href="/notifications@hertzbeat.apache.org/">notifications - all messages</a></li> <li class="icons-about"><a href="/notifications@hertzbeat.apache.org/info.html">notifications - about the list</a></li> <li class="icons-expand"><a href="/search?l=notifications@hertzbeat.apache.org&q=subject:%22%5C%5BI%5C%5D+%5C%5BBUG%5C%5D+%3Ctitle%3EMissing+Model%E2%80%93Provider+Compatibility+Validation+%5C%5Bhertzbeat%5C%5D%22&o=newest&f=1" title="e" id="e">Expand</a></li> <li class="icons-prev"><a href="msg15242.html" title="p">Previous message</a></li> <li class="icons-next"><a href="msg15331.html" title="n">Next message</a></li> </ul> </div> <div class="listlogo margintopdouble"> </div> <div class="margintopdouble"> </div> </div> </div> <div class="footer" role="contentinfo"> <ul> <li><a href="/">The Mail Archive home</a></li> <li><a href="/faq.html#newlist">Add your mailing list</a></li> <li><a href="/faq.html">FAQ</a></li> <li><a href="/faq.html#support">Support</a></li> <li><a href="/faq.html#privacy">Privacy</a></li> <li class="darkgray">I_kwDOGyeqAs7ke0u4@gitbox.apache.org</li> </ul> </div> </body> </html> <script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9ec07029da0e983d',t:'MTc3NjE0NTg4MA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>