avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 注册 Chat Participant
文章

注册 Chat Participant

发表于 9天前 更新于 9天前
作者 mdo
12~15 分钟 阅读

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。

结合当前 code_generator.py 的架构,实现这一对接需要分为 VS Code 扩展端开发 与 Python 后端适配 两步:

1. VS Code 扩展端:注册 Chat Participant

VS Code 的 Chat API 采用“参与者”机制。你可以注册一个名为 @codegen 的参与者,用户在聊天框输入 @codegen 帮我写一个带审核的博客 时,扩展会拦截请求并调用你的 Python 服务。

扩展核心逻辑 (extension.ts):

typescript

 复制 插入 新文件

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    // 注册 Chat Participant
    const handler: vscode.ChatRequestHandler = async (request, context, progress, token) => {
        const userPrompt = request.prompt;
        
        // 实时反馈:告知用户正在连接服务
        progress.report({ message: '正在连接 CodeGeeX 代码生成服务...' });

        try {
            // 调用后端的 /api/v1/crew/generate-code 接口
            const response = await fetch('http://localhost:8000/api/v1/crew/generate-code', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    requirement: userPrompt,
                    callback_url: 'http://localhost:8000/api/v1/vscode/callback', // 专为VS Code设置的回调
                    mode: 'full'
                })
            });
            
            // 返回 Markdown 格式的代码块给 VS Code Chat 窗口
            progress.report({ message: '任务已分发,AI 团队正在编写...' });
            
        } catch (error) {
            progress.report({ message: `服务调用失败: ${error}` });
        }
    };

    const chatParticipant = vscode.chat.createChatParticipant('codegen.codegeeX', handler);
}

2. 后端适配:处理同步与流式响应冲突

当前 code_generator.py 的核心设计是异步回调(接口立刻返回,通过 post_callback 推送结果给 TP6)。但 VS Code Chat API 期望的是同步或流式等待(扩展发出请求后,通过 progress.report 逐步推给用户,直到请求结束)。

为了兼容 VS Code,建议在后端增加一个同步等待接口,或者改造回调逻辑。

方案:新增同步轮询/等待接口

代码位置:code_generator.py
在 CodeGenerationRequest 旁新增一个专供本地 IDE 调用的同步模型:

python

 复制 插入 新文件

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio

# ... 省略已有代码 ...

@app.post("/api/v1/crew/generate-code-sync")
async def generate_code_sync(data: CodeGenerationRequest):
    """
    专为 IDE 插件提供的同步生成接口,直接返回结果而不依赖异步回调。
    """
    # 复用已有的核心逻辑,但不触发 post_callback
    references = _scan_references(data.reference_group or CODEGEN_REFERENCES_GROUP or "common")
    llm = LLM(
        model=LITELLM_MODEL,
        api_key=ZHIPU_API_KEY,
        base_url=ZHIPU_BASE_URL,
        temperature=0.2,
    )
    
    # 直接调用核心 Crew 运行逻辑(需将 run_coding_crew 中的核心执行抽离为纯函数)
    # 此处伪代码表示直接等待结果
    raw_result = await run_coding_crew_core(data.requirement, data.mode, llm, references)
    output_str = _crew_output(raw_result)
    clean_result = parse_json(output_str)
    
    if clean_result is None:
        raise ValueError("AI 输出无法解析为有效的代码包")
        
    # 将结果格式化为 VS Code 容易解析的 Markdown
    markdown_response = f"## SQL\n```sql\n{clean_result['sql']}\n```\n"
    markdown_response += f"## Controller\n```php\n{clean_result['controller']}\n```\n"
    markdown_response += f"## Service\n```php\n{clean_result['service']}\n```\n"
    markdown_response += f"## Model\n```php\n{clean_result['model']}\n```"

    return {"markdown": markdown_response}

3. 进阶体验:接入 VS Code 的文件写入与 Diff 操作

VS Code Chat API 的强大之处在于不仅能聊天,还能直接操作工作区。当后端返回代码后,扩展可以利用 vscode.workspace.applyEdit 将生成的代码直接写入项目,并弹出 Diff 视图让用户确认。

扩展端处理返回结果并写入文件:

typescript

 复制 插入 新文件

// 接收到后端返回的 clean_result 后
const phpControllerUri = vscode.Uri.file(path.join(workspaceRoot, 'app/controller/BlogController.php'));
const newCode = clean_result.controller;

// 创建新文件或覆盖现有文件,并通过 Diff 视图展示变更
const edit = new vscode.WorkspaceEdit();
edit.createFile(phpControllerUri, { overwrite: true });
edit.insert(phpControllerUri, new vscode.Position(0, 0), newCode);
await vscode.workspace.applyEdit(edit);

// 在 Chat 窗口提供一键查看 Diff 的按钮
progress.report({ 
    message: '代码已生成至工作区', 
    command: { title: '查看变更', command: 'vscode.diff', arguments: [/* original uri, modified uri */] }
});

总结

  1. 交互模式转变:将 TP6 的“异步回调”转变为 VS Code 友好的“请求-同步等待/流式”模式。

  2. 协议适配:在 Python 端增加 /api/v1/crew/generate-code-sync 接口,返回结构化的 Markdown 代码块。

  3. 扩展桥接:开发一个 VS Code Extension,注册 @codegen Chat Participant,拦截用户对话,调用同步接口,并利用 VS Code API 将生成的代码安全地(通过 Diff)写入编辑器。

技术
许可协议:  CC BY 4.0
分享

相关文章

10月 2, 2026

iOS 侧载(Sideloading)工具

AltStore 和 Sideloadly 都是目前最流行的 iOS 侧载(Sideloading)工具。 简单来说,它们的作用就是让你绕过苹果的官方 App Store,直接把第三方的 IPA 安装包(也就是 iOS 的应用安装文件)安装到你的 iPhone 或 iPad 上。 通过这两个工具,你

9月 28, 2026

注册 Chat Participant

将当前服务接入 VS Code 的 AI 聊天窗口是完全可行的。VS Code 在近期的版本中正式推出了 Chat Extensions API(github.copilot.chat),允许第三方扩展将自定义的 LLM 服务或工具注册到 Copilot Chat 面板中。 结合当前 code_ge

9月 23, 2026

php intelephense 设置 if 空格

在 VS Code 中,如果你使用的是 PHP Intelephense 插件,控制 if 关键字后面是否加空格的设置是由其内置的格式化引擎(基于 PSR-12 标准)决定的。 你可以通过修改 VS Code 的 settings.json 来配置这个行为: 1. 开启 if 后面的空格(默认/推荐

下一篇

中秋给在外游子的一封信

上一篇

程序员越想创业,越不要急着动手

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。