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

runtimeclient

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: 27 Imported by: 0

Documentation

Overview

Package runtimeclient 是 OpenVaala 协议的 Go 客户端:保持一条到 Runtime Server 的 WebSocket 连接, 断线后退避重连,并为打开的对话补齐断线期间的内容。

Index

Constants

This section is empty.

Variables

View Source
var ErrClientStopped = errors.New("runtime client has stopped")

ErrClientStopped 表示 Client.Run 已返回,不再处理调用。

View Source
var ErrConnectionLost = errors.New("connection to runtime server lost")

ErrConnectionLost 表示请求发出后连接断开,服务端是否执行未知。

View Source
var ErrInitializeRejected = errors.New("runtime server rejected the protocol version; run openvaala serve stop and retry")

ErrInitializeRejected 表示服务端拒绝 initialize;Client.Run 返回此错误,不再重连。 错误文本提示用户停止旧 serve 后重试。

View Source
var ErrUnauthorized = errors.New("runtime server rejected the token")

ErrUnauthorized 表示服务端拒绝了 token;Client.Run 遇到它时返回,不再重连。

Functions

func RedactURL

func RedactURL(rawURL string) string

RedactURL 返回隐去认证信息(用户信息、?token= 等查询参数)后的地址。

Types

type Client

type Client interface {
	// Run 连接并保持连接直到 ctx 结束;返回前关闭 Events。只能调用一次。
	// 认证失败(ErrUnauthorized)与 initialize 被拒绝时返回错误,不再重连;其他断线按退避重连。
	Run(ctx context.Context) error
	// Events 是按发生顺序交付的事件;调用方需持续读取到关闭。
	Events() <-chan ClientEvent
	// Reconnect 跳过普通断线的退避等待;正在连接或已经连接时不额外拨号。
	Reconnect(ctx context.Context) (err error)
	// SubscribeRunningConversations 启用全局运行集合订阅及断线恢复;初始集合和错误经 Events 交付,重复调用合并。
	SubscribeRunningConversations(ctx context.Context) (err error)
	// GetRPCFrames 返回有界调试记录的独立副本,并允许下一次日志变化通知。
	GetRPCFrames(ctx context.Context) (frames []RPCFrame, err error)
	// ClearRPCFrames 清空记录和拥塞丢帧计数,保留暂停状态和递增序号。
	ClearRPCFrames(ctx context.Context) (err error)
	// SetRPCLogPaused 暂停或恢复采集;不停止业务连接和事件。
	SetRPCLogPaused(ctx context.Context, paused bool) (err error)

	// CreateConversation 新建对话;Model 为零值时使用 Agent 的默认模型。
	CreateConversation(ctx context.Context, request *CreateConversationRequest) (defs.Conversation, error)
	// ListModels 返回模型目录(不含连接参数)与 agentName 的默认模型;agentName 为空时不返回默认模型。
	ListModels(ctx context.Context, agentName string) (runtime.ModelList, error)
	// GetSkills 返回已有对话或草稿 Agent 的 Skill 补全目录;草稿按请求的 Executor 设置查。
	GetSkills(ctx context.Context, request *GetSkillsRequest) ([]skill.SkillInfo, error)
	// GetHooks 调 hook/list,返回 serve 当前配置的全部 hook,按配置顺序;没有 hook 时返回空。
	GetHooks(ctx context.Context) ([]*hook.HookInfo, error)
	// ResolveWorkspaceDirectory 调 executor/resolveDirectory,在 Executor 所在的机器上把用户写的目录解析成绝对路径并确认它是目录。
	ResolveWorkspaceDirectory(ctx context.Context, request *ResolveWorkspaceDirectoryRequest) (string, error)
	// GetWorkspaceDirectories 调 executor/listDirectories,返回解析后的目录及其普通直接子目录。
	GetWorkspaceDirectories(ctx context.Context, request *GetWorkspaceDirectoriesRequest) (directories *conversation.WorkspaceDirectories, err error)
	// ListAgents 调 agent/list,返回配置里的全部 Agent 名、说明和默认模型,按配置顺序。
	ListAgents(ctx context.Context) ([]runtime.AgentInfo, error)
	// ListExecutors 调 executor/list,返回全部 Executor 和它们的默认根目录。
	ListExecutors(ctx context.Context) ([]conversation.ExecutorDetails, error)
	// ListMCPServers 调 mcpServer/list,返回已打开的对话里各 Executor 上的 MCP 连接情况,读取不等待连接;
	// 没有连接时返回空;对话在 serve 里没打开时返回错误。
	ListMCPServers(ctx context.Context, conversationID defs.ConversationID) ([]conversation.MCPServerInfo, error)
	// SetClientMCPServers 调 conversation/setClientMCPServers,换掉本连接为已打开的对话登记的全部客户端 MCP server;serverIDs 为空表示全部移除。
	// server 在本机运行,serve 登记后经本连接请本机连接它们:Client 为每条转发流发出 ClientMCPConnectRequested、ClientMCPMessageReceived
	// 与 ClientMCPDisconnectRequested,调用方用 SendClientMCPMessage、SendClientMCPClosed 回复。登记只属于当前这条连接:
	// 连接断开后 serve 移除它,重连后需要重新登记。对话在 serve 里没打开时返回错误。
	SetClientMCPServers(ctx context.Context, conversationID defs.ConversationID, serverIDs []string) error
	// SendClientMCPMessage 发出 clientMCP/message 通知,把本机 MCP server 在 streamID 这条流上发来的一条完整 JSON-RPC 消息交给 serve;
	// 写出后返回,不等待 serve 处理。当前没有已连接的连接时立即返回 ErrConnectionLost,不等重连:转发流属于发出它的那条连接,
	// 连接断开后 serve 已结束它,重连后的新连接不认识旧的 streamID。
	// ctx 在写出过程中取消会关闭整条连接,所有转发流和请求随之中断重连;调用方应传会话级 ctx。
	SendClientMCPMessage(ctx context.Context, streamID string, message json.RawMessage) error
	// SendClientMCPClosed 发出 clientMCP/closed 通知,告知 serve streamID 这条流已结束:连不上本机 MCP server 或它退出了;
	// err 是失败原因,nil 表示正常结束。送达规则与 ctx 的要求同 SendClientMCPMessage。
	SendClientMCPClosed(ctx context.Context, streamID string, err error) error
	// OpenTerminal 调 terminal/open,在 Executor 上为本连接新开一个终端并返回它的 ID、实际 Executor 和起始目录。
	// 输出和结束分别经 Events 交付 TerminalOutput 与 TerminalExited;终端只属于当前这条连接,连接断开后 serve 结束它,重连后需要重新打开。
	// virtual Executor 不支持终端,返回错误。
	OpenTerminal(ctx context.Context, request *TerminalOpenRequest) (result *runtimeprotocol.TerminalOpenResult, err error)
	// CloseTerminal 调 terminal/close,结束终端进程;终端已经结束时成功。结束后 Events 交付 TerminalExited。
	CloseTerminal(ctx context.Context, terminalID string) (err error)
	// WriteTerminal 发出 terminal/input 通知,把键盘或粘贴的字节原样写进终端;写出后返回,不等待 serve 处理。
	// 当前没有已连接的连接时立即返回 ErrConnectionLost,不等重连。
	WriteTerminal(terminalID string, data []byte) (err error)
	// ResizeTerminal 发出 terminal/resize 通知,修改终端的行列数;送达规则同 WriteTerminal。
	ResizeTerminal(terminalID string, rows, cols uint16) (err error)
	// ListProviders 调 provider/list,返回 serve 配置里的全部 Provider(带 API key 原文)和模型配置的默认模型:models.default_model,
	// 没写时是排序后的第一个模型,没有模型时是零值;defaults 是同次加载的模型默认配置。Agent 自己写了 model 时,它新建对话用的不是这个默认模型。
	ListProviders(ctx context.Context) (providers []defs.ProviderConfig, defaultModel defs.ModelRef, defaults defs.ModelDefaults, err error)
	// SetProvider 调 provider/set,写入整份 Provider 并让 serve 重新加载配置;defaultModel 不是零值时同一次写入还把默认模型改成它。
	// 返回 Runtime 替换目录的结果,加载失败时 serve 的文件和 Runtime 都不变,错误是加载错误原文。
	SetProvider(ctx context.Context, provider defs.ProviderConfig, defaultModel defs.ModelRef) (runtime.SetDefinitionsResult, error)
	// DeleteProvider 调 provider/delete,删除 Provider 并让 serve 重新加载配置;返回值同 SetProvider。
	DeleteProvider(ctx context.Context, providerID string) (runtime.SetDefinitionsResult, error)
	// SetDefaultModel 调 config/setDefaultModel,改 serve 配置里的默认模型并重新加载配置;返回值同 SetProvider。
	SetDefaultModel(ctx context.Context, ref defs.ModelRef) (runtime.SetDefinitionsResult, error)
	// ReloadConfig 调 config/reload,让 serve 不改文件、重新加载整份配置;返回值同 SetProvider。
	ReloadConfig(ctx context.Context) (runtime.SetDefinitionsResult, error)
	// ListCatalogProviders 调 catalog/providers/list,返回模型目录里可选的模型服务;目录拿不到时返回错误。
	ListCatalogProviders(ctx context.Context) ([]defs.CatalogProvider, error)
	// ListCatalogModels 调 catalog/models/list,返回模型目录里一个服务的全部模型,key 是写进配置文件的模型 id。
	ListCatalogModels(ctx context.Context, catalogProviderID string) (map[string]*defs.ProviderModelConfig, error)
	// FetchProviderModels 调 provider/fetchModels,让 serve 从 Provider 的上游 /models 拉模型并补字段;上游请求失败时返回错误。
	FetchProviderModels(ctx context.Context, provider defs.ProviderConfig) (map[string]*defs.ProviderModelConfig, error)
	// GetContextUsage 返回对话内一个 Session 已有的上下文占用详情,不调用模型。
	GetContextUsage(ctx context.Context, conversationID defs.ConversationID, sessionID defs.SessionID) (runtime.SessionContextUsage, error)
	// GetSessionDetails 返回对话内一个 Session 的静态配置:所选模型与摘要模型、Executor、skills、工具名。
	GetSessionDetails(ctx context.Context, conversationID defs.ConversationID, sessionID defs.SessionID) (conversation.SessionDetails, error)
	// SetSessionModel 保存 Session 所选的模型与推理强度,从下一个 Turn 开始生效,返回保存后的记录;成功后服务端推送 session/statusUpdated。
	SetSessionModel(ctx context.Context, request *SetSessionModelRequest) (defs.Session, error)
	// ListConversations 返回一页对话记录:Archived 为 true 时只列归档的,否则只列没归档的;NextCursor 非零时可作为下一页的 Cursor。
	ListConversations(ctx context.Context, request *ListConversationsRequest) (ListConversationsResult, error)
	// ForkConversation 调 conversation/fork,把对话复制到截取点为止并在服务端打开新对话,返回新对话的记录;原对话不变。
	// 截取点之前一轮都没有时服务端新建一个空对话。两个截取点都给、轮次不在根 Session 里、LastTurnID 还没结束时,分别返回可用
	// errors.Is 识别的 conversation.ErrForkBoundaryConflict、ErrForkTurnNotFound、ErrForkTurnRunning。
	ForkConversation(ctx context.Context, request *ForkConversationRequest) (defs.Conversation, error)
	// SetConversationArchived 调 conversation/setArchived,归档或取消归档,返回保存后的记录;不打开也不停止对话,
	// 已经是这个状态时什么都不改。
	SetConversationArchived(ctx context.Context, request *SetConversationArchivedRequest) (defs.Conversation, error)
	// DeleteConversation 调 conversation/delete,删除对话、全部 Session 和历史;有 Session 在执行 Turn 时返回可用 errors.Is 识别的
	// session.ErrSessionBusy,什么都不删。打开着这个对话的 Client 随后重新同步失败,交付 ConversationSyncFailed。
	DeleteConversation(ctx context.Context, request *DeleteConversationRequest) error
	// GetConversation 调 conversation/read,读对话记录,不打开对话。
	GetConversation(ctx context.Context, conversationID defs.ConversationID) (defs.Conversation, error)
	// GetSessionByID 调 session/get,只凭 SessionID 读 Session 记录(含所属对话),不打开对话;找不到时返回可用 errors.Is 识别的
	// runtime.ErrSessionNotFound。
	GetSessionByID(ctx context.Context, sessionID defs.SessionID) (defs.Session, error)
	// ListSessions 调 session/list,分页列出对话内的 Session 记录。
	ListSessions(ctx context.Context, request *ListSessionsRequest) (ListSessionsResult, error)
	// ListItems 调 session/items/list,分页读取一个 Session 的日志。
	ListItems(ctx context.Context, request *ListItemsRequest) (ListItemsResult, error)
	// ListTurns 调 session/turns/list,按 TurnID 分页列出一个 Session 的 Turn。
	ListTurns(ctx context.Context, request *ListTurnsRequest) (ListTurnsResult, error)
	// GetTurns 调 session/turns/get,按 TurnIDs 的顺序返回一个 Session 里找到的 Turn 记录,跳过不存在的。
	GetTurns(ctx context.Context, request *GetTurnsRequest) ([]defs.Turn, error)
	// SetConversationTitle 保存对话标题,空串表示清空。
	SetConversationTitle(ctx context.Context, conversationID defs.ConversationID, title string) error
	// SetConversationExecutorSettings 调 conversation/setExecutorSettings,让对话换上完整的新设置,返回保存后的记录;
	// 有 Session 在执行 Turn 时返回可用 errors.Is 识别的 session.ErrSessionBusy。打开着这个对话的 Client 随后自动重新同步,
	// ConversationSynced 带上新记录。
	SetConversationExecutorSettings(ctx context.Context, conversationID defs.ConversationID, settings defs.ExecutorSettings) (defs.Conversation, error)
	// SubmitInput 以用户身份向对话根 Session 提交内容:为本次提交生成 InputID,请求发出后断线时在重连后用同一 InputID 重发,
	// 直到得到结果或 ctx 结束;服务端按 InputID 判重。DisableSubmitInputRetry 为 true 时直接返回断线错误。
	SubmitInput(ctx context.Context, request *SubmitInputRequest) (defs.ItemID, error)
	// InterruptTurn 中断根 Session 的 Turn,返回 Turn ID。
	InterruptTurn(ctx context.Context, conversationID defs.ConversationID) (defs.TurnID, error)
	// SteerInput 将已排队用户输入移入指定轮,断线不重发。
	SteerInput(ctx context.Context, conversationID defs.ConversationID, itemID defs.ItemID, turnID defs.TurnID) error
	// InterruptTurnWithInput 置顶已排队用户输入并取消指定轮,断线不重发。
	InterruptTurnWithInput(ctx context.Context, conversationID defs.ConversationID, turnID defs.TurnID, itemID defs.ItemID) error
	// WithdrawInput 原子取走用户输入;returnContent 为 true 时返回完整用户消息内容,断线不重发。
	WithdrawInput(ctx context.Context, conversationID defs.ConversationID, itemID defs.ItemID, returnContent bool) ([]*defs.Content, error)
	// CompactContext 调 conversation/compact,让根 Session 开一个只压缩的 Turn,返回它的 TurnID;
	// 根 Session 忙时返回可用 errors.Is 识别的 session.ErrSessionBusy。
	CompactContext(ctx context.Context, conversationID defs.ConversationID) (defs.TurnID, error)
	// OpenConversation 打开一个对话,首次同步完成后返回:之前交付 ConversationSynced 与 SessionSynced(跟随的 Session 的全部历史与
	// 生成中 Item 列表;SkipHistory 时不含历史),之后交付它的实时事件,重连后自动补齐,每次同步都带上请求的环境变量
	// (服务端重启后按记录里的 Executor 设置冷打开)。跟随的 Session 由请求的 SessionID 指定,为空时是根 Session,
	// 对话换配置后的重新同步仍跟随同一个 Session。
	// 重新同步时服务端拒绝打开对话,交付 ConversationSyncFailed 并放弃这个对话。
	// 同一时刻只打开一个对话,打开新对话后旧对话的事件不再交付。
	OpenConversation(ctx context.Context, request *OpenConversationRequest) (defs.Conversation, error)
}

Client 是 OpenVaala 协议的客户端:保持一条 WebSocket 连接,断线后退避重连,并恢复已打开对话的订阅与续传。

func NewClient

func NewClient(opt *ClientOpt) (Client, error)

NewClient 校验连接地址并创建客户端。

type ClientEvent

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

ClientEvent 是 Client 按发生顺序交付给调用方的事件。

type ClientMCPConnectRequested

type ClientMCPConnectRequested struct {
	StreamID string
	ServerID string
}

ClientMCPConnectRequested 由 Client 在收到 serve 的 clientMCP/connect 通知时立即发出(不经同步暂存,也与打开的对话无关): serve 请客户端按 ServerID 的配置连上本机的 MCP server,这条转发流此后用 StreamID 标识;连不上时调用方用 SendClientMCPClosed 告知 serve。

type ClientMCPDisconnectRequested

type ClientMCPDisconnectRequested struct {
	StreamID string
}

ClientMCPDisconnectRequested 由 Client 在收到 serve 的 clientMCP/disconnect 通知时立即发出(不经同步暂存): serve 一侧已结束 StreamID 这条流,调用方应关闭与本机 MCP server 的连接。

type ClientMCPMessageReceived

type ClientMCPMessageReceived struct {
	StreamID string
	Message  json.RawMessage
}

ClientMCPMessageReceived 由 Client 在收到 serve 的 clientMCP/message 通知时立即发出(不经同步暂存): Message 是 StreamID 这条流上 serve 写给本机 MCP server 的一条完整 JSON-RPC 消息原文。

type ClientOpt

type ClientOpt struct {
	// URL 是 OpenVaala 协议的 WebSocket 地址,例如 ws://127.0.0.1:8790/api/v1/openvaala。
	URL string
	// Token 非空时以 Authorization: Bearer 携带;URL 自带 ?token= 时可为空。
	Token string
	// Telemetry 是遥测管道,用于重连与通知丢弃的日志;nil 时使用全局兜底。
	Telemetry *telemetry.Telemetry
	// FailRequestsWhenDisconnected 为 true 时业务请求不等待连接;零值沿用等待重连。
	FailRequestsWhenDisconnected bool
	// DisableSubmitInputRetry 为 true 时提交后断线直接返回,不重发同一 InputID。
	DisableSubmitInputRetry bool
	// RPCFrameCapacity 是调试记录的帧数上限;0 关闭采集。
	RPCFrameCapacity int
}

ClientOpt 保存连接地址与 token,构造后只读。

func NewClientOpt

func NewClientOpt(url, token string) *ClientOpt

NewClientOpt 设置服务端地址和 token。

type ConnectionChanged

type ConnectionChanged struct {
	State ConnectionState
	// Err 是导致重连的原因,手动重连或其他阶段为空。
	Err error
	// Attempt 是连续失败后的第几次重连,从 1 开始。
	Attempt int
	// RetryIn 是距离这次重连的等待时长。
	RetryIn time.Duration
	// ServerID 在 State 为 connected 时是 initialize 返回的 server_id,其他状态为空。
	ServerID string
}

ConnectionChanged 由 Client 在首次连接、连接成功,以及连接失败或断开后开始重连时发出。

type ConnectionState

type ConnectionState string

ConnectionState 是 Client 与服务端连接的阶段。

const (
	// ConnectionConnecting 是 Run 开始后第一次连接中。
	ConnectionConnecting ConnectionState = "connecting"
	// ConnectionConnected 是已经连上并完成 initialize。
	ConnectionConnected ConnectionState = "connected"
	// ConnectionReconnecting 是连接失败或断开后等着重连。
	ConnectionReconnecting ConnectionState = "reconnecting"
)

type ConversationSyncFailed

type ConversationSyncFailed struct {
	ConversationID defs.ConversationID
	// Err 是 serve 返回的错误。
	Err error
}

ConversationSyncFailed 由 Client 在重新同步时 serve 拒绝打开对话后发出(例如对话已停止,冷打开时默认 Executor 不可用)。 Client 放弃这个对话,不再交付它的事件,连接保持;调用方改好设置后可以重新打开。

type ConversationSynced

type ConversationSynced struct {
	ConversationID defs.ConversationID
	// Conversation 是 conversation/open 返回的对话记录,带当前的 Executor 设置;标题取对话订阅登记时的值。
	Conversation defs.Conversation
	// SessionInfos 是对话内全部 Session 的运行信息(订阅响应)。
	SessionInfos []runtime.SessionRuntimeInfo
}

ConversationSynced 由 Client 在打开对话或重新同步后发出,紧跟着发 SessionSynced。

type ConversationTitleChanged

type ConversationTitleChanged struct {
	ConversationID defs.ConversationID
	// Title 为空表示清空标题。
	Title string
}

ConversationTitleChanged 由 Client 在已打开对话的标题保存成功并变化后发出。

type CreateConversationRequest

type CreateConversationRequest struct {
	AgentName string
	// Model 为零值时使用 Agent 的默认模型。
	Model defs.ModelSelection
	// ExecutorSettings 里没有 local 目录时由服务端使用默认目录(配了 server.workspace_directory 时是它,否则是 serve 的启动目录)。
	ExecutorSettings defs.ExecutorSettings
	// Environment 为 nil 时本机命令继承 serve 进程的环境。
	Environment []string
	// Ephemeral 是否建临时对话?临时对话不存盘、不进对话列表,没有 Executor 和 Skill,ExecutorSettings 原样存进记录、不装配,
	// Environment 不使用;没有订阅者、也没有在跑的 Turn 一段时间后由服务端丢弃。
	Ephemeral bool
}

CreateConversationRequest 以 AgentName 对应的 Agent 新建对话。

type DeleteConversationRequest

type DeleteConversationRequest struct {
	ConversationID defs.ConversationID
}

DeleteConversationRequest 删除一个已保存的对话。

type ForkConversationRequest

type ForkConversationRequest struct {
	ConversationID defs.ConversationID
	// BeforeTurnID 复制到这一轮之前(不含),回退重来用。
	BeforeTurnID defs.TurnID
	// LastTurnID 复制到这一轮(含)。
	LastTurnID defs.TurnID
	// Model 为零值时照抄来源根 Session 的模型。
	Model defs.ModelSelection
	// ExecutorSettings 是新对话的完整设置,一般传来源对话的;含义同 CreateConversationRequest。
	ExecutorSettings defs.ExecutorSettings
	// Environment 的含义同 CreateConversationRequest。
	Environment []string
}

ForkConversationRequest 把对话复制到截取点为止;BeforeTurnID 和 LastTurnID 最多填一个,都不填时复制全部已结束的轮次。

type GetSkillsRequest

type GetSkillsRequest struct {
	ConversationID   defs.ConversationID
	AgentName        string
	ExecutorSettings defs.ExecutorSettings
}

GetSkillsRequest 选择已有对话的 Skills;尚未建立对话时用 AgentName 和 ExecutorSettings 查草稿 Skills。

type GetTurnsRequest

type GetTurnsRequest struct {
	ConversationID defs.ConversationID
	SessionID      defs.SessionID
	TurnIDs        []defs.TurnID
}

GetTurnsRequest 是按 ID 取一个 Session 的多条 Turn 记录的参数。

type GetWorkspaceDirectoriesRequest

type GetWorkspaceDirectoriesRequest struct {
	ExecutorID    string
	Directory     string
	BaseDirectory string
}

GetWorkspaceDirectoriesRequest 指定 Executor、待列出的目录和相对路径基准。

type HookRunChanged

type HookRunChanged struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	// TurnID 是触发这次运行的 Turn。
	TurnID defs.TurnID
	// Run 是这次运行当时的完整记录:同一次运行(相同的 ID)开始时状态为 running,结束时为最终状态。
	Run *defs.HookRun
}

HookRunChanged 由 Client 在跟随的 Session 里一次 hook 运行开始或结束时发出(来自 hook/started 与 hook/completed)。

type ItemChanged

type ItemChanged struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	// Type 区分开始、增量、完成和中断四种情况。
	Type      agent.AgentEventType
	TurnID    defs.TurnID
	ItemIndex int
	// Item 是开始、完成和中断时的完整 Item;中断且不用保存时为 nil,增量时为 nil。
	Item *defs.Item
	// Delta 只在增量时有值。
	Delta *agent.AgentItemDelta
}

ItemChanged 由 Client 在跟随的 Session 的 Item 开始、产生增量、完成或中断时发出。

type ItemsSaved

type ItemsSaved struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	TurnID         defs.TurnID
	Items          []runtimeprotocol.LoggedItem
}

ItemsSaved 由 Client 在跟随的 Session 写入一批 Item 后发出,流水号与之前交付的连续。

type ListConversationsRequest

type ListConversationsRequest struct {
	// Directories 按 local 目录筛选,为空时不限。
	Directories []string
	// SearchTerm 按区分大小写的标题子串筛选,为空时不限。
	SearchTerm string
	// Order 为零值时按 key(即创建顺序)升序。
	Order storage.Order
	// Cursor 为零值时从起点开始。
	Cursor dao.RecordCursor[defs.ConversationID]
	Limit  int
	// Archived 是否只列归档的对话?为 false 时只列没归档的。
	Archived bool
}

ListConversationsRequest 是列出对话的参数。

type ListConversationsResult

type ListConversationsResult struct {
	Conversations []dao.ConversationListEntry
	// NextCursor 为零值表示没有下一页。
	NextCursor dao.RecordCursor[defs.ConversationID]
}

ListConversationsResult 是筛选后的一页对话及各自的根 Session。

type ListItemsRequest

type ListItemsRequest struct {
	ConversationID defs.ConversationID
	SessionID      defs.SessionID
	// Order 为零值时按流水号升序。
	Order storage.Direction
	// Cursor 为零值时从起点开始,翻页时取上一页的 NextCursor。
	Cursor storage.Ordinal
	// Limit 为零时由服务端决定每页条数。
	Limit int
}

ListItemsRequest 是分页读取一个 Session 日志的参数。

type ListItemsResult

type ListItemsResult struct {
	Items []runtimeprotocol.LoggedItem
	// NextCursor 为零表示没有下一页。
	NextCursor storage.Ordinal
}

ListItemsResult 是一页日志 Item;服务端可能因页内容过大而少于 Limit 条。

type ListSessionsRequest

type ListSessionsRequest struct {
	ConversationID defs.ConversationID
	Order          storage.Order
	Cursor         dao.RecordCursor[defs.SessionID]
	Limit          int
}

ListSessionsRequest 是分页列出对话内 Session 记录的参数;Order 与 Cursor 的零值含义同 ListConversationsRequest。

type ListSessionsResult

type ListSessionsResult struct {
	Sessions   []defs.Session
	NextCursor dao.RecordCursor[defs.SessionID]
}

ListSessionsResult 是一页 Session 记录;NextCursor 为零值表示没有下一页。

type ListTurnsRequest

type ListTurnsRequest struct {
	ConversationID defs.ConversationID
	SessionID      defs.SessionID
	Order          storage.Order
	Cursor         dao.RecordCursor[defs.TurnID]
	Limit          int
}

ListTurnsRequest 是按 TurnID 分页列出一个 Session 的 Turn 的参数;Order 与 Cursor 的零值含义同 ListConversationsRequest。

type ListTurnsResult

type ListTurnsResult struct {
	Turns      []defs.Turn
	NextCursor dao.RecordCursor[defs.TurnID]
}

ListTurnsResult 是一页 Turn 记录;NextCursor 为零值表示没有下一页。

type OpenConversationRequest

type OpenConversationRequest struct {
	ConversationID defs.ConversationID
	// SessionID 是要跟随的 Session;为空时跟随根 Session。内容事件、补齐和 SessionSynced 都只针对它。
	SessionID defs.SessionID
	// Environment 为 nil 时本机命令继承 serve 进程的环境;对话已在服务端运行时沿用它第一次打开时的。
	Environment []string
	// SkipHistory 首次同步是否跳过已保存的历史?跳过时 SessionSynced.Items 为空,只交付订阅位置之后的内容;
	// 之后的重新同步照常从上次交付的位置补齐。
	SkipHistory bool
}

OpenConversationRequest 打开一个已有对话,服务端按对话记录里的 Executor 设置打开。

type RPCDirection

type RPCDirection string

RPCDirection 是调试帧的收发方向。

const (
	RPCSent     RPCDirection = "sent"
	RPCReceived RPCDirection = "received"
)

type RPCFrame

type RPCFrame struct {
	ConnectionID uint64
	Sequence     uint64
	Time         time.Time
	Direction    RPCDirection
	Payload      json.RawMessage
}

RPCFrame 是一次收帧或写出尝试;Payload 是独立的原始 JSON,不包含握手 URL 和认证头。 写出尝试在调用 socket.Write 前记录,写出失败时不代表服务端已接收。

type RPCLogChanged

type RPCLogChanged struct {
	DroppedFrames uint64
	Paused        bool
}

RPCLogChanged 由 Client 在调试记录或暂停状态变化时合并交付;调用 GetRPCFrames 后可再次收到通知。 DroppedFrames 是上次清空后因采样队列拥塞丢弃的帧数,不包含容量淘汰和主动暂停。

type ResolveWorkspaceDirectoryRequest

type ResolveWorkspaceDirectoryRequest struct {
	// ExecutorID 是在哪个 Executor 上解析。
	ExecutorID string
	// Directory 是用户写的目录:~、相对或绝对路径。
	Directory string
	// BaseDirectory 是当前目录;为空时相对路径拼在这个 Executor 的默认根目录后面。
	BaseDirectory string
}

ResolveWorkspaceDirectoryRequest 是 /cd 的输入。

type ResponseError

type ResponseError struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

ResponseError 是服务端以 JSON-RPC 错误拒绝请求时的错误码与原文;Session 忙、对话不存在、找不到 Session 与分叉截取点不合法 另外还原为哨兵错误,不是 ResponseError。 调用方用 errors.As 取出,按错误码转换成自己协议的错误。

func (*ResponseError) Error

func (e *ResponseError) Error() string

Error 返回带错误码的服务端错误文本。

type RunningConversationsChanged

type RunningConversationsChanged struct {
	ConversationIDs []defs.ConversationID
	IsKnown         bool
	Err             error
}

RunningConversationsChanged 由 Client 在订阅完成、集合变化、连接丢失或订阅失败时交付;未知时不把空切片当成空集合。

type SessionPendingInputsChanged

type SessionPendingInputsChanged struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	PendingInputs  session.SessionPendingInputs
}

SessionPendingInputsChanged 由 Client 在跟随 Session 的待处理列表变化时发出。

type SessionStatusChanged

type SessionStatusChanged struct {
	ConversationID defs.ConversationID
	// Info 是完整的运行信息。
	Info runtime.SessionRuntimeInfo
}

SessionStatusChanged 由 Client 在任一 Session 的运行信息变化时发出(来自对话订阅的 session/statusUpdated)。

type SessionSynced

type SessionSynced struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	// Items 是上次交付位置之后补齐的已保存 Item;打开对话时为全部历史,SkipHistory 时为空。
	Items []runtimeprotocol.LoggedItem
	// StreamingItems 是跟随的 Session 正在生成的 Item 列表。
	StreamingItems []runtimeprotocol.StreamingItem
	// PendingInputs 是本次订阅读到的完整待处理用户列表。
	PendingInputs session.SessionPendingInputs
	// LastSavedOrdinal 是本次同步交付到的位置。
	LastSavedOrdinal storage.Ordinal
}

SessionSynced 由 Client 在打开对话或重连后完成同步时发出,紧跟在 ConversationSynced 之后;之后的 ItemsSaved 紧接 Items。

type SetConversationArchivedRequest

type SetConversationArchivedRequest struct {
	ConversationID defs.ConversationID
	Archived       bool
}

SetConversationArchivedRequest 归档(Archived 为 true)或取消归档一个已保存的对话。

type SetSessionModelRequest

type SetSessionModelRequest struct {
	ConversationID defs.ConversationID
	SessionID      defs.SessionID
	Model          defs.ModelSelection
}

SetSessionModelRequest 保存一个 Session 所选的模型与推理强度,从下一个 Turn 开始生效;推理强度为空时由服务端按规则解析。

type SubmitInputRequest

type SubmitInputRequest struct {
	ConversationID defs.ConversationID
	// Mode 省略时为 normal。
	Mode session.SessionInputMode
	// Content 原样交给服务端。
	Content []*defs.Content
}

SubmitInputRequest 以用户身份向对话根 Session 提交内容。

type TerminalExited

type TerminalExited struct {
	TerminalID string
	ExitCode   int
	Error      string
}

TerminalExited 由 Client 在收到 serve 的 terminal/exited 通知时立即发出(不经同步暂存):TerminalID 这个终端的进程已结束,此后不再有它的事件。 Error 是没能取得退出码的原因,正常结束或被关闭时为空。

type TerminalOpenRequest

type TerminalOpenRequest struct {
	// ExecutorID 为空时用 local Executor。
	ExecutorID string
	// Directory 为空时用该 Executor 的默认工作目录。
	Directory string
	// Rows、Cols 是初始行列数,为零时按 24×80。
	Rows, Cols uint16
	// Environment 为 nil 时 local Executor 的 shell 继承 serve 进程的环境。
	Environment []string
}

TerminalOpenRequest 指定新终端用哪个 Executor、起始目录和初始尺寸。

type TerminalOutput

type TerminalOutput struct {
	TerminalID string
	Data       []byte
}

TerminalOutput 由 Client 在收到 serve 的 terminal/output 通知时立即发出(不经同步暂存):Data 是 TerminalID 这个终端新产生的一批输出,按产生顺序交付。

type ToolProgress

type ToolProgress struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	TurnID         defs.TurnID
	// ItemIndex 指向本轮输出中的 ToolCall。
	ItemIndex int
	// Progress.CallID 是这个 ToolCall 的 CallID(中途接入时 ToolCall 可能已经保存、不在生成中 Item 列表里,按它找到调用),
	// Progress.Content 是本次输出的 JSON。
	Progress agent.AgentToolProgress
}

ToolProgress 由 Client 在跟随的 Session 的工具执行产生输出时发出。

type TurnFinished

type TurnFinished struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	TurnID         defs.TurnID
	// Status 在终态没有保存时为空。
	Status defs.TurnStatus
	// InputItemIDs 是本轮处理的输入 Item,可与 SubmitInput 返回的 ItemID 对应。
	InputItemIDs []defs.ItemID
	Error        string
}

TurnFinished 由 Client 在跟随的 Session 的 Turn 结束时发出(来自内容订阅)。

type TurnStarted

type TurnStarted struct {
	SessionID      defs.SessionID
	ConversationID defs.ConversationID
	TurnID         defs.TurnID
}

TurnStarted 由 Client 在跟随的 Session 的 Turn 开始时发出(来自内容订阅)。

Jump to

Keyboard shortcuts

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