spans) {
- if (isShutdown.get()) {
- return CompletableResultCode.ofFailure();
- }
+ ResourceSpansMarshaler[] allResourceSpans = ResourceSpansMarshaler.create(spans);
+ for (ResourceSpansMarshaler resourceSpans : allResourceSpans) {
+ SegmentedStringWriter sw = new SegmentedStringWriter(JsonUtil.JSON_FACTORY._getBufferRecycler());
+ try (JsonGenerator gen = JsonUtil.create(sw)) {
+ resourceSpans.writeJsonTo(gen);
+ }
+ catch (IOException e) {
+ // Shouldn't happen in practice, just skip it.
+ continue;
+ }
+ try {
+ logger.log(Level.INFO, sw.getAndClear());
+ }
+ catch (IOException e) {
+ logger.log(Level.WARNING, "Unable to read OTLP JSON spans", e);
+ }
+ }
+ return CompletableResultCode.ofSuccess();
+ }
- ResourceSpansMarshaler[] allResourceSpans = ResourceSpansMarshaler.create(spans);
- for (ResourceSpansMarshaler resourceSpans : allResourceSpans) {
- SegmentedStringWriter sw =
- new SegmentedStringWriter(JsonUtil.JSON_FACTORY._getBufferRecycler());
- try (JsonGenerator gen = JsonUtil.create(sw)) {
- resourceSpans.writeJsonTo(gen);
- } catch (IOException e) {
- // Shouldn't happen in practice, just skip it.
- continue;
- }
- try {
- logger.log(Level.INFO, sw.getAndClear());
- } catch (IOException e) {
- logger.log(Level.WARNING, "Unable to read OTLP JSON spans", e);
- }
- }
- return CompletableResultCode.ofSuccess();
- }
+ @Override
+ public CompletableResultCode flush() {
+ return CompletableResultCode.ofSuccess();
+ }
- @Override
- public CompletableResultCode flush() {
- return CompletableResultCode.ofSuccess();
- }
+ @Override
+ public CompletableResultCode shutdown() {
+ if (!isShutdown.compareAndSet(false, true)) {
+ logger.log(Level.INFO, "Calling shutdown() multiple times.");
+ }
+ return CompletableResultCode.ofSuccess();
+ }
- @Override
- public CompletableResultCode shutdown() {
- if (!isShutdown.compareAndSet(false, true)) {
- logger.log(Level.INFO, "Calling shutdown() multiple times.");
- }
- return CompletableResultCode.ofSuccess();
- }
}
diff --git a/spring-ai-alibaba-examples/observability-example/src/main/java/com/alibaba/cloud/ai/example/observability/exporter/oltp/OtlpFileSpanExporterProvider.java b/spring-ai-alibaba-examples/observability-example/src/main/java/com/alibaba/cloud/ai/example/observability/exporter/oltp/OtlpFileSpanExporterProvider.java
index 70f2414f..146d776a 100755
--- a/spring-ai-alibaba-examples/observability-example/src/main/java/com/alibaba/cloud/ai/example/observability/exporter/oltp/OtlpFileSpanExporterProvider.java
+++ b/spring-ai-alibaba-examples/observability-example/src/main/java/com/alibaba/cloud/ai/example/observability/exporter/oltp/OtlpFileSpanExporterProvider.java
@@ -12,17 +12,20 @@
/**
* {@link SpanExporter} SPI implementation for {@link OtlpFileSpanExporter}.
*
- * This class is internal and is hence not for public use. Its APIs are unstable and can change
- * at any time.
+ *
+ * This class is internal and is hence not for public use. Its APIs are unstable and can
+ * change at any time.
*/
public class OtlpFileSpanExporterProvider implements ConfigurableSpanExporterProvider {
- @Override
- public SpanExporter createExporter(ConfigProperties config) {
- return OtlpFileSpanExporter.create();
- }
- @Override
- public String getName() {
- return "logging-otlp";
- }
+ @Override
+ public SpanExporter createExporter(ConfigProperties config) {
+ return OtlpFileSpanExporter.create();
+ }
+
+ @Override
+ public String getName() {
+ return "logging-otlp";
+ }
+
}
diff --git a/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/controller/OutputParserController.java b/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/controller/OutputParserController.java
index 8113d9b0..1c023872 100644
--- a/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/controller/OutputParserController.java
+++ b/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/controller/OutputParserController.java
@@ -34,43 +34,34 @@ public OutputParserController(ChatClient.Builder builder, ChatModel chatModel) {
public ActorsFilms generate(@RequestParam(value = "actor", defaultValue = "Jeff Bridges") String actor) {
/**
- * Low API: chatModel API
- BeanOutputConverter beanOutputConverter =
- new BeanOutputConverter<>(ActorsFilms.class);
-
- String template = """
- Generate the filmography of 5 movies for {actor}.
- {format}
- """;
- return beanOutputConverter.convert(
- chatModel.call(
- new PromptTemplate(
- template,
- Map.of("actor", "Tom Hanks", "format", beanOutputConverter.getFormat())
- ).create()).getResult().getOutput().getContent());
+ * Low API: chatModel API BeanOutputConverter beanOutputConverter =
+ * new BeanOutputConverter<>(ActorsFilms.class);
+ *
+ * String template = """ Generate the filmography of 5 movies for {actor}.
+ * {format} """; return beanOutputConverter.convert( chatModel.call( new
+ * PromptTemplate( template, Map.of("actor", "Tom Hanks", "format",
+ * beanOutputConverter.getFormat())
+ * ).create()).getResult().getOutput().getContent());
*/
// ChatClient API
return chatClient.prompt()
- .user(u -> u.text("Generate the filmography of 5 movies for {actor}.")
- .param("actor", "Tom Hanks"))
- .call()
- .entity(ActorsFilms.class);
+ .user(u -> u.text("Generate the filmography of 5 movies for {actor}.").param("actor", "Tom Hanks"))
+ .call()
+ .entity(ActorsFilms.class);
}
@GetMapping("/output/stream")
- public List generateStream(@RequestParam(value = "actor", defaultValue = "Jeff Bridges") String actor) {
+ public List generateStream(
+ @RequestParam(value = "actor", defaultValue = "Jeff Bridges") String actor) {
- var converter = new BeanOutputConverter<>(new ParameterizedTypeReference>() { });
+ var converter = new BeanOutputConverter<>(new ParameterizedTypeReference>() {
+ });
- Flux flux = this.chatClient.prompt()
- .user(u -> u.text("""
- Generate the filmography for a random actor.
- {format}
- """)
- .param("format", converter.getFormat()))
- .stream()
- .content();
+ Flux flux = this.chatClient.prompt().user(u -> u.text("""
+ Generate the filmography for a random actor.
+ {format}
+ """).param("format", converter.getFormat())).stream().content();
return converter.convert(String.join("", Objects.requireNonNull(flux.collectList().block())));
}
diff --git a/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/entity/ActorsFilms.java b/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/entity/ActorsFilms.java
index 0dfb46e9..352c94d9 100644
--- a/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/entity/ActorsFilms.java
+++ b/spring-ai-alibaba-examples/output-parser-example/src/main/java/com/alibaba/cloud/ai/example/outparser/entity/ActorsFilms.java
@@ -4,32 +4,32 @@
public class ActorsFilms {
- private String actor;
+ private String actor;
- private List movies;
+ private List movies;
- public ActorsFilms() {
- }
+ public ActorsFilms() {
+ }
- public String getActor() {
- return actor;
- }
+ public String getActor() {
+ return actor;
+ }
- public void setActor(String actor) {
- this.actor = actor;
- }
+ public void setActor(String actor) {
+ this.actor = actor;
+ }
- public List getMovies() {
- return movies;
- }
+ public List getMovies() {
+ return movies;
+ }
- public void setMovies(List movies) {
- this.movies = movies;
- }
+ public void setMovies(List movies) {
+ this.movies = movies;
+ }
- @Override
- public String toString() {
- return "ActorsFilms{" + "actor='" + actor + '\'' + ", movies=" + movies + '}';
- }
+ @Override
+ public String toString() {
+ return "ActorsFilms{" + "actor='" + actor + '\'' + ", movies=" + movies + '}';
+ }
}
diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java
index 8b5634e9..f896ace9 100644
--- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java
+++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/Application.java
@@ -18,9 +18,8 @@
import org.springframework.core.io.Resource;
import org.springframework.web.client.RestClient;
-
@SpringBootApplication
-public class Application {
+public class Application {
private static final Logger logger = LoggerFactory.getLogger(Application.class);
@@ -59,4 +58,5 @@ public ChatMemory chatMemory() {
public RestClient.Builder restClientBuilder() {
return RestClient.builder();
}
+
}
diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantController.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantController.java
index 54fdadce..9115bf2b 100644
--- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantController.java
+++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/AssistantController.java
@@ -6,7 +6,6 @@
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
-
@RequestMapping("/api/assistant")
@RestController
public class AssistantController {
@@ -17,7 +16,7 @@ public AssistantController(CustomerSupportAssistant agent) {
this.agent = agent;
}
- @RequestMapping(path="/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+ @RequestMapping(path = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux chat(String chatId, String userMessage) {
return agent.chat(chatId, userMessage);
}
diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingController.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingController.java
index d3ecb979..315cf66b 100644
--- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingController.java
+++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/client/BookingController.java
@@ -1,6 +1,5 @@
package ai.spring.demo.ai.playground.client;
-
import ai.spring.demo.ai.playground.services.BookingTools.BookingDetails;
import ai.spring.demo.ai.playground.services.FlightBookingService;
import org.springframework.stereotype.Controller;
diff --git a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java
index 07da910f..53b1ca75 100644
--- a/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java
+++ b/spring-ai-alibaba-examples/playground-flight-booking/src/main/java/ai/spring/demo/ai/playground/services/LoggingAdvisor.java
@@ -13,8 +13,9 @@ public AdvisedRequest adviseRequest(AdvisedRequest request, Map
return request;
}
- @Override
- public int getOrder() {
- return 0;
- }
+ @Override
+ public int getOrder() {
+ return 0;
+ }
+
}
diff --git a/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/PromptTemplateController.java b/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/PromptTemplateController.java
index 37582a4b..18f0b7ac 100644
--- a/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/PromptTemplateController.java
+++ b/spring-ai-alibaba-examples/prompt-example/src/main/java/com/alibaba/cloud/ai/example/prompt/PromptTemplateController.java
@@ -26,20 +26,19 @@
public class PromptTemplateController {
private final ChatClient chatClient;
-
+
private final ConfigurablePromptTemplateFactory configurablePromptTemplateFactory;
-
-
+
@Value("classpath:/prompts/joke-prompt.st")
private Resource jokeResource;
-
+
@Autowired
public PromptTemplateController(ChatClient.Builder builder,
ConfigurablePromptTemplateFactory configurablePromptTemplateFactory) {
this.chatClient = builder.build();
this.configurablePromptTemplateFactory = configurablePromptTemplateFactory;
}
-
+
@GetMapping("/prompt")
public AssistantMessage completion(@RequestParam(value = "adjective", defaultValue = "funny") String adjective,
@RequestParam(value = "topic", defaultValue = "cows") String topic) {
@@ -47,11 +46,12 @@ public AssistantMessage completion(@RequestParam(value = "adjective", defaultVal
Prompt prompt = promptTemplate.create(Map.of("adjective", adjective, "topic", topic));
return chatClient.prompt(prompt).call().chatResponse().getResult().getOutput();
}
-
+
/**
- * nacos template config [{"name:"test-template","template:"please list the most famous books by this {author}."}]
+ * nacos template config [{"name:"test-template","template:"please list the most
+ * famous books by this {author}."}]
*/
-
+
@GetMapping("/prompt-template")
public AssistantMessage generate(@RequestParam(value = "author") String author) {
ConfigurablePromptTemplate template = configurablePromptTemplateFactory.getTemplate("test-template");
@@ -62,7 +62,8 @@ public AssistantMessage generate(@RequestParam(value = "author") String author)
Prompt prompt;
if (StringUtils.hasText(author)) {
prompt = template.create(Map.of("author", author));
- } else {
+ }
+ else {
prompt = template.create();
}
return chatClient.prompt(prompt).call().chatResponse().getResult().getOutput();
diff --git a/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagConfiguration.java b/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagConfiguration.java
index 6452f2a3..ae1cc647 100644
--- a/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagConfiguration.java
+++ b/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagConfiguration.java
@@ -23,15 +23,14 @@
import org.springframework.context.annotation.Configuration;
/**
-* Title Rag configuration.
-* Description Rag configuration.
-*
-* @author yuanci.ytb
-* @since 1.0.0-M2
-*/
+ * Title Rag configuration.
+ * Description Rag configuration.
+ *
+ * @author yuanci.ytb
+ * @since 1.0.0-M2
+ */
@Configuration
public class RagConfiguration {
-
}
diff --git a/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagService.java b/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagService.java
index 0ecdbbb1..5f41e07d 100644
--- a/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagService.java
+++ b/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/RagService.java
@@ -32,4 +32,5 @@ public interface RagService {
void importDocuments();
Flux retrieve(String message);
+
}
diff --git a/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/local/LocalRagService.java b/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/local/LocalRagService.java
index f2e1b456..90deb2ab 100644
--- a/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/local/LocalRagService.java
+++ b/spring-ai-alibaba-examples/rag-example/src/main/java/com/alibaba/cloud/ai/example/rag/local/LocalRagService.java
@@ -49,133 +49,133 @@
import java.util.Map;
/**
-* Title Local rag service.
-* Description Local rag service.
-*
-* @author yuanci.ytb
-* @since 1.0.0-M2
-*/
+ * Title Local rag service.
+ * Description Local rag service.
+ *
+ * @author yuanci.ytb
+ * @since 1.0.0-M2
+ */
@Service()
public class LocalRagService implements RagService {
- private static final Logger logger = LoggerFactory.getLogger(LocalRagService.class);
+ private static final Logger logger = LoggerFactory.getLogger(LocalRagService.class);
- private static final String textField = "content";
+ private static final String textField = "content";
- private static final String vectorField = "embedding";
+ private static final String vectorField = "embedding";
- @Value("classpath:/data/spring_ai_alibaba_quickstart.pdf")
- private Resource springAiResource;
+ @Value("classpath:/data/spring_ai_alibaba_quickstart.pdf")
+ private Resource springAiResource;
- @Value("classpath:/prompts/system-qa.st")
- private Resource systemResource;
+ @Value("classpath:/prompts/system-qa.st")
+ private Resource systemResource;
- private final ChatModel chatModel;
+ private final ChatModel chatModel;
- private final VectorStore vectorStore;
-
- private final RerankModel rerankModel;
-
- private final ElasticsearchClient elasticsearchClient;
-
- private final ElasticsearchVectorStoreProperties options;
-
- public LocalRagService(ChatModel chatModel, VectorStore vectorStore, RerankModel rerankModel,
- ElasticsearchClient elasticsearchClient, ElasticsearchVectorStoreProperties options) {
- this.chatModel = chatModel;
- this.vectorStore = vectorStore;
- this.rerankModel = rerankModel;
- this.elasticsearchClient = elasticsearchClient;
- this.options = options;
- }
-
- @Override
- public void importDocuments() {
- // 1. parse document
- DocumentReader reader = new PagePdfDocumentReader(springAiResource);
- List documents = reader.get();
- logger.info("{} documents loaded", documents.size());
-
- // 2. split trunks
- List splitDocuments = new TokenTextSplitter().apply(documents);
- logger.info("{} documents split", splitDocuments.size());
-
- // 3. create embedding and store to vector store
- logger.info("create embedding and save to vector store");
- createIndexIfNotExists();
- vectorStore.add(splitDocuments);
- }
-
- public Flux retrieve(String message) {
- // Enable hybrid search, both embedding and full text search
- SearchRequest searchRequest = SearchRequest.defaults()
- .withFilterExpression(new FilterExpressionBuilder().eq(textField, message).build());
-
- // Step3 - Retrieve and llm generate
- String promptTemplate = getPromptTemplate(systemResource);
- ChatClient chatClient = ChatClient.builder(chatModel)
- .defaultAdvisors(new RetrievalRerankAdvisor(vectorStore, rerankModel, searchRequest, promptTemplate, 0.1))
- .build();
-
- return chatClient.prompt().user(message).stream().chatResponse();
- }
-
- private void createIndexIfNotExists() {
- try {
- String indexName = options.getIndexName();
- Integer dimsLength = options.getDimensions();
-
- if (StringUtils.isBlank(indexName)) {
- throw new IllegalArgumentException("Elastic search index name must be provided");
- }
-
- boolean exists = elasticsearchClient.indices().exists(idx -> idx.index(indexName)).value();
- if (exists) {
- logger.debug("Index {} already exists. Skipping creation.", indexName);
- return;
- }
-
- String similarityAlgo = options.getSimilarity().name();
- IndexSettings indexSettings = IndexSettings
- .of(settings -> settings.numberOfShards(String.valueOf(1)).numberOfReplicas(String.valueOf(1)));
-
- // Maybe using json directly?
- Map properties = new HashMap<>();
- properties.put(vectorField, Property.of(property -> property.denseVector(
- DenseVectorProperty.of(dense -> dense.index(true).dims(dimsLength).similarity(similarityAlgo)))));
- properties.put(textField, Property.of(property -> property.text(TextProperty.of(t -> t))));
-
- Map metadata = new HashMap<>();
- metadata.put("ref_doc_id", Property.of(property -> property.keyword(KeywordProperty.of(k -> k))));
-
- properties.put("metadata",
- Property.of(property -> property.object(ObjectProperty.of(op -> op.properties(metadata)))));
-
- CreateIndexResponse indexResponse = elasticsearchClient.indices()
- .create(createIndexBuilder -> createIndexBuilder.index(indexName)
- .settings(indexSettings)
- .mappings(TypeMapping.of(mappings -> mappings.properties(properties))));
-
- if (!indexResponse.acknowledged()) {
- throw new RuntimeException("failed to create index");
- }
-
- logger.info("create elasticsearch index {} successfully", indexName);
- }
- catch (IOException e) {
- logger.error("failed to create index", e);
- throw new RuntimeException(e);
- }
- }
-
- private String getPromptTemplate(Resource systemResource) {
- try {
- return systemResource.getContentAsString(StandardCharsets.UTF_8);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
+ private final VectorStore vectorStore;
+
+ private final RerankModel rerankModel;
+
+ private final ElasticsearchClient elasticsearchClient;
+
+ private final ElasticsearchVectorStoreProperties options;
+
+ public LocalRagService(ChatModel chatModel, VectorStore vectorStore, RerankModel rerankModel,
+ ElasticsearchClient elasticsearchClient, ElasticsearchVectorStoreProperties options) {
+ this.chatModel = chatModel;
+ this.vectorStore = vectorStore;
+ this.rerankModel = rerankModel;
+ this.elasticsearchClient = elasticsearchClient;
+ this.options = options;
+ }
+
+ @Override
+ public void importDocuments() {
+ // 1. parse document
+ DocumentReader reader = new PagePdfDocumentReader(springAiResource);
+ List documents = reader.get();
+ logger.info("{} documents loaded", documents.size());
+
+ // 2. split trunks
+ List splitDocuments = new TokenTextSplitter().apply(documents);
+ logger.info("{} documents split", splitDocuments.size());
+
+ // 3. create embedding and store to vector store
+ logger.info("create embedding and save to vector store");
+ createIndexIfNotExists();
+ vectorStore.add(splitDocuments);
+ }
+
+ public Flux retrieve(String message) {
+ // Enable hybrid search, both embedding and full text search
+ SearchRequest searchRequest = SearchRequest.defaults()
+ .withFilterExpression(new FilterExpressionBuilder().eq(textField, message).build());
+
+ // Step3 - Retrieve and llm generate
+ String promptTemplate = getPromptTemplate(systemResource);
+ ChatClient chatClient = ChatClient.builder(chatModel)
+ .defaultAdvisors(new RetrievalRerankAdvisor(vectorStore, rerankModel, searchRequest, promptTemplate, 0.1))
+ .build();
+
+ return chatClient.prompt().user(message).stream().chatResponse();
+ }
+
+ private void createIndexIfNotExists() {
+ try {
+ String indexName = options.getIndexName();
+ Integer dimsLength = options.getDimensions();
+
+ if (StringUtils.isBlank(indexName)) {
+ throw new IllegalArgumentException("Elastic search index name must be provided");
+ }
+
+ boolean exists = elasticsearchClient.indices().exists(idx -> idx.index(indexName)).value();
+ if (exists) {
+ logger.debug("Index {} already exists. Skipping creation.", indexName);
+ return;
+ }
+
+ String similarityAlgo = options.getSimilarity().name();
+ IndexSettings indexSettings = IndexSettings
+ .of(settings -> settings.numberOfShards(String.valueOf(1)).numberOfReplicas(String.valueOf(1)));
+
+ // Maybe using json directly?
+ Map properties = new HashMap<>();
+ properties.put(vectorField, Property.of(property -> property.denseVector(
+ DenseVectorProperty.of(dense -> dense.index(true).dims(dimsLength).similarity(similarityAlgo)))));
+ properties.put(textField, Property.of(property -> property.text(TextProperty.of(t -> t))));
+
+ Map metadata = new HashMap<>();
+ metadata.put("ref_doc_id", Property.of(property -> property.keyword(KeywordProperty.of(k -> k))));
+
+ properties.put("metadata",
+ Property.of(property -> property.object(ObjectProperty.of(op -> op.properties(metadata)))));
+
+ CreateIndexResponse indexResponse = elasticsearchClient.indices()
+ .create(createIndexBuilder -> createIndexBuilder.index(indexName)
+ .settings(indexSettings)
+ .mappings(TypeMapping.of(mappings -> mappings.properties(properties))));
+
+ if (!indexResponse.acknowledged()) {
+ throw new RuntimeException("failed to create index");
+ }
+
+ logger.info("create elasticsearch index {} successfully", indexName);
+ }
+ catch (IOException e) {
+ logger.error("failed to create index", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ private String getPromptTemplate(Resource systemResource) {
+ try {
+ return systemResource.getContentAsString(StandardCharsets.UTF_8);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
\ No newline at end of file