AI agent local miễn phí cùng LLM trên Mac mini M6 32 GB

Chạy OpenCode và Cline trong VS Code với Gemma 4 qua oMLX trên một Mac mini M6 32 GB, build script phân loại chi tiêu và dashboard hoàn toàn local.

Đã duyệt độc lập · cập nhật 26/10/2026 · 31 min

1. Agent và LLM chạy chung một chiếc Mac mini M6 32 GB

Video mở bằng mấy câu trích từ phần sau của video: "Okay, mình làm hỏng hết mọi thứ rồi." Rồi: mọi thứ đang chạy local, trên một LLM local, dùng một model open-weights và toàn công cụ miễn phí, "không phải trả cho ai đồng nào". Rồi: "awesome, wow" (demo trong video đăng ngày 22/10/2026). Phần sau trang sẽ kể lại đầy đủ lần "làm hỏng mọi thứ" ấy.

Người trình bày đeo tai nghe nói trước camera, góc trái có thẻ Everything local: Mac Mini M6, 32 GB unified memory
Thẻ "Everything local" ở góc màn hình ghi cấu hình máy dùng suốt video đăng ngày 22/10/2026: Mac Mini M6 với 32 GB unified memory.

Sau lời chào, anh nói rõ hôm nay sẽ xem các local AI agent có thể kết nối với LLM local. Máy anh dùng là một chiếc Mac mini M6 có 32 GB, và anh sẽ thử chạy cả LLM local lẫn AI agent local trên cùng một máy đó (theo video đăng ngày 22/10/2026). Anh sẽ xem qua một vài lựa chọn, so sánh chúng với nhau, và nói về khi nào nên dùng một local AI agent, khi nào thì không.

2. Chatbot viết code giúp, nhưng việc vẫn chưa xong

Trước hết, anh muốn làm rõ AI agent là gì và vì sao cần tới nó. Bạn lúc nào cũng có thể nói chuyện với một chatbot, ví dụ ChatGPT. Giả sử bạn muốn viết một đoạn code Python, hay có câu hỏi gì khác, bạn có thể nhờ ChatGPT viết code. Trong ví dụ của anh, câu yêu cầu là: viết cho tôi một đoạn code Python đọc một file CSV chứa giao dịch ngân hàng của tôi, rồi phân loại các khoản chi. Theo anh, mọi chatbot hiện đại đều làm được việc này, dù là Gemini hay ChatGPT (theo video đăng ngày 22/10/2026).

create me a python code that can read a csv file with my bank transactions and categorize my expenses
ChatGPT trong Safari trả lời yêu cầu viết script Python phân loại giao dịch ngân hàng, kèm thẻ Asking a chatbot
Câu yêu cầu gửi cho ChatGPT trong video đăng ngày 22/10/2026. ChatGPT trả lời bằng một bộ phân loại chi tiêu dựa trên rule với Pandas, liệt kê những gì script làm, rồi bắt đầu từ bước "Install the dependency" với pip install pandas.

Chatbot sẽ chỉ cho bạn mọi bước cài đặt; trong ví dụ này nó bảo cài pandas. Nó viết script Python cho bạn, đưa luôn một file CSV giao dịch mẫu, và các bước để chạy (demo trong video đăng ngày 22/10/2026). Nó đã làm hết những việc đó, nhưng theo anh, việc của mình vẫn chưa xong. Mình vẫn phải copy đoạn code này và làm thêm nhiều bước nữa mới chạy được nó: phải có một folder, phải dùng một IDE nào đó, đủ thứ như vậy.

AI agent xuất hiện ở đúng chỗ này: nó cao hơn một bậc, và nó làm được tất cả những việc đó thay bạn (theo Ravish Labs, video đăng ngày 22/10/2026).

3. AI agent: vòng lặp và tools, còn bộ não là LLM

Khi bạn dùng một AI agent để nói chuyện với một LLM, agent sẽ đảm bảo tự làm hết các bước kia cho bạn. Nó có quyền dùng một loạt tools: đọc file trên máy, ghi, sửa file; và các tool khác như web search, MCP (theo Ravish Labs, video đăng ngày 22/10/2026).

Dùng tất cả những tools đó, agent nói chuyện với LLM của bạn để bạn không phải làm tay từng bước. Nó tạo ra một vòng lặp: bạn giao một task cho AI agent, và nó đảm bảo task được làm xong, bất kể task đó có bao nhiêu bước. Một task có thể có 10 bước: cài cái này, chạy chương trình kia, lấy output của chương trình đó, rồi làm bước tiếp theo, cứ thế (theo Ravish Labs, video đăng ngày 22/10/2026).

AI agentvòng lặp + tools LLMphần suy nghĩ Read filesWrite / editWeb searchMCP một task, nhiều bước:install → run → đọc output→ bước tiếp → ... tới khi xong
Hình 3.1Agent giữ vòng lặp và các tools, còn LLM làm phần suy nghĩ.

Điều thú vị cần nhớ, theo anh, là AI agent không có bộ não riêng. Nó chỉ có tools, và nó nói chuyện với LLM của bạn. Vì vậy bạn cần một LLM (theo Ravish Labs, video đăng ngày 22/10/2026).

4. Agent trên cloud: hai vấn đề privacy và chi phí

Có thể bạn đã nghe tới những AI agent khác đang có sẵn, ví dụ Claude Code của Anthropic, Codex của OpenAI và Antigravity của Google. Anh nói chúng rất tốt, rất có năng lực, nhưng có vài vấn đề (theo Ravish Labs, video đăng ngày 22/10/2026).

Vấn đề thứ nhất: anh nói chúng sẽ không nói chuyện với LLM local của bạn, mà chỉ nói chuyện với LLM của chính hãng. Chú thích nhỏ trên slide thì ghi khác một chút: Claude Code và Codex CLI có thể dùng LLM local, nhưng cách cài đặt không đơn giản, và OpenCode linh hoạt hơn nhiều ở điểm này (cả hai theo video đăng ngày 22/10/2026). Đó là lý do bạn muốn tránh chúng trong trường hợp có thông tin nhạy cảm. Ví dụ, thứ đang build ở đây là một phần mềm, một script đọc giao dịch ngân hàng của mình, và bạn không muốn đưa giao dịch ngân hàng của mình cho Anthropic hay OpenAI.

Slide Cloud AI Agents: Claude Code, OpenAI Codex, Google Antigravity và hai ô Privacy, Cost
Slide "Cloud AI Agents" trong video đăng ngày 22/10/2026: Claude Code đi với model Anthropic, OpenAI Codex với model OpenAI, Google Antigravity với Gemini, Claude và GPT-OSS. Hai ô đỏ là Privacy (file bank.csv đi từ Mac lên cloud của họ) và Cost (trả theo tháng; slide ghi Antigravity có một free tier giới hạn). Mục tiêu: chạy hết ở local, không trả cho ai.

Vấn đề thứ hai là chi phí. Theo anh, tất cả các AI agent chạy trên cloud này đều bắt bạn mua subscription hoặc API key của họ (theo Ravish Labs, video đăng ngày 22/10/2026). Còn thứ anh đang cố làm là một giải pháp local để khỏi phải trả tiền cho họ.

5. Cài OpenCode và trỏ nó vào server LLM local

Công cụ đầu tiên, tức AI agent đầu tiên, là OpenCode. Anh thấy OpenCode thú vị vì qua nó bạn có thể kết nối với một số nhà cung cấp LLM trên cloud, ví dụ Anthropic và OpenAI, nhưng cũng có thể kết nối với LLM local của chính mình (theo Ravish Labs, video đăng ngày 22/10/2026).

Để cài OpenCode, trang của OpenCode đưa ra nhiều lựa chọn: cài app chạy trong terminal hoặc app desktop. Anh dùng bản desktop. Trên màn hình là trang tải của opencode.ai, có các lệnh cài bản terminal và nút tải bản desktop cho macOS, Windows, Linux; anh tải bản cho Mac (theo video đăng ngày 22/10/2026). Thật ra anh đã cài OpenCode sẵn rồi, nên phần chính là chỉ cách nối OpenCode với LLM local.

Cách làm: vào phần cài đặt, chọn Providers. Bấm "show more providers", bạn sẽ thấy một lựa chọn là custom provider tương thích OpenAI (trên màn hình ghi "Custom OpenAI-compatible provider"). Bạn vào đó, điền URL và model của mình (theo video đăng ngày 22/10/2026).

Trong bài test này, server LLM local là oMLX. Server đó chạy trên địa chỉ IP local 127.0.0.1, port 8000, và cung cấp nhiều endpoint khác nhau. Thứ anh cần là endpoint tương thích OpenAI, nên anh copy địa chỉ đó và dán vào OpenCode. Sau đó, nếu bạn có đặt API key thì điền API key vào (theo video đăng ngày 22/10/2026).

Cửa sổ Server của oMLX 0.7.1.dev1 với listen address 127.0.0.1, port 8000 và danh sách API endpoint, cạnh sơ đồ OpenCode, oMLX, Gemma 4
Màn hình Server của oMLX 0.7.1.dev1 trong video đăng ngày 22/10/2026: listen address 127.0.0.1 (local only), port 8000, và các endpoint OpenAI-compatible (http://127.0.0.1:8000/v1), Anthropic / Claude Code, health probe, metrics. Sơ đồ bên trái: OpenCode gọi oMLX qua 127.0.0.1:8000/v1, oMLX chạy Gemma 4.
http://127.0.0.1:8000/v1

6. LM Studio cũng được, và chọn Gemma 4 thay vì Qwen

Anh nói đây chỉ là ví dụ với oMLX; bạn không nhất thiết phải dùng oMLX. Máy anh cũng có cài LM Studio. Nếu bạn kết nối tới LM Studio thì rất đơn giản: vào phần model server, nó sẽ đưa địa chỉ IP ngay đó, bạn chỉ việc copy địa chỉ IP ấy và dùng (theo video đăng ngày 22/10/2026). Rồi anh tắt LM Studio đi.

Tiếp theo là API key và model ID. Để lấy model ID, anh lại vào phần models của oMLX. Model đang được nạp là Gemma 4 bản 26 billion. Máy anh cũng có Qwen3.8-27B (anh nói "Qwen 3.8, 27 billion", và thư viện model của oMLX trên màn hình ghi Qwen3.8-27B), nhưng anh không dùng nó trong video này. Model nào thì tuỳ bạn, miễn là vừa khít trong RAM của bạn (theo Ravish Labs, video đăng ngày 22/10/2026).

Theo anh, hai model này khá giống nhau về kích thước và cả yêu cầu bộ nhớ; thẻ chú thích trên màn hình ghi Gemma 4 26B là 16,3 GB và Qwen 3.6 27B là 16,6 GB. Anh chọn Gemma 4 vì Gemma 4 nhanh hơn model Qwen, dù model Qwen thông minh hơn một chút (nhận định của Ravish Labs trên máy anh, video đăng ngày 22/10/2026). Với bài test này, anh chỉ dùng Gemma 4.

Anh copy model ID, dán vào ô model ID, rồi đặt cho nó một cái tên bất kỳ, ví dụ "m6" hay "mlx gemma 4"; trên màn hình, provider đã kết nối có tên m6_omlx_gemma4. Bấm submit, nó sẽ hiện ra, và lần sau mở cửa sổ mới nó vẫn còn đó: OpenCode đang hiển thị các model có sẵn, trong đó có model local này (theo video đăng ngày 22/10/2026).

Nếu vì lý do nào đó model không hiện ra, hãy vào "Manage models", kéo xuống dưới cùng và đảm bảo model đó đã được chọn; chú thích trên màn hình hỏi "Not listed?" và nhắc vào Manage models để tick chọn model (theo video đăng ngày 22/10/2026). Xong thì đóng lại và tạo một session mới.

7. Session đầu tiên: "hi", web search và 22.000 token context

Session mới hoàn toàn trống. Anh kiểm tra Gemma 4 đã được chọn, và tin nhắn đầu tiên chỉ là "hi". Nó chạy. Trong oMLX, ở phần status, và trong Activity Monitor, có thể thấy model đang được nạp; anh nói lúc đó đã dùng khoảng 25 GB bộ nhớ, và thẻ trên màn hình ghi 25 / 32 GB cho model và các app (số đo của Ravish Labs trên Mac mini M6, video đăng ngày 22/10/2026).

Đợi một chút, model trả lời: "Hello, how can I help you today?" Anh gửi thêm một câu "hi" nữa để xem tốc độ trong oMLX, vì oMLX hiển thị tốc độ sinh token. Kết quả khoảng 33 token mỗi giây với một tin nhắn rất đơn giản (số đo của Ravish Labs, video đăng ngày 22/10/2026).

Câu hỏi tiếp theo: "Hi, what's the weather in NYC?" Lần này agent dùng web search, một tool nó có, để đi tìm thời tiết New York (demo trong video đăng ngày 22/10/2026). Anh nói đây là một câu đơn giản mà bạn hoàn toàn có thể gửi cho ChatGPT hay bất kỳ chatbot nào.

Nhưng chỗ này mới thú vị: mới chỉ gửi những tin rất ngắn, "hi" rồi "hi, what's the weather in NYC", vậy mà context size đã vào khoảng 22.000 token (số đo của Ravish Labs, video đăng ngày 22/10/2026).

Tab Context của OpenCode: session Greeting, model gemma-4-26B-A4B, Total Tokens 22.038, Total Cost 0 đô, cạnh thẻ What fills the context
Tab Context của OpenCode trong video đăng ngày 22/10/2026: session "Greeting" chạy model gemma-4-26B-A4B-it-oQ4e-mtp, Total Tokens 22.038, Total Cost $0.00. Thẻ bên trái giải thích: hai tin nhắn và một lần web search, nhưng prompt, tools và kết quả tìm kiếm đã lấp đầy khoảng 22.000 token.

Anh tạo thêm một session mới và chỉ nói "hi", đúng một từ hai ký tự. Trước khi gửi, context size đang là 0; sau câu trả lời, nó lên khoảng 5.000 token (số đo của Ravish Labs, video đăng ngày 22/10/2026).

Từ đó anh rút ra điều cần nhớ: dùng một AI agent chưa chắc lúc nào cũng là ý hay. Nếu bạn chỉ hỏi những câu đơn giản, cứ dùng chatbot local là đủ, không cần tới AI agent. Lý do anh đưa ra: khi AI agent gửi request tới LLM, nó gửi kèm rất nhiều dữ liệu, gồm danh sách tools nó được dùng và prompt riêng của nó, và toàn bộ thông tin đó được gửi lại mỗi lần agent nhắn tới server LLM (theo Ravish Labs, video đăng ngày 22/10/2026).

8. Context window giống một chiếc xe đẩy đi chợ

Đây là lúc context size trở nên quan trọng. Anh đưa ra một phép so sánh: bạn đi siêu thị với một chiếc xe đẩy, và kích thước chiếc xe đẩy có thể hiểu như context size của một LLM. Bạn mang xe đẩy theo, nhưng nếu xe đã đầy sẵn thì bạn chỉ bỏ thêm được rất ít đồ, rất ít thông tin (phép so sánh của Ravish Labs, video đăng ngày 22/10/2026).

Slide Context window = shopping cart: xe đẩy chứa your hi, chat history, tool definitions, agent system prompt
Slide "Context window = shopping cart" trong video đăng ngày 22/10/2026: kích thước xe là context window; trong xe đã có agent system prompt, tool definitions, chat history, và câu "hi" của bạn chỉ là món nhỏ trên cùng. Dòng đỏ: "Already full? Little room left".

Theo anh, đây là chỗ các LLM local gặp khó, vì nhìn chung LLM local không có context window lớn tới vậy, hoặc toàn bộ context không vừa trong VRAM của bạn. Đó là lý do anh dùng model nhỏ hơn, và cũng là lý do các model open-weights lớn hơn chạy không tốt, nhất là khi máy không đủ RAM và VRAM (theo Ravish Labs, video đăng ngày 22/10/2026). Khi chạy agent local và LLM local, bạn cần ý thức được những giới hạn đó của máy mình.

9. Xem log trong oMLX: prompt tăng từ 544 lên 7.700 token

Anh cũng chỉ cách kiểm tra chuyện này ngay trong oMLX. oMLX có một dashboard: nếu chạy trên Mac, bạn sẽ thấy icon của nó trên thanh menu. Bấm vào đó, chọn "open dashboard", nó mở dashboard ra; vào phần Logs là thấy log. Bạn có thể xem context và các thông tin khác trong log của oMLX (theo video đăng ngày 22/10/2026).

Anh chọn dòng log của tin nhắn vừa gửi: model sinh ra 285 token trong 11 giây, nhưng prompt nó nhận vào là 544 token. Dòng log trên màn hình ghi cụ thể hơn: 285 token trong 11,49 giây (25,2 tok/s), prompt 544 (số đo của Ravish Labs, video đăng ngày 22/10/2026).

Tin nhắn tiếp theo gửi từ OpenCode sẽ cao hơn nhiều: context lúc đó đã lên khoảng 7.800 token. Trong oMLX, prompt nhận được ở tin nhắn cuối là khoảng 7.700 token, và model sinh ra 137 token với tốc độ 33,7 token mỗi giây. Dòng log trên màn hình ghi prompt 7733 và 137 token trong 6,62 giây (số đo của Ravish Labs, video đăng ngày 22/10/2026).

Trang Logs của oMLX dashboard với một entry Chat completion và thẻ so sánh prompt token 544 và 7.700
Log viewer của oMLX trong video đăng ngày 22/10/2026: entry đang mở ghi "137 tokens in 6.62s (33.7 tok/s), prompt: 7733". Thẻ phía dưới so sánh số prompt token mỗi request: request trước 544, tin nhắn OpenCode tiếp theo khoảng 7.700.

Anh nói chỉ cho xem phần này để bạn có ý niệm cách troubleshoot, cách xem tốc độ và số token mà AI agent gửi đi (theo video đăng ngày 22/10/2026).

10. Demo OpenCode: script phân loại chi tiêu ngân hàng

Anh nhắc lại câu prompt đã gửi ChatGPT để viết script Python, copy nó và thử làm đúng việc đó trong OpenCode. Anh nói mình chưa làm thử bao giờ, đây là lần đầu (demo trong video đăng ngày 22/10/2026).

Mỗi lần dùng kiểu này, theo anh, nên tạo một project. Anh chọn folder tên "transactions", tạo session mới, và thấy OpenCode đã chọn sẵn folder transactions. Anh dán đúng câu prompt cũ: tạo code Python đọc một file CSV giao dịch ngân hàng và phân loại các khoản chi. Anh nói đây là một prompt rất đơn giản, có thể viết tốt hơn nhiều, nhưng với video này cứ thử xem sao (demo trong video đăng ngày 22/10/2026).

Anh chạy prompt, trên oMLX của máy mình, và mở log ra, bật auto-scroll để xem server nhận bao nhiêu request. Anh nhận xét câu trả lời này thật ra còn tốt hơn so với ChatGPT: bước đầu giống hệt, pip install pandas, rồi tới script Python (nhận định của Ravish Labs về demo trong video đăng ngày 22/10/2026).

Nhưng lần này nó không tạo ra file nào cả: vào folder transactions thì vẫn trống. Anh gõ tiếp "create these for me" (tạo mấy file này cho tôi) để xem nó làm gì. Anh nói đã mong nó tự tạo hết mà không cần bảo, nhưng tất cả đang diễn ra thời gian thực và anh chưa thử trước (demo trong video đăng ngày 22/10/2026).

Agent dùng một lần write, và trong folder transactions, script Python bắt đầu xuất hiện. Nó cũng tạo luôn một file giao dịch mẫu. Anh gõ "now run it" (giờ chạy nó đi). Script chạy thành công, và agent đưa ra output đọc từ file transactions.csv (demo trong video đăng ngày 22/10/2026).

Anh mở hai bảng: bảng đã phân loại và bảng giao dịch gốc. Starbucks Coffee 5 đô, Netflix, và agent đã xếp Starbucks Coffee vào Food & Dining, Netflix vào Subscriptions, Amazon Prime vào Subscriptions (demo trong video đăng ngày 22/10/2026).

11. Tổng theo nhóm, file run.sh và thử sửa một con số

Anh muốn đẩy thêm một bước: tính tổng chi cho tất cả các khoản subscription, tất cả các khoản food & dining, xem nó làm được gì. Anh đóng bảng lại và yêu cầu: giờ tôi muốn nâng cấp để có tổng theo từng nhóm, sửa code rồi chạy lại trên file input mẫu. Anh hỏi "xem nó mất bao lâu", và rồi: "nó sửa xong rồi à? cái đó thật sự rất nhanh" (demo trong video đăng ngày 22/10/2026).

Agent tạo thêm một file CSV khác chứa số tổng: tổng cho food, subscription và các nhóm khác. Anh không hề yêu cầu cột count và cột phần trăm trên tổng, nhưng nó vẫn thêm vào (demo trong video đăng ngày 22/10/2026). Trên màn hình, giữa chừng anh còn gõ thêm một câu "I want the output in the form of csv", và câu trả lời của agent giải thích script giờ sinh ra hai file: categorized_transactions.csv và summary.csv.

Tiếp theo, anh muốn một shell script để gọi bất cứ lúc nào:

now generate a .sh file run.sh in the root of this folder that i can run anytime to invoke this python script
OpenCode hiển thị bảng Spending Summary theo nhóm với Grand Total, và ô đang gõ prompt tạo file run.sh
OpenCode trong video đăng ngày 22/10/2026: bảng "Spending Summary" theo nhóm (Food & Dining, Other, Shopping, Subscriptions, Transportation, Utilities) với Total Amount, Count, % of Total và GRAND TOTAL -394.23; agent mô tả hai file output; ô phía dưới là prompt tạo run.sh.

Agent viết file shell. Anh nói nó mất chưa tới một phút để viết, thậm chí chưa tới một phút, chừng 30 giây (số đo của Ravish Labs, video đăng ngày 22/10/2026). Anh mở file ra xem: có lệnh shell, và shell gọi Python với script kia.

Anh chạy thử: mở terminal, cd vào folder, chạy ./run.sh. Lệnh chạy ổn, và shell in hết ra command line, gồm bảng tổng theo nhóm; dòng tổng trên màn hình là GRAND TOTAL -394.23 (demo trong video đăng ngày 22/10/2026).

Để kiểm tra lại, anh sửa một dòng trong file giao dịch: mở transactions.csv, đổi một khoản thành -55, tức tăng thêm 50 đô, lưu lại và chạy lại (demo trong video đăng ngày 22/10/2026). "Thật tuyệt", anh nói: mất chưa tới vài phút để phát triển và tạo ra script Python này trong OpenCode, dùng LLM local, và theo anh điều đó thật sự ấn tượng (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

12. Dashboard HTML và lần "làm hỏng mọi thứ" vì trùng port

Anh muốn đẩy xa hơn nữa: một bản trình bày trực quan. Prompt tiếp theo yêu cầu tạo một file HTML duy nhất đọc file summary CSV và thể hiện thông tin dưới dạng đồ thị hoặc biểu đồ.

now create a single html file that can read this summary.csv and provide this information in a visual form. like graphs/charts.

Trong lúc agent làm, anh mở Activity Monitor: máy có tổng 32 GB RAM, bộ nhớ đang dùng khoảng 27 GB, và không có memory pressure, vẫn nằm trong giới hạn (số đo của Ravish Labs trên Mac mini M6, video đăng ngày 22/10/2026). Nhìn chung, anh nói nó chạy tốt hơn anh tưởng. Context size lúc này khoảng 16.000 (số đo của Ravish Labs, video đăng ngày 22/10/2026).

Agent báo đã tạo một dashboard chuyên nghiệp tên dashboard.html, file này dùng Chart.js; trên màn hình câu trả lời còn nhắc PapaParse để đọc summary.csv (demo trong video đăng ngày 22/10/2026). Anh mở terminal, chạy lại run.sh (summary đã được tạo sẵn rồi), copy lệnh chạy server mà agent đưa và chạy trong terminal. File đang được serve. Nhưng vào dashboard thì nó báo "detail not found": có lỗi. Anh báo lại cho OpenCode rằng gặp lỗi này khi mở dashboard, xem nó nói gì.

Và đây chính là đoạn mở đầu video: "okay, mình làm hỏng hết mọi thứ rồi". Ngay khi anh khởi động server Python cho dashboard vừa tạo, mọi thứ hỏng, vì server đó chạy trên đúng port mà server LLM đang dùng, port 8000. Sau khi khởi động server này, ngay cả OpenCode cũng ngừng hoạt động và chỉ báo lỗi, vì nó không kết nối được tới oMLX nữa (demo trong video đăng ngày 22/10/2026). Cách sửa: chạy dashboard trên port 8001.

oMLXLLM server port 8000 Dashboardpython server OpenCodecần oMLX hai server, một port Dashboardchuyển sang port 8001
Hình 12.1A port clash" trong video đăng ngày 22/10/2026: server dashboard chiếm port 8000 của oMLX nên OpenCode mất kết nối; chạy dashboard trên port 8001 thì hai server không còn đụng nhau.

Rồi anh mở dashboard vừa tạo: "Awesome, wow." Một dashboard chi tiêu với biểu đồ đẹp, và một bảng cho thấy đã tiêu bao nhiêu cho food & dining, shopping, subscriptions, transportation (demo trong video đăng ngày 22/10/2026).

Anh sửa thử dữ liệu và chạy lại: vào folder, đổi một dòng thành McDonald's với 112 đô. Như vậy nhóm food phải tăng thêm 100 đô. Chạy lại script và server, nhóm Food & Dining giờ là 228, trước đó là 128, nên mọi thứ chạy đúng (demo trong video đăng ngày 22/10/2026).

Expense Spending Dashboard với biểu đồ tròn Spending Distribution và biểu đồ cột Total Amount per Category, thẻ Food and Dining 228 đô, cộng 100 đô
"Expense Spending Dashboard" do OpenCode tạo, demo trong video đăng ngày 22/10/2026: biểu đồ tròn Spending Distribution (%) và biểu đồ cột Total Amount per Category; tooltip ghi Food & Dining -228.25. Dải vàng trên trang là ghi chú của chính dashboard: vì CORS, cần chạy python3 -m http.server rồi mở localhost thay vì double-click file.

Theo anh, chỉ mất chừng vài phút mà về cơ bản đã tạo ra cả một phần mềm, một phần mềm cơ bản, và có thể gói nó thành một app độc lập nữa (nhận định của Ravish Labs, video đăng ngày 22/10/2026). Anh kết luận phần OpenCode: nó chạy tốt hơn anh nghĩ (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

13. Cline trong VS Code: cài extension và nối vào oMLX

Đó là một công cụ. Giờ anh muốn thử một công cụ khác chạy trong VS Code. Vì sao VS Code? Vì anh là người thiên về hình ảnh, anh thích nhìn thấy code, anh là software developer. Theo anh, một điểm trừ của OpenCode là bạn không xem code theo kiểu đó được: vẫn xem được, có thể mở file ra, nhưng đó không phải thứ chính bạn nhìn thấy. Anh thích dùng VS Code như một IDE để kiểm soát tốt hơn những gì mình thấy (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

Anh tải VS Code cho macOS (trang code.visualstudio.com trên màn hình) và cài xong Visual Studio Code, ứng dụng anh gọi là "my favorite". Sau khi cài, vào Extensions và tìm một AI agent tên là Cline. Anh giới thiệu Cline là một autonomous coding agent chạy ngay trong IDE (theo video đăng ngày 22/10/2026). Anh cài nó, và nói chưa từng cài nó trên máy này trước đây. Cline hiện ở thanh bên trái; anh kéo nó sang bên phải.

Giống như với OpenCode, anh tạo một folder mới tên "transactions2", một folder trống, rồi mở nó trong Visual Studio Code bằng Open Folder. Mỗi lần dùng một folder mới, anh phải bật Cline cho folder đó, rồi chọn Cline (theo video đăng ngày 22/10/2026).

Giờ tới phần cài đặt Cline. Anh chọn "bring my own API key", bấm Continue. Ở mục API provider, làm tương tự OpenCode: chọn OpenAI Compatible. Cũng dùng oMLX: copy URL, nhập key, và Cline tự động phát hiện các model đang có; anh lại chọn Gemma 4 (theo video đăng ngày 22/10/2026).

Có nhiều cấu hình khác bạn có thể chỉnh, ví dụ liên quan tới kích thước context window, nhưng anh không đi vào lúc này. Anh bấm tiếp tục để xem có chạy không: đã kết nối. Anh gõ "hi". Theo anh, điểm hay của Cline ở đây là nó rất nhanh (nhận định của Ravish Labs, video đăng ngày 22/10/2026). Cline trả lời: "Hello! How can I help you today? I'm ready to assist…" Nó chạy ổn.

14. Cline gửi ít context hơn, auto-approve và xếp hàng prompt

Ở đây có thể thấy Cline mặc định chọn context size 128.000. Chú thích trên màn hình ghi rõ đó là thiết lập của Cline, còn server oMLX trong video được đặt ở 32K (theo video đăng ngày 22/10/2026). Anh nói nó đã dùng khoảng 2.500 token context; ô trên màn hình ghi 2.6k. Hồi dùng OpenCode, anh nhắc lại, nó đã dùng khoảng 6.000 token cho cùng câu "hi". Vì vậy, theo anh, Cline hiệu quả hơn OpenCode một chút (số đo và nhận định của Ravish Labs, video đăng ngày 22/10/2026).

VS Code với trang extension Cline và khung chat Cline, thẻ Context used for hi: OpenCode khoảng 5 đến 6K, Cline khoảng 2.5K
Thẻ "Context used for 'hi'" trong video đăng ngày 22/10/2026: OpenCode khoảng 5-6K token, Cline khoảng 2,5K. Bên phải là khung Cline với thanh context 2.6k / 128.0k và câu trả lời đã hoàn tất.

Rồi lần lượt từng câu, anh đưa cho Cline đúng những lệnh đã đưa cho OpenCode, bắt đầu bằng câu tạo code Python. Theo anh, nó bắt đầu suy nghĩ ngay, không mất chút thời gian nào. Một điểm hay khác: bạn thấy được quá trình suy nghĩ theo thời gian thực, nên biết là đang có việc diễn ra (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

Chỉ trong vài phút, Cline đã tạo file CSV mẫu và script Python, nhưng nó hỏi để anh duyệt các thay đổi. Bạn có thể cho tự động duyệt (auto-approve) các thay đổi. Lúc đó Cline muốn dùng tool đọc hoặc ghi file; anh chọn chạy lệnh, đồng thời bật auto-approve cho việc thực thi lệnh, để lần sau khỏi phải duyệt lệnh này nữa. Trên màn hình, dòng auto-approve ghi "Read, Edit, Web Fetch, MCP" (demo trong video đăng ngày 22/10/2026).

Ở thanh bên trái, Cline đã tạo file transaction CSV, tạo script Python, chạy script và ra kết quả. Anh ước chừng chỉ mất khoảng một phút cho tất cả (số đo của Ravish Labs, video đăng ngày 22/10/2026). Và anh lặp lại câu ở đầu video: tất cả đang chạy local trên LLM local, dùng model open-weights, toàn công cụ miễn phí, không phải trả cho ai đồng nào. Tất nhiên là phải trả tiền mua chiếc Mac mini M6, "cái đó không rẻ", nhưng giờ bạn dùng nó bao nhiêu tùy thích.

Tiếp theo, anh đưa tất cả các lệnh còn lại giống như với OpenCode: nâng cấp để có tổng theo nhóm, rồi tạo shell script, rồi tạo một file HTML duy nhất. Trong lúc Cline còn đang chạy lệnh trước, nó xếp hàng lệnh tiếp theo, nên anh xếp hàng luôn mọi tin nhắn để xem mất bao lâu (demo trong video đăng ngày 22/10/2026).

now i want to enhance it to give me totals per category, make the change and run it again in sample input file

Anh cũng chỉ nhanh context size lúc này: khoảng 7.000 token, mà anh gọi là khá ấn tượng (số đo của Ravish Labs, video đăng ngày 22/10/2026). So Cline với OpenCode, theo trải nghiệm của anh, Cline có prompt nhỏ hơn nhiều, "hành lý" nó mang theo mỗi lần gọi LLM cũng nhỏ hơn nhiều, nên nó hiệu quả hơn OpenCode một chút (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

Ngoài ra, vì đang ở trong VS Code, anh nhìn được code theo thời gian thực, và Cline hiển thị diff so với phiên bản trước cho mỗi thay đổi. Theo anh, cách này thân thiện với developer hơn nhiều nếu bạn có tham gia vào code (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

15. Dashboard của Cline và so sánh hai công cụ

Cline đã tạo shell script, nó nằm ngay đó. Một lợi thế khác của VS Code, theo anh, là terminal nằm ngay trong cửa sổ: muốn chạy lệnh gì thì không phải nhảy sang terminal riêng; code, agent, tất cả ở một chỗ. Vì vậy, khi phải làm bất kỳ việc code local nào với LLM local, VS Code cùng extension Cline là lựa chọn mặc định của anh (nhận định của Ravish Labs, video đăng ngày 22/10/2026).

Slide OpenCode vs Cline: OpenCode là desktop app, giống app chat, prompt mỗi lần gọi lớn hơn; Cline prompt nhỏ hơn, có live code và diff
Slide "OpenCode vs Cline" trong video đăng ngày 22/10/2026. OpenCode: desktop app, cảm giác như một app chat, prompt mỗi lần gọi lớn hơn (khoảng 5K token cho "hi"). Cline trong VS Code: prompt mỗi lần gọi nhỏ hơn (khoảng 2,5K token cho "hi"), xem code trực tiếp kèm diff.

Có vẻ như cả việc mất khoảng bốn phút, và Cline đưa ra đúng những bước như OpenCode đã đưa; chú thích trên màn hình ghi "Whole task: ~4 minutes" (số đo của Ravish Labs, video đăng ngày 22/10/2026). Anh chạy server Python của nó, nhớ tắt server cũ đi vì không cần nữa, và dùng một port khác như lần trước, 8001.

Đây là dashboard mà VS Code và Cline tạo ra. Anh kiểm tra nhanh: nhóm Food & Drink ở đây là 204 đô. Anh vào VS Code, mở file transactions, đổi Starbucks Coffee thành 105 đô và lưu lại. Chạy lại script, khởi động lại server: trước là 204 đô, giờ phải thành 304 đô. Và nó thành 304 đô thật (demo trong video đăng ngày 22/10/2026).

Dashboard do Cline tạo với biểu đồ tròn, biểu đồ cột Spending by Category, tooltip Food and Drink 204.05 và thẻ 204 thành 304 đô
Dashboard do Cline tạo, demo trong video đăng ngày 22/10/2026: biểu đồ tròn Spending Distribution, biểu đồ cột Spending by Category với tooltip Food & Drink 204.05, và bảng số theo nhóm. Thẻ "$204 → $304" ở góc là kết quả sau khi sửa khoản Starbucks Coffee.

Như vậy cả script, file CSV lẫn file HTML đều chạy ổn, và tất cả đều do LLM local tạo ra, cả phần mềm chỉ trong vài phút (demo trong video đăng ngày 22/10/2026).

16. Tất cả chạy local, không trả tiền cho bên thứ ba

Anh nói đây mới chỉ là điểm khởi đầu. Anh muốn cho thấy sức mạnh của Mac mini M6: không trả tiền cho bên thứ ba nào, giữ toàn bộ code riêng tư, giữ mọi thông tin nhạy cảm riêng tư, mà vẫn tạo được phần mềm, chia sẻ dữ liệu của mình, xử lý sao kê ngân hàng (theo Ravish Labs, video đăng ngày 22/10/2026).

Mac mini M6, 32 GB: code và dữ liệu nhạy cảm giữ trên máy OpenCodehoặc Cline + VS Code oMLX127.0.0.1:8000/v1 Gemma 4 26Bopen-weights Script + CSV+ dashboard chi phí phần mềm: 0; chỉ có tiền mua máy
Hình 16.1Toàn bộ chuỗi trong video đăng ngày 22/10/2026: agent (OpenCode, hoặc Cline trong VS Code) gọi oMLX trên cùng máy, oMLX chạy Gemma 4, và kết quả là script, file CSV và dashboard nằm trên máy.

"Vậy đó, về cơ bản là hết rồi", anh khép lại video.

Nguồn và liên kết 10 nguồn

  1. Tên gốc: Best FREE Local AI Agents + LLM on M6 Mac Mini with 32GB ?
  2. Sự kiện: YouTube
  3. Video gốc: https://www.youtube.com/watch?v=yxrKoDBM4E8 youtube.com
  4. Kênh YouTube Ravish Labs (Ravish Labs): youtube.com/channel/UCzVXsodxe3wYK99dSSZ-t_A youtube.com
  5. OpenCode, trang chính có trang tải bản terminal và desktop (trang tự giới thiệu là "The open source coding agent", đọc ngày 26/10/2026): opencode.ai opencode.ai
  6. Tài liệu Providers của OpenCode, có hướng dẫn cấu hình model local qua một API tương thích OpenAI (đọc ngày 26/10/2026): opencode.ai/docs/providers opencode.ai
  7. oMLX, server inference LLM cho Apple Silicon quản lý từ thanh menu macOS, có API tương thích OpenAI và Anthropic (đọc ngày 26/10/2026): omlx.ai · repo github.com/jundot/omlx omlx.ai
  8. LM Studio (đọc ngày 26/10/2026): lmstudio.ai lmstudio.ai
  9. Cline, open-source AI coding agent dạng extension cho IDE, SDK hoặc CLI (đọc ngày 26/10/2026): cline.bot · repo github.com/cline/cline cline.bot
  10. Trang tải Visual Studio Code: code.visualstudio.com/download code.visualstudio.com