l-ai-chat-client-go/history.go
Kaien 8bc08fb9f9 chore(module): use Gitea SDK import path
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-09 22:22:50 +03:00

71 lines
1.6 KiB
Go

package chatclient
import (
"context"
"fmt"
pb "gitea.fe.kaien.ru/kaien/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
}