@@ -53,13 +53,33 @@ public struct Prompt: Hashable, Codable, Sendable {
5353 /// The message content
5454 public let content : Content
5555
56+ /// Creates a message with the specified role and content
57+ @available (
58+ * , deprecated, message: " Use static factory methods .user(_:) or .assistant(_:) instead "
59+ )
5660 public init ( role: Role , content: Content ) {
5761 self . role = role
5862 self . content = content
5963 }
6064
65+ /// Private initializer for convenience methods to avoid deprecation warnings
66+ private init ( _role role: Role , _content content: Content ) {
67+ self . role = role
68+ self . content = content
69+ }
70+
71+ /// Creates a user message with the specified content
72+ public static func user( _ content: Content ) -> Message {
73+ return Message ( _role: . user, _content: content)
74+ }
75+
76+ /// Creates an assistant message with the specified content
77+ public static func assistant( _ content: Content ) -> Message {
78+ return Message ( _role: . assistant, _content: content)
79+ }
80+
6181 /// Content types for messages
62- public enum Content : Hashable , Codable , Sendable {
82+ public enum Content : Hashable , Sendable {
6383 /// Text content
6484 case text( text: String )
6585 /// Image content
@@ -68,64 +88,6 @@ public struct Prompt: Hashable, Codable, Sendable {
6888 case audio( data: String , mimeType: String )
6989 /// Embedded resource content
7090 case resource( uri: String , mimeType: String , text: String ? , blob: String ? )
71-
72- private enum CodingKeys : String , CodingKey {
73- case type, text, data, mimeType, uri, blob
74- }
75-
76- public func encode( to encoder: Encoder ) throws {
77- var container = encoder. container ( keyedBy: CodingKeys . self)
78-
79- switch self {
80- case . text( let text) :
81- try container. encode ( " text " , forKey: . type)
82- try container. encode ( text, forKey: . text)
83- case . image( let data, let mimeType) :
84- try container. encode ( " image " , forKey: . type)
85- try container. encode ( data, forKey: . data)
86- try container. encode ( mimeType, forKey: . mimeType)
87- case . audio( let data, let mimeType) :
88- try container. encode ( " audio " , forKey: . type)
89- try container. encode ( data, forKey: . data)
90- try container. encode ( mimeType, forKey: . mimeType)
91- case . resource( let uri, let mimeType, let text, let blob) :
92- try container. encode ( " resource " , forKey: . type)
93- try container. encode ( uri, forKey: . uri)
94- try container. encode ( mimeType, forKey: . mimeType)
95- try container. encodeIfPresent ( text, forKey: . text)
96- try container. encodeIfPresent ( blob, forKey: . blob)
97- }
98- }
99-
100- public init ( from decoder: Decoder ) throws {
101- let container = try decoder. container ( keyedBy: CodingKeys . self)
102- let type = try container. decode ( String . self, forKey: . type)
103-
104- switch type {
105- case " text " :
106- let text = try container. decode ( String . self, forKey: . text)
107- self = . text( text: text)
108- case " image " :
109- let data = try container. decode ( String . self, forKey: . data)
110- let mimeType = try container. decode ( String . self, forKey: . mimeType)
111- self = . image( data: data, mimeType: mimeType)
112- case " audio " :
113- let data = try container. decode ( String . self, forKey: . data)
114- let mimeType = try container. decode ( String . self, forKey: . mimeType)
115- self = . audio( data: data, mimeType: mimeType)
116- case " resource " :
117- let uri = try container. decode ( String . self, forKey: . uri)
118- let mimeType = try container. decode ( String . self, forKey: . mimeType)
119- let text = try container. decodeIfPresent ( String . self, forKey: . text)
120- let blob = try container. decodeIfPresent ( String . self, forKey: . blob)
121- self = . resource( uri: uri, mimeType: mimeType, text: text, blob: blob)
122- default :
123- throw DecodingError . dataCorruptedError (
124- forKey: . type,
125- in: container,
126- debugDescription: " Unknown content type " )
127- }
128- }
12991 }
13092 }
13193
@@ -156,6 +118,84 @@ public struct Prompt: Hashable, Codable, Sendable {
156118 }
157119}
158120
121+ // MARK: - Codable
122+
123+ extension Prompt . Message . Content : Codable {
124+ private enum CodingKeys : String , CodingKey {
125+ case type, text, data, mimeType, uri, blob
126+ }
127+
128+ public func encode( to encoder: Encoder ) throws {
129+ var container = encoder. container ( keyedBy: CodingKeys . self)
130+
131+ switch self {
132+ case . text( let text) :
133+ try container. encode ( " text " , forKey: . type)
134+ try container. encode ( text, forKey: . text)
135+ case . image( let data, let mimeType) :
136+ try container. encode ( " image " , forKey: . type)
137+ try container. encode ( data, forKey: . data)
138+ try container. encode ( mimeType, forKey: . mimeType)
139+ case . audio( let data, let mimeType) :
140+ try container. encode ( " audio " , forKey: . type)
141+ try container. encode ( data, forKey: . data)
142+ try container. encode ( mimeType, forKey: . mimeType)
143+ case . resource( let uri, let mimeType, let text, let blob) :
144+ try container. encode ( " resource " , forKey: . type)
145+ try container. encode ( uri, forKey: . uri)
146+ try container. encode ( mimeType, forKey: . mimeType)
147+ try container. encodeIfPresent ( text, forKey: . text)
148+ try container. encodeIfPresent ( blob, forKey: . blob)
149+ }
150+ }
151+
152+ public init ( from decoder: Decoder ) throws {
153+ let container = try decoder. container ( keyedBy: CodingKeys . self)
154+ let type = try container. decode ( String . self, forKey: . type)
155+
156+ switch type {
157+ case " text " :
158+ let text = try container. decode ( String . self, forKey: . text)
159+ self = . text( text: text)
160+ case " image " :
161+ let data = try container. decode ( String . self, forKey: . data)
162+ let mimeType = try container. decode ( String . self, forKey: . mimeType)
163+ self = . image( data: data, mimeType: mimeType)
164+ case " audio " :
165+ let data = try container. decode ( String . self, forKey: . data)
166+ let mimeType = try container. decode ( String . self, forKey: . mimeType)
167+ self = . audio( data: data, mimeType: mimeType)
168+ case " resource " :
169+ let uri = try container. decode ( String . self, forKey: . uri)
170+ let mimeType = try container. decode ( String . self, forKey: . mimeType)
171+ let text = try container. decodeIfPresent ( String . self, forKey: . text)
172+ let blob = try container. decodeIfPresent ( String . self, forKey: . blob)
173+ self = . resource( uri: uri, mimeType: mimeType, text: text, blob: blob)
174+ default :
175+ throw DecodingError . dataCorruptedError (
176+ forKey: . type,
177+ in: container,
178+ debugDescription: " Unknown content type " )
179+ }
180+ }
181+ }
182+
183+ // MARK: - ExpressibleByStringLiteral
184+
185+ extension Prompt . Message . Content : ExpressibleByStringLiteral {
186+ public init ( stringLiteral value: String ) {
187+ self = . text( text: value)
188+ }
189+ }
190+
191+ // MARK: - ExpressibleByStringInterpolation
192+
193+ extension Prompt . Message . Content : ExpressibleByStringInterpolation {
194+ public init ( stringInterpolation: DefaultStringInterpolation ) {
195+ self = . text( text: String ( stringInterpolation: stringInterpolation) )
196+ }
197+ }
198+
159199// MARK: -
160200
161201/// To retrieve available prompts, clients send a `prompts/list` request.
0 commit comments