diff --git a/API/build.gradle b/API/build.gradle
index ff45d90..2dd2d34 100644
--- a/API/build.gradle
+++ b/API/build.gradle
@@ -1,7 +1,7 @@
plugins {
id 'java'
- id 'org.springframework.boot' version '3.2.2'
+ id 'org.springframework.boot' version '4.1.0-M4'
id 'io.spring.dependency-management' version '1.1.4'
}
@@ -12,11 +12,11 @@ dependencies {
implementation project(":Core")
- implementation 'org.springframework.boot:spring-boot-starter-web'
- implementation 'org.springframework.boot:spring-boot-starter-webflux'
+ implementation 'org.springframework.boot:spring-boot-starter-web:4.1.0-M4'
+ implementation 'org.springframework.boot:spring-boot-starter-webflux:4.1.0-M4'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.0-M1'
//implementation 'org.springframework.boot:spring-boot-starter-actuator'
- testImplementation 'org.springframework.boot:spring-boot-starter-test'
+ testImplementation 'org.springframework.boot:spring-boot-starter-test:4.1.0-M4'
//runtimeOnly('org.springframework.boot:spring-boot-starter-web')
}
diff --git a/API/src/main/java/me/zacharias/chat/api/APITool.java b/API/src/main/java/me/zacharias/chat/api/APITool.java
index b7227c6..2417f4b 100644
--- a/API/src/main/java/me/zacharias/chat/api/APITool.java
+++ b/API/src/main/java/me/zacharias/chat/api/APITool.java
@@ -65,7 +65,7 @@ public class APITool extends OllamaFunctionTool {
@Override
public OllamaToolRespnce function(OllamaFunctionArgument... args) {
- UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(requestUrl);
+ UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(requestUrl);
for (OllamaFunctionArgument arg : args) {
builder.queryParam(arg.argument(), arg.value());
}
diff --git a/API/src/main/java/me/zacharias/chat/api/controllers/Tool.java b/API/src/main/java/me/zacharias/chat/api/controllers/Tool.java
index 6a2a1a9..d025833 100644
--- a/API/src/main/java/me/zacharias/chat/api/controllers/Tool.java
+++ b/API/src/main/java/me/zacharias/chat/api/controllers/Tool.java
@@ -34,7 +34,7 @@ public class Tool {
}
return ResponseEntity.ok(new NewToolResponse(request.getName(), request.getDescription(), arguments));
} else {
- return new ResponseEntity<>("Tool already exists", null, 400);
+ return ResponseEntity.status(400).body("Tool already exists");
}
}
}
diff --git a/Core/src/main/java/me/zacharias/chat/core/Core.java b/Core/src/main/java/me/zacharias/chat/core/Core.java
index 60f4d1d..7bce34c 100644
--- a/Core/src/main/java/me/zacharias/chat/core/Core.java
+++ b/Core/src/main/java/me/zacharias/chat/core/Core.java
@@ -7,6 +7,7 @@ import me.zacharias.chat.plugin.Plugin;
import me.zacharias.chat.plugin.PluginLoader;
import me.zacharias.chat.plugin.exceptions.PluginLoadingException;
import org.intellij.lang.annotations.MagicConstant;
+import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -54,7 +55,7 @@ public class Core {
/**
* The IP of the Ollama API.
*/
- private String ollamaIP = "10.0.1.101";//"192.168.5.184";
+ private String ollamaIP;
/**
* The port of the Ollama API.
*/
@@ -118,7 +119,12 @@ public class Core {
}
}
- {
+ /**
+ * This function is pending a better name, as this was introduced from being a generic block. This was ugly, and ideally things here should be refactored more.
+ *
+ * TODO: Fix a better name and refactor this method.
+ */
+ private void constructCore(){
File dir = new File("./logs/");
if (!dir.exists()) {
dir.mkdir();
@@ -139,6 +145,7 @@ public class Core {
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
+
try {
if (logFile.exists()) {
BufferedReader br = new BufferedReader(new FileReader(logFile));
@@ -221,9 +228,28 @@ public class Core {
* Creates a new instance of Core with the provided PrintMessageHandler
* @param printMessageHandler The PrintMessageHandler to use as the default Output
*/
- public Core(PrintMessageHandler printMessageHandler) {
+ public Core(@NotNull PrintMessageHandler printMessageHandler) {
this.printMessageHandler = printMessageHandler;
supportColor = printMessageHandler.color();
+ ollamaIP = "localhost";
+
+ // TODO: This is a dirty way to not have a masisive init block, please check this methods comment.
+ constructCore();
+ }
+
+ /**
+ * Creates a new instance of Core with the provided PrintMessageHandler, with a specific IP used for Ollama
+ * @param printMessageHandler The PrintMessageHandler to use as the default Output
+ * @param ollamaIP The IP used for the Ollama backend
+ */
+ public Core(@NotNull PrintMessageHandler printMessageHandler, @NotNull String ollamaIP)
+ {
+ this.printMessageHandler = printMessageHandler;
+ supportColor = printMessageHandler.color();
+ this.ollamaIP = ollamaIP;
+
+ // TODO: This is a dirty way to not have a masisive init block, please check this methods comment.
+ constructCore();
}
/**
diff --git a/Display/src/main/java/me/zacharias/chat/display/Display.java b/Display/src/main/java/me/zacharias/chat/display/Display.java
index 19eb9e3..a153c56 100644
--- a/Display/src/main/java/me/zacharias/chat/display/Display.java
+++ b/Display/src/main/java/me/zacharias/chat/display/Display.java
@@ -14,6 +14,8 @@ import me.zacharias.neuro.dock.wikipedia.WikipediaTool;
import org.json.JSONObject;
import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.*;
import static me.zacharias.chat.core.Core.writeLog;
@@ -48,9 +50,7 @@ public class Display {
{
core.setOllamaObject/*NoMemory*/(OllamaObject.builder()
- //.setModel("llama3.2")
- //.setModel("gemma3:12b")
- .setModel("qwen3:8b")
+ .setModel("llama3.2")
.keep_alive(10)
//.stream(false)
//.addFileTools(FileHandlerLocation.DATA_FILES)
@@ -61,10 +61,11 @@ public class Display {
core.addTool(new TimeTool(), Core.Source.INTERNAL);
// TODO: Well Docker failes when luanched.... Fuck
- //core.addTool(new PythonRunner(core), Core.Source.INTERNAL);
- core.addTools(new MALAPITool().getOllamaTools());
- core.addTools(new GeniusTools().getGeniusTools());
- core.addTools(new WikipediaTool().getWikipediaToolsInstance());
+ PythonRunner pythonRunner = new PythonRunner(core);
+ core.addTool(pythonRunner, Core.Source.INTERNAL);
+ //core.addTools(new MALAPITool().getOllamaTools());
+ //core.addTools(new GeniusTools().getGeniusTools());
+ //core.addTools(new WikipediaTool().getWikipediaToolsInstance());
APIApplication.start();
diff --git a/Display/src/main/java/me/zacharias/chat/display/PythonRunner.java b/Display/src/main/java/me/zacharias/chat/display/PythonRunner.java
index a014539..9246cd4 100644
--- a/Display/src/main/java/me/zacharias/chat/display/PythonRunner.java
+++ b/Display/src/main/java/me/zacharias/chat/display/PythonRunner.java
@@ -59,6 +59,8 @@ public class PythonRunner extends OllamaFunctionTool {
public PythonRunner(Core core) {
this.core = core;
+ generateExternalTools();
+
try {
serverSocket = new ServerSocket(6050);
Thread thread = new Thread(() -> {
@@ -350,27 +352,22 @@ public class PythonRunner extends OllamaFunctionTool {
* Generates the external_tools.py file.
* This is meant to provide the python code with all ExternalTools defined in the OllamaObject.
* @return The generated external_tools.py file
+ * @throws IllegalStateException This is thrown when the external_tool_base.py can not be read, this should be handled by disabling the python runner.
*/
- private String generateExternalTools() {
+ private String generateExternalTools() throws IllegalStateException{
StringBuilder code = new StringBuilder();
- code.append("""
- import socket
- import json
-
- HOST = "host.docker.internal"
- PORT = 6050
-
- def connect(data):
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
- s.connect((HOST, PORT))
- data = data + "\\n"
- s.sendall(data.encode("utf-8"))
- responce = s.recv(4096)
- return responce.decode("utf-8")
-
-
- """);
+ try (InputStream in = getClass().getResourceAsStream("/external_tool_base.py");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
+ String tmp = null;
+ while((tmp = reader.readLine()) != null)
+ {
+ code.append(tmp).append('\n');
+ }
+ }catch (Exception ex)
+ {
+ throw new IllegalStateException("Can not read the base external tools file, this is a fetal error for the python runner!");
+ }
for(Pair funtionTool : core.getFuntionTools())
{
diff --git a/Display/src/main/resources/external_tool_base.py b/Display/src/main/resources/external_tool_base.py
new file mode 100644
index 0000000..20d25d4
--- /dev/null
+++ b/Display/src/main/resources/external_tool_base.py
@@ -0,0 +1,24 @@
+import socket
+import json
+import builtins
+
+HOST = "host.docker.internal"
+PORT = 6050
+
+def connect(data):
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
+ s.connect((HOST, PORT))
+ data = data + "\n"
+ s.sendall(data.encode("utf-8"))
+ responce = s.recv(4096)
+ return responce.decode("utf-8")
+
+def print_output(text):
+ data = {"function": "print_output", "arguments": [{"name": "text", "value": text}]}
+ connect(json.dumps(data))
+
+def _neurodock_print(*args, **kwargs):
+ text = " ".join(str(a) for a in args)
+ print_output(text)
+
+builtins.print = _neurodock_print
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 4854ea6..0e6b07e 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Thu Feb 20 00:10:50 CET 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/launcher/build.gradle b/launcher/build.gradle
index 6369ecf..4d73288 100644
--- a/launcher/build.gradle
+++ b/launcher/build.gradle
@@ -1,8 +1,5 @@
plugins {
id 'java'
-
- id 'org.springframework.boot' version '3.2.2'
- id 'io.spring.dependency-management' version '1.1.4'
}
group = 'me.zacharias'
@@ -12,16 +9,6 @@ dependencies {
implementation project(":Display")
implementation project(":API")
implementation project(":Core")
-
- afterEvaluate {
- boolean hasAPIDependency = configurations.implementation.dependencies.any { it.name.contains('API') }
-
- if (hasAPIDependency) {
- dependencies.add("implementation", 'org.springframework.boot:spring-boot-starter-web')
- dependencies.add("implementation", 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0')
- dependencies.add("testImplementation", 'org.springframework.boot:spring-boot-starter-test')
- }
- }
}
jar{