Der Open-Source-KI-Code-Editor
Web, Insiders Edition oder andere Plattformen
Durch die Nutzung von VS Code stimmen Sie dessen Lizenz und Datenschutzerklärung zu.
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>
);
}
import type { Email } from "~/types";
interface MailListItemProps {
email: Email;
isSelected: boolean;
onOpen: (id: string) => void;
}
export function MailListItem(props: MailListItemProps) {
return (
<div
role="listitem"
tabindex={0}
onClick={() => props.onOpen(props.email.id)}
onKeyDown={(ev) => ev.key === "Enter" && props.onOpen(props.email.id)}
class="mail-item"
data-selected={props.isSelected ? "true" : undefined}
aria-selected={props.isSelected ? "true" : undefined}
>
<div>
<div class="mail-item-subject truncate">{props.email.subject}</div>
<div class="mail-item-snippet truncate">{props.email.snippet}</div>
</div>
<time
class="text-xs muted"
datetime={props.email.date}
title={new Date(props.email.date).toLocaleString()}
>
{new Date(props.email.date).toLocaleDateString(undefined, {
month: "short",
day: "numeric",
})}
</time>
</div>
);
- Neu erstellen
MailListItem Komponente, die die Darstellung einzelner E-Mail-Listen-Elemente handhabt - E-Mail-Element-JSX und Logik aus
MailList in die neueMailListItem Komponente extrahieren - Aktualisieren
MailList um die neue zu verwendenMailListItem Komponente extrahieren - Projekt kompilieren, um zu überprüfen, ob Änderungen korrekt erstellt werden
- Anwendung testen, um sicherzustellen, dass die Funktionalität erhalten bleibt
- Eine wiederverwendbare Komponente für die Darstellung einzelner E-Mail-Listen-Elemente erstellt
- Akzeptiert
email ,isSelected , undonSelect Props - Behält alle Barrierefreiheitsfunktionen bei (ARIA-Rollen, Tastaturnavigation)
- Behält Styling und Interaktionsverhalten bei
- Vereinfacht durch Entfernen der Inline-Logik zur Darstellung von E-Mail-Elementen
- Verwendet jetzt die
MailListItem Komponente mit sauberem Prop-Passing - Komplexität der Komponente reduziert und Lesbarkeit verbessert
- ✅ Build erfolgreich
- ✅ Alle Funktionen funktionieren korrekt (Filtern, Auswählen, Navigieren)
- ✅ Tastaturbedienbarkeit erhalten (Enter-Tasten-Navigation)
- ✅ Visueller Auswahlstatus funktioniert ordnungsgemäß
Jedes Modell für jedes Team
Wählen Sie aus mehreren sofort einsatzbereiten Modellen oder bringen Sie Ihren eigenen Schlüssel mit, um auf Modelle Ihres bevorzugten Modell- und Hosting-Anbieters zuzugreifen.
Ein Experte für Ihren Code
Ihr Code wird lokal und remote indiziert, um zu verstehen, was relevant ist, und ermöglicht schnelle, kontextbezogene Interaktionen.
KI, die so funktioniert, wie Ihr Team es tut
Personalisieren Sie Interaktionen mithilfe benutzerdefinierter Agenten, benutzerdefinierter Anweisungen und wiederverwendbarer Prompt-Dateien, die auf Ihre Workflows und Tools zugeschnitten sind.
---
description: 'Generate compact responses, focusing on brevity and clarity.'
tools: ['search', 'fetch', 'githubRepo', 'usages', 'vscodeAPI', 'problems', 'changes', 'testFailure', 'todos']
---
You are a chat mode that provides extremely concise and clear responses.
Your replies should be brief, to the point, and free of unnecessary details.
Focus on delivering the essential information in a straightforward manner.
When responding, you must adhere to the following guidelines:
- Use short sentences and simple language.
- Prioritize clarity over completeness.
- Do not provide explanations or justifications unless explicitly asked.
- Do not provide any updates as you are working on the task –– only respond when the task is complete.
Agent-Modus
Bewältigen Sie komplexe, mehrstufige Aufgaben. Der Agent-Modus liest Ihren Code, schlägt Änderungen in mehreren Dateien vor, führt Terminalbefehle aus und reagiert auf Kompilierungs- oder Testfehler – alles in einer Schleife, bis die Aufgabe erledigt ist. Verfeinern Sie den Agent-Modus weiter, um ihn mit VS Code-Erweiterungen und Model Context Protocol (MCP)-Servern an die Workflows Ihres Teams anzupassen.
Mit Agent-Modus erstellenpackage 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)
}
Erstellen einer To-Do-Liste
Ich beginne mit der Erstellung der To-Do-Liste und verwalte Aufgaben wie das Lesen des vorhandenen Server- und Prozessors-Codes, das Entwerfen des Batch-Endpunktvertrags und die Implementierung einer neuen Datei mit einem Handler. Ich möchte den Handler in die Server-Routen einbinden und vielleicht einen minimalen Test für den Batch-Endpunkt hinzufügen, auch wenn das optional ist. Außerdem plane ich, die Tests auszuführen und alles danach zu kompilieren. Los geht's!Datei-Verarbeitung verbessern...
Ich könnte server.go ändern, aber sie haben um eine neue Datei gebeten. Daher muss ich eine Route erstellen, nennen wir sie /process/batch. Ich werde eine maximale Body-Größe erzwingen und sicherstellen, dass der Content-Type multipart/form-data ist. Als nächstes werde ich das Formular parsen und über form.File["files"] iterieren. Für jeden FileHeader werde ich ihn öffnen und die Bytes lesen, dann ExtractMetadata aufrufen, um Ergebnisse zu sammeln. Schließlich werde ich eine strukturierte JSON-Antwort mit den Ergebnissen zurückgeben und Edge Cases für keine Dateien und maximale Batch-Limits behandeln. Ich denke, es ist vielleicht nicht absolut notwendig, aber ich erwäge eine kleine Verbesserung, indem ich sync.WaitGroup verwende, um jede Datei sequentiell zu verarbeiten und gleichzeitig die Nebenläufigkeit zu begrenzen. Das würde den ersten Commit vereinfachen. Ich muss die Code-Datei hinzufügen und den internen/bildbezogenen Alias importieren. Als nächstes werde ich die vorhandenen Tests in tests/image_processor_test.go überprüfen, um den Stil zu verstehen und zu entscheiden, ob ich eine neue Testdatei für den Batch-Handler erstellen soll. Ich werde das durchlesen und dann die To-Do-Status aktualisieren und die Aufgaben eins und zwei als abgeschlossen markieren.Vorbereitung auf den HTTP-Test
Ich muss einen HTTP-Test ausführen, aber ich stelle fest, dass das aktuelle Testpaket in 'tests' und nicht in den Hauptmodulen liegt. Um den HTTP-Test durchzuführen, muss ich einige Dinge einrichten, wie die Konfiguration, den Prozessor, den Logger und den Server, plus eine Multipart-Anfrage senden. Mein nächster Schritt ist, die Konfiguration in config.go zu überprüfen, um zu verstehen, welche erforderlichen Felder ich angeben muss. Tauchen wir ein!Updates und Patches verwalten
Ich muss die manage_todo_list verwenden, um alles organisiert zu halten und sicherzustellen, dass ich keine Aufgabe verliere. Sobald das erledigt ist, kann ich mit dem Anwenden des Patches fortfahren. Es wird das Hinzufügen einer neuen Datei und Änderungen an server.go beinhalten. Ich möchte sicherstellen, dass alles während dieses Prozesses klar und genau ist, um Fehler zu vermeiden. Machen wir weiter!Updates und Tests implementieren
Ich markiere den Design-Vertrag als abgeschlossen und muss dann die Updates implementieren. Ich werde die To-Do-Liste weiter verwalten und den Patch anwenden, um eine Datei hinzuzufügen und server.go zu aktualisieren. Es scheint, dass ich eine Route für /process/batch in server.go hinzufügen und eine neue Datei internal/http/batch.go implementieren muss. Nachdem ich den Code geschrieben habe, füge ich eine Testdatei hinzu, führe die Tests mit go test aus und verwende run_in_terminal-Befehle. Los geht's!-
server.go : Neue Route POST /process/batch registriert. batch.go : Neuer Handler handleProcessBatch, der-
- multipart/form-data akzeptiert.
- Liest mehrere Dateien unter dem Schlüssel files (fällt auf beliebige Dateiteile zurück, wenn Dateien fehlen).
- Gibt pro Datei Erfolg/Fehler zurück, ohne den gesamten Batch zu verwerfen.
- Aggregiert Zählungen: count, success, failed.
-
batch_endpoint_test.go : Testet den Happy Path (1 gültige + 1 ungültige Datei) und den Fehlerfall bei fehlenden Dateien.
- Eine konfigurierbare maximale Anzahl von Dateien pro Batch hinzufügen (z. B. über die Konfiguration).
- Streaming-Verarbeitung mit begrenztem Speicher (verarbeiten + verwerfen) für sehr große Bilder.
- Optionale Parallelität mit einem Worker-Pool und Kontextabbruch.
- Größenvalidierung pro Datei vor dem Dekodieren hinzufügen.
- JSON-basierten Batch (URLs oder Base64) für Nicht-Multipart-Clients unterstützen.
Vorschläge für die nächste Bearbeitung
VS Code prognostiziert Ihre nächsten Schritte während des Codierens. Verwenden Sie die Tabulatortaste, um KI-gestützte Vorschläge direkt in Ihrem Editor zu übernehmen. Es empfiehlt intelligent, was geändert werden soll - und wo - basierend auf den bereits vorgenommenen Bearbeitungen.
Mit KI-gestützten Vorschlägen codierenimport 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()
Mit Erweiterungen codieren
Passen Sie VS Code mit KI-gestützten Funktionen aus Erweiterungen und Model Context Protocol-Servern für die Verwendung im Chat an. Oder erstellen Sie Ihre eigene Erweiterung, um die einzigartigen Szenarien Ihres Teams zu unterstützen.
Python
Bietet umfangreiche Sprachunterstützung für Python
Stripe
Erstellen, testen und verwenden Sie Stripe in Ihrem Editor
C/C++
Bietet umfangreiche Sprachunterstützung für C/C++
Sehen Sie sich über 80.000 Erweiterungen im Extension Marketplace an
In jeder Sprache codieren
VS Code unterstützt fast jede wichtige Programmiersprache. Mehrere sind im Lieferumfang enthalten, wie JavaScript, TypeScript, CSS und HTML, aber Erweiterungen für andere finden Sie im VS Code Marketplace.

JavaScript
TypeScript
Python
C#
C++
HTML
Java
JSON
PHP
Markdown
Powershell
YAMLVollständig anpassbar
Passen Sie Ihre VS Code-Oberfläche und Ihr Layout so an, dass sie Ihrem Programmierstil entsprechen.
Farbschemata ermöglichen es Ihnen, die Farben der Benutzeroberfläche von VS Code an Ihre Vorlieben und Arbeitsumgebung anzupassen.
Einstellungen synchronisieren ermöglicht es Ihnen, Ihre Benutzereinstellungen über Ihre VS Code-Instanzen hinweg mit der Funktion „Einstellungen synchronisieren“ zu teilen.
Profile ermöglichen es Ihnen, Sätze von Anpassungen zu erstellen und schnell zwischen ihnen zu wechseln oder sie mit anderen zu teilen.
Überall codieren
Codieren Sie dort, wo Sie am produktivsten sind, egal ob Sie mit der Cloud, einem Remote-Repository oder im Browser mit VS Code für das Web (vscode.dev) verbunden sind.
Integriertes Quellcode-Management bietet Ihnen sofortige Git-Unterstützung. Viele andere Quellcode-Management-Anbieter sind über Erweiterungen verfügbar.
GitHub Codespaces bietet Cloud-basierte Entwicklungsumgebungen für jede Aktivität – sei es ein langfristiges Projekt oder eine kurzfristige Aufgabe wie die Überprüfung eines Pull-Requests.
Mit reichhaltigen Funktionen codieren
Ein Editor kann mehr. Egal, ob Sie integrierte Funktionen oder umfangreiche Erweiterungen nutzen, es gibt etwas für jeden.
Integriertes Terminal
Verwenden Sie Ihre bevorzugte Shell, sei es zsh, pwsh oder Git Bash, alles innerhalb des Editors.
Code ausführen
Führen Sie Ihren Code aus und debuggen Sie ihn, ohne Ihren Editor zu verlassen.
Versionskontrolle
Integrierte Unterstützung für Git und viele andere Quellcode-Management-Anbieter.
Build-Tasks
Führen Sie Tools aus und analysieren Sie deren Ergebnisse direkt in VS Code.
Lokaler Verlauf
Verlieren Sie nie Ihre Änderungen mit automatisch verfolgtem lokalem Verlauf.
Designs
Ihr Design ist eine Erweiterung Ihrer Persönlichkeit. Verleihen Sie Ihrem Editor Flair und hinterlassen Sie Ihre persönliche Note.
Barrierefreiheit
Optimierte Erfahrung für Bildschirmlesegeräte, kontrastreiche Designs und Tastaturnavigation.
Web-Unterstützung
Ob auf Ihrem Handy, Tablet oder Desktop, Sie können von überall auf Ihren Code zugreifen.