diff --git a/build.gradle.kts b/build.gradle.kts index 8f9ccc5..6020b18 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,12 +66,10 @@ kotlin { jvm { // set up according to https://jakewharton.com/gradle-toolchains-are-rarely-a-good-idea/ compilerOptions { - apiVersion = kotlinTarget - languageVersion = kotlinTarget jvmTarget = JvmTarget.fromTarget(javaTarget) freeCompilerArgs.add("-Xjdk-release=$javaTarget") - progressiveMode = true } + withJava() } if (!isJvmOnlyBuild) { @@ -356,4 +354,9 @@ if (isReleaseBuild) { } } -} \ No newline at end of file +} + +tasks.withType(JavaCompile::class.java) { + targetCompatibility = javaTarget + sourceCompatibility = javaTarget +} diff --git a/src/jvmMain/kotlin/JavaAnthropic.kt b/src/jvmMain/kotlin/JavaAnthropic.kt new file mode 100644 index 0000000..6e4a711 --- /dev/null +++ b/src/jvmMain/kotlin/JavaAnthropic.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2024 Kazimierz Pogoda / Xemantic + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.xemantic.ai.anthropic + +import com.xemantic.ai.anthropic.message.MessageRequest +import com.xemantic.ai.anthropic.message.MessageResponse +import kotlinx.coroutines.runBlocking +import java.util.function.Consumer + +// a very early version of Java only SDK, adapting Kotlin idioms and coroutines +// it might change a lot in the future + +class JavaAnthropic private constructor( + private val anthropic: Anthropic +) { + + companion object { + + @JvmStatic + fun create( + configurer: Consumer + ): JavaAnthropic = JavaAnthropic(Anthropic { configurer.accept(this) }) + + } + + + inner class Messages { + + fun createBlocking( + builder: Consumer + ): MessageResponse = runBlocking { + anthropic.messages.create { + builder.accept(this) + } + } + + } + + @JvmField + val messages = Messages() + +} diff --git a/src/jvmMain/kotlin/JvmAnthropic.kt b/src/jvmMain/kotlin/JvmAnthropic.kt index db5b2b4..9d5b8f3 100644 --- a/src/jvmMain/kotlin/JvmAnthropic.kt +++ b/src/jvmMain/kotlin/JvmAnthropic.kt @@ -16,41 +16,8 @@ package com.xemantic.ai.anthropic -import com.xemantic.ai.anthropic.message.MessageRequest -import com.xemantic.ai.anthropic.message.MessageResponse -import kotlinx.coroutines.runBlocking -import java.util.function.Consumer - actual val envApiKey: String? get() = System.getenv("ANTHROPIC_API_KEY") actual val missingApiKeyMessage: String get() = "apiKey is missing, it has to be provided as a parameter or as an ANTHROPIC_API_KEY environment variable." - -// a very early version of Java only SDK, adapting Kotlin idioms and coroutines -// it might change a lot in the future -class JavaAnthropic { - - companion object { - - @JvmStatic - fun create(): Anthropic = Anthropic() - - @JvmStatic - fun create( - configurer: Consumer - ): Anthropic { - return Anthropic { configurer.accept(this) } - } - - } - -} - -fun Anthropic.createMessage( - builder: Consumer -): MessageResponse = runBlocking { - messages.create { - builder.accept(this) - } -} diff --git a/src/jvmTest/java/com/xemantic/ai/anthropic/JavaAnthropicTest.java b/src/jvmTest/java/com/xemantic/ai/anthropic/JavaAnthropicTest.java new file mode 100644 index 0000000..961a255 --- /dev/null +++ b/src/jvmTest/java/com/xemantic/ai/anthropic/JavaAnthropicTest.java @@ -0,0 +1,48 @@ +/* + * Copyright 2024 Kazimierz Pogoda / Xemantic + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.xemantic.ai.anthropic; + +import com.xemantic.ai.anthropic.content.Text; +import com.xemantic.ai.anthropic.message.Message; +import com.xemantic.ai.anthropic.message.MessageResponse; +import com.xemantic.ai.anthropic.message.Role; +import org.junit.Test; + +import java.util.List; + +public class JavaAnthropicTest { + + @Test + public void foo() { + JavaAnthropic anthropic = JavaAnthropic.create(config -> { + }); + MessageResponse response = anthropic.messages.createBlocking(builder -> builder.messages( + new Message( + Role.USER, + List.of( + new Text( + "Hi Claude", + null + ) + ) + ) + )); + System.out.println(response); + throw new RuntimeException("test"); + } + +}