Skip to content

Commit bde9af2

Browse files
authored
feat(llm): migrate providers to ai sdk (#1449)
* feat(llm): migrate runtime to ai sdk * fix(llm): harden runtime edge cases * fix(llm): harden tool map keys * fix(llm): continue legacy tool loops * fix(llm): merge allof required keys * feat(llm): migrate azure runtime * fix(llm): harden ai sdk adapters * refactor(provider): retire legacy runtime * refactor(provider): simplify provider layer
1 parent 3add409 commit bde9af2

File tree

97 files changed

+7947
-15650
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+7947
-15650
lines changed

docs/README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# DeepChat 文档索引
22

3-
本文档反映 `2026-03-23` 完成的 legacy `AgentPresenter` retirement 之后的代码结构。
3+
本文档反映 `2026-04-11` 完成 legacy `AgentPresenter` retirement 与 legacy provider runtime retirement 之后的代码结构。
44

55
当前聊天主链路已经收敛为:
66

@@ -36,6 +36,13 @@ Renderer
3636
| [docs/specs/legacy-agentpresenter-retirement/spec.md](./specs/legacy-agentpresenter-retirement/spec.md) | 本次 retirement 的目标、范围、兼容边界 |
3737
| [docs/specs/legacy-agentpresenter-retirement/plan.md](./specs/legacy-agentpresenter-retirement/plan.md) | 迁移/归档/验证计划 |
3838
| [docs/specs/legacy-agentpresenter-retirement/tasks.md](./specs/legacy-agentpresenter-retirement/tasks.md) | 已执行清单 |
39+
| [docs/specs/legacy-llm-provider-runtime-retirement/spec.md](./specs/legacy-llm-provider-runtime-retirement/spec.md) | legacy provider runtime retirement 规格 |
40+
| [docs/specs/legacy-llm-provider-runtime-retirement/plan.md](./specs/legacy-llm-provider-runtime-retirement/plan.md) | provider runtime 收口与依赖清理计划 |
41+
| [docs/specs/legacy-llm-provider-runtime-retirement/tasks.md](./specs/legacy-llm-provider-runtime-retirement/tasks.md) | provider runtime 退役执行清单 |
42+
| [docs/specs/provider-layer-simplification/spec.md](./specs/provider-layer-simplification/spec.md) | provider layer 第二轮内部收口规格 |
43+
| [docs/specs/provider-layer-simplification/plan.md](./specs/provider-layer-simplification/plan.md) | registry + generic provider 合并计划 |
44+
| [docs/specs/provider-layer-simplification/tasks.md](./specs/provider-layer-simplification/tasks.md) | provider layer 第二轮执行清单 |
45+
| [docs/specs/ai-sdk-runtime/spec.md](./specs/ai-sdk-runtime/spec.md) | AI SDK runtime 规格,现已更新为 retired 状态 |
3946
| [docs/specs/architecture-simplification/spec.md](./specs/architecture-simplification/spec.md) | 整体减负治理规格 |
4047
| [docs/specs/architecture-simplification/plan.md](./specs/architecture-simplification/plan.md) | 分层/基线/guard 计划 |
4148
| [docs/specs/architecture-simplification/tasks.md](./specs/architecture-simplification/tasks.md) | 首期实施清单 |
@@ -62,10 +69,14 @@ docs/
6269
├── specs/
6370
│ ├── agent-cleanup/
6471
│ ├── architecture-simplification/
72+
│ ├── ai-sdk-runtime/
73+
│ ├── provider-layer-simplification/
74+
│ ├── legacy-llm-provider-runtime-retirement/
6575
│ └── legacy-agentpresenter-retirement/
6676
└── archives/
6777
├── legacy-agentpresenter-architecture.md
6878
├── legacy-agentpresenter-flows.md
79+
├── legacy-llm-provider-runtime.md
6980
├── thread-presenter-migration-plan.md
7081
└── workspace-agent-refactoring-summary.md
7182
```
@@ -78,6 +89,7 @@ docs/
7889
| --- | --- |
7990
| [archives/legacy-agentpresenter-architecture.md](./archives/legacy-agentpresenter-architecture.md) |`AgentPresenter` 架构快照 |
8091
| [archives/legacy-agentpresenter-flows.md](./archives/legacy-agentpresenter-flows.md) |`startStreamCompletion` / permission / loop 流程 |
92+
| [archives/legacy-llm-provider-runtime.md](./archives/legacy-llm-provider-runtime.md) | 旧 provider runtime 的历史归档与提交锚点 |
8193
| [archives/thread-presenter-migration-plan.md](./archives/thread-presenter-migration-plan.md) | 历史迁移设计 |
8294
| [archives/workspace-agent-refactoring-summary.md](./archives/workspace-agent-refactoring-summary.md) | 历史工作区改造总结 |
8395

docs/architecture/baselines/dependency-report.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ Generated on 2026-04-03.
3232
- `eventbus.ts`: 57
3333
- `presenter/index.ts`: 44
3434
- `presenter/llmProviderPresenter/runtimePorts.ts`: 34
35-
- `presenter/llmProviderPresenter/providers/openAICompatibleProvider.ts`: 24
3635
- `presenter/llmProviderPresenter/baseProvider.ts`: 19
3736
- `presenter/remoteControlPresenter/types.ts`: 18
3837
- `presenter/sqlitePresenter/tables/baseTable.ts`: 16
@@ -51,9 +50,7 @@ Generated on 2026-04-03.
5150
- `presenter/index.ts -> presenter/windowPresenter/index.ts -> presenter/windowPresenter/FloatingChatWindow.ts -> presenter/index.ts`
5251
- `presenter/index.ts -> presenter/shortcutPresenter.ts -> presenter/index.ts`
5352
- `presenter/index.ts -> presenter/llmProviderPresenter/index.ts -> presenter/llmProviderPresenter/baseProvider.ts -> presenter/devicePresenter/index.ts -> presenter/index.ts`
54-
- `presenter/index.ts -> presenter/llmProviderPresenter/index.ts -> presenter/llmProviderPresenter/managers/providerInstanceManager.ts -> presenter/llmProviderPresenter/providers/deepseekProvider.ts -> presenter/llmProviderPresenter/providers/openAICompatibleProvider.ts -> presenter/index.ts`
5553
- `presenter/index.ts -> presenter/llmProviderPresenter/index.ts -> presenter/llmProviderPresenter/managers/providerInstanceManager.ts -> presenter/llmProviderPresenter/providers/githubCopilotProvider.ts -> presenter/githubCopilotDeviceFlow.ts -> presenter/index.ts`
56-
- `presenter/index.ts -> presenter/llmProviderPresenter/index.ts -> presenter/llmProviderPresenter/managers/providerInstanceManager.ts -> presenter/llmProviderPresenter/providers/openAIResponsesProvider.ts -> presenter/index.ts`
5754
- `presenter/filePresenter/mime.ts -> presenter/filePresenter/CsvFileAdapter.ts -> presenter/filePresenter/BaseFileAdapter.ts -> presenter/filePresenter/mime.ts`
5855
- `presenter/index.ts -> presenter/sessionPresenter/index.ts -> presenter/index.ts`
5956
- `presenter/index.ts -> presenter/sessionPresenter/index.ts -> presenter/sessionPresenter/managers/conversationManager.ts -> presenter/index.ts`
@@ -115,4 +112,3 @@ Generated on 2026-04-03.
115112
- `components/json-viewer/JsonValue.ts -> components/json-viewer/JsonObject.ts -> components/json-viewer/JsonValue.ts`
116113
- `components/json-viewer/JsonArray.ts -> components/json-viewer/JsonValue.ts -> components/json-viewer/JsonArray.ts`
117114
- `composables/usePageCapture.example.ts -> composables/usePageCapture.example.ts`
118-

docs/architecture/baselines/zero-inbound-candidates.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ These files have no in-repo importers inside their scope and need manual classif
66

77
## main
88

9-
- Candidate count: 16
9+
- Candidate count: 15
1010

1111
- `env.d.ts`
1212
- `lib/system.ts`
1313
- `lib/terminalHelper.ts`
1414
- `presenter/browser/BrowserContextBuilder.ts`
1515
- `presenter/configPresenter/aes.ts`
1616
- `presenter/llmProviderPresenter/oauthHelper.ts`
17-
- `presenter/llmProviderPresenter/providers/openAIProvider.ts`
1817
- `presenter/mcpPresenter/agentMcpFilter.ts`
1918
- `presenter/searchPrompts/searchPrompts.ts`
2019
- `presenter/sessionPresenter/events.ts`
@@ -73,4 +72,3 @@ These files have no in-repo importers inside their scope and need manual classif
7372
- `stores/systemPromptStore.ts`
7473
- `utils/maxOutputTokens.ts`
7574
- `views/SettingsTabView.vue`
76-
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Legacy LLM Provider Runtime Archive
2+
3+
## Summary
4+
5+
DeepChat previously maintained two low-level provider runtimes under `llmProviderPresenter`:
6+
7+
- the original provider-specific SDK implementations
8+
- the newer shared AI SDK runtime
9+
10+
That rollback window is now closed. The active codebase only keeps the AI SDK runtime.
11+
12+
## Timeline
13+
14+
- AI SDK migration landed in commit `4c8345a7`
15+
- Legacy runtime retirement and dependency cleanup landed after the migration stabilized
16+
17+
## Where To Find The Old Provider Implementation
18+
19+
Use commit `3add4093b46f15072d5ec3a65c8097e23b4907c4` to inspect the historical provider implementation and legacy runtime code.
20+
21+
That commit is the canonical source for:
22+
23+
- legacy provider request code
24+
- legacy stream parsing branches
25+
- provider-specific MCP conversion APIs
26+
- legacy rollback-path wiring
27+
28+
## Current State
29+
30+
- no `DEEPCHAT_LLM_RUNTIME`
31+
- no `llmRuntimeMode`
32+
- no legacy provider SDK fallback branches in active providers
33+
- no provider-specific MCP conversion APIs exposed from presenters
34+
35+
For current implementation details, read:
36+
37+
- [docs/specs/ai-sdk-runtime/spec.md](../specs/ai-sdk-runtime/spec.md)
38+
- [docs/specs/legacy-llm-provider-runtime-retirement/spec.md](../specs/legacy-llm-provider-runtime-retirement/spec.md)

docs/specs/ai-sdk-runtime/plan.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# AI SDK Runtime Plan
2+
3+
Status: completed, rollback retired. See [../legacy-llm-provider-runtime-retirement/plan.md](../legacy-llm-provider-runtime-retirement/plan.md).
4+
5+
1. Introduce shared AI SDK runtime modules without changing upper-layer interfaces.
6+
2. Migrate OpenAI-compatible and OpenAI responses providers first.
7+
3. Migrate Anthropic / Gemini / Vertex / Bedrock / Ollama to the shared runtime.
8+
4. Keep routing providers (`new-api`, `zenmux`) as thin delegates over migrated providers.
9+
5. Freeze `LLMCoreStreamEvent` behavior with adapter-focused tests.
10+
6. Retire the rollback path and delete legacy state machines.

docs/specs/ai-sdk-runtime/spec.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# AI SDK Runtime Spec
2+
3+
## Status
4+
5+
Completed in commit `4c8345a7`.
6+
7+
As of `2026-04-11`, the rollback path is retired. See [../legacy-llm-provider-runtime-retirement/spec.md](../legacy-llm-provider-runtime-retirement/spec.md).
8+
9+
## Goal
10+
11+
Unify DeepChat's low-level LLM request pipeline on Vercel AI SDK while keeping the upper-layer contracts unchanged:
12+
13+
- `BaseLLMProvider`
14+
- `LLMProviderPresenter`
15+
- `LLMCoreStreamEvent`
16+
- existing provider IDs, model configs, and conversation history
17+
18+
The AI SDK runtime is the only remaining implementation.
19+
20+
## Non-Negotiable Compatibility
21+
22+
- No functional regression in text streaming, reasoning streaming, tool call streaming, image output, prompt cache, proxy handling, request tracing, routing, and embeddings.
23+
- `LLMCoreStreamEvent` event names, field names, and stop reasons remain unchanged.
24+
- Existing `function_call_record` history must stay reusable across providers.
25+
- Existing provider list / model list / provider check / key status responsibilities remain in provider classes.
26+
27+
## Runtime Mode
28+
29+
- Single runtime: `ai-sdk`
30+
- `DEEPCHAT_LLM_RUNTIME` has been removed
31+
- config setting `llmRuntimeMode` has been removed
32+
33+
## Scope
34+
35+
Shared runtime under `src/main/presenter/llmProviderPresenter/aiSdk/` provides:
36+
37+
- provider factory
38+
- model / message mapper
39+
- MCP tool mapper
40+
- streaming adapter
41+
- image runtime
42+
- embedding runtime
43+
- provider-options mapper
44+
- reasoning middleware
45+
- legacy function-call compatibility middleware
46+
47+
## Provider Rollout
48+
49+
Phase 1:
50+
51+
- `OpenAICompatibleProvider`
52+
- `OpenAIResponsesProvider`
53+
- all `extends OpenAICompatibleProvider` providers
54+
55+
Phase 2:
56+
57+
- `AnthropicProvider`
58+
- `GeminiProvider`
59+
- `VertexProvider`
60+
- `AwsBedrockProvider`
61+
- `OllamaProvider`
62+
63+
Phase 3:
64+
65+
- `NewApiProvider`
66+
- `ZenmuxProvider`
67+
68+
Out of scope for first unification pass:
69+
70+
- `AcpProvider`
71+
- `VoiceAIProvider`
72+
73+
## Validation Matrix
74+
75+
- pure text
76+
- reasoning native
77+
- reasoning via `<think>`
78+
- native tool streaming
79+
- legacy `<function_call>` fallback
80+
- multi-tool history replay
81+
- image input
82+
- image output
83+
- usage mapping
84+
- prompt cache mapping
85+
- proxy / trace / abort
86+
- embeddings
87+
- retired rollback path verification
88+
89+
## Legacy Removal Exit Criteria
90+
91+
- AI SDK runtime passes the provider regression matrix
92+
- duplicated legacy stream parsers / tool parsers have no remaining callers
93+
- retirement is documented in [../legacy-llm-provider-runtime-retirement/spec.md](../legacy-llm-provider-runtime-retirement/spec.md)

docs/specs/ai-sdk-runtime/tasks.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# AI SDK Runtime Tasks
2+
3+
- [x] Freeze migration scope in SDD docs.
4+
- [x] Add shared AI SDK runtime modules. (implemented in 4c8345a7)
5+
- [x] Integrate OpenAI-compatible runtime path. (implemented in 4c8345a7)
6+
- [x] Integrate OpenAI responses runtime path. (implemented in 4c8345a7)
7+
- [x] Integrate Anthropic runtime path. (implemented in 4c8345a7)
8+
- [x] Integrate Gemini runtime path. (implemented in 4c8345a7)
9+
- [x] Integrate Vertex runtime path. (implemented in 4c8345a7)
10+
- [x] Integrate Bedrock runtime path. (implemented in 4c8345a7)
11+
- [x] Integrate Ollama runtime path. (implemented in 4c8345a7)
12+
- [x] Add regression tests for runtime adapter behavior. (implemented in 4c8345a7)
13+
- [x] Retire `DEEPCHAT_LLM_RUNTIME` and `llmRuntimeMode`.
14+
- [x] Remove legacy provider SDK fallback branches.
15+
- [x] Remove provider-specific MCP conversion interfaces from presenter ports.
16+
- [x] Record retirement history in [../legacy-llm-provider-runtime-retirement/tasks.md](../legacy-llm-provider-runtime-retirement/tasks.md).
17+
- [x] Run format, i18n, lint, and targeted tests.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Legacy Provider Runtime Retirement Plan
2+
3+
## Outcome
4+
5+
Legacy provider runtime retirement is complete and no rollback path remains in the codebase.
6+
7+
## Executed Plan
8+
9+
1. Remove runtime selection and make AI SDK the only request runtime.
10+
2. Collapse provider implementations onto shared AI SDK helpers.
11+
3. Remove legacy MCP tool conversion surface from presenter interfaces.
12+
4. Delete obsolete provider SDK dependencies and refresh lockfiles.
13+
5. Archive the migration history and point readers to the final legacy-code commit.
14+
15+
## Exit Conditions
16+
17+
- No remaining source imports of `openai`, `@anthropic-ai/sdk`, `@google/genai`, `together-ai`, or `@aws-sdk/client-bedrock-runtime`
18+
- No `DEEPCHAT_LLM_RUNTIME` or `llmRuntimeMode` references remain
19+
- Main-process provider tests validate AI SDK-only behavior
20+
- Documentation explicitly marks the rollback path as retired
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Legacy Provider Runtime Retirement Spec
2+
3+
## Status
4+
5+
Completed on `2026-04-11`.
6+
7+
The hidden rollback window is closed. `llmProviderPresenter` now runs on AI SDK only.
8+
9+
## Goal
10+
11+
Retire the legacy provider runtime and remove obsolete provider SDK dependencies without changing upper-layer contracts:
12+
13+
- `BaseLLMProvider`
14+
- `LLMProviderPresenter`
15+
- `LLMCoreStreamEvent`
16+
- existing provider IDs, model configs, conversation history, and `function_call_record` compatibility
17+
18+
## Scope
19+
20+
- Remove `DEEPCHAT_LLM_RUNTIME`
21+
- Remove config key `llmRuntimeMode`
22+
- Delete `src/main/presenter/llmProviderPresenter/aiSdk/runtimeMode.ts`
23+
- Remove legacy-only provider branches, stream parsers, and MCP conversion ports
24+
- Keep provider-managed responsibilities that still matter:
25+
- `ollama` local model management
26+
- `@aws-sdk/client-bedrock` model discovery
27+
28+
## Runtime State After Retirement
29+
30+
- Single runtime: `ai-sdk`
31+
- No hidden fallback
32+
- No provider-specific MCP conversion APIs exposed from presenters
33+
- Vendor-specific request body customization is handled via AI SDK provider options mapping
34+
35+
## Historical Anchors
36+
37+
- AI SDK migration landed in commit `4c8345a7`
38+
- Legacy provider implementation can be inspected at commit `3add4093b46f15072d5ec3a65c8097e23b4907c4`
39+
40+
## Compatibility Commitments
41+
42+
- `LLMCoreStreamEvent` names and fields remain unchanged
43+
- Provider IDs and provider settings remain unchanged
44+
- Existing message history and `function_call_record` remain reusable
45+
- Routing providers (`new-api`, `zenmux`) stay as thin delegates over migrated providers
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Legacy Provider Runtime Retirement Tasks
2+
3+
- [x] Delete `src/main/presenter/llmProviderPresenter/aiSdk/runtimeMode.ts`
4+
- [x] Remove `DEEPCHAT_LLM_RUNTIME` and `llmRuntimeMode`
5+
- [x] Convert provider request paths to AI SDK-only implementations
6+
- [x] Remove provider-specific MCP tool conversion interfaces from presenter ports
7+
- [x] Replace legacy SDK type imports with local neutral types where still needed
8+
- [x] Remove obsolete provider SDK dependencies from `package.json`
9+
- [x] Rewrite provider tests around AI SDK runtime helpers and delegate routing
10+
- [x] Archive legacy runtime history and document the last legacy-code commit
11+
- [x] Run `pnpm install`
12+
- [x] Run `pnpm run format`
13+
- [x] Run `pnpm run i18n`
14+
- [x] Run `pnpm run lint`
15+
- [x] Run `pnpm run typecheck`
16+
- [x] Run targeted provider tests for the migrated AI SDK-only paths
17+
- [ ] Run `pnpm run test:main`

0 commit comments

Comments
 (0)