import z from 'zod'; import { authedServiceRequest, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; import { geolocation } from '../interfaces/Geolocation'; import { zGPTModels } from '../enums/GPTModels'; import { zInstallationChannels } from '../enums/InstallationChannels'; import { zSearchTypes } from '../enums/SearchTypes'; import { Snippet } from './SnippetService'; export const queryEdit = z.object({ _id: z.string().optional(), value: z.string(), meta: metadata, }); export const queryOrigin = z.object({ channel: zInstallationChannels, originId: z.string().optional(), originName: z.string().optional(), originChannelId: z.string().optional(), originChannelName: z.string().optional(), }); export const query = z.object({ _id: z.string(), distinctId: z.string(), organizationId: z.string(), botId: z.string(), sourceIds: z.array(z.string()), snippetIds: z.array(z.string()), input: z.string(), output: z.string(), helpful: z.boolean().nullable(), // user marked as helpful mark: z.boolean().nullable(), // admin marked as correct or incorrect edits: z.array(queryEdit), model: zGPTModels.nullable(), embedding: z.array(z.number()).nullable(), type: zSearchTypes, origin: queryOrigin.nullable(), cachedQueryId: z.string().nullable(), geolocation: geolocation.nullable(), lang: z.string().optional(), meta: metadata, }); export type Query = z.infer; export type QueryEdit = z.infer; export type QueryOrigin = z.infer; export type QueryResolved = Query & { snippets: Snippet[]; }; export interface QueryService { create(request: CreateQueryRequest): Promise; setFeedback(request: SetQueryFeedbackRequest): Promise; addEdit(request: AddQueryEditRequest): Promise; get(request: GetQueryRequest): Promise; list(request: ListQueriesRequest): Promise; count(request: CountQueriesRequest): Promise; } /** ****************************************************************************** * Create Query ******************************************************************************* */ export const createQueryParams = z.object({ distinctId: z.string(), organizationId: z.string(), botId: z.string(), sourceIds: z.array(z.string()), snippetIds: z.array(z.string()), input: z.string(), output: z.string(), model: zGPTModels.nullable(), embedding: z.array(z.number()).nullable(), type: zSearchTypes, origin: queryOrigin.nullable(), cachedQueryId: z.string().nullable(), geolocation: geolocation.nullable(), lang: z.string().optional(), }); export const createQueryRequest = serviceRequest.merge( z.object({ params: createQueryParams, }), ); export const createQueryResponse = serviceResponse.merge( z.object({ query: query.optional(), }), ); export type CreateQueryParams = z.infer; export type CreateQueryRequest = z.infer; export type CreateQueryResponse = z.infer; /** ****************************************************************************** * Set Query Feedback ******************************************************************************* */ export const setQueryFeedbackParams = z.object({ queryId: z.string(), helpful: z.boolean().nullable(), }); export const setQueryFeedbackRequest = serviceRequest.merge( z.object({ params: setQueryFeedbackParams, }), ); export const setQueryFeedbackResponse = serviceResponse.merge( z.object({ query: query.optional(), }), ); export type SetQueryFeedbackParams = z.infer; export type SetQueryFeedbackRequest = z.infer; export type SetQueryFeedbackResponse = z.infer; /** ****************************************************************************** * Set Query Correction ******************************************************************************* */ export const addQueryEditParams = z.object({ _id: z.string(), mark: z.boolean().nullable(), edit: z.string().nullable(), }); export const addQueryEditRequest = authedServiceRequest.merge( z.object({ params: addQueryEditParams, }), ); export const addQueryEditResponse = serviceResponse.merge( z.object({ query: query.optional(), }), ); export type AddQueryEditParams = z.infer; export type AddQueryEditRequest = z.infer; export type AddQueryEditResponse = z.infer; /** ****************************************************************************** * Get Query ******************************************************************************* */ export const getQueryParams = z.object({ queryId: z.string(), }); export const getQueryRequest = serviceRequest.merge( z.object({ params: getQueryParams, }), ); export const getQueryResponse = serviceResponse.merge( z.object({ query: query.nullable().optional(), }), ); export type GetQueryParams = z.infer; export type GetQueryRequest = z.infer; export type GetQueryResponse = z.infer; /** ****************************************************************************** * List Queries ******************************************************************************* */ export const listQueriesParams = z.object({ botId: z.string().optional(), sourceIds: z.array(z.string()).optional(), search: z.string().optional(), offset: z.number().optional(), pageSize: z.number().optional(), isSuper: z.boolean().optional(), }); export const listQueriesRequest = authedServiceRequest.merge( z.object({ params: listQueriesParams, }), ); export const listQueriesResponse = serviceResponse.merge( z.object({ queries: z.array(query).optional(), total: z.number().optional(), }), ); export type ListQueriesParams = z.infer; export type ListQueriesRequest = z.infer; export type ListQueriesResponse = z.infer; /** ****************************************************************************** * Count Queries ******************************************************************************* */ export const countQueriesParams = z.object({ botId: z.string().optional(), sourceIds: z.array(z.string()).optional(), search: z.string().optional(), isSuper: z.boolean().optional(), }); export const countQueriesRequest = authedServiceRequest.merge( z.object({ params: countQueriesParams, }), ); export const countQueriesResponse = serviceResponse.merge( z.object({ count: z.number().optional(), }), ); export type CountQueriesParams = z.infer; export type CountQueriesRequest = z.infer; export type CountQueriesResponse = z.infer;