Help us shape the future of Go! Take the 2026 Go Developer Survey

turn

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Nov 1, 2026 License: MIT Imports: 14 Imported by: 0

Documentation

Overview

Package turn 执行一轮 Agent,并保存输入、输出和本轮状态。

Index

Constants

This section is empty.

Variables

View Source
var ErrTurnUnsettled = errors.New("turn terminal status was not persisted")

ErrTurnUnsettled 由 Turn 在本轮记录或 Item 没能保存时返回,本轮留在 running;Session 收到后停止,按已保存的记录恢复。

Functions

This section is empty.

Types

type Turn

type Turn interface {
	// Run 保存输入、加载历史、执行 Agent 并返回本轮结果;写库不受 ctx 取消影响。
	// 写输入前运行启动和用户输入 hook;输入被拦下或 hook 要求结束时跳过 Agent,记录 completed。
	// 被拦下的输入不保存,但仍计入 InputItemIDs;UserPromptSubmit 只处理用户输入。
	// 调用方持续读取 events 到 Run 返回,nil 表示不订阅;IsCompactOnly 时 input 传 nil。
	Run(ctx context.Context, input []*defs.Item, events chan<- TurnEvent) (TurnResult, error)
}

Turn 保存本轮输入、运行 Agent 并写入输出和结束状态。

func NewTurn

func NewTurn(opt *TurnOpt) (Turn, error)

NewTurn 检查配置并创建本轮 Turn。

type TurnAgentEvent

type TurnAgentEvent struct{ Event *agent.AgentEvent }

TurnAgentEvent 由 Turn 在处理完 Agent 事件后发出;完成和中断 Item 按首次出现顺序保存,前面仍有草稿时暂存。

type TurnEvent

type TurnEvent interface {
	// contains filtered or unexported methods
}

TurnEvent 由 Turn 在运行期间按发生顺序发送,包含 Agent 输出、Item 保存和 hook 运行记录。

type TurnHookRunEvent

type TurnHookRunEvent struct{ Run *defs.HookRun }

TurnHookRunEvent 由 Turn 在 SessionStart、SubagentStart、UserPromptSubmit 开始和结束时各发出一次,同次运行的 ID 不变。 需要保存的记录另外随输入写成 hook_run Item;Agent 触发的 hook 通过 TurnAgentEvent 发送。

type TurnInbox

type TurnInbox interface {
	// TakeSteer 取走挂在 turnID 上的补充输入;finish 为 true 且没取到输入时,停止向这个 Turn 投递。
	TakeSteer(ctx context.Context, turnID defs.TurnID, finish bool) ([][]*defs.Item, error)
}

TurnInbox 由 Session 提供,按 Turn 取出补充输入。

type TurnItemsSaved

type TurnItemsSaved struct{ Items []dao.LoggedItem }

TurnItemsSaved 由 Turn 在一批输入、hook 记录、Agent 输出或中断 Item 写入 Session 日志后发出。 Items 按流水号递增;Agent 输出的保存事件排在对应完成或中断 TurnAgentEvent 之后。

type TurnOpt

type TurnOpt struct {
	TurnID defs.TurnID
	// ConversationID 是所属对话,读写 Item 和保存 Turn 记录时据此定位对话目录。
	ConversationID defs.ConversationID
	SessionID      defs.SessionID
	// Agent 提供名称、说明和系统指令。
	Agent    *agent.AgentDefinition
	Query    dao.Query
	Mutation dao.Mutation
	Client   llmkit.Client
	// ToolExecutor 是本 Session 的工具表,交给 Agent 列出工具和执行调用;nil 表示没有工具。
	ToolExecutor executor.ToolExecutor
	// Environments 是本对话的执行环境,第一个是默认环境;Turn 用它记录本轮 Executor、交给 Agent 读目录规则,并在默认环境运行 hook。
	Environments []executor.ExecutionEnvironment
	// Inbox 提供本轮的补充输入。
	Inbox TurnInbox
	// Model 是本 Turn 使用的模型,指向目录里的只读定义。
	Model *defs.ModelDefinition
	// ReasoningEffort 是已解析的推理强度;模型不支持选择时为空。
	ReasoningEffort string
	// CompactModel 是本 Turn 压缩使用的模型。
	CompactModel *defs.ModelDefinition
	// PreviousModel 是上一个 Turn 使用的模型;零值表示还没有。
	PreviousModel defs.ModelRef
	// PreviousContextUsage 是最近一次完整普通调用的报告;上一轮没有完整普通调用时沿用更早的报告,没有时为 nil。
	PreviousContextUsage *defs.TurnContextUsage
	// PreviousExecutors 是上一个 Turn 开始时的 Executor 列表;为空表示还没有上一轮。
	PreviousExecutors []defs.TurnExecutor
	// IsCompactOnly 这个 Turn 是否只压缩上下文?是的话 Run 的 input 为空,不写输入和模型、Executor 变化 Item,
	// 只让 Agent 把历史压成摘要;Turn 记录照常写 running 和终态。
	IsCompactOnly bool
	// Hooks 在写输入前触发 SessionStart、SubagentStart 和 UserPromptSubmit,也交给 Agent 触发工具与 Stop 事件;
	// nil 或 Environments 为空表示不触发 hook。
	Hooks hook.Hooks
	// Session 是本 Turn 所属 Session 的记录,随 hook 事件交给脚本;ParentSessionID 非空表示子 Session。
	Session defs.Session
	// HookStartSource 只有 Session 启动后的第一个非压缩 Turn 非空:startup 或 resume。
	// 非空时 Turn 在写输入前触发 SessionStart(子 Session 触发 SubagentStart,不带来源);为空则不触发。
	HookStartSource string
}

TurnOpt 指定本轮模型、持久化接口、输入来源、执行环境和 hook。 NewTurnOpt 只填对话、角色、存储和模型客户端,其余字段由 Session 补齐;TurnID、模型和上一轮信息在启动每个 Turn 时填写。

func NewTurnOpt

func NewTurnOpt(
	conversationID defs.ConversationID,
	sessionID defs.SessionID,
	agentDefinition *agent.AgentDefinition,
	query dao.Query,
	mutation dao.Mutation,
	client llmkit.Client,
) *TurnOpt

NewTurnOpt 填写本轮所属对话、角色和执行依赖。

type TurnResult

type TurnResult struct {
	// InputItemIDs 按读入顺序保存首批输入和每组补充输入的首个 Item ID;被 UserPromptSubmit 拦下、没有保存的输入也算。
	InputItemIDs []defs.ItemID
	// Outputs 是 Agent 返回的全部草稿;Agent 没运行时为空。
	Outputs []*defs.Item
	// FinalModelCallID 是最后一次成功的普通模型调用,只在 completed 时填写。
	FinalModelCallID defs.ModelCallID
	// Status 是已保存的终态;终态没保存时为空。
	Status defs.TurnStatus
	// ContextUsage 是最近一次完整普通调用的报告;本轮没有完整普通调用时沿用上一轮的报告,模型切换后为 nil。
	ContextUsage *defs.TurnContextUsage
}

TurnResult 是 Turn 一次 Run 的结果。

Jump to

Keyboard shortcuts

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