Skip to content

Commit 399a1d2

Browse files
feat(openai-assistant): assistants streaming events added
1 parent e1ff507 commit 399a1d2

24 files changed

+544
-118
lines changed

apps/spa/src/app/components/chat/chat-audio/chat-audio.component.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { Component, Input, OnInit } from '@angular/core';
22
import { ChatClientService } from '../../../modules/+chat/shared/chat-client.service';
3-
import { ChatMessage, SpeechVoice } from '../../../modules/+chat/shared/chat.model';
3+
import {
4+
ChatMessage,
5+
SpeechVoice,
6+
} from '../../../modules/+chat/shared/chat.model';
47
import { environment } from '../../../../environments/environment';
58
import { MatIconModule } from '@angular/material/icon';
69
import { delay } from 'rxjs';

apps/spa/src/app/components/chat/chat-message/chat-message.component.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { Component, HostBinding, Input } from '@angular/core';
2-
import { ChatRole, ChatMessage } from '../../../modules/+chat/shared/chat.model';
2+
import {
3+
ChatRole,
4+
ChatMessage,
5+
} from '../../../modules/+chat/shared/chat.model';
36
import { MarkdownComponent } from 'ngx-markdown';
47
import { ChatAudioComponent } from '../chat-audio/chat-audio.component';
58
import { NgClass } from '@angular/common';

apps/spa/src/app/modules/+chat/containers/chat-iframe/chat-iframe.component.html

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@
88

99
<ai-spinner [isActive]="isLoading()" />
1010
@if (isConfigEnabled && !threadId()) {
11-
<ai-configuration-form class="chat__content" />
11+
<ai-configuration-form class="chat__content" />
1212
} @else {
13-
<ai-chat-messages
14-
[messages]="messages()"
15-
[isTyping]="isTyping()"
16-
[tips]="tips"
17-
(tipSelected$)="chatService.sendMessage($event)"
18-
class="chat__content" />
19-
<ai-chat-footer
20-
[isDisabled]="isTyping()"
21-
[isTranscriptionEnabled]="isTranscriptionEnabled"
22-
[isAttachmentEnabled]="isAttachmentEnabled"
23-
(sendMessage$)="chatService.sendMessage($event)"
24-
(sendAudio$)="chatService.sendAudio($event)" />
13+
<ai-chat-messages
14+
[messages]="messages()"
15+
[isTyping]="isTyping()"
16+
[tips]="tips"
17+
(tipSelected$)="chatService.sendMessage($event)"
18+
class="chat__content" />
19+
<ai-chat-footer
20+
[isDisabled]="isTyping()"
21+
[isTranscriptionEnabled]="isTranscriptionEnabled"
22+
[isAttachmentEnabled]="isAttachmentEnabled"
23+
(sendMessage$)="chatService.sendMessage($event)"
24+
(sendAudio$)="chatService.sendAudio($event)" />
2525
}
2626
</ai-card>

apps/spa/src/app/modules/+chat/shared/chat-gateway.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ export class ChatGatewayService {
1010
private socket = io(environment.websocketUrl);
1111

1212
sendMessage(payload: ChatCallDto): void {
13-
this.socket.emit(ChatEvents.SendMessage, payload);
13+
this.socket.emit(ChatEvents.CallStart, payload);
1414
}
1515

1616
getMessages(): Observable<ChatCallDto> {
1717
return new Observable<ChatCallDto>(observer => {
18-
this.socket.on(ChatEvents.MessageReceived, data => observer.next(data));
18+
this.socket.on(ChatEvents.CallDone, data => observer.next(data));
1919
return () => this.socket.disconnect();
2020
});
2121
}

apps/spa/src/app/modules/+chat/shared/chat.model.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,21 @@ export interface ChatMessage {
1515
}
1616

1717
export enum ChatEvents {
18-
SendMessage = 'send_message',
19-
MessageReceived = 'message_received',
18+
CallStart = 'callStart',
19+
CallDone = 'callDone',
20+
TextDone = 'textCreated',
21+
TextCreated = 'textDelta',
22+
TextDelta = 'textDone',
23+
MessageCreated = 'messageCreated',
24+
MessageDelta = 'messageDelta',
25+
MessageDone = 'messageDone',
26+
ImageFileDone = 'imageFileDone',
27+
ToolCallCreated = 'toolCallCreated',
28+
ToolCallDelta = 'toolCallDelta',
29+
ToolCallDone = 'toolCallDone',
30+
RunStepCreated = 'runStepCreated',
31+
RunStepDelta = 'runStepDelta',
32+
RunStepDone = 'runStepDone',
2033
}
2134

2235
export enum ChatMessageStatus {

apps/spa/src/app/modules/+chat/shared/chat.service.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { OpenAiFile, GetThreadResponseDto } from '@boldare/openai-assistant';
1919
import { Message } from 'openai/resources/beta/threads/messages';
2020
import { TextContentBlock } from 'openai/resources/beta/threads/messages/messages';
2121

22-
2322
@Injectable({ providedIn: 'root' })
2423
export class ChatService {
2524
isLoading$ = new BehaviorSubject<boolean>(false);

apps/spa/src/app/modules/+chat/shared/thread.service.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { Injectable } from '@angular/core';
2-
import { BehaviorSubject, catchError, Observable, Subject, take, tap } from 'rxjs';
2+
import {
3+
BehaviorSubject,
4+
catchError,
5+
Observable,
6+
Subject,
7+
take,
8+
tap,
9+
} from 'rxjs';
310
import { environment } from '../../../../environments/environment';
411
import { ThreadClientService } from './thread-client.service';
512
import { ConfigurationFormService } from '../../+configuration/shared/configuration-form.service';
@@ -43,11 +50,9 @@ export class ThreadService {
4350
}
4451

4552
getThread(id: string): Observable<GetThreadResponseDto> {
46-
return this.threadClientService
47-
.getThread(id)
48-
.pipe(
49-
take(1),
50-
catchError(() => this.start()),
51-
);
53+
return this.threadClientService.getThread(id).pipe(
54+
take(1),
55+
catchError(() => this.start()),
56+
);
5257
}
5358
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { AssistantCreateParams } from 'openai/resources/beta';
1+
import { FunctionTool } from 'openai/resources/beta';
22

33
export const agentNameMock = 'agent-name';
44

55
export const agentMock = async () => 'agent-result';
66

7-
export const definitionMock: AssistantCreateParams.AssistantToolsFunction = {
7+
export const definitionMock: FunctionTool = {
88
type: 'function',
99
function: { name: agentNameMock },
1010
};

libs/openai-assistant/src/lib/agent/agent.service.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ export class AgentService {
77
public agents: Agents = {};
88
public tools: FunctionTool[] = [];
99

10-
add(
11-
definition: FunctionTool,
12-
fn: Agent,
13-
): void {
10+
add(definition: FunctionTool, fn: Agent): void {
1411
this.tools.push(definition);
1512
this.agents[definition.function.name] = fn;
1613
}

libs/openai-assistant/src/lib/chat/chat.gateway.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe('ChatGateway', () => {
3232

3333
await chatGateway.listenForMessages(request, {} as Socket);
3434

35-
expect(chatService.call).toHaveBeenCalledWith(request);
35+
expect(chatService.call).toHaveBeenCalled();
3636
});
3737
});
3838

0 commit comments

Comments
 (0)