@@ -7,9 +7,15 @@ import std;
77using namespace mcpplibs ::llmapi;
88
99struct FullMockProvider {
10+ std::string prefix { " reply to: " };
11+ int delayMs { 0 };
12+
1013 std::string_view name () const { return " full_mock" ; }
1114
1215 ChatResponse chat (const std::vector<Message>& msgs, const ChatParams&) {
16+ if (delayMs > 0 ) {
17+ std::this_thread::sleep_for (std::chrono::milliseconds (delayMs));
18+ }
1319 std::string lastContent;
1420 if (!msgs.empty ()) {
1521 auto & c = msgs.back ().content ;
@@ -18,7 +24,7 @@ struct FullMockProvider {
1824 }
1925 }
2026 return ChatResponse {
21- .content = { TextContent { " reply to: " + lastContent } },
27+ .content = { TextContent { prefix + lastContent } },
2228 .stopReason = StopReason::EndOfTurn,
2329 .usage = { .inputTokens = 10 , .outputTokens = 5 , .totalTokens = 15 },
2430 };
@@ -96,6 +102,40 @@ int main() {
96102 assert (client2.conversation ().size () == 2 );
97103 std::filesystem::remove (" /tmp/test_client_conv.json" );
98104
105+ // Test 8: isolated clients can be used concurrently without sharing conversation state
106+ auto futureA = std::async (std::launch::async, [] {
107+ auto isolatedClient = Client (FullMockProvider{
108+ .prefix = " openai-like: " ,
109+ .delayMs = 10 ,
110+ });
111+ isolatedClient.system (" provider a" );
112+ auto resp = isolatedClient.chat (" hello from a" );
113+ return std::pair{
114+ resp.text (),
115+ isolatedClient.conversation ().size (),
116+ };
117+ });
118+
119+ auto futureB = std::async (std::launch::async, [] {
120+ auto isolatedClient = Client (FullMockProvider{
121+ .prefix = " anthropic-like: " ,
122+ .delayMs = 10 ,
123+ });
124+ isolatedClient.system (" provider b" );
125+ auto resp = isolatedClient.chat (" hello from b" );
126+ return std::pair{
127+ resp.text (),
128+ isolatedClient.conversation ().size (),
129+ };
130+ });
131+
132+ auto [textA, sizeA] = futureA.get ();
133+ auto [textB, sizeB] = futureB.get ();
134+ assert (textA == " openai-like: hello from a" );
135+ assert (textB == " anthropic-like: hello from b" );
136+ assert (sizeA == 3 );
137+ assert (sizeB == 3 );
138+
99139 println (" test_client: ALL PASSED" );
100140 return 0 ;
101141}
0 commit comments