[chatgpt] Add support for LocalAI and other compatible services (#15385)
* Add support for LocalAI and other compatible services -------- Signed-off-by: Kai Kreuzer <kai@openhab.org>
This commit is contained in:
@@ -15,8 +15,12 @@ The `account` thing requires a single configuration parameter, which is the API
|
|||||||
API keys can be created and managed under <https://platform.openai.com/account/api-keys>.
|
API keys can be created and managed under <https://platform.openai.com/account/api-keys>.
|
||||||
|
|
||||||
| Name | Type | Description | Default | Required | Advanced |
|
| Name | Type | Description | Default | Required | Advanced |
|
||||||
|-----------------|---------|-----------------------------------------|---------|----------|----------|
|
|-----------------|---------|-----------------------------------------------------------|--------------------------------------------|----------|----------|
|
||||||
| apiKey | text | The API key to be used for the requests | N/A | yes | no |
|
| apiKey | text | The API key to be used for the requests | N/A | yes | no |
|
||||||
|
| apiUrl | text | The server API where to reach the AI service | https://api.openai.com/v1/chat/completions | no | yes |
|
||||||
|
| modelUrl | text | The model url where to retrieve the available models from | https://api.openai.com/v1/models | no | yes |
|
||||||
|
|
||||||
|
The advanced parameters `apiUrl` and `modelUrl` can be used, if any other ChatGPT-compatible service is used, e.g. a local installation of [LocalAI](https://github.com/go-skynet/LocalAI).
|
||||||
|
|
||||||
## Channels
|
## Channels
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,4 @@ public class ChatGPTBindingConstants {
|
|||||||
|
|
||||||
// List of all Channel ids
|
// List of all Channel ids
|
||||||
public static final String CHANNEL_CHAT = "chat";
|
public static final String CHANNEL_CHAT = "chat";
|
||||||
|
|
||||||
public static final String OPENAI_API_URL = "https://api.openai.com/v1/chat/completions";
|
|
||||||
public static final String OPENAI_MODELS_URL = "https://api.openai.com/v1/models";
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,4 +23,6 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
|
|||||||
public class ChatGPTConfiguration {
|
public class ChatGPTConfiguration {
|
||||||
|
|
||||||
public String apiKey = "";
|
public String apiKey = "";
|
||||||
|
public String apiUrl = "https://api.openai.com/v1/chat/completions";
|
||||||
|
public String modelUrl = "https://api.openai.com/v1/models";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.openhab.binding.chatgpt.internal;
|
package org.openhab.binding.chatgpt.internal;
|
||||||
|
|
||||||
import static org.openhab.binding.chatgpt.internal.ChatGPTBindingConstants.*;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -63,6 +61,9 @@ public class ChatGPTHandler extends BaseThingHandler {
|
|||||||
private Gson gson = new Gson();
|
private Gson gson = new Gson();
|
||||||
|
|
||||||
private String apiKey = "";
|
private String apiKey = "";
|
||||||
|
private String apiUrl = "";
|
||||||
|
private String modelUrl = "";
|
||||||
|
|
||||||
private String lastPrompt = "";
|
private String lastPrompt = "";
|
||||||
|
|
||||||
private List<String> models = List.of();
|
private List<String> models = List.of();
|
||||||
@@ -123,7 +124,7 @@ public class ChatGPTHandler extends BaseThingHandler {
|
|||||||
root.add("messages", messages);
|
root.add("messages", messages);
|
||||||
|
|
||||||
String queryJson = gson.toJson(root);
|
String queryJson = gson.toJson(root);
|
||||||
Request request = httpClient.newRequest(OPENAI_API_URL).method(HttpMethod.POST)
|
Request request = httpClient.newRequest(apiUrl).method(HttpMethod.POST)
|
||||||
.header("Content-Type", "application/json").header("Authorization", "Bearer " + apiKey)
|
.header("Content-Type", "application/json").header("Authorization", "Bearer " + apiKey)
|
||||||
.content(new StringContentProvider(queryJson));
|
.content(new StringContentProvider(queryJson));
|
||||||
logger.trace("Query '{}'", queryJson);
|
logger.trace("Query '{}'", queryJson);
|
||||||
@@ -158,12 +159,15 @@ public class ChatGPTHandler extends BaseThingHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.apiKey = apiKey;
|
this.apiKey = apiKey;
|
||||||
|
this.apiUrl = config.apiUrl;
|
||||||
|
this.modelUrl = config.modelUrl;
|
||||||
|
|
||||||
updateStatus(ThingStatus.UNKNOWN);
|
updateStatus(ThingStatus.UNKNOWN);
|
||||||
|
|
||||||
scheduler.execute(() -> {
|
scheduler.execute(() -> {
|
||||||
try {
|
try {
|
||||||
Request request = httpClient.newRequest(OPENAI_MODELS_URL).method(HttpMethod.GET)
|
Request request = httpClient.newRequest(modelUrl).method(HttpMethod.GET).header("Authorization",
|
||||||
.header("Authorization", "Bearer " + apiKey);
|
"Bearer " + apiKey);
|
||||||
ContentResponse response = request.send();
|
ContentResponse response = request.send();
|
||||||
if (response.getStatus() == 200) {
|
if (response.getStatus() == 200) {
|
||||||
updateStatus(ThingStatus.ONLINE);
|
updateStatus(ThingStatus.ONLINE);
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ thing-type.chatgpt.account.description = Account at OpenAI that is used for acce
|
|||||||
|
|
||||||
thing-type.config.chatgpt.account.apiKey.label = API Key
|
thing-type.config.chatgpt.account.apiKey.label = API Key
|
||||||
thing-type.config.chatgpt.account.apiKey.description = API key to access the account
|
thing-type.config.chatgpt.account.apiKey.description = API key to access the account
|
||||||
|
thing-type.config.chatgpt.account.apiUrl.label = API URL
|
||||||
|
thing-type.config.chatgpt.account.apiUrl.description = The server API where to reach the AI service.
|
||||||
|
thing-type.config.chatgpt.account.modelUrl.label = Model URL
|
||||||
|
thing-type.config.chatgpt.account.modelUrl.description = The model url where to retrieve the available models from.
|
||||||
|
|
||||||
# channel types
|
# channel types
|
||||||
|
|
||||||
@@ -29,7 +33,7 @@ channel-type.config.chatgpt.chat.systemMessage.description = The system message
|
|||||||
channel-type.config.chatgpt.chat.temperature.label = Temperature
|
channel-type.config.chatgpt.chat.temperature.label = Temperature
|
||||||
channel-type.config.chatgpt.chat.temperature.description = Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
|
channel-type.config.chatgpt.chat.temperature.description = Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
|
||||||
|
|
||||||
# Status messages
|
# status messages
|
||||||
|
|
||||||
offline.configuration-error = No API key configured
|
offline.configuration-error = No API key configured
|
||||||
offline.communication-error = Could not connect to OpenAI API
|
offline.communication-error = Could not connect to OpenAI API
|
||||||
|
|||||||
@@ -19,6 +19,26 @@
|
|||||||
<label>API Key</label>
|
<label>API Key</label>
|
||||||
<description>API key to access the account</description>
|
<description>API key to access the account</description>
|
||||||
</parameter>
|
</parameter>
|
||||||
|
<parameter name="apiUrl" type="text" required="false">
|
||||||
|
<label>API URL</label>
|
||||||
|
<description>The server API where to reach the AI service.</description>
|
||||||
|
<default>https://api.openai.com/v1/chat/completions</default>
|
||||||
|
<advanced>true</advanced>
|
||||||
|
<options>
|
||||||
|
<option value="https://api.openai.com/v1/chat/completions">https://api.openai.com/v1/chat/completions</option>
|
||||||
|
</options>
|
||||||
|
<limitToOptions>false</limitToOptions>
|
||||||
|
</parameter>
|
||||||
|
<parameter name="modelUrl" type="text" required="false">
|
||||||
|
<label>Model URL</label>
|
||||||
|
<description>The model url where to retrieve the available models from.</description>
|
||||||
|
<default>https://api.openai.com/v1/models</default>
|
||||||
|
<advanced>true</advanced>
|
||||||
|
<options>
|
||||||
|
<option value="https://api.openai.com/v1/models">https://api.openai.com/v1/models</option>
|
||||||
|
</options>
|
||||||
|
<limitToOptions>false</limitToOptions>
|
||||||
|
</parameter>
|
||||||
</config-description>
|
</config-description>
|
||||||
</thing-type>
|
</thing-type>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user