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 }