dify-node-sdk
Version:
712 lines (703 loc) • 20.3 kB
TypeScript
import * as axios7 from "axios";
import * as axios0 from "axios";
import * as axios12 from "axios";
import * as axios15 from "axios";
import { AxiosInstance } from "axios";
//#region src/utils/streamResponse/handler/type.d.ts
type EventType = 'workflow_started' | 'workflow_finished' | 'node_started' | 'node_finished' | 'message' | 'message_file' | 'message_end' | 'tts_message' | 'tts_message_end' | 'text_chunk' | 'message_replace' | 'error';
interface BaseEvent<T extends EventType> {
event: T;
task_id: string;
}
interface WorkflowStartedEvent extends BaseEvent<'workflow_started'> {
workflow_run_id: string;
data: {
id: string;
workflow_id: string;
sequence_number: number;
created_at: number;
};
}
interface WorkflowFinishedEvent extends BaseEvent<'workflow_finished'> {
workflow_run_id: string;
data: {
id: string;
workflow_id: string;
outputs: Record<string, unknown>;
status: Status;
error: string;
elapsed_time: number;
total_tokens: number;
total_steps: string;
created_at: number;
finished_at: number;
};
}
interface NodeStartedEvent extends BaseEvent<'node_started'> {
workflow_run_id: string;
data: {
id: string;
node_id: string;
node_type: string;
title: string;
index: number;
predecessor_node_id: string;
inputs: AnyObject;
created_at: number;
};
}
interface NodeFinishedEvent extends BaseEvent<'node_finished'> {
workflow_run_id: string;
data: {
id: string;
node_id: string;
node_type: string;
title: string;
index: number;
predecessor_node_id: string;
process_data?: AnyObject;
inputs: AnyObject;
outputs?: AnyObject;
status: Status;
error: string;
elapsed_time?: number;
execution_metadata: {
total_tokens?: number;
total_price?: number;
currency?: string;
};
created_at: number;
};
}
interface MessageEvent extends BaseEvent<'message'> {
message_id: string;
conversation_id: string;
answer: string;
created_at: number;
}
interface MessageFileEvent extends BaseEvent<'message_file'> {
conversation_id: string;
type: string;
belongs_to: 'assistant';
url: string;
}
interface MessageEndEvent extends BaseEvent<'message_end'> {
id: string;
message_id: string;
conversation_id: string;
metadata: {
usage: Usage;
retriever_resources?: RetrieverResource[];
};
}
interface TTSMessageEvent extends BaseEvent<'tts_message'> {
message_id: string;
audio: string;
created_at: number;
}
interface TTSMessageEndEvent extends BaseEvent<'tts_message_end'> {
message_id: string;
audio: '';
created_at: number;
}
interface TextChunkEvent extends BaseEvent<'text_chunk'> {
workflow_run_id: string;
data: {
text: string;
from_variable_selector: string[];
};
}
interface MessageReplaceEvent extends BaseEvent<'message_replace'> {
message_id: string;
conversation_id: string;
answer: string;
created_at: number;
}
interface ErrorEvent extends BaseEvent<'error'> {
error: string;
message_id: string;
status: number;
code: string;
message: string;
}
type ChatStreamEvent = WorkflowStartedEvent | WorkflowFinishedEvent | NodeStartedEvent | NodeFinishedEvent | MessageEvent | MessageFileEvent | MessageEndEvent | TTSMessageEvent | TTSMessageEndEvent | ErrorEvent;
type WorkflowStreamEvent = WorkflowStartedEvent | NodeStartedEvent | TextChunkEvent | NodeFinishedEvent | WorkflowFinishedEvent | TTSMessageEvent | TTSMessageEndEvent;
type CompletionStreamEvent = MessageEvent | MessageEndEvent | TTSMessageEvent | TTSMessageEndEvent | MessageReplaceEvent | ErrorEvent; //#endregion
//#region src/utils/streamResponse/handler/base.d.ts
/**
* 通用错误处理器
*/
type ErrorHandler = (error: Error) => void;
/**
* 完成处理器
*/
type CompletionHandler = () => void;
/**
* 事件处理器类型
*/
type EventHandler<T extends BaseEvent<EventType>> = (event: T) => void;
/**
* 基础流处理器 - 提供通用的流处理机制
*/
declare abstract class BaseStreamHandler<T extends BaseEvent<EventType>> {
protected readonly eventHandlers: Map<EventType, EventHandler<T>[]>;
protected readonly errorHandlers: ErrorHandler[];
protected readonly completionHandlers: CompletionHandler[];
protected readonly stream: NodeJS.ReadableStream;
protected isStopped: boolean;
protected isStart: boolean;
/**
* 创建流处理器
* @param stream 响应流对象
*/
constructor(stream: NodeJS.ReadableStream);
start(): void;
/**
* 处理流内容
*/
protected processStream(): void;
/**
* 处理单条数据
* @param data 数据字符串
*/
/**
* 处理接收到的数据
*/
protected processData(data: string): void;
/**
* 分发事件
* @param event 事件对象
*/
protected dispatchEvent(event: T): void;
/**
* 触发错误
* @param error 错误对象
*/
protected emitError(error: Error): void;
/**
* 触发完成
*/
protected emitCompletion(): void;
/**
* 清理资源
*/
protected cleanUp(): void;
/**
* 注册事件处理器
* @param eventType 事件类型
* @param handler 处理函数
*/
protected registerEventHandler<E extends EventType>(eventType: E, handler: EventHandler<any>): void;
/**
* 注册错误处理器
* @param handler 错误处理函数
*/
onError(handler: ErrorHandler): this;
/**
* 注册完成处理器
* @param handler 完成处理函数
*/
onFinished(handler: CompletionHandler): this;
/**
* 等待流完成
* @returns Promise 当流完成时解析
*/
waitForCompletion(): Promise<void>;
}
//#endregion
//#region src/utils/streamResponse/handler/chat.d.ts
/**
* 聊天流处理器
*/
declare class ChatStreamHandler extends BaseStreamHandler<ChatStreamEvent> {
/**
* 注册消息事件处理器
*/
onMessage(handler: EventHandler<MessageEvent>): this;
/**
* 注册消息文件事件处理器
*/
onMessageFile(handler: EventHandler<MessageFileEvent>): this;
/**
* 注册消息结束事件处理器
*/
onMessageEnd(handler: EventHandler<MessageEndEvent>): this;
/**
* 注册文本转语音消息事件处理器
*/
onTtsMessage(handler: EventHandler<TTSMessageEvent>): this;
/**
* 注册文本转语音结束事件处理器
*/
onTtsMessageEnd(handler: EventHandler<TTSMessageEndEvent>): this;
/**
* 注册消息替换事件处理器
*/
onMessageReplace(handler: EventHandler<MessageReplaceEvent>): this;
/**
* 注册错误事件处理器
*/
onErrorEvent(handler: EventHandler<ErrorEvent>): this;
}
//#endregion
//#region src/utils/streamResponse/handler/completion.d.ts
/**
* 完成流处理器类型
*/
type CompletionEvent = MessageEvent | MessageEndEvent | TTSMessageEvent | TTSMessageEndEvent | MessageReplaceEvent | ErrorEvent;
/**
* 完成流处理器
*/
declare class CompletionStreamHandler extends BaseStreamHandler<CompletionEvent> {
/**
* 注册消息事件处理器
*/
onMessage(handler: EventHandler<MessageEvent>): this;
/**
* 注册消息结束事件处理器
*/
onMessageEnd(handler: EventHandler<MessageEndEvent>): this;
/**
* 注册文本转语音消息事件处理器
*/
onTtsMessage(handler: EventHandler<TTSMessageEvent>): this;
/**
* 注册文本转语音结束事件处理器
*/
onTtsMessageEnd(handler: EventHandler<TTSMessageEndEvent>): this;
/**
* 注册消息替换事件处理器
*/
onMessageReplace(handler: EventHandler<MessageReplaceEvent>): this;
/**
* 注册错误事件处理器
*/
onErrorEvent(handler: EventHandler<ErrorEvent>): this;
}
//#endregion
//#region src/utils/streamResponse/handler/workflow.d.ts
/**
* 工作流流处理器
*/
declare class WorkflowStreamHandler extends BaseStreamHandler<WorkflowStreamEvent> {
/**
* 注册工作流开始事件处理器
*/
onWorkflowStarted(handler: EventHandler<WorkflowStartedEvent>): this;
/**
* 注册工作流完成事件处理器
*/
onWorkflowFinished(handler: EventHandler<WorkflowFinishedEvent>): this;
/**
* 注册节点开始事件处理器
*/
onNodeStarted(handler: EventHandler<NodeStartedEvent>): this;
/**
* 注册节点完成事件处理器
*/
onNodeFinished(handler: EventHandler<NodeFinishedEvent>): this;
/**
* 注册文本块事件处理器
*/
onTextChunk(handler: EventHandler<TextChunkEvent>): this;
/**
* 注册文本转语音消息事件处理器
*/
onTtsMessage(handler: EventHandler<TTSMessageEvent>): this;
/**
* 注册文本转语音结束事件处理器
*/
onTtsMessageEnd(handler: EventHandler<TTSMessageEndEvent>): this;
}
//#endregion
//#region src/client/type.d.ts
interface Usage {
prompt_tokens: number;
prompt_unit_price: string;
prompt_price_unit: string;
prompt_price: string;
completion_tokens: number;
completion_unit_price: string;
completion_price_unit: string;
completion_price: string;
total_tokens: number;
total_price: string;
currency: string;
latency: number;
}
interface RetrieverResource {
id: string;
content: string;
source?: string;
score?: number;
metadata?: Record<string, unknown>;
}
/** inputs var */
type AnyObject = Record<string, any>;
type Status = 'running' | 'succeeded' | 'failed' | 'stopped';
type ResponseModeType = 'streaming' | 'blocking';
type FeedbackRating = 'like' | 'dislike' | null;
/**
* 用户标识
* @description 不管是什么类型,最终都会被dify的 python代码 转换为字符串
*/
type User<T = any> = T;
type AppParameters = {
opening_statement: string;
suggested_questions: string[];
suggested_questions_after_answer: {
enable: boolean;
};
speech_to_text: {
enable: boolean;
};
text_to_speech: {
enable: boolean;
voice: string;
language: string;
autoPlay: 'disabled' | 'enabled';
};
retriever_resource: {
enable: boolean;
};
annotation_reply: {
enable: boolean;
};
user_input_form: [{
'text-input': {
label: string;
variable: string;
required: boolean;
max_length: number;
default: '';
};
}, {
paragraph: {
label: string;
variable: string;
required: boolean;
default: '';
};
}, {
select: {
label: string;
variable: string;
required: boolean;
default: string;
options: string[];
};
}];
file_upload: {
image: {
enabled: boolean;
number_limits: number;
transfer_methods: string[];
};
allowed_file_types: string[];
allowed_file_extensions: string[];
allowed_file_upload_methods: string[];
number_limits: number;
fileUploadConfig: {
file_size_limit: number;
batch_count_limit: number;
image_file_size_limit: number;
video_file_size_limit: number;
audio_file_size_limit: number;
workflow_file_upload_limit: number;
};
};
system_parameters: {
image_file_size_limit: number;
video_file_size_limit: number;
audio_file_size_limit: number;
file_size_limit: number;
workflow_file_upload_limit: number;
};
};
interface AppMeta {
tool_icons: {
[key: string]: string | {
background: string;
content: string;
};
};
}
interface FileUploadResponse {
id: string;
name: string;
size: number;
extension: string;
mime_type: string;
created_by: string;
created_at: number;
preview_url: string | null;
}
interface VisionFile {
type: 'document' | 'image' | 'audio' | 'video' | 'custom';
name: string;
transfer_method: 'remote_url' | 'local_file';
/** 当transfer_method为remote_url时,url为必填 */
url?: string;
/** 当transfer_method为local_file时,upload_file_id为必填 */
upload_file_id?: string;
}
interface ChatMessageParams<T extends ResponseModeType = 'blocking'> {
inputs?: AnyObject;
query: string;
user: string;
conversation_id?: string;
files?: VisionFile[];
response_mode?: T;
auto_generate_name?: boolean;
}
type ChatResponseType<T extends ResponseModeType> = T extends 'streaming' ? ChatStreamHandler : ChatCompletionResponse;
interface ChatCompletionResponse {
event: 'message';
task_id: string;
id: string;
message_id: string;
conversation_id: string;
mode: 'chat';
answer: string;
metadata: {
usage: Usage;
retriever_resources: RetrieverResource[];
};
created_at: number;
}
type ChatCompletionChunkResponse = string;
type SuggestedResponse = {
result: 'success';
data: string[];
};
type RenameConversationParams = {
conversation_id: string;
name?: string;
user: User;
/** default false */
auto_generate?: boolean;
};
type RenameConversationResponse = {
id: string;
name: string;
inputs: AnyObject;
status: 'normal' | string;
introduction: string;
created_at: number;
updated_at: number;
};
type DeleteConversationParams = {
conversation_id: string;
user: User;
};
type DeleteConversationResponse = {
result: 'success';
};
type ConversationParams = {
user: User;
last_id?: string;
/** int_range(1, 100), default 20 */
limit?: number;
/** default -updated_at */
sort_by?: 'created_at' | '-created_at' | 'updated_at' | '-updated_at';
};
type Conversations = {
id: string;
inputs: AnyObject;
introduction: string;
name: string;
status: 'normal' | string;
created_at: number;
updated_at: number;
};
type ConversationResponse = {
limit: number;
has_more: boolean;
data: Conversations[];
};
type ConversationMessageParams = {
user: User;
conversation_id: string;
last_id?: string;
/** int_range(1, 100), default 20 */
limit?: number;
};
type Message = {
agent_thoughts: [];
answer: string;
conversation_id: string;
created_at: number;
error: null;
feedback: FeedbackRating | null;
id: string;
inputs: AnyObject;
message_files: {
id: string;
type: 'image' | string;
url: string;
belongs_to: 'assistant' | 'user';
}[];
metadata: Record<string, any>;
parent_message_id: string | null;
query: string;
retriever_resources: RetrieverResource[];
status: 'normal' | string;
};
type ConversationMessageResponse = {
limit: number;
has_more: boolean;
data: Message[];
};
type RunWorkflowParams<T extends ResponseModeType = 'blocking'> = {
inputs?: Record<string, any | VisionFile[]>;
user: User;
response_mode?: T;
};
interface WorkflowCompletionResponse {
workflow_run_id: string;
task_id: string;
data: {
id: string;
workflow_id: string;
status: Status;
outputs?: AnyObject;
error?: string;
elapsed_time?: number;
total_tokens?: number;
total_steps: number;
created_at: number;
finished_at: number;
};
}
type WorkflowResponse<T extends ResponseModeType> = T extends 'streaming' ? WorkflowStreamHandler : WorkflowCompletionResponse;
type WorkflowRunStatus = 'succeeded' | 'failed' | 'stopped';
type GetLogsParams = {
keyword?: string;
status?: WorkflowRunStatus;
page?: number;
limit?: number;
};
type WorkflowLog = {
id: string;
workflow_run: {
id: string;
version: string;
status: WorkflowRunStatus;
error: string | null;
elapsed_time: number;
total_tokens: number;
total_steps: number;
created_at: number;
finished_at: number;
};
created_from: string;
created_by_role: string;
created_by_account: string | null;
created_by_end_user: {
id: string;
type: string;
is_anonymous: boolean;
session_id: string;
};
created_at: number;
};
type WorkflowLogResponse = {
page: number;
limit: number;
total: number;
has_more: boolean;
data: WorkflowLog[];
};
type CreateCompletionMessageParams<T extends ResponseModeType = 'blocking'> = {
inputs: {
query: string;
[key: string]: any;
};
user: User;
files?: VisionFile[];
response_mode?: T;
};
type CompletionResponse<T extends ResponseModeType> = T extends 'streaming' ? CompletionStreamHandler : CompletionCompletionResponse;
interface CompletionCompletionResponse {
event: 'message';
task_id: string;
id: string;
message_id: string;
conversation_id: string;
} //#endregion
//#region src/client/dify.d.ts
/**
* Dify API Base Class
*/
declare class DifyClient {
protected apiKey: string;
protected baseUrl: string;
protected request: AxiosInstance;
/**
* Create Dify Client Instance
* @param apiKey API Key
* @param baseUrl API Base URL, default to official API address
*/
constructor(apiKey: string, baseUrl?: string);
messageFeedback(messageId: string, rating: FeedbackRating, user: User): Promise<axios7.AxiosResponse<{
result: "success";
}, any>>;
getApplicationParameters(): Promise<axios7.AxiosResponse<AppParameters, any>>;
getMeta(): Promise<axios7.AxiosResponse<AppMeta, any>>;
fileUpload(file: File, user: string): Promise<axios7.AxiosResponse<FileUploadResponse, any>>;
/**
* @deprecated dify 源码中还接受了voice参数,同时源码中貌似并未对streaming参数进行处理
*/
textToVideo(data: {
message_id?: string;
text?: string;
user: User;
streaming?: boolean;
}): Promise<axios7.AxiosResponse<ArrayBuffer, any>>;
}
//#endregion
//#region src/client/chat.d.ts
declare class ChatClient extends DifyClient {
createChatMessage<T extends ResponseModeType = 'blocking'>(params: ChatMessageParams<T>): Promise<ChatResponseType<T>>;
getSuggested(messageId: string, user: User): Promise<axios0.AxiosResponse<SuggestedResponse, any>>;
/**
* @param taskId get it from chunk response
* @param user
*/
stopMessage(taskId: string, user: User): Promise<axios0.AxiosResponse<{
result: "success";
}, any>>;
getConversations(params: ConversationParams): Promise<axios0.AxiosResponse<ConversationResponse, any>>;
getConversationMessages(params: ConversationMessageParams): Promise<axios0.AxiosResponse<ConversationMessageResponse, any>>;
renameConversation(data: RenameConversationParams): Promise<axios0.AxiosResponse<RenameConversationResponse, any>>;
deleteConversation(data: DeleteConversationParams): Promise<axios0.AxiosResponse<{
result: "success";
}, any>>;
/**
* @param file file support ["mp3", "m4a", "wav", "webm", "amr"], limit 15MB
* @param user 用户
*/
audioToText(file: File, user: User): Promise<axios0.AxiosResponse<{
text: string;
}, any>>;
}
//#endregion
//#region src/client/workflow.d.ts
declare class WorkflowClient extends DifyClient {
run<T extends ResponseModeType = 'blocking'>(data: RunWorkflowParams<T>): Promise<WorkflowResponse<T>>;
getRunDetail(workflowRunId: string): Promise<axios12.AxiosResponse<any, any>>;
stop(taskId: string, user: User): Promise<axios12.AxiosResponse<{
result: "success";
}, any>>;
getLogs(params: GetLogsParams): Promise<axios12.AxiosResponse<WorkflowLogResponse, any>>;
}
//#endregion
//#region src/client/completion.d.ts
declare class CompletionClient extends DifyClient {
createCompletionMessage<T extends ResponseModeType = 'blocking'>(data: CreateCompletionMessageParams<T>): Promise<CompletionResponse<T>>;
stop(taskId: string, user: User): Promise<axios15.AxiosResponse<{
result: "success";
}, any>>;
}
//#endregion
export { AnyObject, AppMeta, AppParameters, BaseEvent, ChatClient, ChatCompletionChunkResponse, ChatCompletionResponse, ChatMessageParams, ChatResponseType, ChatStreamEvent, CompletionClient, CompletionCompletionResponse, CompletionResponse, CompletionStreamEvent, ConversationMessageParams, ConversationMessageResponse, ConversationParams, ConversationResponse, Conversations, CreateCompletionMessageParams, DeleteConversationParams, DeleteConversationResponse, DifyClient, ErrorEvent, EventType, FeedbackRating, FileUploadResponse, GetLogsParams, Message, MessageEndEvent, MessageEvent, MessageFileEvent, MessageReplaceEvent, NodeFinishedEvent, NodeStartedEvent, RenameConversationParams, RenameConversationResponse, ResponseModeType, RetrieverResource, RunWorkflowParams, Status, SuggestedResponse, TTSMessageEndEvent, TTSMessageEvent, TextChunkEvent, Usage, User, VisionFile, WorkflowClient, WorkflowCompletionResponse, WorkflowFinishedEvent, WorkflowLog, WorkflowLogResponse, WorkflowResponse, WorkflowRunStatus, WorkflowStartedEvent, WorkflowStreamEvent };