@alquimia-ai/tools 1.0.2 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.d.mts +38 -3
- package/dist/actions/index.d.ts +38 -3
- package/dist/actions/index.js +152 -20
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/index.mjs +153 -12
- package/dist/actions/index.mjs.map +1 -1
- package/dist/hooks/index.d.mts +2 -3
- package/dist/hooks/index.d.ts +2 -3
- package/dist/hooks/index.js +29 -60
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +16 -42
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/providers/index.d.mts +74 -0
- package/dist/providers/index.d.ts +74 -0
- package/dist/providers/index.js +2183 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/index.mjs +2173 -0
- package/dist/providers/index.mjs.map +1 -0
- package/dist/providers-D6FJ6tlA.d.mts +33 -0
- package/dist/providers-D6FJ6tlA.d.ts +33 -0
- package/dist/sdk/index.d.mts +41 -68
- package/dist/sdk/index.d.ts +41 -68
- package/dist/sdk/index.js +1 -374
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/index.mjs +1 -356
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/services/index.js +0 -7
- package/dist/services/index.mjs +1 -0
- package/dist/types/index.js +0 -4
- package/dist/utils/index.js +0 -14
- package/package.json +16 -27
- package/dist/actions/alquimia.action.d.mts +0 -3
- package/dist/actions/alquimia.action.d.ts +0 -3
- package/dist/actions/alquimia.action.js +0 -62
- package/dist/actions/alquimia.action.js.map +0 -1
- package/dist/actions/alquimia.action.mjs +0 -38
- package/dist/actions/alquimia.action.mjs.map +0 -1
- package/dist/actions/baseApi.action.d.mts +0 -20
- package/dist/actions/baseApi.action.d.ts +0 -20
- package/dist/actions/baseApi.action.js +0 -202
- package/dist/actions/baseApi.action.js.map +0 -1
- package/dist/actions/baseApi.action.mjs +0 -173
- package/dist/actions/baseApi.action.mjs.map +0 -1
- package/dist/alquimia-sdk-DK0XLjol.d.mts +0 -77
- package/dist/alquimia-sdk-DK0XLjol.d.ts +0 -77
- package/dist/context/index.d.mts +0 -22
- package/dist/context/index.d.ts +0 -22
- package/dist/context/index.js +0 -124
- package/dist/context/index.js.map +0 -1
- package/dist/context/index.mjs +0 -96
- package/dist/context/index.mjs.map +0 -1
- package/dist/index.d.mts +0 -33
- package/dist/index.d.ts +0 -33
- package/dist/index.js +0 -1277
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -1202
- package/dist/index.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/actions/alquimia.action.ts","../../src/utils/utils.ts","../../src/actions/baseApi.action.ts"],"sourcesContent":["'use server'\nimport { randomUUID } from \"crypto\";\nimport { cookies } from \"next/headers\";\nimport { ConversationsMap } from \"../types/type\";\n\nexport async function initConversation(reset?: boolean, topicId?: string) {\n const cookieStore = await cookies();\n\n if (!topicId) {\n let conversationId = randomUUID().toString();\n const alquimia_session = cookieStore.get(\"alquimia-session\");\n\n if (!alquimia_session || reset) {\n cookieStore.set(\"alquimia-session\", conversationId);\n } else {\n conversationId = alquimia_session.value;\n }\n\n return conversationId;\n }\n\n let conversationsMap: ConversationsMap = {};\n const existingConversations = cookieStore.get(\"alquimia-sessions\");\n \n if (existingConversations) {\n try {\n const decodedValue = decodeURIComponent(existingConversations.value);\n conversationsMap = JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n conversationsMap = {};\n }\n }\n\n if (!conversationsMap[topicId] || reset) {\n conversationsMap[topicId] = randomUUID().toString();\n }\n\n cookieStore.set(\"alquimia-sessions\", JSON.stringify(conversationsMap));\n \n return conversationsMap[topicId];\n}","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\"use server\";\nimport { BaseAPIConfig } from \"../types/type\";\nimport { generateHeaders, isTextContent } from \"../utils\";\n\ninterface ActionResponse<T = void> {\n success: boolean;\n data?: T;\n contentType?: string;\n error?: {\n message: string;\n code?: string;\n details?: any;\n };\n}\n\nexport async function createResource<TResponse, TPayload>(\n config: BaseAPIConfig,\n payload: TPayload\n): Promise<ActionResponse<TResponse>> {\n try {\n const headers = generateHeaders(config);\n\n const response = await fetch(`${config.baseUrl}${config.route}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n \n return {\n success: true,\n data: await response.json(),\n };\n } catch (error) {\n throw new Error(\"Failed to create resource\");\n }\n}\n\nexport async function readResource<T>(\n config: BaseAPIConfig,\n id?: string\n): Promise<ActionResponse<T>> {\n try {\n const headers = generateHeaders(config);\n const url = id\n ? `${config.baseUrl}${config.route}/${id}`\n : `${config.baseUrl}${config.route}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n return {\n success: true,\n data: await response.json(),\n contentType: contentType || undefined,\n };\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (contentType?.includes(\"octet-stream\") && isTextContent(arrayBuffer)) {\n return {\n success: true,\n data: arrayBuffer as T,\n contentType: \"text/plain\",\n };\n }\n\n return {\n success: true,\n data: await response.json(),\n contentType: contentType || undefined,\n };\n } catch (error) {\n throw new Error(\"Failed to read resource\");\n }\n}\n\nexport async function updateResource<T>(\n config: BaseAPIConfig,\n id: string,\n data: T\n): Promise<ActionResponse<T>> {\n try {\n const headers = generateHeaders(config);\n\n const response = await fetch(`${config.baseUrl}${config.route}/${id}`, {\n method: \"PUT\",\n headers,\n body: JSON.stringify(data),\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n\n return {\n success: true,\n data: await response.json(),\n };\n } catch (error) {\n throw new Error(\"Failed to update resource\");\n }\n}\n\nexport async function deleteResource(\n config: BaseAPIConfig,\n id: string\n): Promise<ActionResponse<void>> {\n try {\n const headers = generateHeaders(config);\n\n const response = await fetch(`${config.baseUrl}${config.route}/${id}`, {\n method: \"DELETE\",\n headers,\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n\n return {\n success: true,\n };\n } catch (error) {\n throw new Error(\"Failed to delete resource\");\n }\n}\n"],"mappings":";AACA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAGxB,eAAsB,iBAAiB,OAAiB,SAAkB;AACxE,QAAM,cAAc,MAAM,QAAQ;AAElC,MAAI,CAAC,SAAS;AACZ,QAAI,iBAAiB,WAAW,EAAE,SAAS;AAC3C,UAAM,mBAAmB,YAAY,IAAI,kBAAkB;AAE3D,QAAI,CAAC,oBAAoB,OAAO;AAC9B,kBAAY,IAAI,oBAAoB,cAAc;AAAA,IACpD,OAAO;AACL,uBAAiB,iBAAiB;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,mBAAqC,CAAC;AAC1C,QAAM,wBAAwB,YAAY,IAAI,mBAAmB;AAEjE,MAAI,uBAAuB;AACzB,QAAI;AACF,YAAM,eAAe,mBAAmB,sBAAsB,KAAK;AACnE,yBAAmB,KAAK,MAAM,YAAY;AAAA,IAC5C,SAAS,GAAG;AACV,cAAQ,MAAM,uCAAuC,CAAC;AACtD,yBAAmB,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB,OAAO,KAAK,OAAO;AACvC,qBAAiB,OAAO,IAAI,WAAW,EAAE,SAAS;AAAA,EACpD;AAEA,cAAY,IAAI,qBAAqB,KAAK,UAAU,gBAAgB,CAAC;AAErE,SAAO,iBAAiB,OAAO;AACjC;;;ACFO,SAAS,gBAAgB,QAAoC;AAClE,QAAM,UAAuB;AAAA,IAC3B,gBAAgB;AAAA,EAClB;AAEA,MAAI,OAAO,OAAO;AAChB,YAAQ,eAAe,IAAI,UAAU,OAAO,KAAK;AAAA,EACnD;AAEA,MAAI,OAAO,SAAS;AAClB,WAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,cAAQ,GAAG,IAAI;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,QAA8B;AAC1D,MAAI;AACF,UAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAC5C,WAAO,cAAc,KAAK,KAAK,KAAK,CAAC;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACjDA,eAAsB,eACpB,QACA,SACoC;AACpC,MAAI;AACF,UAAM,UAAU,gBAAgB,MAAM;AAEtC,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK,IAAI;AAAA,MAC/D,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,OAAO;AAAA,IACT,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS,MAAM,WAAW,mBAAmB,SAAS,MAAM;AAAA,UAC5D,MAAM,SAAS,OAAO,SAAS;AAAA,UAC/B,SAAS;AAAA,YACP,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,MAAM,SAAS,KAAK;AAAA,IAC5B;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACF;AAEA,eAAsB,aACpB,QACA,IAC4B;AAC5B,MAAI;AACF,UAAM,UAAU,gBAAgB,MAAM;AACtC,UAAM,MAAM,KACR,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK,IAAI,EAAE,KACtC,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK;AAEpC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS,MAAM,WAAW,mBAAmB,SAAS,MAAM;AAAA,UAC5D,MAAM,SAAS,OAAO,SAAS;AAAA,UAC/B,SAAS;AAAA,YACP,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,MAAM,SAAS,KAAK;AAAA,QAC1B,aAAa,eAAe;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,SAAS,YAAY;AAE/C,QAAI,aAAa,SAAS,cAAc,KAAK,cAAc,WAAW,GAAG;AACvE,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,MAAM,SAAS,KAAK;AAAA,MAC1B,aAAa,eAAe;AAAA,IAC9B;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,eAAsB,eACpB,QACA,IACA,MAC4B;AAC5B,MAAI;AACF,UAAM,UAAU,gBAAgB,MAAM;AAEtC,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK,IAAI,EAAE,IAAI;AAAA,MACrE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,OAAO;AAAA,IACT,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS,MAAM,WAAW,mBAAmB,SAAS,MAAM;AAAA,UAC5D,MAAM,SAAS,OAAO,SAAS;AAAA,UAC/B,SAAS;AAAA,YACP,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,MAAM,SAAS,KAAK;AAAA,IAC5B;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACF;AAEA,eAAsB,eACpB,QACA,IAC+B;AAC/B,MAAI;AACF,UAAM,UAAU,gBAAgB,MAAM;AAEtC,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,GAAG,OAAO,KAAK,IAAI,EAAE,IAAI;AAAA,MACrE,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS,MAAM,WAAW,mBAAmB,SAAS,MAAM;AAAA,UAC5D,MAAM,SAAS,OAAO,SAAS;AAAA,UAC/B,SAAS;AAAA,YACP,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/actions/alquimia.action.ts","../../src/utils/utils.ts","../../src/actions/baseApi.action.ts","../../src/actions/chat.action.ts","../../src/actions/apm.action.ts"],"sourcesContent":["'use server'\nimport { randomUUID } from \"crypto\";\nimport { cookies } from \"next/headers\";\nimport { ConversationsMap } from \"../types/type\";\n\nexport async function initConversation(reset?: boolean, topicId?: string) {\n const cookieStore = await cookies();\n\n if (!topicId) {\n let conversationId = randomUUID().toString();\n const alquimia_session = cookieStore.get(\"alquimia-session\");\n\n if (!alquimia_session || reset) {\n cookieStore.set(\"alquimia-session\", conversationId);\n } else {\n conversationId = alquimia_session.value;\n }\n\n return conversationId;\n }\n\n let conversationsMap: ConversationsMap = {};\n const existingConversations = cookieStore.get(\"alquimia-sessions\");\n \n if (existingConversations) {\n try {\n const decodedValue = decodeURIComponent(existingConversations.value);\n conversationsMap = JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n conversationsMap = {};\n }\n }\n\n if (!conversationsMap[topicId] || reset) {\n conversationsMap[topicId] = randomUUID().toString();\n }\n\n cookieStore.set(\"alquimia-sessions\", JSON.stringify(conversationsMap));\n \n return conversationsMap[topicId];\n}","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\"use server\";\nimport { BaseAPIConfig } from \"../types/type\";\nimport { generateHeaders, isTextContent } from \"../utils\";\n\ninterface ActionResponse<T = void> {\n success: boolean;\n data?: T;\n contentType?: string;\n error?: {\n message: string;\n code?: string;\n details?: any;\n };\n}\n\nexport async function createResource<TResponse, TPayload>(\n config: BaseAPIConfig,\n payload: TPayload\n): Promise<ActionResponse<TResponse>> {\n try {\n const headers = generateHeaders(config);\n\n const response = await fetch(`${config.baseUrl}${config.route}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n \n return {\n success: true,\n data: await response.json(),\n };\n } catch (error) {\n throw new Error(\"Failed to create resource\");\n }\n}\n\nexport async function readResource<T>(\n config: BaseAPIConfig,\n id?: string\n): Promise<ActionResponse<T>> {\n try {\n const headers = generateHeaders(config);\n const url = id\n ? `${config.baseUrl}${config.route}/${id}`\n : `${config.baseUrl}${config.route}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n return {\n success: true,\n data: await response.json(),\n contentType: contentType || undefined,\n };\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (contentType?.includes(\"octet-stream\") && isTextContent(arrayBuffer)) {\n return {\n success: true,\n data: arrayBuffer as T,\n contentType: \"text/plain\",\n };\n }\n\n return {\n success: true,\n data: await response.json(),\n contentType: contentType || undefined,\n };\n } catch (error) {\n throw new Error(\"Failed to read resource\");\n }\n}\n\nexport async function updateResource<T>(\n config: BaseAPIConfig,\n id: string,\n data: T\n): Promise<ActionResponse<T>> {\n try {\n const headers = generateHeaders(config);\n\n const response = await fetch(`${config.baseUrl}${config.route}/${id}`, {\n method: \"PUT\",\n headers,\n body: JSON.stringify(data),\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n\n return {\n success: true,\n data: await response.json(),\n };\n } catch (error) {\n throw new Error(\"Failed to update resource\");\n }\n}\n\nexport async function deleteResource(\n config: BaseAPIConfig,\n id: string\n): Promise<ActionResponse<void>> {\n try {\n const headers = generateHeaders(config);\n\n const response = await fetch(`${config.baseUrl}${config.route}/${id}`, {\n method: \"DELETE\",\n headers,\n cache: \"default\",\n });\n\n if (!response.ok) {\n const error = await response.json();\n return {\n success: false,\n error: {\n message: error.message || `Server returned ${response.status}`,\n code: response.status.toString(),\n details: {\n status: response.status,\n statusText: response.statusText,\n },\n },\n };\n }\n\n return {\n success: true,\n };\n } catch (error) {\n throw new Error(\"Failed to delete resource\");\n }\n}\n","import { NextResponse } from \"next/server\";\nimport { headers } from \"next/headers\";\n\nexport type ChatRouteContext = {\n params: {\n path: string[];\n };\n};\n\nexport type ChatRequestConfig = {\n assistantBaseUrl: string;\n apiKey: string;\n};\n\nexport type ChatResponse = Response | any;\n\nexport async function handleChatRequest(\n request: Request,\n context: ChatRouteContext,\n config: ChatRequestConfig\n): Promise<ChatResponse> {\n try {\n const headersList = await headers();\n const body = await request.json();\n const routeParams = await context.params;\n const routePath = routeParams.path.join(\"/\");\n\n const assistantUrl = `${config.assistantBaseUrl}/infer/${routePath}`;\n\n const response = await fetch(assistantUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...headersList,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorJson = await response.json();\n console.error(\"Chat inference server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n\n return NextResponse.json(\n {\n error:\n errorJson.message ||\n response.statusText ||\n \"Failed to forward Chat data\",\n },\n { status: response.status }\n );\n }\n\n return new NextResponse(response.body, {\n status: 200,\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Content-Encoding\",\n },\n });\n } catch (error) {\n return NextResponse.json(\n { error: \"Failed to forward Chat data\" },\n { status: 500 }\n );\n }\n}\n\nexport async function handleStreamRequest(\n request: Request,\n context: ChatRouteContext,\n config: ChatRequestConfig\n): Promise<Response> {\n try {\n const headersList = await headers();\n const routeParams = context.params;\n const path = routeParams.path.join(\"/\");\n\n const streamUrl = `${config.assistantBaseUrl}/stream/${path}`;\n\n const response = await fetch(streamUrl, {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...Object.fromEntries(headersList.entries()),\n },\n });\n\n if (!response.ok) {\n const errorJson = await response.json();\n console.error(\"Stream server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n\n return new Response(\n JSON.stringify({\n error:\n errorJson.message ||\n response.statusText ||\n \"Failed to forward Stream data\",\n }),\n { status: response.status }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"Stream error:\", error);\n return new Response(\n JSON.stringify({ error: \"Failed to forward stream data\" }),\n { status: 500 }\n );\n }\n}\n\n","import { headers } from \"next/headers\";\n\nexport type ApmRequestConfig = {\n apmServerUrl: string;\n};\n\nexport async function handleApmRequest(\n request: Request,\n config: ApmRequestConfig\n): Promise<Response> {\n try {\n const headersList = await headers();\n const body = await request.arrayBuffer();\n\n const apmUrl = `${config.apmServerUrl}/intake/v2/rum/events`;\n\n const response = await fetch(apmUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-ndjson\",\n Accept: \"*/*\",\n \"Content-Encoding\": \"gzip\",\n \"User-Agent\": \"elastic-apm-rum/5.15.0\",\n },\n body: body,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(\"APM server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorText,\n });\n throw new Error(\n `APM server responded with ${response.status}: ${errorText}`\n );\n }\n\n return new Response(null, {\n status: 200,\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Content-Encoding\",\n },\n });\n } catch (error) {\n console.error(\"APM proxy error:\", error);\n return new Response(\n JSON.stringify({ error: \"Failed to forward APM data\" }),\n { status: 500 }\n );\n }\n}\n"],"mappings":"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","names":["headers","headers","headers"]}
|
package/dist/hooks/index.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { Message } from 'ai';
|
|
3
|
-
import {
|
|
3
|
+
import { AlquimiaSDK } from '../sdk/index.mjs';
|
|
4
4
|
import { AIMessageChunk, RatingData } from '../types/index.mjs';
|
|
5
5
|
import { createMessageId } from '../utils/index.mjs';
|
|
6
|
+
import '../providers-D6FJ6tlA.mjs';
|
|
6
7
|
import '@elastic/apm-rum';
|
|
7
8
|
|
|
8
9
|
declare function useAlquimia(sdk: AlquimiaSDK): {
|
|
@@ -12,14 +13,12 @@ declare function useAlquimia(sdk: AlquimiaSDK): {
|
|
|
12
13
|
handleInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
13
14
|
handleReplaceInput: (input: string) => void;
|
|
14
15
|
handleSubmit: (event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) => Promise<void>;
|
|
15
|
-
handleSaveCharacterization: (translation: Record<string, any>) => Promise<void>;
|
|
16
16
|
handleLoadingCancel: () => void;
|
|
17
17
|
input: string;
|
|
18
18
|
isLoading: boolean;
|
|
19
19
|
isMessageStreaming: boolean;
|
|
20
20
|
streamingMessageId: string | null;
|
|
21
21
|
isAudioRecording: boolean;
|
|
22
|
-
shouldShowCharacterizationButton: boolean;
|
|
23
22
|
lastRequest: string | null;
|
|
24
23
|
messageMetaData: any;
|
|
25
24
|
messages: (Message & {
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { Message } from 'ai';
|
|
3
|
-
import {
|
|
3
|
+
import { AlquimiaSDK } from '../sdk/index.js';
|
|
4
4
|
import { AIMessageChunk, RatingData } from '../types/index.js';
|
|
5
5
|
import { createMessageId } from '../utils/index.js';
|
|
6
|
+
import '../providers-D6FJ6tlA.js';
|
|
6
7
|
import '@elastic/apm-rum';
|
|
7
8
|
|
|
8
9
|
declare function useAlquimia(sdk: AlquimiaSDK): {
|
|
@@ -12,14 +13,12 @@ declare function useAlquimia(sdk: AlquimiaSDK): {
|
|
|
12
13
|
handleInputChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
13
14
|
handleReplaceInput: (input: string) => void;
|
|
14
15
|
handleSubmit: (event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) => Promise<void>;
|
|
15
|
-
handleSaveCharacterization: (translation: Record<string, any>) => Promise<void>;
|
|
16
16
|
handleLoadingCancel: () => void;
|
|
17
17
|
input: string;
|
|
18
18
|
isLoading: boolean;
|
|
19
19
|
isMessageStreaming: boolean;
|
|
20
20
|
streamingMessageId: string | null;
|
|
21
21
|
isAudioRecording: boolean;
|
|
22
|
-
shouldShowCharacterizationButton: boolean;
|
|
23
22
|
lastRequest: string | null;
|
|
24
23
|
messageMetaData: any;
|
|
25
24
|
messages: (Message & {
|
package/dist/hooks/index.js
CHANGED
|
@@ -26,9 +26,6 @@ __export(hooks_exports, {
|
|
|
26
26
|
module.exports = __toCommonJS(hooks_exports);
|
|
27
27
|
|
|
28
28
|
// src/hooks/alquimia.hook.tsx
|
|
29
|
-
var import_react2 = require("react");
|
|
30
|
-
|
|
31
|
-
// src/context/session-context.tsx
|
|
32
29
|
var import_react = require("react");
|
|
33
30
|
|
|
34
31
|
// src/utils/utils.ts
|
|
@@ -60,51 +57,24 @@ function createMessageId() {
|
|
|
60
57
|
return Math.floor(Math.random() * 1e6).toString();
|
|
61
58
|
}
|
|
62
59
|
|
|
63
|
-
// src/context/session-context.tsx
|
|
64
|
-
var import_idb = require("idb");
|
|
65
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
66
|
-
var initialState = {
|
|
67
|
-
sessionId: null,
|
|
68
|
-
characterizationData: null
|
|
69
|
-
};
|
|
70
|
-
var AlquimiaContext = (0, import_react.createContext)(null);
|
|
71
|
-
var useSessionContext = () => {
|
|
72
|
-
const context = (0, import_react.useContext)(AlquimiaContext);
|
|
73
|
-
if (!context) {
|
|
74
|
-
console.warn("useSessionContext must be used within a session provider. Returning default value.");
|
|
75
|
-
return {
|
|
76
|
-
userSessionState: initialState,
|
|
77
|
-
saveUserSession: null
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
return context;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
60
|
// src/hooks/alquimia.hook.tsx
|
|
84
61
|
function useAlquimia(sdk) {
|
|
85
|
-
const [chunkReceived, setChunkReceived] = (0,
|
|
86
|
-
const [currentMessageIdChuncked, setCurrentMessageIdChuncked] = (0,
|
|
87
|
-
const [input, setInput] = (0,
|
|
88
|
-
const [isLoading, setIsLoading] = (0,
|
|
89
|
-
const [isMessageStreaming, setIsMessageStreaming] = (0,
|
|
90
|
-
const [streamingMessageId, setStreamingMessageId] = (0,
|
|
91
|
-
const [isAudioRecording, setIsAudioRecording] = (0,
|
|
92
|
-
const [messageMetaData, setMessageMetaData] = (0,
|
|
93
|
-
const [messages, setMessages] = (0,
|
|
94
|
-
const [sessionId, setSessionId] = (0,
|
|
95
|
-
const [activeTool, setActiveTool] = (0,
|
|
96
|
-
const [lastRequest, setLastRequest] = (0,
|
|
97
|
-
|
|
98
|
-
const shouldShowCharacterizationButton = sdk.getEnforceCharacterization() && !userSessionState?.characterizationData;
|
|
99
|
-
(0, import_react2.useEffect)(() => {
|
|
62
|
+
const [chunkReceived, setChunkReceived] = (0, import_react.useState)("");
|
|
63
|
+
const [currentMessageIdChuncked, setCurrentMessageIdChuncked] = (0, import_react.useState)("");
|
|
64
|
+
const [input, setInput] = (0, import_react.useState)("");
|
|
65
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(false);
|
|
66
|
+
const [isMessageStreaming, setIsMessageStreaming] = (0, import_react.useState)(false);
|
|
67
|
+
const [streamingMessageId, setStreamingMessageId] = (0, import_react.useState)(null);
|
|
68
|
+
const [isAudioRecording, setIsAudioRecording] = (0, import_react.useState)(false);
|
|
69
|
+
const [messageMetaData, setMessageMetaData] = (0, import_react.useState)(null);
|
|
70
|
+
const [messages, setMessages] = (0, import_react.useState)([]);
|
|
71
|
+
const [sessionId, setSessionId] = (0, import_react.useState)(null);
|
|
72
|
+
const [activeTool, setActiveTool] = (0, import_react.useState)(null);
|
|
73
|
+
const [lastRequest, setLastRequest] = (0, import_react.useState)(null);
|
|
74
|
+
(0, import_react.useEffect)(() => {
|
|
100
75
|
if (chunkReceived)
|
|
101
76
|
processMessageChunk(currentMessageIdChuncked, chunkReceived);
|
|
102
77
|
}, [chunkReceived]);
|
|
103
|
-
(0, import_react2.useEffect)(() => {
|
|
104
|
-
if (userSessionState?.characterizationData && sdk.getEnforceCharacterization()) {
|
|
105
|
-
sdk.withExtraData(userSessionState?.characterizationData);
|
|
106
|
-
}
|
|
107
|
-
}, [userSessionState]);
|
|
108
78
|
function cleanMessages() {
|
|
109
79
|
setMessages([]);
|
|
110
80
|
}
|
|
@@ -205,6 +175,17 @@ function useAlquimia(sdk) {
|
|
|
205
175
|
setLastRequest(message);
|
|
206
176
|
const response = await sdk.widthConversationId(conversationId || "").sendMessage(message, traceParentId);
|
|
207
177
|
const es = new EventSource(response.getUrlStream());
|
|
178
|
+
es.onerror = (event) => {
|
|
179
|
+
console.error("EventSource error:", event);
|
|
180
|
+
callBack({
|
|
181
|
+
type: "error",
|
|
182
|
+
error_code: "EVENT_SOURCE_ERROR",
|
|
183
|
+
error_detail: "Stream server error occurred"
|
|
184
|
+
});
|
|
185
|
+
setIsMessageStreaming(false);
|
|
186
|
+
setStreamingMessageId(null);
|
|
187
|
+
es.close();
|
|
188
|
+
};
|
|
208
189
|
es.onmessage = (event) => {
|
|
209
190
|
const parsedData = JSON.parse(event.data);
|
|
210
191
|
if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {
|
|
@@ -228,11 +209,6 @@ function useAlquimia(sdk) {
|
|
|
228
209
|
}
|
|
229
210
|
};
|
|
230
211
|
}
|
|
231
|
-
async function handleSaveCharacterization(translation) {
|
|
232
|
-
const conversationId = getCookie("alquimia-session");
|
|
233
|
-
if (!conversationId || !saveUserSession) return;
|
|
234
|
-
saveUserSession(conversationId, translation);
|
|
235
|
-
}
|
|
236
212
|
return {
|
|
237
213
|
activeTool,
|
|
238
214
|
cleanMessages,
|
|
@@ -240,14 +216,12 @@ function useAlquimia(sdk) {
|
|
|
240
216
|
handleInputChange,
|
|
241
217
|
handleReplaceInput,
|
|
242
218
|
handleSubmit,
|
|
243
|
-
handleSaveCharacterization,
|
|
244
219
|
handleLoadingCancel,
|
|
245
220
|
input,
|
|
246
221
|
isLoading,
|
|
247
222
|
isMessageStreaming,
|
|
248
223
|
streamingMessageId,
|
|
249
224
|
isAudioRecording,
|
|
250
|
-
shouldShowCharacterizationButton,
|
|
251
225
|
lastRequest,
|
|
252
226
|
messageMetaData,
|
|
253
227
|
messages,
|
|
@@ -263,8 +237,8 @@ function useAlquimia(sdk) {
|
|
|
263
237
|
}
|
|
264
238
|
|
|
265
239
|
// src/hooks/useRatings.ts
|
|
266
|
-
var
|
|
267
|
-
var
|
|
240
|
+
var import_react2 = require("react");
|
|
241
|
+
var initialState = {
|
|
268
242
|
ratingStars: 0,
|
|
269
243
|
ratingThumbs: "",
|
|
270
244
|
ratingComment: ""
|
|
@@ -282,9 +256,9 @@ function ratingReducer(state, action) {
|
|
|
282
256
|
}
|
|
283
257
|
}
|
|
284
258
|
function useRatings({ assistantId, sendRating, topicId }) {
|
|
285
|
-
const [isLoading, setIsLoading] = (0,
|
|
286
|
-
const [hasReviewed, setHasReviewed] = (0,
|
|
287
|
-
const [state, dispatch] = (0,
|
|
259
|
+
const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
|
|
260
|
+
const [hasReviewed, setHasReviewed] = (0, import_react2.useState)(false);
|
|
261
|
+
const [state, dispatch] = (0, import_react2.useReducer)(ratingReducer, initialState);
|
|
288
262
|
const setRatingStars = (rating) => {
|
|
289
263
|
dispatch({ type: "SET_RATING_STARS", payload: rating });
|
|
290
264
|
};
|
|
@@ -336,9 +310,4 @@ function useRatings({ assistantId, sendRating, topicId }) {
|
|
|
336
310
|
hasReviewed
|
|
337
311
|
};
|
|
338
312
|
}
|
|
339
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
340
|
-
0 && (module.exports = {
|
|
341
|
-
useAlquimia,
|
|
342
|
-
useRatings
|
|
343
|
-
});
|
|
344
313
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/alquimia.hook.tsx","../../src/context/session-context.tsx","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","import { Message } from \"ai\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlquimiaSDK } from \"../sdk\";\nimport { AIMessageChunk } from \"../types/type\";\nimport { useSessionContext } from \"../context/session-context\";\nimport { createMessageId } from \"../utils\";\nexport function useAlquimia(sdk: AlquimiaSDK) {\n const [chunkReceived, setChunkReceived] = useState<string>(\"\");\n const [currentMessageIdChuncked, setCurrentMessageIdChuncked] =\n useState<string>(\"\");\n const [input, setInput] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messageMetaData, setMessageMetaData] = useState<any>(null);\n const [messages, setMessages] = useState<\n (Message & { error_code?: string; error_detail?: string })[]\n >([]);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n const { userSessionState, saveUserSession } = useSessionContext();\n\n const shouldShowCharacterizationButton =\n sdk.getEnforceCharacterization() && !userSessionState?.characterizationData;\n\n useEffect(() => {\n if (chunkReceived)\n processMessageChunk(currentMessageIdChuncked, chunkReceived);\n }, [chunkReceived]);\n\n useEffect(() => {\n if (\n userSessionState?.characterizationData &&\n sdk.getEnforceCharacterization()\n ) {\n sdk.withExtraData(userSessionState?.characterizationData);\n }\n }, [userSessionState]);\n\n function cleanMessages() {\n setMessages([]);\n }\n async function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n additionalInfo?: string\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex(\n (message) => message.id === messageId\n );\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n\n const updatedMessage: Message & {\n error_code?: string;\n created_at?: string;\n error_detail?: string;\n additionalInfo?: string;\n } = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || \"\"}${chunk}`,\n id: updatedMessages[messageIndex]?.id || \"\",\n role: updatedMessages[messageIndex]?.role || \"assistant\",\n error_code,\n error_detail,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: \"assistant\",\n id: messageId,\n error_code,\n error_detail,\n created_at: new Date().getTime().toString(),\n },\n ];\n }\n });\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) {\n setIsLoading(true);\n event.preventDefault();\n \n if (input) {\n addUserMessage(input);\n const messageId = createMessageId();\n setCurrentMessageIdChuncked(messageId);\n setStreamingMessageId(messageId);\n await sendMessage(input, (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.data?.content || \"\",\n chunk?.error_code,\n chunk?.error_detail,\n additionalInfo\n );\n }, traceParentId, sessionId);\n setInput(\"\");\n }\n setIsLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: Message[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n setIsLoading(false);\n setIsMessageStreaming(false);\n setInput(\"\");\n }\n\n function addUserMessage(message: string) {\n setMessages((prevMessages: Message[]) => [\n ...prevMessages,\n {\n content: message,\n role: \"user\",\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(\";\");\n for (let cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split(\"=\");\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n const conversationId = sessionId || getCookie(\"alquimia-session\");\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n const response = await sdk.widthConversationId(conversationId || \"\").sendMessage(message, traceParentId);\n \n const es = new EventSource(response.getUrlStream())\n es.onmessage = (event: any) => {\n const parsedData = JSON.parse(event.data);\n\n if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {\n setActiveTool({\n tooler: parsedData.tooler,\n });\n }\n\n if (parsedData.error_code) {\n callBack({\n type: \"error\",\n error_code: parsedData.error_code,\n error_detail: parsedData.error_detail,\n });\n }\n\n if (parsedData.is_complete) {\n setIsMessageStreaming(false);\n setStreamingMessageId(null)\n es.close();\n } else {\n callBack(parsedData.answer);\n }\n };\n }\n\n async function handleSaveCharacterization(translation: Record<string, any>) {\n const conversationId = getCookie(\"alquimia-session\");\n if (!conversationId || !saveUserSession) return;\n saveUserSession(conversationId, translation);\n }\n\n return {\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSaveCharacterization,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageStreaming,\n streamingMessageId,\n isAudioRecording,\n shouldShowCharacterizationButton,\n lastRequest,\n messageMetaData,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n };\n}\n","import React, { createContext, useContext, useEffect, useReducer, ReactNode } from 'react';\nimport { characterizationReducer, CharacterizationState, CharacterizationAction } from '../reducer/characterization-reducer';\nimport { getCookies } from '../utils/utils';\nimport { openDB, IDBPDatabase } from 'idb';\n\ninterface SessionProviderProps {\n children: ReactNode;\n}\n\ninterface AlquimiaContextType {\n getSessionData: () => CharacterizationState;\n userSessionState?: CharacterizationState;\n saveUserSession: (id: string, data: any) => Promise<void>;\n}\n\nconst initialState: CharacterizationState = {\n sessionId: null,\n characterizationData: null,\n};\n\nconst AlquimiaContext = createContext<AlquimiaContextType | null>(null);\n\nexport const useSessionContext = () => {\n const context = useContext(AlquimiaContext);\n if (!context) {\n console.warn(\"useSessionContext must be used within a session provider. Returning default value.\");\n return {\n userSessionState: initialState,\n saveUserSession: null,\n };\n }\n return context;\n};\n\nexport const SessionProvider: React.FC<SessionProviderProps> = ({ children }) => {\n const [userSessionState, sessionDispatch] = useReducer(characterizationReducer, initialState);\n\n useEffect(() => {\n getSession();\n }, []);\n \n const getSession = async () => {\n const userCookie = await getCookies('alquimia-session') || '';\n \n const db = await openDB('alquimiaDB', 1, {\n upgrade(db: IDBPDatabase) {\n if (!db.objectStoreNames.contains('session')) {\n db.createObjectStore('session', { keyPath: 'key' });\n }\n },\n });\n \n const sessionIdEntry = await db.get('session', 'sessionId');\n const characterizationDataEntry = await db.get('session', 'characterizationData');\n const sessionDataMatchesCookie = sessionIdEntry?.value === userCookie;\n\n if (sessionIdEntry && characterizationDataEntry && sessionDataMatchesCookie) {\n sessionDispatch({\n type: 'SET_SESSION',\n payload: {\n sessionId: sessionIdEntry.value,\n characterizationData: characterizationDataEntry.value,\n },\n });\n }\n };\n\n const saveUserSession = async (id: string, data: any) => {\n const db = await openDB('alquimiaDB', 1);\n await db.put('session', { key: 'sessionId', value: id });\n await db.put('session', { key: 'characterizationData', value: data });\n\n sessionDispatch({\n type: 'SET_SESSION',\n payload: { sessionId: id, characterizationData: data },\n });\n };\n\n const getSessionData = () => {\n return userSessionState;\n }\n\n return (\n <AlquimiaContext.Provider value={{ userSessionState, getSessionData, saveUserSession }}>\n {children}\n </AlquimiaContext.Provider>\n );\n};","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["import_react","sessionId","input","messages","import_react","initialState"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/alquimia.hook.tsx","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","import { Message } from \"ai\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlquimiaSDK } from \"../sdk\";\nimport { AIMessageChunk } from \"../types/type\";\nimport { createMessageId } from \"../utils\";\nexport function useAlquimia(sdk: AlquimiaSDK) {\n const [chunkReceived, setChunkReceived] = useState<string>(\"\");\n const [currentMessageIdChuncked, setCurrentMessageIdChuncked] =\n useState<string>(\"\");\n const [input, setInput] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messageMetaData, setMessageMetaData] = useState<any>(null);\n const [messages, setMessages] = useState<\n (Message & { error_code?: string; error_detail?: string })[]\n >([]);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n\n\n useEffect(() => {\n if (chunkReceived)\n processMessageChunk(currentMessageIdChuncked, chunkReceived);\n }, [chunkReceived]);\n\n\n function cleanMessages() {\n setMessages([]);\n }\n async function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n additionalInfo?: string\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex(\n (message) => message.id === messageId\n );\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n\n const updatedMessage: Message & {\n error_code?: string;\n created_at?: string;\n error_detail?: string;\n additionalInfo?: string;\n } = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || \"\"}${chunk}`,\n id: updatedMessages[messageIndex]?.id || \"\",\n role: updatedMessages[messageIndex]?.role || \"assistant\",\n error_code,\n error_detail,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: \"assistant\",\n id: messageId,\n error_code,\n error_detail,\n created_at: new Date().getTime().toString(),\n },\n ];\n }\n });\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) {\n setIsLoading(true);\n event.preventDefault();\n \n if (input) {\n addUserMessage(input);\n const messageId = createMessageId();\n setCurrentMessageIdChuncked(messageId);\n setStreamingMessageId(messageId);\n await sendMessage(input, (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.data?.content || \"\",\n chunk?.error_code,\n chunk?.error_detail,\n additionalInfo\n );\n }, traceParentId, sessionId);\n setInput(\"\");\n }\n setIsLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: Message[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n setIsLoading(false);\n setIsMessageStreaming(false);\n setInput(\"\");\n }\n\n function addUserMessage(message: string) {\n setMessages((prevMessages: Message[]) => [\n ...prevMessages,\n {\n content: message,\n role: \"user\",\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(\";\");\n for (let cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split(\"=\");\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n const conversationId = sessionId || getCookie(\"alquimia-session\");\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n const response = await sdk.widthConversationId(conversationId || \"\").sendMessage(message, traceParentId);\n \n const es = new EventSource(response.getUrlStream());\n\n es.onerror = (event) => {\n console.error(\"EventSource error:\", event);\n callBack({\n type: \"error\",\n error_code: \"EVENT_SOURCE_ERROR\",\n error_detail: \"Stream server error occurred\",\n });\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n es.close();\n };\n \n es.onmessage = (event: any) => {\n const parsedData = JSON.parse(event.data);\n\n if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {\n setActiveTool({\n tooler: parsedData.tooler,\n });\n }\n\n if (parsedData.error_code) {\n callBack({\n type: \"error\",\n error_code: parsedData.error_code,\n error_detail: parsedData.error_detail,\n });\n }\n\n if (parsedData.is_complete) {\n setIsMessageStreaming(false);\n setStreamingMessageId(null)\n es.close();\n } else {\n callBack(parsedData.answer);\n }\n };\n }\n\n return {\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageStreaming,\n streamingMessageId,\n isAudioRecording,\n lastRequest,\n messageMetaData,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n };\n}\n","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["sessionId","input","messages","import_react"]}
|
package/dist/hooks/index.mjs
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
// src/hooks/alquimia.hook.tsx
|
|
2
|
-
import { useEffect
|
|
3
|
-
|
|
4
|
-
// src/context/session-context.tsx
|
|
5
|
-
import { createContext, useContext, useEffect, useReducer } from "react";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
6
3
|
|
|
7
4
|
// src/utils/utils.ts
|
|
8
5
|
function getCookies(name) {
|
|
@@ -33,26 +30,6 @@ function createMessageId() {
|
|
|
33
30
|
return Math.floor(Math.random() * 1e6).toString();
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
// src/context/session-context.tsx
|
|
37
|
-
import { openDB } from "idb";
|
|
38
|
-
import { jsx } from "react/jsx-runtime";
|
|
39
|
-
var initialState = {
|
|
40
|
-
sessionId: null,
|
|
41
|
-
characterizationData: null
|
|
42
|
-
};
|
|
43
|
-
var AlquimiaContext = createContext(null);
|
|
44
|
-
var useSessionContext = () => {
|
|
45
|
-
const context = useContext(AlquimiaContext);
|
|
46
|
-
if (!context) {
|
|
47
|
-
console.warn("useSessionContext must be used within a session provider. Returning default value.");
|
|
48
|
-
return {
|
|
49
|
-
userSessionState: initialState,
|
|
50
|
-
saveUserSession: null
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
return context;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
33
|
// src/hooks/alquimia.hook.tsx
|
|
57
34
|
function useAlquimia(sdk) {
|
|
58
35
|
const [chunkReceived, setChunkReceived] = useState("");
|
|
@@ -67,17 +44,10 @@ function useAlquimia(sdk) {
|
|
|
67
44
|
const [sessionId, setSessionId] = useState(null);
|
|
68
45
|
const [activeTool, setActiveTool] = useState(null);
|
|
69
46
|
const [lastRequest, setLastRequest] = useState(null);
|
|
70
|
-
|
|
71
|
-
const shouldShowCharacterizationButton = sdk.getEnforceCharacterization() && !userSessionState?.characterizationData;
|
|
72
|
-
useEffect2(() => {
|
|
47
|
+
useEffect(() => {
|
|
73
48
|
if (chunkReceived)
|
|
74
49
|
processMessageChunk(currentMessageIdChuncked, chunkReceived);
|
|
75
50
|
}, [chunkReceived]);
|
|
76
|
-
useEffect2(() => {
|
|
77
|
-
if (userSessionState?.characterizationData && sdk.getEnforceCharacterization()) {
|
|
78
|
-
sdk.withExtraData(userSessionState?.characterizationData);
|
|
79
|
-
}
|
|
80
|
-
}, [userSessionState]);
|
|
81
51
|
function cleanMessages() {
|
|
82
52
|
setMessages([]);
|
|
83
53
|
}
|
|
@@ -178,6 +148,17 @@ function useAlquimia(sdk) {
|
|
|
178
148
|
setLastRequest(message);
|
|
179
149
|
const response = await sdk.widthConversationId(conversationId || "").sendMessage(message, traceParentId);
|
|
180
150
|
const es = new EventSource(response.getUrlStream());
|
|
151
|
+
es.onerror = (event) => {
|
|
152
|
+
console.error("EventSource error:", event);
|
|
153
|
+
callBack({
|
|
154
|
+
type: "error",
|
|
155
|
+
error_code: "EVENT_SOURCE_ERROR",
|
|
156
|
+
error_detail: "Stream server error occurred"
|
|
157
|
+
});
|
|
158
|
+
setIsMessageStreaming(false);
|
|
159
|
+
setStreamingMessageId(null);
|
|
160
|
+
es.close();
|
|
161
|
+
};
|
|
181
162
|
es.onmessage = (event) => {
|
|
182
163
|
const parsedData = JSON.parse(event.data);
|
|
183
164
|
if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {
|
|
@@ -201,11 +182,6 @@ function useAlquimia(sdk) {
|
|
|
201
182
|
}
|
|
202
183
|
};
|
|
203
184
|
}
|
|
204
|
-
async function handleSaveCharacterization(translation) {
|
|
205
|
-
const conversationId = getCookie("alquimia-session");
|
|
206
|
-
if (!conversationId || !saveUserSession) return;
|
|
207
|
-
saveUserSession(conversationId, translation);
|
|
208
|
-
}
|
|
209
185
|
return {
|
|
210
186
|
activeTool,
|
|
211
187
|
cleanMessages,
|
|
@@ -213,14 +189,12 @@ function useAlquimia(sdk) {
|
|
|
213
189
|
handleInputChange,
|
|
214
190
|
handleReplaceInput,
|
|
215
191
|
handleSubmit,
|
|
216
|
-
handleSaveCharacterization,
|
|
217
192
|
handleLoadingCancel,
|
|
218
193
|
input,
|
|
219
194
|
isLoading,
|
|
220
195
|
isMessageStreaming,
|
|
221
196
|
streamingMessageId,
|
|
222
197
|
isAudioRecording,
|
|
223
|
-
shouldShowCharacterizationButton,
|
|
224
198
|
lastRequest,
|
|
225
199
|
messageMetaData,
|
|
226
200
|
messages,
|
|
@@ -236,8 +210,8 @@ function useAlquimia(sdk) {
|
|
|
236
210
|
}
|
|
237
211
|
|
|
238
212
|
// src/hooks/useRatings.ts
|
|
239
|
-
import { useState as useState2, useReducer
|
|
240
|
-
var
|
|
213
|
+
import { useState as useState2, useReducer } from "react";
|
|
214
|
+
var initialState = {
|
|
241
215
|
ratingStars: 0,
|
|
242
216
|
ratingThumbs: "",
|
|
243
217
|
ratingComment: ""
|
|
@@ -257,7 +231,7 @@ function ratingReducer(state, action) {
|
|
|
257
231
|
function useRatings({ assistantId, sendRating, topicId }) {
|
|
258
232
|
const [isLoading, setIsLoading] = useState2(false);
|
|
259
233
|
const [hasReviewed, setHasReviewed] = useState2(false);
|
|
260
|
-
const [state, dispatch] =
|
|
234
|
+
const [state, dispatch] = useReducer(ratingReducer, initialState);
|
|
261
235
|
const setRatingStars = (rating) => {
|
|
262
236
|
dispatch({ type: "SET_RATING_STARS", payload: rating });
|
|
263
237
|
};
|
package/dist/hooks/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/alquimia.hook.tsx","../../src/context/session-context.tsx","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["import { Message } from \"ai\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlquimiaSDK } from \"../sdk\";\nimport { AIMessageChunk } from \"../types/type\";\nimport { useSessionContext } from \"../context/session-context\";\nimport { createMessageId } from \"../utils\";\nexport function useAlquimia(sdk: AlquimiaSDK) {\n const [chunkReceived, setChunkReceived] = useState<string>(\"\");\n const [currentMessageIdChuncked, setCurrentMessageIdChuncked] =\n useState<string>(\"\");\n const [input, setInput] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messageMetaData, setMessageMetaData] = useState<any>(null);\n const [messages, setMessages] = useState<\n (Message & { error_code?: string; error_detail?: string })[]\n >([]);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n const { userSessionState, saveUserSession } = useSessionContext();\n\n const shouldShowCharacterizationButton =\n sdk.getEnforceCharacterization() && !userSessionState?.characterizationData;\n\n useEffect(() => {\n if (chunkReceived)\n processMessageChunk(currentMessageIdChuncked, chunkReceived);\n }, [chunkReceived]);\n\n useEffect(() => {\n if (\n userSessionState?.characterizationData &&\n sdk.getEnforceCharacterization()\n ) {\n sdk.withExtraData(userSessionState?.characterizationData);\n }\n }, [userSessionState]);\n\n function cleanMessages() {\n setMessages([]);\n }\n async function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n additionalInfo?: string\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex(\n (message) => message.id === messageId\n );\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n\n const updatedMessage: Message & {\n error_code?: string;\n created_at?: string;\n error_detail?: string;\n additionalInfo?: string;\n } = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || \"\"}${chunk}`,\n id: updatedMessages[messageIndex]?.id || \"\",\n role: updatedMessages[messageIndex]?.role || \"assistant\",\n error_code,\n error_detail,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: \"assistant\",\n id: messageId,\n error_code,\n error_detail,\n created_at: new Date().getTime().toString(),\n },\n ];\n }\n });\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) {\n setIsLoading(true);\n event.preventDefault();\n \n if (input) {\n addUserMessage(input);\n const messageId = createMessageId();\n setCurrentMessageIdChuncked(messageId);\n setStreamingMessageId(messageId);\n await sendMessage(input, (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.data?.content || \"\",\n chunk?.error_code,\n chunk?.error_detail,\n additionalInfo\n );\n }, traceParentId, sessionId);\n setInput(\"\");\n }\n setIsLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: Message[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n setIsLoading(false);\n setIsMessageStreaming(false);\n setInput(\"\");\n }\n\n function addUserMessage(message: string) {\n setMessages((prevMessages: Message[]) => [\n ...prevMessages,\n {\n content: message,\n role: \"user\",\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(\";\");\n for (let cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split(\"=\");\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n const conversationId = sessionId || getCookie(\"alquimia-session\");\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n const response = await sdk.widthConversationId(conversationId || \"\").sendMessage(message, traceParentId);\n \n const es = new EventSource(response.getUrlStream())\n es.onmessage = (event: any) => {\n const parsedData = JSON.parse(event.data);\n\n if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {\n setActiveTool({\n tooler: parsedData.tooler,\n });\n }\n\n if (parsedData.error_code) {\n callBack({\n type: \"error\",\n error_code: parsedData.error_code,\n error_detail: parsedData.error_detail,\n });\n }\n\n if (parsedData.is_complete) {\n setIsMessageStreaming(false);\n setStreamingMessageId(null)\n es.close();\n } else {\n callBack(parsedData.answer);\n }\n };\n }\n\n async function handleSaveCharacterization(translation: Record<string, any>) {\n const conversationId = getCookie(\"alquimia-session\");\n if (!conversationId || !saveUserSession) return;\n saveUserSession(conversationId, translation);\n }\n\n return {\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSaveCharacterization,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageStreaming,\n streamingMessageId,\n isAudioRecording,\n shouldShowCharacterizationButton,\n lastRequest,\n messageMetaData,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n };\n}\n","import React, { createContext, useContext, useEffect, useReducer, ReactNode } from 'react';\nimport { characterizationReducer, CharacterizationState, CharacterizationAction } from '../reducer/characterization-reducer';\nimport { getCookies } from '../utils/utils';\nimport { openDB, IDBPDatabase } from 'idb';\n\ninterface SessionProviderProps {\n children: ReactNode;\n}\n\ninterface AlquimiaContextType {\n getSessionData: () => CharacterizationState;\n userSessionState?: CharacterizationState;\n saveUserSession: (id: string, data: any) => Promise<void>;\n}\n\nconst initialState: CharacterizationState = {\n sessionId: null,\n characterizationData: null,\n};\n\nconst AlquimiaContext = createContext<AlquimiaContextType | null>(null);\n\nexport const useSessionContext = () => {\n const context = useContext(AlquimiaContext);\n if (!context) {\n console.warn(\"useSessionContext must be used within a session provider. Returning default value.\");\n return {\n userSessionState: initialState,\n saveUserSession: null,\n };\n }\n return context;\n};\n\nexport const SessionProvider: React.FC<SessionProviderProps> = ({ children }) => {\n const [userSessionState, sessionDispatch] = useReducer(characterizationReducer, initialState);\n\n useEffect(() => {\n getSession();\n }, []);\n \n const getSession = async () => {\n const userCookie = await getCookies('alquimia-session') || '';\n \n const db = await openDB('alquimiaDB', 1, {\n upgrade(db: IDBPDatabase) {\n if (!db.objectStoreNames.contains('session')) {\n db.createObjectStore('session', { keyPath: 'key' });\n }\n },\n });\n \n const sessionIdEntry = await db.get('session', 'sessionId');\n const characterizationDataEntry = await db.get('session', 'characterizationData');\n const sessionDataMatchesCookie = sessionIdEntry?.value === userCookie;\n\n if (sessionIdEntry && characterizationDataEntry && sessionDataMatchesCookie) {\n sessionDispatch({\n type: 'SET_SESSION',\n payload: {\n sessionId: sessionIdEntry.value,\n characterizationData: characterizationDataEntry.value,\n },\n });\n }\n };\n\n const saveUserSession = async (id: string, data: any) => {\n const db = await openDB('alquimiaDB', 1);\n await db.put('session', { key: 'sessionId', value: id });\n await db.put('session', { key: 'characterizationData', value: data });\n\n sessionDispatch({\n type: 'SET_SESSION',\n payload: { sessionId: id, characterizationData: data },\n });\n };\n\n const getSessionData = () => {\n return userSessionState;\n }\n\n return (\n <AlquimiaContext.Provider value={{ userSessionState, getSessionData, saveUserSession }}>\n {children}\n </AlquimiaContext.Provider>\n );\n};","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["useEffect","useEffect","sessionId","input","messages","useState","useReducer","initialState","useState","useReducer"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/alquimia.hook.tsx","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["import { Message } from \"ai\";\n\nimport { useEffect, useState } from \"react\";\nimport { AlquimiaSDK } from \"../sdk\";\nimport { AIMessageChunk } from \"../types/type\";\nimport { createMessageId } from \"../utils\";\nexport function useAlquimia(sdk: AlquimiaSDK) {\n const [chunkReceived, setChunkReceived] = useState<string>(\"\");\n const [currentMessageIdChuncked, setCurrentMessageIdChuncked] =\n useState<string>(\"\");\n const [input, setInput] = useState<string>(\"\");\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isMessageStreaming, setIsMessageStreaming] = useState<boolean>(false);\n const [streamingMessageId, setStreamingMessageId] = useState<string | null>(null);\n const [isAudioRecording, setIsAudioRecording] = useState<boolean>(false);\n const [messageMetaData, setMessageMetaData] = useState<any>(null);\n const [messages, setMessages] = useState<\n (Message & { error_code?: string; error_detail?: string })[]\n >([]);\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [activeTool, setActiveTool] = useState<any | null>(null);\n const [lastRequest, setLastRequest] = useState<string | null>(null);\n\n\n useEffect(() => {\n if (chunkReceived)\n processMessageChunk(currentMessageIdChuncked, chunkReceived);\n }, [chunkReceived]);\n\n\n function cleanMessages() {\n setMessages([]);\n }\n async function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n additionalInfo?: string\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex(\n (message) => message.id === messageId\n );\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n\n const updatedMessage: Message & {\n error_code?: string;\n created_at?: string;\n error_detail?: string;\n additionalInfo?: string;\n } = {\n ...updatedMessages[messageIndex],\n content: `${updatedMessages[messageIndex]?.content || \"\"}${chunk}`,\n id: updatedMessages[messageIndex]?.id || \"\",\n role: updatedMessages[messageIndex]?.role || \"assistant\",\n error_code,\n error_detail,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n };\n updatedMessages[messageIndex] = updatedMessage;\n return updatedMessages;\n } else {\n return [\n ...currentMessages,\n {\n content: `${chunk}`,\n role: \"assistant\",\n id: messageId,\n error_code,\n error_detail,\n created_at: new Date().getTime().toString(),\n },\n ];\n }\n });\n }\n\n async function handleSubmit(event: React.FormEvent<HTMLFormElement>, traceParentId?: string, sessionId?: string, additionalInfo?: string) {\n setIsLoading(true);\n event.preventDefault();\n \n if (input) {\n addUserMessage(input);\n const messageId = createMessageId();\n setCurrentMessageIdChuncked(messageId);\n setStreamingMessageId(messageId);\n await sendMessage(input, (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.data?.content || \"\",\n chunk?.error_code,\n chunk?.error_detail,\n additionalInfo\n );\n }, traceParentId, sessionId);\n setInput(\"\");\n }\n setIsLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLInputElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: Message[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n setIsLoading(false);\n setIsMessageStreaming(false);\n setInput(\"\");\n }\n\n function addUserMessage(message: string) {\n setMessages((prevMessages: Message[]) => [\n ...prevMessages,\n {\n content: message,\n role: \"user\",\n id: createMessageId(),\n created_at: new Date().getTime().toString(),\n },\n ]);\n }\n\n function getCookie(name: string): string | null {\n const cookies = document.cookie.split(\";\");\n for (let cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split(\"=\");\n if (cookieName === name) {\n return decodeURIComponent(cookieValue as string);\n }\n }\n return null;\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n const conversationId = sessionId || getCookie(\"alquimia-session\");\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n const response = await sdk.widthConversationId(conversationId || \"\").sendMessage(message, traceParentId);\n \n const es = new EventSource(response.getUrlStream());\n\n es.onerror = (event) => {\n console.error(\"EventSource error:\", event);\n callBack({\n type: \"error\",\n error_code: \"EVENT_SOURCE_ERROR\",\n error_detail: \"Stream server error occurred\",\n });\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n es.close();\n };\n \n es.onmessage = (event: any) => {\n const parsedData = JSON.parse(event.data);\n\n if (parsedData.tooler && parsedData.tooler.length > 0 && !activeTool) {\n setActiveTool({\n tooler: parsedData.tooler,\n });\n }\n\n if (parsedData.error_code) {\n callBack({\n type: \"error\",\n error_code: parsedData.error_code,\n error_detail: parsedData.error_detail,\n });\n }\n\n if (parsedData.is_complete) {\n setIsMessageStreaming(false);\n setStreamingMessageId(null)\n es.close();\n } else {\n callBack(parsedData.answer);\n }\n };\n }\n\n return {\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageStreaming,\n streamingMessageId,\n isAudioRecording,\n lastRequest,\n messageMetaData,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n };\n}\n","import { BaseAPIConfig, ApiError, ConversationsMap } from \"../types/type\";\n\nexport function generateTranslatePrompt(text: string) {\n const prompt = `\n Arrange the following text according to the given object structure and return it as plain json, values summarized to one word, no formatting:\n {\n restrictions: {\n value: [''],\n description: 'Restrictions to certain foods'\n },\n alergies: {\n value: [''],\n description: 'Alergies to certain foods'\n },\n wine_preference: {\n value: [''],\n description: 'Preferences for the wine'\n },\n meal_preference: {\n value: [''],\n description: 'Preferences for the meal'\n }\n }\n\n Text: \"${text}\"\n\n Output:\n `;\n\n return prompt;\n}\n\nexport function getCookies(name: string) {\n if (typeof document === 'undefined') return undefined;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(\";\").shift();\n}\n\nexport function generateHeaders(config: BaseAPIConfig): HeadersInit {\n const headers: HeadersInit = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n }\n\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n headers[key] = value;\n });\n }\n\n return headers;\n}\n\nexport function isTextContent(buffer: ArrayBuffer): boolean {\n try {\n const text = new TextDecoder().decode(buffer);\n return /^[\\w\\#\\-\\*]/.test(text.trim());\n } catch {\n return false;\n }\n}\n\nexport function getQueryParam(param: string): string | null {\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param);\n }\n return null;\n}\n\nexport function defineAssistantId(defaultId: string): string {\n if (typeof window !== 'undefined' && window.location.pathname === '/') {\n const queryAssistantId = getQueryParam('talkwith');\n if (queryAssistantId) {\n localStorage.setItem('assistantId', queryAssistantId);\n return queryAssistantId;\n }\n const storedAssistantId = localStorage.getItem('assistantId');\n return storedAssistantId || defaultId;\n }\n return defaultId;\n}\n\nexport function formatTimeWithUnit(timeMs: number): string {\n if (timeMs >= 1000) {\n return `${(timeMs / 1000).toFixed(1)}s`;\n }\n return `${Math.round(timeMs)}ms`;\n};\n\nexport function serializeAxiosError(error: unknown){\n if (error instanceof Error) {\n const customError = error as ApiError;\n return {\n message: customError?.message, \n name: customError?.name,\n stack: customError?.stack,\n code: customError?.code,\n status: customError?.status,\n };\n }\n return {\n message: String(error),\n name: 'Unknown Error',\n };\n};\n\nexport function parseConversationsMapCookie(cookieValue: string): ConversationsMap {\n try {\n const decodedValue = decodeURIComponent(cookieValue);\n return JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error('Error parsing conversations cookie:', e);\n return {};\n }\n}\n\nexport function getTopicSessionId(topicId: string): string {\n const conversationsStr = getCookies(\"alquimia-sessions\") || \"{}\";\n if (!conversationsStr) {\n const sessionCookie = getCookies(\"alquimia-session\");\n return sessionCookie || \"\";\n }\n\n const conversationsMap = parseConversationsMapCookie(conversationsStr);\n return conversationsMap[topicId] || \"\";\n}\n\nexport function createMessageId() {\n return Math.floor(Math.random() * 1000000).toString();\n}\n\n\n","\nimport { useState, useReducer } from \"react\";\nimport { RatingData } from \"../types/type\";\nimport { getTopicSessionId } from \"../utils/utils\";\n\ninterface RatingState {\n ratingStars: number;\n ratingThumbs: \"thumbsUp\" | \"thumbsDown\" | \"\";\n ratingComment: string;\n}\n\ntype RatingAction =\n | { type: \"SET_RATING_STARS\"; payload: number }\n | { type: \"SET_RATING_THUMBS\"; payload: \"thumbsUp\" | \"thumbsDown\" | \"\" }\n | { type: \"SET_RATING_COMMENT\"; payload: string };\n\nconst initialState: RatingState = {\n ratingStars: 0,\n ratingThumbs: \"\",\n ratingComment: \"\",\n};\n\nfunction ratingReducer(state: RatingState, action: RatingAction): RatingState {\n switch (action.type) {\n case \"SET_RATING_STARS\":\n return { ...state, ratingStars: action.payload };\n case \"SET_RATING_THUMBS\":\n return { ...state, ratingThumbs: action.payload };\n case \"SET_RATING_COMMENT\":\n return { ...state, ratingComment: action.payload };\n default:\n return state;\n }\n}\n\ninterface UseRatingsParams {\n assistantId: string;\n topicId: string;\n sendRating: (ratingData: RatingData) => Promise<any>;\n onError?: (componentName: string, error: Error) => void;\n}\n\n\nexport function useRatings({ assistantId, sendRating, topicId }: UseRatingsParams) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [hasReviewed, setHasReviewed] = useState<boolean>(false);\n const [state, dispatch] = useReducer(ratingReducer, initialState);\n\n const setRatingStars = (rating: number) => {\n dispatch({ type: \"SET_RATING_STARS\", payload: rating });\n };\n\n const setRatingThumbs = (rating: \"thumbsUp\" | \"thumbsDown\" | \"\") => {\n dispatch({ type: \"SET_RATING_THUMBS\", payload: rating });\n };\n\n const setRatingComment = (comment: string) => {\n dispatch({ type: \"SET_RATING_COMMENT\", payload: comment });\n };\n\n const thumbsScore = (value: string) => {\n return value === \"thumbsUp\" ? 5 : value === \"thumbsDown\" ? 0 : 0;\n }\n\n const handleRate = async (key: string, value: any | string, onHandleRateSuccess: (success: boolean, err?: string) => void) => {\n setIsLoading(true);\n const sessionId = getTopicSessionId(topicId);\n\n const ratingObj: RatingData = {\n topicId: parseInt(topicId),\n sessionId: sessionId || \"\",\n assistantId: assistantId,\n score: key === \"score\" ? value : thumbsScore(value),\n description: key === \"description\" ? value : state.ratingComment,\n };\n\n try {\n const response = await sendRating(ratingObj);\n if (!response.success) {\n setIsLoading(false);\n onHandleRateSuccess(false, response.error.message);\n return;\n }\n \n if (key === \"score\") {\n setRatingStars(value);\n } else if (key === \"description\") {\n setRatingComment(value);\n }\n setHasReviewed(true);\n setIsLoading(false);\n onHandleRateSuccess(true);\n } catch (err) {\n setIsLoading(false);\n onHandleRateSuccess(false, String(err));\n }\n };\n\n return {\n handleRate,\n ratingStars: state.ratingStars,\n ratingThumbs: state.ratingThumbs,\n ratingComment: state.ratingComment,\n isLoading,\n hasReviewed\n };\n}\n"],"mappings":"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","names":["sessionId","input","messages","useState","useState"]}
|