Skip to content

Commit 367e913

Browse files
authored
[Google] [Gemini] Support google Gemini (#47)
2 parents e359d1d + 51c4e0f commit 367e913

File tree

72 files changed

+1249
-54
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+1249
-54
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ pom.xml.versionsBackup
66

77
BaseTest.java
88
site/
9+
10+
application.properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
---
2+
title: Chat
3+
---
4+
5+
> 支持 Google Gemini,产品地址: https://ai.google.dev/gemini-api
6+
7+
### 简单对话
8+
9+
---
10+
11+
处理纯文字输入。借助此功能,您可以执行自然语言处理 (NLP) 任务,例如文本补全和摘要。
12+
13+
使用示例
14+
15+
```java
16+
try (GoogleClient client = GoogleClient.builder()
17+
.apiKey(token)
18+
.build()) {
19+
PartEntity part = PartEntity.builder()
20+
.text("Hello, Open AI Java SDK!")
21+
.build();
22+
ObjectEntity object = ObjectEntity.builder()
23+
.parts(Lists.newArrayList(part))
24+
.build();
25+
ChatEntity chat = ChatEntity.builder()
26+
.contents(Lists.newArrayList(object))
27+
.build();
28+
29+
ChatResponse response = client.createChatCompletions(chat);
30+
response.getCandidates()
31+
.forEach(item -> item.getContent()
32+
.getParts()
33+
.forEach(value -> log.info(value.getText())));
34+
}
35+
```
36+
37+
### 多轮对话(聊天)
38+
39+
---
40+
41+
打造互动式聊天体验。 借助此 API 的聊天功能,您可以收集多轮问题和回复,让用户能够逐步找到答案或获得有关多部分问题的帮助。
42+
43+
使用示例
44+
45+
```java
46+
List<ObjectEntity> contents = Lists.newArrayList();
47+
PartEntity part = PartEntity.builder()
48+
.text("你好,我叫小明")
49+
.build();
50+
ObjectEntity object = ObjectEntity.builder()
51+
.parts(Lists.newArrayList(part))
52+
.build();
53+
contents.add(object);
54+
ChatEntity chat = ChatEntity.builder()
55+
.contents(contents)
56+
.build();
57+
ChatResponse response = client.createChatCompletions(chat);
58+
response.getCandidates()
59+
.forEach(item -> item.getContent()
60+
.getParts()
61+
.forEach(value -> {
62+
log.info(value.getText());
63+
64+
contents.add(ObjectEntity.builder()
65+
.role(RoleModel.MODEL)
66+
.parts(Lists.newArrayList(PartEntity.builder()
67+
.text(value.getText())
68+
.build()))
69+
.build());
70+
}));
71+
72+
ObjectEntity newObject = ObjectEntity.builder()
73+
.parts(Lists.newArrayList(PartEntity.builder()
74+
.text("我刚刚说了什么")
75+
.build()))
76+
.build();
77+
contents.add(newObject);
78+
ChatEntity newChat = ChatEntity.builder()
79+
.contents(contents)
80+
.build();
81+
client.createChatCompletions(newChat);
82+
```
83+
84+
### 流式响应
85+
86+
---
87+
88+
以数据流的形式接收。流式响应会在模型生成增量数据时将这些数据发送回您的应用。
89+
90+
使用示例
91+
92+
```java
93+
// 构建客户端
94+
CountDownLatch countDownLatch = new CountDownLatch(1);
95+
ConsoleEventSourceListener listener = ConsoleEventSourceListener.builder()
96+
.countDownLatch(countDownLatch)
97+
.build();
98+
GoogleClient client = GoogleClient.builder()
99+
.apiKey(ResourceUtils.getValue("google.token"))
100+
.listener(listener)
101+
.build();
102+
103+
List<ObjectEntity> contents = Lists.newArrayList();
104+
PartEntity part = PartEntity.builder()
105+
.text("帮我写一万字的作文")
106+
.build();
107+
ObjectEntity object = ObjectEntity.builder()
108+
.parts(Lists.newArrayList(part))
109+
.build();
110+
contents.add(object);
111+
ChatEntity chat = ChatEntity.builder()
112+
.contents(contents)
113+
.build();
114+
client.createChatCompletions(chat);
115+
try {
116+
countDownLatch.await();
117+
}
118+
catch (InterruptedException e) {
119+
log.error("Interrupted while waiting", e);
120+
}
121+
```

docs/mkdocs.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ theme:
2121
name: material
2222
custom_dir: overrides
2323

24-
language: en
2524
features:
2625
- content.code.annotate
2726
- content.tabs.link
@@ -64,7 +63,7 @@ markdown_extensions:
6463
plugins:
6564
- i18n:
6665
reconfigure_material: true
67-
default_language: en
66+
default_language: zh
6867
languages:
6968
- locale: zh
7069
name: Chinese (Simplified)
@@ -111,6 +110,9 @@ nav:
111110
- Google PaLM:
112111
- reference/google_palm/completions.md
113112
- reference/google_palm/chat.md
113+
- Google:
114+
- Gemini:
115+
- reference/google/gemini/chat/home.md
114116
- NavReleaseNote:
115117
- release/latest.md
116118
- release/2024.01.1.md

src/main/java/org/devlive/sdk/openai/DefaultApi.java renamed to src/main/java/org/devlive/sdk/common/DefaultApi.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai;
1+
package org.devlive.sdk.common;
22

33
import io.reactivex.Single;
44
import okhttp3.MultipartBody;

src/main/java/org/devlive/sdk/openai/DefaultClient.java renamed to src/main/java/org/devlive/sdk/common/DefaultClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai;
1+
package org.devlive.sdk.common;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.google.common.collect.Lists;
@@ -12,6 +12,7 @@
1212
import okhttp3.sse.EventSourceListener;
1313
import okhttp3.sse.EventSources;
1414
import org.apache.commons.lang3.ObjectUtils;
15+
import org.devlive.sdk.common.exception.RequestException;
1516
import org.devlive.sdk.openai.entity.AudioEntity;
1617
import org.devlive.sdk.openai.entity.ChatEntity;
1718
import org.devlive.sdk.openai.entity.CompletionEntity;
@@ -28,7 +29,6 @@
2829
import org.devlive.sdk.openai.entity.beta.QueryEntity;
2930
import org.devlive.sdk.openai.entity.beta.ThreadEntity;
3031
import org.devlive.sdk.openai.entity.google.MessageEntity;
31-
import org.devlive.sdk.openai.exception.RequestException;
3232
import org.devlive.sdk.openai.mixin.IgnoreUnknownMixin;
3333
import org.devlive.sdk.openai.model.ProviderModel;
3434
import org.devlive.sdk.openai.model.UrlModel;

src/main/java/org/devlive/sdk/openai/exception/AuthorizedException.java renamed to src/main/java/org/devlive/sdk/common/exception/AuthorizedException.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.exception;
1+
package org.devlive.sdk.common.exception;
22

33
public class AuthorizedException
44
extends DefaultException

src/main/java/org/devlive/sdk/openai/exception/DefaultException.java renamed to src/main/java/org/devlive/sdk/common/exception/DefaultException.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.exception;
1+
package org.devlive.sdk.common.exception;
22

33
import lombok.Getter;
44

src/main/java/org/devlive/sdk/openai/exception/ParamException.java renamed to src/main/java/org/devlive/sdk/common/exception/ParamException.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.exception;
1+
package org.devlive.sdk.common.exception;
22

33
public class ParamException
44
extends DefaultException

src/main/java/org/devlive/sdk/openai/exception/RequestException.java renamed to src/main/java/org/devlive/sdk/common/exception/RequestException.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.exception;
1+
package org.devlive.sdk.common.exception;
22

33
public class RequestException
44
extends DefaultException

src/main/java/org/devlive/sdk/openai/interceptor/DefaultInterceptor.java renamed to src/main/java/org/devlive/sdk/common/interceptor/DefaultInterceptor.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.interceptor;
1+
package org.devlive.sdk.common.interceptor;
22

33
import com.google.common.base.Preconditions;
44
import lombok.Getter;
@@ -11,8 +11,8 @@
1111
import okhttp3.ResponseBody;
1212
import okio.Buffer;
1313
import org.apache.commons.lang3.ObjectUtils;
14-
import org.devlive.sdk.openai.exception.AuthorizedException;
15-
import org.devlive.sdk.openai.exception.RequestException;
14+
import org.devlive.sdk.common.exception.AuthorizedException;
15+
import org.devlive.sdk.common.exception.RequestException;
1616
import org.devlive.sdk.openai.response.DefaultResponse;
1717
import org.devlive.sdk.openai.utils.JsonUtils;
1818

@@ -44,7 +44,7 @@ public Response intercept(Chain chain)
4444
if (ObjectUtils.isNotEmpty(requestBody)) {
4545
Buffer buffer = new Buffer();
4646
requestBody.writeTo(buffer);
47-
log.debug("Request body {}", buffer.readUtf8());
47+
log.info("Request body {}", buffer.readUtf8());
4848
}
4949

5050
Response response = chain.proceed(request);

src/main/java/org/devlive/sdk/openai/listener/ConsoleEventSourceListener.java renamed to src/main/java/org/devlive/sdk/common/listener/ConsoleEventSourceListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.listener;
1+
package org.devlive.sdk.common.listener;
22

33
import lombok.Builder;
44
import lombok.extern.slf4j.Slf4j;

src/main/java/org/devlive/sdk/openai/listener/HttpServletEventSourceListener.java renamed to src/main/java/org/devlive/sdk/common/listener/HttpServletEventSourceListener.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.listener;
1+
package org.devlive.sdk.common.listener;
22

33
import jakarta.servlet.http.HttpServletRequest;
44
import jakarta.servlet.http.HttpServletResponse;
@@ -9,7 +9,7 @@
99
import okhttp3.sse.EventSource;
1010
import okhttp3.sse.EventSourceListener;
1111
import org.apache.commons.lang3.ObjectUtils;
12-
import org.devlive.sdk.openai.exception.ParamException;
12+
import org.devlive.sdk.common.exception.ParamException;
1313
import org.devlive.sdk.openai.response.CompleteResponse;
1414
import org.devlive.sdk.openai.utils.JsonUtils;
1515

src/main/java/org/devlive/sdk/openai/utils/HttpUrlUtils.java renamed to src/main/java/org/devlive/sdk/common/utils/HttpUrlUtils.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.devlive.sdk.openai.utils;
1+
package org.devlive.sdk.common.utils;
22

33
import okhttp3.HttpUrl;
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.devlive.sdk.common.utils;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.devlive.sdk.common.exception.ParamException;
5+
6+
public class ValidateUtils
7+
{
8+
private ValidateUtils()
9+
{
10+
}
11+
12+
/**
13+
* Validate host
14+
*
15+
* @param host Original host
16+
* @param defaultHost Default host
17+
* @return host
18+
*/
19+
public static String validateHost(String host, String defaultHost)
20+
{
21+
if (StringUtils.isEmpty(host)) {
22+
return defaultHost;
23+
}
24+
else {
25+
boolean flag = host.startsWith("http") || host.startsWith("https");
26+
if (!flag) {
27+
throw new ParamException(String.format("Invalid apiHost <%s> must start with http or https", host));
28+
}
29+
}
30+
return host;
31+
}
32+
}

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import okhttp3.sse.EventSourceListener;
99
import org.apache.commons.lang3.ObjectUtils;
1010
import org.apache.commons.lang3.StringUtils;
11-
import org.devlive.sdk.openai.exception.ParamException;
11+
import org.devlive.sdk.common.DefaultApi;
12+
import org.devlive.sdk.common.DefaultClient;
13+
import org.devlive.sdk.common.exception.ParamException;
14+
import org.devlive.sdk.common.interceptor.DefaultInterceptor;
1215
import org.devlive.sdk.openai.interceptor.AzureInterceptor;
1316
import org.devlive.sdk.openai.interceptor.ClaudeInterceptor;
14-
import org.devlive.sdk.openai.interceptor.DefaultInterceptor;
1517
import org.devlive.sdk.openai.interceptor.GooglePaLMInterceptor;
1618
import org.devlive.sdk.openai.interceptor.OpenAiInterceptor;
1719
import org.devlive.sdk.openai.model.CompletionModel;

src/main/java/org/devlive/sdk/openai/entity/AudioEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.apache.commons.lang3.EnumUtils;
1313
import org.apache.commons.lang3.ObjectUtils;
1414
import org.apache.commons.lang3.StringUtils;
15-
import org.devlive.sdk.openai.exception.ParamException;
15+
import org.devlive.sdk.common.exception.ParamException;
1616
import org.devlive.sdk.openai.model.AudioFormatModel;
1717
import org.devlive.sdk.openai.model.AudioModel;
1818
import org.devlive.sdk.openai.utils.FileUtils;

src/main/java/org/devlive/sdk/openai/entity/ChatEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import lombok.NoArgsConstructor;
99
import lombok.ToString;
1010
import org.apache.commons.lang3.ObjectUtils;
11-
import org.devlive.sdk.openai.exception.ParamException;
11+
import org.devlive.sdk.common.exception.ParamException;
1212
import org.devlive.sdk.openai.model.CompletionModel;
1313
import org.devlive.sdk.openai.utils.EnumsUtils;
1414

src/main/java/org/devlive/sdk/openai/entity/CompletionEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import lombok.ToString;
1010
import org.apache.commons.lang3.ObjectUtils;
1111
import org.apache.commons.lang3.StringUtils;
12-
import org.devlive.sdk.openai.exception.ParamException;
12+
import org.devlive.sdk.common.exception.ParamException;
1313
import org.devlive.sdk.openai.model.CompletionModel;
1414
import org.devlive.sdk.openai.utils.EnumsUtils;
1515

src/main/java/org/devlive/sdk/openai/entity/EditEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import lombok.ToString;
1010
import org.apache.commons.lang3.ObjectUtils;
1111
import org.apache.commons.lang3.StringUtils;
12-
import org.devlive.sdk.openai.exception.ParamException;
12+
import org.devlive.sdk.common.exception.ParamException;
1313
import org.devlive.sdk.openai.model.EditModel;
1414

1515
import java.util.Arrays;

src/main/java/org/devlive/sdk/openai/entity/EmbeddingEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import lombok.NoArgsConstructor;
99
import lombok.ToString;
1010
import org.apache.commons.lang3.StringUtils;
11-
import org.devlive.sdk.openai.exception.ParamException;
11+
import org.devlive.sdk.common.exception.ParamException;
1212

1313
import java.util.List;
1414

src/main/java/org/devlive/sdk/openai/entity/FileEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import lombok.ToString;
1212
import okhttp3.RequestBody;
1313
import org.apache.commons.lang3.ObjectUtils;
14-
import org.devlive.sdk.openai.exception.ParamException;
14+
import org.devlive.sdk.common.exception.ParamException;
1515
import org.devlive.sdk.openai.model.PurposeModel;
1616
import org.devlive.sdk.openai.utils.MultipartBodyUtils;
1717

src/main/java/org/devlive/sdk/openai/entity/FineTuningEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import lombok.Data;
99
import lombok.NoArgsConstructor;
1010
import lombok.ToString;
11-
import org.devlive.sdk.openai.exception.ParamException;
11+
import org.devlive.sdk.common.exception.ParamException;
1212
import org.devlive.sdk.openai.model.CompletionModel;
1313

1414
@Data

src/main/java/org/devlive/sdk/openai/entity/ImageEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.apache.commons.lang3.EnumUtils;
1313
import org.apache.commons.lang3.ObjectUtils;
1414
import org.apache.commons.lang3.StringUtils;
15-
import org.devlive.sdk.openai.exception.ParamException;
15+
import org.devlive.sdk.common.exception.ParamException;
1616
import org.devlive.sdk.openai.model.ImageFormatModel;
1717
import org.devlive.sdk.openai.model.ImageSizeModel;
1818
import org.devlive.sdk.openai.utils.MultipartBodyUtils;

src/main/java/org/devlive/sdk/openai/entity/MessageEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import lombok.ToString;
1010
import org.apache.commons.lang3.ObjectUtils;
1111
import org.apache.commons.lang3.StringUtils;
12-
import org.devlive.sdk.openai.exception.ParamException;
12+
import org.devlive.sdk.common.exception.ParamException;
1313
import org.devlive.sdk.openai.model.MessageModel;
1414
import org.devlive.sdk.openai.utils.EnumsUtils;
1515

src/main/java/org/devlive/sdk/openai/entity/ModerationEntity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import lombok.ToString;
1010
import org.apache.commons.lang3.ObjectUtils;
1111
import org.apache.commons.lang3.StringUtils;
12-
import org.devlive.sdk.openai.exception.ParamException;
12+
import org.devlive.sdk.common.exception.ParamException;
1313
import org.devlive.sdk.openai.model.ModerationModel;
1414

1515
import java.util.List;

0 commit comments

Comments
 (0)