Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

<modules>
<module>schemacrawler-ai-parent</module>
<module>schemacrawler-ai-tools</module>
<module>schemacrawler-ai-core</module>
<module>schemacrawler-ai-langchain4j</module>
<module>schemacrawler-ai-mcp</module>
Expand Down
5 changes: 5 additions & 0 deletions schemacrawler-ai-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler</artifactId>
</dependency>
<dependency>
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler-ai-tools</artifactId>
<version>16.25.3-2</version>
</dependency>
<dependency>
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler-scripting</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
import static us.fatehi.utility.Utility.isBlank;
import schemacrawler.schema.Schema;
import schemacrawler.schemacrawler.SchemaCrawlerOptions;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;
import schemacrawler.tools.command.aichat.utility.ConnectionDatabaseConnectionSource;
import schemacrawler.tools.executable.SchemaCrawlerExecutable;
import schemacrawler.tools.options.Config;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies.KebabCaseStrategy;
import schemacrawler.tools.command.aichat.FunctionDefinition;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionDefinition;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;

public abstract class AbstractFunctionDefinition<P extends FunctionParameters>
implements FunctionDefinition<P> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@
import java.util.UUID;
import com.fasterxml.jackson.databind.PropertyNamingStrategies.KebabCaseStrategy;
import static java.util.Objects.requireNonNull;
import schemacrawler.tools.command.aichat.FunctionExecutor;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.tools.FunctionExecutor;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;
import schemacrawler.tools.executable.BaseCommand;
import us.fatehi.utility.property.PropertyName;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public record DatabaseObjectDescriptionFunctionParameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public record DatabaseObjectListFunctionParameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

package schemacrawler.tools.command.aichat.functions;

import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;
import us.fatehi.utility.property.PropertyName;

public final class ExitFunctionExecutor extends AbstractFunctionExecutor<NoParameters> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public record LintFunctionParameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public record NoParameters() implements FunctionParameters {}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

package schemacrawler.tools.command.aichat.functions;

import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;

public class NoResultsReturn implements FunctionReturn {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;

@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public record TableDecriptionFunctionParameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
import static java.util.Objects.requireNonNull;
import static us.fatehi.utility.Utility.isBlank;
import schemacrawler.schema.Catalog;
import schemacrawler.tools.command.aichat.FunctionDefinition;
import schemacrawler.tools.command.aichat.FunctionExecutor;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.functions.FunctionDefinitionRegistry;
import schemacrawler.tools.command.aichat.tools.FunctionDefinition;
import schemacrawler.tools.command.aichat.tools.FunctionDefinitionRegistry;
import schemacrawler.tools.command.aichat.tools.FunctionExecutor;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;
import us.fatehi.utility.string.StringFormat;

public final class FunctionToolExecutor {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@
import schemacrawler.test.utility.TestUtility;
import schemacrawler.test.utility.TestWriter;
import schemacrawler.test.utility.WithTestDatabase;
import schemacrawler.tools.command.aichat.FunctionExecutor;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.functions.DatabaseObjectListFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.DatabaseObjectListFunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionExecutor;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;

@WithTestDatabase
@ResolveTestContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@
import schemacrawler.test.utility.TestContext;
import schemacrawler.test.utility.TestWriter;
import schemacrawler.test.utility.WithTestDatabase;
import schemacrawler.tools.command.aichat.FunctionExecutor;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.functions.ExitFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.NoParameters;
import schemacrawler.tools.command.aichat.tools.FunctionExecutor;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;

@WithTestDatabase
@ResolveTestContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@
import schemacrawler.test.utility.TestUtility;
import schemacrawler.test.utility.TestWriter;
import schemacrawler.test.utility.WithTestDatabase;
import schemacrawler.tools.command.aichat.FunctionExecutor;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.functions.DatabaseObjectListFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.DatabaseObjectListFunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionExecutor;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;

@WithTestDatabase
@ResolveTestContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
import schemacrawler.schema.Catalog;
import schemacrawler.test.utility.TestContext;
import schemacrawler.test.utility.TestWriter;
import schemacrawler.tools.command.aichat.FunctionDefinition;
import schemacrawler.tools.command.aichat.FunctionExecutor;
import schemacrawler.tools.command.aichat.FunctionParameters;
import schemacrawler.tools.command.aichat.FunctionReturn;
import schemacrawler.tools.command.aichat.tools.FunctionDefinition;
import schemacrawler.tools.command.aichat.tools.FunctionExecutor;
import schemacrawler.tools.command.aichat.tools.FunctionParameters;
import schemacrawler.tools.command.aichat.tools.FunctionReturn;

public class FunctionExecutionTestUtility {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import schemacrawler.tools.command.aichat.FunctionDefinition;
import schemacrawler.tools.command.aichat.functions.DatabaseObjectDescriptionFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.DatabaseObjectListFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.ExitFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.FunctionDefinitionRegistry;
import schemacrawler.tools.command.aichat.functions.LintFunctionDefinition;
import schemacrawler.tools.command.aichat.functions.TableDecriptionFunctionDefinition;
import schemacrawler.tools.command.aichat.tools.FunctionDefinition;
import schemacrawler.tools.command.aichat.tools.FunctionDefinitionRegistry;
import us.fatehi.utility.property.PropertyName;

public class FunctionDefinitionRegistryTest {
Expand Down
5 changes: 5 additions & 0 deletions schemacrawler-ai-distrib/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
<description>Distribution module for SchemaCrawler AI</description>

<dependencies>
<dependency>
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler-ai-tools</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler-ai-core</artifactId>
Expand Down
1 change: 1 addition & 0 deletions schemacrawler-ai-distrib/src/main/assembly/assembly.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<useTransitiveFiltering>false</useTransitiveFiltering>
<scope>runtime</scope>
<includes>
<include>us.fatehi:schemacrawler-ai-tools</include>
<include>us.fatehi:schemacrawler-ai-core</include>
<include>us.fatehi:schemacrawler-ai-langchain4j</include>
<include>us.fatehi:schemacrawler-ai-mcp</include>
Expand Down
5 changes: 5 additions & 0 deletions schemacrawler-ai-langchain4j/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler</artifactId>
</dependency>
<dependency>
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler-ai-tools</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>us.fatehi</groupId>
<artifactId>schemacrawler-scripting</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,29 +31,26 @@
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.model.chat.request.json.JsonEnumSchema;
import dev.langchain4j.model.chat.request.json.JsonObjectSchema;
import dev.langchain4j.model.chat.request.json.JsonSchemaElement;
import dev.langchain4j.model.chat.request.json.JsonStringSchema;
import dev.langchain4j.service.tool.ToolExecutor;
import schemacrawler.schema.Catalog;
import schemacrawler.tools.command.aichat.FunctionDefinition;
import schemacrawler.tools.command.aichat.FunctionDefinition.FunctionType;
import schemacrawler.tools.command.aichat.functions.FunctionDefinitionRegistry;
import schemacrawler.tools.command.aichat.tools.FunctionDefinition;
import schemacrawler.tools.command.aichat.tools.FunctionDefinitionRegistry;
import schemacrawler.tools.command.aichat.tools.FunctionDefinition.FunctionType;
import us.fatehi.utility.UtilityMarker;

import static schemacrawler.tools.command.aichat.tools.ToolUtility.extractParametersSchema;

@UtilityMarker
public class Langchain4JUtility {

Expand Down Expand Up @@ -89,8 +86,8 @@ public static List<ToolSpecification> tools() {

try {
final Class<?> parametersClass = functionDefinition.getParametersClass();
final Map<String, JsonNode> jsonSchema = jsonSchema(parametersClass);
final Map<String, JsonSchemaElement> properties = toProperties(jsonSchema);
final Map<String, JsonNode> parametersSchema = extractParametersSchema(parametersClass);
final Map<String, JsonSchemaElement> properties = toProperties(parametersSchema);
final JsonObjectSchema parameters =
JsonObjectSchema.builder().addProperties(properties).build();

Expand All @@ -110,25 +107,6 @@ public static List<ToolSpecification> tools() {
return toolSpecifications;
}

private static Map<String, JsonNode> jsonSchema(final Class<?> parametersClass) throws Exception {
final ObjectMapper mapper = new ObjectMapper();
final JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
final JsonSchema schema = schemaGen.generateSchema(parametersClass);
final JsonNode schemaNode = mapper.valueToTree(schema);
final JsonNode properties = schemaNode.get("properties");
final Set<Entry<String, JsonNode>> namedProperties;
if (properties == null) {
namedProperties = new HashSet<>();
} else {
namedProperties = properties.properties();
}
final Map<String, JsonNode> propertiesMap = new HashMap<>();
for (final Entry<String, JsonNode> entry : namedProperties) {
propertiesMap.put(entry.getKey(), entry.getValue());
}
return propertiesMap;
}

private static Map<String, JsonSchemaElement> toProperties(
final Map<String, JsonNode> mapJsonSchema) {
final Map<String, JsonSchemaElement> properties = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.service.tool.ToolExecutor;
import schemacrawler.schema.Catalog;
import schemacrawler.tools.command.aichat.functions.FunctionDefinitionRegistry;
import schemacrawler.tools.command.aichat.langchain4j.Langchain4JUtility;
import schemacrawler.tools.command.aichat.tools.FunctionDefinitionRegistry;

public class Langchain4JUtilityTest {

Expand Down Expand Up @@ -48,8 +48,8 @@ public void testToolExecutors() {
.filter(
fd ->
fd.getFunctionType()
== schemacrawler.tools.command.aichat.FunctionDefinition.FunctionType
.USER)
== schemacrawler.tools.command.aichat.tools.FunctionDefinition
.FunctionType.USER)
.count();

assertThat(toolExecutors.size(), is(userFunctionCount));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,18 @@
@Service
public class CommonService {

@Tool(name = "get-schemacrawler-version", description = "Gets the version of SchemaCrawler", returnDirect = true)
@Tool(
name = "get-schemacrawler-version",
description = "Gets the version of SchemaCrawler",
returnDirect = true)
public String getSchemaCrawlerVersion(
@ToolParam(
description =
"""
@ToolParam(
description =
"""
Current date, as an ISO 8601 local date.
""",
required = false) final String date) {
required = false)
final String date) {
System.out.printf("get-schemacrawler-version called with %s", date);
return Version.about();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,13 @@ public static void main(final String[] args) {
public ToolCallbackProvider schemaCrawlerTools() {
final List<ToolCallback> tools = SpringAIUtility.toolCallbacks(SpringAIUtility.tools());
final ToolCallbackProvider toolCallbackProvider = ToolCallbackProvider.from(tools);
printTools(toolCallbackProvider);
return toolCallbackProvider;
}

@Bean
public ToolCallbackProvider weatherTools(final CommonService weatherService) {
final MethodToolCallbackProvider toolCallbackProvider =
MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
printTools(toolCallbackProvider);
MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
return toolCallbackProvider;
}

private void printTools(final ToolCallbackProvider toolCallbackProvider) {
List.of(toolCallbackProvider.getToolCallbacks())
.forEach(
toolCallback -> {
System.out.println(toolCallback.getToolDefinition().name());
System.out.println(toolCallback.getToolDefinition().description());
System.out.println(toolCallback.getToolDefinition().inputSchema());
System.out.println("----------------------------------------");
});
}
}
Loading