hermes - 💡(How to fix) Fix [Bug]: Bug Report: Hermes Desktop — HTTP 307 on DeepSeek API Calls

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Error Message

Log Evidence From %LOCALAPPDATA%\hermes\logs\desktop.log: ⚠️ API call failed (attempt 1/3): APIStatusError [HTTP 307] 🔌 Provider: deepseek Model: deepseek-v4-pro 🌐 Endpoint: http://api.deepseek.com/v1 ← NOTE: http://, not https:// 📝 Error: HTTP 307 — 307 Temporary Redirect 📋 Details: <html>

<head><title>307 Temporary Redirect</title></head> <body> <center><h1>307 Temporary Redirect</h1></center> <hr><center>CloudFront</center> </body> </html> ⏱️ Elapsed: 0.67s Context: 2 msgs, ~3,983 tokens ⏳ Retrying in 2.7s (attempt 1/3)... [... same error repeats for attempts 2/3 and 3/3 ...] ❌ API failed after 3 retries — HTTP 307 — 307 Temporary Redirect PS C:\Users\Administrator\.hermes> hermes debug share ⚠️ This will upload the following to a public paste service: • System info (OS, Python version, Hermes version, provider, which API keys are configured — NOT the actual keys) • Recent log lines (agent.log, errors.log, gateway.log — may contain conversation fragments and file paths) • Full agent.log and gateway.log (up to 512 KB each — likely contains conversation content, tool outputs, and file paths)

Pastes auto-delete after 6 hours.

Collecting debug report... Uploading...

Debug report uploaded: Report https://paste.rs/uMs1L agent.log https://dpaste.com/GKB7T9US3 gateway.log https://dpaste.com/8C9S9KGEK

⏱ Pastes will auto-delete in 6 hours. To delete now: hermes debug delete <url>

Share these links with the Hermes team for support. PS C:\Users\Administrator.hermes>

Root Cause

</div> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Steps to Reproduce</h2> <ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">Install Hermes Desktop from <a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://hermes-agent.nousresearch.com/desktop">https://hermes-agent.nousresearch.com/desktop</a></li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Configure the DeepSeek provider in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/.hermes/config.yaml</code> with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url: https://api.deepseek.com/v1</code></li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Launch the desktop app</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Send any message</li> </ol> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Expected:</strong> Successful API response from DeepSeek<br> <strong>Actual:</strong> Fails with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">HTTP 307 Temporary Redirect</code> after 3 retries</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Log Evidence</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">From <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">%LOCALAPPDATA%\hermes\logs\desktop.log</code>:</p> <div role="group" aria-label="Code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre-wrap;"><span><span>⚠️ API call failed (attempt 1/3): APIStatusError [HTTP 307] </span></span><span> 🔌 Provider: deepseek Model: deepseek-v4-pro </span><span> 🌐 Endpoint: http://api.deepseek.com/v1 ← NOTE: http://, not https:// </span><span> 📝 Error: HTTP 307 — 307 Temporary Redirect </span><span> 📋 Details: &lt;html&gt; </span><span>&lt;head&gt;&lt;title&gt;307 Temporary Redirect&lt;/title&gt;&lt;/head&gt; </span><span>&lt;body&gt; </span><span>&lt;center&gt;&lt;h1&gt;307 Temporary Redirect&lt;/h1&gt;&lt;/center&gt; </span><span>&lt;hr&gt;&lt;center&gt;CloudFront&lt;/center&gt; </span><span>&lt;/body&gt; </span><span>&lt;/html&gt; </span><span> ⏱️ Elapsed: 0.67s Context: 2 msgs, ~3,983 tokens </span><span>⏳ Retrying in 2.7s (attempt 1/3)... </span><span>[... same error repeats for attempts 2/3 and 3/3 ...] </span><span>❌ API failed after 3 retries — HTTP 307 — 307 Temporary Redirect</span></code></pre></div></div> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Config (at time of failure)</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">C:\Users\Administrator\.hermes\config.yaml</code> (relevant section):</p> <div role="group" aria-label="yaml code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">yaml</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-yaml" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span class="token token key" style="color: rgb(129, 0, 194);">custom_providers</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">name</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> deepseek </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">base_url</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> https</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span>//api.deepseek.com/v1 ← correctly set to https</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span>// </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">api_key</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> sk</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>c727b201</span><span class="token token" style="color: rgb(43, 48, 59);">...</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">api_mode</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> chat_completions </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">models</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">deepseek-v4-pro</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">context_length</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">1000000</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">name</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> DeepSeek V4 Pro </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">model</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> deepseek</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>v4</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>pro</span></span></code></pre></div></div> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The config clearly specifies <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code>, but the desktop app is sending requests to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code>.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Verification: Direct API Call Works</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Direct Python test using the same venv as the desktop app:</p> <div role="group" aria-label="python code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">python</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-python" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span class="token token" style="color: rgb(129, 0, 194);">import</span><span> httpx </span></span><span><span>r </span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span> httpx</span><span class="token token" style="color: rgb(43, 48, 59);">.</span><span>post</span><span class="token token" style="color: rgb(43, 48, 59);">(</span><span> </span></span><span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'https://api.deepseek.com/v1/chat/completions'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> headers</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'Authorization'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'Bearer sk-c727b2...'</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> json</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'model'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'deepseek-chat'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'messages'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">[</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'role'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'user'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'content'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'hi'</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">]</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'max_tokens'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">10</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> follow_redirects</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(0, 128, 128);">True</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(43, 48, 59);">)</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(129, 0, 194);">print</span><span class="token token" style="color: rgb(43, 48, 59);">(</span><span>r</span><span class="token token" style="color: rgb(43, 48, 59);">.</span><span>status_code</span><span class="token token" style="color: rgb(43, 48, 59);">)</span><span> </span><span class="token token" style="color: rgb(110, 118, 135);"># → 200</span></span></code></pre></div></div> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Result: 200 OK</strong> — confirms the API key, network, and endpoint are all correct.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Root Cause Analysis</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The desktop app appears to be stripping the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code> scheme and substituting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> when building the endpoint URL before passing it to the httpx client. This is NOT a config issue — the config is correct. The bug is in how the desktop app (likely the Electron layer) processes or serialises the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url</code> value before handing it to the Python backend.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Neither the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">plugins/model-providers/deepseek/__init__.py</code> nor any <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.py</code> file in the install path contains a hardcoded <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://api.deepseek.com</code>, ruling out a Python-side hardcoding issue.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Additionally, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">httpx</code> does not follow <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">307</code> redirects by default (unlike <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">requests</code>), so even if DeepSeek's CDN redirects <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> → <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code>, the client fails rather than following the redirect.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Workaround</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Setting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> on the httpx client would handle the symptom, but the root cause (scheme being stripped to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code>) should be fixed in the app layer.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The CLI version works correctly with the same config and Python backend.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Related Issues</h2> <ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">Issue #19337 — MiniMax OAuth <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">verification_uri</code> returning 307 (similar httpx redirect problem)</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Issue #19336 — <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">hermes setup</code> silently skips on MiniMax OAuth failure</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">PR #19335 (closed) — original <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> fix attempt</li> </ul> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> fix in PR #19335 would partially address the symptom, but the scheme downgrade from <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code> to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> in the desktop app is a separate and more fundamental issue.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Additional Notes</h2> <ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">The Web UI (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://127.0.0.1:9120</code>) also does not function: returns <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">error: "Frontend not built. Run: cd web &amp;&amp; npm run build"</code>, suggesting the desktop app bundle is missing the pre-built frontend assets.</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">The CLI version (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">hermes chat</code>) with the same config works correctly after setting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">model.provider: deepseek</code>.</li></ul><!--EndFragment--> </body> </html>

Fix Action

Fix / Workaround

</div> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Steps to Reproduce</h2> <ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">Install Hermes Desktop from <a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://hermes-agent.nousresearch.com/desktop">https://hermes-agent.nousresearch.com/desktop</a></li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Configure the DeepSeek provider in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/.hermes/config.yaml</code> with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url: https://api.deepseek.com/v1</code></li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Launch the desktop app</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Send any message</li> </ol> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Expected:</strong> Successful API response from DeepSeek<br> <strong>Actual:</strong> Fails with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">HTTP 307 Temporary Redirect</code> after 3 retries</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Log Evidence</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">From <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">%LOCALAPPDATA%\hermes\logs\desktop.log</code>:</p> <div role="group" aria-label="Code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre-wrap;"><span><span>⚠️ API call failed (attempt 1/3): APIStatusError [HTTP 307] </span></span><span> 🔌 Provider: deepseek Model: deepseek-v4-pro </span><span> 🌐 Endpoint: http://api.deepseek.com/v1 ← NOTE: http://, not https:// </span><span> 📝 Error: HTTP 307 — 307 Temporary Redirect </span><span> 📋 Details: &lt;html&gt; </span><span>&lt;head&gt;&lt;title&gt;307 Temporary Redirect&lt;/title&gt;&lt;/head&gt; </span><span>&lt;body&gt; </span><span>&lt;center&gt;&lt;h1&gt;307 Temporary Redirect&lt;/h1&gt;&lt;/center&gt; </span><span>&lt;hr&gt;&lt;center&gt;CloudFront&lt;/center&gt; </span><span>&lt;/body&gt; </span><span>&lt;/html&gt; </span><span> ⏱️ Elapsed: 0.67s Context: 2 msgs, ~3,983 tokens </span><span>⏳ Retrying in 2.7s (attempt 1/3)... </span><span>[... same error repeats for attempts 2/3 and 3/3 ...] </span><span>❌ API failed after 3 retries — HTTP 307 — 307 Temporary Redirect</span></code></pre></div></div> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Config (at time of failure)</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">C:\Users\Administrator\.hermes\config.yaml</code> (relevant section):</p> <div role="group" aria-label="yaml code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">yaml</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-yaml" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span class="token token key" style="color: rgb(129, 0, 194);">custom_providers</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">name</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> deepseek </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">base_url</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> https</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span>//api.deepseek.com/v1 ← correctly set to https</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span>// </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">api_key</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> sk</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>c727b201</span><span class="token token" style="color: rgb(43, 48, 59);">...</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">api_mode</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> chat_completions </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">models</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">deepseek-v4-pro</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">context_length</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">1000000</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">name</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> DeepSeek V4 Pro </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">model</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> deepseek</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>v4</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>pro</span></span></code></pre></div></div> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The config clearly specifies <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code>, but the desktop app is sending requests to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code>.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Verification: Direct API Call Works</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Direct Python test using the same venv as the desktop app:</p> <div role="group" aria-label="python code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">python</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-python" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span class="token token" style="color: rgb(129, 0, 194);">import</span><span> httpx </span></span><span><span>r </span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span> httpx</span><span class="token token" style="color: rgb(43, 48, 59);">.</span><span>post</span><span class="token token" style="color: rgb(43, 48, 59);">(</span><span> </span></span><span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'https://api.deepseek.com/v1/chat/completions'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> headers</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'Authorization'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'Bearer sk-c727b2...'</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> json</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'model'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'deepseek-chat'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'messages'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">[</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'role'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'user'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'content'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'hi'</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">]</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'max_tokens'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">10</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> follow_redirects</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(0, 128, 128);">True</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(43, 48, 59);">)</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(129, 0, 194);">print</span><span class="token token" style="color: rgb(43, 48, 59);">(</span><span>r</span><span class="token token" style="color: rgb(43, 48, 59);">.</span><span>status_code</span><span class="token token" style="color: rgb(43, 48, 59);">)</span><span> </span><span class="token token" style="color: rgb(110, 118, 135);"># → 200</span></span></code></pre></div></div> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Result: 200 OK</strong> — confirms the API key, network, and endpoint are all correct.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Root Cause Analysis</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The desktop app appears to be stripping the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code> scheme and substituting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> when building the endpoint URL before passing it to the httpx client. This is NOT a config issue — the config is correct. The bug is in how the desktop app (likely the Electron layer) processes or serialises the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url</code> value before handing it to the Python backend.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Neither the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">plugins/model-providers/deepseek/__init__.py</code> nor any <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.py</code> file in the install path contains a hardcoded <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://api.deepseek.com</code>, ruling out a Python-side hardcoding issue.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Additionally, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">httpx</code> does not follow <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">307</code> redirects by default (unlike <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">requests</code>), so even if DeepSeek's CDN redirects <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> → <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code>, the client fails rather than following the redirect.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Workaround</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Setting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> on the httpx client would handle the symptom, but the root cause (scheme being stripped to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code>) should be fixed in the app layer.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The CLI version works correctly with the same config and Python backend.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Related Issues</h2> <ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">Issue #19337 — MiniMax OAuth <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">verification_uri</code> returning 307 (similar httpx redirect problem)</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Issue #19336 — <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">hermes setup</code> silently skips on MiniMax OAuth failure</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">PR #19335 (closed) — original <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> fix attempt</li> </ul> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> fix in PR #19335 would partially address the symptom, but the scheme downgrade from <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code> to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> in the desktop app is a separate and more fundamental issue.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Additional Notes</h2> <ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">The Web UI (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://127.0.0.1:9120</code>) also does not function: returns <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">error: "Frontend not built. Run: cd web &amp;&amp; npm run build"</code>, suggesting the desktop app bundle is missing the pre-built frontend assets.</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">The CLI version (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">hermes chat</code>) with the same config works correctly after setting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">model.provider: deepseek</code>.</li></ul><!--EndFragment--> </body> </html>

Workaround Setting follow_redirects=True on the httpx client would handle the symptom, but the root cause (scheme being stripped to http://) should be fixed in the app layer. The CLI version works correctly with the same config and Python backend.

Code Example

Log Evidence
From %LOCALAPPDATA%\hermes\logs\desktop.log:
⚠️  API call failed (attempt 1/3): APIStatusError [HTTP 307]
   🔌 Provider: deepseek  Model: deepseek-v4-pro
   🌐 Endpoint: http://api.deepseek.com/v1        ← NOTE: http://, not https://
   📝 Error: HTTP 307307 Temporary Redirect
   📋 Details: <html>
<head><title>307 Temporary Redirect</title></head>
<body>
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
   ⏱️  Elapsed: 0.67s  Context: 2 msgs, ~3,983 tokens
Retrying in 2.7s (attempt 1/3)...
[... same error repeats for attempts 2/3 and 3/3 ...]
API failed after 3 retries — HTTP 307307 Temporary Redirect
PS C:\Users\Administrator\.hermes> hermes debug share
⚠️  This will upload the following to a public paste service:
System info (OS, Python version, Hermes version, provider, which API keys
    are configured — NOT the actual keys)
Recent log lines (agent.log, errors.log, gateway.log — may contain
    conversation fragments and file paths)
Full agent.log and gateway.log (up to 512 KB each — likely contains
    conversation content, tool outputs, and file paths)

Pastes auto-delete after 6 hours.

Collecting debug report...
Uploading...

Debug report uploaded:
  Report       https://paste.rs/uMs1L
  agent.log    https://dpaste.com/GKB7T9US3
  gateway.log  https://dpaste.com/8C9S9KGEK

Pastes will auto-delete in 6 hours.
To delete now:  hermes debug delete <url>

Share these links with the Hermes team for support.
PS C:\Users\Administrator\.hermes>

---

Config (at time of failure)
C:\Users\Administrator\.hermes\config.yaml (relevant section):
yamlcustom_providers:
- name: deepseek
  base_url: https://api.deepseek.com/v1      ← correctly set to https://
  api_key: sk-c727b201...
  api_mode: chat_completions
  models:
    deepseek-v4-pro:
      context_length: 1000000
      name: DeepSeek V4 Pro
  model: deepseek-v4-pro
The config clearly specifies https://, but the desktop app is sending requests to http://.

Verification: Direct API Call Works
Direct Python test using the same venv as the desktop app:
pythonimport httpx
r = httpx.post(
    'https://api.deepseek.com/v1/chat/completions',
    headers={'Authorization': 'Bearer sk-c727b2...'},
    json={'model': 'deepseek-chat', 'messages': [{'role': 'user', 'content': 'hi'}], 'max_tokens': 10},
    follow_redirects=True
)
print(r.status_code)  # → 200
Result: 200 OK — confirms the API key, network, and endpoint are all correct.

Root Cause Analysis
The desktop app appears to be stripping the https:// scheme and substituting http:// when building the endpoint URL before passing it to the httpx client. This is NOT a config issue — the config is correct. The bug is in how the desktop app (likely the Electron layer) processes or serialises the base_url value before handing it to the Python backend.
Neither the plugins/model-providers/deepseek/__init__.py nor any .py file in the install path contains a hardcoded http://api.deepseek.com, ruling out a Python-side hardcoding issue.
Additionally, httpx does not follow 307 redirects by default (unlike requests), so even if DeepSeek's CDN redirects http:// → https://, the client fails rather than following the redirect.

Workaround
Setting follow_redirects=True on the httpx client would handle the symptom, but the root cause (scheme being stripped to http://) should be fixed in the app layer.
The CLI version works correctly with the same config and Python backend.

Related Issues

Issue #19337MiniMax OAuth verification_uri returning 307 (similar httpx redirect problem)
Issue #19336 — hermes setup silently skips on MiniMax OAuth failure
PR #19335 (closed) — original follow_redirects=True fix attempt

The follow_redirects=True fix in PR #19335 would partially address the symptom, but the scheme downgrade from https:// to http:// in the desktop app is a separate and more fundamental issue.

Additional Notes

The Web UI (http://127.0.0.1:9120) also does not function: returns error: "Frontend not built. Run: cd web && npm run build", suggesting the desktop app bundle is missing the pre-built frontend assets.
The CLI version (hermes chat) with the same config works correctly after setting model.provider: deepseek.
RAW_BUFFERClick to expand / collapse

Bug Description

<html> <body> <!--StartFragment--><p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Product:</strong> Hermes Desktop (Official Desktop App)<br> <strong>Version:</strong> v0.15.1 (2026.5.29) · upstream 3278b423<br> <strong>Platform:</strong> Windows 11, x64<br> <strong>Date:</strong> 2026-06-05<br> <strong>Severity:</strong> High — DeepSeek provider completely non-functional in desktop app</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Summary</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">When using the DeepSeek provider via the official Hermes Desktop app, all API calls fail with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">HTTP 307 Temporary Redirect</code>. The <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url</code> in the desktop app log shows <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://api.deepseek.com/v1</code> (HTTP, not HTTPS), even though the user's config correctly specifies <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://api.deepseek.com/v1</code>. CloudFront (DeepSeek's CDN) redirects all plain HTTP requests to HTTPS, but the httpx client does not follow the redirect, causing all calls to fail after 3 retries.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The same config works correctly in the CLI version and via direct Python/httpx calls.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Environment</h2> <div class="overflow-x-auto w-full px-2 mb-6"> Item | Value -- | -- OS | Windows 11 (win32) Python | 3.11.6 Hermes version | v0.15.1 (2026.5.29) Desktop app install path | C:\Users\Administrator\AppData\Local\hermes\ Config path | C:\Users\Administrator\.hermes\config.yaml Provider | deepseek (custom_providers) Model | deepseek-v4-pro </div> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Steps to Reproduce</h2> <ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">Install Hermes Desktop from <a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://hermes-agent.nousresearch.com/desktop">https://hermes-agent.nousresearch.com/desktop</a></li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Configure the DeepSeek provider in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/.hermes/config.yaml</code> with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url: https://api.deepseek.com/v1</code></li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Launch the desktop app</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Send any message</li> </ol> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Expected:</strong> Successful API response from DeepSeek<br> <strong>Actual:</strong> Fails with <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">HTTP 307 Temporary Redirect</code> after 3 retries</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Log Evidence</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">From <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">%LOCALAPPDATA%\hermes\logs\desktop.log</code>:</p> <div role="group" aria-label="Code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre-wrap;"><span><span>⚠️ API call failed (attempt 1/3): APIStatusError [HTTP 307] </span></span><span> 🔌 Provider: deepseek Model: deepseek-v4-pro </span><span> 🌐 Endpoint: http://api.deepseek.com/v1 ← NOTE: http://, not https:// </span><span> 📝 Error: HTTP 307 — 307 Temporary Redirect </span><span> 📋 Details: &lt;html&gt; </span><span>&lt;head&gt;&lt;title&gt;307 Temporary Redirect&lt;/title&gt;&lt;/head&gt; </span><span>&lt;body&gt; </span><span>&lt;center&gt;&lt;h1&gt;307 Temporary Redirect&lt;/h1&gt;&lt;/center&gt; </span><span>&lt;hr&gt;&lt;center&gt;CloudFront&lt;/center&gt; </span><span>&lt;/body&gt; </span><span>&lt;/html&gt; </span><span> ⏱️ Elapsed: 0.67s Context: 2 msgs, ~3,983 tokens </span><span>⏳ Retrying in 2.7s (attempt 1/3)... </span><span>[... same error repeats for attempts 2/3 and 3/3 ...] </span><span>❌ API failed after 3 retries — HTTP 307 — 307 Temporary Redirect</span></code></pre></div></div> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Config (at time of failure)</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">C:\Users\Administrator\.hermes\config.yaml</code> (relevant section):</p> <div role="group" aria-label="yaml code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">yaml</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-yaml" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span class="token token key" style="color: rgb(129, 0, 194);">custom_providers</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">name</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> deepseek </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">base_url</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> https</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span>//api.deepseek.com/v1 ← correctly set to https</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span>// </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">api_key</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> sk</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>c727b201</span><span class="token token" style="color: rgb(43, 48, 59);">...</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">api_mode</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> chat_completions </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">models</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">deepseek-v4-pro</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">context_length</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">1000000</span><span> </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">name</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> DeepSeek V4 Pro </span></span><span><span> </span><span class="token token key" style="color: rgb(129, 0, 194);">model</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> deepseek</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>v4</span><span class="token token" style="color: rgb(43, 48, 59);">-</span><span>pro</span></span></code></pre></div></div> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The config clearly specifies <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code>, but the desktop app is sending requests to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code>.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Verification: Direct API Call Works</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Direct Python test using the same venv as the desktop app:</p> <div role="group" aria-label="python code" tabindex="0" class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100"><div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><button class="inline-flex items-center justify-center relative isolate shrink-0 can-focus select-none disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none border-transparent transition font-base duration-300 ease-[cubic-bezier(0.165,0.85,0.45,1)] h-8 w-8 rounded-md backdrop-blur-md _fill_10ocf_9 _ghost_10ocf_96" type="button" aria-label="Copy to clipboard" data-state="closed"><div class="relative"><div class="transition-all opacity-100 scale-100" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-100 scale-100" aria-hidden="true" style="flex-shrink: 0;"><path d="M12.5 3A1.5 1.5 0 0 1 14 4.5V6h1.5A1.5 1.5 0 0 1 17 7.5v8a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 6 15.5V14H4.5A1.5 1.5 0 0 1 3 12.5v-8A1.5 1.5 0 0 1 4.5 3zm1.5 9.5a1.5 1.5 0 0 1-1.5 1.5H7v1.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5H14zM4.5 4a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5z"></path></svg></div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50" style="width: 20px; height: 20px; display: flex; align-items: center; justify-content: center;"><svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="transition-all opacity-0 scale-50" aria-hidden="true" style="flex-shrink: 0;"><path d="M15.188 5.11a.5.5 0 0 1 .752.626l-.056.084-7.5 9a.5.5 0 0 1-.738.033l-3.5-3.5-.064-.078a.501.501 0 0 1 .693-.693l.078.064 3.113 3.113 7.15-8.58z"></path></svg></div></div></div></button></div></div><div class="text-text-500 font-small p-3.5 pb-0">python</div><div class="overflow-x-auto"><pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono);"><code class="language-python" style="color: rgb(20, 24, 31); background: transparent; font-family: var(--font-mono); white-space: pre;"><span><span class="token token" style="color: rgb(129, 0, 194);">import</span><span> httpx </span></span><span><span>r </span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span> httpx</span><span class="token token" style="color: rgb(43, 48, 59);">.</span><span>post</span><span class="token token" style="color: rgb(43, 48, 59);">(</span><span> </span></span><span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'https://api.deepseek.com/v1/chat/completions'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> headers</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'Authorization'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'Bearer sk-c727b2...'</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> json</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'model'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'deepseek-chat'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'messages'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(43, 48, 59);">[</span><span class="token token" style="color: rgb(43, 48, 59);">{</span><span class="token token" style="color: rgb(0, 128, 0);">'role'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'user'</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'content'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'hi'</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">]</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span><span class="token token" style="color: rgb(0, 128, 0);">'max_tokens'</span><span class="token token" style="color: rgb(43, 48, 59);">:</span><span> </span><span class="token token" style="color: rgb(0, 128, 128);">10</span><span class="token token" style="color: rgb(43, 48, 59);">}</span><span class="token token" style="color: rgb(43, 48, 59);">,</span><span> </span></span><span><span> follow_redirects</span><span class="token token" style="color: rgb(20, 24, 31);">=</span><span class="token token" style="color: rgb(0, 128, 128);">True</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(43, 48, 59);">)</span><span> </span></span><span><span></span><span class="token token" style="color: rgb(129, 0, 194);">print</span><span class="token token" style="color: rgb(43, 48, 59);">(</span><span>r</span><span class="token token" style="color: rgb(43, 48, 59);">.</span><span>status_code</span><span class="token token" style="color: rgb(43, 48, 59);">)</span><span> </span><span class="token token" style="color: rgb(110, 118, 135);"># → 200</span></span></code></pre></div></div> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]"><strong>Result: 200 OK</strong> — confirms the API key, network, and endpoint are all correct.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Root Cause Analysis</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The desktop app appears to be stripping the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code> scheme and substituting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> when building the endpoint URL before passing it to the httpx client. This is NOT a config issue — the config is correct. The bug is in how the desktop app (likely the Electron layer) processes or serialises the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">base_url</code> value before handing it to the Python backend.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Neither the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">plugins/model-providers/deepseek/__init__.py</code> nor any <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.py</code> file in the install path contains a hardcoded <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://api.deepseek.com</code>, ruling out a Python-side hardcoding issue.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Additionally, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">httpx</code> does not follow <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">307</code> redirects by default (unlike <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">requests</code>), so even if DeepSeek's CDN redirects <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> → <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code>, the client fails rather than following the redirect.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Workaround</h2> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Setting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> on the httpx client would handle the symptom, but the root cause (scheme being stripped to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code>) should be fixed in the app layer.</p> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The CLI version works correctly with the same config and Python backend.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Related Issues</h2> <ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">Issue #19337 — MiniMax OAuth <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">verification_uri</code> returning 307 (similar httpx redirect problem)</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">Issue #19336 — <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">hermes setup</code> silently skips on MiniMax OAuth failure</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">PR #19335 (closed) — original <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> fix attempt</li> </ul> <p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">The <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">follow_redirects=True</code> fix in PR #19335 would partially address the symptom, but the scheme downgrade from <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">https://</code> to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://</code> in the desktop app is a separate and more fundamental issue.</p> <hr class="border-border-200 border-t-0.5 my-3 mx-1.5"> <h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Additional Notes</h2> <ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3"> <li class="font-claude-response-body whitespace-normal break-words pl-2">The Web UI (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">http://127.0.0.1:9120</code>) also does not function: returns <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">error: "Frontend not built. Run: cd web &amp;&amp; npm run build"</code>, suggesting the desktop app bundle is missing the pre-built frontend assets.</li> <li class="font-claude-response-body whitespace-normal break-words pl-2">The CLI version (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">hermes chat</code>) with the same config works correctly after setting <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">model.provider: deepseek</code>.</li></ul><!--EndFragment--> </body> </html>

Steps to Reproduce

Steps to Reproduce

Install Hermes Desktop from https://hermes-agent.nousresearch.com/desktop Configure the DeepSeek provider in ~/.hermes/config.yaml with base_url: https://api.deepseek.com/v1 Launch the desktop app Send any message

Expected Behavior

Expected: Successful API response from DeepSeek

Actual Behavior

Actual: Fails with HTTP 307 Temporary Redirect after 3 retries

Affected Component

Configuration (config.yaml, .env, hermes setup)

Messaging Platform (if gateway-related)

No response

Debug Report

Log Evidence
From %LOCALAPPDATA%\hermes\logs\desktop.log:
⚠️  API call failed (attempt 1/3): APIStatusError [HTTP 307]
   🔌 Provider: deepseek  Model: deepseek-v4-pro
   🌐 Endpoint: http://api.deepseek.com/v1        ← NOTE: http://, not https://
   📝 Error: HTTP 307307 Temporary Redirect
   📋 Details: <html>
<head><title>307 Temporary Redirect</title></head>
<body>
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
   ⏱️  Elapsed: 0.67s  Context: 2 msgs, ~3,983 tokens
⏳ Retrying in 2.7s (attempt 1/3)...
[... same error repeats for attempts 2/3 and 3/3 ...]
❌ API failed after 3 retries — HTTP 307307 Temporary Redirect
PS C:\Users\Administrator\.hermes> hermes debug share
⚠️  This will upload the following to a public paste service:
  • System info (OS, Python version, Hermes version, provider, which API keys
    are configured — NOT the actual keys)
  • Recent log lines (agent.log, errors.log, gateway.log — may contain
    conversation fragments and file paths)
  • Full agent.log and gateway.log (up to 512 KB each — likely contains
    conversation content, tool outputs, and file paths)

Pastes auto-delete after 6 hours.

Collecting debug report...
Uploading...

Debug report uploaded:
  Report       https://paste.rs/uMs1L
  agent.log    https://dpaste.com/GKB7T9US3
  gateway.log  https://dpaste.com/8C9S9KGEK

⏱  Pastes will auto-delete in 6 hours.
To delete now:  hermes debug delete <url>

Share these links with the Hermes team for support.
PS C:\Users\Administrator\.hermes>

Operating System

UBUNTU 24.04

Python Version

3.11.6

Hermes Version

Hermes Agent v0.15.1 (2026.5.29)

Additional Logs / Traceback (optional)

Config (at time of failure)
C:\Users\Administrator\.hermes\config.yaml (relevant section):
yamlcustom_providers:
- name: deepseek
  base_url: https://api.deepseek.com/v1      ← correctly set to https://
  api_key: sk-c727b201...
  api_mode: chat_completions
  models:
    deepseek-v4-pro:
      context_length: 1000000
      name: DeepSeek V4 Pro
  model: deepseek-v4-pro
The config clearly specifies https://, but the desktop app is sending requests to http://.

Verification: Direct API Call Works
Direct Python test using the same venv as the desktop app:
pythonimport httpx
r = httpx.post(
    'https://api.deepseek.com/v1/chat/completions',
    headers={'Authorization': 'Bearer sk-c727b2...'},
    json={'model': 'deepseek-chat', 'messages': [{'role': 'user', 'content': 'hi'}], 'max_tokens': 10},
    follow_redirects=True
)
print(r.status_code)  # → 200
Result: 200 OK — confirms the API key, network, and endpoint are all correct.

Root Cause Analysis
The desktop app appears to be stripping the https:// scheme and substituting http:// when building the endpoint URL before passing it to the httpx client. This is NOT a config issue — the config is correct. The bug is in how the desktop app (likely the Electron layer) processes or serialises the base_url value before handing it to the Python backend.
Neither the plugins/model-providers/deepseek/__init__.py nor any .py file in the install path contains a hardcoded http://api.deepseek.com, ruling out a Python-side hardcoding issue.
Additionally, httpx does not follow 307 redirects by default (unlike requests), so even if DeepSeek's CDN redirects http:// → https://, the client fails rather than following the redirect.

Workaround
Setting follow_redirects=True on the httpx client would handle the symptom, but the root cause (scheme being stripped to http://) should be fixed in the app layer.
The CLI version works correctly with the same config and Python backend.

Related Issues

Issue #19337 — MiniMax OAuth verification_uri returning 307 (similar httpx redirect problem)
Issue #19336 — hermes setup silently skips on MiniMax OAuth failure
PR #19335 (closed) — original follow_redirects=True fix attempt

The follow_redirects=True fix in PR #19335 would partially address the symptom, but the scheme downgrade from https:// to http:// in the desktop app is a separate and more fundamental issue.

Additional Notes

The Web UI (http://127.0.0.1:9120) also does not function: returns error: "Frontend not built. Run: cd web && npm run build", suggesting the desktop app bundle is missing the pre-built frontend assets.
The CLI version (hermes chat) with the same config works correctly after setting model.provider: deepseek.

Root Cause Analysis (optional)

No response

Proposed Fix (optional)

No response

Are you willing to submit a PR for this?

  • I'd like to fix this myself and submit a PR

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING