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.

167 lines
4.2 KiB

  1. import * as FormDataUtils from '../../../packages/form-data';
  2. import {
  3. CreatedResource,
  4. } from '../common';
  5. import { DoFetch } from '../../../packages/request';
  6. import { PlatformApiError } from '../../../common';
  7. export enum ImageSize {
  8. SQUARE_256 = '256x256',
  9. SQUARE_512 = '512x512',
  10. SQUARE_1024 = '1024x1024',
  11. }
  12. export enum ImageResponseFormat {
  13. URL = 'url',
  14. BASE64_JSON = 'b64_json',
  15. }
  16. export interface CreateImageParams {
  17. prompt: string;
  18. n? : number;
  19. size?: ImageSize;
  20. user?: string;
  21. }
  22. export interface ImageData {
  23. b64_json: string;
  24. }
  25. export interface ImageDataEvent extends CreatedResource {
  26. data: Buffer[];
  27. }
  28. export function createImage(
  29. this: NodeJS.EventEmitter,
  30. doFetch: DoFetch,
  31. params: CreateImageParams,
  32. ) {
  33. doFetch('POST', '/images/generations', {
  34. prompt: params.prompt,
  35. n: params.n ?? 1,
  36. size: params.size ?? ImageSize.SQUARE_1024,
  37. user: params.user,
  38. response_format: ImageResponseFormat.BASE64_JSON,
  39. } as Record<string, unknown>)
  40. .then(async (response) => {
  41. if (!response.ok) {
  42. this.emit('error', new PlatformApiError(
  43. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  44. `Request from platform returned with status: ${response.status}`,
  45. response,
  46. ));
  47. this.emit('end');
  48. return;
  49. }
  50. const responseData = await response.json() as Record<string, unknown>;
  51. const data = responseData.data as ImageData[];
  52. this.emit('data', {
  53. ...responseData,
  54. data: data.map((item) => Buffer.from(item.b64_json, 'base64')),
  55. });
  56. this.emit('end');
  57. })
  58. .catch((err) => {
  59. this.emit('error', err as Error);
  60. this.emit('end');
  61. });
  62. return this;
  63. }
  64. export interface CreateImageEditParams {
  65. image: Buffer;
  66. mask?: Buffer;
  67. prompt: string;
  68. n?: number;
  69. size?: ImageSize;
  70. user?: string;
  71. }
  72. export function createImageEdit(
  73. this: NodeJS.EventEmitter,
  74. doFetch: DoFetch,
  75. params: CreateImageEditParams,
  76. ) {
  77. doFetch('POST', '/images/edits', FormDataUtils.fromJson({
  78. prompt: params.prompt,
  79. image: params.image,
  80. mask: params.mask,
  81. n: params.n ?? 1,
  82. size: params.size ?? ImageSize.SQUARE_1024,
  83. response_format: ImageResponseFormat.BASE64_JSON,
  84. }))
  85. .then(async (response) => {
  86. if (!response.ok) {
  87. this.emit('error', new PlatformApiError(
  88. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  89. `Request from platform returned with status: ${response.status}`,
  90. response,
  91. ));
  92. this.emit('end');
  93. return;
  94. }
  95. const responseData = await response.json() as Record<string, unknown>;
  96. const data = responseData.data as ImageData[];
  97. const emittedData = {
  98. ...responseData,
  99. data: data.map((item) => Buffer.from(item.b64_json, 'base64')),
  100. } as ImageDataEvent;
  101. this.emit('data', emittedData);
  102. this.emit('end');
  103. })
  104. .catch((err) => {
  105. this.emit('error', err as Error);
  106. this.emit('end');
  107. });
  108. return this;
  109. }
  110. export interface CreateImageVariationParams {
  111. image: Buffer;
  112. n?: number;
  113. size?: ImageSize;
  114. user?: string;
  115. }
  116. export function createImageVariation(
  117. this: NodeJS.EventEmitter,
  118. doFetch: DoFetch,
  119. params: CreateImageVariationParams,
  120. ) {
  121. doFetch('POST', '/images/variations', FormDataUtils.fromJson({
  122. image: params.image,
  123. n: params.n ?? 1,
  124. size: params.size ?? ImageSize.SQUARE_1024,
  125. response_format: ImageResponseFormat.BASE64_JSON,
  126. }))
  127. .then(async (response) => {
  128. if (!response.ok) {
  129. this.emit('error', new PlatformApiError(
  130. // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
  131. `Request from platform returned with status: ${response.status}`,
  132. response,
  133. ));
  134. this.emit('end');
  135. return;
  136. }
  137. const responseData = await response.json() as Record<string, unknown>;
  138. const data = responseData.data as ImageData[];
  139. this.emit('data', {
  140. ...responseData,
  141. data: data.map((item) => Buffer.from(item.b64_json, 'base64')),
  142. });
  143. this.emit('end');
  144. })
  145. .catch((err) => {
  146. this.emit('error', err as Error);
  147. this.emit('end');
  148. });
  149. return this;
  150. }