Chuyển tới nội dung chính
Phiên bản: v1

Plugin công cụ

Tool là hàm agent gọi được. SDK phản xạ struct input Go thành JSON Schema, bạn không viết schema tay.

Tạo dự án:

acton-plugin new my-weather-tool --type=tool

Đăng ký tool có kiểu​

package main

import (
"github.com/actonos/plugin-sdk/sdk"
)

type QueryInput struct {
SearchTerm string `json:"search_term" jsonschema:"description=Keywords to search,required"`
MaxResults int `json:"max_results" jsonschema:"description=Maximum results to return"`
}

func init() {
tool := sdk.NewTypedTool("search_docs", "Search documentation", func(ctx sdk.Context, in QueryInput) (*sdk.ToolResult, error) {
ctx.Log().Info("search", "term", in.SearchTerm, "limit", in.MaxResults)
return sdk.NewResultData("Found 2 documents", map[string]any{"count": 2}), nil
})
sdk.RegisterTool(tool)
}

func main() {
sdk.Serve()
}

Tag jsonschema dùng được:

TagHiệu lực
description=...Hiện cho mô hình
requiredTham số bắt buộc
enum=a|bGiá trị cho phép
default=...Mặc định
title=...Nhãn ngắn

Kết quả​

HelperKhi nào
sdk.NewResult(text)Thành công, chỉ text
sdk.NewResultData(text, map[string]any{...})Thành công kèm data có cấu trúc
sdk.NewResultError(message)Lỗi agent nên giải thích cho user

API host trong tool​

Mỗi handler nhận sdk.Context:

func(ctx sdk.Context, in QueryInput) (*sdk.ToolResult, error) {
ctx.Log().Info("start")

resp, err := ctx.HTTP().Get("https://api.example.com/search?q=" + in.SearchTerm)
if err != nil {
return sdk.NewResultError(err.Error()), nil
}

token, err := ctx.Vault().GetSecret("example_api_key")
if err != nil {
return sdk.NewResultError("missing API key"), nil
}
_ = token

_ = ctx.Storage().Set("last_query", in.SearchTerm)

return sdk.NewResult(resp.Body), nil
}

HTTP hữu ích: Get, GetWithBearer, PostJSON, PostJSONWithBearer, PostBinary, Do.

Khai báo quyền khớp:

"permissions": {
"net_outbound": ["api.example.com"],
"secrets": ["example_api_key"],
"storage": true
}

Tệp Workspace​

Nếu tool cần đọc/ghi tài liệu của user:

meta, err := ctx.Workspace().SaveText("reports/summary.md", "# Summary\n")
if err != nil {
return sdk.NewResultError(err.Error()), nil
}
data, _, err := ctx.Workspace().ReadBinary("report.pdf")

Bật "workspace": true trong permissions (xem Manifest).


Mảng tools trên manifest​

Liệt kê mỗi tool bạn đăng ký. Host dùng để khám phá trước khi module chạy:

"tools": [
{
"name": "search_docs",
"description": "Search documentation",
"category": "plugin"
}
]

Schema runtime vẫn đến từ NewTypedTool. Giữ tên giống nhau.


Test local​

acton-plugin build
acton-plugin test --tool=search_docs --input='{"search_term":"heartbeat","max_results":5}'

Nếu bỏ --tool và manifest có tools, CLI lấy tên đầu tiên.


Trang liên quan​