工程建设网站怎么提交,档案网站开发,青岛网站建设‘’,梧州网站建设设计最近Vibe Code在各种技术社区刷屏#xff0c;不过说实话#xff0c;在日常工作中#xff0c;我更多是用LLM来生成文档、批量修改代码或者排查问题。毕竟业务需求嘛#xff0c;很少有能一次性描述清楚的#xff08;懂的都懂哈哈~#xff09;。但在看了最新的SWE-Bench Pro…最近Vibe Code在各种技术社区刷屏不过说实话在日常工作中我更多是用LLM来生成文档、批量修改代码或者排查问题。毕竟业务需求嘛很少有能一次性描述清楚的懂的都懂哈哈~。但在看了最新的SWE-Bench Pro评测后我决定尝试一下端到端的AI编程体验。前两章我们讨论了JupyterAgent当时用的是E2B的代码沙箱。这次我决定自己动手用字节的TRAE从头构建一个Python代码沙箱并加入MCP支持。完整代码已经开源在simple_sandboxStar is Welcomed个人体感TRAE在国内Coding IDE里算Very Good比开源的ClineKilo等在Token使用上效率更高但和cursor还有距离。如何最大化Token使用效率和效果是个系统工程问题~Vibe Coding实战从零构建代码沙箱本来想完整分享整个Vibe Coding过程的结果TRAE升级把历史对话记录清空了哭。那就跟大家分享一下我的操作思路和最终成果吧我在使用AI IDE时通常有两种策略模型主导让模型先做整体规划我人工调整后让模型执行依赖模型的测试文件和执行报错进行迭代优化人工主导我自己拆解任务让模型逐步实现每一步都进行人工校验如何选择这两种模式完全取决于我对于整个项目是否有很强的先验思考哈哈就是我知道怎么做的我带着模型做我不知道的模型带着我做。这次的任务因为有E2B的SDK可以参考我选择了人工主导的方式将任务拆解成几个明确的步骤沙箱核心功能沙箱创建、环境初始化、代码执行功能完善结构化输出、预装环境、工作目录隔离、中文字体支持扩展功能文件上传、文件获取、超时关闭服务化搭建FastAPI服务接口客户端Demo创建请求示例文档撰写完善的README最终模型实现的沙箱核心类如下完整代码请移步Github在整个编码过程中我只在功能设计层面做了调整没有发现任何编码错误# 沙箱类class Sandbox:def __init__(self, sandbox_id: str, work_dir: str, venv_dir: str):self.sandbox_id sandbox_idself.work_dir work_dirself.venv_dir venv_dir# 配置KernelManager使用虚拟环境中的Python解释器self.kernel_manager KernelManager(kernel_namepython3,kernel_spec_managerself._create_custom_kernel_spec_manager())# 设置环境变量env os.environ.copy()env[VIRTUAL_ENV] venv_dir# 设置内核使用虚拟环境中的Pythonself.kernel_manager.start_kernel(cwdwork_dir,envenv,)self.kernel_client self.kernel_manager.client()self.kernel_client.start_channels()self.kernel_client.wait_for_ready()self.last_execute_id 0# 复制字体文件到沙箱工作目录font_source_path os.path.join(os.path.dirname(os.path.abspath(__file__)), SimHei.ttf)font_dest_path os.path.join(work_dir, SimHei.ttf)if os.path.exists(font_source_path):try:shutil.copy2(font_source_path, font_dest_path)print(f字体文件已复制到: {font_dest_path})except Exception as e:print(f复制字体文件失败: {e})else:print(f未找到字体文件: {font_source_path})# 安装基本包self._install_basic_packages()# 执行字体注册代码self.execute_code(font_code)def _create_custom_kernel_spec_manager(self):# 创建自定义的内核规范管理器确保使用正确的Python环境from jupyter_client.kernelspec import KernelSpecManagerksm KernelSpecManager()return ksmdef _install_basic_packages(self):# 在虚拟环境中安装基本包# 如果是从镜像复制的环境可能已经包含了基本包这里可以跳过或仅检查try:# 直接使用Linux路径设置pip_path os.path.join(self.venv_dir, bin, pip)python_exe os.path.join(self.venv_dir, bin, python)# 检查ipykernel是否已安装check_result subprocess.run([python_exe, -c, import ipykernel],capture_outputTrue,textTrue)# 如果ipykernel未安装则安装if check_result.returncode ! 0:print(ipykernel未安装开始安装...)subprocess.check_call([pip_path, install, ipykernel])except Exception as e:print(f安装基础包失败: {e})def execute_code(self, code: str) - Dict:# 生成执行IDself.last_execute_id 1# 执行代码msg_id self.kernel_client.execute(code)stdout []stderr []error Noneresults []# 收集执行结果while True:try:msg self.kernel_client.get_iopub_msg(timeout3600)msg_type msg[header][msg_type]if msg[parent_header].get(msg_id) ! msg_id:continueelif msg_type stream:content msg[content]if content[name] stdout:stdout.append(content[text])elif content[name] stderr:stderr.append(content[text])elif msg_type error:content msg[content]# 合并error字段包含ename、evalue和tracebackerror {name:ansi_escape.sub(, content[ename]),value: ansi_escape.sub(,content[evalue]),traceback: [ansi_escape.sub(, i) for i in content[traceback]]}elif msg_type execute_result:# 处理执行结果按照{type,data}格式存储data msg[content][data]for data_type, data_value in data.items():results.append({type: data_type, data: data_value})elif msg_type display_data:# 处理显示数据按照{type,data}格式存储data msg[content][data]for data_type, data_value in data.items():results.append({type: data_type, data: data_value})elif msg_type execute_reply:breakelif msg_type status:if msg[content][execution_state] idle:breakexcept Exception:breakreturn {stdout: [ansi_escape.sub(, i) for i in stdout],stderr: [ansi_escape.sub(, i) for i in stderr],error: error,results: results}def upload_file(self, file: UploadFile, file_path: Optional[str] None) - str:# 确定文件保存路径默认为工作目录最简化codeif file_path:save_path os.path.join(self.work_dir, file_path)else:save_path os.path.join(self.work_dir, file.filename)# 确保目标目录存在os.makedirs(os.path.dirname(save_path), exist_okTrue)# 保存文件with open(save_path, wb) as f:shutil.copyfileobj(file.file, f)return save_pathdef get_files(self) - List[Dict[str, str]]:files []for root, _, filenames in os.walk(self.work_dir):for filename in filenames:file_path os.path.join(root, filename)relative_path os.path.relpath(file_path, self.work_dir)files.append({path: relative_path,size: os.path.getsize(file_path)})return filesdef get_file_path(self, file_path: str) - str:full_path os.path.abspath(os.path.join(self.work_dir, file_path))# 安全检查确保文件在工作目录内if not full_path.startswith(os.path.abspath(self.work_dir)):raise HTTPException(status_code403, detailFile access denied)return full_pathdef shutdown(self):try:self.kernel_client.stop_channels()self.kernel_manager.shutdown_kernel()# 清理工作目录shutil.rmtree(self.work_dir, ignore_errorsTrue)# 清理虚拟环境目录shutil.rmtree(self.venv_dir, ignore_errorsTrue)except Exception:passdef install_package(self, package_name: str) - Dict:在沙箱的虚拟环境中安装Python包try:# 获取虚拟环境中的pip路径Linux环境pip_path os.path.join(self.venv_dir, bin, pip)# 执行pip安装命令result subprocess.run([pip_path, install, package_name],capture_outputTrue,textTrue,timeout60 # 设置超时时间)# 检查安装是否成功if result.returncode 0:return {success: True,stdout: result.stdout,stderr: result.stderr,message: f成功安装包: {package_name}}else:return {success: False,stdout: result.stdout,stderr: result.stderr,message: f安装包失败: {package_name}}except Exception as e:return {success: False,stdout: ,stderr: str(e),message: f安装过程出错: {str(e)}}用FastAPI-MCP打造标准化MCP服务沙箱服务跑通后我决定将其打包成标准的MCP服务。这时候就轮到FastAPI-MCP出场了就像我们在解密prompt系列58. MCP - 工具演变 MCP基础中提到的MCP本身并不是工具它只是Adapter而FastAPI-MCP库完美体现了这一特性——它可以将现有的FastAPI工具直接转换成标准MCP服务。但这里遇到了一个常见问题大模型对新的library支持不够好。解决方案是使用上下文管理模块将API接口文档加入上下文。这种方法特别适用于这两年的新LibraryMCP etc.大版本更新的Lirabry: 例如ES 7.XX - Elastic Search 8.XXimage这样我们就可以引用对应的API文档让TRAE帮我们进一步把服务借助FastAPI-MCP包装成MCP服务并使用FastMCP给出请求Demo。而FastAPI-MCP的使用也非常简单只需要添加三行代码就可以完成MCP服务的适配from fastapi_mcp import FastApiMCP# 创建并挂载MCP服务器 - 移到所有端点定义之后mcp FastApiMCP(app)mcp.mount_http()接下来我把FastMCP的接口文档加入上下文让模型生成MCP Client来验证服务。但运行时发现MCP服务可以请求成功list_tool却显示为空。通过观察输入输出来定位问题TRAE成功找到了问题所在并进行了修复。image