feat(llm): add DeepSeek as first-class cloud provider (#204)#205
Merged
Conversation
- New DeepSeekAdapter (OpenAI-compatible REST, Bearer auth, https://api.deepseek.com) - 4 model entries: deepseek-v4-flash[-thinking], deepseek-v4-pro[-thinking] - Thinking mode hooked into ThinkingEffortMapper with proprietary thinking: {type: 'enabled', reasoning_effort: 'high'|'max'} shape - delta.reasoning_content / message.reasoning_content surfaced via unified StreamChunk.reasoning field — UI renders for free - frequency_penalty/presence_penalty stripped (DeepSeek removed support) - Wired through 13 touchpoints (types union, AdapterRegistry, ProviderTypes default, ProviderManager def, ValidationService, ThinkingEffortMapper, platform mobile list, ModelDropdownRenderer, ProviderUtils, ProvidersTab + cloudIds, VisionMessageFormatter, ingestTool labels) - Mobile-compatible (requestUrl REST transport) Resolves #204 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ProfSynapse
added a commit
that referenced
this pull request
May 11, 2026
PR #205 (v5.8.14) added the DeepSeek adapter and DEEPSEEK_MODELS array but missed the two central registries that feed the model dropdown UI, so DeepSeek models never appeared even with a valid API key: - StaticModelsService.ts — import, providerModels array in getAllModels, switch case in getModelsForProvider, and the getAvailableProviders whitelist all lacked 'deepseek' - ModelRegistry.ts — AI_MODELS record and DEFAULT_MODELS record both lacked the deepseek entry Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Owner
Author
|
Follow-up: v5.8.15 (just released — https://github.com/ProfSynapse/nexus/releases/tag/5.8.15) fixes a wiring miss from this PR that prevented the DeepSeek models from appearing in the model dropdown even with a valid API key. The 13 touchpoints listed above were all real, but two central aggregators were missed:
Fix in commit 4a35280 (10 lines across the 2 files). Note for the next provider addition: the "13 wiring touchpoints" checklist should include these two aggregators — they're the gate everything else flows through. cc @surill (#204) — the v5.8.15 release on Obsidian Community Plugins / direct download now actually surfaces the models. Please grab the new build and report back if the dropdown still misbehaves. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
Adds DeepSeek as a direct cloud provider (alongside OpenAI / Anthropic / Google / Mistral / Groq / OpenRouter / etc.). Resolves #204.
DeepSeek's API is OpenAI-compatible, so the adapter is structurally a Groq-clone that plugs into the existing two-sided thinking abstraction (
ThinkingEffortMapperfor input, unifiedStreamChunk.reasoningfor output) — the chat UI renders DeepSeek reasoning blocks for free, exactly like Claude / o-series / Gemini / Groq today.Models
deepseek-v4-flashdeepseek-v4-proEach ships with a
-thinkingvariant. Thinking mode uses DeepSeek's proprietarythinking: { type: "enabled", reasoning_effort: "high" \| "max" }request shape (NOT OpenAI'sreasoning.effort), and surfaces reasoning viadelta.reasoning_content(streaming) ormessage.reasoning_content(non-streaming). The unifiedThinkingEffortMapper.getDeepSeekParamshandles request-side translation; the adapter's stream extractor mapsreasoning_content→StreamChunk.reasoning.What changed
DeepSeekAdapter.ts(375 LoC),DeepSeekModels.ts(111 LoC),DeepSeekAdapter.test.ts(275 LoC, 18 tests)SupportedProviderunion,AdapterRegistry,ProviderTypesdefaults,ProviderManagerdef,ValidationService,ThinkingEffortMapper(incl.ProviderThinkingConfiginterface +supportedProviderslist),platform.tsmobile-compatible list,ModelDropdownRenderer,ProviderUtils(display name, color, emoji, abbreviation, streaming/functions/JSON lists),ProvidersTab(+cloudIds),VisionMessageFormatter,ingestToollabelsfrequency_penalty/presence_penaltyare stripped from outgoing requests (DeepSeek removed support)requestUrl-backed REST transport)Test plan
npx jest tests/services/llm/adapters/deepseek— 18/18 passingnpx tsc --noEmit— cleannpm run build— cleandeepseek-v4-flash, send a tool-using message withdeepseek-v4-flash-thinking, verify reasoning block renders in the chat UIFollow-ups (not blocking)
ProviderManager.ts(659 LoC) andProvidersTab.ts(645 LoC) crossed the 600-line maintainability threshold from the wiring additions. Both are pre-existing tech-debt watch items — refactor when next touched, not as part of this PR.🤖 Generated with Claude Code