@@ -24,4 +24,55 @@ public final class JetpackAIServiceRemote: SiteServiceRemoteWordPressComREST {
2424 }
2525 return text
2626 }
27+
28+ /// - parameter token: Token retrieved using ``JetpackAIServiceRemote/getAuthorizationToken``.
29+ public func makePostContent( fromPlainText plainText: String , token: String ) async throws -> String {
30+ let path = path ( forEndpoint: " jetpack-ai-query " , withVersion: . _2_0)
31+ let request = JetpackAIQueryRequest ( messages: [
32+ . init( role: " jetpack-ai " , context: . init( type: " voice-to-content-simple-draft " , content: plainText) )
33+ ] , feature: " voice-to-content " , stream: false )
34+ let builder = try wordPressComRestApi. requestBuilder ( URLString: path)
35+ . method ( . post)
36+ . headers ( [ " Authorization " : " Bearer \( token) " ] )
37+ . body ( json: request, jsonEncoder: JSONEncoder ( ) )
38+ let result = await wordPressComRestApi. perform ( request: builder) { data in
39+ try JSONDecoder ( ) . decode ( JetpackAIQueryResponse . self, from: data)
40+ }
41+ let response = try result. get ( ) . body
42+ guard let content = response. choices. first? . message. content else {
43+ throw URLError ( . unknown)
44+ }
45+ return content
46+ }
47+ }
48+
49+ private struct JetpackAIQueryRequest : Encodable {
50+ let messages : [ Message ]
51+ let feature : String
52+ let stream : Bool
53+
54+ struct Message : Encodable {
55+ let role : String
56+ let context : Context
57+ }
58+
59+ struct Context : Codable {
60+ let type : String
61+ let content : String
62+ }
63+ }
64+
65+ private struct JetpackAIQueryResponse : Decodable {
66+ let model : String ?
67+ let choices : [ Choice ]
68+
69+ struct Choice : Codable {
70+ let index : Int
71+ let message : Message
72+ }
73+
74+ struct Message : Codable {
75+ let role : String ?
76+ let content : String
77+ }
2778}
0 commit comments