Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit 52ae6b4

Browse files
committed
add pagination messages
1 parent c9780b4 commit 52ae6b4

File tree

4 files changed

+64
-8
lines changed

4 files changed

+64
-8
lines changed

engine/controllers/messages.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
void Messages::ListMessages(
1111
const HttpRequestPtr& req,
1212
std::function<void(const HttpResponsePtr&)>&& callback,
13-
const std::string& thread_id, std::optional<uint8_t> limit,
13+
const std::string& thread_id, std::optional<std::string> limit,
1414
std::optional<std::string> order, std::optional<std::string> after,
1515
std::optional<std::string> before,
1616
std::optional<std::string> run_id) const {
1717
auto res = message_service_->ListMessages(
18-
thread_id, limit.value_or(20), order.value_or("desc"), after.value_or(""),
19-
before.value_or(""), run_id.value_or(""));
18+
thread_id, std::stoi(limit.value_or("20")), order.value_or("desc"),
19+
after.value_or(""), before.value_or(""), run_id.value_or(""));
2020

2121
Json::Value root;
2222
if (res.has_error()) {

engine/controllers/messages.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class Messages : public drogon::HttpController<Messages, false> {
3434

3535
void ListMessages(const HttpRequestPtr& req,
3636
std::function<void(const HttpResponsePtr&)>&& callback,
37-
const std::string& thread_id, std::optional<uint8_t> limit,
37+
const std::string& thread_id,
38+
std::optional<std::string> limit,
3839
std::optional<std::string> order,
3940
std::optional<std::string> after,
4041
std::optional<std::string> before,

engine/repositories/message_fs_repository.cc

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "message_fs_repository.h"
2+
#include <algorithm>
23
#include <fstream>
34
#include <mutex>
45
#include "utils/result.hpp"
@@ -52,7 +53,61 @@ MessageFsRepository::ListMessages(const std::string& thread_id, uint8_t limit,
5253
auto mutex = GrabMutex(thread_id);
5354
std::shared_lock<std::shared_mutex> lock(*mutex);
5455

55-
return ReadMessageFromFile(thread_id);
56+
auto read_result = ReadMessageFromFile(thread_id);
57+
if (read_result.has_error()) {
58+
return cpp::fail(read_result.error());
59+
}
60+
61+
std::vector<OpenAi::Message> messages = std::move(read_result.value());
62+
63+
if (!run_id.empty()) {
64+
messages.erase(std::remove_if(messages.begin(), messages.end(),
65+
[&run_id](const OpenAi::Message& msg) {
66+
return msg.run_id != run_id;
67+
}),
68+
messages.end());
69+
}
70+
71+
std::sort(messages.begin(), messages.end(),
72+
[&order](const OpenAi::Message& a, const OpenAi::Message& b) {
73+
if (order == "desc") {
74+
return a.created_at > b.created_at;
75+
}
76+
return a.created_at < b.created_at;
77+
});
78+
79+
auto start_it = messages.begin();
80+
auto end_it = messages.end();
81+
82+
if (!after.empty()) {
83+
start_it = std::find_if(
84+
messages.begin(), messages.end(),
85+
[&after](const OpenAi::Message& msg) { return msg.id == after; });
86+
if (start_it != messages.end()) {
87+
++start_it; // Start from the message after the 'after' message
88+
} else {
89+
start_it = messages.begin();
90+
}
91+
}
92+
93+
if (!before.empty()) {
94+
end_it = std::find_if(
95+
messages.begin(), messages.end(),
96+
[&before](const OpenAi::Message& msg) { return msg.id == before; });
97+
}
98+
99+
std::vector<OpenAi::Message> result;
100+
size_t distance = std::distance(start_it, end_it);
101+
size_t limit_size = static_cast<size_t>(limit);
102+
CTL_INF("Distance: " + std::to_string(distance) +
103+
", limit_size: " + std::to_string(limit_size));
104+
result.reserve(distance < limit_size ? distance : limit_size);
105+
106+
for (auto it = start_it; it != end_it && result.size() < limit_size; ++it) {
107+
result.push_back(std::move(*it));
108+
}
109+
110+
return result;
56111
}
57112

58113
cpp::result<OpenAi::Message, std::string> MessageFsRepository::RetrieveMessage(

engine/services/message_service.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ class MessageService {
2121
std::optional<std::vector<OpenAi::Message>> messages);
2222

2323
cpp::result<std::vector<OpenAi::Message>, std::string> ListMessages(
24-
const std::string& thread_id, uint8_t limit = 20,
25-
const std::string& order = "desc", const std::string& after = "",
26-
const std::string& before = "", const std::string& run_id = "") const;
24+
const std::string& thread_id, uint8_t limit, const std::string& order,
25+
const std::string& after, const std::string& before,
26+
const std::string& run_id) const;
2727

2828
cpp::result<OpenAi::Message, std::string> RetrieveMessage(
2929
const std::string& thread_id, const std::string& message_id) const;

0 commit comments

Comments
 (0)