Skip to content

feat: Complete DeepSeek API adapter implementation#11130

Open
dixoxib wants to merge 38 commits intocontinuedev:mainfrom
dixoxib:deepseek-api
Open

feat: Complete DeepSeek API adapter implementation#11130
dixoxib wants to merge 38 commits intocontinuedev:mainfrom
dixoxib:deepseek-api

Conversation

@dixoxib
Copy link

@dixoxib dixoxib commented Mar 6, 2026

Description

Enhanced DeepSeek API adapter from a minimal 73‑line implementation to a complete, production‑ready adapter with all features expected from a modern LLM provider integration following official docs.

Key improvements:

  • Added streaming & non‑streaming chat completions with reasoning support
  • Implemented tool calling compatibility and thinking tool-call chains
  • Implemented model listing via DeepSeek's /models endpoint
  • Enhanced FIM beta endpoint
  • Added type safety with comprehensive TypeScript types
  • Improved converting with detailed warnings
  • Added prefix completion support (beta chat endpoint)
  • Added workarounds for DeepSeek Reasoner edge cases
  • Improved documentation, configuration and onboarding
  • minimal invasive to codebase

Files changed: 35 files, including core implementation, tests, documentation, and configuration updates, small fixes.

AI Code Review

  • Team members only: AI review runs automatically when PR is opened or marked ready for review
  • Team members can also trigger a review by commenting @continue-review

Checklist

  • I've read the contributing guide
  • The relevant docs have been updated or created
  • The relevant tests have been updated or created

Screen recording or screenshot

Key demonstrations:

  1. Onboarding
  2. DeepSeek Reasoner showing reasoning_content in responses
  3. Thinking-Tool-calling-Chains
  4. Non-streaming summarize functionality
sv.mp4

Tests

Added/updated tests:

  • packages/openai-adapters/src/test/deepseek-converters.test.ts – Comprehensive unit tests for converter functions
  • core/llm/llms/DeepSeek.unit.test.ts – Unit tests for DeepSeek provider class
  • core/llm/llms/DeepSeek.vitest.ts – Integration tests
  • packages/openai-adapters/src/test/DeepSeekApi.test.ts – API adapter test
  • core/llm/llms/DeepSeek.tools.test.ts – Thinking tool chain test

The enhancement addresses limitations in the current minimal implementation and enables full DeepSeek functionality including Agent mode with tool calling for Reasoner model.


I have read the CLA Document and I hereby sign the CLA


Continue Tasks: 🔄 7 running — View all


Summary by cubic

Complete DeepSeek provider with chat, reasoning, tool calling, and FIM (beta) support. Adds onboarding/docs, streaming usage and cost, parallel generation, strict token reservation, exact apiBase handling, and assistant‑only streaming/accumulation.

  • New Features

    • DeepSeek provider: streaming/non‑streaming chat, reasoning_content, thinking→tool call pairing, tool choice, and model autodetect with OS‑models edit template.
    • FIM via deepseek-fim-beta only; supportsFim is true for the FIM beta (chat/reasoner do not report FIM).
    • Token/cost handling: reserve full maxTokens for DeepSeek; improved pruning; streamed usage stats; DeepSeek pricing with cache hit/miss.
    • Stability/setup: only assistant chunks are streamed/accumulated; apiBase preserved exactly and defaulted; added llm‑info entries, onboarding/UI and VS Code updates; adapter/converter types and tests.
  • Migration

    • Use provider: deepseek with models: deepseek-chat, deepseek-reasoner, deepseek-fim-beta (for FIM).
    • apiBase defaults to https://api.deepseek.com (preserved exactly); set maxTokens (chat: 8k, reasoner: 32k).
    • Replace legacy Deepseek class or deepseek-coder with the new DeepSeek class and models; provider ID remains deepseek.

Written for commit e85216e. Summary will update on new commits.

CI Bot and others added 27 commits February 14, 2026 10:55
…model provider updates

- Add DeepSeek model provider implementation with proper FIM support
- Implement DeepSeek API adapter with OpenAI-compatible interface
- Add tool call support and thinking mode integration
- Update model provider configuration and onboarding
- Add comprehensive type definitions and validation
- Update documentation for DeepSeek model capabilities
- Fix file rename from Deepseek.ts to DeepSeek.ts for consistency
- Enhance DeepSeek provider with improved FIM support
- Update onboarding configuration for DeepSeek
- Refactor token counting and autodetection logic
- Improve system tool call interception
- Streamline chat response streaming
- Update UI and extension components for better integration
- Refactor token counting logic
- Enhance DeepSeek provider capabilities
- Update chat and edit templates
- Improve system tool call interception
- Streamline API adapters and converters
- Add unit test enhancements
Integrate latest upstream changes including:
- zAI provider support
- Background job service
- CLI tool improvements
- Updated model configurations
- Maintain DeepSeek integration
- Rewrite setupProviderConfig to use direct model config instead of uses/with syntax
- Add roles property to model config schema
- Improve DeepSeek message conversion with toChatBody
- Update conversationCompaction imports
- Add roles field to config schema for VS Code
- Update DeepSeek provider description
- Add debug logging to DeepSeekApi adapter
- Simplify DeepSeek onboarding config to use direct model objects
- Improve token counting for DeepSeek models (reserve full maxTokens)
- Fix FIM support tests for DeepSeek models
- Adjust maxTokens for DeepSeek Reasoner to 32k (API limit)
- Update DeepSeek provider info with correct context lengths
- Enhance DeepSeek converters to handle max_completion_tokens
- Clean up imports and schema definitions
- Update documentation with accurate DeepSeek capabilities
- Remove debug console logs from DeepSeek adapter
@dixoxib dixoxib requested a review from a team as a code owner March 6, 2026 16:59
@dixoxib dixoxib requested review from sestinj and removed request for a team March 6, 2026 16:59
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Mar 6, 2026
@github-actions
Copy link

github-actions bot commented Mar 6, 2026


Thank you for your submission, we really appreciate it. Like many open-source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution. You can sign the CLA by just posting a Pull Request Comment same as the below format.


I have read the CLA Document and I hereby sign the CLA


1 out of 2 committers have signed the CLA.
✅ (dixoxib)[https://github.com/dixoxib]
@ci Bot
CI Bot seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

6 issues found across 35 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="core/config/yaml/models.ts">

<violation number="1" location="core/config/yaml/models.ts:55">
P1: Forcing `contextLength` to `DEFAULT_CONTEXT_LENGTH` in YAML model conversion can override provider runtime autodetection (e.g., Ollama), causing incorrect context windows for unknown/autodetected models.</violation>
</file>

<file name="packages/openai-adapters/src/types.ts">

<violation number="1" location="packages/openai-adapters/src/types.ts:63">
P1: `deepseek` was added to `OpenAIConfigSchema` even though `DeepseekConfigSchema` already handles that discriminator in `LLMConfigSchema`, creating a duplicate discriminator value in the same `z.discriminatedUnion`.</violation>
</file>

<file name="packages/openai-adapters/src/apis/DeepSeek.ts">

<violation number="1" location="packages/openai-adapters/src/apis/DeepSeek.ts:317">
P2: FIM completions are beta-only and require the beta base URL. Building the endpoint as `/completions` against the default base (`https://api.deepseek.com/`) no longer targets the beta API, so FIM will fail unless callers override apiBase manually.</violation>
</file>

<file name="packages/openai-adapters/src/util/deepseek-converters.ts">

<violation number="1" location="packages/openai-adapters/src/util/deepseek-converters.ts:327">
P2: `top_logprobs` is included even when `logprobs` is false/undefined, but DeepSeek requires `logprobs=true` whenever `top_logprobs` is used. This can generate invalid requests that the API rejects.</violation>
</file>

<file name="core/llm/llms/DeepSeek.ts">

<violation number="1" location="core/llm/llms/DeepSeek.ts:73">
P2: Non-streaming chat ignores top-level options.model, unlike streamChat/streamFim, causing inconsistent model selection.</violation>

<violation number="2" location="core/llm/llms/DeepSeek.ts:217">
P2: supportsPrefill() reports true unconditionally even though DeepSeek prefill is beta-only. This misreports capability on non‑beta API bases and can enable beta-only prompt paths against non‑beta endpoints.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@dixoxib
Copy link
Author

dixoxib commented Mar 6, 2026

I have read the CLA Document and I hereby sign the CLA

dixoxib and others added 4 commits March 6, 2026 18:28
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
…roviders

- Remove trailing slash normalization in DeepSeekApi constructor
- Update test expectations to match actual behavior
- All tests pass, including main integration test
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/openai-adapters/src/apis/DeepSeek.ts">

<violation number="1" location="packages/openai-adapters/src/apis/DeepSeek.ts:50">
P2: apiBase trailing-slash normalization was removed; relative URL construction can drop path segments for custom bases like https://host/v1, misrouting requests.</violation>

<violation number="2" location="packages/openai-adapters/src/apis/DeepSeek.ts:316">
P2: FIM is a beta feature that requires the beta base URL; building the endpoint as `new URL("completions", this.apiBase)` sends FIM requests to the non‑beta `/completions` path when using the default base URL, which breaks FIM. Restore beta-aware routing or force the beta base URL for FIM calls.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

dixoxib added 6 commits March 6, 2026 19:16
- Update test expectations to match actual regex logic
- deepseek-chat matches /deepseek/ and /r1|reasoner|-chat/ regex combo
- Keep deepseek-coder as non-recommended
- Fix code style issues in DeepSeek.ts and DeepSeekApi.test.ts
- Ensure consistent formatting before PR merge
…licit type annotation from static defaultOptions to ensure proper inheritance\n- Remove overridden chat() method that bypassed adapter disable in tests\n- Tests now pass: default API base correctly detected and chat requests use mocked fetch
- Move applyToolOverrides import to avoid potential circular dependencies
- Filter chat() accumulation to only assistant messages (ignore thinking messages)
- Maintains backward compatibility with existing functionality
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-merge size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

1 participant