feat: 升级至 v0.3.4 — 接入 Xiaomi MiMo Provider + 文档全量校准

新增 MiMo (小米) LLM Provider 适配器,支持 mimo-v2.5-pro 和 mimo-v2.5 两个文本模型,复用 OpenAI 兼容 SSE 流式解析,支持 Thinking 模式和 Function Calling。同步校准全量 docs 文档与 README 使其与实际代码一致。

主要变更:
- 新增 mimo.adapter.ts 适配器(SSE + thinking.type + max_completion_tokens)
- 修复 thinking 逻辑 bug:禁用思考时未传 temperature/top_p
- 补全 sse-stream.ts 的 MiMo 缓存字段映射(prompt_tokens_details.cached_tokens)
- 补全 sse-stream.ts 的 finish_reason 映射(repetition_truncation)
- 注册 MiMo 适配器到 adapters/index.ts、main.ts 工厂
- handlers.ts 添加 mimo.contextWindow 热重载触发
- database.service.ts seed 添加 mimo 默认配置
- SettingsModal/OnboardingWizard/Header 添加 MiMo Provider UI
- constants.ts PROVIDER_LABELS 添加 mimo
- .env.example 添加 MIMO_API_KEY/MIMO_BASE_URL
- 反向修改 4 个 docs HTML 设计文档(工具数量/版本日期/适配器列表/数据库表)
- 反向修改 Agent网络工具通用设计-v2.md 附录 B 文件索引
- 完全重写 README.md(v0.3.4、27 工具、4 适配器、9 表)
This commit is contained in:
thzxx
2026-07-15 22:28:09 +08:00
parent 4554177db0
commit 656c6b7af1
22 changed files with 1677 additions and 115 deletions
+1
View File
@@ -30,6 +30,7 @@ import { useAgentStore } from '@renderer/stores/agent-store';
const PROVIDER_LABELS: Record<string, string> = {
deepseek: 'DeepSeek',
agnes: 'Agnes',
mimo: 'MiMo',
ollama: 'Ollama',
};
@@ -76,6 +76,7 @@ export function OnboardingWizard(): React.JSX.Element | null {
<Select value={provider} label="Provider" onChange={(e) => setProvider(e.target.value)}>
<MenuItem value="deepseek">DeepSeek</MenuItem>
<MenuItem value="agnes">Agnes AI</MenuItem>
<MenuItem value="mimo">MiMo ()</MenuItem>
<MenuItem value="ollama">Ollama ()</MenuItem>
</Select>
</FormControl>
+19 -3
View File
@@ -86,7 +86,7 @@ function useConfig<T>(key: string, defaultValue: T): [T, (v: T) => void] {
return [value, set];
}
const PROVIDER_URLS: Record<string, string> = { deepseek: 'https://api.deepseek.com', agnes: 'https://apihub.agnes-ai.com/v1', ollama: 'http://localhost:11434' };
const PROVIDER_URLS: Record<string, string> = { deepseek: 'https://api.deepseek.com', agnes: 'https://apihub.agnes-ai.com/v1', mimo: 'https://api.xiaomimimo.com/v1', ollama: 'http://localhost:11434' };
function WorkspaceSettings() {
const [workspacePath, setWorkspacePath] = useConfig('workspace.path', '');
@@ -290,9 +290,10 @@ function LLMSettings() {
const [apiKey, setApiKey] = useConfig('llm.apiKey', '');
const [baseURL, setBaseURL] = useConfig('llm.baseURL', '');
const [numCtx, setNumCtx] = useConfig('ollama.numCtx', null as number | null);
// v0.3.1: DeepSeek/Agnes contextWindow 可配置(不再写死 1M
// v0.3.1: DeepSeek/Agnes/MiMo contextWindow 可配置(不再写死)
const [dsCtxWindow, setDsCtxWindow] = useConfig('deepseek.contextWindow', 1000000);
const [agnesCtxWindow, setAgnesCtxWindow] = useConfig('agnes.contextWindow', 1000000);
const [mimoCtxWindow, setMimoCtxWindow] = useConfig('mimo.contextWindow', 131072);
const [showKey, setShowKey] = useState(false);
// 同步 Provider/Model 到 Agent Store(含 contextWindow
@@ -308,8 +309,10 @@ function LLMSettings() {
if (dsCtxWindow != null && dsCtxWindow > 0) useAgentStore.setState({ contextWindow: dsCtxWindow });
} else if (provider === 'agnes') {
if (agnesCtxWindow != null && agnesCtxWindow > 0) useAgentStore.setState({ contextWindow: agnesCtxWindow });
} else if (provider === 'mimo') {
if (mimoCtxWindow != null && mimoCtxWindow > 0) useAgentStore.setState({ contextWindow: mimoCtxWindow });
}
}, [provider, numCtx, dsCtxWindow, agnesCtxWindow]);
}, [provider, numCtx, dsCtxWindow, agnesCtxWindow, mimoCtxWindow]);
// 切换 Provider 时自动填充默认 URL + 清空 apiKey(不同 Provider 的 key 不通用)
const handleProviderChange = (newProvider: string) => {
@@ -335,6 +338,7 @@ function LLMSettings() {
<Select value={provider} label="Provider" onChange={(e) => handleProviderChange(e.target.value)}>
<MenuItem value="deepseek">DeepSeek</MenuItem>
<MenuItem value="agnes">Agnes AI</MenuItem>
<MenuItem value="mimo">MiMo ()</MenuItem>
<MenuItem value="ollama">Ollama ()</MenuItem>
</Select>
</FormControl>
@@ -391,6 +395,18 @@ function LLMSettings() {
helperText="用于上下文压缩判断,不传给 API"
/>
)}
{provider === 'mimo' && (
<TextField
size="small"
label="上下文窗口 (contextWindow)"
type="number"
value={mimoCtxWindow ?? 131072}
onChange={(e) => setMimoCtxWindow(Number(e.target.value) || 131072)}
placeholder="如 32768、65536、131072"
slotProps={{ htmlInput: { min: 4096, step: 4096 } }}
helperText="官方未公布具体值,默认 131072,用于压缩判断"
/>
)}
</Stack>
);
}
+1
View File
@@ -90,5 +90,6 @@ export const SHORTCUTS = {
export const PROVIDER_LABELS: Record<string, string> = {
deepseek: 'DeepSeek',
agnes: 'Agnes AI',
mimo: 'MiMo (小米)',
ollama: 'Ollama',
};