Feature/sse (#3125)

* Base changes for ServerSide Events (instead of socket.io)

* lint fixes

* adding of interface and separate methods for streaming events

* lint

* first draft, handles both internal and external prediction end points.

* lint fixes

* additional internal end point for streaming and associated changes

* return streamresponse as true to build agent flow

* 1) JSON formatting for internal events
2) other fixes

* 1) convert internal event to metadata to maintain consistency with external response

* fix action and metadata streaming

* fix for error when agent flow is aborted

* prevent subflows from streaming and other code cleanup

* prevent streaming from enclosed tools

* add fix for preventing chaintool streaming

* update lock file

* add open when hidden to sse

* Streaming errors

* Streaming errors

* add fix for showing error message

---------

Co-authored-by: Henry <hzj94@hotmail.com>
This commit is contained in:
Vinod Kiran
2024-09-17 12:31:25 +05:30
committed by GitHub
parent 7a4c7efcab
commit 26444ac3ae
47 changed files with 1021 additions and 327 deletions
@@ -1,4 +1,4 @@
import { Server } from 'socket.io'
import { IServerSideEventStreamer } from '../../src'
export abstract class Moderation {
abstract checkForViolations(input: string): Promise<string>
@@ -13,15 +13,13 @@ export const checkInputs = async (inputModerations: Moderation[], input: string)
// is this the correct location for this function?
// should we have a utils files that all node components can use?
export const streamResponse = (isStreaming: any, response: string, socketIO: Server, socketIOClientId: string) => {
if (isStreaming) {
const result = response.split(/(\s+)/)
result.forEach((token: string, index: number) => {
if (index === 0) {
socketIO.to(socketIOClientId).emit('start', token)
}
socketIO.to(socketIOClientId).emit('token', token)
})
socketIO.to(socketIOClientId).emit('end')
}
export const streamResponse = (sseStreamer: IServerSideEventStreamer, chatId: string, response: string) => {
const result = response.split(/(\s+)/)
result.forEach((token: string, index: number) => {
if (index === 0) {
sseStreamer.streamStartEvent(chatId, token)
}
sseStreamer.streamTokenEvent(chatId, token)
})
sseStreamer.streamEndEvent(chatId)
}