Packages

A simple and incomplete client library for OpenRouter

Current section

Files

Jump to
openrouter_client src openrouter_client.gleam
Raw

src/openrouter_client.gleam

import gleam/http
import gleam/http/request
import gleam/httpc
import gleam/json.{array, object, string}
import gleam/list
import gleam/option
import gleam/result
import openrouter_client/internal.{
HttpRequestError, Misc, decode_openrouter_response,
}
pub type Client {
Client(api_key: String, model: String, system_prompt: option.Option(String))
}
/// Create a new Openrouter client
/// Takes in the api key, a model name and a optional system prompt
pub fn new(api_key: String, model: String, system_prompt: option.Option(String)) {
Client(api_key, model, system_prompt)
}
pub fn send(client: Client, prompt: String) {
use base_req <- result.try(
request.to("https://openrouter.ai/api/v1/chat/completions")
|> result.map_error(fn(_) { Misc }),
)
let req =
base_req
|> request.set_body(openrouter_request_to_json_string(
client.model,
client.system_prompt,
prompt,
))
|> request.set_method(http.Post)
|> request.set_header("content-type", "application/json")
|> request.set_header("Authorization", "Bearer " <> client.api_key)
use resp <- result.try(
httpc.send(req)
|> result.map_error(fn(_) {
HttpRequestError("Could not make request to OpenRouter")
}),
)
decode_openrouter_response(resp.body)
}
fn openrouter_request_to_json_string(model, system_prompt, prompt) {
let messages = case system_prompt {
option.Some(system_prompt) -> {
[[#("role", string("system")), #("content", string(system_prompt))]]
}
option.None -> {
[]
}
}
let messages =
messages
|> list.append([[#("role", string("user")), #("content", string(prompt))]])
object([
#("model", string(model)),
#("messages", array(messages, of: json.object)),
])
|> json.to_string
}