【Ai插件开发】Notepad++ AI插件开发进阶:集成Ai模型问答功能与流式交互实现

一、项目背景与架构演进

前篇完成插件基础框架构建后,本文重点突破AI能力集成关键技术。面向开发者日常场景,实现"选中即问AI"的轻量化交互模式,为后续打造智能编程助手奠定基础。通过结合自主研发的WinHttp封装库与Scintilla交互优化技术,实现以下目标架构:
Notepad++插件 Scintilla交互层 配置管理模块 AI通信引擎 WinHttp封装库 流式处理管道 文本编码转换 Chunk解析器 打字机动画渲染

:项目已开源镜像,欢迎使用及指正

二、核心开发流程

2.1 整体架构设计

用户操作 选中文本 点击插件菜单 获取选中内容 构建AI请求 流式HTTP请求 异步响应处理 动态文本渲染 结果可视化

2.2 配置管理实现

通过JSON配置实现参数解耦:

cpp 复制代码
// PluginConf.h
class PlatformConf {
public:
    std::string _baseUrl;      // API基础地址
    std::string _apiSkey;      // 认证密钥
    std::string _modelName;    // 模型标识
    std::string _generateEndpoint; // 生成接口
    std::string _chatEndpoint; // 对话接口
};

配置加载流程:
用户操作 插件核心 文件系统 JSON解析器 启动插件 读取config.json 返回原始配置数据 解析配置内容 返回结构化配置对象 用户操作 插件核心 文件系统 JSON解析器

2.3 流式交互实现

采用生产者-消费者模式处理异步响应
cpp 复制代码
// 流式处理管道
class Typewriter {
    using FNRead = std::function<int(std::string&)>;
    using FNWrite = std::function<void(const std::string&)>;
    
    void Run() {
        std::string buffer;
        while(m_getter(buffer)) {
            m_writer(buffer);
            std::this_thread::sleep_for(50);
        }
    }
};
流式通信机制的异步处理模型

UI线程 工作线程 WinHttp 发起AI请求 建立HTTPS连接 返回流式句柄 启动数据监听 缓存数据块 轮询接收并显示数据 loop [数据接收] 结束信号 完成通知 UI线程 工作线程 WinHttp

数据包处理流程

是 否 原始数据块 包含完整JSON? 解析内容片段 缓存待拼接 提取文本内容 追加渲染队列

抗粘包策略
cpp 复制代码
bool ParseStreamResponse(std::string& resp, std::string& content) {
    size_t pos = resp.find("\n\n");
    if (pos == string::npos) return false;
    
    string chunk = resp.substr(0, pos);
    resp.erase(0, pos + 2);
    
    if (chunk.find("data: ") == 0)
        chunk = chunk.substr(6);
    
    try {
        auto j = json::parse(chunk);
        content = j["choices"][0]["delta"]["content"];
        return true;
    } catch (...) {
        resp = chunk + resp;  // 回退异常数据
        return false;
    }
}

2.4 编码转换优化

实现多编码自动适配:

cpp 复制代码
std::string ConvEncoding(const char* src, size_t len, UINT from, UINT to) {
    int required = MultiByteToWideChar(from, 0, src, len, nullptr, 0);
    std::wstring wstr(required, 0);
    MultiByteToWideChar(from, 0, src, len, &wstr[0], required);
    
    required = WideCharToMultiByte(to, 0, wstr.c_str(), wstr.size(), nullptr, 0, nullptr, nullptr);
    std::string result(required, 0);
    WideCharToMultiByte(to, 0, wstr.c_str(), wstr.size(), &result[0], required, nullptr, nullptr);
    return result;
}

三、关键技术解析

3.1 流式响应处理

完整JSON 不完整 HTTP响应流 Chunk缓冲区 数据完整性校验 解析提取内容 内容追加 UI刷新

3.2 多线程架构

通过消息队列通信 AIWorker +std::thread worker +std::atomic _streamActive +void StreamReceiver() UIUpdater +void AddText(const std::string&) +void ScrollCaret()

3.3 异常处理机制

cpp 复制代码
try {
    cli.Post(endpoint, payload, response);
} catch (const WinHttpException& e) {
    MessageBox(nullptr, e.what(), L"网络错误", MB_ICONERROR);
} catch (const std::exception& e) {
    OutputDebugStringA(e.what());
}

四、效果演示

五、总结与展望

5.1 技术总结

本文实现的核心技术点包括:

  • 基于ScintillaCall的类型安全交互
  • OpenAi模型接入
  • 流式响应处理管道
  • 多线程协同工作机制
  • 跨编码文本处理方案

5.2 后续规划

可探索的进阶方向:
基础问答 代码补全 智能重构 项目级分析 多模态交互

通过本实践,开发者可掌握AI插件开发的核心技术,可快速构建高响应、低延迟的AI增强型编辑器插件,为构建智能化开发环境奠定基础。

注:项目已开源镜像,欢迎使用及指正

相关推荐
数智化精益手记局37 分钟前
拆解物料管理erp系统的核心功能,看物料管理erp系统如何解决库存积压与缺料难题
大数据·网络·人工智能·安全·信息可视化·精益工程
Flying pigs~~1 小时前
RAG 完整面试指南:原理、优化、幻觉解决方案
人工智能·prompt·rag·智能体·检索增强生成·rag优化
博.闻广见1 小时前
AI_概率统计-2.常见分布
人工智能·机器学习
企业架构师老王1 小时前
2026制造业安全生产隐患识别AI方案:从主流产品对比看企业级AI Agent的非侵入式落地路径
人工智能·安全·ai
Aleeeeex1 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程
冬奇Lab1 小时前
一天一个开源项目(第87篇):Tank-OS —— Red Hat 工程师用一个周末,把 AI Agent 塞进了一个可启动的 Linux 镜像
人工智能·开源·资讯
小糖学代码1 小时前
LLM系列:2.pytorch入门:8.神经网络的损失函数(criterion)
人工智能·深度学习·神经网络
Captaincc2 小时前
转发-中央网信办部署开展“清朗·整治AI应用乱象”专项行动
人工智能·vibecoding
AI自动化工坊2 小时前
Late框架技术深度解析:5GB VRAM实现10倍AI编码效率的工程架构
人工智能·5g·架构·ai编程·late
我是大聪明.2 小时前
DeepSeek V4 Pro + 华为昇腾910:国产大模型落地的性能实测与深度解析
人工智能·华为