Documentation
¶
Overview ¶
Package tool 定义 Agent 工具调用(function calling)的基础设施。
它与具体的 Agent / Provider 解耦,只回答三个问题:
- 有哪些工具(Definition 描述给模型的元信息);
- 如何组织它们(Registry 按名注册 / 解析);
- 如何调用它们(Executor 解析工具 → 校验参数 → 套用中间件 → 执行)。
上层 internal/agent 通过 ToolRunner 把工具执行事件桥接到 Runtime;权限则由工具 在执行期通过 ctx 中的 PermissionRequester 自行请求(见 permission.go)。因此本包 不依赖 agent,避免循环引用。
Index ¶
- Variables
- func BooleanProperty(description string) map[string]any
- func IntegerProperty(description string) map[string]any
- func NumberProperty(description string) map[string]any
- func ProjectIDFrom(ctx context.Context) int64
- func RenderRuntimeTemplate(ctx context.Context, text string) (string, error)
- func RenderTemplate(text string, vars map[string]any) (string, error)
- func RequestPermission(ctx context.Context, req PermissionRequest) bool
- func RequirePermission(ctx context.Context, req PermissionRequest) error
- func Schema(description string, properties map[string]any, required ...string) map[string]any
- func SessionIDFrom(ctx context.Context) int64
- func StringProperty(description string) map[string]any
- func TaskFactsFrom(ctx context.Context) types.TaskFacts
- func UserIDFrom(ctx context.Context) int64
- func WithPermissionRequester(ctx context.Context, requester PermissionRequester) context.Context
- func WithTaskFacts(ctx context.Context, facts types.TaskFacts) context.Context
- type Call
- type Definition
- type Executor
- type ExecutorOption
- type Func
- func (f *Func[In, Out]) Definition() Definition
- func (f *Func[In, Out]) Execute(ctx context.Context, args json.RawMessage) (any, error)
- func (f *Func[In, Out]) WithPermission(action, pathFrom, description string) *Func[In, Out]
- func (f *Func[In, Out]) WithPermissionPreview(action, pathFrom, description string, ...) *Func[In, Out]
- type Middleware
- type Next
- type PermissionPreview
- type PermissionRequest
- type PermissionRequester
- type Registry
- type Result
- type Tool
Constants ¶
This section is empty.
Variables ¶
var ( // ErrNotFound 表示工具未注册。 ErrNotFound = errors.New("tool: tool not found") // ErrInvalidArguments 表示工具参数非法(无法解析为输入结构或不是合法 JSON)。 ErrInvalidArguments = errors.New("tool: invalid arguments") )
工具相关错误。
var ErrPermissionDenied = errors.New("permission denied")
ErrPermissionDenied 表示工具操作未获得授权。
Functions ¶
func BooleanProperty ¶
BooleanProperty 构造一个 boolean 类型属性。
func IntegerProperty ¶
IntegerProperty 构造一个 integer 类型属性。
func NumberProperty ¶
NumberProperty 构造一个 number 类型属性。
func ProjectIDFrom ¶ added in v0.2.0
ProjectIDFrom 取出执行事实中的项目 ID(0 表示未解析到激活项目)。
func RenderRuntimeTemplate ¶ added in v0.2.0
RenderRuntimeTemplate 用注入的 RuntimeContext 的业务变量渲染 pongo2 模板。
变量取自 RuntimeContext.SystemPromptVars(与 Agent Profile 系统提示词同一套变量)。 未注入 RuntimeContext 时按空变量渲染:未定义占位符渲染为空串,无业务上下文的场景 不受影响;text 为空时直接返回空串。
func RenderTemplate ¶ added in v0.2.0
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 SessionIDFrom ¶ added in v0.2.0
SessionIDFrom 取出执行事实中的会话 ID(0 表示未关联会话)。
func StringProperty ¶
StringProperty 构造一个 string 类型属性。
func TaskFactsFrom ¶ added in v0.2.0
TaskFactsFrom 取出执行事实;未注入时返回零值。
func UserIDFrom ¶ added in v0.2.0
UserIDFrom 取出执行事实中的用户 ID(0 表示未知)。
func WithPermissionRequester ¶ added in v0.2.0
func WithPermissionRequester(ctx context.Context, requester PermissionRequester) context.Context
WithPermissionRequester 把授权请求器注入工具执行 ctx;requester 为 nil 时原样返回。
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 不逃逸)。
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]) WithPermission ¶ added in v0.2.0
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 ¶
Middleware 包裹工具执行:在真正调用工具前后做校验 / 超时 / 恢复 / 日志等。
中间件在 Executor 中按注册顺序包裹(先注册的越靠内层)。约定:中间件应调用 next 继续执行,并在需要时改造 ctx / call / 返回值。
func Logging ¶
func Logging(logf func(format string, args ...any)) Middleware
Logging 在工具执行前后记录日志;logf 为 nil 时使用标准库 log。
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 (*Registry) Definition ¶ added in v0.2.0
func (r *Registry) Definition(name string) (Definition, bool)
Definition 按名称返回工具的定义(含 Permission 元信息)。
供上层在执行前读取工具声明的授权动作(如构建权限解析器)使用。
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 标识这次调用是否失败,模型可据此纠正后续行为。
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)回传给模型。
Source Files
¶
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 迁移)。 |