AI models: add base URL to OpenAI
This commit is contained in:
parent
3b661bba66
commit
e688a8af0f
@ -70,6 +70,7 @@ class Langchain4jChatModelConfigurerImpl implements Langchain4jChatModelConfigur
|
|||||||
@Override
|
@Override
|
||||||
public ChatModel configureChatModel(OpenAiChatModelConfig chatModelConfig) {
|
public ChatModel configureChatModel(OpenAiChatModelConfig chatModelConfig) {
|
||||||
return OpenAiChatModel.builder()
|
return OpenAiChatModel.builder()
|
||||||
|
.baseUrl(chatModelConfig.providerConfig().baseUrl())
|
||||||
.apiKey(chatModelConfig.providerConfig().apiKey())
|
.apiKey(chatModelConfig.providerConfig().apiKey())
|
||||||
.modelName(chatModelConfig.modelId())
|
.modelName(chatModelConfig.modelId())
|
||||||
.temperature(chatModelConfig.temperature())
|
.temperature(chatModelConfig.temperature())
|
||||||
|
|||||||
@ -104,7 +104,10 @@ public class AiModelControllerTest extends AbstractControllerTest {
|
|||||||
var model = doPost("/api/ai/model", constructValidOpenAiModel("Test model"), AiModel.class);
|
var model = doPost("/api/ai/model", constructValidOpenAiModel("Test model"), AiModel.class);
|
||||||
|
|
||||||
var newModelConfig = OpenAiChatModelConfig.builder()
|
var newModelConfig = OpenAiChatModelConfig.builder()
|
||||||
.providerConfig(new OpenAiProviderConfig("test-api-key-updated"))
|
.providerConfig(OpenAiProviderConfig.builder()
|
||||||
|
.baseUrl(OpenAiProviderConfig.OPENAI_OFFICIAL_BASE_URL)
|
||||||
|
.apiKey("test-api-key-updated")
|
||||||
|
.build())
|
||||||
.modelId("o4-mini")
|
.modelId("o4-mini")
|
||||||
.temperature(0.2)
|
.temperature(0.2)
|
||||||
.topP(0.4)
|
.topP(0.4)
|
||||||
@ -270,7 +273,7 @@ public class AiModelControllerTest extends AbstractControllerTest {
|
|||||||
.tenantId(tenantId)
|
.tenantId(tenantId)
|
||||||
.name("Test model 1")
|
.name("Test model 1")
|
||||||
.configuration(OpenAiChatModelConfig.builder()
|
.configuration(OpenAiChatModelConfig.builder()
|
||||||
.providerConfig(new OpenAiProviderConfig("test-api-key"))
|
.providerConfig(OpenAiProviderConfig.builder().apiKey("test-api-key").build())
|
||||||
.modelId("o3-pro")
|
.modelId("o3-pro")
|
||||||
.build())
|
.build())
|
||||||
.build(), AiModel.class);
|
.build(), AiModel.class);
|
||||||
@ -594,7 +597,10 @@ public class AiModelControllerTest extends AbstractControllerTest {
|
|||||||
|
|
||||||
private AiModel constructValidOpenAiModel(String name) {
|
private AiModel constructValidOpenAiModel(String name) {
|
||||||
var modelConfig = OpenAiChatModelConfig.builder()
|
var modelConfig = OpenAiChatModelConfig.builder()
|
||||||
.providerConfig(new OpenAiProviderConfig("test-api-key"))
|
.providerConfig(OpenAiProviderConfig.builder()
|
||||||
|
.baseUrl(OpenAiProviderConfig.OPENAI_OFFICIAL_BASE_URL)
|
||||||
|
.apiKey("test-api-key")
|
||||||
|
.build())
|
||||||
.modelId("gpt-4o")
|
.modelId("gpt-4o")
|
||||||
.temperature(0.5)
|
.temperature(0.5)
|
||||||
.topP(0.3)
|
.topP(0.3)
|
||||||
|
|||||||
@ -253,7 +253,7 @@ class DefaultTbAiModelServiceTest {
|
|||||||
|
|
||||||
private static AiModelConfig constructValidOpenAiModelConfig() {
|
private static AiModelConfig constructValidOpenAiModelConfig() {
|
||||||
return OpenAiChatModelConfig.builder()
|
return OpenAiChatModelConfig.builder()
|
||||||
.providerConfig(new OpenAiProviderConfig("test-api-key"))
|
.providerConfig(OpenAiProviderConfig.builder().apiKey("test-api-key").build())
|
||||||
.modelId("gpt-4o")
|
.modelId("gpt-4o")
|
||||||
.temperature(0.5)
|
.temperature(0.5)
|
||||||
.topP(0.3)
|
.topP(0.3)
|
||||||
|
|||||||
@ -682,7 +682,10 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
|
|||||||
|
|
||||||
private AiModel constructValidOpenAiModel(String name) {
|
private AiModel constructValidOpenAiModel(String name) {
|
||||||
var modelConfig = OpenAiChatModelConfig.builder()
|
var modelConfig = OpenAiChatModelConfig.builder()
|
||||||
.providerConfig(new OpenAiProviderConfig("test-api-key"))
|
.providerConfig(OpenAiProviderConfig.builder()
|
||||||
|
.baseUrl(OpenAiProviderConfig.OPENAI_OFFICIAL_BASE_URL)
|
||||||
|
.apiKey("test-api-key")
|
||||||
|
.build())
|
||||||
.modelId("gpt-4o")
|
.modelId("gpt-4o")
|
||||||
.temperature(0.5)
|
.temperature(0.5)
|
||||||
.topP(0.3)
|
.topP(0.3)
|
||||||
@ -699,6 +702,7 @@ public class BaseTbResourceServiceTest extends AbstractControllerTest {
|
|||||||
.configuration(modelConfig)
|
.configuration(modelConfig)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFindTenantResourcesByTenantId() throws Exception {
|
public void testFindTenantResourcesByTenantId() throws Exception {
|
||||||
loginSysAdmin();
|
loginSysAdmin();
|
||||||
|
|||||||
@ -15,8 +15,32 @@
|
|||||||
*/
|
*/
|
||||||
package org.thingsboard.server.common.data.ai.provider;
|
package org.thingsboard.server.common.data.ai.provider;
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import jakarta.validation.constraints.AssertTrue;
|
||||||
|
import lombok.Builder;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@Builder
|
||||||
public record OpenAiProviderConfig(
|
public record OpenAiProviderConfig(
|
||||||
@NotNull String apiKey
|
String baseUrl,
|
||||||
) implements AiProviderConfig {}
|
String apiKey
|
||||||
|
) implements AiProviderConfig {
|
||||||
|
|
||||||
|
public static final String OPENAI_OFFICIAL_BASE_URL = "https://api.openai.com/v1";
|
||||||
|
|
||||||
|
public OpenAiProviderConfig {
|
||||||
|
baseUrl = Objects.requireNonNullElse(baseUrl, OPENAI_OFFICIAL_BASE_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
@AssertTrue(message = "API key is required when using the official OpenAI API")
|
||||||
|
public boolean isValid() {
|
||||||
|
if (baseUrl.equals(OPENAI_OFFICIAL_BASE_URL)) {
|
||||||
|
return StringUtils.isNotBlank(apiKey);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@ -129,7 +129,10 @@ class TbAiNodeTest {
|
|||||||
config = new TbAiNodeConfiguration();
|
config = new TbAiNodeConfiguration();
|
||||||
|
|
||||||
modelConfig = OpenAiChatModelConfig.builder()
|
modelConfig = OpenAiChatModelConfig.builder()
|
||||||
.providerConfig(new OpenAiProviderConfig("test-api-key"))
|
.providerConfig(OpenAiProviderConfig.builder()
|
||||||
|
.baseUrl(OpenAiProviderConfig.OPENAI_OFFICIAL_BASE_URL)
|
||||||
|
.apiKey("test-api-key")
|
||||||
|
.build())
|
||||||
.modelId("gpt-4o")
|
.modelId("gpt-4o")
|
||||||
.temperature(0.5)
|
.temperature(0.5)
|
||||||
.topP(0.3)
|
.topP(0.3)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user