diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 3d83dff47..de1530459 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -90,7 +90,6 @@ kotlin { val jvmMain by getting { dependencies { implementation(libs.ktor.http) - implementation(libs.logback) implementation(libs.rss.reader) api(libs.jackson) api(libs.jackson.schema) diff --git a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt index d9f27c09a..9f6851d49 100644 --- a/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt +++ b/core/src/commonMain/kotlin/com/xebia/functional/xef/llm/assistants/AssistantThread.kt @@ -12,6 +12,7 @@ import kotlin.jvm.JvmName import kotlinx.coroutines.flow.* import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive class AssistantThread( val threadId: String, @@ -81,77 +82,107 @@ class AssistantThread( when (event) { // submit tool outputs and join streams is RunDelta.RunRequiresAction -> { - val steps = - runSteps(event.run.id).map { metric.assistantCreateRunStep(event.run.id) { it } } - - steps.forEach { step -> - val calls = step.stepDetails.toolCalls() + takeRequiredAction(1, event, this@AssistantThread, assistant, this) + } + // previous to submitting tool outputs we let all events pass through the outer flow + else -> { + emit(event) + } + } + } + } - val run = getRun(event.run.id) - if ( - run.status == RunObject.Status.requires_action && - run.requiredAction?.type == RunObjectRequiredAction.Type.submit_tool_outputs - ) { - val callsResult: List> = - calls - .filterIsInstance< - RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsFunctionObject - >() - .parMapNotNull { toolCall -> executeToolCall(toolCall, assistant) } - val results: Map = callsResult.toMap() - val toolOutputsRequest = - SubmitToolOutputsRunRequest( - toolOutputs = - results.map { (toolCallId, result) -> - SubmitToolOutputsRunRequestToolOutputsInner( - toolCallId = toolCallId, - output = - Json.encodeToString(Assistant.Companion.ToolOutput.serializer(), result) - ) - } - ) - metric.assistantToolOutputsRun(event.run.id) { - api - .submitToolOuputsToRunStream( - threadId = threadId, - runId = event.run.id, - submitToolOutputsRunRequest = toolOutputsRequest, - configure = ::defaultConfig - ) - .collect { - val delta = RunDelta.fromServerSentEvent(it) - if (delta is RunDelta.RunStepCompleted) { - emit(delta) - emit(RunDelta.RunSubmitToolOutputs(toolOutputsRequest)) - } else { - emit(delta) - } - } - getRun(event.run.id) - } + private suspend fun takeRequiredAction( + depth: Int, + event: RunDelta.RunRequiresAction, + assistantThread: AssistantThread, + assistant: Assistant, + flowCollector: FlowCollector + ) { + if ( + event.run.status == RunObject.Status.requires_action && + event.run.requiredAction?.type == RunObjectRequiredAction.Type.submit_tool_outputs + ) { + val calls = event.run.requiredAction?.submitToolOutputs?.toolCalls.orEmpty() + val callsResult: List> = + calls.parMapNotNull { toolCall -> assistantThread.executeToolCall(toolCall, assistant) } + val results: Map = callsResult.toMap() + val toolOutputsRequest = + SubmitToolOutputsRunRequest( + toolOutputs = + results.map { (toolCallId, result) -> + SubmitToolOutputsRunRequestToolOutputsInner( + toolCallId = toolCallId, + output = Json.encodeToString(Assistant.Companion.ToolOutput.serializer(), result) + ) + } + ) + val run = + metric.assistantToolOutputsRun(event.run.id) { + api + .submitToolOuputsToRunStream( + threadId = threadId, + runId = event.run.id, + submitToolOutputsRunRequest = toolOutputsRequest, + configure = ::defaultConfig + ) + .collect { + val delta = RunDelta.fromServerSentEvent(it) + if (delta is RunDelta.RunStepCompleted) { + flowCollector.emit(RunDelta.RunSubmitToolOutputs(toolOutputsRequest)) } + flowCollector.emit(delta) } - } - // previous to submitting tool outputs we let all events pass through the outer flow - else -> emit(event) + val run = getRun(event.run.id) + val finalEvent = + when (run.status) { + RunObject.Status.queued -> RunDelta.RunQueued(run) + RunObject.Status.in_progress -> RunDelta.RunInProgress(run) + RunObject.Status.requires_action -> RunDelta.RunRequiresAction(run) + RunObject.Status.cancelling -> RunDelta.RunCancelling(run) + RunObject.Status.cancelled -> RunDelta.RunCancelled(run) + RunObject.Status.failed -> RunDelta.RunFailed(run) + RunObject.Status.completed -> RunDelta.RunCompleted(run) + RunObject.Status.expired -> RunDelta.RunExpired(run) + } + flowCollector.emit(finalEvent) + run } + + if (run.status == RunObject.Status.requires_action) { + takeRequiredAction( + depth + 1, + RunDelta.RunRequiresAction(run), + assistantThread, + assistant, + flowCollector + ) } + } } private suspend fun executeToolCall( - toolCall: RunStepDetailsToolCallsObjectToolCallsInner.CaseRunStepDetailsToolCallsFunctionObject, + toolCall: RunToolCallObject, assistant: Assistant ): Pair? { - val function = toolCall.value.function - val functionName = function.name - val functionArguments = function.arguments - return if (functionName != null && functionArguments != null) { - val result = assistant.getToolRegistered(functionName, functionArguments) - val callId = toolCall.value.id - if (callId != null) { - callId to result + return try { + val function = toolCall.function + val functionName = function.name + val functionArguments = function.arguments + return if (functionName != null && functionArguments != null) { + val result = assistant.getToolRegistered(functionName, functionArguments) + val callId = toolCall.id + if (callId != null) { + callId to result + } else null } else null - } else null + } catch (e: Throwable) { + toolCall.id to + Assistant.Companion.ToolOutput( + schema = JsonObject(emptyMap()), + result = JsonObject(mapOf("error" to JsonPrimitive(e.message ?: "Unknown error"))) + ) + } } suspend fun getRun(runId: String): RunObject = diff --git a/core/src/commonTest/resources/logback-test.xml b/core/src/commonTest/resources/logback-test.xml deleted file mode 100644 index 8f39588cc..000000000 --- a/core/src/commonTest/resources/logback-test.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/detekt-rules/src/main/resources/logback.xml b/detekt-rules/src/main/resources/logback.xml deleted file mode 100644 index 4c99ee634..000000000 --- a/detekt-rules/src/main/resources/logback.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} MDC=%X{user} - %msg%n - - - - - - - \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eca2532b8..e8c5b8be7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ exposed = "0.48.0" kotlin = "1.9.23" kotlinx-json = "1.6.2" kotlinx-datetime = "0.5.0" -ktor = "2.3.9" +ktor = "2.3.10" ktor-logging = "0.4.0" spotless = "6.25.0" okio = "3.9.0" @@ -27,7 +27,7 @@ pdfbox = "3.0.2" mysql = "8.0.33" semverGradle = "0.5.0-rc.6" jackson = "2.16.1" -jsonschema = "4.34.0" +jsonschema = "4.35.0" jakarta = "3.0.2" suspendApp = "0.4.0" flyway = "9.22.3" diff --git a/integrations/gcp/README.MD b/integrations/gcp/README.MD index 402044d0e..dfc340051 100644 --- a/integrations/gcp/README.MD +++ b/integrations/gcp/README.MD @@ -129,7 +129,6 @@ kotlin { ... val jvmMain by getting { dependencies { - implementation(libs.logback) api(libs.ktor.client.cio) } } diff --git a/integrations/gcp/build.gradle.kts b/integrations/gcp/build.gradle.kts index 917f463d4..77eb26045 100644 --- a/integrations/gcp/build.gradle.kts +++ b/integrations/gcp/build.gradle.kts @@ -45,7 +45,6 @@ kotlin { } val jvmMain by getting { dependencies { - implementation(libs.logback) api(libs.ktor.client.cio) } } diff --git a/integrations/mlflow/build.gradle.kts b/integrations/mlflow/build.gradle.kts index b111fe3ec..352b35e07 100644 --- a/integrations/mlflow/build.gradle.kts +++ b/integrations/mlflow/build.gradle.kts @@ -45,7 +45,6 @@ kotlin { } val jvmMain by getting { dependencies { - implementation(libs.logback) api(libs.ktor.client.cio) } } diff --git a/openai-client/client/build.gradle.kts b/openai-client/client/build.gradle.kts index cae83fd9d..7beb5a2a1 100644 --- a/openai-client/client/build.gradle.kts +++ b/openai-client/client/build.gradle.kts @@ -73,7 +73,6 @@ kotlin { } val jvmMain by getting { dependencies { - implementation(libs.logback) api(libs.ktor.client.cio) } } diff --git a/reasoning/build.gradle.kts b/reasoning/build.gradle.kts index 9282c2661..07a15e52f 100644 --- a/reasoning/build.gradle.kts +++ b/reasoning/build.gradle.kts @@ -76,7 +76,6 @@ kotlin { } val jvmMain by getting { dependencies { - implementation(libs.logback) implementation(projects.xefPdf) implementation(projects.xefFilesystem) api(libs.ktor.client.cio) diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 9d6a96a9d..b9398e1e7 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -43,7 +43,6 @@ dependencies { implementation(libs.ktor.server.cors) implementation(libs.ktor.server.request.validation) implementation(libs.ktor.server.status.pages) - implementation(libs.logback) implementation(libs.suspendApp.core) implementation(libs.suspendApp.ktor) implementation(libs.uuid) diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/Server.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/Server.kt index 1d301a9cd..2566c167f 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/Server.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/Server.kt @@ -11,6 +11,7 @@ import com.xebia.functional.xef.server.http.routes.xefRoutes import com.xebia.functional.xef.server.services.hikariDataSource import com.xebia.functional.xef.server.services.vectorStoreService import com.xebia.functional.xef.store.migrations.runDatabaseMigrations +import io.github.oshai.kotlinlogging.KotlinLogging import io.ktor.client.HttpClient import io.ktor.client.engine.cio.CIO import io.ktor.client.plugins.auth.Auth @@ -30,13 +31,12 @@ import io.ktor.server.resources.Resources import io.ktor.server.routing.routing import kotlinx.coroutines.awaitCancellation import org.jetbrains.exposed.sql.Database -import org.slf4j.LoggerFactory object Server { @JvmStatic fun main(args: Array) = SuspendApp { resourceScope { - val logger = LoggerFactory.getLogger("xef-server") + val logger = KotlinLogging.logger("xef-server") val config = ConfigFactory.load("database.conf").resolve() val xefDBConfig = XefDatabaseConfig.load("xef-database", config) diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/http/routes/XefRoutes.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/http/routes/XefRoutes.kt index 5b461b205..47b15f346 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/http/routes/XefRoutes.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/http/routes/XefRoutes.kt @@ -4,10 +4,10 @@ import com.xebia.functional.xef.server.services.OrganizationRepositoryService import com.xebia.functional.xef.server.services.ProjectRepositoryService import com.xebia.functional.xef.server.services.TokenRepositoryService import com.xebia.functional.xef.server.services.UserRepositoryService +import io.github.oshai.kotlinlogging.KLogger import io.ktor.server.routing.* -import org.slf4j.Logger -fun Routing.xefRoutes(logger: Logger) { +fun Routing.xefRoutes(logger: KLogger) { userRoutes(UserRepositoryService(logger)) organizationRoutes(OrganizationRepositoryService(logger)) projectsRoutes(ProjectRepositoryService(logger)) diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/services/OrganizationRepositoryService.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/services/OrganizationRepositoryService.kt index e7c21635a..3142ab15a 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/services/OrganizationRepositoryService.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/services/OrganizationRepositoryService.kt @@ -4,14 +4,14 @@ import com.xebia.functional.xef.server.db.tables.Organization import com.xebia.functional.xef.server.db.tables.User import com.xebia.functional.xef.server.models.* import com.xebia.functional.xef.server.models.exceptions.XefExceptions.* +import io.github.oshai.kotlinlogging.KLogger import kotlinx.datetime.Clock import org.jetbrains.exposed.sql.SizedCollection import org.jetbrains.exposed.sql.transactions.transaction -import org.slf4j.Logger -class OrganizationRepositoryService(private val logger: Logger) { +class OrganizationRepositoryService(private val logger: KLogger) { fun createOrganization(data: OrganizationRequest, token: Token): OrganizationSimpleResponse { - logger.info("Creating organization with name: ${data.name}") + logger.info { "Creating organization with name: ${data.name}" } return transaction { // Getting the user from the token val user = token.getUser() @@ -30,7 +30,7 @@ class OrganizationRepositoryService(private val logger: Logger) { } fun getOrganizations(token: Token): List { - logger.info("Getting organizations") + logger.info { "Getting organizations" } return transaction { // Getting the user from the token val user = token.getUser() @@ -41,7 +41,7 @@ class OrganizationRepositoryService(private val logger: Logger) { } fun getOrganization(token: Token, id: Int): OrganizationFullResponse { - logger.info("Getting organizations") + logger.info { "Getting organizations" } return transaction { // Getting the user from the token val user = token.getUser() @@ -53,7 +53,7 @@ class OrganizationRepositoryService(private val logger: Logger) { } fun getUsersInOrganization(token: Token, id: Int): List { - logger.info("Getting users in organization") + logger.info { "Getting users in organization" } return transaction { // Getting the user from the token val user = token.getUser() @@ -71,7 +71,7 @@ class OrganizationRepositoryService(private val logger: Logger) { data: OrganizationUpdateRequest, id: Int ): OrganizationFullResponse { - logger.info("Updating organization with name: ${data.name}") + logger.info { "Updating organization with name: ${data.name}" } return transaction { // Getting the user from the token val user = token.getUser() @@ -95,7 +95,7 @@ class OrganizationRepositoryService(private val logger: Logger) { } fun deleteOrganization(token: Token, id: Int) { - logger.info("Deleting organization with id: $id") + logger.info { "Deleting organization with id: $id" } transaction { val user = token.getUser() val organization = diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/services/PostgresVectorStoreService.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/services/PostgresVectorStoreService.kt index f21cc19cb..6f764ea4e 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/services/PostgresVectorStoreService.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/services/PostgresVectorStoreService.kt @@ -8,13 +8,13 @@ import com.xebia.functional.xef.store.VectorStore import com.xebia.functional.xef.store.postgresql.PGDistanceStrategy import com.xebia.functional.xef.store.postgresql.addNewCollection import com.xebia.functional.xef.store.postgresql.connection +import io.github.oshai.kotlinlogging.KLogger import javax.sql.DataSource import kotlinx.uuid.UUID import kotlinx.uuid.generateUUID -import org.slf4j.Logger class PostgresVectorStoreService( - private val logger: Logger, + private val logger: KLogger, private val dataSource: DataSource, private val collectionName: String, private val vectorSize: Int, @@ -33,7 +33,7 @@ class PostgresVectorStoreService( bind(uuid.toString()) bind(collectionName) } - .also { logger.info("Created collection $collectionName") } + .also { logger.info { "Created collection $collectionName" } } } } diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/services/ProjectRepositoryService.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/services/ProjectRepositoryService.kt index 14e58ceb1..efe45ac47 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/services/ProjectRepositoryService.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/services/ProjectRepositoryService.kt @@ -3,13 +3,13 @@ package com.xebia.functional.xef.server.services import com.xebia.functional.xef.server.db.tables.* import com.xebia.functional.xef.server.models.* import com.xebia.functional.xef.server.models.exceptions.XefExceptions.* +import io.github.oshai.kotlinlogging.KLogger import kotlinx.datetime.Clock import org.jetbrains.exposed.sql.transactions.transaction -import org.slf4j.Logger -class ProjectRepositoryService(private val logger: Logger) { +class ProjectRepositoryService(private val logger: KLogger) { fun createProject(data: ProjectRequest, token: Token): ProjectSimpleResponse { - logger.info("Creating project with name: ${data.name}") + logger.info { "Creating project with name: ${data.name}" } return transaction { val user = token.getUser() @@ -30,7 +30,7 @@ class ProjectRepositoryService(private val logger: Logger) { } fun getProjects(token: Token): List { - logger.info("Getting projects") + logger.info { "Getting projects" } return transaction { val user = token.getUser() @@ -43,7 +43,7 @@ class ProjectRepositoryService(private val logger: Logger) { } fun getProject(token: Token, id: Int): ProjectFullResponse { - logger.info("Getting project") + logger.info { "Getting project" } return transaction { val user = token.getUser() @@ -58,7 +58,7 @@ class ProjectRepositoryService(private val logger: Logger) { } fun getProjectsByOrganization(token: Token, orgId: Int): List { - logger.info("Getting projects") + logger.info { "Getting projects" } return transaction { val user = token.getUser() @@ -71,7 +71,7 @@ class ProjectRepositoryService(private val logger: Logger) { } fun updateProject(token: Token, data: ProjectUpdateRequest, id: Int): ProjectFullResponse { - logger.info("Updating project with name: ${data.name}") + logger.info { "Updating project with name: ${data.name}" } return transaction { val user = token.getUser() @@ -101,7 +101,7 @@ class ProjectRepositoryService(private val logger: Logger) { } fun deleteProject(token: Token, id: Int) { - logger.info("Deleting project with id: $id") + logger.info { "Deleting project with id: $id" } transaction { val user = token.getUser() val project = Project.findById(id) ?: throw ProjectException("Project not found") diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/services/TokenRepositoryService.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/services/TokenRepositoryService.kt index d3c8d23d1..313629084 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/services/TokenRepositoryService.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/services/TokenRepositoryService.kt @@ -7,13 +7,13 @@ import com.xebia.functional.xef.server.db.tables.XefTokens import com.xebia.functional.xef.server.db.tables.XefTokensTable import com.xebia.functional.xef.server.models.* import com.xebia.functional.xef.server.models.exceptions.XefExceptions.* +import io.github.oshai.kotlinlogging.KLogger import java.util.UUID import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.transactions.transaction -import org.slf4j.Logger -class TokenRepositoryService(private val logger: Logger) { +class TokenRepositoryService(private val logger: KLogger) { fun createToken(data: TokenRequest, userToken: Token): TokenSimpleResponse { return transaction { val user = userToken.getUser() @@ -21,7 +21,7 @@ class TokenRepositoryService(private val logger: Logger) { val project = Project.findById(data.projectId) ?: throw OrganizationsException("Project not found") - logger.info("Creating token with name ${data.name} from project ${project.name}") + logger.info { "Creating token with name ${data.name} from project ${project.name}" } if (user.organizations.none { it.id == project.orgId }) { throw OrganizationsException( @@ -43,7 +43,7 @@ class TokenRepositoryService(private val logger: Logger) { } fun getTokens(userToken: Token): List { - logger.info("Getting tokens") + logger.info { "Getting tokens" } return transaction { val user = userToken.getUser() @@ -64,7 +64,7 @@ class TokenRepositoryService(private val logger: Logger) { } fun getTokensByProject(userToken: Token, projectId: Int): List { - logger.info("Getting tokens by project") + logger.info { "Getting tokens by project" } return transaction { val user = userToken.getUser() @@ -78,7 +78,7 @@ class TokenRepositoryService(private val logger: Logger) { } fun updateToken(userToken: Token, data: TokenUpdateRequest, id: Int): TokenFullResponse { - logger.info("Updating token with name: ${data.name}") + logger.info { "Updating token with name: ${data.name}" } return transaction { val user = userToken.getUser() @@ -102,7 +102,7 @@ class TokenRepositoryService(private val logger: Logger) { } fun deleteToken(userToken: Token, id: Int) { - logger.info("Deleting token: $id") + logger.info { "Deleting token: $id" } transaction { val user = userToken.getUser() diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/services/UserRepositoryService.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/services/UserRepositoryService.kt index e7c741bb6..01d4a9f97 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/services/UserRepositoryService.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/services/UserRepositoryService.kt @@ -7,15 +7,15 @@ import com.xebia.functional.xef.server.models.LoginResponse import com.xebia.functional.xef.server.models.RegisterRequest import com.xebia.functional.xef.server.models.exceptions.XefExceptions.UserException import com.xebia.functional.xef.server.utils.HashUtils +import io.github.oshai.kotlinlogging.KLogger import kotlinx.uuid.UUID import kotlinx.uuid.generateUUID import org.jetbrains.exposed.sql.transactions.transaction -import org.slf4j.Logger -class UserRepositoryService(private val logger: Logger) { +class UserRepositoryService(private val logger: KLogger) { fun register(request: RegisterRequest): LoginResponse { - logger.info("Registering user ${request.email}") + logger.info { "Registering user ${request.email}" } return transaction { if (User.find { UsersTable.email eq request.email }.count() > 0) { @@ -38,7 +38,7 @@ class UserRepositoryService(private val logger: Logger) { } fun login(request: LoginRequest): LoginResponse { - logger.info("Login user ${request.email}") + logger.info { "Login user ${request.email}" } return transaction { val user = User.find { UsersTable.email eq request.email }.firstOrNull() diff --git a/server/src/main/kotlin/com/xebia/functional/xef/server/services/VectorStoreService.kt b/server/src/main/kotlin/com/xebia/functional/xef/server/services/VectorStoreService.kt index 3b6d96ff7..194f205c9 100644 --- a/server/src/main/kotlin/com/xebia/functional/xef/server/services/VectorStoreService.kt +++ b/server/src/main/kotlin/com/xebia/functional/xef/server/services/VectorStoreService.kt @@ -5,11 +5,11 @@ import com.typesafe.config.Config import com.xebia.functional.xef.store.VectorStore import com.xebia.functional.xef.store.config.PostgreSQLVectorStoreConfig import com.xebia.functional.xef.store.migrations.runDatabaseMigrations +import io.github.oshai.kotlinlogging.KLogger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.hocon.Hocon -import org.slf4j.Logger enum class XefVectorStoreType { PSQL, @@ -27,7 +27,7 @@ enum class XefVectorStoreType { suspend fun ResourceScope.vectorStoreService( configNamespace: String, config: Config, - logger: Logger + logger: KLogger ): VectorStoreService = withContext(Dispatchers.IO) { val vectorStoreConfig = config.getConfig(configNamespace)