Skip to content

Commit

Permalink
Issue 29387 remove savepublish ia actionlet image (#29499)
Browse files Browse the repository at this point in the history
Removing the save + publish from the IA Actionlet Image

---------

Co-authored-by: Daniel Silva <daniel.silva@dotcms.com>
Co-authored-by: Victor Alfaro <victor.alfaro@dotcms.com>
  • Loading branch information
3 people authored Aug 20, 2024
1 parent b20e404 commit 910cc83
Show file tree
Hide file tree
Showing 17 changed files with 477 additions and 96 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.dotcms.ai.service;
package com.dotcms.ai.api;

import com.dotmarketing.util.json.JSONObject;

public interface OpenAIChatService {
public interface ChatAPI {

/**
* Returns a JSONObject with the results of the text generation given the provided prompt
Expand Down
6 changes: 6 additions & 0 deletions dotCMS/src/main/java/com/dotcms/ai/api/ChatAPIProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.dotcms.ai.api;

public interface ChatAPIProvider {

ChatAPI getChatAPI(Object... initArguments);
}
24 changes: 24 additions & 0 deletions dotCMS/src/main/java/com/dotcms/ai/api/DotAIAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,31 @@
*/
public interface DotAIAPI {

/**
* Returns the completions API
* @param initArguments
* @return
*/
CompletionsAPI getCompletionsAPI(Object... initArguments);

/**
* Returns the embeddings API
* @param initArguments
* @return
*/
EmbeddingsAPI getEmbeddingsAPI(Object... initArguments);

/**
* Returns the chat API
* @param initArguments
* @return
*/
ChatAPI getChatAPI(Object... initArguments);

/**
* Returns the image API
* @param initArguments
* @return
*/
ImageAPI getImageAPI(Object... initArguments);
}
120 changes: 109 additions & 11 deletions dotCMS/src/main/java/com/dotcms/ai/api/DotAIAPIFacadeImpl.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.dotcms.ai.api;

import com.dotcms.ai.app.AppConfig;
import com.dotcms.rest.api.v1.temp.TempFileAPI;
import com.dotmarketing.beans.Host;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.portlets.contentlet.business.HostAPI;
import com.dotmarketing.util.Logger;
import com.liferay.portal.model.User;

import java.util.Map;
import java.util.Objects;
Expand All @@ -16,14 +20,20 @@
*/
public class DotAIAPIFacadeImpl implements DotAIAPI {

private static final AtomicReference<String> currentApiProviderName = new AtomicReference<>("default");

private static final String DEFAULT = "default";
private static final AtomicReference<String> currentApiProviderName = new AtomicReference<>(DEFAULT);
private static final Map<String, CompletionsAPIProvider> completionsProviderMap = new ConcurrentHashMap<>();
private static final Map<String, EmbeddingsAPIProvider> embeddingsProviderMap = new ConcurrentHashMap<>();
private static final Map<String, ChatAPIProvider> chatProviderMap = new ConcurrentHashMap<>();
private static final Map<String, ImageAPIProvider> imageProviderMap = new ConcurrentHashMap<>();

static {
try {
completionsProviderMap.put("default", new DefaultCompletionsAPIProvider());
embeddingsProviderMap.put("default", new DefaultEmbeddingsAPIProvider());
completionsProviderMap.put(DEFAULT, new DefaultCompletionsAPIProvider());
embeddingsProviderMap.put(DEFAULT, new DefaultEmbeddingsAPIProvider());
chatProviderMap.put(DEFAULT, new DefaultChatAPIProvider());
imageProviderMap.put(DEFAULT, new DefaultImageAPIProvider());
} catch (Exception e) {
Logger.error(DotAIAPI.class, e.getMessage(), e);
}
Expand All @@ -35,6 +45,47 @@ private static <T> T unwrap(final Class<T> clazz, final Object... initArguments)
&& clazz.isInstance(initArguments[0]) ? clazz.cast(initArguments[0]) : null;
}

/**
* Default provider for the ChatAPI
*/
public static class DefaultChatAPIProvider implements ChatAPIProvider {

@Override
public ChatAPI getChatAPI(final Object... initArguments) {
if (Objects.nonNull(initArguments) && initArguments.length > 0 && initArguments[0] instanceof AppConfig) {
return new OpenAIChatAPIImpl((AppConfig) initArguments[0]);
}

throw new IllegalArgumentException("To create a ChatAPI you need to provide an AppConfig");
}
}

/**
* Default provider for the ImageAPI
*/
public static class DefaultImageAPIProvider implements ImageAPIProvider {

@Override
public ImageAPI getImageAPI(final Object... initArguments) {
if (Objects.nonNull(initArguments) && initArguments.length >= 4
&& initArguments[0] instanceof AppConfig
&& (Objects.isNull(initArguments[1]) || initArguments[1] instanceof User)
) {

final AppConfig config = (AppConfig) initArguments[0];
final User user = (User) initArguments[1];
final HostAPI hostApi = APILocator.getHostAPI();
final TempFileAPI tempFileApi = APILocator.getTempFileAPI();
return new OpenAIImageAPIImpl(config, user, hostApi, tempFileApi);
}

throw new IllegalArgumentException("To create an Image you need to provide an AppConfig");
}
}

/**
* Default provider for the CompletionsAPI
*/
private static class DefaultCompletionsAPIProvider implements CompletionsAPIProvider {

@Override
Expand All @@ -47,6 +98,9 @@ private AppConfig unwrap(final Object... initArguments) {
}
}

/**
* Default provider for the EmbeddingsAPI
*/
public static class DefaultEmbeddingsAPIProvider implements EmbeddingsAPIProvider {

@Override
Expand All @@ -72,41 +126,85 @@ public static final void setCurrentApiProviderName(final String apiName) {
* @param completionsAPI
*/
public static final void setDefaultCompletionsAPIProvider(final CompletionsAPIProvider completionsAPI) {
completionsProviderMap.put("default", completionsAPI);
completionsProviderMap.put(DEFAULT, completionsAPI);
}

/**
* Adds the default embeddings API Provider.
* Set the default embeddings API Provider.
* @param embeddingsAPI
*/
public static final void setDefaultEmbeddingsAPIProvider(final EmbeddingsAPIProvider embeddingsAPI) {
embeddingsProviderMap.put("default", embeddingsAPI);
embeddingsProviderMap.put(DEFAULT, embeddingsAPI);
}

/**
* Set the default image API Provider.
* @param imageAPIProvider
*/
public static final void setDefaultImageAPIProvider(final ImageAPIProvider imageAPIProvider) {
imageProviderMap.put(DEFAULT, imageAPIProvider);
}

/**
* Set the default chat API Provider.
* @param chatAPIProviderq
*/
public static final void setDefaultChatAPIProvider(final ChatAPIProvider chatAPIProvider) {
chatProviderMap.put(DEFAULT, chatAPIProvider);
}

/**
* Adds the default completions API provider.
* Adds completions API provider.
* @param completionsAPI
*/
public static final void addCompletionsAPIImplementation(final String apiName, final CompletionsAPIProvider completionsAPI) {
completionsProviderMap.put(apiName, completionsAPI);
}

/**
* Sets the default embeddings API provider.
* Adds default embeddings API provider.
* @param embeddingsAPI
*/
public static final void addDefaultEmbeddingsAPIImplementation(final String apiName, final EmbeddingsAPIProvider embeddingsAPI) {
public static final void addEmbeddingsAPIImplementation(final String apiName, final EmbeddingsAPIProvider embeddingsAPI) {
embeddingsProviderMap.put(apiName, embeddingsAPI);
}

/**
* Adds default chat API provider.
* @param chatAPI
*/
public static final void addChatAPIImplementation(final String apiName, final ChatAPIProvider chatAPI) {
chatProviderMap.put(apiName, chatAPI);
}

/**
* Adds default image API provider.
* @param imageAPI
*/
public static final void addImageAPIImplementation(final String apiName, final ImageAPIProvider imageAPI) {
imageProviderMap.put(apiName, imageAPI);
}

@Override
public CompletionsAPI getCompletionsAPI(Object... initArguments) {
public CompletionsAPI getCompletionsAPI(final Object... initArguments) {

return completionsProviderMap.get(currentApiProviderName.get()).getCompletionsAPI(initArguments);
}

@Override
public EmbeddingsAPI getEmbeddingsAPI(Object... initArguments) {
public EmbeddingsAPI getEmbeddingsAPI(final Object... initArguments) {
return embeddingsProviderMap.get(currentApiProviderName.get()).getEmbeddingsAPI(initArguments);
}

@Override
public ChatAPI getChatAPI(final Object... initArguments) {

return chatProviderMap.get(currentApiProviderName.get()).getChatAPI(initArguments);
}

@Override
public ImageAPI getImageAPI(final Object... initArguments) {

return imageProviderMap.get(currentApiProviderName.get()).getImageAPI(initArguments);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.dotcms.ai.service;
package com.dotcms.ai.api;

import com.dotcms.ai.model.AIImageRequestDTO;
import com.dotmarketing.util.json.JSONObject;

/**
* Service to interact with the OpenAI Image API
*/
public interface OpenAIImageService {
public interface ImageAPI {

/**
* Sends a text prompt to the OpenAI API.
Expand Down
11 changes: 11 additions & 0 deletions dotCMS/src/main/java/com/dotcms/ai/api/ImageAPIProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.dotcms.ai.api;


/**
* This class is in charge of providing the {@link ImageAPI}.
* @author jsanca
*/
public interface ImageAPIProvider {

ImageAPI getImageAPI(Object... initArguments);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dotcms.ai.service;
package com.dotcms.ai.api;

import com.dotcms.ai.AiKeys;
import com.dotcms.ai.app.AppConfig;
Expand All @@ -12,11 +12,11 @@
import java.util.List;
import java.util.Map;

public class OpenAIChatServiceImpl implements OpenAIChatService {
public class OpenAIChatAPIImpl implements ChatAPI {

private final AppConfig config;

public OpenAIChatServiceImpl(final AppConfig appConfig) {
public OpenAIChatAPIImpl(final AppConfig appConfig) {
this.config = appConfig;
}

Expand Down Expand Up @@ -47,7 +47,7 @@ public JSONObject sendTextPrompt(final String textPrompt) {
}

@VisibleForTesting
String doRequest(final String urlIn, final JSONObject json) {
public String doRequest(final String urlIn, final JSONObject json) {
return OpenAIRequest.doRequest(urlIn, HttpMethod.POST, config, json);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dotcms.ai.service;
package com.dotcms.ai.api;

import com.dotcms.ai.AiKeys;
import com.dotcms.ai.app.AppConfig;
Expand Down Expand Up @@ -29,7 +29,7 @@
import java.text.SimpleDateFormat;
import java.util.Date;

public class OpenAIImageServiceImpl implements OpenAIImageService {
public class OpenAIImageAPIImpl implements ImageAPI {

private static StopWordsUtil stopWordsUtil = StopWordsUtil.get();

Expand All @@ -38,10 +38,10 @@ public class OpenAIImageServiceImpl implements OpenAIImageService {
private final HostAPI hostApi;
private final TempFileAPI tempFileApi;

public OpenAIImageServiceImpl(final AppConfig config,
final User user,
final HostAPI hostApi,
final TempFileAPI tempFileApi) {
public OpenAIImageAPIImpl(final AppConfig config,
final User user,
final HostAPI hostApi,
final TempFileAPI tempFileApi) {
this.config = config;
this.user = user;
this.hostApi = hostApi;
Expand Down Expand Up @@ -173,22 +173,22 @@ private String generateFileName(final String originalPrompt) {
}

@VisibleForTesting
String doRequest(final String urlIn, final JSONObject json) {
public String doRequest(final String urlIn, final JSONObject json) {
return OpenAIRequest.doRequest(urlIn, HttpMethod.POST, config, json);
}

@VisibleForTesting
User getUser() {
public User getUser() {
return APILocator.systemUser();
}

@VisibleForTesting
AIImageRequestDTO.Builder getDtoBuilder() {
public AIImageRequestDTO.Builder getDtoBuilder() {
return new AIImageRequestDTO.Builder();
}

public static void setStopWordsUtil(final StopWordsUtil stopWordsUtil) {
OpenAIImageServiceImpl.stopWordsUtil = stopWordsUtil;
OpenAIImageAPIImpl.stopWordsUtil = stopWordsUtil;
}

}
6 changes: 3 additions & 3 deletions dotCMS/src/main/java/com/dotcms/ai/rest/ImageResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import com.dotcms.ai.app.AppConfig;
import com.dotcms.ai.app.ConfigService;
import com.dotcms.ai.model.AIImageRequestDTO;
import com.dotcms.ai.service.OpenAIImageService;
import com.dotcms.ai.service.OpenAIImageServiceImpl;
import com.dotcms.ai.api.ImageAPI;
import com.dotcms.ai.api.OpenAIImageAPIImpl;
import com.dotcms.rest.WebResource;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.business.web.WebAPILocator;
Expand Down Expand Up @@ -113,7 +113,7 @@ public Response handleImageRequest(@Context final HttpServletRequest request,
.build();
}

final OpenAIImageService service = new OpenAIImageServiceImpl(
final ImageAPI service = APILocator.getDotAIAPI().getImageAPI(
config,
user,
APILocator.getHostAPI(),
Expand Down
Loading

0 comments on commit 910cc83

Please sign in to comment.