import type { DifyResponse, DifyStream, JsonObject, SuccessResponse } from '../types/common' import type { CompletionRequest, CompletionResponse } from '../types/completion' import { DifyClient } from './base' 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: JsonObject, user: string, stream?: boolean, files?: CompletionRequest['files'], ): Promise | DifyStream> createCompletionMessage( inputOrRequest: CompletionRequest | JsonObject, user?: string, stream = false, files?: CompletionRequest['files'], ): 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, 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: JsonObject, 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, }) } }