开源 AI 代码编辑器

多智能体开发的首选平台

下载 Visual Studio Code

使用 VS Code 即表示您同意其 许可协议隐私声明

交互式演示,展示了带有智能体对话 (Agent Sessions)、示例标签页和 Copilot 聊天的 Visual Studio Code 界面;使用导航探索编辑器内容。
代理会话
本地聊天智能体 重构 MailList 组件结构 GitHub Copilot 云智能体 将 MailListItem 提取为独立组件 10 分钟 #1
+42 -24
GitHub Copilot CLI 智能体 启动 CLI 智能体对话
MailList.tsx MailListItem.tsx 将 MailListItem 提取为独立组件
import { For, createSignal, createMemo } from "solid-js";
import { useNavigate, useParams } from "@tanstack/solid-router";
import { getEmailsForMailbox } from "~/data/emails";
import { MailListItem } from "~/components/MailListItem";

export function MailList() {
  const params = useParams({ strict: false }) as {
    mailbox?: string;
    id?: string;
  };
  const navigate = useNavigate();
  const [query, setQuery] = createSignal("");
  const mailbox = () => params.mailbox || "inbox";
  const list = createMemo(() => {
    const q = query().toLowerCase();
    return getEmailsForMailbox(mailbox()).filter(
      (e) =>
        !q ||
        e.subject.toLowerCase().includes(q) ||
        e.snippet.toLowerCase().includes(q)
    );
  });
  function open(id: string) {
    navigate({
      to: "/mail/$mailbox/$id",
      params: { mailbox: mailbox(), id },
      search: (prev) => prev,
    });
  }

  return (
    <For each={list()}>
      {(e) => (
        <div
          role="listitem"
          tabindex={0}
          onClick={() => open(e.id)}
          onKeyDown={(ev) => ev.key === "Enter" && open(e.id)}
          class="mail-item"
          data-selected={params.id === e.id ? "true" : undefined}
          aria-selected={params.id === e.id ? "true" : undefined}
        >
          <div>
            <div class="mail-item-subject truncate">{e.subject}</div>
            <div class="mail-item-snippet truncate">{e.snippet}</div>
          </div>
          <time
            class="text-xs muted"
            datetime={e.date}
            title={new Date(e.date).toLocaleString()}
          >
            {new Date(e.date).toLocaleDateString(undefined, {
              month: "short",
              day: "numeric",
            })}
          </time>
        </div>
        <MailListItem
          email={e}
          isSelected={params.id === e.id}
          onOpen={open}
        />
      )}
    </For>
  );
}
聊天
请更新 MailList 组件,将邮件列表项抽象为它们自己的独立组件 GitHub Copilot 云智能体 委托给云智能体 该智能体将异步工作,以创建包含您所请求更改的拉取请求。 kenzi.lawson avatar kenzi.lawson选择了“委托” GitHub Copilot 云智能体 [WIP] 重构 MailList 以抽象邮件列表项 - Copilot 云智能体已开始处理“请更新 MailList...”请求,并将随着工作的进展更新此拉取请求。请更新 MailList 组件,将各个邮件列表项抽象为它们自己的组件。由 VS Code 通过 GitHub Pull Request 扩展创建。✨ 让 Copilot 编码智能体为您设置一切 — 当针对您的仓库进行配置时,编码智能体工作速度更快,质量更高。 GitHub Copilot 云智能体已开始处理您的请求。在关联的聊天和拉取请求中跟踪其进度。 MailList.tsx
描述接下来要构建的内容
代理 Claude Opus 4.6

为您构建的智能体

将任务移交给能够自主规划、进行代码更改、运行命令并迭代直到工作完成的 AI 智能体。

例如,分配一个基于 CLI 的智能体在后台进行分类并修复错误,与另一个智能体交互以在集成浏览器中使用实时验证来实现功能,并将主页重构委托给一个云智能体,该智能体为您团队的审查打开一个拉取请求。

开始使用代理
带有 VS Code 标签页、侧边栏和聊天交互的交互式智能体演练;使用标准键盘导航探索每个窗格。
batch.go processor.go image_processor_test.go health.go main.go
package http

import (
    "io"
    "log/slog"
    "mime/multipart"
    "net/http"
    "strings"
)

type BatchItemResult struct {
    Name string `json:"name"`
    Metadata *struct {
        Format string `json:"format"`
        Width  int    `json:"width"`
        Height int    `json:"height"`
        Bytes  int    `json:"bytes"`
    } `json:"metadata,omitempty"`
    Error string `json:"error,omitempty"`
}

type BatchResponse struct {
    Results []*BatchItemResult `json:"results"`
    Count   int                `json:"count"`
    Success int                `json:"success"`
    Failed  int                `json:"failed"`
}

// handleProcessBatch processes multiple uploaded images (multipart/form-data) under the field name "files".
// It returns metadata for each image or an error per item without failing the whole batch unless the request is malformed.
func (s *Server) handleProcessBatch(w http.ResponseWriter, r *http.Request) {
    // Enforce max body size overall.
    r.Body = http.MaxBytesReader(w, r.Body, s.cfg.MaxUploadBytes)
    if ct := r.Header.Get("Content-Type"); !strings.HasPrefix(ct, "multipart/form-data") {
        s.writeJSON(w, http.StatusBadRequest, map[string]string{"error": "content type must be multipart/form-data"})
        return
    }
    if err := r.ParseMultipartForm(s.cfg.MaxUploadBytes); err != nil {
        status := http.StatusBadRequest
        if strings.Contains(err.Error(), "request body too large") {
            status = http.StatusRequestEntityTooLarge
        }
        s.writeJSON(w, status, map[string]string{"error": "invalid multipart form: " + err.Error()})
        return
    }

    // Accept files under the key "files". If absent, attempt to fallback to any file parts.
    var fileHeaders []*multipart.FileHeader
    if r.MultipartForm != nil && len(r.MultipartForm.File["files"]) > 0 {
        fileHeaders = r.MultipartForm.File["files"]
    } else if r.MultipartForm != nil {
        // Fallback: gather all files across keys.
        for _, fhs := range r.MultipartForm.File {
            fileHeaders = append(fileHeaders, fhs...)
        }
    }

    if len(fileHeaders) == 0 {
        s.writeJSON(w, http.StatusBadRequest, map[string]string{"error": "no files provided (expect key 'files')"})
        return
    }

    resp := &BatchResponse{Results: make([]*BatchItemResult, 0, len(fileHeaders))}

    for _, fh := range fileHeaders {
        item := &BatchItemResult{Name: fh.Filename}
        f, err := fh.Open()
        if err != nil {
            item.Error = "open file: " + err.Error()
            resp.Results = append(resp.Results, item)
            resp.Failed++
            continue
        }
        data, err := io.ReadAll(f)
        _ = f.Close()
        if err != nil {
            item.Error = "read file: " + err.Error()
            resp.Results = append(resp.Results, item)
            resp.Failed++
            continue
        }
        meta, err := s.proc.ExtractMetadata(data)
        if err != nil {
            item.Error = err.Error()
            resp.Results = append(resp.Results, item)
            resp.Failed++
            continue
        }
        // Copy into anonymous struct to decouple from internal type if it changes.
        item.Metadata = &struct {
            Format string `json:"format"`
            Width  int    `json:"width"`
            Height int    `json:"height"`
            Bytes  int    `json:"bytes"`
        }{Format: meta.Format, Width: meta.Width, Height: meta.Height, Bytes: meta.Bytes}
        resp.Results = append(resp.Results, item)
        resp.Success++
    }

    resp.Count = len(resp.Results)
    s.log.LogAttrs(r.Context(), slog.LevelInfo, "batch processed", slog.Int("count", resp.Count), slog.Int("success", resp.Success), slog.Int("failed", resp.Failed))
    s.writeJSON(w, http.StatusOK, resp)
}
Copilot Claude Code - VSCode · AI 代码编辑器 Claude Code Codex - VSCode · AI 代码编辑器 Codex Cline - VSCode · AI 代码编辑器 Cline Gemini - VSCode · AI 代码编辑器 Gemini 聊天
我正在构建一个图像处理服务。你能帮我创建一个实现批量图像处理支持的新端点吗?
创建待办事项列表 我从创建待办事项列表开始,管理诸如读取现有服务器和处理器代码、设计批量端点契约以及使用处理程序实现新文件等任务。我打算将处理程序连接到服务器路由中,并可能为批量端点添加一个最小化的测试,尽管这是可选的。我还计划在之后运行测试并构建所有内容。让我们执行它!
为实现批量图像处理端点创建一个结构化的待办事项列表。 创建了 7 个待办事项 在添加批量端点之前,先读取核心文件以了解当前的服务器和图像处理实现。 读取server.go 读取processor.go 读取logging.go 读取health.go
正在改进文件处理... 我可以修改 server.go,但他们要求创建一个新文件。所以我需要创建一个路由,让我们称之为 /process/batch。我将强制执行最大正文大小,并确保内容类型为 multipart/form-data。接下来,我将解析表单并遍历 form.File["files"]。 对于每个 FileHeader,我将打开它并读取字节,然后调用 ExtractMetadata 来收集结果。最后,我将返回一个结构化的 JSON 响应并处理无文件和最大批量限制的边缘情况。 我认为这可能不是绝对必要的,但我正在考虑通过使用 sync.WaitGroup 来按顺序处理每个文件,同时限制并发量来做一个小的改进。这将使初始提交更简单。我需要添加代码文件并导入内部图像引用别名。 接下来,我将查看 tests/image_processor_test.go 中的现有测试,以查看样式并确定我是否应该为批量处理程序创建一个新的测试文件。我将通读该文件,然后更新待办事项状态,将第一项和第二项标记为已完成。
在添加批量端点之前读取现有测试以模仿样式,然后将继续进行设计和实现。 读取image_processor_test.go
为 HTTP 测试做准备 我需要运行一个 HTTP 测试,但我注意到当前的测试包在“tests”中,而不是在主模块内。为了进行 HTTP 测试,我必须设置一些东西,例如配置、处理器、记录器和服务器,并发送一个多部分请求。我的下一步是检查 config.go 中的配置,以了解我需要包含哪些必填字段。让我们深入研究一下!
读取配置以在 HTTP 测试中构建服务器。 读取config.go
管理更新和补丁 我需要使用 manage_todo_list 来保持一切井井有条,确保我不会遗漏任何任务。一旦完成,我就可以继续应用补丁。这将涉及添加一个新文件并对 server.go 进行编辑。我想确保在这个过程中一切都清晰准确,以避免在此过程中出现任何错误。让我们继续前进!
开始 (3/7) 设计批量契约
实现更新和测试 我已将设计契约标记为已完成,接下来需要实施更新。我将继续管理待办事项列表并应用补丁来添加文件并更新 server.go。看来我可能需要在 server.go 中为 /process/batch 添加一个路由,并实现一个新文件 internal/http/batch.go。编写代码后,我将添加一个测试文件,使用 go test 运行测试,并使用 run_in_terminal 命令。让我们开始吧!
已完成 (3/7) 设计批量契约 应用补丁以添加批量处理程序、路由以及测试。 server.go+1 -0 batch.go+106 -0 batch_endpoint_test.go+123 -0 实现了新的批量图像处理端点 已更改 / 添加的文件
  • server.go: 注册了新路由 POST /process/batch。
  • batch.go: 新处理程序 handleProcessBatch,该处理程序
    • 接受 multipart/form-data。
    • 读取 files 键下的多个文件(如果缺少 files,则回退到任何文件部分)。
    • 返回每个文件的成功/错误,而不会导致整个批次失败。
    • 汇总计数:总数、成功、失败。
  • batch_endpoint_test.go: 测试了正常路径(1 个有效 + 1 个无效文件)和缺少文件的错误情况。
建议的后续步骤(可选)
  • 添加可配置的每批最大文件数(例如通过配置)。
  • 针对超大图像的有限内存流处理(处理 + 丢弃)。
  • 具有工作池和上下文取消的可选并行处理。
  • 在解码之前添加每个文件的大小验证。
  • 支持非多部分客户端的基于 JSON 的批处理(URL 或 base64)。
如果您需要任何这些增强功能或更喜欢不同的请求/响应格式,请告诉我。
batch.go
描述接下来要构建的内容
代理 Gemini 3 Pro (预览版)

任何智能体,任何模型

使用适合您工作流程的智能体工具。在本地或云端运行智能体,使用 Copilot 或 Claude 和 OpenAI 等第三方提供商。

从提供商提供的数十种模型中进行选择,从快速补全模型到高级推理模型。或者自带密钥以使用任何提供商的任何模型。

您的所有会话,一个视图

当多个智能体并行处理任务时保持高效。从单个视图跟踪您的所有智能体会话,无论它们在哪里运行。

快速筛选和监控会话,或深入了解单个智能体交互,无需切换到其他工具或终端。

您的规则,您的智能体

确保智能体遵循您的实践和团队工作流程。定义自定义指令、添加智能体技能或构建针对您的项目量身定制的自定义智能体。

通过 MCP 服务器连接到外部工具和服务,或安装智能体插件或扩展以扩展智能体的功能。

免费开始使用 AI 智能体

无需试用。无需信用卡。只需您的 GitHub 帐户。

免费试用

核心是一流的代码编辑器

十多年来,VS Code 一直是数百万开发者的首选编辑器。 AI 驱动的内联建议、智能补全和丰富的编辑体验使它在您自己编写代码时同样强大。

在同一个编辑器中,无缝切换智能体工作和手动编码。

开始使用 VS Code
main.py
import numpy as np
import pandas as pd

iris_data = pd.read_csv("iris_dataset.csv")

def describe(species: str) -> pd.Series:
7
subset = data[data["species"] == species]           subset = iris_data[iris_data["species"] == species] if subset.empty: raise ValueError(f"{species} missing from sample") return subset[["petal", "sepal"]].agg(["mean", "std"]).loc["mean"] def summary():
13
for species in np.sort(data["species"].unique()):      for species in np.sort(iris_data["species"].unique()): try: stats = describe(species) except ValueError: print(f"{species}: no records") continue print(f"{species}: petal={stats['petal']:.2f} sepal={stats['sepal']:.2f}") if __name__ == "__main__": summary()

使用任何语言编写代码

VS Code 支持几乎所有主流编程语言。包括 JavaScript、TypeScript、CSS 和 HTML 等多种内置语言,其他语言的扩展可以在 VS Code Marketplace 中找到。

JavaScript 图标JavaScript
TypeScript 图标TypeScript
Python 图标Python
C# 图标C#
C++ 图标C++
HTML 图标HTML
Java 图标Java
JSON 图标JSON
PHP 图标PHP
Markdown 图标Markdown
Powershell 图标Powershell
YAML 图标YAML

完全可自定义

自定义您的 VS Code UI 和布局,以适应您的编码风格。

颜色主题允许您修改 VS Code 用户界面中的颜色,以满足您的偏好和工作环境。

设置同步使您能够通过设置同步功能在您的各个 VS Code 实例之间共享用户设置。

配置文件允许您创建多套自定义设置,并在它们之间快速切换或与他人共享。

Selecting the GitHub Dark theme with a quick pick Selecting the GitHub Dark theme with a quick pick

随时随地编码

在您最高效的地方编写代码,无论是连接到云端、远程仓库,还是通过 VS Code 网页版 (vscode.dev) 在浏览器中编写。

内置源代码控制为您提供开箱即用的 Git 支持。许多其他源代码控制提供商也可以通过扩展获得。

GitHub Codespaces 为任何活动提供云端开发环境 - 无论是长期项目,还是审阅拉取请求之类的短期任务。

vscode.dev in an Edge browser tab vscode.dev in an Edge browser tab

通过丰富功能进行编码

编辑器还有很多功能。无论是使用内置功能还是丰富的扩展,总有一款适合您。

© . This site is unofficial and not affiliated with Microsoft.