注册 Chat Participant
将当前服务接入 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 */] }
});
总结
交互模式转变:将 TP6 的“异步回调”转变为 VS Code 友好的“请求-同步等待/流式”模式。
协议适配:在 Python 端增加
/api/v1/crew/generate-code-sync接口,返回结构化的 Markdown 代码块。扩展桥接:开发一个 VS Code Extension,注册
@codegenChat Participant,拦截用户对话,调用同步接口,并利用 VS Code API 将生成的代码安全地(通过 Diff)写入编辑器。