Migrate từ OpenCode V1 sang OpenCode V2
Hướng dẫn migrate từ OpenCode V1 sang V2: breaking changes, lộ trình 5 bước, bảng đổi tên field, port plugin, MCP, compaction, skills.
Bài này dành cho người đang dùng OpenCode V1 ổn định và cần lên V2 mà không phải viết lại cấu hình từ đầu. Tin tốt: phần lớn cấu hình V1 vẫn chạy được nguyên trạng trên V2, vì V2 đọc cùng các vị trí file và tự normalize trong memory.
Điểm cần lưu ý nhất, và cũng là điều dễ hiểu sai nhất: OpenCode 1 và OpenCode 2 dùng chung lệnh opencode, nên bạn không thể cài song song hai bản như hai công cụ riêng biệt.
1. Ba breaking change thật sự
Ngoài ba điểm dưới đây, chức năng V1 được hỗ trợ vẫn tương thích với V2. Một số field mà V1 schema chấp nhận nhưng không có bản V2 tương đương sẽ bị ignore — danh sách đầy đủ nằm ở mục 10. Accepted but unsupported fields.
1
Plugins dùng plugin API mới
Cao — code V1 không chạy trên V2, phải port
2
Server API và clients có contract mới
Cao — integration gọi API phải viết lại
3
Terminal client config chuyển từ tui.json(c) phân lớp → một file global cli.json
Thấp — tự migrate
Lộ trình 5 bước
Bạn không cần chuẩn bị gì cả trước khi bắt đầu V2:
Giữ nguyên cấu hình và các định nghĩa file hiện có.
Khởi động V2 và kiểm tra models, credentials, agents, permissions, MCP servers.
Port plugins — đây là phần bắt buộc, vì V1 plugin implementation không chạy trong V2.
Port các integration gọi server API.
Chuyển cấu hình sang native V2 shape khi bạn đã sẵn sàng. Bước này tùy chọn.
2. Cài V2
Lưu ý khi cài:
Postinstall: npm package dùng postinstall script để chọn native binary
opencodetheo platform.Quyền chạy script: lệnh Bun và pnpm ở trên đã cho phép script cần thiết; Vite+ không cần flag bổ sung.
Windows: các Windows package manager không được hỗ trợ.
Binary tải tay
Nếu không dùng package manager, tải binary standalone theo version (docs đang ở 2.0.6):
Bản x64-baseline dành cho CPU không hỗ trợ toàn bộ tập lệnh của x64 thông thường.
Docker và web
Gỡ cài đặt
--keep-config(-c): giữ file cấu hình.--keep-data(-d): giữ session data và snapshots; cache và state vẫn bị xoá.--force(-f): bỏ qua bước xác nhận, dùng cho noninteractive.Cài bằng package manager: dùng đúng package manager đã phát hiện. Cài bằng curl sẽ in ra lệnh cuối cùng để bạn tự xoá executable.
OpenCode dừng registered background services và persistent terminals trước khi xoá global data, cache, config và state.
Background service
Mặc định, OpenCode tìm hoặc khởi động một shared background server cho tài khoản của bạn; mọi client cục bộ đều kết nối vào server đó, và server nắm giữ sessions, configuration, integrations, permissions và tool execution.
3. Cấu hình: V2 vẫn đọc cấu hình cũ
V2 đọc đúng những vị trí mà V1 đang dùng:
V2 normalize field V1 và native V2 trong memory, không ghi lại file nguồn.
Cấu hình V1 hợp lệ vẫn được hỗ trợ, nên bạn không cần convert gì để thử hay dùng V2.
Để OpenCode tự migrate
Format V1 vẫn được hỗ trợ, còn native V2 format là tùy chọn và giúp một số setting rõ hàng, dễ dùng hơn. Đường được khuyến nghị là nhờ chính OpenCode cập nhật giúp bạn — gửi prompt sau trong một session:
OpenCode sẽ inspect toàn bộ file, áp dụng các thay đổi liên quan, và tránh viết lại những setting không cần đổi.
Quy tắc khi trộn V1 và V2
Top level: V1 và V2 có thể coexist. Khi cả hai cùng đặt một canonical value, native V2 thắng, bất kể thứ tự key trong JSON.
Không convert một lần là xong: có thể làm dần.
Nested mixing có giới hạn: OpenCode nhận ra mixed V1/V2 members bên trong
mcp,compactionvàexperimental, nhưng không infer format đệ quy bên trong từng agent, provider, command hay model. Hãy giữ mỗi nested entry đó hoàn toàn ở một format.Cảnh báo: malformed values, unsupported legacy fields và giá trị V1/V2 xung đột sẽ sinh warning, còn các setting hợp lệ khác vẫn load bình thường.
4. Bảng đổi tên field
Đây là phần lõi của việc chuyển sang native V2 shape. Mỗi mục cho bạn cấu hình V1 và cấu hình V2 tương đương.
V1 gom permission effect theo từng tool. V2 dùng một mảng permissions có thứ tự, làm rõ precedence và các ngoại lệ.
Permission action cũng đổi tên:
bash→shelltask→subagentwritevàpatch→edit
Lưu ý tools: { "websearch": false } được diễn đạt lại thành một deny rule có resource "*", thay vì một toggle bật/tắt riêng.
Map agent (số ít) và map mode (deprecated) gộp thành agents. Entries đến từ map mode cũ trở thành primary agents.
Ánh xạ field:
prompt→systemdisable→disabledvariant→ gộp sau#trong model referencetemperature,top_p, provider-specificoptions→request.bodymaxSteps→stepspermission→permissions
Map command (số ít) thành commands, và subtask thành subagent. Variant riêng được gộp vào model.
template,description,agentgiữ nguyên tên.Legacy
subtaskvẫn được accept, nhưng delegated commands nay chạy tự động trong background và báo kết quả về parent session.
V2 gom server dưới mcp.servers, đổi enabled thành phủ định disabled, và tách mục đích timeout.
Các field OAuth của remote server dùng snake_case:
clientId→client_idclientSecret→client_secretcallbackPort→callback_portredirectUri→redirect_uri
Giá trị V1 experimental.mcp_timeout trở thành giá trị mặc định cho cả mcp.timeout.catalog và mcp.timeout.execution.
V2 gom budget token được giữ lại dưới keep, và đặt tên rõ hơn cho phần reserve.
autogiữ nguyên tên.V2 không có native
tail_turnshayprune; cả hai legacy field đều bị ignore kèm warning. Context gần đây được giữ theo token budget thay thế.
V1 tách paths và urls; V2 gộp cả hai thành một mảng có thứ tự.
Các file skill và việc tự động discover .opencode/skills/ không thay đổi.
Map provider (số ít) thành providers. V2 tách riêng package runtime, endpoint và request settings.
npm→package, và AI SDK package nhận tiền tốaisdk:.api→settings.baseURL.optionsđược tách thànhsettings,headers,bodytheo vai trò của chúng với request.
Hai namespace provider legacy đã được hợp nhất:
azure-cognitive-services
azure
google-vertex-anthropic
google-vertex
Migration các field V1 không nhập nhằng (provider, agent, command, provider-filter) dùng các canonical ID này. Riêng top-level model giữ nguyên provider ID vì cú pháp đó vốn đã hợp lệ trong native V2 config — nhưng hãy cập nhật nó sang canonical ID khi migrate một legacy built-in provider.
Model vẫn nested dưới provider, nhưng các field trở nên tường minh hơn:
id→modelIDtool_callvàmodalities→capabilities.tools,capabilities.input,capabilities.outputstatus: "deprecated"→disabled: trueCache cost:
cache_read/cache_write→cache.read/cache.writeProvider-specific
options→settingsV1 variants object → V2 array, mỗi entry có
id
Hai thay đổi đơn giản, chỉ đổi tên khóa:
snapshot→snapshots, giá trị boolean không đổi.attachment→media, các nested image settings giữ nguyên tên.
Map reference (số ít, deprecated) thành references:
V1 vốn đã accept references, nên nếu file của bạn đã dùng tên này thì không cần đổi. Các entry giữ nguyên shape.
5. Không cần migrate
Phần lớn field giữ nguyên shape, không cần chuyển đổi:
shell, model, default_agent, watcher, formatter, instructions, enterprise, tool_output.
LSP: cấu hình còn, nhưng tính năng không còn
Đây là một trong những điểm dễ bỏ sót nhất, vì cấu hình vẫn còn trong file và parse không lỗi — bạn chỉ đơn giản là không còn diagnostics nào nữa.
Provider filters → policies
Provider filters của V1 không có field native V2 tương ứng một-một, nhưng hành vi vẫn được hỗ trợ qua policies:
enabled_providers
Provider policy deny-by-default nội bộ, sau đó allow cho các provider được liệt kê
disabled_providers
Deny policy nội bộ cho các provider được liệt kê
autoupdate
update: false → "disable", "notify" → "notify", true → "auto"
small_model
Model selection cho built-in title agent — native V2 nên dùng agents.title.model
6. File-based definitions
Agent files
V1 có thể dùng thư mục agent/, agents/, mode/, hoặc modes/; V2 vẫn discover cả bốn. Vị trí ưu tiên cho V2:
File dưới
mode/hoặcmodes/biểu diễn primary agents — khi chuyển vàoagents/phải thêmmode: primaryvào frontmatter.File dưới
agent/chuyển sangagents/không cần đổi path-derived ID.
Khi convert frontmatter sang native V2 fields:
Giữ Markdown body làm system instructions của agent.
prompt→systemchỉ khi nó nằm trong JSON config — file body không cần fieldsystem.disable→disabledvàpermission→permissions.Gộp
modelvàvariantthànhprovider/model#variant.temperature,top_p, provider-specific options →request.body.
Command files
V1 dùng command/ hoặc commands/; V2 discover cả hai. Vị trí ưu tiên:
Di chuyển file từ
command/sang cùng relative path dướicommands/để giữ nguyên tên command.Markdown body vẫn là template của command;
descriptionvàagentgiữ nguyên tên.Đổi
subtask→subagentđể dùng tên native cho background delegation.Nếu frontmatter có
modelvàvarianttách riêng, nối variant vào model và bỏ fieldvariant:
Skill files
V2 discover skills từ cả .opencode/skill/ và .opencode/skills/. Layout ưu tiên:
Frontmatter và Markdown body hiện có không cần rewrite cho V2.
Instruction files
File
AGENTS.mdhiện có giữ nguyên vị trí.V2 discover file global
~/.config/opencode/AGENTS.mdvà cácAGENTS.mdambient từ thư mục hiện tại ngược lên tới home. Với project nằm ngoài home, việc discover dừng ở project root.
7. Terminal client config
V2 thay các file tui.json(c) phân lớp của V1 bằng một file global duy nhất:
Terminal client sở hữu file này; background service không load.
Khi
cli.jsonchưa tồn tại, lần khởi động terminal client V2 đầu tiên sẽ tự migrate các globaltui.jsonsetting được hỗ trợ cùng persisted preferences, và giữ nguyên file V1.Project-local client config không được migrate, vì cấu hình client của V2 là global.
8. Plugins
Đổi tên plugin → plugins, và thay tuple package + options bằng một object:
V2 discover local plugin từ cả .opencode/plugin/ và .opencode/plugins/; hãy dùng .opencode/plugins/ cho file của V2.
Cấu hình và discover
Đường dẫn tương đối resolve từ config file chứa entry.
Plugin arrays từ các config file áp dụng từ precedence thấp đến cao, thay vì replace lẫn nhau.
Discover: file
.ts/.jstrực tiếp và các thư mục package nằm ngay cạnh trong mọi thư mục.opencode/plugins/đã discover.Global plugin dùng cùng layout dưới config directory:
~/.config/opencode/plugins/.Thư mục
plugins/nằm cạnh project-rootopencode.json(c)không được discover tự động — hãy khai báo tường minh hoặc chuyển vào.opencode/.
Bật/tắt plugin
Plugin entry được xử lý theo thứ tự. Tiền tố - với một ID hoặc wildcard để disable; * khớp mọi plugin; .* khớp một tiền tố ID. Một ID sau đó sẽ bật lại plugin đã bị tắt.
Hai built-in plugin bỏ qua thao tác removal, để một repository không thể tắt enforcement:
opencode.config.policyopencode.provider.opencode— kết nối Console cung cấp organization policy
Quản lý bằng CLI
plugin checkkiểm tra cập nhật cho server plugins và TUI-only package plugins.plugin updatecập nhật mọi package lỗi thời; truyền một package target trong cấu hình để chỉ check/update package đó.Bị bỏ qua: local plugin và exact package revision.
Git package hỗ trợ hosted shortcut, HTTPS và SSH, kể cả private repo dùng Git credentials hiện có:
Branch, tag, commit hash đầy đủ và selector ::path: của npm đều được hỗ trợ. plugin add không nhận tarball và npm alias.
Reload
Thay đổi trong các config directory được watch sẽ reload tự động. Lúc khởi động server, package plugin có cache được load ngay, package thiếu sẽ được cài ở background, và plugin npm/Git không pin sẽ được kiểm tra cập nhật mà không thay đổi bản đã cài. Exact npm version và full Git commit hash giữ nguyên pin. Thay đổi trong local dependency không được watch có thể vẫn cần restart OpenCode.
CLI-only plugins
Plugin chỉ chạy ở CLI được cấu hình riêng và vẫn hoạt động khi bạn kết nối remote server:
9. Server API và clients
OpenCode 2 có server API đã thiết kế lại, dễ dùng hơn, cùng bộ client mới. Integration nào gọi V1 server API đều phải migrate sang V2 API.
Xem API reference được sinh tự động để biết endpoints, request types và responses.
10. Accepted but unsupported fields
V1 schema còn chấp nhận một số field không có hành vi được hỗ trợ ở V2. V2 sẽ ignore chúng và phát warning, để bạn không nhầm chúng là cấu hình đang hoạt động.
logLevel
Biến môi trường OPENCODE_LOG_LEVEL khi khởi động OpenCode
server
V2 service và explicit server options; server API là intentional breaking change
subagent_depth (top-level)
experimental.subagent_depth
compaction.tail_turns
compaction.keep.tokens + checkpoint-based compaction
compaction.prune
compaction.keep.tokens + checkpoint-based compaction
Agent name (trong V1 JSON config)
Đặt tên qua đường dẫn file, hoặc key trong agents
MCP entry chỉ có enabled, thiếu type
Bắt buộc khai báo type: "local" hoặc type: "remote"
experimental.batch_tool
Không còn hỗ trợ
experimental.openTelemetry
Không còn hỗ trợ
experimental.primary_tools
Không còn hỗ trợ
experimental.continue_loop_on_deny
Không còn hỗ trợ
Provider id
Provider ID giờ là key trong map providers
Provider whitelist
Policies, hoặc model allow-list trong provider
Provider blacklist
Policies, hoặc model deny-list trong provider
Provider-model release_date
Không còn hỗ trợ
Provider-model attachment
media
Provider-model reasoning
Không còn hỗ trợ
Provider-model temperature
settings
Provider-model experimental
Không còn hỗ trợ
Provider-model status khác "deprecated"
Không còn hỗ trợ
Provider-model boolean interleaved
Không còn hỗ trợ
11. Checklist verify trước khi bỏ V1
Model và credentials — đăng nhập lại bằng
/connect, kiểm tra danh sách model hoạt động.Agents — thử cả primary agent lẫn subagent, kiểm tra model được gán đúng.
Permissions — đối chiếu hành vi approval so với V1, đặc biệt các rule giới hạn
shell.MCP servers — xác nhận mọi server load được và tool xuất hiện đúng.
Skills — kiểm tra skill ID không đổi sau khi di chuyển thư mục.
Plugins — đây là mục dễ hỏng nhất, vì code V1 không chạy.
Compaction — theo dõi hành vi nén context trong session dài.
Instructions — xác nhận
AGENTS.mdvẫn được load đúng.
Tài liệu tham khảo
Cập nhật lần cuối
Nội dung này có hữu ích không?