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

dao

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

Documentation

Overview

Package dao 按对话、Session、Turn、Item 读写存储,读和写分成 Query、Mutation 两组接口。

Index

Constants

View Source
const ArchivedConversationNamespace = "archived_conversations"

ArchivedConversationNamespace 是已归档对话的索引记录所在的记录分组。

View Source
const ConversationNamespace = "conversations"

ConversationNamespace 是没归档对话的索引记录所在的记录分组;索引记录由 metadata 日志生成。

View Source
const MetadataStreamID storage.StreamID = "metadata"

MetadataStreamID 是每个对话目录里保存 Conversation、Session、Turn 记录的 Stream,文件名为 metadata.jsonl。

View Source
const SessionNamespace = "sessions"

SessionNamespace 是 Session 索引记录所在的记录分组;索引记录由 metadata 日志生成。

Variables

This section is empty.

Functions

func GetLastOrdinal

func GetLastOrdinal(ctx context.Context, query ItemQuery, conversationID defs.ConversationID, sessionID defs.SessionID) (storage.Ordinal, error)

GetLastOrdinal 返回 Session 最新 Item 的对外序号。

func GetSessionUsage

func GetSessionUsage(ctx context.Context, query TurnQuery, sessionID defs.SessionID) (defs.TokenUsage, error)

GetSessionUsage 返回 Session 全部 Turn 的用量合计。

func LoadContextHistory

func LoadContextHistory(
	ctx context.Context,
	items ItemQuery,
	conversationID defs.ConversationID,
	sessionID defs.SessionID,
	excludeTurnID defs.TurnID,
) ([]*defs.Item, error)

LoadContextHistory 倒序读取 Session 日志,返回发给模型的上下文历史:最新摘要和它没覆盖的 Item。

func NewDAO

func NewDAO(opt *DAOOpt) (Query, Mutation, error)

NewDAO 检查存储并创建 DAO,返回同一个实例的 Query 和 Mutation。

func RecordNamespaces

func RecordNamespaces() []storage.RecordNamespace

RecordNamespaces 返回 DAO 使用的记录分组、筛选字段和索引。

Types

type ConversationListEntry

type ConversationListEntry struct {
	Conversation defs.Conversation `json:"conversation"`
	RootSession  defs.Session      `json:"root_session"`
}

ConversationListEntry 是对话列表里的一条:对话记录和它的根 Session。

type ConversationMutation

type ConversationMutation interface {
	// SetConversation 追加对话的 metadata 日志,写入归档状态对应分组的索引,并删掉另一个分组里的旧索引。
	SetConversation(context.Context, defs.Conversation) error
}

ConversationMutation 保存对话记录。

type ConversationQuery

type ConversationQuery interface {
	// GetConversation 读取指定对话,返回记录及是否找到。
	GetConversation(context.Context, defs.ConversationID) (defs.Conversation, bool, error)
	// ListConversations 返回筛选后的一页对话及各自的根 Session;根 Session 记录缺失或损坏时返回错误。
	ListConversations(context.Context, ListConversationsRequest) (storage.Page[ConversationListEntry, RecordCursor[defs.ConversationID]], error)
}

ConversationQuery 读取对话记录。

type DAOOpt

type DAOOpt struct {
	Records storage.RecordStorage
	Logs    storage.LogStorage
}

DAOOpt 是 DAO 用的记录存储和日志存储。

func NewDAOOpt

func NewDAOOpt(records storage.RecordStorage, logs storage.LogStorage) *DAOOpt

NewDAOOpt 保存 DAO 使用的记录和日志存储。

type ItemMutation

type ItemMutation interface {
	// AppendItems 追加一批 Item,返回带对外序号和保存时间的副本;不修改传入的 Item。
	AppendItems(context.Context, defs.ConversationID, defs.SessionID, ...*defs.Item) ([]LoggedItem, error)
}

ItemMutation 追加 Session 的 Item 日志。

type ItemQuery

type ItemQuery interface {
	// ListItems 按对外序号分页读取 Session 日志。对外序号是调用方看到的 Item 序号:用户分叉的根 Session 前面接上
	// 来源对话的历史,序号从来源的第 1 条连续排下来,接续标记本身不返回;来源读不到时那一段当作空。
	ListItems(context.Context, ListItemsRequest) (storage.Page[LoggedItem, storage.Ordinal], error)
	// ScanItems 按方向逐条读取 Session 日志,调用方 break 后不再读后续页。
	ScanItems(context.Context, defs.ConversationID, defs.SessionID, storage.Direction) iter.Seq2[*defs.Item, error]
}

ItemQuery 读取 Session 的 Item 日志。

type ListConversationsRequest

type ListConversationsRequest struct {
	// Directories 精确匹配 local 工作目录;为空时不限目录,多个目录命中任意一个。
	Directories []string
	// SearchTerm 按区分大小写的普通子串匹配标题;为空时不筛选标题。
	SearchTerm string
	Order      storage.Order
	// Cursor 是上一页最后一条的位置;零值从头开始。
	Cursor RecordCursor[defs.ConversationID]
	Limit  int
	// Archived 是否只列归档的对话?false 时只列没归档的。
	Archived bool
}

ListConversationsRequest 是分页列出对话的筛选条件和翻页位置。

type ListItemsRequest

type ListItemsRequest struct {
	ConversationID defs.ConversationID
	SessionID      defs.SessionID
	Order          storage.Direction
	// Cursor 是上一页返回的 Next;0 时从这个方向的起点读。
	Cursor storage.Ordinal
	Limit  int
}

ListItemsRequest 是按对外序号分页读取一个 Session Item 日志的条件。

type ListSessionsRequest

type ListSessionsRequest struct {
	ConversationID defs.ConversationID
	Order          storage.Order
	// Cursor 是上一页最后一条的位置;零值从头开始。
	Cursor RecordCursor[defs.SessionID]
	Limit  int
}

ListSessionsRequest 是分页列出一个对话内 Session 的条件。

type ListTurnsRequest

type ListTurnsRequest struct {
	SessionID defs.SessionID
	Order     storage.Order
	// Cursor 是上一页最后一条的位置;零值从头开始。
	Cursor RecordCursor[defs.TurnID]
	Limit  int
}

ListTurnsRequest 是分页列出一个 Session 内 Turn 的条件。

type LoggedItem

type LoggedItem struct {
	// Ordinal 是对外序号;用户分叉的根 Session 已经接在来源历史的序号之后。
	Ordinal storage.Ordinal
	Item    *defs.Item
}

LoggedItem 是写入或读出的一条 Item 和它的对外序号。

type Mutation

type Mutation interface {
	ConversationMutation
	SessionMutation
	TurnMutation
	ItemMutation
	// DeleteConversation 先在 metadata 日志里记下删除,再删除对话的各级索引和全部日志;对话不存在时直接返回。
	DeleteConversation(ctx context.Context, conversationID defs.ConversationID) error
}

Mutation 保存或删除对话、Session、Turn 和 Item。

type Query

Query 读取对话、Session、Turn 和 Item。

type RebuildMetadataIndexResult

type RebuildMetadataIndexResult struct {
	// RebuiltConversations 是写入索引的对话数。
	RebuiltConversations int
	// SkippedConversations 是因 metadata 不完整或损坏而没有写入索引的对话及原因;没有时为空切片。
	SkippedConversations []SkippedConversation
	// DeletedConversations 是 metadata 日志里记了删除、这次重建顺带删掉目录的对话;没有时为空切片。
	DeletedConversations []defs.ConversationID
}

RebuildMetadataIndexResult 是一次重建索引的结果。

func RebuildMetadataIndex

func RebuildMetadataIndex(ctx context.Context, opt *DAOOpt) (RebuildMetadataIndexResult, error)

RebuildMetadataIndex 清空对话、Session、Turn 索引后,逐个重放对话的 metadata 日志重建索引;调用期间不能有其他读写。

type RecordCursor

type RecordCursor[ID ~string] struct {
	// ID 是上一页最后一条记录的 ID;为空时从头开始。
	ID ID `json:"id"`
	// UpdatedAt 是上一页最后一条记录的更新时间;按 Key 排序时不用。
	UpdatedAt int64 `json:"updated_at,omitempty"`
}

RecordCursor 是对话、Session、Turn 列表的翻页位置;零值从头开始。

type SessionMutation

type SessionMutation interface {
	// SetSession 保存 Session 的日志和索引。
	SetSession(context.Context, defs.Session) error
	// DeleteSession 先在 metadata 日志里记下删除,再删除 Session 的 Turn 索引、Item 日志和 Session 索引;Session 不存在时直接返回。
	DeleteSession(context.Context, defs.ConversationID, defs.SessionID) error
}

SessionMutation 保存和删除 Session。

type SessionQuery

type SessionQuery interface {
	// GetSession 读取对话内指定 Session,返回记录及是否找到。
	GetSession(context.Context, defs.ConversationID, defs.SessionID) (defs.Session, bool, error)
	// GetSessionByID 只凭 Session ID 读取记录;Session 还没写过 Item 时返回未找到。
	GetSessionByID(ctx context.Context, sessionID defs.SessionID) (defs.Session, bool, error)
	// ListSessions 分页读取对话内的 Session。
	ListSessions(context.Context, ListSessionsRequest) (storage.Page[defs.Session, RecordCursor[defs.SessionID]], error)
	// ScanSessions 按排序逐条读取对话内全部 Session,调用方 break 后停止。
	ScanSessions(context.Context, defs.ConversationID, storage.Order) iter.Seq2[defs.Session, error]
}

SessionQuery 读取 Session 记录。

type SkippedConversation

type SkippedConversation struct {
	// ConversationID 是对话 ID,也是它的日志目录名。
	ConversationID defs.ConversationID
	// Reason 是跳过的原因。
	Reason error
}

SkippedConversation 是一个因 metadata 不完整或损坏而没有写入索引的对话。

type TurnMutation

type TurnMutation interface {
	// SetTurn 保存 Turn 的日志和索引。
	SetTurn(context.Context, defs.Turn) error
}

TurnMutation 保存 Turn 记录。

type TurnQuery

type TurnQuery interface {
	// GetTurn 读取 Session 内指定 Turn,返回记录及是否找到。
	GetTurn(context.Context, defs.SessionID, defs.TurnID) (defs.Turn, bool, error)
	// GetTurns 按输入 ID 顺序返回 Session 中找到的 Turn,跳过不存在的记录。
	GetTurns(ctx context.Context, sessionID defs.SessionID, ids []defs.TurnID) ([]defs.Turn, error)
	// ListTurns 分页读取 Session 内的 Turn。
	ListTurns(context.Context, ListTurnsRequest) (storage.Page[defs.Turn, RecordCursor[defs.TurnID]], error)
}

TurnQuery 读取 Turn 记录。

Jump to

Keyboard shortcuts

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