Spaces:
Running
Running
/** | |
* Copyright (c) 2023 MERCENARIES.AI PTE. LTD. | |
* All rights reserved. | |
*/ | |
import { type ChatService, ChatContext } from '../../../services/ChatService.js'; | |
import { type APIIntegration } from '../../APIIntegration.js'; | |
import { type FastifyRequest, type FastifyReply } from 'fastify'; | |
import { type User } from 'omni-shared'; | |
const resolveService = function (integration: APIIntegration): ChatService { | |
return integration.app.services.get('chat') as unknown as ChatService; | |
}; | |
const appendToChatExport = function () { | |
return { | |
description: 'Get chat history', | |
params: [ | |
{ name: 'contextId', required: true, type: 'string', description: 'The chat context id' }, | |
{ name: 'payload', required: false, type: 'object', description: 'Client compatible chat payload' } | |
] | |
}; | |
}; | |
const appendToChatHandler = function (integration: APIIntegration, config: any) { | |
return { | |
schema: { | |
params: { | |
type: 'object', | |
properties: { | |
contextId: { type: 'string' } | |
}, | |
required: ['contextId'] | |
}, | |
body: { | |
type: 'object', | |
properties: { | |
payload: { | |
type: 'object', | |
properties: { | |
msgstore: { type: 'object' }, | |
version: { type: 'number' }, | |
ts: { type: 'number' } | |
}, | |
required: ['msgstore', 'version', 'ts'] | |
} | |
}, | |
required: ['payload'] | |
}, | |
response: { | |
200: { | |
type: 'object', | |
properties: { | |
success: { type: 'string' } | |
} | |
}, | |
400: { | |
type: 'object', | |
properties: { | |
error: { type: 'string' } | |
} | |
}, | |
500: { | |
type: 'object', | |
properties: { | |
error: { type: 'string' } | |
} | |
} | |
} | |
}, | |
handler: function (request: FastifyRequest, reply: FastifyReply) { | |
const chatService = resolveService(integration); | |
const contextId = (request as any)?.params?.contextId; | |
const body = request.body as { payload: { msgstore: object; version: number; ts: number } }; | |
if (!body) { | |
return reply.status(400).send({ error: 'Bad request or parameters' }); | |
} | |
const user = request.user as User; | |
chatService | |
.writeAppend(user.id, contextId, body.payload, body.payload.ts) | |
.then(() => { | |
return reply.status(200).send({ success: 'ok' }); | |
}) | |
.catch((error) => { | |
omnilog.error(error); | |
return reply.status(500).send({ error: 'Unable to update chat context history' }); | |
}); | |
} | |
}; | |
}; | |
const clearChatHistoryClientExport = function () { | |
return { | |
description: 'Clear chat history', | |
params: [{ name: 'contextId', required: true, type: 'string', description: 'The context id' }] | |
}; | |
}; | |
const clearChatHistoryHandler = function (integration: APIIntegration, config: any) { | |
return { | |
schema: { | |
params: { | |
type: 'object', | |
properties: { | |
contextId: { type: 'string' } | |
}, | |
required: ['contextId'] | |
}, | |
response: { | |
200: { | |
type: 'object', | |
properties: { | |
success: { type: 'string' } | |
} | |
}, | |
500: { | |
type: 'object', | |
properties: { | |
error: { type: 'string' } | |
} | |
} | |
} | |
}, | |
handler: function (request: FastifyRequest, reply: FastifyReply) { | |
const user = request.user as User; | |
const contextId = (request as any)?.params?.contextId; | |
const chatService = resolveService(integration); | |
chatService | |
.clearChatHistory(user.id, contextId) | |
.then((result) => { | |
return reply.status(200).send({ success: 'ok' }); | |
}) | |
.catch((error) => { | |
omnilog.error(error); | |
return reply.status(500).send({ error: 'Unable to find clear context history for context ' + contextId }); | |
}); | |
} | |
}; | |
}; | |
const getChatHistoryClientExport = function () { | |
return { | |
description: 'Get chat history', | |
params: [ | |
{ name: 'contextId', required: true, type: 'string', description: 'The context id' }, | |
{ | |
name: 'up_to_ts', | |
required: false, | |
type: 'number', | |
description: 'The latest inclusive timestamp to fetch to. Defaults to NOW' | |
}, | |
{ | |
name: 'length', | |
required: false, | |
type: 'number', | |
description: 'The latest inclusive timestamp to fetch to. Defaults to 10' | |
} | |
] | |
}; | |
}; | |
const getChatHistoryHandler = function (integration: APIIntegration, config: any) { | |
return { | |
schema: { | |
params: { | |
type: 'object', | |
properties: { | |
contextId: { type: 'string' } | |
}, | |
required: ['contextId'] | |
}, | |
response: { | |
200: { | |
type: 'object', | |
properties: { | |
success: { type: 'string' }, | |
result: { | |
type: 'object', | |
properties: { | |
up_to_ts: { type: 'number' }, | |
result: { | |
type: 'array', | |
items: { | |
ts: { type: 'number' }, | |
version: { type: 'number' }, | |
msgstore: { | |
type: 'object', | |
properties: { | |
message: { type: 'string' }, | |
sender: { type: 'string' }, | |
workflowId: { type: 'string' } | |
} | |
} | |
} | |
} | |
} | |
} | |
}, | |
required: ['success', 'result'] | |
}, | |
500: { | |
type: 'object', | |
properties: { | |
error: { type: 'string' } | |
}, | |
required: ['error'] | |
} | |
} | |
}, | |
handler: function (request: FastifyRequest, reply: FastifyReply) { | |
const user = request.user as User; | |
const contextId = (request as any)?.params?.contextId; | |
const chatService = resolveService(integration); | |
chatService | |
.getChatContext(user.id, contextId) | |
.then((chatContext) => { | |
return reply | |
.status(200) | |
.send({ success: 'ok', result: chatContext.partialGet(ChatContext.MAX_LENGTH, Date.now()) }); | |
}) | |
.catch((error) => { | |
omnilog.error(error); | |
return reply.status(500).send({ error: 'Unable to find chat context history for context ' + contextId }); | |
}); | |
} | |
}; | |
}; | |
export { | |
getChatHistoryHandler, | |
getChatHistoryClientExport, | |
appendToChatHandler, | |
appendToChatExport, | |
clearChatHistoryHandler, | |
clearChatHistoryClientExport | |
}; | |