aboutsummaryrefslogtreecommitdiff
path: root/src/server/ApiManagers/FireflyManager.ts
diff options
context:
space:
mode:
authorsharkiecodes <lanyi_stroud@brown.edu>2025-03-11 16:27:30 -0400
committersharkiecodes <lanyi_stroud@brown.edu>2025-03-11 16:27:30 -0400
commit3f54517e96ccff233b1560627995024e137dbdfd (patch)
tree7c0ce1bb4cb7555425acf44bc5cd15876f90ee77 /src/server/ApiManagers/FireflyManager.ts
parent04669ffeb163688c7aefd7b5face7998252abdca (diff)
Doing outpainting implementation
Diffstat (limited to 'src/server/ApiManagers/FireflyManager.ts')
-rw-r--r--src/server/ApiManagers/FireflyManager.ts319
1 files changed, 319 insertions, 0 deletions
diff --git a/src/server/ApiManagers/FireflyManager.ts b/src/server/ApiManagers/FireflyManager.ts
index e75ede9df..1e0fdb595 100644
--- a/src/server/ApiManagers/FireflyManager.ts
+++ b/src/server/ApiManagers/FireflyManager.ts
@@ -8,6 +8,7 @@ import { DashUploadUtils } from '../DashUploadUtils';
import { _error, _invalid, _success, Method } from '../RouteManager';
import { Directory, filesDirectory } from '../SocketData';
import ApiManager, { Registration } from './ApiManager';
+import { Upload } from '../SharedMediaTypes';
export default class FireflyManager extends ApiManager {
getBearerToken = () =>
@@ -328,6 +329,324 @@ export default class FireflyManager extends ApiManager {
});
}),
});
+
+ register({
+ method: Method.POST,
+ subscription: '/outpaintImageFour',
+ secureHandler: ({ req, res }) =>
+
+ this.uploadImageToDropbox(req.body.imageUrl, req.user as DashUserModel)
+ .then(uploadUrl => {
+ if (uploadUrl instanceof Error) {
+ _invalid(res, uploadUrl.message);
+ return;
+ }
+ return this.getBearerToken()
+ .then(tokenResponse => tokenResponse?.json())
+ .then((tokenData: { access_token: string }) =>
+ fetch('https://firefly-api.adobe.io/v3/images/expand', {
+ method: 'POST',
+ headers: {
+ //'Content-Type': 'application/json',
+ 'Accept': 'application/json',
+ 'x-api-key': process.env._CLIENT_FIREFLY_CLIENT_ID ?? '',
+ 'Authorization': `Bearer ${tokenData.access_token}`,
+ },
+ body: JSON.stringify({
+ image: {
+ source: { url: uploadUrl },
+ },
+ size: {
+ width: req.body.newDimensions.width,
+ height: req.body.newDimensions.height,
+ },
+ prompt: req.body.prompt ?? '',
+ numVariations: 1,
+ placement: {
+ inset: {
+ left: 0,
+ top: 0,
+ right: req.body.newDimensions.width - req.body.originalDimensions.width,
+ bottom: req.body.newDimensions.height - req.body.originalDimensions.height,
+ },
+ alignment: {
+ horizontal: 'center',
+ vertical: 'center',
+ },
+ },
+ }),
+ })
+ )
+ .then(expandResp => expandResp?.json())
+ .then(expandData => {
+ if (expandData.error_code || !expandData.outputs?.[0]?.image?.url) {
+ console.error('Firefly validation error:', expandData);
+ _error(res, expandData.message ?? 'Failed to generate image');
+ } else {
+ DashUploadUtils.UploadImage(expandData.outputs[0].image.url)
+ .then((info: Upload.ImageInformation | Error) => {
+ if (info instanceof Error) {
+ _invalid(res, info.message);
+ } else {
+ _success(res, { url: info.accessPaths.agnostic.client });
+ }
+ })
+ .catch(uploadErr => {
+ console.error('DashUpload Error:', uploadErr);
+ _error(res, 'Failed to upload generated image.');
+ });
+ }
+ })
+ .catch(err => {
+ console.error('Firefly request error:', err);
+ _error(res, 'Failed to expand image');
+ });
+ }),
+ });
+ register({
+ method: Method.POST,
+ subscription: '/outpaintImageThree',
+ secureHandler: ({ req, res }) =>
+ new Promise<void>(resolver => {
+ this.uploadImageToDropbox(req.body.imageUrl, req.user as DashUserModel)
+ .then(dropboxImgUrl => {
+ if (dropboxImgUrl instanceof Error) {
+ _invalid(res, dropboxImgUrl.message);
+ throw new Error('Error uploading image to dropbox');
+ }
+ return dropboxImgUrl;
+ })
+ .then(dropboxImgUrl =>
+ this.getBearerToken().then(tokenResponse =>
+ tokenResponse?.json().then((tokenData: { access_token: string }) =>
+ fetch('https://firefly-api.adobe.io/v3/images/expand', {
+ method: 'POST',
+ headers: [
+ ['Content-Type', 'application/json'],
+ ['Accept', 'application/json'],
+ ['x-api-key', process.env._CLIENT_FIREFLY_CLIENT_ID ?? ''],
+ ['Authorization', `Bearer ${tokenData.access_token}`],
+ ],
+ body: JSON.stringify({
+ image: {
+ source: {
+ url: dropboxImgUrl,
+ },
+ },
+ numVariations: 1,
+ prompt: req.body.prompt,
+ size: {
+ width: req.body.newDimensions.width,
+ height: req.body.newDimensions.height,
+ },
+ placement: {
+ inset: {
+ left: 0,
+ top: 0,
+ right: req.body.newDimensions.width - req.body.originalDimensions.width,
+ bottom: req.body.newDimensions.height - req.body.originalDimensions.height,
+ },
+ alignment: {
+ horizontal: 'center',
+ vertical: 'center',
+ },
+ },
+ }),
+ })
+ .then(resp => resp.json())
+ .then(expandData => {
+ if (expandData.error_code || !expandData.outputs?.[0]?.image?.url) {
+ _invalid(res, expandData.message ?? 'Failed to expand image');
+ resolver();
+ } else {
+ DashUploadUtils.UploadImage(expandData.outputs[0].image.url)
+ .then(info => {
+ if (info instanceof Error) {
+ _invalid(res, info.message);
+ } else {
+ _success(res, { url: info.accessPaths.agnostic.client });
+ }
+ })
+ .then(resolver)
+ .catch(uploadErr => {
+ console.error('DashUpload Error:', uploadErr);
+ _invalid(res, 'Failed to upload generated image.');
+ resolver();
+ });
+ }
+ })
+ .catch(err => {
+ console.error('Firefly API Error:', err);
+ _error(res, 'Failed to expand image');
+ resolver();
+ })
+ )
+ )
+ )
+ .catch(err => {
+ console.error('Dropbox Error:', err);
+ _error(res, 'Failed to upload image to Dropbox');
+ resolver();
+ });
+ }),
+ });
+
+
+ register({
+ method: Method.POST,
+ subscription: '/outpaintImageTwo',
+ secureHandler: async ({ req, res }) => {
+ try {
+ const uploadUrl = await this.uploadImageToDropbox(req.body.imageUrl, req.user as DashUserModel);
+
+ if (uploadUrl instanceof Error) {
+ _invalid(res, uploadUrl.message);
+ return;
+ }
+
+ const tokenResponse = await this.getBearerToken();
+ const tokenData = await tokenResponse?.json();
+
+ const body = JSON.stringify({
+ image: { source: { url: uploadUrl } },
+ prompt: req.body.prompt,
+ numVariations: 1,
+ size: {
+ width: req.body.newDimensions.width,
+ height: req.body.newDimensions.height,
+ },
+ placement: {
+ inset: {
+ left: 0,
+ top: 0,
+ right: req.body.newDimensions.width - req.body.originalDimensions.width,
+ bottom: req.body.newDimensions.height - req.body.originalDimensions.height,
+ },
+ alignment: {
+ horizontal: 'center',
+ vertical: 'center',
+ },
+ },
+ });
+
+ console.log('Sending outpainting request:', body);
+
+ const expandResp = await fetch('https://firefly-api.adobe.io/v3/images/expand', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ 'x-api-key': process.env._CLIENT_FIREFLY_CLIENT_ID ?? '',
+ Authorization: `Bearer ${tokenData.access_token}`,
+ },
+ body,
+ });
+
+ const expandData = await expandResp.json();
+ console.log('Received expandData:', expandData);
+
+ if (expandData.error_code || !expandData.outputs?.[0]?.image?.url) {
+ console.error('Expand API Error:', expandData);
+ _error(res, expandData.message ?? 'Failed to generate image');
+ return;
+ }
+
+ const uploadedInfo = await DashUploadUtils.UploadImage(expandData.outputs[0].image.url);
+
+ if (uploadedInfo instanceof Error) {
+ console.error('Upload Error:', uploadedInfo.message);
+ _invalid(res, uploadedInfo.message);
+ return;
+ }
+
+ console.log('Successfully uploaded image URL:', uploadedInfo.accessPaths.agnostic.client);
+ _success(res, { url: uploadedInfo.accessPaths.agnostic.client });
+ } catch (err) {
+ console.error('Unexpected error during outpainting:', err);
+ _error(res, 'Unexpected error during outpainting');
+ }
+ },
+ });
+
+ register({
+
+
+ method: Method.POST,
+ subscription: '/outpaintImage',
+ secureHandler: ({ req, res }) =>
+ this.uploadImageToDropbox(req.body.imageUrl, req.user as DashUserModel).then(uploadUrl =>
+ uploadUrl instanceof Error
+ ? _invalid(res, uploadUrl.message)
+ : this.getBearerToken()
+ .then(tokenResponse => tokenResponse?.json())
+ .then((tokenData: { access_token: string }) =>
+ fetch('https://firefly-api.adobe.io/v3/images/expand', {
+ method: 'POST',
+ headers: [
+ ['Content-Type', 'application/json'],
+ ['Accept', 'application/json'],
+ ['x-api-key', process.env._CLIENT_FIREFLY_CLIENT_ID ?? ''],
+ ['Authorization', `Bearer ${tokenData.access_token}`],
+ ],
+ body: JSON.stringify({
+ image: { source: { url: uploadUrl } },
+ numVariations: 1,
+ size: {
+ width: req.body.newDimensions.width,
+ height: req.body.newDimensions.height,
+ },
+ prompt: req.body.prompt,
+ placement: {
+ inset: {
+ left: 0,
+ top: 0,
+ right: 0, //req.body.newDimensions.width - req.body.originalDimensions.width,
+ bottom: 0 //req.body.newDimensions.height - req.body.originalDimensions.height,
+ },
+ alignment: {
+ horizontal: 'center',
+ vertical: 'center',
+ },
+ },
+ }),
+ })
+ )
+ .then(expandResp => expandResp.json())
+ .then(expandData => {
+ if (expandData.error_code || !expandData.outputs?.[0]?.image?.url) {
+ _error(res, expandData.message ?? "Failed to generate image");
+ } else {
+ DashUploadUtils.UploadImage(expandData.outputs[0].image.url)
+ .then((info: Upload.ImageInformation | Error) => {
+ if (info instanceof Error) {
+ _invalid(res, info.message);
+ } else {
+ // THIS IS CRUCIAL: Respond exactly how your front end expects
+ console.log("Successfully uploaded image. URL:", info.accessPaths.agnostic.client);
+ _success(res, { url: info.accessPaths.agnostic.client });
+ }
+ })
+ .catch(uploadErr => {
+
+ console.error('DashUpload Error:', uploadErr);
+ _error(res, 'Failed to upload generated image.');
+ });
+ }
+ })
+ .catch(err => {
+ console.error(err);
+ _error(res, 'Failed to expand image');
+ })
+ ),
+ });
+
+ /* register({
+ method: Method.POST
+ subscription: '/queryFireflyOutpaint',
+ secureHandler: ({req, res}) =>
+ this.outpaintImage()
+ })*/
+
register({
method: Method.POST,
subscription: '/queryFireflyImage',