|
5 | 5 | use Illuminate\Broadcasting\Channel; |
6 | 6 | use Illuminate\Broadcasting\PrivateChannel; |
7 | 7 | use Illuminate\Support\Facades\Event; |
| 8 | +use Prism\Prism\Enums\Citations\CitationSourceType; |
8 | 9 | use Prism\Prism\Enums\FinishReason; |
| 10 | +use Prism\Prism\Events\Broadcasting\CitationBroadcast; |
9 | 11 | use Prism\Prism\Events\Broadcasting\ErrorBroadcast; |
10 | 12 | use Prism\Prism\Events\Broadcasting\ProviderToolEventBroadcast; |
11 | 13 | use Prism\Prism\Events\Broadcasting\StreamEndBroadcast; |
|
20 | 22 | use Prism\Prism\Events\Broadcasting\ToolCallDeltaBroadcast; |
21 | 23 | use Prism\Prism\Events\Broadcasting\ToolResultBroadcast; |
22 | 24 | use Prism\Prism\Streaming\Adapters\BroadcastAdapter; |
| 25 | +use Prism\Prism\Streaming\Events\CitationEvent; |
23 | 26 | use Prism\Prism\Streaming\Events\ErrorEvent; |
24 | 27 | use Prism\Prism\Streaming\Events\ProviderToolEvent; |
25 | 28 | use Prism\Prism\Streaming\Events\StreamEndEvent; |
|
34 | 37 | use Prism\Prism\Streaming\Events\ToolCallDeltaEvent; |
35 | 38 | use Prism\Prism\Streaming\Events\ToolCallEvent; |
36 | 39 | use Prism\Prism\Streaming\Events\ToolResultEvent; |
| 40 | +use Prism\Prism\ValueObjects\Citation; |
37 | 41 | use Prism\Prism\ValueObjects\ToolCall; |
38 | 42 | use Prism\Prism\ValueObjects\ToolResult; |
39 | 43 | use Prism\Prism\ValueObjects\Usage; |
@@ -345,6 +349,42 @@ function createBroadcastEventGenerator(array $events): Generator |
345 | 349 | }); |
346 | 350 | }); |
347 | 351 |
|
| 352 | +it('broadcasts citation events correctly', function (): void { |
| 353 | + $citation = new Citation( |
| 354 | + sourceType: CitationSourceType::Document, |
| 355 | + source: 0, |
| 356 | + sourceText: 'The quick brown fox', |
| 357 | + sourceTitle: 'Test Document', |
| 358 | + ); |
| 359 | + |
| 360 | + $event = new CitationEvent( |
| 361 | + id: 'evt-123', |
| 362 | + timestamp: 1640995200, |
| 363 | + citation: $citation, |
| 364 | + messageId: 'msg-456', |
| 365 | + blockIndex: 0, |
| 366 | + ); |
| 367 | + $channel = new Channel('test-channel'); |
| 368 | + |
| 369 | + $adapter = new BroadcastAdapter($channel); |
| 370 | + ($adapter)(createBroadcastEventGenerator([$event])); |
| 371 | + |
| 372 | + Event::assertDispatched(CitationBroadcast::class, function ($broadcastEvent) use ($channel): bool { |
| 373 | + expect($broadcastEvent->broadcastAs())->toBe('citation'); |
| 374 | + expect($broadcastEvent->broadcastOn())->toBe([$channel]); |
| 375 | + |
| 376 | + $data = $broadcastEvent->broadcastWith(); |
| 377 | + expect($data['id'])->toBe('evt-123'); |
| 378 | + expect($data['message_id'])->toBe('msg-456'); |
| 379 | + expect($data['block_index'])->toBe(0); |
| 380 | + expect($data['citation']['source_type'])->toBe('document'); |
| 381 | + expect($data['citation']['source_text'])->toBe('The quick brown fox'); |
| 382 | + expect($data['citation']['source_title'])->toBe('Test Document'); |
| 383 | + |
| 384 | + return true; |
| 385 | + }); |
| 386 | +}); |
| 387 | + |
348 | 388 | it('validates broadcast event structure for multiple event types', function (): void { |
349 | 389 | $usage = new Usage(promptTokens: 10, completionTokens: 5); |
350 | 390 | $events = [ |
|
0 commit comments