Pi: Công Cụ AI Coding Mã Nguồn Mở Tùy Biến Hoàn Toàn

Trong thế giới AI coding agent đang ngày càng đông đúc với Claude Code, Cursor, Aider, và hàng chục công cụ khác, hầu hết đều đi theo một hướng chung: tích hợp càng nhiều tính năng càng tốt, đóng gói chặt chẽ, và áp đặt workflow lên người dùng. Nhưng điều gì xảy ra khi bạn là một developer muốn kiểm soát hoàn toàn — muốn chọn LLM provider, muốn tự định nghĩa tool, muốn xây dựng agent workflow theo cách riêng của mình mà không cần fork một codebase khổng lồ?

Đó chính là lý do Pi (badlogic/pi-mono) ra đời. Triết lý thiết kế của nó có thể tóm gọn trong một câu khiêu khích: “No MCP. No sub-agents. No permission popups.” Không phải vì những thứ đó vô dụng, mà vì Pi tin rằng chúng không nên được baked-in — chúng nên là những thứ bạn thêm vào khi cần, theo cách bạn muốn.

Pi Là Gì Và Tại Sao Nó Tồn Tại?

Pi (badlogic/pi-mono) là một TypeScript monorepo mã nguồn mở cung cấp full-stack toolkit để xây dựng, chạy, và triển khai AI coding agent. Ở cốt lõi là pi — một interactive terminal-based coding agent hỗ trợ hơn 20 LLM provider. Nhưng điều khiến Pi khác biệt không phải là số lượng tính năng, mà là cách nó được kiến trúc.

Thay vì xây dựng một công cụ monolithic với mọi thứ được tích hợp sẵn, Pi được thiết kế như một composable platform — nơi mỗi layer có thể được sử dụng độc lập, mỗi quyết định thiết kế đều có thể bị ghi đè, và mỗi tính năng “thiếu” đều là một cơ hội để bạn xây dựng thứ gì đó phù hợp với nhu cầu cụ thể của mình.

Trong một thị trường mà mọi công cụ đều cố gắng trở thành “all-in-one solution”, Pi đặt cược vào một hướng ngược lại: radical extensibility over built-in features. Đây là một lựa chọn dũng cảm, và như chúng ta sẽ thấy, nó có lý do kỹ thuật rất vững chắc.

Kiến Trúc Phân Lớp Được Xây Dựng Cho Sự Linh Hoạt

Một trong những điểm ấn tượng nhất của Pi là cách nó tổ chức dependency hierarchy. Monorepo tuân theo một thứ tự phụ thuộc nghiêm ngặt:

pi-ai → pi-agent-core → pi-coding-agent → pi-tui / pi-web-ui

Điều này không chỉ là convention — đây là một cam kết kiến trúc. Mỗi package ở tầng dưới không biết gì về tầng trên, và mỗi package đều có thể được sử dụng độc lập:

  • @mariozechner/pi-ai: Unified LLM streaming API. Bạn có thể import chỉ package này nếu chỉ cần một lớp abstraction cho các LLM provider.
  • @mariozechner/pi-agent-core: Agent runtime không gắn với bất kỳ UI nào.
  • @mariozechner/pi-coding-agent: Coding-specific tools và behaviors.
  • @mariozechner/pi-tui: Terminal UI framework có thể dùng cho bất kỳ ứng dụng CLI nào.

Về mặt tooling, Pi sử dụng TypeScript ESM modules, npm workspaces, Biome 2.3 cho linting và formatting, và tsgo cho fast type checking. Đây là một tech stack hiện đại và thực dụng — không có gì quá exotic, nhưng mọi lựa chọn đều có mục đích rõ ràng.

Hơn 20 LLM Provider, Một Unified API

Package @mariozechner/pi-ai là trái tim kỹ thuật của Pi. Nó chuẩn hóa streaming interface cho một danh sách provider ấn tượng: Anthropic, OpenAI, Google, Mistral, Groq, Bedrock, Azure, xAI, OpenRouter, Cerebras, và nhiều hơn nữa.

Nhưng điều thực sự đặc biệt là hỗ trợ OAuth-based subscriptions. Thay vì chỉ dùng API key, Pi có thể authenticate với Claude Pro/Max, ChatGPT Plus, GitHub Copilot, và Gemini CLI thông qua OAuth flows — nghĩa là bạn có thể tận dụng subscription hiện có của mình thay vì phải trả thêm tiền cho API usage.

Một tính năng kỹ thuật đáng chú ý khác là cross-provider mid-conversation handoffs. Trong một single Context object, bạn có thể bắt đầu conversation với Claude, sau đó chuyển sang GPT-5, rồi tiếp tục với Gemini — và Pi sẽ tự động xử lý việc transform context giữa các provider. Ví dụ, thinking blocks từ Claude sẽ được chuyển đổi thành tagged text phù hợp cho các provider khác.

Về validation và streaming, Pi sử dụng TypeBox + AJV cho tool call validation và progressive partial JSON parsing — nghĩa là UI có thể hiển thị kết quả ngay cả khi JSON chưa hoàn chỉnh, tạo ra trải nghiệm streaming mượt mà hơn đáng kể so với chờ full response.

Một ví dụ đơn giản về cách sử dụng unified API:

import { createProvider, Context } from "@mariozechner/pi-ai";

const provider = createProvider("anthropic", { apiKey: process.env.ANTHROPIC_KEY });
const context = new Context();

// Sau đó switch sang OpenAI trong cùng conversation
const openaiProvider = createProvider("openai", { apiKey: process.env.OPENAI_KEY });
await context.complete(openaiProvider, "claude-3-5-sonnet", messages);

Coding Agent: Tối Giản Có Chủ Đích, Mở Rộng Vô Hạn

Pi coding agent được thiết kế với một triết lý rõ ràng: ship ít hơn, nhưng làm nền tảng tốt hơn. Nó cố tình không có MCP, sub-agents, plan mode, hay background bash. Đây không phải là thiếu sót — đây là lựa chọn thiết kế.

Thay vào đó, Pi cung cấp một extension API mạnh mẽ cho phép bạn:

  • Đăng ký custom tools hoặc thay thế built-in tools
  • Thêm UI widgets vào terminal interface
  • Intercept lifecycle events của agent
  • Định nghĩa custom prompt templates và themes
  • Thậm chí chạy Doom trong terminal trong khi chờ agent response (có, điều này thực sự được đề cập trong docs)

Để phân phối customizations, Pi sử dụng khái niệm Pi Packages — bundle các extensions, tools, và configurations có thể được publish lên npm hoặc git, tuân theo Agent Skills standard. Điều này tạo ra một ecosystem mà cộng đồng có thể đóng góp và chia sẻ các extensions mà không cần fork core project.

Pi hỗ trợ nhiều operation modes:

  • Interactive: Terminal UI đầy đủ cho daily use
  • Print: Output text thuần cho scripting
  • JSON: Machine-readable output
  • RPC: Cho integration với các tools khác
  • SDK: Programmatic embedding trong ứng dụng của bạn

Session Branching và Context Management

Một trong những tính năng kỹ thuật thú vị nhất của Pi là cách nó quản lý conversation history. Thay vì lưu sessions như flat files, Pi sử dụng tree-structured JSONL — mỗi entry trong file có id và parentId, cho phép branching trong cùng một file mà không cần duplicate dữ liệu.

Điều này có nghĩa là bạn có thể:

  • Thử một approach khác từ giữa conversation mà không mất lịch sử
  • Dùng lệnh /tree để navigate và switch giữa các conversation branches
  • Luôn có full history được preserve, ngay cả khi context đã được compact

Về context compaction, Pi tự động summarize các messages cũ khi approaching context window limit. Điều quan trọng là full history vẫn được giữ nguyên trong JSONL file — chỉ có context được gửi đến LLM là được compress. Đây là một approach thực dụng và thông minh hơn so với việc đơn giản truncate history.

Terminal UI Framework Được Xây Dựng Từ Đầu

Thay vì dùng Ink hay Blessed — hai thư viện phổ biến nhất cho terminal UI trong Node.js ecosystem — Pi xây dựng @mariozechner/pi-tui hoàn toàn từ đầu. Đây là một quyết định táo bạo, và lý do kỹ thuật rất thuyết phục.

Pi-tui sử dụng differential rendering với CSI 2026 synchronized output — một terminal protocol hiện đại giúp loại bỏ hoàn toàn hiện tượng flickering khi cập nhật UI. Framework có ba rendering strategy:

  • First render: Render toàn bộ UI lần đầu tiên
  • Full re-render: Khi terminal width thay đổi
  • Delta update: Chỉ cập nhật những gì thay đổi trong normal operation

Built-in components bao gồm:

  • Multi-line editor với autocomplete
  • Markdown renderer với syntax highlighting
  • Inline image rendering (hỗ trợ cả Kitty và iTerm2 protocols)
  • Select lists, settings panels, overlays với anchor-based positioning
  • IME support cho CJK input methods — điều này đặc biệt quan trọng cho developers ở Việt Nam, Nhật Bản, Trung Quốc, và Hàn Quốc

Việc không phụ thuộc vào Ink hay Blessed không chỉ là vấn đề performance — nó còn cho phép Pi implement những tính năng mà các framework hiện có không hỗ trợ, như synchronized output và inline image rendering.

Pi So Với Claude Code, Aider, và Vercel AI SDK

Để hiểu rõ hơn vị trí của Pi trong ecosystem, hãy so sánh trực tiếp:

Pi vs. Claude Code

Claude Code là một công cụ xuất sắc nhưng bị lock-in vào Anthropic ecosystem. Pi hỗ trợ hơn 20 providers, không có built-in permission prompts gây gián đoạn workflow, và có session branching phức tạp hơn. Nếu bạn muốn switch giữa Claude và GPT-5 tùy theo task, Pi là lựa chọn tự nhiên hơn.

Pi vs. Aider

Aider là một git-diff tool tuyệt vời với một mục đích cụ thể. Pi là một platform — git integration có thể được thêm vào qua extensions, nhưng Pi không giả định đó là workflow duy nhất của bạn. Nếu bạn cần một coding agent có thể được embedded trong ứng dụng khác hoặc được customize sâu, Pi phù hợp hơn.

Pi vs. Vercel AI SDK

Vercel AI SDK là một streaming abstraction tốt, nhưng pi-ai đi xa hơn với curated model registry, built-in cost tracking, OAuth flows cho consumer subscriptions, và cross-provider handoffs. Nếu bạn đang xây dựng một production application cần quản lý nhiều providers, Pi cung cấp nhiều infrastructure hơn out of the box.

Kết Luận: Dành Cho Những Developer Muốn Kiểm Soát Thực Sự

Pi không phải là công cụ cho tất cả mọi người. Nếu bạn muốn một AI coding assistant hoạt động tốt ngay từ hộp với minimal configuration, Claude Code hay Cursor có thể phù hợp hơn. Nhưng nếu bạn là một intermediate-to-senior TypeScript developer, một engineering team đang đánh giá AI tooling, hay một developer muốn xây dựng custom agent workflows — Pi là một trong những foundation tốt nhất hiện có.

Điều làm Pi thực sự đặc biệt không phải là danh sách tính năng, mà là tư duy kiến trúc đằng sau nó: mỗi layer độc lập và có thể tái sử dụng, mỗi quyết định “không làm” đều được bù đắp bởi một extension point rõ ràng, và toàn bộ hệ thống được thiết kế để bạn có thể hiểu, modify, và build on top of nó.

Trong một thời đại mà hầu hết AI tools đều cố gắng lock bạn vào ecosystem của họ, Pi đặt cược vào sự tin tưởng: tin rằng developers giỏi sẽ đánh giá cao sự kiểm soát hơn sự tiện lợi, và tin rằng một platform tốt sẽ tạo ra ecosystem tốt hơn một monolith feature-rich.

Nếu bạn cảm thấy bị gò bó bởi các AI coding tools hiện tại và muốn một platform thực sự composable và customizable, hãy:

  • ⭐ Khám phá repository tại github.com/badlogic/pi-mono
  • 🚀 Thử CLI và xem nó fit vào workflow của bạn như thế nào
  • 🔧 Cân nhắc đóng góp extensions hoặc Pi Packages cho ecosystem
  • 💬 Tham gia cộng đồng và chia sẻ use cases của bạn

Pi vẫn còn là một dự án đang phát triển, nhưng kiến trúc của nó đã cho thấy một tầm nhìn rõ ràng và nhất quán. Đây là thời điểm tốt để tham gia — khi ecosystem đang được định hình và contributions của bạn có thể có impact thực sự.

Lê Hoàng Tâm (Tom Le) is a Software Engineer and Cloud Architect with over 10 years of experience. AWS Certified. Specializes in distributed systems, DevOps, and AI/ML integration. Founder of Th?nk And Grow — a platform sharing practical technology insights in Vietnamese. Passionate about building scalable systems and helping developers grow through real-world knowledge.