diff --git a/core/src/commonMain/kotlin/com/xebia/functional/xef/auto/AI.kt b/core/src/commonMain/kotlin/com/xebia/functional/xef/auto/AI.kt
index 03ec0ce25..b01f457e7 100644
--- a/core/src/commonMain/kotlin/com/xebia/functional/xef/auto/AI.kt
+++ b/core/src/commonMain/kotlin/com/xebia/functional/xef/auto/AI.kt
@@ -11,6 +11,3 @@ import com.xebia.functional.xef.vectorstores.VectorStore
* [VectorStore], [OpenAIEmbeddings] and [AIClient] instances.
*/
typealias AI = suspend CoreAIScope.() -> A
-
-/** A DSL block that makes it more convenient to construct [AI] values. */
-inline fun ai(noinline block: suspend CoreAIScope.() -> A): AI = block
diff --git a/gpt4all-kotlin/src/jvmMain/kotlin/com/xebia/functional/gpt4all/Gpt4AllRuntime.kt b/gpt4all-kotlin/src/jvmMain/kotlin/com/xebia/functional/gpt4all/Gpt4AllRuntime.kt
index 733610c4e..6162a4bfe 100644
--- a/gpt4all-kotlin/src/jvmMain/kotlin/com/xebia/functional/gpt4all/Gpt4AllRuntime.kt
+++ b/gpt4all-kotlin/src/jvmMain/kotlin/com/xebia/functional/gpt4all/Gpt4AllRuntime.kt
@@ -1,12 +1,9 @@
package com.xebia.functional.gpt4all
import arrow.core.Either
-import arrow.core.left
-import arrow.core.right
import com.xebia.functional.xef.AIError
import com.xebia.functional.xef.auto.AI
import com.xebia.functional.xef.auto.CoreAIScope
-import com.xebia.functional.xef.auto.ai
/**
* Run the [AI] value to produce an [A], this method initialises all the dependencies required to
@@ -38,7 +35,7 @@ suspend inline fun AI.getOrThrow(): A = getOrElse { throw it }
* @see getOrElse for an operator that allow directly handling the [AIError] case.
*/
suspend inline fun AI.toEither(): Either =
- ai { invoke().right() }.getOrElse { it.left() }
+ Either.catchOrThrow { getOrThrow() }
suspend fun AIScope(block: AI, orElse: suspend (AIError) -> A): A =
try {
diff --git a/kotlin/src/commonMain/kotlin/com/xebia/functional/xef/auto/DSLExtensions.kt b/kotlin/src/commonMain/kotlin/com/xebia/functional/xef/auto/DSLExtensions.kt
new file mode 100644
index 000000000..4bb3c3d34
--- /dev/null
+++ b/kotlin/src/commonMain/kotlin/com/xebia/functional/xef/auto/DSLExtensions.kt
@@ -0,0 +1,4 @@
+package com.xebia.functional.xef.auto
+
+/** A DSL block that makes it more convenient to construct [AI] values. */
+inline fun ai(noinline block: suspend CoreAIScope.() -> A): AI = block
diff --git a/openai/src/commonMain/kotlin/com/xebia/functional/xef/auto/llm/openai/OpenAIRuntime.kt b/openai/src/commonMain/kotlin/com/xebia/functional/xef/auto/llm/openai/OpenAIRuntime.kt
index daae1fe92..6b95a7a8b 100644
--- a/openai/src/commonMain/kotlin/com/xebia/functional/xef/auto/llm/openai/OpenAIRuntime.kt
+++ b/openai/src/commonMain/kotlin/com/xebia/functional/xef/auto/llm/openai/OpenAIRuntime.kt
@@ -3,14 +3,10 @@
package com.xebia.functional.xef.auto.llm.openai
import arrow.core.Either
-import arrow.core.left
-import arrow.core.right
import com.xebia.functional.xef.AIError
import com.xebia.functional.xef.auto.AI
import com.xebia.functional.xef.auto.CoreAIScope
-import com.xebia.functional.xef.auto.ai
import kotlin.jvm.JvmName
-import kotlin.time.ExperimentalTime
/**
* Run the [AI] value to produce an [A], this method initialises all the dependencies required to
@@ -42,9 +38,8 @@ suspend inline fun AI.getOrThrow(): A = getOrElse { throw it }
* @see getOrElse for an operator that allow directly handling the [AIError] case.
*/
suspend inline fun AI.toEither(): Either =
- ai { invoke().right() }.getOrElse { it.left() }
+ Either.catchOrThrow { getOrThrow() }
-@OptIn(ExperimentalTime::class)
suspend fun AIScope(block: AI, orElse: suspend (AIError) -> A): A =
try {
val scope = CoreAIScope(OpenAIEmbeddings(OpenAI.DEFAULT_EMBEDDING))