diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 8526b4c..08ca3b3 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -9,7 +9,7 @@ async function bootstrap() { const globalPrefix = 'api'; const config = new DocumentBuilder() .setTitle('@boldare/openai-assistant') - .setVersion('0.1.0') + .setVersion('1.0.0') .build(); const document = SwaggerModule.createDocument(app, config); diff --git a/apps/spa/src/app/modules/+chat/shared/chat-gateway.service.ts b/apps/spa/src/app/modules/+chat/shared/chat-gateway.service.ts index 0b1beec..e6b3728 100644 --- a/apps/spa/src/app/modules/+chat/shared/chat-gateway.service.ts +++ b/apps/spa/src/app/modules/+chat/shared/chat-gateway.service.ts @@ -3,7 +3,9 @@ import { ChatEvents } from './chat.model'; import io from 'socket.io-client'; import { ChatCallDto, - TextCreatedPayload, TextDeltaPayload, TextDonePayload + TextCreatedPayload, + TextDeltaPayload, + TextDonePayload, } from '@boldare/openai-assistant'; import { Observable } from 'rxjs'; import { environment } from '../../../../environments/environment'; diff --git a/apps/spa/src/app/modules/+chat/shared/chat.service.ts b/apps/spa/src/app/modules/+chat/shared/chat.service.ts index 69616e9..76b2b4c 100644 --- a/apps/spa/src/app/modules/+chat/shared/chat.service.ts +++ b/apps/spa/src/app/modules/+chat/shared/chat.service.ts @@ -139,48 +139,40 @@ export class ChatService { } watchTextCreated(): Subscription { - return this.chatGatewayService - .textCreated() - .subscribe((data) => { - this.isTyping$.next(false) - this.addMessage({ content: data.text.value, role: ChatRole.Assistant }) - }); + return this.chatGatewayService.textCreated().subscribe(data => { + this.isTyping$.next(false); + this.addMessage({ content: data.text.value, role: ChatRole.Assistant }); + }); } watchTextDelta(): Subscription { - return this.chatGatewayService - .textDelta() - .subscribe((data) => { - const length = this.messages$.value.length; - this.messages$.value[length - 1].content = data.text.value; - }); + return this.chatGatewayService.textDelta().subscribe(data => { + const length = this.messages$.value.length; + this.messages$.value[length - 1].content = data.text.value; + }); } watchTextDone(): Subscription { - return this.chatGatewayService - .textDone() - .subscribe((data) => { - this.isTyping$.next(false); - this.messages$.next([ - ...this.messages$.value.slice(0, -1), - { - content: data.text.value, - role: ChatRole.Assistant, - }, - ]); - }); + return this.chatGatewayService.textDone().subscribe(data => { + this.isTyping$.next(false); + this.messages$.next([ + ...this.messages$.value.slice(0, -1), + { + content: data.text.value, + role: ChatRole.Assistant, + }, + ]); + }); } watchMessages(): Subscription { - return this.chatGatewayService - .callDone() - .subscribe(data => { - this.addMessage({ - content: data.content, - role: ChatRole.Assistant, - }); - this.isTyping$.next(false); + return this.chatGatewayService.callDone().subscribe(data => { + this.addMessage({ + content: data.content, + role: ChatRole.Assistant, }); + this.isTyping$.next(false); + }); } sendAudio(file: Blob): void { diff --git a/libs/openai-assistant/src/lib/assistant/assistant.module.ts b/libs/openai-assistant/src/lib/assistant/assistant.module.ts index 42ac73b..ad90754 100644 --- a/libs/openai-assistant/src/lib/assistant/assistant.module.ts +++ b/libs/openai-assistant/src/lib/assistant/assistant.module.ts @@ -1,4 +1,10 @@ -import { DynamicModule, Inject, Module, OnModuleInit } from '@nestjs/common'; +import { + DynamicModule, + Inject, + Module, + OnModuleInit, + Optional, +} from '@nestjs/common'; import { HttpModule } from '@nestjs/axios'; import { AssistantService, @@ -38,10 +44,14 @@ export class AssistantModule implements OnModuleInit { constructor( private readonly assistantService: AssistantService, private readonly configService: ConfigService, - @Inject('config') private config: AssistantConfigParams, + @Inject('config') @Optional() private config: AssistantConfigParams, ) {} async onModuleInit(): Promise { + if (!this.config) { + return; + } + this.configService.set(this.config); await this.assistantService.init(); } diff --git a/libs/openai-assistant/src/lib/chat/chat.model.ts b/libs/openai-assistant/src/lib/chat/chat.model.ts index c44484a..479f0d8 100644 --- a/libs/openai-assistant/src/lib/chat/chat.model.ts +++ b/libs/openai-assistant/src/lib/chat/chat.model.ts @@ -59,6 +59,9 @@ export class ChatCallDto { @ApiProperty() content!: string; + @ApiProperty({ required: false }) + assistantId?: string; + @ApiProperty({ required: false }) file_ids?: string[]; diff --git a/libs/openai-assistant/src/lib/chat/chat.service.ts b/libs/openai-assistant/src/lib/chat/chat.service.ts index 41da08a..fc30b91 100644 --- a/libs/openai-assistant/src/lib/chat/chat.service.ts +++ b/libs/openai-assistant/src/lib/chat/chat.service.ts @@ -36,7 +36,9 @@ export class ChatService { await this.threads.messages.create(threadId, message); - const run = this.assistantStream(threadId, callbacks); + const assistantId = + payload?.assistantId || process.env['ASSISTANT_ID'] || ''; + const run = this.assistantStream(assistantId, threadId, callbacks); const finalRun = await run.finalRun(); await this.runService.resolve(finalRun, true, callbacks); @@ -48,11 +50,12 @@ export class ChatService { } assistantStream( + assistantId: string, threadId: string, callbacks?: ChatCallCallbacks, ): AssistantStream { const runner = this.threads.runs.createAndStream(threadId, { - assistant_id: process.env['ASSISTANT_ID'] || '', + assistant_id: assistantId, }); return assistantStreamEventHandler(runner, callbacks); diff --git a/nx.json b/nx.json index fa85a7c..b12ad41 100644 --- a/nx.json +++ b/nx.json @@ -65,5 +65,13 @@ "e2eTestRunner": "none" } }, - "useInferencePlugins": false + "useInferencePlugins": false, + "tasksRunnerOptions": { + "default": { + "runner": "nx/tasks-runners/default", + "options": { + "cacheableOperations": ["build", "test"] + } + } + } }