test_that("can chat in parallel", { chat <- chat_openai_test() chats <- parallel_chat(chat, list("What's 1 + 1?", "What's 2 + 2?")) expect_type(chats, "list") expect_length(chats, 2) expect_s3_class(chats[[1]], "Chat") expect_s3_class(chats[[2]], "Chat") expect_equal(chats[[1]]$last_turn()@contents[[1]]@text, "2") expect_equal(chats[[2]]$last_turn()@contents[[1]]@text, "4") }) test_that("can call tools in parallel", { prompts <- rep(list("Roll the dice, please! Reply with 'You rolled ____'"), 2) chat <- chat_openai_test() chat$register_tool(tool(counter(), "Rolls a six-sided die.", .name = "roll")) chats <- parallel_chat(chat, prompts) turns_1 <- chats[[1]]$get_turns() expect_s3_class(turns_1[[2]]@contents[[1]], "ellmer::ContentToolRequest") expect_s3_class(turns_1[[3]]@contents[[1]], "ellmer::ContentToolResult") expect_equal(contents_text(turns_1[[4]]), "You rolled 1") turns_1 <- chats[[2]]$get_turns() expect_equal(contents_text(turns_1[[4]]), "You rolled 2") }) test_that("can have uneven number of turns", { prompts <- list( "Roll the dice, please! Reply with 'You rolled ____'", "reply with the word 'boop'", "Roll the dice, please! Reply with 'You rolled ____'", "reply with the word 'beep'" ) chat <- chat_openai_test() chat$register_tool(tool(counter(), "Rolls a six-sided die.", .name = "roll")) chats <- parallel_chat(chat, prompts) lengths <- map_int(chats, \(chat) length(chat$get_turns())) expect_equal(lengths, c(4, 2, 4, 2)) text <- map_chr(chats, \(chat) chat$last_turn()@text) expect_equal(text, c("You rolled 1", "boop", "You rolled 2", "beep")) }) # structured data -------------------------------------------------------------- test_that("can extract data in parallel", { person <- type_object(name = type_string(), age = type_integer()) chat <- chat_openai_test() data <- parallel_chat_structured( chat, list( "John, age 15, won first prize", "Jane, age 16, won second prize" ), type = person ) expect_equal(data, data.frame(name = c("John", "Jane"), age = c(15, 16))) }) test_that("can get tokens and/or cost", { # These are pretty weak, but it's hard to know how to do better. person <- type_object(name = type_string(), age = type_integer()) chat <- chat_openai_test() data <- parallel_chat_structured( chat, list("John, age 15", "Jane, age 16"), type = person, include_tokens = TRUE ) expect_contains(names(data), c("input_tokens", "output_tokens")) expect_equal(data$input_tokens > 0, c(TRUE, TRUE)) expect_equal(data$output_tokens > 0, c(TRUE, TRUE)) data <- parallel_chat_structured( chat, list("John, age 15", "Jane, age 16"), type = person, include_cost = TRUE ) expect_contains(names(data), "cost") expect_equal(data$cost > 0, c(TRUE, TRUE)) data <- parallel_chat_structured( chat, list("John, age 15", "Jane, age 16"), type = person, include_cost = TRUE, include_tokens = TRUE ) expect_contains(names(data), c("input_tokens", "output_tokens", "cost")) })