Skip to content

Commit bf6dffb

Browse files
IAmStivenlouisgv
andauthored
Added missing events (#105)
* added text-start text-end reasoning-start and reasoning-end support * added braces * throw error on unexpected reasoning detail type * Update index.ts * fix unit test --------- Co-authored-by: L <6723574+louisgv@users.noreply.github.com>
1 parent 272c31f commit bf6dffb

File tree

2 files changed

+41
-24
lines changed

2 files changed

+41
-24
lines changed

src/chat/index.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,10 @@ describe('doStream', () => {
452452
type: 'response-metadata',
453453
modelId: 'gpt-3.5-turbo-0613',
454454
},
455+
{
456+
type: 'text-start',
457+
id: expect.any(String),
458+
},
455459
{ type: 'text-delta', delta: '', id: expect.any(String) },
456460
{
457461
type: 'response-metadata',
@@ -496,6 +500,10 @@ describe('doStream', () => {
496500
type: 'response-metadata',
497501
modelId: 'gpt-3.5-turbo-0613',
498502
},
503+
{
504+
type: 'text-end',
505+
id: expect.any(String),
506+
},
499507
{
500508
type: 'finish',
501509
finishReason: 'stop',

src/chat/index.ts

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,9 @@ export class OpenRouterChatLanguageModel implements LanguageModelV2 {
410410
// Track provider-specific usage information
411411
const openrouterUsage: Partial<OpenRouterUsageAccounting> = {};
412412

413+
let textStarted = false;
414+
let reasoningStarted = false;
415+
413416
return {
414417
stream: response.pipeThrough(
415418
new TransformStream<
@@ -496,57 +499,56 @@ export class OpenRouterChatLanguageModel implements LanguageModelV2 {
496499
const delta = choice.delta;
497500

498501
if (delta.content != null) {
502+
if (!textStarted) {
503+
controller.enqueue({
504+
type: 'text-start',
505+
id: generateId(),
506+
});
507+
textStarted = true;
508+
}
499509
controller.enqueue({
500510
type: 'text-delta',
501511
delta: delta.content,
502512
id: generateId(),
503513
});
504514
}
505515

506-
if (delta.reasoning != null) {
516+
const emitReasoningChunk = (chunkText: string) => {
517+
if (!reasoningStarted) {
518+
controller.enqueue({
519+
type: 'reasoning-start',
520+
id: generateId(),
521+
});
522+
reasoningStarted = true;
523+
}
507524
controller.enqueue({
508525
type: 'reasoning-delta',
509-
delta: delta.reasoning,
526+
delta: chunkText,
510527
id: generateId(),
511528
});
512-
}
529+
};
513530

531+
if (delta.reasoning != null) {
532+
emitReasoningChunk(delta.reasoning);
533+
}
514534
if (delta.reasoning_details && delta.reasoning_details.length > 0) {
515535
for (const detail of delta.reasoning_details) {
516536
switch (detail.type) {
517537
case ReasoningDetailType.Text: {
518538
if (detail.text) {
519-
controller.enqueue({
520-
type: 'reasoning-delta',
521-
delta: detail.text,
522-
id: generateId(),
523-
});
524-
}
525-
if (detail.signature) {
526-
controller.enqueue({
527-
type: 'reasoning-end',
528-
id: generateId(),
529-
});
539+
emitReasoningChunk(detail.text);
530540
}
531541
break;
532542
}
533543
case ReasoningDetailType.Encrypted: {
534544
if (detail.data) {
535-
controller.enqueue({
536-
type: 'reasoning-delta',
537-
delta: '[REDACTED]',
538-
id: generateId(),
539-
});
545+
emitReasoningChunk('[REDACTED]');
540546
}
541547
break;
542548
}
543549
case ReasoningDetailType.Summary: {
544550
if (detail.summary) {
545-
controller.enqueue({
546-
type: 'reasoning-delta',
547-
delta: detail.summary,
548-
id: generateId(),
549-
});
551+
emitReasoningChunk(detail.summary);
550552
}
551553
break;
552554
}
@@ -704,6 +706,13 @@ export class OpenRouterChatLanguageModel implements LanguageModelV2 {
704706
}
705707
}
706708

709+
if (textStarted) {
710+
controller.enqueue({ type: 'text-end', id: generateId() });
711+
}
712+
if (reasoningStarted) {
713+
controller.enqueue({ type: 'reasoning-end', id: generateId() });
714+
}
715+
707716
controller.enqueue({
708717
type: 'finish',
709718
finishReason,

0 commit comments

Comments
 (0)