Many-in-one AI client.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.6 KiB

  1. import {
  2. DoFetch,
  3. PlatformError,
  4. PlatformResponse,
  5. } from '../common';
  6. export enum CreateImageSize {
  7. SQUARE_256 = '256x256',
  8. SQUARE_512 = '512x512',
  9. SQUARE_1024 = '1024x1024',
  10. }
  11. export enum CreateImageResponseFormat {
  12. URL = 'url',
  13. BASE64_JSON = 'b64_json',
  14. }
  15. export interface CreateImageParams {
  16. prompt: string;
  17. n? : number;
  18. size?: CreateImageSize;
  19. user?: string;
  20. }
  21. export interface CreateImageData {
  22. b64_json: string;
  23. }
  24. export interface CreateImageDataEvent extends PlatformResponse {
  25. data: Buffer[];
  26. }
  27. export function createImage(
  28. this: NodeJS.EventEmitter,
  29. doFetch: DoFetch,
  30. params: CreateImageParams,
  31. ) {
  32. doFetch('POST', '/images/generations', {
  33. prompt: params.prompt,
  34. n: params.n ?? 1,
  35. size: params.size ?? CreateImageSize.SQUARE_1024,
  36. user: params.user,
  37. response_format: CreateImageResponseFormat.BASE64_JSON,
  38. })
  39. .then(async (response) => {
  40. if (!response.ok) {
  41. this.emit('error', new PlatformError(
  42. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  43. `Request from platform returned with status: ${response.status}`,
  44. response,
  45. ));
  46. this.emit('end');
  47. return;
  48. }
  49. const responseData = await response.json() as Record<string, unknown>;
  50. const data = responseData.data as CreateImageData[];
  51. this.emit('data', {
  52. ...responseData,
  53. data: data.map((item) => Buffer.from(item.b64_json, 'base64')),
  54. });
  55. this.emit('end');
  56. })
  57. .catch((err) => {
  58. this.emit('error', err as Error);
  59. this.emit('end');
  60. });
  61. return this;
  62. }