Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
1be7a2d
feat: update TestCreatorAgent and add TestCaseQuery for fetching test…
patwlan Jan 17, 2026
53a023a
feat: refactor package structure and implement InMemoryAdlStorage for…
patwlan Jan 17, 2026
93dce5a
feat: refactor SimpleMessage import and update AdlStorageMutation to …
patwlan Jan 17, 2026
6901c3d
feat: enhance ADL storage with delete functionality and add search by…
patwlan Jan 21, 2026
dee208e
feat: add storeUtterances method to UseCaseEmbeddingsStore for embedd…
patwlan Jan 21, 2026
9a80d4d
feat: add UseCaseImprovementMutation for analyzing and suggesting imp…
patwlan Jan 22, 2026
15e60e8
feat: add Dockerfile for building and running native image of adl-server
patwlan Jan 23, 2026
f2942d3
feat: enhance test case management with CRUD operations and execution…
patwlan Jan 26, 2026
e29bbef
feat: add AdlExampleMutation for generating examples of ADL use cases
patwlan Jan 26, 2026
7366663
feat: add logging for assistant requests and update assistant documen…
patwlan Jan 26, 2026
1f99b7d
feat: add conversation ID generation to test execution for improved t…
patwlan Jan 26, 2026
c569071
feat: improve similarity scoring in ConversationEvaluator and refine …
patwlan Jan 26, 2026
d2c5ac9
feat: improve similarity scoring in ConversationEvaluator and refine …
patwlan Jan 26, 2026
1b5a71e
feat: improve similarity scoring in ConversationEvaluator and refine …
patwlan Jan 26, 2026
5bb6f08
feat: add metadata support to tools and implement related tests
patwlan Jan 28, 2026
7f86118
feat: add metadata support to tools and implement related tests
patwlan Jan 28, 2026
6b041c6
feat: add metadata support to tools and implement related tests
patwlan Jan 28, 2026
65463d1
feat: implement MCP service with mutation and query support
patwlan Jan 30, 2026
11515ec
feat: enhance ADL server with improved MCP service integration and ne…
patwlan Feb 1, 2026
0da8791
feat: extend assistant agent with use case embeddings and improve sea…
patwlan Feb 1, 2026
ca22d0b
feat: enhance ADL server with improved use case handling and new gree…
patwlan Feb 1, 2026
2e767be
feat: add spelling correction mutation and agent for improved text ha…
patwlan Feb 1, 2026
41f08d5
feat: enhance spelling correction functionality and update use case d…
patwlan Feb 1, 2026
c9cb811
feat: enhance spelling correction functionality and update use case d…
patwlan Feb 1, 2026
d68ce89
feat: enhance spelling correction functionality and update use case d…
patwlan Feb 6, 2026
65e7cff
feat: update product page layout and enhance use case documentation
patwlan Feb 6, 2026
4f9fda5
feat: implement user settings mutation and query for managing API key…
patwlan Feb 7, 2026
fa525ef
feat: update product page content and improve layout for better user …
patwlan Feb 7, 2026
6471f59
feat: add widget management functionality with create and delete oper…
patwlan Feb 10, 2026
c597da3
feat: implement widget retrieval by name and enhance output handling …
patwlan Feb 12, 2026
c234805
feat: add role prompt management with query and mutation for retrieva…
patwlan Feb 13, 2026
85ef142
feat: add role prompt management with query and mutation for retrieva…
patwlan Feb 15, 2026
046e781
feat: implement solution compliance filter to validate output against…
patwlan Feb 15, 2026
0be7f57
feat: add UseCaseIdValidator to ensure messages contain a valid use c…
patwlan Feb 15, 2026
14f7454
feat: add chat completer provider to agents for enhanced conversation…
patwlan Feb 21, 2026
e19a470
feat: implement statistics tracking for response times and use case c…
patwlan Feb 21, 2026
41e3b43
feat: enhance statistics tracking by recording compliance scores and …
patwlan Feb 21, 2026
866d82a
feat: enhance statistics tracking by recording compliance scores and …
patwlan Feb 23, 2026
a8e570a
feat: enhance statistics tracking by recording compliance scores and …
patwlan Feb 24, 2026
62c86d9
chore: moved adl projects to adl git project
patwlan Feb 27, 2026
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
156 changes: 0 additions & 156 deletions LICENSES/CC-BY-4.0.txt

This file was deleted.

12 changes: 12 additions & 0 deletions REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ path = [
"**/chat/main.dart.mjs",
"**/chat/index.html",
"**/chat/*.json",
"**/static/**/*.json",
"**/static/**/*.html",
"**/static/**/*.txt",
"**/static/**/*.css",
"**/static/**/*.js",
"**/static/**/*.ico",
"**/static/*.json",
"**/static/*.html",
"**/static/*.txt",
"**/static/*.css",
"**/static/*.js",
"**/static/*.ico",
]
precedence = "override"
SPDX-FileCopyrightText = "2025 Deutsche Telekom AG and others"
Expand Down
12 changes: 11 additions & 1 deletion adl-server/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,19 @@ SPDX-License-Identifier: CC-BY-4.0
# ADL Server

The **ADL Server** is a Ktor-based microservice that provides a GraphQL API for compiling and formatting ADL (Assistant Description Language) code. It is designed to be used as part of the ARC AI framework, enabling dynamic parsing and transformation of use case definitions written in ADL.
The architecture of this module follows the SOLID principles to ensure maintainability, scalability, and testability.


## Coding Guidelines
- Every file MUST contain the SPDX license identifier at the top.
- Clean Code principles should be followed.
- Each class MUST contain a KDoc comment explaining its purpose.
- Each class MUST have unit tests covering at least 80% of its functionality.
- Each class MUST have unit tests covering at least 80% of its functionality.

### SOLID Principles

* **Single Responsibility Principle (SRP)**: Each class should have a single responsibility. For example, `TestExecutor` is responsible solely for executing tests, while `ConversationEvaluator` focuses on evaluating conversation outcomes.
* **Open/Closed Principle (OCP)**: Classes should be open for extension but closed for modification. strategies and listeners can be used to extend behavior without altering core logic.
* **Liskov Substitution Principle (LSP)**: Subtypes must be substitutable for their base types.
* **Interface Segregation Principle (ISP)**: Clients should not be forced to depend on interfaces they do not use. Keep interfaces small and focused.
* **Dependency Inversion Principle (DIP)**: Depend on abstractions, not concretions. Use dependency injection to provide dependencies.
17 changes: 17 additions & 0 deletions adl-server/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# SPDX-FileCopyrightText: 2025 Deutsche Telekom AG and others
#
# SPDX-License-Identifier: Apache-2.0

FROM gradle:8-jdk24-corretto AS build
WORKDIR /home/gradle/project
COPY --chown=gradle:gradle . .
# Ensure gradlew is executable
RUN chmod +x gradlew
# Skip tests to speed up the build
RUN ./gradlew :adl-server:installDist --no-daemon -x test

FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY --from=build /home/gradle/project/adl-server/build/install/adl-server/ /app/
EXPOSE 8080
ENTRYPOINT ["/app/bin/adl-server"]
35 changes: 35 additions & 0 deletions adl-server/GraalVMDockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# SPDX-FileCopyrightText: 2025 Deutsche Telekom AG and others
#
# SPDX-License-Identifier: Apache-2.0

# Stage 1: Build the native image
FROM ghcr.io/graalvm/native-image-community:21 AS build

WORKDIR /app

# Copy the entire repository to ensure all dependent modules are available
COPY . .

# Ensure gradlew is executable
RUN chmod +x gradlew

RUN ./gradlew :adl-server:clean

# Build the native image using Gradle
# -x test skips tests
# --info provides more detailed logs to diagnose the error
# -Dorg.gradle.jvmargs sets memory limits for the Gradle daemon to prevent it from consuming all RAM before Native Image runs
RUN ./gradlew :adl-server:nativeCompile -x test --info -Dorg.gradle.jvmargs="-Xmx2g"

# Stage 2: Create the runtime image
FROM gcr.io/distroless/base-debian12

WORKDIR /app

# Copy the native binary from the build stage
COPY --from=build /app/adl-server/build/native/nativeCompile/adl-server /app/server

EXPOSE 8080

# Set the entrypoint to the native binary
ENTRYPOINT ["/app/server"]
29 changes: 29 additions & 0 deletions adl-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,35 @@ The server can be configured using the following environment variables:

By default, the server listens on port `8080`. You can override the port by setting the environment variable `ADL_SERVER_PORT`.

### Docker

You can also run the server using Docker.

#### Build the Docker Image

Run the following command from the root of the repository:

```sh
docker build -f adl-server/Dockerfile -t adl-server .
```

#### Run via GitHub Container Registry

To pull and run the latest image from the GitHub Container Registry:

1. **Login to GitHub Container Registry** (if required):
Follow the instructions here: [Working with the Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry)

2. **Run the container**:

```bash
docker run -p 8080:8080 \
-e ARC_AI_KEY=[OPENAI_API_KEY] \
-e ARC_MODEL=gpt-4o \
-e ARC_CLIENT=openai \
ghcr.io/eclipse-lmos/adl-server:latest
```

### GraphQL Endpoint

The main endpoint is available at:
Expand Down
96 changes: 95 additions & 1 deletion adl-server/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,105 @@
plugins {
alias(libs.plugins.ktor)
id("sh.ondr.koja") version "0.4.6"
id("org.graalvm.buildtools.native") version "0.11.3"
}

application {
mainClass = "org.eclipse.lmos.adl.server.AdlServerKt"
}

tasks.shadowJar {
isZip64 = true
}

graalvmNative {
binaries {
named("main") {
fallback.set(false)
verbose.set(true)

buildArgs.add("--initialize-at-build-time=ch.qos.logback")
buildArgs.add("--initialize-at-build-time=io.ktor,kotlin")
buildArgs.add("--initialize-at-build-time=org.slf4j.LoggerFactory")

buildArgs.add("--initialize-at-build-time=org.slf4j.helpers.Reporter")
buildArgs.add("--initialize-at-build-time=kotlinx.io.bytestring.ByteString")
buildArgs.add("--initialize-at-build-time=kotlinx.io.SegmentPool")

buildArgs.add("--initialize-at-build-time=kotlinx.serialization.json.Json")
buildArgs.add("--initialize-at-build-time=kotlinx.serialization.json.JsonImpl")
buildArgs.add("--initialize-at-build-time=kotlinx.serialization.json.ClassDiscriminatorMode")
buildArgs.add("--initialize-at-build-time=kotlinx.serialization.modules.SerializersModuleKt")

buildArgs.add("--initialize-at-build-time=io.grpc.netty.shaded.io.netty")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl.BouncyCastleAlpnSslUtils")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.PooledByteBuf")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.UnpooledHeapByteBuf")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.ByteBuf")
buildArgs.add("--initialize-at-build-time=org.bouncycastle")
buildArgs.add("--initialize-at-build-time=kotlinx.io.files.PathsJvmKt")
buildArgs.add("--initialize-at-build-time=kotlinx.io.files.FileSystemJvmKt")

buildArgs.add("-H:+InstallExitHandlers")
buildArgs.add("-H:+ReportUnsupportedElementsAtRuntime")
buildArgs.add("-H:+ReportExceptionStackTraces")

imageName.set("graalvm-server")
}

named("test"){
fallback.set(false)
verbose.set(true)

buildArgs.add("--initialize-at-build-time=ch.qos.logback")
buildArgs.add("--initialize-at-build-time=io.ktor,kotlin")
buildArgs.add("--initialize-at-build-time=org.slf4j.LoggerFactory")

buildArgs.add("--initialize-at-build-time=org.slf4j.helpers.Reporter")
buildArgs.add("--initialize-at-build-time=kotlinx.io.bytestring.ByteString")
buildArgs.add("--initialize-at-build-time=kotlinx.io.SegmentPool")

buildArgs.add("--initialize-at-build-time=kotlinx.serialization.json.Json")
buildArgs.add("--initialize-at-build-time=kotlinx.serialization.json.JsonImpl")
buildArgs.add("--initialize-at-build-time=kotlinx.serialization.json.ClassDiscriminatorMode")
buildArgs.add("--initialize-at-build-time=kotlinx.serialization.modules.SerializersModuleKt")

buildArgs.add("--initialize-at-build-time=io.grpc.netty.shaded.io.netty")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl.BouncyCastleAlpnSslUtils")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.PooledByteBuf")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.UnpooledHeapByteBuf")
buildArgs.add("--initialize-at-run-time=io.grpc.netty.shaded.io.netty.buffer.ByteBuf")
buildArgs.add("--initialize-at-build-time=org.bouncycastle")
buildArgs.add("--initialize-at-build-time=kotlinx.io.files.PathsJvmKt")
buildArgs.add("--initialize-at-build-time=kotlinx.io.files.FileSystemJvmKt")

buildArgs.add("-H:+InstallExitHandlers")
buildArgs.add("-H:+ReportUnsupportedElementsAtRuntime")
buildArgs.add("-H:+ReportExceptionStackTraces")

val path = "${projectDir}/src/test/resources/META-INF/native-image/"
buildArgs.add("-H:ReflectionConfigurationFiles=${path}reflect-config.json")
buildArgs.add("-H:ResourceConfigurationFiles=${path}resource-config.json")

imageName.set("adl-server-test")
}
}
}

dependencies {
implementation(project(":arc-assistants"))
implementation(project(":arc-api"))
implementation(project(":adl-kotlin-runner"))
implementation(project(":arc-mcp"))

implementation(libs.ktor.server.core)
implementation(libs.ktor.server.cio)
implementation(libs.ktor.server.websockets)
implementation(libs.ktor.server.static)
implementation(libs.ktor.server.cors)
implementation(libs.ktor.server.sse)
implementation(libs.graphql.kotlin.ktor)
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.10.2")

Expand All @@ -30,6 +114,9 @@ dependencies {
implementation(project(":arc-azure-client"))
// implementation("dev.langchain4j:langchain4j-ollama:1.8.0")

// Mutsache
implementation("com.github.spullara.mustache.java:compiler:0.9.14")

// Qdrant
implementation("io.qdrant:client:1.15.0")
implementation("com.google.guava:guava:33.5.0-jre")
Expand All @@ -38,7 +125,8 @@ dependencies {
// Embeddings
implementation("dev.langchain4j:langchain4j:1.9.1")
implementation("dev.langchain4j:langchain4j-embeddings:1.9.1-beta17")
implementation("dev.langchain4j:langchain4j-embeddings-all-minilm-l6-v2:1.9.1-beta17")
// implementation("dev.langchain4j:langchain4j-embeddings-all-minilm-l6-v2:1.11.0-beta19")
implementation("dev.langchain4j:langchain4j-embeddings-bge-small-en-v15-q:1.11.0-beta19")

// OpenTelemetry dependencies
implementation(platform("io.opentelemetry:opentelemetry-bom:1.55.0"))
Expand All @@ -50,6 +138,12 @@ dependencies {
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")

// Bouncy Castle
implementation("org.bouncycastle:bctls-jdk18on:1.78.1")
implementation("org.bouncycastle:bcpkix-jdk18on:1.78.1")
implementation("org.bouncycastle:bcprov-jdk18on:1.78.1")
implementation("io.ktor:ktor-server-sse:3.3.3")

// Test dependencies
testImplementation(libs.ktor.client.core)
testImplementation(libs.ktor.client.cio.jvm)
Expand Down
Loading