Skip to content

Commit 33c4f92

Browse files
authored
Merge branch 'main' into devcrocod/add-ios-and-wasm
2 parents 8639089 + 9f00f22 commit 33c4f92

File tree

4 files changed

+119
-29
lines changed

4 files changed

+119
-29
lines changed

api/kotlin-sdk.api

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,34 @@
1+
public final class io/modelcontextprotocol/kotlin/sdk/AudioContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal {
2+
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/AudioContent$Companion;
3+
public static final field TYPE Ljava/lang/String;
4+
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
5+
public final fun component1 ()Ljava/lang/String;
6+
public final fun component2 ()Ljava/lang/String;
7+
public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/AudioContent;
8+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/AudioContent;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/AudioContent;
9+
public fun equals (Ljava/lang/Object;)Z
10+
public final fun getData ()Ljava/lang/String;
11+
public final fun getMimeType ()Ljava/lang/String;
12+
public fun getType ()Ljava/lang/String;
13+
public fun hashCode ()I
14+
public fun toString ()Ljava/lang/String;
15+
}
16+
17+
public synthetic class io/modelcontextprotocol/kotlin/sdk/AudioContent$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
18+
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/AudioContent$$serializer;
19+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
20+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/AudioContent;
21+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
22+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
23+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/AudioContent;)V
24+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
25+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
26+
}
27+
28+
public final class io/modelcontextprotocol/kotlin/sdk/AudioContent$Companion {
29+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
30+
}
31+
132
public final class io/modelcontextprotocol/kotlin/sdk/BlobResourceContents : io/modelcontextprotocol/kotlin/sdk/ResourceContents {
233
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/BlobResourceContents$Companion;
334
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
@@ -401,17 +432,17 @@ public final class io/modelcontextprotocol/kotlin/sdk/CreateMessageRequest$Inclu
401432

402433
public final class io/modelcontextprotocol/kotlin/sdk/CreateMessageResult : io/modelcontextprotocol/kotlin/sdk/ClientResult {
403434
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult$Companion;
404-
public fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;Lkotlinx/serialization/json/JsonObject;)V
405-
public synthetic fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
435+
public fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;Lkotlinx/serialization/json/JsonObject;)V
436+
public synthetic fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
406437
public final fun component1 ()Ljava/lang/String;
407438
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/StopReason;
408439
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/Role;
409-
public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;
440+
public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;
410441
public final fun component5 ()Lkotlinx/serialization/json/JsonObject;
411-
public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult;
412-
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult;
442+
public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult;
443+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/StopReason;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CreateMessageResult;
413444
public fun equals (Ljava/lang/Object;)Z
414-
public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;
445+
public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;
415446
public final fun getModel ()Ljava/lang/String;
416447
public final fun getRole ()Lio/modelcontextprotocol/kotlin/sdk/Role;
417448
public final fun getStopReason ()Lio/modelcontextprotocol/kotlin/sdk/StopReason;
@@ -643,7 +674,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/GetPromptResult$Companion
643674
public final fun serializer ()Lkotlinx/serialization/KSerializer;
644675
}
645676

646-
public final class io/modelcontextprotocol/kotlin/sdk/ImageContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage {
677+
public final class io/modelcontextprotocol/kotlin/sdk/ImageContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal {
647678
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/ImageContent$Companion;
648679
public static final field TYPE Ljava/lang/String;
649680
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
@@ -1618,11 +1649,11 @@ public final class io/modelcontextprotocol/kotlin/sdk/PromptMessageContent$Compa
16181649
public final fun serializer ()Lkotlinx/serialization/KSerializer;
16191650
}
16201651

1621-
public abstract interface class io/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage : io/modelcontextprotocol/kotlin/sdk/PromptMessageContent {
1622-
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage$Companion;
1652+
public abstract interface class io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal : io/modelcontextprotocol/kotlin/sdk/PromptMessageContent {
1653+
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal$Companion;
16231654
}
16241655

1625-
public final class io/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage$Companion {
1656+
public final class io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal$Companion {
16261657
public final fun serializer ()Lkotlinx/serialization/KSerializer;
16271658
}
16281659

@@ -2016,13 +2047,13 @@ public final class io/modelcontextprotocol/kotlin/sdk/RootsListChangedNotificati
20162047

20172048
public final class io/modelcontextprotocol/kotlin/sdk/SamplingMessage {
20182049
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage$Companion;
2019-
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;)V
2050+
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;)V
20202051
public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/Role;
2021-
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;
2022-
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;)Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage;
2023-
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage;
2052+
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;
2053+
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;)Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage;
2054+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage;Lio/modelcontextprotocol/kotlin/sdk/Role;Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/SamplingMessage;
20242055
public fun equals (Ljava/lang/Object;)Z
2025-
public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage;
2056+
public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal;
20262057
public final fun getRole ()Lio/modelcontextprotocol/kotlin/sdk/Role;
20272058
public fun hashCode ()I
20282059
public fun toString ()Ljava/lang/String;
@@ -2274,7 +2305,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/SubscribeRequest$Companion
22742305
public final fun serializer ()Lkotlinx/serialization/KSerializer;
22752306
}
22762307

2277-
public final class io/modelcontextprotocol/kotlin/sdk/TextContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage {
2308+
public final class io/modelcontextprotocol/kotlin/sdk/TextContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal {
22782309
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/TextContent$Companion;
22792310
public static final field TYPE Ljava/lang/String;
22802311
public fun <init> ()V
@@ -2428,7 +2459,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/Types_utilKt {
24282459
public static synthetic fun ok$default (Lio/modelcontextprotocol/kotlin/sdk/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CallToolResult;
24292460
}
24302461

2431-
public final class io/modelcontextprotocol/kotlin/sdk/UnknownContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage {
2462+
public final class io/modelcontextprotocol/kotlin/sdk/UnknownContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentMultimodal {
24322463
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/UnknownContent$Companion;
24332464
public fun <init> (Ljava/lang/String;)V
24342465
public final fun component1 ()Ljava/lang/String;

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -899,10 +899,10 @@ public sealed interface PromptMessageContent {
899899
}
900900

901901
/**
902-
* Represents prompt message content that is either text or an image.
902+
* Represents prompt message content that is either text, image or audio.
903903
*/
904-
@Serializable(with = PromptMessageContentTextOrImagePolymorphicSerializer::class)
905-
public sealed interface PromptMessageContentTextOrImage : PromptMessageContent
904+
@Serializable(with = PromptMessageContentMultimodalPolymorphicSerializer::class)
905+
public sealed interface PromptMessageContentMultimodal : PromptMessageContent
906906

907907
/**
908908
* Text provided to or from an LLM.
@@ -913,7 +913,7 @@ public data class TextContent(
913913
* The text content of the message.
914914
*/
915915
val text: String? = null,
916-
) : PromptMessageContentTextOrImage {
916+
) : PromptMessageContentMultimodal {
917917
override val type: String = TYPE
918918

919919
public companion object {
@@ -935,7 +935,7 @@ public data class ImageContent(
935935
* The MIME type of the image. Different providers may support different image types.
936936
*/
937937
val mimeType: String,
938-
) : PromptMessageContentTextOrImage {
938+
) : PromptMessageContentMultimodal {
939939
override val type: String = TYPE
940940

941941
public companion object {
@@ -944,12 +944,35 @@ public data class ImageContent(
944944
}
945945

946946
/**
947-
* An image provided to or from an LLM.
947+
* Audio provided to or from an LLM.
948+
*/
949+
@Serializable
950+
public data class AudioContent(
951+
/**
952+
* The base64-encoded audio data.
953+
*/
954+
val data: String,
955+
956+
/**
957+
* The MIME type of the audio. Different providers may support different audio types.
958+
*/
959+
val mimeType: String,
960+
) : PromptMessageContentMultimodal {
961+
override val type: String = TYPE
962+
963+
public companion object {
964+
public const val TYPE: String = "audio"
965+
}
966+
}
967+
968+
969+
/**
970+
* Unknown content provided to or from an LLM.
948971
*/
949972
@Serializable
950973
public data class UnknownContent(
951974
override val type: String,
952-
) : PromptMessageContentTextOrImage
975+
) : PromptMessageContentMultimodal
953976

954977
/**
955978
* The contents of a resource, embedded into a prompt or tool call result.
@@ -1219,7 +1242,7 @@ public class ModelPreferences(
12191242
@Serializable
12201243
public data class SamplingMessage(
12211244
val role: Role,
1222-
val content: PromptMessageContentTextOrImage,
1245+
val content: PromptMessageContentMultimodal,
12231246
)
12241247

12251248
/**
@@ -1301,7 +1324,7 @@ public data class CreateMessageResult(
13011324
*/
13021325
val stopReason: StopReason? = null,
13031326
val role: Role,
1304-
val content: PromptMessageContentTextOrImage,
1327+
val content: PromptMessageContentMultimodal,
13051328
override val _meta: JsonObject = EmptyJsonObject,
13061329
) : ClientResult
13071330

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,19 @@ internal object PromptMessageContentPolymorphicSerializer :
8989
ImageContent.TYPE -> ImageContent.serializer()
9090
TextContent.TYPE -> TextContent.serializer()
9191
EmbeddedResource.TYPE -> EmbeddedResource.serializer()
92+
AudioContent.TYPE -> AudioContent.serializer()
9293
else -> UnknownContent.serializer()
9394
}
9495
}
9596
}
9697

97-
internal object PromptMessageContentTextOrImagePolymorphicSerializer :
98-
JsonContentPolymorphicSerializer<PromptMessageContentTextOrImage>(PromptMessageContentTextOrImage::class) {
99-
override fun selectDeserializer(element: JsonElement): DeserializationStrategy<PromptMessageContentTextOrImage> {
98+
internal object PromptMessageContentMultimodalPolymorphicSerializer :
99+
JsonContentPolymorphicSerializer<PromptMessageContentMultimodal>(PromptMessageContentMultimodal::class) {
100+
override fun selectDeserializer(element: JsonElement): DeserializationStrategy<PromptMessageContentMultimodal> {
100101
return when (element.jsonObject.getValue("type").jsonPrimitive.content) {
101102
ImageContent.TYPE -> ImageContent.serializer()
102103
TextContent.TYPE -> TextContent.serializer()
104+
AudioContent.TYPE -> AudioContent.serializer()
103105
else -> UnknownContent.serializer()
104106
}
105107
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.modelcontextprotocol.kotlin.sdk
2+
3+
import io.kotest.assertions.json.shouldEqualJson
4+
import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
5+
import kotlinx.serialization.encodeToString
6+
import kotlin.test.Test
7+
import kotlin.test.assertEquals
8+
9+
class AudioContentSerializationTest {
10+
11+
private val audioContentJson = """
12+
{
13+
"data": "base64-encoded-audio-data",
14+
"mimeType": "audio/wav",
15+
"type": "audio"
16+
}
17+
""".trimIndent()
18+
19+
private val audioContent = AudioContent(
20+
data = "base64-encoded-audio-data",
21+
mimeType = "audio/wav"
22+
)
23+
24+
@Test
25+
fun `should serialize audio content`() {
26+
McpJson.encodeToString(audioContent) shouldEqualJson audioContentJson
27+
}
28+
29+
@Test
30+
fun `should deserialize audio content`() {
31+
val content = McpJson.decodeFromString<AudioContent>(audioContentJson)
32+
assertEquals(expected = audioContent, actual = content)
33+
}
34+
}

0 commit comments

Comments
 (0)