field

package
v0.3.0 Latest Latest
Warning

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

Go to latest
Published: Aug 26, 2026 License: Apache-2.0 Imports: 2 Imported by: 0

Documentation

Overview

Package field 提供声明插件契约的 builder。

为什么不用 struct tag(docs/plugin-sdk-multilang.md):

  • tag 是字符串,`lable:"..."` 拼错时**编译器一声不吭**;builder 写错方法名直接编译失败
  • 结构化信息塞进字符串已经在吃力——enum 的显示名要发明 `=` 分隔,oneof 的类型名只能写字符串
  • `oneof` 在这里是**真实类型引用**,类型改名/删除立刻编译失败,不必等生成期
  • 无结构的 json 必须 .Opaque(理由) 才能声明:API 里压根没有"随手 map"这个省事选项

声明是纯数据,可直接序列化为 JSON 供其他语言 SDK 生成对应类型。 与契约同模块:builder 只用契约类型,没有一点传输的东西,故不该压在 SDK 里—— 压在那里的话,内核(httpcore/llmcore)想声明自己的契约就得反过来依赖 SDK。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Opt

func Opt(value string, label ...string) contract.Option

Opt 构造一个候选项:值本身可读时只给值,是代码时补显示名。

Types

type B

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

B:字段 builder。实现 contract.FieldSpec,可直接放进 Inputs()/Outputs() 返回值。

func Any

func Any(name, reason string) *B

Any 声明「任意 JSON 值」:连是不是对象都不定。

与 Object 的区别值得记住:Object 是「**是**对象,但键不定」(→ map[string]any, 校验要求必须是对象);Any 是「可能是对象、数组、字符串、数字、布尔」(→ any,校验放行一切)。 http 的请求体/响应体就是后者:json 模式给对象,raw 模式给字符串。

实现上用已有的联合类型表达——any 本就是所有类型的联合。于是校验放行任何值、 生成 any、审计仍看得见理由,三件事都不必新造机制。理由同样必填。

func Array

func Array(name string, shape any) *B

Array 数组,**元素类型由切片给出**:

field.Array("hosts", []string{})   // 标量元素
field.Array("blocks", []Block{})   // 结构元素

一个参数同时覆盖两种情况:标量落 ItemType,结构落 Fields。

func ArrayOf

func ArrayOf(name string, variants ...any) *B

ArrayOf 声明「数组,且元素是联合类型」:[]OneOf<A, B, …>。

多模态消息的 parts 就是这个形状——一条消息里逐段可能是文本、也可能是图片。 没有它就只能退化成单一元素类型(丢掉其余形状)或 Opaque(正是要避免的)。

契约上不加新字段:type=array + oneOf 即「**元素**是联合」, 与 OneOf 的 type=json + oneOf(**字段本身**是联合)区分开。

func Bool

func Bool(name string) *B

func Bools

func Bools(name string) *B

func Enum

func Enum(name string, opts ...contract.Option) *B

Enum 枚举;候选值作必填参数——空枚举没有意义。

func File

func File(name string) *B

func Files

func Files(name string) *B

Files 文件列表(array<file>——文件列表的唯一表达,web docs/type-system.md §12)。

func Int

func Int(name string) *B

Int 整数。**契约类型仍是 number**——线协议没有 int,平台也不认; 靠 GoType 带一个「其实是整数」的生成提示,让 Go/Python 侧生成 int 而不是 float64。 只在插件侧区分:为它改线协议不值当,而实现里每个数字字段都 float64(...) 转一道太难看。

func Ints

func Ints(name string) *B

Ints 整数数组。

func Json

func Json(name string, shape any) *B

Json 对象,**结构由 Go 类型给出**:

field.Json("os", OSInfo{})

结构定义只有一处——类型改了契约自动跟着,不会出现「声明与实际不同步」。 确实没有结构可言时用 Object(是对象、键不定)或 Any(连类别都不定)。

func Number

func Number(name string) *B

func Numbers

func Numbers(name string) *B

func Object

func Object(name, reason string) *B

Object 声明「是一个对象,但键不由本插件决定」——如上游原样透传的元数据。

与 Json 的区别是结构从哪来:Json 的结构由 Go 类型给出,Object 压根没有可给的结构。 与 Any 的区别见 Any。

**理由必填**。拦住随手使用的不是名字而是这个参数:想省事也得先写清楚为什么省不掉。 这类字段(Object 与 Any)在契约里统称不透明字段,审计会逐一列出。

func OneOf

func OneOf(name string, variants ...any) *B

OneOf 声明「这个字段接受多种可能」。**标量类型与 Go 类型都能传,自动分流**:

field.OneOf("chat_id", contract.TNumber, contract.TString)   // 标量联合:值是数字或字符串
field.OneOf("doc", DocObject{}, BlocksArray{})     // 结构联合:形状不同,各有字段
field.OneOf("x", contract.TString, DocObject{})         // 混用也行

为什么声明层只有一个概念、契约层却是两个字段(Types / OneOf): 前端对二者的**渲染方式不同**——标量联合是一个输入框接受多种类型,结构联合是分段 选择器先选形状再渲染该分支的字段。契约里分开存,UI 不必靠"分支有没有 fields"去猜; 而作者不该为这个区别分心,所以声明层合并。

结构分支用**真实类型**:类型改名/删除立刻编译失败,不必等生成期。

func Secret

func Secret(name string) *B

Secret 密文字段(**凭证专用**):表单打码、平台加密存储。

与 String 的分别不在 Go 类型(都是 string),而在平台怎么对待它—— 所以必须是独立的构造函数,不能靠调用方记得加一个可选链式调用。

func Select

func Select(name string, options ...string) *B

Select 下拉选择(**凭证专用**):候选值作必填参数。

类型名是 "select" 而不是 Enum 的 "enum"——凭证表单认的是前者。 两个名字确实别扭,但改任何一边都要动存量契约,而这里只需要选对。

func String

func String(name string) *B

func Strings

func Strings(name string) *B

常见标量数组的快捷方式。

func Text

func Text(name string) *B

func (*B) Default

func (b *B) Default(v any) *B

Default 默认值;有默认值即视为可选(调用方不传也能跑)。

func (*B) Desc

func (b *B) Desc(s string) *B

func (*B) Field

func (b *B) Field() contract.Field

Field 交出构造好的契约字段(实现 contract.FieldSpec)。

func (*B) Label

func (b *B) Label(s string) *B

func (*B) Opaque

func (b *B) Opaque(reason string) *B

Opaque 显式承认「这里没有可声明的结构」,并说明为什么。

与 field.Object/Any 的区别只是**位置**:那两个是构造时就知道没结构; 这个用于构造函数已经定了形状(如 Array)、但元素结构确实说不出来的情况—— 数组操作的 output 就是:元素形状随上游数组而定,运行期才知道。 理由必填:不写理由的无结构字段会被 sokel-gen 的审计追着报,那是故意的。

func (*B) Optional

func (b *B) Optional() *B

func (*B) Required

func (b *B) Required() *B

func (*B) Types

func (b *B) Types(ts ...contract.ParamType) *B

Types 顶层联合(number|string 这类标量联合,不是结构联合——那是 OneOf)。

Jump to

Keyboard shortcuts

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