Skip to content

Commit 663fdde

Browse files
committed
Support create moderation
1 parent 025c24f commit 663fdde

14 files changed

Lines changed: 380 additions & 1 deletion

File tree

docs/docs/reference/moderations.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
---
2+
title: Moderations
3+
---
4+
5+
!!! Note
6+
7+
Please build the client before calling, the build code is as follows:
8+
9+
```java
10+
OpenAiClient client = OpenAiClient.builder()
11+
.apiHost("https://api.openai.com")
12+
.apiKey(System.getProperty("openai.token"))
13+
.build();
14+
```
15+
16+
`System.getProperty("openai.token")` is the key to access the API authorization.
17+
18+
### Create moderation
19+
20+
---
21+
22+
Classifies if text violates OpenAI's Content Policy
23+
24+
```java
25+
ModerationEntity configure = ModerationEntity.builder()
26+
.inputs(Lists.newArrayList("Hello OpenAi Java SDK"))
27+
.build();
28+
client.moderations(configure);
29+
```
30+
31+
Returns
32+
33+
```json
34+
{
35+
"id": "modr-XXXXX",
36+
"model": "text-moderation-005",
37+
"results": [
38+
{
39+
"flagged": true,
40+
"categories": {
41+
"sexual": false,
42+
"hate": false,
43+
"harassment": false,
44+
"self-harm": false,
45+
"sexual/minors": false,
46+
"hate/threatening": false,
47+
"violence/graphic": false,
48+
"self-harm/intent": false,
49+
"self-harm/instructions": false,
50+
"harassment/threatening": true,
51+
"violence": true
52+
},
53+
"category_scores": {
54+
"sexual": 1.2282071e-06,
55+
"hate": 0.010696256,
56+
"harassment": 0.29842457,
57+
"self-harm": 1.5236925e-08,
58+
"sexual/minors": 5.7246268e-08,
59+
"hate/threatening": 0.0060676364,
60+
"violence/graphic": 4.435014e-06,
61+
"self-harm/intent": 8.098441e-10,
62+
"self-harm/instructions": 2.8498655e-11,
63+
"harassment/threatening": 0.63055265,
64+
"violence": 0.99011886
65+
}
66+
}
67+
]
68+
}
69+
```
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
---
2+
title: Moderations
3+
---
4+
5+
!!! Note
6+
7+
调用前请先构建客户端,构建代码如下:
8+
9+
```java
10+
OpenAiClient client = OpenAiClient.builder()
11+
.apiHost("https://api.openai.com")
12+
.apiKey(System.getProperty("openai.token"))
13+
.build();
14+
```
15+
16+
`System.getProperty("openai.token")` 是访问 API 授权的关键。
17+
18+
### Create moderation
19+
20+
---
21+
22+
对文本是否违反 OpenAI 的内容政策进行分类
23+
24+
```java
25+
ModerationEntity configure = ModerationEntity.builder()
26+
.inputs(Lists.newArrayList("Hello OpenAi Java SDK"))
27+
.build();
28+
client.moderations(configure);
29+
```
30+
31+
Returns
32+
33+
```json
34+
{
35+
"id": "modr-XXXXX",
36+
"model": "text-moderation-005",
37+
"results": [
38+
{
39+
"flagged": true,
40+
"categories": {
41+
"sexual": false,
42+
"hate": false,
43+
"harassment": false,
44+
"self-harm": false,
45+
"sexual/minors": false,
46+
"hate/threatening": false,
47+
"violence/graphic": false,
48+
"self-harm/intent": false,
49+
"self-harm/instructions": false,
50+
"harassment/threatening": true,
51+
"violence": true
52+
},
53+
"category_scores": {
54+
"sexual": 1.2282071e-06,
55+
"hate": 0.010696256,
56+
"harassment": 0.29842457,
57+
"self-harm": 1.5236925e-08,
58+
"sexual/minors": 5.7246268e-08,
59+
"hate/threatening": 0.0060676364,
60+
"violence/graphic": 4.435014e-06,
61+
"self-harm/intent": 8.098441e-10,
62+
"self-harm/instructions": 2.8498655e-11,
63+
"harassment/threatening": 0.63055265,
64+
"violence": 0.99011886
65+
}
66+
}
67+
]
68+
}
69+
```

docs/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ nav:
6565
- reference/images.md
6666
- reference/embeddings.md
6767
- reference/audio.md
68+
- reference/moderations.md
6869
- Provider:
6970
- reference/provider/azure.md
7071
- released.md

src/main/java/org/devlive/sdk/openai/DefaultApi.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
import org.devlive.sdk.openai.entity.EmbeddingEntity;
99
import org.devlive.sdk.openai.entity.ImageEntity;
1010
import org.devlive.sdk.openai.entity.ModelEntity;
11+
import org.devlive.sdk.openai.entity.ModerationEntity;
1112
import org.devlive.sdk.openai.entity.UserKeyEntity;
1213
import org.devlive.sdk.openai.response.AudioResponse;
1314
import org.devlive.sdk.openai.response.CompleteChatResponse;
1415
import org.devlive.sdk.openai.response.CompleteResponse;
1516
import org.devlive.sdk.openai.response.EmbeddingResponse;
1617
import org.devlive.sdk.openai.response.ImageResponse;
1718
import org.devlive.sdk.openai.response.ModelResponse;
19+
import org.devlive.sdk.openai.response.ModerationResponse;
1820
import org.devlive.sdk.openai.response.UserKeyResponse;
1921
import retrofit2.http.Body;
2022
import retrofit2.http.GET;
@@ -111,4 +113,12 @@ Single<EmbeddingResponse> fetchEmbeddings(@Url String url,
111113
Single<AudioResponse> fetchAudioTranscriptions(@Url String url,
112114
@Part() MultipartBody.Part audio,
113115
@PartMap Map<String, RequestBody> configure);
116+
117+
/**
118+
* Classifies if text violates OpenAI's Content Policy
119+
* 对文本是否违反 OpenAI 的内容政策进行分类
120+
*/
121+
@POST
122+
Single<ModerationResponse> fetchModerations(@Url String url,
123+
@Body ModerationEntity configure);
114124
}

src/main/java/org/devlive/sdk/openai/DefaultClient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.devlive.sdk.openai.entity.EmbeddingEntity;
1111
import org.devlive.sdk.openai.entity.ImageEntity;
1212
import org.devlive.sdk.openai.entity.ModelEntity;
13+
import org.devlive.sdk.openai.entity.ModerationEntity;
1314
import org.devlive.sdk.openai.entity.UserKeyEntity;
1415
import org.devlive.sdk.openai.model.ProviderModel;
1516
import org.devlive.sdk.openai.model.UrlModel;
@@ -19,6 +20,7 @@
1920
import org.devlive.sdk.openai.response.EmbeddingResponse;
2021
import org.devlive.sdk.openai.response.ImageResponse;
2122
import org.devlive.sdk.openai.response.ModelResponse;
23+
import org.devlive.sdk.openai.response.ModerationResponse;
2224
import org.devlive.sdk.openai.response.UserKeyResponse;
2325
import org.devlive.sdk.openai.utils.MultipartBodyUtils;
2426
import org.devlive.sdk.openai.utils.ProviderUtils;
@@ -113,6 +115,12 @@ public AudioResponse audioTranscriptions(AudioEntity configure)
113115
.blockingGet();
114116
}
115117

118+
public ModerationResponse moderations(ModerationEntity configure)
119+
{
120+
return this.api.fetchModerations(ProviderUtils.getUrl(provider, UrlModel.FETCH_MODERATIONS), configure)
121+
.blockingGet();
122+
}
123+
116124
public void close()
117125
{
118126
if (ObjectUtils.isNotEmpty(this.client)) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.devlive.sdk.openai.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.Data;
6+
7+
@Data
8+
@JsonIgnoreProperties(ignoreUnknown = true)
9+
public class CategoryEntity
10+
{
11+
@JsonProperty(value = "sexual")
12+
private Object sexual;
13+
14+
@JsonProperty(value = "hate")
15+
private Object hate;
16+
17+
@JsonProperty(value = "harassment")
18+
private Object harassment;
19+
20+
@JsonProperty(value = "self-harm")
21+
private Object selfHarm;
22+
23+
@JsonProperty(value = "sexual/minors")
24+
private Object sexualMinors;
25+
26+
@JsonProperty(value = "hate/threatening")
27+
private Object hateThreatening;
28+
29+
@JsonProperty(value = "violence/graphic")
30+
private Object violenceGraphic;
31+
32+
@JsonProperty(value = "self-harm/intent")
33+
private Object selfHarmIntent;
34+
35+
@JsonProperty(value = "self-harm/instructions")
36+
private Object selfHarmInstructions;
37+
38+
@JsonProperty(value = "harassment/threatening")
39+
private Object harassmentThreatening;
40+
41+
@JsonProperty(value = "violence")
42+
private Object violence;
43+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.devlive.sdk.openai.entity;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
import lombok.ToString;
10+
import org.apache.commons.lang3.ObjectUtils;
11+
import org.apache.commons.lang3.StringUtils;
12+
import org.devlive.sdk.openai.exception.ParamException;
13+
import org.devlive.sdk.openai.model.ModerationModel;
14+
15+
import java.util.List;
16+
17+
@Data
18+
@Builder
19+
@ToString
20+
@NoArgsConstructor
21+
@AllArgsConstructor
22+
@JsonIgnoreProperties(ignoreUnknown = true)
23+
public class ModerationEntity
24+
{
25+
/**
26+
* The input text to classify
27+
* 要分类的输入文本
28+
*/
29+
@JsonProperty(value = "input")
30+
private List<String> inputs;
31+
32+
@JsonProperty(value = "model")
33+
private String model;
34+
35+
private ModerationEntity(ModerationEntityBuilder builder)
36+
{
37+
if (ObjectUtils.isEmpty(builder.inputs)) {
38+
builder.inputs(null);
39+
}
40+
this.inputs = builder.inputs;
41+
42+
if (StringUtils.isEmpty(builder.model)) {
43+
builder.model(ModerationModel.TEXT_MODERATION_LATEST);
44+
}
45+
this.model = builder.model;
46+
}
47+
48+
public static class ModerationEntityBuilder
49+
{
50+
public ModerationEntityBuilder inputs(List<String> inputs)
51+
{
52+
if (ObjectUtils.isEmpty(inputs) || inputs.size() == 0) {
53+
throw new ParamException("Invalid inputs must be non-empty");
54+
}
55+
this.inputs = inputs;
56+
return this;
57+
}
58+
59+
public ModerationEntityBuilder model(ModerationModel model)
60+
{
61+
this.model = model.getName();
62+
return this;
63+
}
64+
65+
public ModerationEntity build()
66+
{
67+
return new ModerationEntity(this);
68+
}
69+
}
70+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.devlive.sdk.openai.model;
2+
3+
public enum ModerationModel
4+
{
5+
TEXT_MODERATION_STABLE("text-moderation-stable"),
6+
TEXT_MODERATION_LATEST("text-moderation-latest");
7+
8+
private final String name;
9+
10+
public String getName()
11+
{
12+
return name;
13+
}
14+
15+
ModerationModel(String name)
16+
{
17+
this.name = name;
18+
}
19+
}

src/main/java/org/devlive/sdk/openai/model/UrlModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public enum UrlModel
1212
FETCH_IMAGES_EDITS,
1313
FETCH_IMAGES_VARIATIONS,
1414
FETCH_EMBEDDINGS,
15-
FETCH_AUDIO_TRANSCRIPTIONS
15+
FETCH_AUDIO_TRANSCRIPTIONS,
16+
FETCH_MODERATIONS
1617
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.devlive.sdk.openai.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import lombok.Data;
6+
import org.devlive.sdk.openai.entity.CategoryEntity;
7+
8+
@Data
9+
@JsonIgnoreProperties(ignoreUnknown = true)
10+
public class CategoryResponse
11+
{
12+
@JsonProperty(value = "flagged")
13+
private Boolean flagged;
14+
15+
@JsonProperty(value = "categories")
16+
private CategoryEntity categories;
17+
18+
@JsonProperty(value = "category_scores")
19+
private CategoryEntity categoryScores;
20+
}

0 commit comments

Comments
 (0)