tool

package
v0.2.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 12, 2026 License: MIT Imports: 13 Imported by: 0

Documentation

Overview

Package tool 定义 Agent 工具调用(function calling)的基础设施。

它与具体的 Agent / Provider 解耦,只回答三个问题:

  • 有哪些工具(Definition 描述给模型的元信息);
  • 如何组织它们(Registry 按名注册 / 解析);
  • 如何调用它们(Executor 解析工具 → 校验参数 → 套用中间件 → 执行)。

上层 internal/agent 通过 ToolRunner 把工具执行事件桥接到 Runtime;权限则由工具 在执行期通过 ctx 中的 PermissionRequester 自行请求(见 permission.go)。因此本包 不依赖 agent,避免循环引用。

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrNotFound 表示工具未注册。
	ErrNotFound = errors.New("tool: tool not found")
	// ErrInvalidArguments 表示工具参数非法(无法解析为输入结构或不是合法 JSON)。
	ErrInvalidArguments = errors.New("tool: invalid arguments")
)

工具相关错误。

View Source
var ErrPermissionDenied = errors.New("permission denied")

ErrPermissionDenied 表示工具操作未获得授权。

Functions

func BooleanProperty

func BooleanProperty(description string) map[string]any

BooleanProperty 构造一个 boolean 类型属性。

func IntegerProperty

func IntegerProperty(description string) map[string]any

IntegerProperty 构造一个 integer 类型属性。

func NumberProperty

func NumberProperty(description string) map[string]any

NumberProperty 构造一个 number 类型属性。

func ProjectIDFrom added in v0.2.0

func ProjectIDFrom(ctx context.Context) int64

ProjectIDFrom 取出执行事实中的项目 ID(0 表示未解析到激活项目)。

func RenderRuntimeTemplate added in v0.2.0

func RenderRuntimeTemplate(ctx context.Context, text string) (string, error)

RenderRuntimeTemplate 用注入的 RuntimeContext 的业务变量渲染 pongo2 模板。

变量取自 RuntimeContext.SystemPromptVars(与 Agent Profile 系统提示词同一套变量)。 未注入 RuntimeContext 时按空变量渲染:未定义占位符渲染为空串,无业务上下文的场景 不受影响;text 为空时直接返回空串。

func RenderTemplate added in v0.2.0

func RenderTemplate(text string, vars map[string]any) (string, error)

RenderTemplate 用 vars 渲染一段 pongo2 模板。

未定义的变量按 pongo2 默认行为渲染为空串(配合 {% if %} 可让整段按需出现), 因此调用方无需保证变量齐全。text 为空(或仅空白)时返回空串; 模板语法错误或渲染失败时返回错误。

func RequestPermission added in v0.2.0

func RequestPermission(ctx context.Context, req PermissionRequest) bool

RequestPermission 请求一次工具操作授权。

未注入授权请求器时直接放行:工具因此可以脱离 Agent Runtime 单独使用 (如单元测试、无 UI 的一次性调用)。

func RequirePermission added in v0.2.0

func RequirePermission(ctx context.Context, req PermissionRequest) error

RequirePermission 请求授权,拒绝时返回 ErrPermissionDenied。

func Schema

func Schema(description string, properties map[string]any, required ...string) map[string]any

Schema 构建一个 object 类型的 JSON Schema,用于描述工具入参。

func SessionIDFrom added in v0.2.0

func SessionIDFrom(ctx context.Context) int64

SessionIDFrom 取出执行事实中的会话 ID(0 表示未关联会话)。

func StringProperty

func StringProperty(description string) map[string]any

StringProperty 构造一个 string 类型属性。

func TaskFactsFrom added in v0.2.0

func TaskFactsFrom(ctx context.Context) types.TaskFacts

TaskFactsFrom 取出执行事实;未注入时返回零值。

func UserIDFrom added in v0.2.0

func UserIDFrom(ctx context.Context) int64

UserIDFrom 取出执行事实中的用户 ID(0 表示未知)。

func WithPermissionRequester added in v0.2.0

func WithPermissionRequester(ctx context.Context, requester PermissionRequester) context.Context

WithPermissionRequester 把授权请求器注入工具执行 ctx;requester 为 nil 时原样返回。

func WithTaskFacts added in v0.2.0

func WithTaskFacts(ctx context.Context, facts types.TaskFacts) context.Context

WithTaskFacts 把执行事实注入工具 ctx。

Types

type Call

type Call struct {
	ID        string          `json:"id,omitempty"`        // 调用唯一 ID(模型生成)
	Name      string          `json:"name"`                // 工具名
	Arguments json.RawMessage `json:"arguments,omitempty"` // 参数(JSON)
}

Call 是一次待执行的工具调用。

type Definition

type Definition struct {
	Name        string         `json:"name"`
	Description string         `json:"description,omitempty"`
	InputSchema map[string]any `json:"input_schema"`
}

Definition 描述一个工具,用于暴露给模型(function calling 的 tool 定义)。

InputSchema 是参数的 JSON Schema(object 类型),模型据此生成调用参数。 这里只承载模型可见的元信息;授权动作由工具在执行期自行调用 RequestPermission(见 permission.go)声明,不再作为定义元数据透传给 Provider。

type Executor

type Executor struct {
	// contains filtered or unexported fields
}

Executor 执行工具调用:解析工具 → 校验参数 → 套用中间件 → 执行。

语义约定:所有失败(工具不存在 / 参数非法 / 超时 / panic / 工具返回错误)都 收敛为 Result.IsError=true,而不会向上抛出中断整个流程——模型据此纠正行为。

func NewExecutor

func NewExecutor(registry *Registry, opts ...ExecutorOption) *Executor

NewExecutor 创建执行器;默认在最内层附带 Recover 中间件(panic 不逃逸)。

func (*Executor) Execute

func (e *Executor) Execute(ctx context.Context, call Call) Result

Execute 执行一次工具调用,始终返回 Result(不会因工具失败而中断)。

type ExecutorOption

type ExecutorOption func(*Executor)

ExecutorOption 配置 Executor。

func WithMiddlewares

func WithMiddlewares(ms ...Middleware) ExecutorOption

WithMiddlewares 追加中间件(先加入的越靠内层)。

type Func

type Func[In, Out any] struct {
	// contains filtered or unexported fields
}

Func 把普通函数适配为 Tool:In 为入参结构,Out 为返回结构。

Execute 内部完成 json.Unmarshal(In) → fn(ctx, in) → 返回 Out。

func NewFunc

func NewFunc[In, Out any](name, description string, inputSchema map[string]any, fn func(context.Context, In) (Out, error)) *Func[In, Out]

NewFunc 基于一个强类型函数构建工具。

  • name:唯一工具名(模型用它发起调用);
  • description:用途描述(模型据此判断何时使用);
  • inputSchema:In 的 JSON Schema(可用 Schema 构造器生成);
  • fn:实际执行逻辑。

需要授权时,用 WithPermission 链式声明(如 NewFunc(...).WithPermission(...))。

func (*Func[In, Out]) Definition

func (f *Func[In, Out]) Definition() Definition

Definition 实现 Tool。

func (*Func[In, Out]) Execute

func (f *Func[In, Out]) Execute(ctx context.Context, args json.RawMessage) (any, error)

Execute 实现 Tool:解析入参 → 调用函数。

func (*Func[In, Out]) WithPermission added in v0.2.0

func (f *Func[In, Out]) WithPermission(action, pathFrom, description string) *Func[In, Out]

WithPermission 为工具声明授权动作(链式),返回自身便于继续链式调用。

声明后,工具在解析出入参后、执行前会调用 RequestPermission;被拒绝时返回 ErrPermissionDenied。pathFrom 指定从入参中取授权路径的字段名(可为空)。

func (*Func[In, Out]) WithPermissionPreview added in v0.2.0

func (f *Func[In, Out]) WithPermissionPreview(action, pathFrom, description string, preview func(context.Context, In) PermissionPreview) *Func[In, Out]

WithPermissionPreview 与 WithPermission 相同,但授权参数改由 preview 生成, 用于在批准前向用户展示将要发生的改动(如新建 / 修改 run.sh、params.json)。

preview 返回的内容为空(既无 FilePath 也无 Diff)时回退到工具入参,因此不影响 仅有描述、没有 diff 的授权场景;preview 为 nil 时等价于 WithPermission。

type Middleware

type Middleware func(next Next) Next

Middleware 包裹工具执行:在真正调用工具前后做校验 / 超时 / 恢复 / 日志等。

中间件在 Executor 中按注册顺序包裹(先注册的越靠内层)。约定:中间件应调用 next 继续执行,并在需要时改造 ctx / call / 返回值。

func Logging

func Logging(logf func(format string, args ...any)) Middleware

Logging 在工具执行前后记录日志;logf 为 nil 时使用标准库 log。

func Recover

func Recover() Middleware

Recover 把工具执行中的 panic 转为 error,避免单个工具拖垮整个调用流程。

func Timeout

func Timeout(d time.Duration) Middleware

Timeout 为工具执行设置超时;超时返回 error。

type Next

type Next func(ctx context.Context, call Call) (any, error)

Next 是中间件链中的下一个处理器。

type PermissionPreview added in v0.2.0

type PermissionPreview struct {
	FilePath string `json:"file_path,omitempty"`
	Diff     string `json:"diff,omitempty"`
}

PermissionPreview 是授权请求中「批准前预览」的附加信息。

FilePath / Diff 的 JSON 键与 coder edit / write 的授权参数保持一致,上层 (agent.operationFromToolPermission)会把它们提取到 Operation.Metadata 的 file_path / diff,前端据此在用户批准前渲染 unified diff。

type PermissionRequest added in v0.2.0

type PermissionRequest struct {
	SessionID   string `json:"session_id"`
	ToolName    string `json:"tool_name"`
	Description string `json:"description"`
	Action      string `json:"action"`
	Params      any    `json:"params,omitempty"`
	Path        string `json:"path,omitempty"`
}

PermissionRequest 描述一次工具操作授权请求。

字段与 opencode internal/permission.CreatePermissionRequest 对齐,使从 opencode/internal/llm/tools 迁移过来的工具保持一致的权限语义:

  • SessionID:发起调用的会话标识(缺省时由 RequestPermission 从 ctx 补齐);
  • ToolName / Action:工具名与授权动作(execute / write / read / fetch / delete ...);
  • Description:展示给用户的摘要(如 "Execute command: ls -la");
  • Params:工具入参,供上层抽取命令 / diff 等细节;
  • Path:授权作用路径(文件操作取目录,命令执行取工作目录)。

type PermissionRequester added in v0.2.0

type PermissionRequester interface {
	RequestPermission(ctx context.Context, req PermissionRequest) bool
}

PermissionRequester 由上层注入,把工具操作授权请求桥接到 Runtime。

返回 true 表示允许,false 表示拒绝。tool 包不依赖 agent 包,因此这里只声明 最小端口,具体映射(PermissionRequest → Operation → Runtime.RequestPermission) 由上层实现(见 agent.WithToolPermission)。

func PermissionRequesterFrom added in v0.2.0

func PermissionRequesterFrom(ctx context.Context) PermissionRequester

PermissionRequesterFrom 取出注入的授权请求器;未注入时返回 nil。

type Registry

type Registry struct {
	// contains filtered or unexported fields
}

Registry 注册并解析工具。

工具按名称唯一;List 返回全部工具的 Definition,供 Provider 暴露给模型 (即 function calling 里的 tools 参数)。

func NewRegistry

func NewRegistry() *Registry

NewRegistry 创建空注册表。

func NewRegistryWith

func NewRegistryWith(tools ...Tool) *Registry

NewRegistryWith 创建注册表并注册给定工具。

func (*Registry) Definition added in v0.2.0

func (r *Registry) Definition(name string) (Definition, bool)

Definition 按名称返回工具的定义(含 Permission 元信息)。

供上层在执行前读取工具声明的授权动作(如构建权限解析器)使用。

func (*Registry) Get

func (r *Registry) Get(name string) (Tool, bool)

Get 按名称解析工具。

func (*Registry) Has

func (r *Registry) Has(name string) bool

Has 报告指定工具是否已注册。

func (*Registry) List

func (r *Registry) List() []Definition

List 返回全部工具定义(按名称升序),供暴露给模型。

func (*Registry) Names

func (r *Registry) Names() []string

Names 返回全部工具名(升序),便于调试 / 校验。

func (*Registry) Register

func (r *Registry) Register(t Tool)

Register 注册工具;同名覆盖。nil 或空名工具会被忽略。

func (*Registry) Tools added in v0.2.0

func (r *Registry) Tools() []Tool

Tools 返回全部工具实例(按名称升序)。

供需要重新组合工具集合的调用方使用(如 Provider 在内置工具之外追加 ask_user)。

type Result

type Result struct {
	Content string `json:"content"`        // 回传给模型的文本
	Data    any    `json:"data,omitempty"` // 结构化结果(供上层业务使用)
	IsError bool   `json:"is_error"`       // 是否为失败结果
	Err     error  `json:"-"`              // 底层错误(仅供日志 / 观测,不回传模型)
}

Result 是一次工具调用的结果。

无论成功还是失败,Content 都会回传给模型(因此始终是可读文本); IsError 标识这次调用是否失败,模型可据此纠正后续行为。

func Failure

func Failure(err error) Result

Failure 构造失败结果(IsError=true)。

func Success

func Success(data any) Result

Success 构造成功结果,Content 由 data 序列化而来。

type Tool

type Tool interface {
	// Definition 返回工具的元信息(名称 / 描述 / 参数 schema)。
	Definition() Definition
	// Execute 执行工具;args 是模型生成的参数(JSON,空时视为 {})。
	Execute(ctx context.Context, args json.RawMessage) (any, error)
}

Tool 是可被 Agent 调用的一个工具。

实现约定:

  • Execute 返回的 error 会被上层包装为"工具执行失败"的结果(Result.IsError=true), 而不会中断整个调用流程——模型可以看到错误信息并尝试纠正。
  • 返回的 any 会被序列化为结果内容(Result.Content)回传给模型。

Directories

Path Synopsis
Package builtin 提供框架内置的工具(如 get_weather)。
Package builtin 提供框架内置的工具(如 get_weather)。
Package coder 提供从 opencode 迁移的编码类工具(bash / edit / view / write / patch / glob / grep / ls / fetch / sourcegraph / diagnostics)。
Package coder 提供从 opencode 迁移的编码类工具(bash / edit / view / write / patch / glob / grep / ls / fetch / sourcegraph / diagnostics)。
diff
Package diff 提供文件补丁解析与应用能力(从 opencode internal/diff 迁移)。
Package diff 提供文件补丁解析与应用能力(从 opencode internal/diff 迁移)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL