@ckeditor/ckeditor5-ai
Version:
AI features for CKEditor 5.
316 lines (315 loc) • 10.1 kB
TypeScript
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
/**
* @module ai/aicore/aiconnector
*/
import { type EventSourceMessage } from 'eventsource-parser';
import { type Editor, type Context, ContextPlugin } from 'ckeditor5/src/core.js';
import { type AIContextItemRequestData, type AIContextItemType } from './model/aicontext.js';
import { type AICapabilitiesRequestData } from './model/aicapabilities.js';
import { type AIQuickActionRequestData } from '../aiquickactions/aiquickactions.js';
export declare enum AIActionsNames {
CONTINUE = "continue",
FIX_GRAMMAR = "fix-grammar",
IMPROVE_WRITING = "improve-writing",
MAKE_LONGER = "make-longer",
MAKE_SHORTER = "make-shorter",
MAKE_TONE_CASUAL = "make-tone-casual",
MAKE_TONE_FORMAL = "make-tone-formal",
TRANSLATE = "translate"
}
/**
* A plugin that handles communication with the AI API.
*/
export declare class AIConnector extends ContextPlugin {
/**
* @inheritDoc
*/
static get requires(): readonly ["CloudServices"];
/**
* @inheritDoc
*/
static get pluginName(): "AIConnector";
/**
* @inheritDoc
*/
static get isOfficialPlugin(): true;
/**
* @inheritDoc
*/
static get isPremiumPlugin(): true;
constructor(context: Context | Editor);
/**
* @inheritDoc
*/
init(): void;
/**
* Creates a new conversation session with the AI API.
*/
startConversation(id: string, group: string): AIConversationStartRequest;
/**
* Sends a request to the AI API '/conversations/{conversationId}/messages' endpoint and returns a response stream reader.
*/
queryAssistant({ message, conversationId, parts, capabilities, model, quickActionData }: AIConnectorQueryAssistantData): AIConnectorRequest;
/**
* Sends a request to the /actions/custom/calls endpoint and returns a response stream reader.
*/
executeCustomAction({ content, message, model, outputFormat }: AIConnectorExecuteCustomActionData): AIConnectorRequest;
/**
* Sends a request to the /actions/system/{actionName}/calls endpoint and returns a response stream reader.
*/
executeAction({ actionName, content, args }: AIConnectorExecuteActionData): AIConnectorRequest;
/**
* Uploads a file to the AI API for a specific conversation.
*/
uploadFile(conversationId: string, file: File, attributes?: {
resourceId: string;
label: string;
}): AIUploadRequest;
/**
* Fetches a specific document by its ID from a conversation.
*/
fetchDocument(conversationId: string, documentId: string): AIFetchDocumentRequest;
/**
* Gets a document from the AI API for a specific conversation.
*/
uploadDocument(conversationId: string, content: string, attributes?: Record<string, unknown>): AIUploadRequest;
/**
* Fetches the list of conversations from the AI API.
*/
fetchConversations(group: string, search?: string): AIFetchConversationsRequest;
/**
* Deletes a conversation by its ID.
*/
deleteConversation(id: string): AIDeleteConversationRequest;
/**
* Updates the title and pinned status of a conversation by its ID.
*/
updateConversation(id: string, updates: {
title?: string;
pinned?: boolean;
}): AIUpdateConversationRequest;
/**
* Fetches a specific conversation by its ID.
*/
fetchConversation(id: string): AIGetConversationRequest;
/**
* Fetches messages for a specific conversation by its ID.
*/
fetchConversationMessages(conversationId: string): AIGetConversationMessagesRequest;
/**
* Uploads a URL to the AI API for a specific conversation.
*/
uploadUrl(conversationId: string, url: string, attributes?: {
resourceId: string;
label: string;
}): AIUploadRequest;
/**
* Returns a list of available AI models.
*/
getModels(): AIModelRequest;
/**
* Deletes a file from a conversation.
*/
deleteFile(conversationId: string, fileId: string): AIDeleteFileRequest;
/**
* Deletes a document from a conversation.
*/
deleteDocument(conversationId: string, documentId: string): AIDeleteDocumentRequest;
/**
* Deletes a web resource from a conversation.
*/
deleteWebResource(conversationId: string, webResourceId: string): AIDeleteWebResourceRequest;
/**
* Sends a request to the AI API '/reviews/system/{reviewName}/calls' endpoint and returns a response stream reader.
*/
callSystemReview({ reviewName, content, args }: AIConnectorSystemReviewData): AIConnectorRequest;
/**
* Sends a request to the AI API '/reviews/custom/calls' endpoint and returns a response stream reader.
*/
callCustomReview({ content, prompt, model }: AIConnectorCustomReviewData): AIConnectorRequest;
upsertAIChatRating(conversationId: string, messageId: string, rating: AIRating): AIUpdateRating;
upsertAIActionRating(actionName: string, callId: string, rating: AIRating): AIUpdateRating;
upsertCustomAIActionRating(callId: string, rating: AIRating): AIUpdateRating;
upsertAIReviewRating(reviewName: string, callId: string, rating: AIRating, dataId?: string): AIUpdateRating;
upsertCustomAIReviewRating(callId: string, rating: AIRating, dataId?: string): AIUpdateRating;
}
export type AIGenericRequest = {
request: Promise<Response>;
abortController: AbortController;
};
export type AIConversationStartReply = {
id: string;
};
export type AIConversationStartRequest = {
getConversation: () => Promise<AIConversationStartReply>;
abortController: AbortController;
};
export type AIEventSourceMessageParsed = EventSourceMessage & {
data: Record<string, any>;
};
export type AIQueryAssistantReply = AsyncGenerator<AIEventSourceMessageParsed, void, undefined>;
export type AIConnectorRequest = {
getStream: () => Promise<AIQueryAssistantReply>;
abortController: AbortController;
};
export type AIConnectorQueryAssistantData = {
message: string;
conversationId: string;
parts: Array<AIContextItemRequestData>;
capabilities: AICapabilitiesRequestData | undefined;
model: string;
quickActionData?: AIQuickActionRequestData;
};
export type AIFetchDocumentReply = {
id: string;
content: string;
attributes?: {
version: number;
sessionId: string | null;
};
};
export type AIFetchDocumentRequest = {
getDocument: () => Promise<AIFetchDocumentReply>;
abortController: AbortController;
};
export type AIUploadReply = {
id: string;
};
export type AIUploadRequest = {
getId: () => Promise<AIUploadReply>;
abortController: AbortController;
};
export type AIConversationItem = {
id: string;
title: string;
createdAt: string;
updatedAt?: string;
pinned: boolean;
};
export type AIFetchConversationsRequest = {
getConversations: () => Promise<Array<AIConversationItem>>;
abortController: AbortController;
};
export type AIUpdateConversationRequest = {
getResult: () => Promise<{
title?: string;
pinned?: boolean;
}>;
abortController: AbortController;
};
export type AIDeleteConversationRequest = {
execute: () => Promise<void>;
abortController: AbortController;
};
export type AIUserMessage = {
capabilities: Record<string, any>;
content: Array<{
id: string;
type: AIContextItemType;
content: string;
name?: string;
url?: string;
attributes?: {
resourceId: string;
label: string;
};
}>;
prompt: string;
model: string;
id: string;
role: 'user';
attributes: Record<string, any>;
};
export type AIAssistantMessage = {
content: Array<{
id: string;
type: 'text' | 'modification';
content: string;
}>;
id: string;
role: 'assistant';
};
export type AIConversationMessage = AIUserMessage | AIAssistantMessage;
export type AIGetConversationReply = {
id: string;
model: string;
title: string;
pinned: boolean;
};
export type AIGetConversationRequest = {
getConversation: () => Promise<AIGetConversationReply>;
abortController: AbortController;
};
export type AIGetConversationMessagesRequest = {
getMessages: () => Promise<Array<AIConversationMessage>>;
abortController: AbortController;
};
export type AIModelData = {
id: string;
name: string;
provider: string;
description: string;
capabilities: {
webSearch: {
enabled: boolean;
};
reasoning: {
enabled: boolean;
};
};
};
export type AIModelRequest = {
list: () => Promise<{
items: Array<AIModelData>;
}>;
abortController: AbortController;
};
export type AIDeleteFileRequest = {
execute: () => Promise<void>;
abortController: AbortController;
};
export type AIDeleteDocumentRequest = {
execute: () => Promise<void>;
abortController: AbortController;
};
export type AIDeleteWebResourceRequest = {
execute: () => Promise<void>;
abortController: AbortController;
};
export type AIConnectorExecuteCustomActionData = {
content: string;
message: string;
model: string;
outputFormat: 'plainText' | 'html';
};
export type AIConnectorExecuteActionData = {
actionName: AIActionsNames;
content: string;
args?: {
language?: string;
};
};
export type AIConnectorSystemReviewData = {
reviewName: string;
content: string;
args?: {
language?: string;
};
};
export type AIConnectorCustomReviewData = {
content: string;
prompt: string;
model: string;
};
export type AIUpdateRating = {
execute: () => Promise<void>;
abortController: AbortController;
};
export type AIRating = {
positiveCount: number;
totalCount: number;
modificationId?: string;
};