assistant-cloud
Version:
Cloud integration for assistant-ui
109 lines (95 loc) • 2.91 kB
text/typescript
import type { ReadonlyJSONObject } from "assistant-stream/utils";
import type { AssistantCloudAPI } from "./AssistantCloudAPI";
import {
readCloudArray,
readCloudInteger,
readCloudJSONObject,
readCloudNullableString,
readCloudRecord,
readCloudString,
readCloudTimestamp,
} from "./cloudResponse";
export type CloudMessage = {
id: string;
parent_id: string | null;
height: number;
created_at: Date;
updated_at: Date;
format: "aui/v0" | string;
content: ReadonlyJSONObject;
};
type AssistantCloudThreadMessageListQuery = {
format?: string;
};
type AssistantCloudThreadMessageListResponse = {
messages: CloudMessage[];
};
type AssistantCloudThreadMessageCreateBody = {
parent_id: string | null;
format: "aui/v0" | string;
content: ReadonlyJSONObject;
};
type AssistantCloudMessageCreateResponse = {
message_id: string;
};
type AssistantCloudThreadMessageUpdateBody = {
content: ReadonlyJSONObject;
};
export const decodeCloudMessage = (
value: unknown,
field: string,
): CloudMessage => {
const message = readCloudRecord(value, field);
return {
id: readCloudString(message.id, `${field}.id`),
parent_id: readCloudNullableString(message.parent_id, `${field}.parent_id`),
height: readCloudInteger(message.height, `${field}.height`),
created_at: readCloudTimestamp(message.created_at, `${field}.created_at`),
updated_at: readCloudTimestamp(message.updated_at, `${field}.updated_at`),
format: readCloudString(message.format, `${field}.format`),
content: readCloudJSONObject(message.content, `${field}.content`),
};
};
export class AssistantCloudThreadMessages {
private cloud: AssistantCloudAPI;
constructor(cloud: AssistantCloudAPI) {
this.cloud = cloud;
}
public async list(
threadId: string,
query?: AssistantCloudThreadMessageListQuery,
): Promise<AssistantCloudThreadMessageListResponse> {
const response = readCloudRecord(
await this.cloud.makeRequest(
`/threads/${encodeURIComponent(threadId)}/messages`,
{ query },
),
"thread message list response",
);
const messages = readCloudArray(response.messages, "messages");
return {
messages: messages.map((message, index) =>
decodeCloudMessage(message, `messages[${index}]`),
),
};
}
public async create(
threadId: string,
body: AssistantCloudThreadMessageCreateBody,
): Promise<AssistantCloudMessageCreateResponse> {
return this.cloud.makeRequest(
`/threads/${encodeURIComponent(threadId)}/messages`,
{ method: "POST", body },
);
}
public async update(
threadId: string,
messageId: string,
body: AssistantCloudThreadMessageUpdateBody,
): Promise<void> {
return this.cloud.makeRequest(
`/threads/${encodeURIComponent(threadId)}/messages/${encodeURIComponent(messageId)}`,
{ method: "PUT", body },
);
}
}