eerste check in
This commit is contained in:
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
.kotlin
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/jarRepositories.xml
|
||||||
|
.idea/compiler.xml
|
||||||
|
.idea/libraries/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
|
/.idea/
|
||||||
100
pom.xml
Normal file
100
pom.xml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>nl.trivion</groupId>
|
||||||
|
<artifactId>SoftwareFabric</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<kotlin.code.style>official</kotlin.code.style>
|
||||||
|
<kotlin.compiler.jvmTarget>21</kotlin.compiler.jvmTarget>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>mavenCentral</id>
|
||||||
|
<url>https://repo1.maven.org/maven2/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<sourceDirectory>src/main/kotlin</sourceDirectory>
|
||||||
|
<testSourceDirectory>src/test/kotlin</testSourceDirectory>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-maven-plugin</artifactId>
|
||||||
|
<version>2.2.10</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>compile</id>
|
||||||
|
<phase>compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>test-compile</id>
|
||||||
|
<phase>test-compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>test-compile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.22.2</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
|
<version>2.22.2</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>1.6.0</version>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>MainKt</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-test-junit5</artifactId>
|
||||||
|
<version>2.2.10</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter</artifactId>
|
||||||
|
<version>5.10.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-stdlib</artifactId>
|
||||||
|
<version>2.2.10</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>ai.koog</groupId>
|
||||||
|
<artifactId>koog-agents-jvm</artifactId>
|
||||||
|
<version>0.4.2</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jgit</groupId>
|
||||||
|
<artifactId>org.eclipse.jgit</artifactId>
|
||||||
|
<version>7.3.0.202506031305-r</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
142
src/main/kotlin/nl/trivion/softwarefabric/Main.kt
Normal file
142
src/main/kotlin/nl/trivion/softwarefabric/Main.kt
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
package org.example.nl.trivion.softwarefabric
|
||||||
|
|
||||||
|
import ai.koog.agents.core.agent.AIAgent
|
||||||
|
import ai.koog.agents.core.agent.config.AIAgentConfig
|
||||||
|
import ai.koog.agents.core.dsl.builder.forwardTo
|
||||||
|
import ai.koog.agents.core.dsl.builder.strategy
|
||||||
|
import ai.koog.agents.core.dsl.extension.nodeExecuteTool
|
||||||
|
import ai.koog.agents.core.dsl.extension.nodeLLMRequest
|
||||||
|
import ai.koog.agents.core.dsl.extension.nodeLLMSendToolResult
|
||||||
|
import ai.koog.agents.core.dsl.extension.onAssistantMessage
|
||||||
|
import ai.koog.agents.core.dsl.extension.onToolCall
|
||||||
|
import ai.koog.agents.core.feature.handler.AgentFinishedContext
|
||||||
|
import ai.koog.agents.core.feature.handler.AgentStartContext
|
||||||
|
import ai.koog.agents.core.tools.ToolRegistry
|
||||||
|
import ai.koog.agents.core.tools.annotations.LLMDescription
|
||||||
|
import ai.koog.agents.core.tools.annotations.Tool
|
||||||
|
import ai.koog.agents.core.tools.reflect.ToolSet
|
||||||
|
import ai.koog.agents.core.tools.reflect.asTools
|
||||||
|
import ai.koog.agents.features.eventHandler.feature.EventHandler
|
||||||
|
import ai.koog.prompt.dsl.Prompt
|
||||||
|
import ai.koog.prompt.executor.llms.all.simpleOllamaAIExecutor
|
||||||
|
import ai.koog.prompt.llm.LLMCapability
|
||||||
|
import ai.koog.prompt.llm.LLMProvider
|
||||||
|
import ai.koog.prompt.llm.LLModel
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
|
||||||
|
// Use the OpenAI executor with an API key from an environment variable
|
||||||
|
val promptExecutor = simpleOllamaAIExecutor("http://localhost:11434")
|
||||||
|
|
||||||
|
val customModel: LLModel = LLModel(
|
||||||
|
provider = LLMProvider.Ollama,
|
||||||
|
id = "gpt-oss:20b",
|
||||||
|
capabilities = listOf(
|
||||||
|
LLMCapability.Temperature,
|
||||||
|
LLMCapability.Tools
|
||||||
|
),
|
||||||
|
contextLength = 2048
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create a simple strategy
|
||||||
|
val agentStrategy = strategy("Simple calculator") {
|
||||||
|
// Define nodes for the strategy
|
||||||
|
val nodeSendInput by nodeLLMRequest()
|
||||||
|
val nodeExecuteTool by nodeExecuteTool()
|
||||||
|
val nodeSendToolResult by nodeLLMSendToolResult()
|
||||||
|
|
||||||
|
// Define edges between nodes
|
||||||
|
// Start -> Send input
|
||||||
|
edge(nodeStart forwardTo nodeSendInput)
|
||||||
|
|
||||||
|
// Send input -> Finish
|
||||||
|
edge(
|
||||||
|
(nodeSendInput forwardTo nodeFinish)
|
||||||
|
transformed { it }
|
||||||
|
onAssistantMessage { true }
|
||||||
|
)
|
||||||
|
|
||||||
|
// Send input -> Execute tool
|
||||||
|
edge(
|
||||||
|
(nodeSendInput forwardTo nodeExecuteTool)
|
||||||
|
onToolCall { true }
|
||||||
|
)
|
||||||
|
|
||||||
|
// Execute tool -> Send the tool result
|
||||||
|
edge(nodeExecuteTool forwardTo nodeSendToolResult)
|
||||||
|
|
||||||
|
// Send the tool result -> finish
|
||||||
|
edge(
|
||||||
|
(nodeSendToolResult forwardTo nodeFinish)
|
||||||
|
transformed { it }
|
||||||
|
onAssistantMessage { true }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure the agent
|
||||||
|
val agentConfig = AIAgentConfig(
|
||||||
|
prompt = Prompt.build("simple-calculator") {
|
||||||
|
system(
|
||||||
|
"""
|
||||||
|
You are a simple calculator assistant.
|
||||||
|
You can add two numbers together using the calculator tool.
|
||||||
|
When the user provides input, extract the numbers they want to add.
|
||||||
|
The input might be in various formats like "add 5 and 7", "5 + 7", or just "5 7".
|
||||||
|
Extract the two numbers and use the calculator tool to add them.
|
||||||
|
Always respond with a clear, friendly message showing the calculation and result.
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
},
|
||||||
|
model = customModel,
|
||||||
|
maxAgentIterations = 10
|
||||||
|
)
|
||||||
|
|
||||||
|
// Implement a simple calculator tool that can add two numbers
|
||||||
|
@LLMDescription("Tools for performing basic arithmetic operations")
|
||||||
|
class CalculatorTools : ToolSet {
|
||||||
|
@Tool
|
||||||
|
@LLMDescription("Add two numbers together and return their sum")
|
||||||
|
fun add(
|
||||||
|
@LLMDescription("First number to add (integer value)")
|
||||||
|
num1: Int,
|
||||||
|
|
||||||
|
@LLMDescription("Second number to add (integer value)")
|
||||||
|
num2: Int
|
||||||
|
): String {
|
||||||
|
val sum = num1 + num2
|
||||||
|
return "The sum of $num1 and $num2 is: $sum"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the tool to the tool registry
|
||||||
|
val toolRegistry = ToolRegistry {
|
||||||
|
tools(CalculatorTools().asTools())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the agent
|
||||||
|
val agent = AIAgent(
|
||||||
|
promptExecutor = promptExecutor,
|
||||||
|
toolRegistry = toolRegistry,
|
||||||
|
strategy = agentStrategy,
|
||||||
|
agentConfig = agentConfig,
|
||||||
|
installFeatures = {
|
||||||
|
install(EventHandler) {
|
||||||
|
onBeforeAgentStarted { eventContext: AgentStartContext<*> ->
|
||||||
|
println("Starting strategy: ${eventContext.strategy.name}")
|
||||||
|
}
|
||||||
|
onAgentFinished { eventContext: AgentFinishedContext ->
|
||||||
|
println("Result: ${eventContext.result}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
runBlocking {
|
||||||
|
println("Enter two numbers to add (e.g., 'add 5 and 7' or '5 + 7'):")
|
||||||
|
|
||||||
|
// Read the user input and send it to the agent
|
||||||
|
val userInput = readlnOrNull() ?: ""
|
||||||
|
val agentResult = agent.run(userInput)
|
||||||
|
println("The agent returned: $agentResult")
|
||||||
|
}
|
||||||
|
}
|
||||||
47
src/main/kotlin/nl/trivion/softwarefabric/tools/GitTools.kt
Normal file
47
src/main/kotlin/nl/trivion/softwarefabric/tools/GitTools.kt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package org.example.nl.trivion.softwarefabric.tools
|
||||||
|
|
||||||
|
import ai.koog.agents.core.tools.annotations.LLMDescription
|
||||||
|
import ai.koog.agents.core.tools.annotations.Tool
|
||||||
|
import ai.koog.agents.core.tools.reflect.ToolSet
|
||||||
|
import org.eclipse.jgit.api.Git
|
||||||
|
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
val username: String? = System.getenv("GIT_USERNAME")
|
||||||
|
val password: String? = System.getenv("GIT_PASSWORD")
|
||||||
|
|
||||||
|
// Implement a simple calculator tool that can add two numbers
|
||||||
|
@LLMDescription("Tools for performing basic git operations")
|
||||||
|
class GitTools : ToolSet {
|
||||||
|
|
||||||
|
@Tool
|
||||||
|
@LLMDescription("Clone een git repository")
|
||||||
|
fun cloneRepository(
|
||||||
|
@LLMDescription("The remote url from the git repository")
|
||||||
|
remoteUrl: String,
|
||||||
|
@LLMDescription("The local path to clone the repository to")
|
||||||
|
localPath: File) {
|
||||||
|
|
||||||
|
Git.cloneRepository()
|
||||||
|
.setURI(remoteUrl)
|
||||||
|
.setDirectory(localPath)
|
||||||
|
.call()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Tool
|
||||||
|
@LLMDescription("Pull a git repository")
|
||||||
|
fun pull(
|
||||||
|
@LLMDescription("The local path from the local git repository")
|
||||||
|
localPath: String,
|
||||||
|
@LLMDescription("The branch to pull")
|
||||||
|
branch: String) {
|
||||||
|
|
||||||
|
Git.open(File(localPath)).use { git ->
|
||||||
|
git.pull()
|
||||||
|
.setRemote("origin")
|
||||||
|
.setRemoteBranchName(branch)
|
||||||
|
.setCredentialsProvider(UsernamePasswordCredentialsProvider(username, password))
|
||||||
|
.call()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user