Nhiều người hỏi tôi dựng “Grok bot” kiểu gì — con agent bạn nhờ vẽ minh hoạ là nó trả ảnh ngay trong chat. Câu trả lời thật thà làm bay hết ảo thuật: một bot trong agent platform là hai thứ nhỏ — một tool (hàm mà model gọi được) và một persona (agent biết khi nào gọi tool đó). Khi thấy được cách tách này, thêm một năng lực mới không còn là một dự án mà chỉ là một buổi tối.
Đây là phần giải phẫu, lấy con image generator làm ví dụ.
Quyết định đầu tiên: tool, MCP, hay engine?
Không phải năng lực nào cũng nên là tool viết tay. Tôi chọn hình dạng rẻ nhất mà vừa.
| Hình dạng | Dùng khi | Ví dụ |
|---|---|---|
| Tool built-in | Tôi tự code và tái dùng khắp nơi | generate_image, web_search |
| Custom HTTP tool | Gọi API ngoài, không cần code — chỉ URL + params trong DB | endpoint báo cáo nội bộ |
| MCP server | Hãng đã có sẵn một tool server phong phú | GitHub, Linear qua MCP OAuth |
| Engine | Bản thân nó là executor chạy cả một task | một cloud coding agent |
Image generator là một tool built-in: một hàm, gọi được từ mọi nơi, trả về một artifact. Đó là điểm ngọt cho việc “cho model một động từ mới”.
Tool là một hàm có schema — và schema chính là prompt
Một tool được định nghĩa hai lần: một schema để model đọc rồi quyết định khi nào và gọi thế nào, và một
implementation làm việc thật. Schema quan trọng hơn người ta tưởng — cái description của nó là chỉ
dẫn duy nhất model nhận được về tool.
{
"type": "function",
"function": {
"name": "generate_image",
"description": "Generate an image from a text prompt. Returns the image inline. Use for illustrations, mockups, concept art, social visuals.",
"parameters": {
"type": "object",
"properties": { "prompt": { "type": "string", "description": "Detailed description of the image to create." } },
"required": ["prompt"]
}
}
}
Mấy nguyên tắc đáng giá: đặt tên là động từ, viết description theo kiểu khi nào dùng (không phải nó là gì), giữ ít tham số và có kiểu rõ, và nói rõ nó trả về gì. Description mơ hồ = một tool model không bao giờ gọi, hoặc gọi sai.
Implementation: làm việc, trả về thứ model dùng được
Bản thân hàm là code bình thường. Mẹo duy nhất đáng khắc cốt: trả về kết quả mà cả model lẫn UI đều dùng được. Con image tool của tôi không trả bytes thô — nó lưu ảnh thành artifact và trả về một thẻ markdown ảnh, nên câu trả lời hiện ngay trong chat mà không cần đấu nối gì thêm.
def tool_generate_image(prompt):
img = provider.generate(prompt) # 1. gọi provider
aid = save_artifact(img, mime="image/jpeg") # 2. lưu thành artifact
return "" % (prompt[:60], aid) # 3. thân thiện model & UI
Tool trả về tốt thì: ngắn, tự mô tả, và tham chiếu artifact bằng URL thay vì đổ blob vào context window.
Vòng lặp tool: một lời gọi thực sự diễn ra thế nào
Tôi không điều phối lời gọi — model làm việc đó. Runtime của tôi chỉ thực thi cái nó yêu cầu rồi đưa kết quả lại cho tới khi nó dừng.
flowchart LR
U["User: 'vẽ mascot con cáo'"] --> M["Model"]
M -->|"tool_call: generate_image"| RT["Runtime"]
RT -->|chạy tool_generate_image| T["Tool"]
T -->|""| RT
RT -->|kết quả tool| M
M -->|câu trả lời + ảnh| UTôi đăng ký implementation cạnh schema để runtime tìm được theo tên:
TOOL_FN = { "generate_image": lambda a: tool_generate_image(a.get("prompt", "")), ... }
Đó là toàn bộ cơ chế. Mọi “bot” bạn từng trầm trồ đều là vòng lặp này gắn thêm các tool khác nhau.
Từ tool thành bot: thêm một persona
Một tool ai cũng gọi được sẽ thành một bot khi tôi bọc nó trong một agent — một system prompt cho nó một công việc, một giọng, và một hai tool nó nên với tới.
| Trường | Grok image bot |
|---|---|
| tên / icon | ”Grok Artist” 🎨 |
| tools | ["generate_image"] |
| system prompt | ”Bạn là một hoạ sĩ. Khi được nhờ tạo ảnh, hãy viết một prompt sống động, cụ thể rồi gọi generate_image. Đề xuất một biến thể.” |
| engine / model | model chạy vòng lặp tool |
Giờ “Grok Artist” là một thứ trên roster tôi có thể chat, giao cho workflow, hay kích theo lịch — tất cả chỉ vì tôi thêm một động từ và một persona.
Công thức, tổng quát hoá
- Chọn hình dạng — tool, HTTP tool, MCP, hay engine.
- Viết schema — tên động từ, description kiểu khi-nào-dùng, ít tham số có kiểu, nêu rõ giá trị trả về.
- Implement — trả về một chuỗi ngắn, tham chiếu artifact.
- Đăng ký — schema + hàm, theo tên.
- Bọc trong persona — một agent biết khi nào với tới nó.
Tôi đã ship một image generator, một document builder, một code sandbox, và một cloud-coding agent qua đúng năm bước này. Nền tảng không lớn lên bằng cách phình to; nó lớn lên mỗi lần một động từ.