1010use GuzzleHttp \Handler \MockHandler ;
1111use Cortex \Exceptions \PromptException ;
1212use Cortex \Prompts \Data \PromptMetadata ;
13+ use Cortex \JsonSchema \Types \ObjectSchema ;
1314use Cortex \LLM \Data \Messages \UserMessage ;
1415use Cortex \LLM \Data \Messages \SystemMessage ;
1516use Cortex \Prompts \Contracts \PromptTemplate ;
2021use Cortex \Prompts \Factories \LangfusePromptFactory ;
2122
2223function createLangfuseFactory (
23- string $ name ,
2424 array $ responses ,
2525): LangfusePromptFactory {
2626 return new LangfusePromptFactory (
27- name: $ name ,
2827 username: 'username ' ,
2928 password: 'password ' ,
3029 httpClient: new Client ([
@@ -59,11 +58,11 @@ function createLangfuseFactory(
5958 ],
6059 ];
6160
62- $ factory = createLangfuseFactory (' test-chat-prompt ' , [
61+ $ factory = createLangfuseFactory ([
6362 new Response (200 , body: json_encode ($ responseData )),
6463 ]);
6564
66- $ prompt = $ factory ->create ();
65+ $ prompt = $ factory ->create (' test-chat-prompt ' );
6766
6867 expect ($ prompt )->toBeInstanceOf (ChatPromptTemplate::class);
6968 expect ($ prompt ->messages )->toHaveCount (3 );
@@ -86,11 +85,11 @@ function createLangfuseFactory(
8685 'prompt ' => 'Write a story about {{topic}}. Make it {{length}} words long. ' ,
8786 ];
8887
89- $ factory = createLangfuseFactory (' test-text-prompt ' , [
88+ $ factory = createLangfuseFactory ([
9089 new Response (200 , body: json_encode ($ responseData )),
9190 ]);
9291
93- $ prompt = $ factory ->create ();
92+ $ prompt = $ factory ->create (' test-text-prompt ' );
9493
9594 expect ($ prompt )->toBeInstanceOf (TextPromptTemplate::class);
9695 expect ($ prompt ->text )->toBe ('Write a story about {{topic}}. Make it {{length}} words long. ' );
@@ -118,11 +117,11 @@ function createLangfuseFactory(
118117 ],
119118 ];
120119
121- $ factory = createLangfuseFactory (' test-assistant-prompt ' , [
120+ $ factory = createLangfuseFactory ([
122121 new Response (200 , body: json_encode ($ responseData )),
123122 ]);
124123
125- $ prompt = $ factory ->create ();
124+ $ prompt = $ factory ->create (' test-assistant-prompt ' );
126125
127126 expect ($ prompt ->messages [0 ])->toBeInstanceOf (UserMessage::class);
128127 expect ($ prompt ->messages [1 ])->toBeInstanceOf (AssistantMessage::class);
@@ -140,11 +139,11 @@ function createLangfuseFactory(
140139 'prompt ' => 'Some content ' ,
141140 ];
142141
143- $ factory = createLangfuseFactory (' test-prompt ' , [
142+ $ factory = createLangfuseFactory ([
144143 new Response (200 , body: json_encode ($ responseData )),
145144 ]);
146145
147- expect (fn (): PromptTemplate => $ factory ->create ())
146+ expect (fn (): PromptTemplate => $ factory ->create (' test-prompt ' ))
148147 ->toThrow (PromptException::class, 'Unsupported prompt type: unsupported ' );
149148});
150149
@@ -165,11 +164,11 @@ function createLangfuseFactory(
165164 ],
166165 ];
167166
168- $ factory = createLangfuseFactory (' test-prompt ' , [
167+ $ factory = createLangfuseFactory ([
169168 new Response (200 , body: json_encode ($ responseData )),
170169 ]);
171170
172- expect (fn (): PromptTemplate => $ factory ->create ())
171+ expect (fn (): PromptTemplate => $ factory ->create (' test-prompt ' ))
173172 ->toThrow (PromptException::class, 'Unsupported message role: unknown ' );
174173});
175174
@@ -189,11 +188,11 @@ function createLangfuseFactory(
189188 ],
190189 ];
191190
192- $ factory = createLangfuseFactory (' test-prompt ' , [
191+ $ factory = createLangfuseFactory ([
193192 new Response (200 , body: json_encode ($ responseData )),
194193 ]);
195194
196- expect (fn (): PromptTemplate => $ factory ->create ())
195+ expect (fn (): PromptTemplate => $ factory ->create (' test-prompt ' ))
197196 ->toThrow (PromptException::class, 'Unsupported message type: unknown ' );
198197});
199198
@@ -208,30 +207,30 @@ function createLangfuseFactory(
208207 'prompt ' => 'Test prompt ' ,
209208 ];
210209
211- $ factory = createLangfuseFactory (' test-prompt ' , [
210+ $ factory = createLangfuseFactory ([
212211 new Response (200 , body: json_encode ($ responseData )),
213212 ]);
214213
215- $ prompt = $ factory ->create ();
214+ $ prompt = $ factory ->create (' test-prompt ' );
216215
217216 expect ($ prompt )->toBeInstanceOf (TextPromptTemplate::class);
218217});
219218
220219test ('it handles http errors that return invalid json ' , function (): void {
221- $ factory = createLangfuseFactory (' nonexistent-prompt ' , [
220+ $ factory = createLangfuseFactory ([
222221 new Response (404 , body: 'Prompt not found ' ),
223222 ]);
224223
225- expect (fn (): PromptTemplate => $ factory ->create ())
224+ expect (fn (): PromptTemplate => $ factory ->create (' nonexistent-prompt ' ))
226225 ->toThrow (PromptException::class, 'Invalid JSON response from Langfuse: Syntax error ' );
227226});
228227
229228test ('it handles malformed json response ' , function (): void {
230- $ factory = createLangfuseFactory (' test-prompt ' , [
229+ $ factory = createLangfuseFactory ([
231230 new Response (200 , body: 'invalid json { ' ),
232231 ]);
233232
234- expect (fn (): PromptTemplate => $ factory ->create ())
233+ expect (fn (): PromptTemplate => $ factory ->create (' test-prompt ' ))
235234 ->toThrow (PromptException::class, 'Invalid JSON response from Langfuse: Syntax error ' );
236235});
237236
@@ -248,7 +247,15 @@ function createLangfuseFactory(
248247 'max_tokens ' => 100 ,
249248 ],
250249 'tools ' => ['calculator ' , 'search ' ],
251- 'structuredOutput ' => 'json ' ,
250+ 'structuredOutput ' => [
251+ 'type ' => 'object ' ,
252+ 'properties ' => [
253+ 'name ' => [
254+ 'type ' => 'string ' ,
255+ ],
256+ ],
257+ 'required ' => ['name ' ],
258+ ],
252259 'additional ' => [
253260 'custom_field ' => 'custom_value ' ,
254261 ],
@@ -258,12 +265,12 @@ function createLangfuseFactory(
258265 'prompt ' => 'Test prompt with metadata ' ,
259266 ];
260267
261- $ factory = createLangfuseFactory (' test-prompt ' , [
268+ $ factory = createLangfuseFactory ([
262269 new Response (200 , body: json_encode ($ responseData )),
263270 ]);
264271
265272 /** @var \Cortex\Prompts\Templates\TextPromptTemplate $prompt */
266- $ prompt = $ factory ->create ();
273+ $ prompt = $ factory ->create (' test-prompt ' );
267274
268275 expect ($ prompt )->toBeInstanceOf (TextPromptTemplate::class);
269276 expect ($ prompt ->metadata )->not ()->toBeNull ();
@@ -274,7 +281,8 @@ function createLangfuseFactory(
274281 'max_tokens ' => 100 ,
275282 ]);
276283 expect ($ prompt ->metadata ->tools )->toBe (['calculator ' , 'search ' ]);
277- expect ($ prompt ->metadata ->structuredOutput )->toBe ('json ' );
284+ expect ($ prompt ->metadata ->structuredOutput )->toBeInstanceOf (ObjectSchema::class);
285+ expect ($ prompt ->metadata ->structuredOutput ->getPropertyKeys ())->toBe (['name ' ]);
278286 expect ($ prompt ->metadata ->additional )->toBe ([
279287 'custom_field ' => 'custom_value ' ,
280288 ]);
@@ -297,11 +305,11 @@ function createLangfuseFactory(
297305 ],
298306 ];
299307
300- $ factory = createLangfuseFactory (' test-prompt ' , [
308+ $ factory = createLangfuseFactory ([
301309 new Response (200 , body: json_encode ($ responseData )),
302310 ]);
303311
304- $ prompt = $ factory ->create ();
312+ $ prompt = $ factory ->create (' test-prompt ' );
305313
306314 expect ($ prompt )->toBeInstanceOf (ChatPromptTemplate::class);
307315 expect ($ prompt ->metadata )->not ()->toBeNull ();
@@ -330,11 +338,11 @@ function createLangfuseFactory(
330338 'prompt ' => 'Test prompt ' ,
331339 ];
332340
333- $ factory = createLangfuseFactory (' test-prompt ' , [
341+ $ factory = createLangfuseFactory ([
334342 new Response (200 , body: json_encode ($ responseData )),
335343 ]);
336344
337- $ prompt = $ factory ->create ();
345+ $ prompt = $ factory ->create (' test-prompt ' );
338346
339347 expect ($ prompt ->metadata )->not ()->toBeNull ();
340348 expect ($ prompt ->metadata ->provider )->toBe ('anthropic ' );
@@ -362,7 +370,7 @@ function createLangfuseFactory(
362370 'prompt ' => 'Test prompt ' ,
363371 ];
364372
365- $ factory = createLangfuseFactory (' test-prompt ' , [
373+ $ factory = createLangfuseFactory ([
366374 new Response (200 , body: json_encode ($ responseData )),
367375 ]);
368376
@@ -382,7 +390,7 @@ function createLangfuseFactory(
382390 );
383391 });
384392
385- $ prompt = $ factory ->create ();
393+ $ prompt = $ factory ->create (' test-prompt ' );
386394
387395 expect ($ prompt ->metadata )->not ()->toBeNull ();
388396 expect ($ prompt ->metadata ->provider )->toBe ('custom-provider ' );
@@ -398,7 +406,7 @@ function createLangfuseFactory(
398406});
399407
400408test ('it returns same factory instance when setting custom metadata resolver ' , function (): void {
401- $ factory = createLangfuseFactory (' test-prompt ' , []);
409+ $ factory = createLangfuseFactory ([]);
402410
403411 $ resolver = fn (array $ config ): PromptMetadata => new PromptMetadata ();
404412 $ result = $ factory ->resolveMetadataUsing ($ resolver );
@@ -426,11 +434,11 @@ function createLangfuseFactory(
426434 ],
427435 ];
428436
429- $ factory = createLangfuseFactory (' test-prompt ' , [
437+ $ factory = createLangfuseFactory ([
430438 new Response (200 , body: json_encode ($ responseData )),
431439 ]);
432440
433- $ prompt = $ factory ->create ();
441+ $ prompt = $ factory ->create (' test-prompt ' );
434442
435443 expect ($ prompt )->toBeInstanceOf (ChatPromptTemplate::class);
436444 expect ($ prompt ->metadata )->not ()->toBeNull ();
0 commit comments