import { DifyClient } from "./base"; import type { CompletionRequest, CompletionResponse } from "../types/completion"; import type { DifyResponse, DifyStream } from "../types/common"; import { ensureNonEmptyString } from "./validation"; const warned = new Set(); const warnOnce = (message: string): void => { if (warned.has(message)) { return; } warned.add(message); console.warn(message); }; export class CompletionClient extends DifyClient { createCompletionMessage( request: CompletionRequest ): Promise | DifyStream>; createCompletionMessage( inputs: Record, user: string, stream?: boolean, files?: Array> | null ): Promise | DifyStream>; createCompletionMessage( inputOrRequest: CompletionRequest | Record, user?: string, stream = false, files?: Array> | null ): Promise | DifyStream> { let payload: CompletionRequest; let shouldStream = stream; if (user === undefined && "user" in (inputOrRequest as CompletionRequest)) { payload = inputOrRequest as CompletionRequest; shouldStream = payload.response_mode === "streaming"; } else { ensureNonEmptyString(user, "user"); payload = { inputs: inputOrRequest as Record, user, files, response_mode: stream ? "streaming" : "blocking", }; } ensureNonEmptyString(payload.user, "user"); if (shouldStream) { return this.http.requestStream({ method: "POST", path: "/completion-messages", data: payload, }); } return this.http.request({ method: "POST", path: "/completion-messages", data: payload, }); } stopCompletionMessage( taskId: string, user: string ): Promise> { ensureNonEmptyString(taskId, "taskId"); ensureNonEmptyString(user, "user"); return this.http.request({ method: "POST", path: `/completion-messages/${taskId}/stop`, data: { user }, }); } stop( taskId: string, user: string ): Promise> { return this.stopCompletionMessage(taskId, user); } runWorkflow( inputs: Record, user: string, stream = false ): Promise> | DifyStream>> { warnOnce( "CompletionClient.runWorkflow is deprecated. Use WorkflowClient.run instead." ); ensureNonEmptyString(user, "user"); const payload = { inputs, user, response_mode: stream ? "streaming" : "blocking", }; if (stream) { return this.http.requestStream>({ method: "POST", path: "/workflows/run", data: payload, }); } return this.http.request>({ method: "POST", path: "/workflows/run", data: payload, }); } }