46 lines
1.3 KiB
JavaScript
46 lines
1.3 KiB
JavaScript
import { ApiHttpClient } from "./ApiHttpClient.js";
|
|
|
|
export class ChatClientApi {
|
|
constructor(http = new ApiHttpClient(), pollMs = 700, timeoutMs = 120000) {
|
|
this.http = http;
|
|
this.pollMs = pollMs;
|
|
this.timeoutMs = timeoutMs;
|
|
}
|
|
|
|
async createDialog(ragSessionId) {
|
|
const response = await this.http.request("/api/chat/dialogs", {
|
|
method: "POST",
|
|
body: JSON.stringify({ rag_session_id: ragSessionId })
|
|
});
|
|
return response.dialog_session_id;
|
|
}
|
|
|
|
async sendMessage(payload) {
|
|
const queued = await this.http.request("/api/chat/messages", {
|
|
method: "POST",
|
|
body: JSON.stringify({
|
|
dialog_session_id: payload.dialog_session_id,
|
|
rag_session_id: payload.rag_session_id,
|
|
message: payload.message,
|
|
attachments: payload.attachments || []
|
|
})
|
|
});
|
|
|
|
const taskId = queued.task_id;
|
|
const started = Date.now();
|
|
while (Date.now() - started < this.timeoutMs) {
|
|
const status = await this.http.request(`/api/tasks/${encodeURIComponent(taskId)}`);
|
|
if (status.status === "done") return status;
|
|
if (status.status === "error") {
|
|
throw new Error(status.error?.desc || "Task failed");
|
|
}
|
|
await this.#sleep(this.pollMs);
|
|
}
|
|
throw new Error("Task polling timeout");
|
|
}
|
|
|
|
#sleep(ms) {
|
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
}
|
|
}
|