package chatclient import ( "context" "fmt" pb "git.be.kaien.ru/l-ai/l-ai-chat-client-go/proto/l-ai-chat-proto" ) type HistoryRequest struct { TopicID string BeforeSequence int64 AfterSequence int64 Limit int32 } func (c *Client) History(ctx context.Context, req HistoryRequest) (*pb.HistoryResponse, error) { if err := c.checkOpen(); err != nil { return nil, err } if req.BeforeSequence > 0 && req.AfterSequence > 0 { return nil, fmt.Errorf("%w: before and after sequence are mutually exclusive", ErrInvalidConfig) } return c.api.History(ctx, &pb.HistoryRequest{ TopicId: req.TopicID, BeforeSequence: req.BeforeSequence, AfterSequence: req.AfterSequence, Limit: req.Limit, }) } type HistoryPager struct { client *Client req HistoryRequest forward bool done bool } func (c *Client) NewHistoryPager(req HistoryRequest) (*HistoryPager, error) { if req.BeforeSequence > 0 && req.AfterSequence > 0 { return nil, fmt.Errorf("%w: before and after sequence are mutually exclusive", ErrInvalidConfig) } return &HistoryPager{ client: c, req: req, forward: req.AfterSequence > 0, }, nil } func (p *HistoryPager) Next(ctx context.Context) (*pb.HistoryResponse, error) { if p.done { return &pb.HistoryResponse{}, nil } resp, err := p.client.History(ctx, p.req) if err != nil { return nil, err } if len(resp.GetMessages()) == 0 || !resp.GetHasMore() { p.done = true } if len(resp.GetMessages()) > 0 { last := resp.GetMessages()[len(resp.GetMessages())-1].GetSequence() if p.forward { p.req.AfterSequence = last } else { p.req.BeforeSequence = last } } return resp, nil }