来源:互联网 更新时间:2026-08-25 13:26
通过Jotai原子组合实现多模型切换与同步/异步模式一键切换:modelSelectorAtom调度三模型配置,activeModelCallAtom动态路由,syncResponseAtom提供同步模板填充,executeModelCallAtom触发异步流式请求,displayResponseAtom根据modeAtom自动适配渲染模式。

你需要在同一个 React 组件中,让多个 Jotai 原子分别触发不同模型(如 OpenAI、Claude、本地 Ollama)的调用,并能随时在同步渲染(如预设 prompt 模板填充)和异步请求(如 real-time streaming)之间切换。
先定义一个基础原子存储当前选中的模型标识符,它将作为后续所有派生原子的调度开关:
const modelSelectorAtom = atom('openai');
再创建三个独立原子,每个对应一个模型的调用逻辑。注意:它们不直接执行请求,只封装调用意图与参数结构——真正的执行由消费端决定。
const openaiCallAtom = atom((get) => ({ model: 'gpt-4o', messages: get(chatHistoryAtom) }));
const claudeCallAtom = atom((get) => ({ model: 'claude-3-haiku-20240307', messages: get(chatHistoryAtom), max_tokens: 512 }));
const ollamaCallAtom = atom((get) => ({ model: 'llama3.2', messages: get(chatHistoryAtom), options: { temperature: 0.7 } }));
使用一个只读派生原子,根据 modelSelectorAtom 的值返回对应模型的调用配置:
const activeModelCallAtom = atom((get) => {
const selector = get(modelSelectorAtom);
switch (selector) {
case 'openai': return get(openaiCallAtom);
case 'claude': return get(claudeCallAtom);
case 'ollama': return get(ollamaCallAtom);
default: return get(openaiCallAtom);
}
});
这个原子本身不触发网络请求,只是做配置组装。它确保下游无论何时读取,拿到的都是当前选中模型的最新参数快照。
方法一:为每个模型准备一个“模拟响应原子”,用于开发调试或离线 fallback:
const mockOpenaiResponseAtom = atomWithDefault(() => '我已收到您的消息,正在思考中...');
方法二:构建一个带默认值的派生原子,在无异步执行时返回静态内容:
const syncResponseAtom = atom((get) => {
const config = get(activeModelCallAtom);
return `【${config.model}】已加载模板:${JSON.stringify(config.messages.slice(-1)[0]?.content || '')}`;
});
第一步:定义一个可写原子,接收配置并返回 Promise:
const executeModelCallAtom = atom(null, (get, set, config) => {
const controller = new AbortController();
set(abortControllerAtom, controller);
fetch('/api/chat', { method: 'POST', body: JSON.stringify(config), signal: controller.signal })
.then(r => r.json())
.then(data => set(modelResponseAtom, data))
.catch(err => { if (err.name !== 'AbortError') set(errorAtom, err.message) });
});
第二步:在组件中调用它,传入 activeModelCallAtom 的当前值:
const [_, execute] = useAtom(executeModelCallAtom);
useEffect(() => { execute(get(activeModelCallAtom)); }, [activeModelCallAtom]);
第三步:用 useAtomValue 监听 modelResponseAtom 获取结果,或用 useAtom 处理 errorAtom 显示错误。
① 创建控制开关原子:
const modeAtom = atom<'sync' | 'async'>('sync');
② 定义一个响应读取原子,让它能自动适配模式:
const displayResponseAtom = atom((get) => {
const mode = get(modeAtom);
if (mode === 'sync') return get(syncResponseAtom);
return get(modelResponseAtom) || '等待响应...';
});
③ 在用户界面(UI)中设置一个切换按钮:
④ 最终消费:
const response = useAtomValue(displayResponseAtom);
腾讯ima怎么把微信内容一键导入知识库?
腾讯ima怎么创建共享知识库?
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
比特币 2025 年价格预测:BTC 的未来走势
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
WorkBuddy微信版怎么获得积分?
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
短剧《史上最强洪荒修为》剧情介绍
海尔消毒柜自动消毒如何中止
5000元起的鼠标哪个最值得入手?
男生高性价比充电头?
博世壁挂炉关闭暖气怎么操作
腾讯ima知识库怎么分类管理?
车载冰箱重置到出厂设置几步?
Windy卫星云图怎么看?云层变化识别技巧
5000-6000元鼠标有什么推荐?
管线机怎么接云米净水器
笔记本移动电源推荐哪款?
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc