72fd3b07e7
https://github.com/user-attachments/assets/911d5d8d-cc2e-4c18-9f93-2663d84ff9ef --------- Co-authored-by: Raphaël Bosi <71827178+bosiraphael@users.noreply.github.com> Co-authored-by: neo773 <62795688+neo773@users.noreply.github.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: Félix Malfait <felix@twenty.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions <github-actions@twenty.com> Co-authored-by: MD Readul Islam <99027968+readul-islam@users.noreply.github.com> Co-authored-by: readul-islam <developer.readul@gamil.com> Co-authored-by: Thomas des Francs <tdesfrancs@gmail.com> Co-authored-by: Guillim <guillim@users.noreply.github.com> Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
96 lines
2.7 KiB
TypeScript
96 lines
2.7 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
Param,
|
|
Post,
|
|
Res,
|
|
UseFilters,
|
|
UseGuards,
|
|
} from '@nestjs/common';
|
|
|
|
import { Response } from 'express';
|
|
|
|
import { RestApiExceptionFilter } from 'src/engine/api/rest/rest-api-exception.filter';
|
|
import { AuthUserWorkspaceId } from 'src/engine/decorators/auth/auth-user-workspace-id.decorator';
|
|
import { JwtAuthGuard } from 'src/engine/guards/jwt-auth.guard';
|
|
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
|
|
|
|
import { AgentChatService } from './agent-chat.service';
|
|
import { AgentStreamingService } from './agent-streaming.service';
|
|
|
|
@Controller('rest/agent-chat')
|
|
@UseGuards(JwtAuthGuard, WorkspaceAuthGuard)
|
|
@UseFilters(RestApiExceptionFilter)
|
|
export class AgentChatController {
|
|
constructor(
|
|
private readonly agentChatService: AgentChatService,
|
|
private readonly agentStreamingService: AgentStreamingService,
|
|
) {}
|
|
|
|
@Get('threads/:agentId')
|
|
async getThreadsForAgent(
|
|
@Param('agentId') agentId: string,
|
|
@AuthUserWorkspaceId() userWorkspaceId: string,
|
|
) {
|
|
return this.agentChatService.getThreadsForAgent(agentId, userWorkspaceId);
|
|
}
|
|
|
|
@Get('threads/:threadId/messages')
|
|
async getMessagesForThread(
|
|
@Param('threadId') threadId: string,
|
|
@AuthUserWorkspaceId() userWorkspaceId: string,
|
|
) {
|
|
return this.agentChatService.getMessagesForThread(
|
|
threadId,
|
|
userWorkspaceId,
|
|
);
|
|
}
|
|
|
|
@Post('threads')
|
|
async createThread(
|
|
@Body() body: { agentId: string },
|
|
@AuthUserWorkspaceId() userWorkspaceId: string,
|
|
) {
|
|
return this.agentChatService.createThread(body.agentId, userWorkspaceId);
|
|
}
|
|
|
|
@Post('stream')
|
|
async streamAgentChat(
|
|
@Body()
|
|
body: { threadId: string; userMessage: string; fileIds?: string[] },
|
|
@AuthUserWorkspaceId() userWorkspaceId: string,
|
|
@Res() res: Response,
|
|
) {
|
|
try {
|
|
await this.agentStreamingService.streamAgentChat({
|
|
threadId: body.threadId,
|
|
userMessage: body.userMessage,
|
|
userWorkspaceId,
|
|
fileIds: body.fileIds || [],
|
|
res,
|
|
});
|
|
} catch (error) {
|
|
// Handle errors at controller level for streaming responses
|
|
// since the RestApiExceptionFilter interferes with our streaming error handling
|
|
const errorMessage =
|
|
error instanceof Error ? error.message : 'Unknown error occurred';
|
|
|
|
if (!res.headersSent) {
|
|
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
|
res.setHeader('Transfer-Encoding', 'chunked');
|
|
res.setHeader('Cache-Control', 'no-cache');
|
|
}
|
|
|
|
res.write(
|
|
JSON.stringify({
|
|
type: 'error',
|
|
message: errorMessage,
|
|
}) + '\n',
|
|
);
|
|
|
|
res.end();
|
|
}
|
|
}
|
|
}
|