You might already know this and I realise that you probably just haven't gotten around to this, but logprobs is not working as expected in chat_openai().
library(elmer)
chat <- chat_openai(api_args = list(logprobs = TRUE))
#> Using model = "gpt-4o-mini".
chat$chat("Hi")
#> Hello! How can I assist you today?
chat$last_turn()@json$choices
#> [[1]]
#> [[1]]$index
#> [1] 0
#>
#> [[1]]$delta
#> [[1]]$delta$role
#> [1] "assistant"
#>
#> [[1]]$delta$content
#> [1] "Hello! How can I assist you today?"
#>
#> [[1]]$delta$refusal
#> NULL
#>
#>
#> [[1]]$logprobs
#> NULL
#>
#> [[1]]$finish_reason
#> [1] "stop"
I expected the output to include each token and log prob like below.
library(httr2)
json <- request(base_url = "https://api.openai.com/v1/chat/completions") |>
req_headers('Authorization' = paste('Bearer', Sys.getenv("OPENAI_API_KEY")),
'Content-Type' = 'application/json') |>
req_body_json(data = list(model = "gpt-4o-mini",
messages = list(list(role = "user",
content = "Hi")),
logprobs = TRUE)) |>
req_perform() |>
resp_body_json()
json$choices
#> [[1]]
#> [[1]]$index
#> [1] 0
#>
#> [[1]]$message
#> [[1]]$message$role
#> [1] "assistant"
#>
#> [[1]]$message$content
#> [1] "Hello! How can I assist you today?"
#>
#> [[1]]$message$refusal
#> NULL
#>
#>
#> [[1]]$logprobs
#> [[1]]$logprobs$content
#> [[1]]$logprobs$content[[1]]
#> [[1]]$logprobs$content[[1]]$token
#> [1] "Hello"
#>
#> [[1]]$logprobs$content[[1]]$logprob
#> [1] -0.0002613358
#>
#> [[1]]$logprobs$content[[1]]$bytes
#> [[1]]$logprobs$content[[1]]$bytes[[1]]
#> [1] 72
#>
#> [[1]]$logprobs$content[[1]]$bytes[[2]]
#> [1] 101
#>
#> [[1]]$logprobs$content[[1]]$bytes[[3]]
#> [1] 108
#>
#> [[1]]$logprobs$content[[1]]$bytes[[4]]
#> [1] 108
#>
#> [[1]]$logprobs$content[[1]]$bytes[[5]]
#> [1] 111
#>
#>
#> [[1]]$logprobs$content[[1]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[2]]
#> [[1]]$logprobs$content[[2]]$token
#> [1] "!"
#>
#> [[1]]$logprobs$content[[2]]$logprob
#> [1] 0
#>
#> [[1]]$logprobs$content[[2]]$bytes
#> [[1]]$logprobs$content[[2]]$bytes[[1]]
#> [1] 33
#>
#>
#> [[1]]$logprobs$content[[2]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[3]]
#> [[1]]$logprobs$content[[3]]$token
#> [1] " How"
#>
#> [[1]]$logprobs$content[[3]]$logprob
#> [1] -2.458482e-06
#>
#> [[1]]$logprobs$content[[3]]$bytes
#> [[1]]$logprobs$content[[3]]$bytes[[1]]
#> [1] 32
#>
#> [[1]]$logprobs$content[[3]]$bytes[[2]]
#> [1] 72
#>
#> [[1]]$logprobs$content[[3]]$bytes[[3]]
#> [1] 111
#>
#> [[1]]$logprobs$content[[3]]$bytes[[4]]
#> [1] 119
#>
#>
#> [[1]]$logprobs$content[[3]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[4]]
#> [[1]]$logprobs$content[[4]]$token
#> [1] " can"
#>
#> [[1]]$logprobs$content[[4]]$logprob
#> [1] -1.028038e-06
#>
#> [[1]]$logprobs$content[[4]]$bytes
#> [[1]]$logprobs$content[[4]]$bytes[[1]]
#> [1] 32
#>
#> [[1]]$logprobs$content[[4]]$bytes[[2]]
#> [1] 99
#>
#> [[1]]$logprobs$content[[4]]$bytes[[3]]
#> [1] 97
#>
#> [[1]]$logprobs$content[[4]]$bytes[[4]]
#> [1] 110
#>
#>
#> [[1]]$logprobs$content[[4]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[5]]
#> [[1]]$logprobs$content[[5]]$token
#> [1] " I"
#>
#> [[1]]$logprobs$content[[5]]$logprob
#> [1] 0
#>
#> [[1]]$logprobs$content[[5]]$bytes
#> [[1]]$logprobs$content[[5]]$bytes[[1]]
#> [1] 32
#>
#> [[1]]$logprobs$content[[5]]$bytes[[2]]
#> [1] 73
#>
#>
#> [[1]]$logprobs$content[[5]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[6]]
#> [[1]]$logprobs$content[[6]]$token
#> [1] " assist"
#>
#> [[1]]$logprobs$content[[6]]$logprob
#> [1] -0.0009115827
#>
#> [[1]]$logprobs$content[[6]]$bytes
#> [[1]]$logprobs$content[[6]]$bytes[[1]]
#> [1] 32
#>
#> [[1]]$logprobs$content[[6]]$bytes[[2]]
#> [1] 97
#>
#> [[1]]$logprobs$content[[6]]$bytes[[3]]
#> [1] 115
#>
#> [[1]]$logprobs$content[[6]]$bytes[[4]]
#> [1] 115
#>
#> [[1]]$logprobs$content[[6]]$bytes[[5]]
#> [1] 105
#>
#> [[1]]$logprobs$content[[6]]$bytes[[6]]
#> [1] 115
#>
#> [[1]]$logprobs$content[[6]]$bytes[[7]]
#> [1] 116
#>
#>
#> [[1]]$logprobs$content[[6]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[7]]
#> [[1]]$logprobs$content[[7]]$token
#> [1] " you"
#>
#> [[1]]$logprobs$content[[7]]$logprob
#> [1] 0
#>
#> [[1]]$logprobs$content[[7]]$bytes
#> [[1]]$logprobs$content[[7]]$bytes[[1]]
#> [1] 32
#>
#> [[1]]$logprobs$content[[7]]$bytes[[2]]
#> [1] 121
#>
#> [[1]]$logprobs$content[[7]]$bytes[[3]]
#> [1] 111
#>
#> [[1]]$logprobs$content[[7]]$bytes[[4]]
#> [1] 117
#>
#>
#> [[1]]$logprobs$content[[7]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[8]]
#> [[1]]$logprobs$content[[8]]$token
#> [1] " today"
#>
#> [[1]]$logprobs$content[[8]]$logprob
#> [1] 0
#>
#> [[1]]$logprobs$content[[8]]$bytes
#> [[1]]$logprobs$content[[8]]$bytes[[1]]
#> [1] 32
#>
#> [[1]]$logprobs$content[[8]]$bytes[[2]]
#> [1] 116
#>
#> [[1]]$logprobs$content[[8]]$bytes[[3]]
#> [1] 111
#>
#> [[1]]$logprobs$content[[8]]$bytes[[4]]
#> [1] 100
#>
#> [[1]]$logprobs$content[[8]]$bytes[[5]]
#> [1] 97
#>
#> [[1]]$logprobs$content[[8]]$bytes[[6]]
#> [1] 121
#>
#>
#> [[1]]$logprobs$content[[8]]$top_logprobs
#> list()
#>
#>
#> [[1]]$logprobs$content[[9]]
#> [[1]]$logprobs$content[[9]]$token
#> [1] "?"
#>
#> [[1]]$logprobs$content[[9]]$logprob
#> [1] -1.936127e-07
#>
#> [[1]]$logprobs$content[[9]]$bytes
#> [[1]]$logprobs$content[[9]]$bytes[[1]]
#> [1] 63
#>
#>
#> [[1]]$logprobs$content[[9]]$top_logprobs
#> list()
#>
#>
#>
#> [[1]]$logprobs$refusal
#> NULL
#>
#>
#> [[1]]$finish_reason
#> [1] "stop"
Created on 2024-10-11 with reprex v2.1.1
You might already know this and I realise that you probably just haven't gotten around to this, but
logprobsis not working as expected inchat_openai().I expected the output to include each token and log prob like below.
Created on 2024-10-11 with reprex v2.1.1