Implement optional discussion mode
This commit is contained in:
@@ -68,6 +68,34 @@ final class OpenAIClientTests: XCTestCase {
|
||||
XCTAssertEqual(recordedURL, overrideURL)
|
||||
}
|
||||
|
||||
func testDiscussSongProjectUsesAdapterAndReturnsQuestions() async throws {
|
||||
let transport = RecordingOpenAITransport(
|
||||
statusCode: 200,
|
||||
responseData: try JSONEncoder().encode(MockOpenAIResponse(text: "Should the chorus be intimate or anthemic?"))
|
||||
)
|
||||
let configuration = OpenAIClientConfiguration(
|
||||
apiKey: "test-api-key",
|
||||
endpointURL: URL(string: "https://api.example.test/v1/configured")!,
|
||||
model: "configured-model"
|
||||
)
|
||||
let client = OpenAIClient(
|
||||
configuration: configuration,
|
||||
adapter: MockOpenAIClientAdapter(),
|
||||
transport: transport
|
||||
)
|
||||
|
||||
let result = try await client.discussSongProject(
|
||||
from: SongProjectDiscussionRequest(
|
||||
context: AIRequestContext(userInstruction: "Ask before deciding."),
|
||||
project: SongProject(title: "Discussion", idea: "Plan this", conversationMode: .discuss)
|
||||
)
|
||||
)
|
||||
let requestBodyString = await transport.requestBodyString
|
||||
|
||||
XCTAssertEqual(result.questions, ["Should the chorus be intimate or anthemic?"])
|
||||
XCTAssertEqual(requestBodyString, "discuss|configured-model|Ask before deciding.")
|
||||
}
|
||||
|
||||
func testClientRejectsMissingAPIKeyBeforeSendingRequest() async throws {
|
||||
let transport = RecordingOpenAITransport(
|
||||
statusCode: 200,
|
||||
@@ -175,6 +203,21 @@ private struct MockOpenAIClientAdapter: OpenAIClientAdapter {
|
||||
)
|
||||
}
|
||||
|
||||
func makeSongProjectDiscussionRequest(
|
||||
_ request: SongProjectDiscussionRequest,
|
||||
configuration: OpenAIClientConfiguration
|
||||
) throws -> OpenAIClientRequest {
|
||||
OpenAIClientRequest(
|
||||
url: overrideURL,
|
||||
body: Data("discuss|\(configuration.model ?? "")|\(request.context.userInstruction)".utf8)
|
||||
)
|
||||
}
|
||||
|
||||
func decodeSongProjectDiscussionResult(from data: Data) throws -> SongProjectDiscussionResult {
|
||||
let response = try JSONDecoder().decode(MockOpenAIResponse.self, from: data)
|
||||
return SongProjectDiscussionResult(questions: [response.text])
|
||||
}
|
||||
|
||||
func makeLyricsRevisionRequest(
|
||||
_ request: LyricsRevisionRequest,
|
||||
configuration: OpenAIClientConfiguration
|
||||
|
||||
Reference in New Issue
Block a user