核心是用QNetworkAccessManager发HTTP POST请求:设Content-Type为application/json,用QJsonDocument构造请求体,以成员变量方式持有manager,连接finished信号异步处理响应,并将response追加至QTextEdit显示。

Qt 调用大模型 API 实现 AI 聊天,核心是用 QNetworkAccessManager 发 HTTP 请求,不是封装模型也不是写推理逻辑——你只负责把 prompt 发过去,把 response 解出来,再塞进 QTextEdit 显示。本地跑 Ollama 或调云端 API(如 DeepSeek、Qwen),流程一致,差异只在 URL、请求体字段和鉴权方式。
怎么发请求:QNetworkAccessManager + POST + JSON
Qt 原生网络模块就能搞定,不用额外装 libhv 或 QtHttpServer。关键点不是“能不能发”,而是“怎么发才不卡主线程、不丢响应、不错乱字符”。
-
QNetworkAccessManager必须是成员变量(不能函数内临时 new),否则请求发出后对象析构,QNetworkReply立刻被销毁,信号收不到 - POST 时必须显式设置
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"),漏掉这句,Ollama 或某些云 API 直接返回 415 错误 - 请求体用
QJsonDocument构造,别手拼字符串;中文 prompt 一定要用QJsonDocument::toJson(),否则 UTF-8 字节流可能被截断 - 务必连接
finished信号到槽函数,别用waitForFinished()—— 这会阻塞 UI,用户点十次发送,界面就冻十秒
怎么处理 Ollama 的 /api/generate 流式响应
Ollama 默认走流式(stream=true),每行一个 JSON 对象,但 Qt 的 QNetworkReply 是一次性吐完全部响应体。如果你没关 stream,收到的是多段 JSON 拼在一起的乱码,QJsonParseError 报错 “Illegal value”。
- 最简单办法:发请求前在 JSON 体里加
"stream": false,让 Ollama 返回单个完整 JSON - 真要流式?得自己按换行符
\n切分响应体,对每段调QJsonDocument::fromJson(),再取response["response"].toString()追加到对话框 - Ollama 默认端口是
http://localhost:11434,路径固定为/api/generate,模型名填"qwen2.5:7b"这种 tag,不是qwen7b—— 错了就 404
怎么填 Authorization:Bearer 还是 X-Key?
鉴权方式完全取决于你调哪个 API。Ollama 本地部署**不需要 token**;但 DeepSeek、通义千问开放平台、文心一言这些必须带凭证,且格式不统一。
大模型 Token 成本节约工具。在请求到达大模型之前自动压缩 prompt 和上下文,减少 60-95% 的 token 消耗,直接降低 API 成本。支持 Claude/OpenAI/Gemini 等主流模型,提供代理模式、CLI 包装、Python SDK 和 MCP Server 四种接入方式。内置一键安...
- DeepSeek:Header 加
"Authorization": "Bearer sk-xxx",key 从官网复制,注意开头是sk-,别带空格 - 文心一言(ERNIE Bot):Header 加
"X-App-Key": "xxx"和"X-Signature": "xxx",还要算时间戳和签名,不建议新手硬啃 - 通义千问(DashScope):Header 加
"Authorization": "Bearer YOUR_DASHSCOPE_API_KEY",但 endpoint 是https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation,不是 Ollama 那套 - 千万别把 API Key 写死在代码里,至少放
QSettings或启动时弹输入框——打包发给别人,key 就裸奔了
QTextEdit 显示 markdown 为什么全是纯文本?
大模型返回的 response 通常是带 \*\*粗体\*\*、```code``` 的 markdown,但 QTextEdit 默认当纯文本渲染,setMarkdown() 又不支持所有语法(比如表格、脚注直接崩)。这不是 Qt bug,是设计如此。
- 简单方案:用正则把
**(.+?)**替成\1,`(.+?)`替成,再用\1setHtml()渲染——够用,但别指望完美还原 GPT 输出 - 别碰
QWebEngineView:体积大、启动慢、跨平台打包麻烦,一个聊天窗口拉起 Chromium 太重 - 如果返回含大量代码块,记得把
>&HTML 转义,否则会被当成标签吃掉真正卡住人的从来不是“怎么连上 API”,而是 response 字段名不一致(Ollama 返回
response,DeepSeek 返回choices[0].message.content)、HTTP 状态码没检查(429 被限频时 response body 是空的)、或者 QTextEdit 追加文本时没移动光标到底部导致新消息看不见——这些细节不写死在代码里,调试起来比模型本身还费劲。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










