Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions core/src/main/java/ai/z/openapi/AbstractAiClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import ai.z.openapi.service.assistant.AssistantServiceImpl;
import ai.z.openapi.service.voiceclone.VoiceCloneService;
import ai.z.openapi.service.voiceclone.VoiceCloneServiceImpl;
import ai.z.openapi.service.moderations.ModerationService;
import ai.z.openapi.service.moderations.ModerationServiceImpl;
import ai.z.openapi.core.config.ZaiConfig;
import ai.z.openapi.core.model.BiFlowableClientResponse;
import ai.z.openapi.core.model.ClientRequest;
Expand Down Expand Up @@ -104,6 +106,9 @@ public abstract class AbstractAiClient extends AbstractClientBaseService {
/** Voice clone service for voice cloning operations */
private VoiceCloneService voiceCloneService;

/** Moderation service for content safety detection */
private ModerationService moderationService;

/**
* Constructs a new AbstractAiClient with the specified configuration.
* @param config the configuration object containing API keys, timeouts, and other
Expand Down Expand Up @@ -256,6 +261,18 @@ public synchronized VoiceCloneService voiceClone() {
return voiceCloneService;
}

/**
* Returns the moderation service for content safety detection. This service handles
* content moderation for text, image, video, and audio inputs.
* @return the ModerationService instance (lazily initialized)
*/
public synchronized ModerationService moderations() {
if (moderationService == null) {
this.moderationService = new ModerationServiceImpl(this);
}
return moderationService;
}

// ==================== Utility Methods ====================

/**
Expand Down
34 changes: 34 additions & 0 deletions core/src/main/java/ai/z/openapi/api/moderations/ModerationApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ai.z.openapi.api.moderations;

import ai.z.openapi.service.moderations.ModerationCreateParams;
import ai.z.openapi.service.model.ModelData;
import io.reactivex.rxjava3.core.Single;
import retrofit2.http.Body;
import retrofit2.http.POST;

/**
* Moderation API for content safety detection
* Provides content moderation capabilities for text, image, audio, and video formats
* Accurately identifies risky content including adult content, violence, illegal content, etc.
* Returns structured moderation results including content type, risk type, and specific risk segments
* Supports pricing: Text: 1.2 yuan/10k times, Image: 4 yuan/10k times, Audio: 0.18 yuan/hour, Video: 0.72 yuan/hour
*/
public interface ModerationApi {

/**
* Create a content moderation request for safety detection
* Analyzes content for potential risks including adult content, violence, illegal activities
* Supports multiple content types: text strings, images, audio, and video files
* Returns detailed risk assessment with structured results and specific risk segments
*
* @param request Moderation parameters including content to analyze (text string or multimedia object)
* Text: maximum 2000 characters
* Images: less than 10M, minimum resolution 20x20, maximum 6000x6000
* Video: recommended duration 30 seconds
* Audio: recommended duration 60 seconds
* @return Moderation response with risk level (PASS/REVIEW/REJECT), content type,
* risk types, and processing time information
*/
@POST("moderations")
Single<ModelData> createModeration(@Body ModerationCreateParams request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ai.z.openapi.service.moderations;

import ai.z.openapi.core.model.ClientRequest;
import ai.z.openapi.service.CommonRequest;
import lombok.*;
import lombok.experimental.SuperBuilder;

import java.util.List;

/**
* Parameters for creating a moderation request to check content safety.
*/
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ModerationCreateParams extends CommonRequest implements ClientRequest<ModerationCreateParams> {

/**
* The model to use for moderation. Currently supports "glm-4-content-safety".
*/
private String model;

/**
* The input content to moderate. Can be text, image, video, or audio.
*/
private List<ModerationInput> input;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package ai.z.openapi.service.moderations;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* Base class for moderation input content
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ModerationInput {

/**
* Type of content being moderated
* Possible values: "text", "image_url", "video_url", "audio_url"
*/
private String type;

/**
* Text content for text moderation
*/
private String text;

/**
* Image URL configuration for image moderation
*/
@JsonProperty("image_url")
private MediaUrl imageUrl;

/**
* Video URL configuration for video moderation
*/
@JsonProperty("video_url")
private MediaUrl videoUrl;

/**
* Audio URL configuration for audio moderation
*/
@JsonProperty("audio_url")
private MediaUrl audioUrl;

/**
* Helper method to create text input
*/
public static ModerationInput text(String text) {
return ModerationInput.builder()
.type("text")
.text(text)
.build();
}

/**
* Helper method to create image input
*/
public static ModerationInput image(String url) {
return ModerationInput.builder()
.type("image_url")
.imageUrl(MediaUrl.builder().url(url).build())
.build();
}

/**
* Helper method to create video input
*/
public static ModerationInput video(String url) {
return ModerationInput.builder()
.type("video_url")
.videoUrl(MediaUrl.builder().url(url).build())
.build();
}

/**
* Helper method to create audio input
*/
public static ModerationInput audio(String url) {
return ModerationInput.builder()
.type("audio_url")
.audioUrl(MediaUrl.builder().url(url).build())
.build();
}

/**
* Media URL configuration
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class MediaUrl {
/**
* URL of the media file
*/
private String url;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package ai.z.openapi.service.moderations;

import ai.z.openapi.core.model.ClientResponse;
import ai.z.openapi.service.model.ChatError;
import lombok.Data;

/**
* Response wrapper for moderation API calls. Contains the result of content moderation
* operations along with status information.
*/
@Data
public class ModerationResponse implements ClientResponse<ModerationResult> {

/**
* Response status code.
*/
private int code;

/**
* Response message.
*/
private String msg;

/**
* Indicates whether the request was successful.
*/
private boolean success;

/**
* The moderation result data.
*/
private ModerationResult data;

/**
* Error information if the request failed.
*/
private ChatError error;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package ai.z.openapi.service.moderations;

import ai.z.openapi.service.model.Usage;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
* Result data from the moderation API containing safety analysis results.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ModerationResult {

/**
* Unique request identifier for tracking.
*/
private String requestId;

/**
* Processing time in milliseconds.
*/
private Long processedTime;

/**
* List of moderation results for each input item.
*/
private List<ModerationItem> resultList;

/**
* Token usage information for the request.
*/
private Usage usage;

/**
* Individual moderation result for a single input item.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ModerationItem {

/**
* Type of content being moderated (text, image, video, audio).
*/
private String contentType;

/**
* Risk level assessment: "low", "medium", "high".
*/
private String riskLevel;

/**
* Specific type of risk detected (e.g., "violence", "sexual", "hate").
*/
private String riskType;

/**
* Confidence score for the moderation result (0.0 to 1.0).
*/
private Double confidence;

/**
* Additional details about the moderation result.
*/
private String details;

/**
* Check if the content is flagged as unsafe.
* @return true if risk level is medium or high
*/
public boolean isFlagged() {
return "medium".equalsIgnoreCase(riskLevel) || "high".equalsIgnoreCase(riskLevel);
}

/**
* Check if the content is safe.
* @return true if risk level is low
*/
public boolean isSafe() {
return "low".equalsIgnoreCase(riskLevel);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ai.z.openapi.service.moderations;

/**
* Moderation service for content safety detection
* Provides content moderation capabilities for text, image, audio, and video formats
* Accurately identifies risky content including adult content, violence, illegal content, etc.
* Returns structured moderation results including content type, risk type, and specific risk segments
*/
public interface ModerationService {

/**
* Create a content moderation request for safety detection
* Analyzes content for potential risks including adult content, violence, illegal activities
* Supports multiple content types: text strings, images, audio, and video files
* Returns detailed risk assessment with structured results and specific risk segments
*
* @param request Moderation parameters including content to analyze (text string or multimedia object)
* Text: maximum 2000 characters
* Images: less than 10M, minimum resolution 20x20, maximum 6000x6000
* Video: recommended duration 30 seconds
* Audio: recommended duration 60 seconds
* @return Moderation response with risk level (PASS/REVIEW/REJECT), content type,
* risk types, and processing time information
*/
ModerationResponse createModeration(ModerationCreateParams request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ai.z.openapi.service.moderations;

import ai.z.openapi.AbstractAiClient;
import ai.z.openapi.api.moderations.ModerationApi;
import ai.z.openapi.service.model.ModelData;
import ai.z.openapi.utils.RequestSupplier;

/**
* Implementation of ModerationService
*/
public class ModerationServiceImpl implements ModerationService {

private final AbstractAiClient zAiClient;

private final ModerationApi moderationApi;

public ModerationServiceImpl(AbstractAiClient zAiClient) {
this.zAiClient = zAiClient;
this.moderationApi = zAiClient.retrofit().create(ModerationApi.class);
}

@Override
public ModerationResponse createModeration(ModerationCreateParams request) {
RequestSupplier<ModerationCreateParams, ModelData> supplier = moderationApi::createModeration;
return this.zAiClient.executeRequest(request, supplier, ModerationResponse.class);
}
}
Loading
Loading