Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit ade8078

Browse files
committed
Add makePostContent(fromPlainText
1 parent 00b651e commit ade8078

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

Sources/CoreAPI/WordPressComRestApi.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ open class WordPressComRestApi: NSObject {
309309
return "\(String(describing: oAuthToken)),\(String(describing: userAgent))".hashValue
310310
}
311311

312-
private func requestBuilder(URLString: String) throws -> HTTPRequestBuilder {
312+
func requestBuilder(URLString: String) throws -> HTTPRequestBuilder {
313313
guard let url = URL(string: URLString, relativeTo: baseURL) else {
314314
throw URLError(.badURL)
315315
}
@@ -414,9 +414,9 @@ open class WordPressComRestApi: NSObject {
414414
return await perform(request: builder, fulfilling: progress, decoder: decoder)
415415
}
416416

417-
private func perform<T>(
417+
func perform<T>(
418418
request: HTTPRequestBuilder,
419-
fulfilling progress: Progress?,
419+
fulfilling progress: Progress? = nil,
420420
decoder: @escaping (Data) throws -> T,
421421
taskCreated: ((Int) -> Void)? = nil,
422422
session: URLSession? = nil

Sources/WordPressKit/Services/JetpackAIServiceRemote.swift

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)