Giới thiệu OpenLum.Console
OpenLum.Console là dự án .NET Agent Shell hỗ trợ biên dịch Native AOT, kích thước sau phát hành chỉ 7MB. Hệ thống tích hợp sẵn các công cụ cơ bản như thao tác trình duyệt, đọc file Office, đồng thời cho phép mở rộng động thông qua cơ chế Skills.
- Hỗ trợ các mô hình tương thích OpenAI API (DeepSeek, Ollama, OpenAI...)
- Không phụ thuộc thư viện NuGet, triển khai dễ dàng trên mạng nội bộ
- Cơ chế nén hội thoại thông minh để tối ưu token sử dụng
Đặc điểm chính
| Tính năng | Mô tả |
|---|---|
| Native AOT | Hỗ trợ biên dịch AOT, tạo file thực thi đơn lẻ với tốc độ khởi động nhanh |
| Zero Dependency | Chỉ sử dụng thư viện BCL và System.Text.Json |
| Tương thích OpenAI API | Hỗ trợ cấu hình baseUrl để kết nối đa nền tảng |
| Cơ chế Skills | Tự động phát hiện kỹ năng từ file SKILL.md, tải động khi cần |
Kiến trúc hệ thống
Program.Main
├── Application.Run()
│ ├── ConfigLoader.Load() → AppConfig
│ ├── ToolRegistry → Đăng ký công cụ
│ ├── OpenAIModelProvider → Gọi API mô hình
│ ├── AgentLoop → Vòng lặp chính xử lý
Các module cốt lõi
| Module | Nhiệm vụ |
|---|---|
| ConfigLoader | Tải cấu hình từ file JSON |
| ToolRegistry | Quản lý đăng ký và lọc công cụ |
| AgentLoop | Thực thi vòng lặp xử lý đa bước, giới hạn 50 vòng |
Cơ chế Skills
Người dùng mở rộng chức năng thông qua thư mục skills chứa:
skills/
webbrowser/
SKILL.md
browser/openlum-browser.exe
read/
SKILL.md
pdf/read-pdf.exe
Cấu trúc SKILL.md
---
name: webbrowser
description: "Duyệt web thông qua exec gọi exe"
---
## Đường dẫn exe
skills/webbrowser/browser/openlum-browser.exe
## Ví dụ
powershell
& "skills/webbrowser/browser/openlum-browser.exe" --url "https://example.com"
Cài đặt và chạy thử
Cấu hình mẫu (openlum.json):
{
"model": {
"baseUrl": "http://localhost:11434/v1",
"apiKey": "dummy"
},
"tools": {
"profile": "local",
"allow": ["group:fs", "group:web"]
}
}
Hướng dẫn biên dịch
# Biên dịch AOT
dotnet publish -r win-x64 -p:PublishAot=true
# File đầu ra: bin/Release/net10.0/win-x64/publish/
Ví dụ mã nguồn
Kiểm tra đường dẫn hợp lệ:
// ExecTool.cs
if (TryExtractSkillExePath(command, out var exePath) && !File.Exists(exePath)) {
return $"Lỗi: Thiếu file thực thi {exePath}. Vui lòng kiểm tra SKILL.md...";
}
Nén hội thoại:
// SessionCompactor.cs
public async Task CompactIfNeededAsync(ISession session) {
if (session.MessageCount > MAX_MESSAGES) {
var summary = await CreateSummaryAsync(session);
session.ClearOldMessages();
session.AddSummary(summary);
}
}