Skip to content

Commit fc86b5d

Browse files
authored
Merge pull request #12 from schemacrawler/langchain
Switch to using langchain4j
2 parents d998070 + a1a4f05 commit fc86b5d

28 files changed

+684
-903
lines changed

pom.xml

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
<project xmlns="http://maven.apache.org/POM/4.0.0"
2-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
1+
<project
2+
xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
45
<modelVersion>4.0.0</modelVersion>
56
<parent>
67
<groupId>us.fatehi</groupId>
@@ -15,9 +16,7 @@
1516
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1617
<java.version>21</java.version>
1718
</properties>
18-
1919
<dependencies>
20-
2120
<dependency>
2221
<groupId>us.fatehi</groupId>
2322
<artifactId>schemacrawler</artifactId>
@@ -40,9 +39,14 @@
4039
</dependency>
4140

4241
<dependency>
43-
<groupId>io.github.sashirestela</groupId>
44-
<artifactId>simple-openai</artifactId>
45-
<version>3.13.0</version>
42+
<groupId>dev.langchain4j</groupId>
43+
<artifactId>langchain4j</artifactId>
44+
<version>1.0.0-alpha1</version>
45+
</dependency>
46+
<dependency>
47+
<groupId>dev.langchain4j</groupId>
48+
<artifactId>langchain4j-open-ai</artifactId>
49+
<version>1.0.0-alpha1</version>
4650
</dependency>
4751

4852
<dependency>
@@ -61,13 +65,15 @@
6165
<groupId>com.fasterxml.jackson.datatype</groupId>
6266
<artifactId>jackson-datatype-jsr310</artifactId>
6367
</dependency>
64-
68+
<dependency>
69+
<groupId>com.fasterxml.jackson.module</groupId>
70+
<artifactId>jackson-module-jsonSchema</artifactId>
71+
</dependency>
6572
<dependency>
6673
<groupId>org.apache.commons</groupId>
6774
<artifactId>commons-math3</artifactId>
6875
<version>3.6.1</version>
6976
</dependency>
70-
7177
<dependency>
7278
<groupId>us.fatehi</groupId>
7379
<artifactId>schemacrawler-testdb</artifactId>
@@ -101,14 +107,12 @@
101107
<type>test-jar</type>
102108
<scope>test</scope>
103109
</dependency>
104-
105110
<dependency>
106111
<groupId>us.fatehi</groupId>
107112
<artifactId>schemacrawler-sqlite</artifactId>
108113
<version>${project.version}</version>
109114
<scope>test</scope>
110115
</dependency>
111-
112116
</dependencies>
113117
<build>
114118
<plugins>

src/main/java/schemacrawler/tools/command/aichat/AiChatCommand.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@
2828

2929
package schemacrawler.tools.command.aichat;
3030

31+
import java.util.Scanner;
3132
import java.util.logging.Level;
3233
import java.util.logging.Logger;
33-
import io.github.sashirestela.openai.SimpleOpenAI;
34+
import static us.fatehi.utility.Utility.isBlank;
35+
import schemacrawler.schemacrawler.exceptions.SchemaCrawlerException;
3436
import schemacrawler.tools.command.aichat.options.AiChatCommandOptions;
37+
import schemacrawler.tools.command.utility.lanchain4j.Langchain4JChatAssistant;
3538
import schemacrawler.tools.executable.BaseSchemaCrawlerCommand;
3639
import us.fatehi.utility.property.PropertyName;
3740

@@ -50,13 +53,30 @@ protected AiChatCommand() {
5053
@Override
5154
public void checkAvailability() throws RuntimeException {
5255
LOGGER.log(Level.FINE, "Looking for OPENAI_API_KEY environmental variable");
53-
SimpleOpenAI.builder().apiKey(commandOptions.getApiKey()).build();
56+
final String apiKey = commandOptions.getApiKey();
57+
if (isBlank(apiKey)) {
58+
throw new SchemaCrawlerException("OPENAI_API_KEY not provided");
59+
}
5460
}
5561

5662
@Override
5763
public void execute() {
58-
try (AiChatConsole aiChatConsole = new AiChatConsole(commandOptions, catalog, connection); ) {
59-
aiChatConsole.console();
64+
final String PROMPT = String.format("%nPrompt: ");
65+
try (final ChatAssistant chatAssistant =
66+
new Langchain4JChatAssistant(commandOptions, catalog, connection);
67+
// new SimpleOpenAIChatAssistant(commandOptions, catalog, connection);
68+
final Scanner scanner = new Scanner(System.in); ) {
69+
while (true) {
70+
System.out.print(PROMPT);
71+
final String prompt = scanner.nextLine();
72+
final String response = chatAssistant.chat(prompt);
73+
System.out.println(response);
74+
if (chatAssistant.shouldExit()) {
75+
return;
76+
}
77+
}
78+
} catch (final Exception e) {
79+
throw new SchemaCrawlerException(e);
6080
}
6181
}
6282

src/main/java/schemacrawler/tools/command/aichat/AiChatConsole.java

Lines changed: 0 additions & 179 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package schemacrawler.tools.command.aichat;
2+
3+
public interface ChatAssistant extends AutoCloseable {
4+
5+
String chat(String prompt);
6+
7+
boolean shouldExit();
8+
}

src/main/java/schemacrawler/tools/command/aichat/FunctionParameters.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,4 @@
2828

2929
package schemacrawler.tools.command.aichat;
3030

31-
import io.github.sashirestela.openai.common.function.Functional;
32-
33-
public interface FunctionParameters extends Functional {
34-
35-
@Override
36-
default Object execute() {
37-
throw new UnsupportedOperationException(
38-
"Execute using executor on function definition; "
39-
+ "this method is provided for API compatibility");
40-
}
41-
}
31+
public interface FunctionParameters {}

src/main/java/schemacrawler/tools/command/aichat/embeddings/EmbeddingService.java

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -28,44 +28,7 @@
2828

2929
package schemacrawler.tools.command.aichat.embeddings;
3030

31-
import java.util.Collections;
32-
import java.util.logging.Level;
33-
import java.util.logging.Logger;
34-
import static java.util.Objects.requireNonNull;
35-
import static us.fatehi.utility.Utility.requireNotBlank;
36-
import io.github.sashirestela.openai.SimpleOpenAI;
37-
import io.github.sashirestela.openai.domain.embedding.Embedding;
38-
import io.github.sashirestela.openai.domain.embedding.EmbeddingFloat;
39-
import io.github.sashirestela.openai.domain.embedding.EmbeddingRequest;
40-
import us.fatehi.utility.string.StringFormat;
31+
public interface EmbeddingService {
4132

42-
public final class EmbeddingService {
43-
44-
private static final Logger LOGGER = Logger.getLogger(EmbeddingService.class.getCanonicalName());
45-
46-
private static final String TEXT_EMBEDDING_MODEL = "text-embedding-3-small";
47-
48-
private final SimpleOpenAI service;
49-
50-
public EmbeddingService(final SimpleOpenAI service) {
51-
this.service = requireNonNull(service, "No Open AI service provided");
52-
}
53-
54-
public TextEmbedding embed(final String text) {
55-
requireNotBlank(text, "No text provided");
56-
57-
try {
58-
final EmbeddingRequest embeddingRequest =
59-
EmbeddingRequest.builder()
60-
.model(TEXT_EMBEDDING_MODEL)
61-
.input(Collections.singletonList(text))
62-
.build();
63-
final Embedding<EmbeddingFloat> embeddingResult =
64-
service.embeddings().create(embeddingRequest).get();
65-
return new TextEmbedding(text, embeddingResult);
66-
} catch (final Exception e) {
67-
LOGGER.log(Level.WARNING, e, new StringFormat("Could not embed text"));
68-
}
69-
return new TextEmbedding(text);
70-
}
33+
TextEmbedding embed(String text);
7134
}

0 commit comments

Comments
 (0)