Skip to content

Commit b8c6fa7

Browse files
committed
[Google] [PaLM] Support text prompt
1 parent a7ba02a commit b8c6fa7

File tree

17 files changed

+329
-4
lines changed

17 files changed

+329
-4
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
title: Completions
3+
---
4+
5+
!!! note
6+
7+
Support the google palm, product address: [https://developers.generativeai.google/products/palm](https://developers.generativeai.google/products/palm)
8+
9+
### Create completion
10+
11+
---
12+
13+
Creates a completion for the provided prompt and parameters.
14+
15+
```java
16+
// Automatic resource release
17+
try(OpenAiClient client=OpenAiClient.builder()
18+
.provider(ProviderModel.GOOGLE_PALM)
19+
.model(CompletionModel.TEXT_BISON_001)
20+
.apiKey(System.getProperty("google.token"))
21+
.build())
22+
{
23+
PromptEntity prompt = PromptEntity.builder()
24+
.text("How to create a completion")
25+
.build();
26+
CompletionEntity configure = CompletionEntity.builder()
27+
.prompt(prompt)
28+
.build();
29+
client.createPaLMCompletion(configure).getCandidates();
30+
}
31+
```
32+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
title: Completions
3+
---
4+
5+
!!! note
6+
7+
支持 google palm,产品地址: [https://developers.generativeai.google/products/palm](https://developers.generativeai.google/products/palm)
8+
9+
### Create completion
10+
11+
---
12+
13+
为提供的提示和参数创建补全。
14+
15+
```java
16+
try(OpenAiClient client=OpenAiClient.builder()
17+
.provider(ProviderModel.GOOGLE_PALM)
18+
.model(CompletionModel.TEXT_BISON_001)
19+
.apiKey(System.getProperty("google.token"))
20+
.build())
21+
{
22+
PromptEntity prompt = PromptEntity.builder()
23+
.text("How to create a completion")
24+
.build();
25+
CompletionEntity configure = CompletionEntity.builder()
26+
.prompt(prompt)
27+
.build();
28+
client.createPaLMCompletion(configure).getCandidates();
29+
}
30+
```

docs/mkdocs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,7 @@ nav:
9292
- reference/azure/completions_chat.md
9393
- Anthropic Claude:
9494
- reference/anthropic/completions.md
95+
- Google LaPM:
96+
- reference/google_palm/completions.md
9597
- released.md
9698
- powered_by.md

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ public interface DefaultApi
5757
Single<CompleteResponse> fetchCompletions(@Url String url,
5858
@Body CompletionEntity configure);
5959

60+
@POST
61+
Single<CompleteResponse> fetchPaLMCompletions(@Url String url,
62+
@Body org.devlive.sdk.openai.entity.google.CompletionEntity configure);
63+
6064
/**
6165
* Creates a model response for the given chat conversation.
6266
*/

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ public CompleteResponse createCompletion(CompletionEntity configure)
7373
}
7474
}
7575

76+
public CompleteResponse createPaLMCompletion(org.devlive.sdk.openai.entity.google.CompletionEntity configure)
77+
{
78+
return this.api.fetchPaLMCompletions(ProviderUtils.getUrl(provider, UrlModel.FETCH_COMPLETIONS), configure)
79+
.blockingGet();
80+
}
81+
7682
public ChatResponse createChatCompletion(ChatEntity configure)
7783
{
7884
String url = ProviderUtils.getUrl(provider, UrlModel.FETCH_CHAT_COMPLETIONS);

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import org.devlive.sdk.openai.interceptor.AzureInterceptor;
1313
import org.devlive.sdk.openai.interceptor.ClaudeInterceptor;
1414
import org.devlive.sdk.openai.interceptor.DefaultInterceptor;
15+
import org.devlive.sdk.openai.interceptor.GooglePaLMInterceptor;
1516
import org.devlive.sdk.openai.interceptor.OpenAiInterceptor;
17+
import org.devlive.sdk.openai.model.CompletionModel;
1618
import org.devlive.sdk.openai.model.ProviderModel;
1719
import retrofit2.Retrofit;
1820
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
@@ -158,6 +160,12 @@ public OpenAiClientBuilder client(OkHttpClient client)
158160
if (this.provider.equals(ProviderModel.CLAUDE)) {
159161
interceptor = new ClaudeInterceptor();
160162
}
163+
// Google PaLM
164+
if (this.provider.equals(ProviderModel.GOOGLE_PALM)) {
165+
interceptor = new GooglePaLMInterceptor();
166+
interceptor.setApiKey(this.apiKey);
167+
interceptor.setModel(this.model);
168+
}
161169
interceptor.setApiKey(apiKey);
162170
client = client.newBuilder()
163171
.addInterceptor(interceptor)
@@ -166,6 +174,12 @@ public OpenAiClientBuilder client(OkHttpClient client)
166174
return this;
167175
}
168176

177+
public OpenAiClientBuilder model(CompletionModel model)
178+
{
179+
this.model = model.getName();
180+
return this;
181+
}
182+
169183
private String getDefaultHost()
170184
{
171185
if (ObjectUtils.isEmpty(this.provider)) {
@@ -174,6 +188,9 @@ private String getDefaultHost()
174188
if (this.provider.equals(ProviderModel.CLAUDE)) {
175189
return "https://api.anthropic.com";
176190
}
191+
if (this.provider.equals(ProviderModel.GOOGLE_PALM)) {
192+
return "https://generativelanguage.googleapis.com";
193+
}
177194
return "https://api.openai.com";
178195
}
179196

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.devlive.sdk.openai.entity.google;
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.ToString;
9+
10+
import java.util.List;
11+
12+
@Data
13+
@Builder
14+
@ToString
15+
@AllArgsConstructor
16+
@JsonIgnoreProperties(ignoreUnknown = true)
17+
public class CompletionEntity
18+
{
19+
@JsonProperty(value = "prompt")
20+
private PromptEntity prompt;
21+
22+
@JsonProperty(value = "temperature")
23+
@Builder.Default
24+
private Double temperature = 0.25;
25+
26+
@JsonProperty(value = "top_k")
27+
@Builder.Default
28+
private Integer topK = 40;
29+
30+
@JsonProperty(value = "top_p")
31+
@Builder.Default
32+
private Double topP = 1.0;
33+
34+
@JsonProperty(value = "candidate_count")
35+
@Builder.Default
36+
private Integer candidateCount = 1;
37+
38+
@JsonProperty(value = "max_output_tokens")
39+
@Builder.Default
40+
private Integer maxOutputTokens = 1024;
41+
42+
@JsonProperty(value = "stop_sequences")
43+
private List<String> stop;
44+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.devlive.sdk.openai.entity.google;
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.ToString;
9+
10+
@Data
11+
@Builder
12+
@ToString
13+
@AllArgsConstructor
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
public class PromptEntity
16+
{
17+
@JsonProperty(value = "text")
18+
private String text;
19+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.devlive.sdk.openai.interceptor;
2+
3+
import com.google.common.collect.Lists;
4+
import lombok.extern.slf4j.Slf4j;
5+
import okhttp3.HttpUrl;
6+
import okhttp3.Request;
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.devlive.sdk.openai.exception.ParamException;
9+
import org.devlive.sdk.openai.utils.HttpUrlUtils;
10+
11+
import java.util.List;
12+
13+
@Slf4j
14+
public class GooglePaLMInterceptor
15+
extends DefaultInterceptor
16+
{
17+
public GooglePaLMInterceptor()
18+
{
19+
log.debug("Google PaLM Interceptor");
20+
}
21+
22+
@Override
23+
protected Request prepared(Request original)
24+
{
25+
if (StringUtils.isEmpty(this.getApiKey())) {
26+
throw new ParamException("Invalid Google PaLM token, must be non-empty");
27+
}
28+
HttpUrl httpUrl = original.url();
29+
List<String> pathSegments = Lists.newArrayList();
30+
httpUrl = HttpUrlUtils.removePathSegment(httpUrl);
31+
// https://generativelanguage.googleapis.com/v1beta2/models/text-bison-001:generateText?key=YOUR_KEY
32+
pathSegments.add(0, String.join(":", this.getModel(), "generateText"));
33+
pathSegments.add(0, "models");
34+
pathSegments.add(0, "v1beta2");
35+
httpUrl = httpUrl.newBuilder()
36+
.host(httpUrl.host())
37+
.port(httpUrl.port())
38+
.addPathSegments(String.join("/", pathSegments))
39+
.addQueryParameter("key", this.getApiKey())
40+
.build();
41+
log.debug("Google PaLM interceptor request url {}", httpUrl);
42+
return original.newBuilder()
43+
.header("Content-Type", "application/json")
44+
.url(httpUrl)
45+
.method(original.method(), original.body())
46+
.build();
47+
}
48+
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,9 @@ public enum CompletionModel
157157
CLAUDE_INSTANT_1("claude-instant-1",
158158
null,
159159
null,
160-
Integer.MAX_VALUE);
160+
Integer.MAX_VALUE),
161+
/* =============================== Google PaLM ================================ */
162+
TEXT_BISON_001("text-bison-001", null, null, Integer.MAX_VALUE);
161163

162164
private final String name;
163165
private final String description;

0 commit comments

Comments
 (0)