@alquimia-ai/tools 2.0.1 → 2.1.0
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 +2 -7
- package/dist/actions/index.d.ts +2 -7
- package/dist/actions/index.js +10 -8
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/index.mjs +10 -8
- package/dist/actions/index.mjs.map +1 -1
- package/dist/adapters/fetch.d.mts +1 -1
- package/dist/adapters/fetch.d.ts +1 -1
- package/dist/adapters/fetch.js +3 -3
- package/dist/adapters/fetch.js.map +1 -1
- package/dist/adapters/fetch.mjs +3 -3
- package/dist/adapters/fetch.mjs.map +1 -1
- package/dist/adapters/index.d.mts +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/next.d.mts +1 -1
- package/dist/adapters/next.d.ts +1 -1
- package/dist/adapters/next.js +4 -4
- package/dist/adapters/next.js.map +1 -1
- package/dist/adapters/next.mjs +4 -4
- package/dist/adapters/next.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 +77 -45
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +77 -45
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/next/index.d.mts +6 -9
- package/dist/next/index.d.ts +6 -9
- package/dist/next/index.js +69 -64
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +69 -64
- package/dist/next/index.mjs.map +1 -1
- package/dist/proxy.d.mts +2 -2
- package/dist/proxy.d.ts +2 -2
- package/dist/proxy.js +32 -9
- package/dist/proxy.js.map +1 -1
- package/dist/proxy.mjs +32 -9
- package/dist/proxy.mjs.map +1 -1
- package/dist/sdk/index.d.mts +15 -7
- package/dist/sdk/index.d.ts +15 -7
- package/dist/sdk/index.js +45 -26
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/index.mjs +45 -26
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/session.action-DirvOWt0.d.mts +3 -0
- package/dist/session.action-DirvOWt0.d.ts +3 -0
- package/dist/types/index.d.mts +79 -18
- package/dist/types/index.d.ts +79 -18
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/hooks/index.js
CHANGED
|
@@ -44,12 +44,11 @@ var AlquimiaSDK = class {
|
|
|
44
44
|
constructor(assistantId, adapter, options = {}) {
|
|
45
45
|
this.conversationId = null;
|
|
46
46
|
this.sessionId = null;
|
|
47
|
+
// Internal subscription id from infer (`taskid` on the wire).
|
|
47
48
|
this.streamId = null;
|
|
48
|
-
this.evaluationStrategy = null;
|
|
49
49
|
this.tools = [];
|
|
50
|
-
this.
|
|
50
|
+
this.extraInstructions = null;
|
|
51
51
|
this.assistantConfig = null;
|
|
52
|
-
this.forceProfile = {};
|
|
53
52
|
this.userId = null;
|
|
54
53
|
this.attachments = [];
|
|
55
54
|
this.attachmentResponses = [];
|
|
@@ -115,12 +114,8 @@ var AlquimiaSDK = class {
|
|
|
115
114
|
this.tools = tools;
|
|
116
115
|
return this;
|
|
117
116
|
}
|
|
118
|
-
|
|
119
|
-
this.
|
|
120
|
-
return this;
|
|
121
|
-
}
|
|
122
|
-
withForceProfile(forceProfile) {
|
|
123
|
-
this.forceProfile = forceProfile;
|
|
117
|
+
withExtraInstructions(extraInstructions) {
|
|
118
|
+
this.extraInstructions = extraInstructions;
|
|
124
119
|
return this;
|
|
125
120
|
}
|
|
126
121
|
withAssistantConfig(assistantConfig) {
|
|
@@ -134,9 +129,6 @@ var AlquimiaSDK = class {
|
|
|
134
129
|
getEnforceCharacterization() {
|
|
135
130
|
return this.enforceCharacterization ?? true;
|
|
136
131
|
}
|
|
137
|
-
getEvaluationStrategy() {
|
|
138
|
-
return this.evaluationStrategy;
|
|
139
|
-
}
|
|
140
132
|
textToSpeech(text) {
|
|
141
133
|
if (!this.whisperProvider) {
|
|
142
134
|
throw new Error("Whisper provider not initialized");
|
|
@@ -157,25 +149,29 @@ var AlquimiaSDK = class {
|
|
|
157
149
|
}
|
|
158
150
|
const inferUrl = this.adapter.resolveInferUrl(this.assistantId);
|
|
159
151
|
const adapterHeaders = this.adapter.getHeaders?.() ?? {};
|
|
152
|
+
const hasClientTools = Array.isArray(this.tools) && this.tools.length > 0;
|
|
160
153
|
const initMessage = {
|
|
161
154
|
query,
|
|
162
155
|
session_id: this.conversationId,
|
|
163
|
-
...this.extraData && { extra_data: this.extraData },
|
|
164
|
-
force_profile: this.forceProfile,
|
|
165
|
-
...this.assistantConfig && { config: this.assistantConfig },
|
|
166
|
-
tools: this.tools,
|
|
167
156
|
user_id: this.userId,
|
|
168
|
-
|
|
157
|
+
...this.extraInstructions && { extra_instructions: this.extraInstructions },
|
|
158
|
+
...this.assistantConfig && { config: this.assistantConfig },
|
|
159
|
+
...hasClientTools && {
|
|
160
|
+
evaluation_strategy: {
|
|
161
|
+
evaluation_strategy_id: "native",
|
|
162
|
+
tool_schemas: this.tools
|
|
163
|
+
}
|
|
164
|
+
}
|
|
169
165
|
};
|
|
170
166
|
const result = (await this.axiosInstance.post(inferUrl, initMessage, {
|
|
171
167
|
headers: {
|
|
172
168
|
"Content-Type": "application/json",
|
|
173
169
|
"x-trace-parent": traceParent || "",
|
|
174
|
-
...adapterHeaders
|
|
170
|
+
...adapterHeaders,
|
|
171
|
+
...this.buildIdentityHeaders()
|
|
175
172
|
}
|
|
176
173
|
})).data;
|
|
177
|
-
this.
|
|
178
|
-
this.streamId = result.stream_id;
|
|
174
|
+
this.streamId = result.taskid ?? null;
|
|
179
175
|
this.attachmentResponses = result.attachments ?? [];
|
|
180
176
|
this.attachments = [];
|
|
181
177
|
return this;
|
|
@@ -210,21 +206,40 @@ var AlquimiaSDK = class {
|
|
|
210
206
|
}
|
|
211
207
|
return this.loggerProvider.logError(message, error, data);
|
|
212
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* @deprecated The runtime no longer returns attachment IDs from the infer
|
|
211
|
+
* response — attachments are uploaded as standalone blobs and linked to the
|
|
212
|
+
* session via headers. Always returns `[]`; kept for source compatibility.
|
|
213
|
+
*/
|
|
213
214
|
getAttachmentResponses() {
|
|
214
215
|
return this.attachmentResponses;
|
|
215
216
|
}
|
|
216
|
-
async uploadAttachment(file,
|
|
217
|
-
|
|
218
|
-
throw new Error("Stream or attachment ID not initialized");
|
|
219
|
-
}
|
|
220
|
-
const url = this.adapter.resolveAttachmentUrl(this.streamId, attachmentId);
|
|
217
|
+
async uploadAttachment(file, _attachmentId) {
|
|
218
|
+
const url = this.adapter.resolveBlobUploadUrl();
|
|
221
219
|
const adapterHeaders = this.adapter.getHeaders?.() ?? {};
|
|
222
220
|
const formData = new FormData();
|
|
223
221
|
formData.append("file", file);
|
|
224
222
|
await this.axiosInstance.post(url, formData, {
|
|
225
|
-
headers: {
|
|
223
|
+
headers: {
|
|
224
|
+
"Content-Type": "multipart/form-data",
|
|
225
|
+
...adapterHeaders,
|
|
226
|
+
...this.buildIdentityHeaders()
|
|
227
|
+
}
|
|
226
228
|
});
|
|
227
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Identity headers (kebab-case) required by `/context/blob/upload` and
|
|
232
|
+
* the rest of the runtime's internal endpoints introduced in v0.2.0→next.
|
|
233
|
+
*/
|
|
234
|
+
buildIdentityHeaders() {
|
|
235
|
+
const headers = {
|
|
236
|
+
"assistant-id": this.assistantId
|
|
237
|
+
};
|
|
238
|
+
if (this.conversationId) headers["session-id"] = this.conversationId;
|
|
239
|
+
if (this.userId) headers["user-id"] = this.userId;
|
|
240
|
+
if (this.streamId) headers["task-id"] = this.streamId;
|
|
241
|
+
return headers;
|
|
242
|
+
}
|
|
228
243
|
getUrlStream() {
|
|
229
244
|
if (!this.streamId) {
|
|
230
245
|
throw new Error("Stream ID not initialized. Call sendMessage() first");
|
|
@@ -234,6 +249,10 @@ var AlquimiaSDK = class {
|
|
|
234
249
|
getStreamId() {
|
|
235
250
|
return this.streamId;
|
|
236
251
|
}
|
|
252
|
+
/** Alias for {@link getStreamId} — same value as infer `taskid`. */
|
|
253
|
+
getTaskId() {
|
|
254
|
+
return this.streamId;
|
|
255
|
+
}
|
|
237
256
|
};
|
|
238
257
|
var alquimia_sdk_default = AlquimiaSDK;
|
|
239
258
|
|
|
@@ -331,7 +350,7 @@ function useAlquimia(config) {
|
|
|
331
350
|
if (config.providers?.ratings) instance.withRatingsProvider(config.providers.ratings);
|
|
332
351
|
if (config.providers?.logger) instance.withLoggerProvider(config.providers.logger);
|
|
333
352
|
if (config.options?.userId) instance.withUserId(config.options.userId);
|
|
334
|
-
if (config.options?.
|
|
353
|
+
if (config.options?.extraInstructions) instance.withExtraInstructions(config.options.extraInstructions);
|
|
335
354
|
return instance;
|
|
336
355
|
}, [config.assistantId, config.adapter]);
|
|
337
356
|
const [input, setInput] = (0, import_react.useState)("");
|
|
@@ -342,10 +361,10 @@ function useAlquimia(config) {
|
|
|
342
361
|
const [isAudioRecording, setIsAudioRecording] = (0, import_react.useState)(false);
|
|
343
362
|
const [messages, setMessages] = (0, import_react.useState)([]);
|
|
344
363
|
const eventSourceRef = (0, import_react.useRef)(null);
|
|
364
|
+
const streamUserCancelledRef = (0, import_react.useRef)(false);
|
|
345
365
|
const [sessionId, setSessionId] = (0, import_react.useState)(null);
|
|
346
366
|
const [activeTool, setActiveTool] = (0, import_react.useState)(null);
|
|
347
367
|
const [lastRequest, setLastRequest] = (0, import_react.useState)(null);
|
|
348
|
-
const [evaluationStrategy, setEvaluationStrategy] = (0, import_react.useState)("");
|
|
349
368
|
const [hasThinkings, setHasThinkings] = (0, import_react.useState)(false);
|
|
350
369
|
const [attachments, setAttachments] = (0, import_react.useState)([]);
|
|
351
370
|
const [isUploadingAttachments, setIsUploadingAttachments] = (0, import_react.useState)(false);
|
|
@@ -366,7 +385,7 @@ function useAlquimia(config) {
|
|
|
366
385
|
function clearAttachments() {
|
|
367
386
|
setAttachments([]);
|
|
368
387
|
}
|
|
369
|
-
function processMessageChunk(messageId, chunk, error_code, error_detail,
|
|
388
|
+
function processMessageChunk(messageId, chunk, error_code, error_detail, taskid, additionalInfo, loading, tooler, thinkings) {
|
|
370
389
|
setMessages((currentMessages) => {
|
|
371
390
|
const messageIndex = currentMessages.findIndex((message) => message?.id === messageId);
|
|
372
391
|
if (messageIndex !== -1) {
|
|
@@ -378,7 +397,7 @@ function useAlquimia(config) {
|
|
|
378
397
|
role: updatedMessages[messageIndex]?.role || "assistant",
|
|
379
398
|
error_code,
|
|
380
399
|
error_detail,
|
|
381
|
-
|
|
400
|
+
taskid,
|
|
382
401
|
additionalInfo,
|
|
383
402
|
created_at: (/* @__PURE__ */ new Date()).getTime().toString(),
|
|
384
403
|
loading,
|
|
@@ -399,7 +418,7 @@ function useAlquimia(config) {
|
|
|
399
418
|
id: messageId,
|
|
400
419
|
error_code,
|
|
401
420
|
error_detail,
|
|
402
|
-
|
|
421
|
+
taskid,
|
|
403
422
|
created_at: (/* @__PURE__ */ new Date()).getTime().toString(),
|
|
404
423
|
loading,
|
|
405
424
|
tooler: mergeToolEvents([], tooler),
|
|
@@ -421,7 +440,7 @@ function useAlquimia(config) {
|
|
|
421
440
|
chunk?.answer || "",
|
|
422
441
|
chunk?.error_code,
|
|
423
442
|
chunk?.error_detail,
|
|
424
|
-
chunk?.
|
|
443
|
+
chunk?.taskid,
|
|
425
444
|
options?.additionalInfo,
|
|
426
445
|
chunk?.loading,
|
|
427
446
|
chunk?.tooler,
|
|
@@ -461,6 +480,7 @@ function useAlquimia(config) {
|
|
|
461
480
|
setMessages(messages2);
|
|
462
481
|
}
|
|
463
482
|
function handleLoadingCancel() {
|
|
483
|
+
streamUserCancelledRef.current = true;
|
|
464
484
|
eventSourceRef.current?.close();
|
|
465
485
|
eventSourceRef.current = null;
|
|
466
486
|
setIsMessageLoading(false);
|
|
@@ -542,6 +562,7 @@ function useAlquimia(config) {
|
|
|
542
562
|
}
|
|
543
563
|
const streamUrl = response.getUrlStream();
|
|
544
564
|
const streamId = response.getStreamId() || "";
|
|
565
|
+
streamUserCancelledRef.current = false;
|
|
545
566
|
const streamState = {
|
|
546
567
|
streamId,
|
|
547
568
|
connectedAt: Date.now(),
|
|
@@ -552,8 +573,6 @@ function useAlquimia(config) {
|
|
|
552
573
|
};
|
|
553
574
|
const eventSource = new EventSource(streamUrl);
|
|
554
575
|
eventSourceRef.current = eventSource;
|
|
555
|
-
const evaluationStrategy2 = response.getEvaluationStrategy();
|
|
556
|
-
setEvaluationStrategy(evaluationStrategy2);
|
|
557
576
|
eventSource.onopen = () => {
|
|
558
577
|
streamState.openedAt = Date.now();
|
|
559
578
|
};
|
|
@@ -564,23 +583,37 @@ function useAlquimia(config) {
|
|
|
564
583
|
};
|
|
565
584
|
eventSource.onerror = () => {
|
|
566
585
|
if (streamState.closedByClient) return;
|
|
586
|
+
if (streamUserCancelledRef.current) {
|
|
587
|
+
streamUserCancelledRef.current = false;
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
567
590
|
streamState.closedByClient = true;
|
|
568
591
|
const elapsed = Date.now() - streamState.connectedAt;
|
|
569
592
|
const sinceLastMessage = streamState.lastMessageAt ? Date.now() - streamState.lastMessageAt : null;
|
|
570
593
|
cleanup(false, eventSource);
|
|
571
594
|
let errorDetail;
|
|
572
595
|
if (!streamState.openedAt) {
|
|
573
|
-
errorDetail =
|
|
596
|
+
errorDetail = "Could not open the live response. Check your connection and try again.";
|
|
574
597
|
} else if (streamState.messagesReceived === 0) {
|
|
575
|
-
errorDetail =
|
|
598
|
+
errorDetail = "No response was received. Try again in a moment.";
|
|
576
599
|
} else {
|
|
577
|
-
errorDetail =
|
|
600
|
+
errorDetail = "The response was interrupted. Try again.";
|
|
601
|
+
}
|
|
602
|
+
if (typeof console !== "undefined" && console.debug) {
|
|
603
|
+
console.debug("[Alquimia] SSE transport error", {
|
|
604
|
+
streamUrl,
|
|
605
|
+
taskId: streamId,
|
|
606
|
+
opened: Boolean(streamState.openedAt),
|
|
607
|
+
messagesReceived: streamState.messagesReceived,
|
|
608
|
+
elapsedMs: elapsed,
|
|
609
|
+
sinceLastMessageMs: sinceLastMessage
|
|
610
|
+
});
|
|
578
611
|
}
|
|
579
612
|
callBack({
|
|
580
613
|
type: "error",
|
|
581
614
|
error_code: "STREAM_ERROR",
|
|
582
615
|
error_detail: errorDetail,
|
|
583
|
-
|
|
616
|
+
taskid: streamId
|
|
584
617
|
});
|
|
585
618
|
};
|
|
586
619
|
} catch (error) {
|
|
@@ -591,13 +624,14 @@ function useAlquimia(config) {
|
|
|
591
624
|
setStreamingMessageId(null);
|
|
592
625
|
callBack({
|
|
593
626
|
type: "error",
|
|
594
|
-
error_code: error.status
|
|
627
|
+
error_code: error.response?.status != null ? String(error.response.status) : "REQUEST_ERROR",
|
|
595
628
|
error_detail: errMessage
|
|
596
629
|
});
|
|
597
630
|
}
|
|
598
631
|
}
|
|
599
632
|
function handleMessageEvent(event, callBack, eventSource, streamState) {
|
|
600
633
|
const data = JSON.parse(event.data);
|
|
634
|
+
const eventTaskId = data.taskid || "";
|
|
601
635
|
if (data.errors?.length) {
|
|
602
636
|
for (const error of data.errors) {
|
|
603
637
|
const detail = error.error_detail || (error.data != null ? `${error.data} (controlId: ${error.control_id})` : "Unknown error");
|
|
@@ -605,7 +639,7 @@ function useAlquimia(config) {
|
|
|
605
639
|
type: "error",
|
|
606
640
|
error_code: error.event_class || error.status || "UNKNOWN_ERROR",
|
|
607
641
|
error_detail: detail,
|
|
608
|
-
|
|
642
|
+
taskid: eventTaskId
|
|
609
643
|
});
|
|
610
644
|
}
|
|
611
645
|
if (streamState) streamState.closedByClient = true;
|
|
@@ -619,10 +653,9 @@ function useAlquimia(config) {
|
|
|
619
653
|
setHasThinkings(true);
|
|
620
654
|
callBack({ type: "answer", thinkings: data.thinkings });
|
|
621
655
|
}
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
callBack({ type: "answer", answer: content });
|
|
656
|
+
if (data.event_class === "AssistantInferenceResponse") {
|
|
657
|
+
const final = data;
|
|
658
|
+
callBack({ type: "answer", answer: final.data });
|
|
626
659
|
if (streamState) streamState.closedByClient = true;
|
|
627
660
|
cleanup(false, eventSource);
|
|
628
661
|
}
|
|
@@ -654,7 +687,6 @@ function useAlquimia(config) {
|
|
|
654
687
|
setSessionId,
|
|
655
688
|
setLastRequest,
|
|
656
689
|
setIsAudioRecording,
|
|
657
|
-
evaluationStrategy,
|
|
658
690
|
hasThinkings,
|
|
659
691
|
attachments,
|
|
660
692
|
addAttachment,
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/alquimia.hook.tsx","../../src/sdk/alquimia-sdk.ts","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","import { useMemo, useRef, useState } from 'react';\nimport AlquimiaSDK from '../sdk/alquimia-sdk';\nimport type { AlquimiaAdapter } from '../adapters';\nimport {\n WhisperProvider,\n StableDiffusionProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport {\n AIMessageChunk,\n AlquimiaMessage,\n AlquimiaEventData,\n ToolEvent,\n} from '../types/type';\nimport { createMessageId, mergeThinkingsByControlId, mergeToolEvents } from '../utils';\n\nexport interface UseAlquimiaConfig {\n assistantId: string;\n adapter: AlquimiaAdapter;\n providers?: {\n whisper?: WhisperProvider;\n stableDiffusion?: StableDiffusionProvider;\n characterization?: CharacterizationProvider;\n ratings?: RatingsProvider;\n logger?: LoggerProvider;\n };\n options?: {\n enforceCharacterization?: boolean;\n userId?: string;\n extraData?: any;\n };\n}\n\nexport function useAlquimia(config: UseAlquimiaConfig) {\n const sdk = useMemo(() => {\n const instance = new AlquimiaSDK(config.assistantId, config.adapter, {\n enforceCharacterization: config.options?.enforceCharacterization,\n });\n\n if (config.providers?.whisper) instance.withWhisperProvider(config.providers.whisper);\n if (config.providers?.stableDiffusion) instance.withStableDiffusionProvider(config.providers.stableDiffusion);\n if (config.providers?.characterization) instance.withAnalyzeCharacterizationProvider(config.providers.characterization);\n if (config.providers?.ratings) instance.withRatingsProvider(config.providers.ratings);\n if (config.providers?.logger) instance.withLoggerProvider(config.providers.logger);\n if (config.options?.userId) instance.withUserId(config.options.userId);\n if (config.options?.extraData) instance.withExtraData(config.options.extraData);\n\n return instance;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.assistantId, config.adapter]);\n\n const [input, setInput] = useState<string>('');\n const [isMessageLoading, setIsMessageLoading] = useState<boolean>(false);\n const [isStreamingLoading, setIsStreamingLoading] = 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 [messages, setMessages] = useState<AlquimiaMessage[]>([]);\n const eventSourceRef = useRef<EventSource | null>(null);\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 [evaluationStrategy, setEvaluationStrategy] = useState<string>('');\n const [hasThinkings, setHasThinkings] = useState<boolean>(false);\n const [attachments, setAttachments] = useState<File[]>([]);\n const [isUploadingAttachments, setIsUploadingAttachments] = useState<boolean>(false);\n\n const isLoading = isMessageLoading || isStreamingLoading || isUploadingAttachments;\n\n function cleanMessages() {\n setMessages([]);\n setHasThinkings(false);\n }\n\n function addAttachment(file: File) {\n setAttachments((prev) => [...prev, file]);\n }\n\n function addAttachments(files: File[]) {\n setAttachments((prev) => [...prev, ...files]);\n }\n\n function removeAttachment(index: number) {\n setAttachments((prev) => prev.filter((_, i) => i !== index));\n }\n\n function clearAttachments() {\n setAttachments([]);\n }\n\n function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n stream_id?: string,\n additionalInfo?: string,\n loading?: boolean,\n tooler?: ToolEvent[],\n thinkings?: any[]\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex((message) => message?.id === messageId);\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n const updatedMessage: AlquimiaMessage = {\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 stream_id,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents(updatedMessages[messageIndex]?.tooler || [], tooler),\n thinkings: mergeThinkingsByControlId(\n updatedMessages[messageIndex]?.thinkings || [],\n thinkings || []\n ),\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 stream_id,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents([], tooler),\n thinkings,\n },\n ];\n }\n });\n }\n\n async function processAndSendMessage(\n message: string,\n options?: {\n messageType?: string;\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n }\n ) {\n addUserMessage(message, options?.messageType);\n\n const messageId = createMessageId();\n setStreamingMessageId(messageId);\n\n await sendMessage(\n message,\n (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.answer || '',\n chunk?.error_code,\n chunk?.error_detail,\n chunk?.stream_id,\n options?.additionalInfo,\n chunk?.loading,\n chunk?.tooler,\n chunk?.thinkings\n );\n },\n options?.traceParentId,\n options?.sessionId\n );\n\n setInput('');\n }\n\n async function handleSubmit(\n event: React.FormEvent<HTMLFormElement>,\n traceParentId?: string,\n sessionId?: string,\n additionalInfo?: string\n ) {\n setIsMessageLoading(true);\n event.preventDefault();\n\n if (input) {\n await processAndSendMessage(input, { traceParentId, sessionId, additionalInfo });\n }\n\n setIsMessageLoading(false);\n }\n\n async function handleSystemMessage(\n message: string,\n options?: {\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n messageType?: string;\n }\n ) {\n setIsMessageLoading(true);\n\n await processAndSendMessage(message, {\n messageType: options?.messageType || 'system',\n traceParentId: options?.traceParentId,\n sessionId: options?.sessionId,\n additionalInfo: options?.additionalInfo,\n });\n\n setIsMessageLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLTextAreaElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: AlquimiaMessage[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n eventSourceRef.current?.close();\n eventSourceRef.current = null;\n setIsMessageLoading(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n setIsUploadingAttachments(false);\n setInput('');\n }\n\n function addUserMessage(message: string, type?: string) {\n setMessages((prevMessages: AlquimiaMessage[]) => [\n ...prevMessages,\n {\n content: message,\n role: 'user',\n type: type,\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 (const 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 function cleanup(isStreaming: boolean, event: EventSource) {\n setIsMessageStreaming(isStreaming);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n event.close();\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n setIsStreamingLoading(true);\n callBack({ type: 'loading', loading: true });\n const conversationId = sessionId || getCookie('alquimia-session');\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n try {\n const hasAttachments = attachments.length > 0;\n const sdkCall = sdk.withConversationId(conversationId || '');\n\n if (hasAttachments) {\n sdkCall.withAttachments(\n attachments.map((f) => ({\n filename: f.name,\n content_type: f.type,\n content_size: f.size,\n }))\n );\n }\n\n const response = await sdkCall.sendMessage(message, traceParentId);\n\n if (hasAttachments) {\n setIsUploadingAttachments(true);\n try {\n const attachmentResponses = response.getAttachmentResponses();\n await Promise.all(\n attachments.map((file, i) => response.uploadAttachment(file, attachmentResponses[i]))\n );\n } catch (uploadError: any) {\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n callBack({\n type: 'error',\n error_code: 'ATTACHMENT_UPLOAD_ERROR',\n error_detail: uploadError.message || 'Failed to upload attachment',\n });\n return;\n }\n setIsUploadingAttachments(false);\n clearAttachments();\n }\n\n const streamUrl = response.getUrlStream();\n const streamId = response.getStreamId() || '';\n const streamState = {\n streamId,\n connectedAt: Date.now(),\n openedAt: null as number | null,\n messagesReceived: 0,\n lastMessageAt: null as number | null,\n closedByClient: false,\n };\n\n const eventSource = new EventSource(streamUrl);\n eventSourceRef.current = eventSource;\n const evaluationStrategy = response.getEvaluationStrategy()!;\n setEvaluationStrategy(evaluationStrategy);\n\n eventSource.onopen = () => {\n streamState.openedAt = Date.now();\n };\n\n eventSource.onmessage = (event) => {\n streamState.messagesReceived++;\n streamState.lastMessageAt = Date.now();\n handleMessageEvent(event, callBack, eventSource, streamState);\n };\n\n eventSource.onerror = () => {\n if (streamState.closedByClient) return;\n streamState.closedByClient = true;\n\n const elapsed = Date.now() - streamState.connectedAt;\n const sinceLastMessage = streamState.lastMessageAt\n ? Date.now() - streamState.lastMessageAt\n : null;\n\n cleanup(false, eventSource);\n\n let errorDetail: string;\n if (!streamState.openedAt) {\n errorDetail = `Stream failed to connect (after ${elapsed}ms). URL: ${streamUrl}`;\n } else if (streamState.messagesReceived === 0) {\n errorDetail = `Stream connected but received no messages before error (open for ${elapsed}ms).`;\n } else {\n errorDetail = `Stream dropped after ${streamState.messagesReceived} message(s), ${sinceLastMessage}ms since last message (total ${elapsed}ms). Possible timeout.`;\n }\n\n callBack({\n type: 'error',\n error_code: 'STREAM_ERROR',\n error_detail: errorDetail,\n stream_id: streamId,\n });\n };\n } catch (error: any) {\n console.error('Error sending message:', error);\n const errMessage =\n error.response?.data?.detail || error.message || 'Error initiating the stream.';\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n callBack({\n type: 'error',\n error_code: error.status?.toString() || 'REQUEST_ERROR',\n error_detail: errMessage,\n });\n }\n }\n\n function handleMessageEvent(\n event: MessageEvent,\n callBack: (chunk: AIMessageChunk) => void,\n eventSource: EventSource,\n streamState?: {\n streamId: string;\n closedByClient: boolean;\n messagesReceived: number;\n }\n ) {\n const data: AlquimiaEventData = JSON.parse(event.data);\n if (data.errors?.length) {\n for (const error of data.errors) {\n const detail =\n error.error_detail ||\n (error.data != null\n ? `${error.data} (controlId: ${error.control_id})`\n : 'Unknown error');\n callBack({\n type: 'error',\n error_code: error.event_class || error.status || 'UNKNOWN_ERROR',\n error_detail: detail,\n stream_id: data.stream_id || '',\n });\n }\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n return;\n }\n\n if (data.tools_output?.length) {\n callBack({ type: 'answer', answer: '', tooler: data.tools_output });\n }\n\n if (data.thinkings?.length) {\n setHasThinkings(true);\n callBack({ type: 'answer', thinkings: data.thinkings });\n }\n\n const response = data.response;\n const content =\n response?.event_class === 'AssistantInferenceResponse' && typeof response.data === 'string'\n ? response.data\n : null;\n\n if (content) {\n callBack({ type: 'answer', answer: content });\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n }\n }\n\n return {\n sdk,\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSystemMessage,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageLoading,\n isMessageStreaming,\n isStreamingLoading,\n streamingMessageId,\n isAudioRecording,\n lastRequest,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n evaluationStrategy,\n hasThinkings,\n attachments,\n addAttachment,\n addAttachments,\n removeAttachment,\n clearAttachments,\n isUploadingAttachments,\n };\n}\n","import axios, { AxiosInstance } from 'axios';\nimport {\n StableDiffusionProvider,\n WhisperProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport { AttachmentPayload, TTSResult } from '../types';\nimport type { AlquimiaAdapter, AlquimiaSDKOptions } from '../adapters';\n\nclass AlquimiaSDK {\n private adapter: AlquimiaAdapter;\n private assistantId: string;\n private axiosInstance: AxiosInstance;\n private conversationId: string | null = null;\n private sessionId: string | null = null;\n private streamId: string | null = null;\n private evaluationStrategy: string | null = null;\n private tools: any = [];\n private extraData: any = null;\n private assistantConfig: any = null;\n private forceProfile: any = {};\n private userId: string | null = null;\n private whisperProvider?: WhisperProvider;\n private stableDiffusionProvider?: StableDiffusionProvider;\n private analyzeCharacterizationProvider?: CharacterizationProvider;\n private ratingsProvider?: RatingsProvider;\n private loggerProvider?: LoggerProvider;\n private enforceCharacterization?: boolean;\n private attachments: AttachmentPayload[] = [];\n private attachmentResponses: string[] = [];\n\n constructor(\n assistantId: string,\n adapter: AlquimiaAdapter,\n options: AlquimiaSDKOptions = {}\n ) {\n if (!assistantId) {\n throw new Error('AlquimiaSDK: assistantId is required');\n }\n if (!adapter) {\n throw new Error(\n 'AlquimiaSDK: adapter is required. Use createNextJsAdapter() or createFetchAdapter()'\n );\n }\n\n this.assistantId = assistantId;\n this.adapter = adapter;\n this.enforceCharacterization = options.enforceCharacterization ?? true;\n\n this.axiosInstance = axios.create();\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n if (error.response?.status && this.loggerProvider) {\n await this.loggerProvider.logError('Server Error', error, {\n url: error.config.url,\n method: error.config.method,\n data: error.config.data,\n status: error.response.status,\n responseData: error.response.data,\n });\n }\n return Promise.reject(error);\n }\n );\n\n this.textToSpeech = this.textToSpeech.bind(this);\n this.speechToText = this.speechToText.bind(this);\n }\n\n withConversationId(conversationId: string): AlquimiaSDK {\n this.conversationId = conversationId;\n return this;\n }\n\n withAttachments(attachments: AttachmentPayload[]): AlquimiaSDK {\n this.attachments = attachments;\n return this;\n }\n\n withWhisperProvider(provider: WhisperProvider): AlquimiaSDK {\n this.whisperProvider = provider;\n return this;\n }\n\n withStableDiffusionProvider(provider: StableDiffusionProvider): AlquimiaSDK {\n this.stableDiffusionProvider = provider;\n return this;\n }\n\n withAnalyzeCharacterizationProvider(provider: CharacterizationProvider): AlquimiaSDK {\n this.analyzeCharacterizationProvider = provider;\n return this;\n }\n\n withRatingsProvider(provider: RatingsProvider): AlquimiaSDK {\n this.ratingsProvider = provider;\n return this;\n }\n\n withLoggerProvider(provider: LoggerProvider): AlquimiaSDK {\n this.loggerProvider = provider;\n return this;\n }\n\n withTools(tools: any): AlquimiaSDK {\n this.tools = tools;\n return this;\n }\n\n withExtraData(extraData: any): AlquimiaSDK {\n this.extraData = extraData;\n return this;\n }\n\n withForceProfile(forceProfile: any): AlquimiaSDK {\n this.forceProfile = forceProfile;\n return this;\n }\n\n withAssistantConfig(assistantConfig: any): AlquimiaSDK {\n this.assistantConfig = assistantConfig;\n return this;\n }\n\n withUserId(userId: string): AlquimiaSDK {\n this.userId = userId;\n return this;\n }\n\n getEnforceCharacterization(): boolean {\n return this.enforceCharacterization ?? true;\n }\n\n getEvaluationStrategy(): string | null {\n return this.evaluationStrategy;\n }\n\n textToSpeech(text: string): Promise<TTSResult> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.textToSpeech(text);\n }\n\n speechToText(audio: string): Promise<string> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.speechToText(audio);\n }\n\n async sendMessage(query: string, traceParent?: string): Promise<AlquimiaSDK> {\n if (!this.conversationId) {\n throw new Error(\n 'Conversation not initialized. Call withConversationId() before sendMessage()'\n );\n }\n\n const inferUrl = this.adapter.resolveInferUrl(this.assistantId);\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n\n const initMessage = {\n query,\n session_id: this.conversationId,\n ...(this.extraData && { extra_data: this.extraData }),\n force_profile: this.forceProfile,\n ...(this.assistantConfig && { config: this.assistantConfig }),\n tools: this.tools,\n user_id: this.userId,\n attachments: this.attachments,\n };\n\n const result = (\n await this.axiosInstance.post(inferUrl, initMessage, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-trace-parent': traceParent || '',\n ...adapterHeaders,\n },\n })\n ).data;\n\n this.evaluationStrategy =\n result?.config?.dante?.profile?.evaluation_strategy?.evaluation_strategy_id ?? null;\n this.streamId = result.stream_id;\n this.attachmentResponses = result.attachments ?? [];\n this.attachments = [];\n\n return this;\n }\n\n async generateImage(query: string): Promise<string> {\n if (!this.stableDiffusionProvider) {\n throw new Error('Stable Diffusion provider not initialized');\n }\n return this.stableDiffusionProvider.generateImage(query);\n }\n\n async analyzeCharacterization(text: string): Promise<Record<string, any>> {\n if (!this.analyzeCharacterizationProvider) {\n throw new Error('Analyze characterization provider not initialized');\n }\n return this.analyzeCharacterizationProvider.analyzeCharacterization(text);\n }\n\n async rate(data: any): Promise<Record<string, any>> {\n if (!this.ratingsProvider) {\n throw new Error('Ratings provider not initialized');\n }\n return this.ratingsProvider.rate(data);\n }\n\n async logInfo(message: string, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logInfo(message, data);\n }\n\n async logError(message: string, error: Error, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logError(message, error, data);\n }\n\n getAttachmentResponses(): string[] {\n return this.attachmentResponses;\n }\n\n async uploadAttachment(file: File, attachmentId: string): Promise<void> {\n if (!this.streamId || !attachmentId) {\n throw new Error('Stream or attachment ID not initialized');\n }\n const url = this.adapter.resolveAttachmentUrl(this.streamId, attachmentId);\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n const formData = new FormData();\n formData.append('file', file);\n await this.axiosInstance.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data', ...adapterHeaders },\n });\n }\n\n getUrlStream(): string {\n if (!this.streamId) {\n throw new Error('Stream ID not initialized. Call sendMessage() first');\n }\n return this.adapter.resolveStreamUrl(this.streamId);\n }\n\n getStreamId(): string | null {\n return this.streamId;\n }\n}\n\nexport default AlquimiaSDK;\n","import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} 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 const trimmedText = text.trim();\n\n return (\n /^[\\w\\#\\-\\*\\|\\[\\]\\-\\+\\=\\s\\n\\r\\t\\!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^\\!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\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(\n cookieValue: string\n): 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\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\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":["axios","sessionId","input","messages","evaluationStrategy","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts","../../src/hooks/alquimia.hook.tsx","../../src/sdk/alquimia-sdk.ts","../../src/utils/utils.ts","../../src/hooks/useRatings.ts"],"sourcesContent":["export { useAlquimia } from \"./alquimia.hook\";\nexport { useRatings } from \"./useRatings\";","import { useMemo, useRef, useState } from 'react';\nimport AlquimiaSDK from '../sdk/alquimia-sdk';\nimport type { AlquimiaAdapter } from '../adapters';\nimport {\n WhisperProvider,\n StableDiffusionProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport {\n AIMessageChunk,\n AlquimiaMessage,\n AlquimiaEventData,\n AssistantInferenceResponse,\n ToolEvent,\n} from '../types/type';\nimport { createMessageId, mergeThinkingsByControlId, mergeToolEvents } from '../utils';\n\nexport interface UseAlquimiaConfig {\n assistantId: string;\n adapter: AlquimiaAdapter;\n providers?: {\n whisper?: WhisperProvider;\n stableDiffusion?: StableDiffusionProvider;\n characterization?: CharacterizationProvider;\n ratings?: RatingsProvider;\n logger?: LoggerProvider;\n };\n options?: {\n enforceCharacterization?: boolean;\n userId?: string;\n extraInstructions?: Record<string, string>;\n };\n}\n\nexport function useAlquimia(config: UseAlquimiaConfig) {\n const sdk = useMemo(() => {\n const instance = new AlquimiaSDK(config.assistantId, config.adapter, {\n enforceCharacterization: config.options?.enforceCharacterization,\n });\n\n if (config.providers?.whisper) instance.withWhisperProvider(config.providers.whisper);\n if (config.providers?.stableDiffusion) instance.withStableDiffusionProvider(config.providers.stableDiffusion);\n if (config.providers?.characterization) instance.withAnalyzeCharacterizationProvider(config.providers.characterization);\n if (config.providers?.ratings) instance.withRatingsProvider(config.providers.ratings);\n if (config.providers?.logger) instance.withLoggerProvider(config.providers.logger);\n if (config.options?.userId) instance.withUserId(config.options.userId);\n if (config.options?.extraInstructions) instance.withExtraInstructions(config.options.extraInstructions);\n\n return instance;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.assistantId, config.adapter]);\n\n const [input, setInput] = useState<string>('');\n const [isMessageLoading, setIsMessageLoading] = useState<boolean>(false);\n const [isStreamingLoading, setIsStreamingLoading] = 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 [messages, setMessages] = useState<AlquimiaMessage[]>([]);\n const eventSourceRef = useRef<EventSource | null>(null);\n const streamUserCancelledRef = useRef(false);\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 [hasThinkings, setHasThinkings] = useState<boolean>(false);\n const [attachments, setAttachments] = useState<File[]>([]);\n const [isUploadingAttachments, setIsUploadingAttachments] = useState<boolean>(false);\n\n const isLoading = isMessageLoading || isStreamingLoading || isUploadingAttachments;\n\n function cleanMessages() {\n setMessages([]);\n setHasThinkings(false);\n }\n\n function addAttachment(file: File) {\n setAttachments((prev) => [...prev, file]);\n }\n\n function addAttachments(files: File[]) {\n setAttachments((prev) => [...prev, ...files]);\n }\n\n function removeAttachment(index: number) {\n setAttachments((prev) => prev.filter((_, i) => i !== index));\n }\n\n function clearAttachments() {\n setAttachments([]);\n }\n\n function processMessageChunk(\n messageId: string,\n chunk: string,\n error_code?: string,\n error_detail?: string,\n taskid?: string,\n additionalInfo?: string,\n loading?: boolean,\n tooler?: ToolEvent[],\n thinkings?: any[]\n ) {\n setMessages((currentMessages) => {\n const messageIndex = currentMessages.findIndex((message) => message?.id === messageId);\n if (messageIndex !== -1) {\n const updatedMessages = [...currentMessages];\n const updatedMessage: AlquimiaMessage = {\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 taskid,\n additionalInfo,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents(updatedMessages[messageIndex]?.tooler || [], tooler),\n thinkings: mergeThinkingsByControlId(\n updatedMessages[messageIndex]?.thinkings || [],\n thinkings || []\n ),\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 taskid,\n created_at: new Date().getTime().toString(),\n loading,\n tooler: mergeToolEvents([], tooler),\n thinkings,\n },\n ];\n }\n });\n }\n\n async function processAndSendMessage(\n message: string,\n options?: {\n messageType?: string;\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n }\n ) {\n addUserMessage(message, options?.messageType);\n\n const messageId = createMessageId();\n setStreamingMessageId(messageId);\n\n await sendMessage(\n message,\n (chunk: AIMessageChunk) => {\n processMessageChunk(\n messageId,\n chunk?.answer || '',\n chunk?.error_code,\n chunk?.error_detail,\n chunk?.taskid,\n options?.additionalInfo,\n chunk?.loading,\n chunk?.tooler,\n chunk?.thinkings\n );\n },\n options?.traceParentId,\n options?.sessionId\n );\n\n setInput('');\n }\n\n async function handleSubmit(\n event: React.FormEvent<HTMLFormElement>,\n traceParentId?: string,\n sessionId?: string,\n additionalInfo?: string\n ) {\n setIsMessageLoading(true);\n event.preventDefault();\n\n if (input) {\n await processAndSendMessage(input, { traceParentId, sessionId, additionalInfo });\n }\n\n setIsMessageLoading(false);\n }\n\n async function handleSystemMessage(\n message: string,\n options?: {\n traceParentId?: string;\n sessionId?: string;\n additionalInfo?: string;\n messageType?: string;\n }\n ) {\n setIsMessageLoading(true);\n\n await processAndSendMessage(message, {\n messageType: options?.messageType || 'system',\n traceParentId: options?.traceParentId,\n sessionId: options?.sessionId,\n additionalInfo: options?.additionalInfo,\n });\n\n setIsMessageLoading(false);\n }\n\n function handleInputChange(event: React.ChangeEvent<HTMLTextAreaElement>) {\n setInput(event.target.value);\n }\n\n function handleReplaceInput(input: string) {\n setInput(input);\n }\n\n function populateMessages(messages: AlquimiaMessage[]) {\n setMessages(messages);\n }\n\n function handleLoadingCancel() {\n streamUserCancelledRef.current = true;\n eventSourceRef.current?.close();\n eventSourceRef.current = null;\n setIsMessageLoading(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n setIsUploadingAttachments(false);\n setInput('');\n }\n\n function addUserMessage(message: string, type?: string) {\n setMessages((prevMessages: AlquimiaMessage[]) => [\n ...prevMessages,\n {\n content: message,\n role: 'user',\n type: type,\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 (const 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 function cleanup(isStreaming: boolean, event: EventSource) {\n setIsMessageStreaming(isStreaming);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n event.close();\n }\n\n async function sendMessage(\n message: string,\n callBack: (chunk: AIMessageChunk) => void,\n traceParentId?: string,\n sessionId?: string\n ) {\n setIsStreamingLoading(true);\n callBack({ type: 'loading', loading: true });\n const conversationId = sessionId || getCookie('alquimia-session');\n setIsMessageStreaming(true);\n setActiveTool(null);\n setLastRequest(message);\n\n try {\n const hasAttachments = attachments.length > 0;\n const sdkCall = sdk.withConversationId(conversationId || '');\n\n if (hasAttachments) {\n sdkCall.withAttachments(\n attachments.map((f) => ({\n filename: f.name,\n content_type: f.type,\n content_size: f.size,\n }))\n );\n }\n\n const response = await sdkCall.sendMessage(message, traceParentId);\n\n if (hasAttachments) {\n setIsUploadingAttachments(true);\n try {\n const attachmentResponses = response.getAttachmentResponses();\n await Promise.all(\n attachments.map((file, i) => response.uploadAttachment(file, attachmentResponses[i]))\n );\n } catch (uploadError: any) {\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n setIsStreamingLoading(false);\n callBack({\n type: 'error',\n error_code: 'ATTACHMENT_UPLOAD_ERROR',\n error_detail: uploadError.message || 'Failed to upload attachment',\n });\n return;\n }\n setIsUploadingAttachments(false);\n clearAttachments();\n }\n\n const streamUrl = response.getUrlStream();\n const streamId = response.getStreamId() || '';\n streamUserCancelledRef.current = false;\n const streamState = {\n streamId,\n connectedAt: Date.now(),\n openedAt: null as number | null,\n messagesReceived: 0,\n lastMessageAt: null as number | null,\n closedByClient: false,\n };\n\n const eventSource = new EventSource(streamUrl);\n eventSourceRef.current = eventSource;\n\n eventSource.onopen = () => {\n streamState.openedAt = Date.now();\n };\n\n eventSource.onmessage = (event) => {\n streamState.messagesReceived++;\n streamState.lastMessageAt = Date.now();\n handleMessageEvent(event, callBack, eventSource, streamState);\n };\n\n eventSource.onerror = () => {\n if (streamState.closedByClient) return;\n if (streamUserCancelledRef.current) {\n streamUserCancelledRef.current = false;\n return;\n }\n\n streamState.closedByClient = true;\n\n const elapsed = Date.now() - streamState.connectedAt;\n const sinceLastMessage = streamState.lastMessageAt\n ? Date.now() - streamState.lastMessageAt\n : null;\n\n cleanup(false, eventSource);\n\n let errorDetail: string;\n if (!streamState.openedAt) {\n errorDetail =\n 'Could not open the live response. Check your connection and try again.';\n } else if (streamState.messagesReceived === 0) {\n errorDetail = 'No response was received. Try again in a moment.';\n } else {\n errorDetail = 'The response was interrupted. Try again.';\n }\n\n if (typeof console !== 'undefined' && console.debug) {\n console.debug('[Alquimia] SSE transport error', {\n streamUrl,\n taskId: streamId,\n opened: Boolean(streamState.openedAt),\n messagesReceived: streamState.messagesReceived,\n elapsedMs: elapsed,\n sinceLastMessageMs: sinceLastMessage,\n });\n }\n\n callBack({\n type: 'error',\n error_code: 'STREAM_ERROR',\n error_detail: errorDetail,\n taskid: streamId,\n });\n };\n } catch (error: any) {\n console.error('Error sending message:', error);\n const errMessage =\n error.response?.data?.detail || error.message || 'Error initiating the stream.';\n setIsUploadingAttachments(false);\n setIsMessageStreaming(false);\n setStreamingMessageId(null);\n callBack({\n type: 'error',\n error_code:\n error.response?.status != null\n ? String(error.response.status)\n : 'REQUEST_ERROR',\n error_detail: errMessage,\n });\n }\n }\n\n function handleMessageEvent(\n event: MessageEvent,\n callBack: (chunk: AIMessageChunk) => void,\n eventSource: EventSource,\n streamState?: {\n streamId: string;\n closedByClient: boolean;\n messagesReceived: number;\n }\n ) {\n const data: AlquimiaEventData = JSON.parse(event.data);\n const eventTaskId = data.taskid || '';\n\n if (data.errors?.length) {\n for (const error of data.errors) {\n const detail =\n error.error_detail ||\n (error.data != null\n ? `${error.data} (controlId: ${error.control_id})`\n : 'Unknown error');\n callBack({\n type: 'error',\n error_code: error.event_class || error.status || 'UNKNOWN_ERROR',\n error_detail: detail,\n taskid: eventTaskId,\n });\n }\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n return;\n }\n\n if (data.tools_output?.length) {\n callBack({ type: 'answer', answer: '', tooler: data.tools_output });\n }\n\n if (data.thinkings?.length) {\n setHasThinkings(true);\n callBack({ type: 'answer', thinkings: data.thinkings });\n }\n\n if (data.event_class === 'AssistantInferenceResponse') {\n const final = data as AssistantInferenceResponse;\n callBack({ type: 'answer', answer: final.data });\n if (streamState) streamState.closedByClient = true;\n cleanup(false, eventSource);\n }\n }\n\n return {\n sdk,\n activeTool,\n cleanMessages,\n createMessageId,\n handleInputChange,\n handleReplaceInput,\n handleSubmit,\n handleSystemMessage,\n handleLoadingCancel,\n input,\n isLoading,\n isMessageLoading,\n isMessageStreaming,\n isStreamingLoading,\n streamingMessageId,\n isAudioRecording,\n lastRequest,\n messages,\n populateMessages,\n processMessageChunk,\n sendMessage,\n sessionId,\n setActiveTool,\n setSessionId,\n setLastRequest,\n setIsAudioRecording,\n hasThinkings,\n attachments,\n addAttachment,\n addAttachments,\n removeAttachment,\n clearAttachments,\n isUploadingAttachments,\n };\n}\n","import axios, { AxiosInstance } from 'axios';\nimport {\n StableDiffusionProvider,\n WhisperProvider,\n CharacterizationProvider,\n RatingsProvider,\n LoggerProvider,\n} from '../providers';\nimport { AttachmentPayload, TTSResult, type CommonAttributes } from '../types';\nimport type { AlquimiaAdapter, AlquimiaSDKOptions } from '../adapters';\n\nclass AlquimiaSDK {\n private adapter: AlquimiaAdapter;\n private assistantId: string;\n private axiosInstance: AxiosInstance;\n private conversationId: string | null = null;\n private sessionId: string | null = null;\n // Internal subscription id from infer (`taskid` on the wire).\n private streamId: string | null = null;\n private tools: any = [];\n private extraInstructions: Record<string, string> | null = null;\n private assistantConfig: any = null;\n private userId: string | null = null;\n private whisperProvider?: WhisperProvider;\n private stableDiffusionProvider?: StableDiffusionProvider;\n private analyzeCharacterizationProvider?: CharacterizationProvider;\n private ratingsProvider?: RatingsProvider;\n private loggerProvider?: LoggerProvider;\n private enforceCharacterization?: boolean;\n private attachments: AttachmentPayload[] = [];\n private attachmentResponses: string[] = [];\n\n constructor(\n assistantId: string,\n adapter: AlquimiaAdapter,\n options: AlquimiaSDKOptions = {}\n ) {\n if (!assistantId) {\n throw new Error('AlquimiaSDK: assistantId is required');\n }\n if (!adapter) {\n throw new Error(\n 'AlquimiaSDK: adapter is required. Use createNextJsAdapter() or createFetchAdapter()'\n );\n }\n\n this.assistantId = assistantId;\n this.adapter = adapter;\n this.enforceCharacterization = options.enforceCharacterization ?? true;\n\n this.axiosInstance = axios.create();\n this.axiosInstance.interceptors.response.use(\n (response) => response,\n async (error) => {\n if (error.response?.status && this.loggerProvider) {\n await this.loggerProvider.logError('Server Error', error, {\n url: error.config.url,\n method: error.config.method,\n data: error.config.data,\n status: error.response.status,\n responseData: error.response.data,\n });\n }\n return Promise.reject(error);\n }\n );\n\n this.textToSpeech = this.textToSpeech.bind(this);\n this.speechToText = this.speechToText.bind(this);\n }\n\n withConversationId(conversationId: string): AlquimiaSDK {\n this.conversationId = conversationId;\n return this;\n }\n\n withAttachments(attachments: AttachmentPayload[]): AlquimiaSDK {\n this.attachments = attachments;\n return this;\n }\n\n withWhisperProvider(provider: WhisperProvider): AlquimiaSDK {\n this.whisperProvider = provider;\n return this;\n }\n\n withStableDiffusionProvider(provider: StableDiffusionProvider): AlquimiaSDK {\n this.stableDiffusionProvider = provider;\n return this;\n }\n\n withAnalyzeCharacterizationProvider(provider: CharacterizationProvider): AlquimiaSDK {\n this.analyzeCharacterizationProvider = provider;\n return this;\n }\n\n withRatingsProvider(provider: RatingsProvider): AlquimiaSDK {\n this.ratingsProvider = provider;\n return this;\n }\n\n withLoggerProvider(provider: LoggerProvider): AlquimiaSDK {\n this.loggerProvider = provider;\n return this;\n }\n\n withTools(tools: any): AlquimiaSDK {\n this.tools = tools;\n return this;\n }\n\n withExtraInstructions(extraInstructions: Record<string, string>): AlquimiaSDK {\n this.extraInstructions = extraInstructions;\n return this;\n }\n\n withAssistantConfig(assistantConfig: any): AlquimiaSDK {\n this.assistantConfig = assistantConfig;\n return this;\n }\n\n withUserId(userId: string): AlquimiaSDK {\n this.userId = userId;\n return this;\n }\n\n getEnforceCharacterization(): boolean {\n return this.enforceCharacterization ?? true;\n }\n\n textToSpeech(text: string): Promise<TTSResult> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.textToSpeech(text);\n }\n\n speechToText(audio: string): Promise<string> {\n if (!this.whisperProvider) {\n throw new Error('Whisper provider not initialized');\n }\n return this.whisperProvider.speechToText(audio);\n }\n\n async sendMessage(query: string, traceParent?: string): Promise<AlquimiaSDK> {\n if (!this.conversationId) {\n throw new Error(\n 'Conversation not initialized. Call withConversationId() before sendMessage()'\n );\n }\n\n const inferUrl = this.adapter.resolveInferUrl(this.assistantId);\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n\n const hasClientTools = Array.isArray(this.tools) && this.tools.length > 0;\n\n const initMessage: Record<string, unknown> = {\n query,\n session_id: this.conversationId,\n user_id: this.userId,\n ...(this.extraInstructions && { extra_instructions: this.extraInstructions }),\n ...(this.assistantConfig && { config: this.assistantConfig }),\n ...(hasClientTools && {\n evaluation_strategy: {\n evaluation_strategy_id: 'native',\n tool_schemas: this.tools,\n },\n }),\n };\n\n const result = (\n await this.axiosInstance.post(inferUrl, initMessage, {\n headers: {\n 'Content-Type': 'application/json',\n 'x-trace-parent': traceParent || '',\n ...adapterHeaders,\n ...this.buildIdentityHeaders(),\n },\n })\n ).data as CommonAttributes;\n\n this.streamId = result.taskid ?? null;\n this.attachmentResponses = result.attachments ?? [];\n this.attachments = [];\n\n return this;\n }\n\n async generateImage(query: string): Promise<string> {\n if (!this.stableDiffusionProvider) {\n throw new Error('Stable Diffusion provider not initialized');\n }\n return this.stableDiffusionProvider.generateImage(query);\n }\n\n async analyzeCharacterization(text: string): Promise<Record<string, any>> {\n if (!this.analyzeCharacterizationProvider) {\n throw new Error('Analyze characterization provider not initialized');\n }\n return this.analyzeCharacterizationProvider.analyzeCharacterization(text);\n }\n\n async rate(data: any): Promise<Record<string, any>> {\n if (!this.ratingsProvider) {\n throw new Error('Ratings provider not initialized');\n }\n return this.ratingsProvider.rate(data);\n }\n\n async logInfo(message: string, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logInfo(message, data);\n }\n\n async logError(message: string, error: Error, data: any): Promise<void> {\n if (!this.loggerProvider) {\n throw new Error('Logger provider not initialized');\n }\n return this.loggerProvider.logError(message, error, data);\n }\n\n /**\n * @deprecated The runtime no longer returns attachment IDs from the infer\n * response — attachments are uploaded as standalone blobs and linked to the\n * session via headers. Always returns `[]`; kept for source compatibility.\n */\n getAttachmentResponses(): string[] {\n return this.attachmentResponses;\n }\n\n async uploadAttachment(file: File, _attachmentId?: string): Promise<void> {\n void _attachmentId;\n const url = this.adapter.resolveBlobUploadUrl();\n const adapterHeaders = this.adapter.getHeaders?.() ?? {};\n const formData = new FormData();\n formData.append('file', file);\n await this.axiosInstance.post(url, formData, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n ...adapterHeaders,\n ...this.buildIdentityHeaders(),\n },\n });\n }\n\n /**\n * Identity headers (kebab-case) required by `/context/blob/upload` and\n * the rest of the runtime's internal endpoints introduced in v0.2.0→next.\n */\n private buildIdentityHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'assistant-id': this.assistantId,\n };\n if (this.conversationId) headers['session-id'] = this.conversationId;\n if (this.userId) headers['user-id'] = this.userId;\n if (this.streamId) headers['task-id'] = this.streamId;\n return headers;\n }\n\n getUrlStream(): string {\n if (!this.streamId) {\n throw new Error('Stream ID not initialized. Call sendMessage() first');\n }\n return this.adapter.resolveStreamUrl(this.streamId);\n }\n\n getStreamId(): string | null {\n return this.streamId;\n }\n\n /** Alias for {@link getStreamId} — same value as infer `taskid`. */\n getTaskId(): string | null {\n return this.streamId;\n }\n}\n\nexport default AlquimiaSDK;\n","import {\n BaseAPIConfig,\n ApiError,\n ConversationsMap,\n ThinkingsInferenceResponse,\n Tooler,\n ToolEvent,\n} 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 const trimmedText = text.trim();\n\n return (\n /^[\\w\\#\\-\\*\\|\\[\\]\\-\\+\\=\\s\\n\\r\\t\\!]/.test(trimmedText) ||\n trimmedText.startsWith(\"#\") ||\n trimmedText.startsWith(\"![\") ||\n trimmedText.startsWith(\"```\") ||\n trimmedText.startsWith(\"---\") ||\n /^[a-zA-Z0-9\\s\\n\\r\\t]/.test(trimmedText) ||\n /^\\!\\[.*\\]\\(.*\\)/.test(trimmedText)\n );\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(\n cookieValue: string\n): 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\nexport function hasToolSummary(data: any) {\n return data.tool_summary && Object.keys(data.tool_summary).length > 0;\n}\n\nexport function mergeThinkingsByControlId(\n existingThinkings: ThinkingsInferenceResponse[] = [],\n newThinkings: ThinkingsInferenceResponse[] = []\n): ThinkingsInferenceResponse[] {\n const thinkingsMap = new Map(existingThinkings.map((t) => [t.control_id, t]));\n for (const t of newThinkings) {\n if (t && t.control_id) {\n thinkingsMap.set(t.control_id, t);\n }\n }\n return Array.from(thinkingsMap.values());\n}\n\n\nexport function mergeToolerByControlId(\n currentTooler: Tooler[],\n toolEvent: ToolEvent\n): Tooler[] {\n const { event_class, control_id, data, status } = toolEvent;\n const existingTool = currentTooler.find((t) => t.control_id === control_id);\n const base: Tooler = existingTool || { control_id };\n\n let updated: Tooler;\n switch (event_class) {\n case \"ServerToolExecutionCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: data,\n },\n };\n break;\n case \"ToolExecutionResponse\":\n updated = {\n ...base,\n tool_output: {\n result: data,\n status,\n },\n };\n break;\n case \"A2AInferenceCommand\":\n updated = {\n ...base,\n tool_summary: {\n name: data.name,\n parameters: { ...data, type: \"A2A\" },\n },\n };\n break;\n default:\n return currentTooler;\n }\n\n return currentTooler.some(tool => tool.control_id === control_id)\n ? currentTooler.map(tool => (tool.control_id === control_id ? updated : tool))\n : [...currentTooler, updated];\n}\n\nexport function mergeToolEvents(\n initial: Tooler[],\n toolEvents?: ToolEvent[]\n): Tooler[] {\n return (toolEvents ?? []).reduce(\n (acc, toolEvent) => mergeToolerByControlId(acc, toolEvent),\n initial\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":["axios","sessionId","input","messages","import_react"]}
|