Something went wrong. Try again.
small gleam coding and persistent agent daemon with a detachable cli and a canvas ui forked from okami.mom/albedo
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285//// Copilot roster decoder boundaries: malformed rows, route precedence, and//// billed context tiers. Scripted inference cannot show a wrong tier boundary//// without a large, potentially billable request; these checks pin its exact//// calculation independently of a model turn.
import albedo/harness/extensions/github_copilot/models.{ type Model, ChatRoute, MessagesRoute, ResponsesRoute,}import gleam/listimport gleam/option.{None, Some}import gleam/stringimport gleeunit/should
const endpoint = "https://api.githubcopilot.com"
pub fn three_routes_decode_their_wire_and_limits_test() -> Nil { let body = roster([ "{\"id\":\"claude-sonnet-5\",\"name\":\"Claude Sonnet 5\"," <> "\"capabilities\":{\"type\":\"chat\",\"limits\":{" <> "\"max_context_window_tokens\":1000000,\"max_prompt_tokens\":272000," <> "\"max_output_tokens\":64000},\"supports\":{" <> "\"tool_calls\":true,\"vision\":true}}," <> "\"policy\":{\"state\":\"enabled\"}," <> "\"supported_endpoints\":[\"/v1/messages\"]," <> "\"billing\":{\"token_prices\":{\"default\":{" <> "\"max_prompt_tokens\":272000}}}}", "{\"id\":\"gpt-5.1\",\"context_length\":400000," <> "\"max_completion_tokens\":128000,\"capabilities\":{\"type\":\"chat\"," <> "\"limits\":{\"max_prompt_tokens\":272000},\"supports\":{" <> "\"tool_calls\":true}}," <> "\"supported_endpoints\":[\"/responses\",\"/chat/completions\"]}", "{\"id\":\"llama-4-maverick\",\"supported_endpoints\":" <> "[\"chat.completions\"],\"capabilities\":{\"type\":\"chat\"," <> "\"supports\":{\"tool_calls\":true}}}", ]) let assert Ok(models) = models.parse(body, endpoint) should.equal(list.length(models), 3) let assert [claude, gpt, llama] = models should.equal(claude.route, MessagesRoute) should.equal(claude.info.provider, "github-copilot") should.equal(claude.info.endpoint, Some(endpoint)) should.equal(claude.info.context_tokens, Some(336_000)) should.equal(claude.info.max_context_tokens, Some(1_000_000)) should.equal(claude.info.max_output_tokens, Some(64_000)) should.equal(gpt.route, ResponsesRoute) should.equal(gpt.info.context_tokens, Some(400_000)) should.equal(gpt.info.max_context_tokens, Some(400_000)) should.equal(llama.route, ChatRoute) should.equal(llama.info.context_tokens, None) should.equal(llama.info.max_context_tokens, None) should.equal(llama.info.max_output_tokens, None) Nil}
pub fn advertised_route_overrides_the_name_fallback_test() -> Nil { let body = roster([ // The fallback would call both of these Chat; the advertisement wins, // including for ids the fallback has never heard of. "{\"id\":\"gpt-7-nimbus\",\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"claude-haiku-latest\",\"supported_endpoints\":" <> "[\"/chat/completions\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) let assert [future, claude] = models should.equal(future.route, ResponsesRoute) should.equal(claude.route, ChatRoute) Nil}
pub fn rows_without_advertised_routes_fall_back_by_name_test() -> Nil { let body = roster([ "{\"id\":\"claude-opus-4.6\"}", "{\"id\":\"gpt-5.1\"}", "{\"id\":\"o3-mini\"}", "{\"id\":\"phi-4\"}", "{\"id\":\"Claude-Sonnet-5\"}", ]) let assert Ok(models) = models.parse(body, endpoint) should.equal(list.map(models, fn(model: Model) { model.route }), [ MessagesRoute, ResponsesRoute, ResponsesRoute, ChatRoute, MessagesRoute, ]) Nil}
pub fn non_chat_disabled_and_toolless_rows_are_dropped_test() -> Nil { let body = roster([ "{\"id\":\"text-embedding-3-large\",\"capabilities\":{\"type\":" <> "\"embeddings\"},\"supported_endpoints\":[\"chat.completions\"]}", "{\"id\":\"secret-preview\",\"policy\":{\"state\":\"disabled\"}," <> "\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"no-tools\",\"capabilities\":{\"type\":\"chat\",\"supports\":" <> "{\"tool_calls\":false}},\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"kept\",\"capabilities\":{\"type\":\"chat\"}," <> "\"supported_endpoints\":[\"responses\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) should.equal(list.map(models, fn(model: Model) { model.info.model }), [ "kept", ]) Nil}
pub fn unknown_only_advertised_routes_drop_the_row_test() -> Nil { let body = roster([ "{\"id\":\"decider\",\"supported_endpoints\":[\"decisions\"]}", "{\"id\":\"kept\",\"supported_endpoints\":[\"messages\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) let assert [kept] = models should.equal(kept.route, MessagesRoute) Nil}
pub fn an_empty_roster_invents_no_models_test() -> Nil { should.equal(models.parse("{\"data\":[]}", endpoint), Ok([])) Nil}
pub fn a_roster_past_the_row_limit_is_rejected_whole_test() -> Nil { let row = "{\"id\":\"filler\",\"supported_endpoints\":[\"responses\"]}" let at_limit = roster(list.repeat(row, models.roster_row_limit)) let assert Ok(parsed) = models.parse(at_limit, endpoint) should.equal(list.length(parsed), models.roster_row_limit) should.be_error(models.parse( roster(list.repeat(row, models.roster_row_limit + 1)), endpoint, )) Nil}
pub fn an_invalid_envelope_is_an_error_test() -> Nil { should.be_error(models.parse("{\"data\":3}", endpoint)) should.be_error(models.parse("{\"models\":[]}", endpoint)) should.be_error(models.parse("[]", endpoint)) should.be_error(models.parse("not json", endpoint)) should.be_error(models.parse("", endpoint)) Nil}
pub fn malformed_rows_are_dropped_and_valid_rows_kept_test() -> Nil { let body = roster([ "{\"id\":\"kept\",\"supported_endpoints\":[\"responses\"]}", "null", "5", "{\"name\":\"no id\"}", "{\"id\":\"\",\"supported_endpoints\":[\"responses\"]}", "{\"id\":7,\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"wrong-limit\",\"context_length\":\"128000\"," <> "\"supported_endpoints\":[\"responses\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) should.equal(list.map(models, fn(model: Model) { model.info.model }), [ "kept", ]) Nil}
pub fn default_window_keeps_the_billed_tier_and_full_maximum_test() -> Nil { // A tiered row: the default context is the billed boundary plus output, // while the advertised full window stays available for a raised cap. let tiered = one( "{\"id\":\"claude-opus-5\",\"capabilities\":{\"limits\":{" <> "\"max_context_window_tokens\":1000000,\"max_prompt_tokens\":272000," <> "\"max_output_tokens\":64000}},\"supported_endpoints\":" <> "[\"/v1/messages\"],\"billing\":{\"token_prices\":{" <> "\"default\":{\"context_max\":264000},\"long_context\":{" <> "\"max_prompt_tokens\":1000000}}}}", ) should.equal(tiered.info.context_tokens, Some(328_000)) should.equal(tiered.info.max_context_tokens, Some(1_000_000)) // A legacy row publishes only the already-capped default window: the full // window and the default window agree. let legacy = one( "{\"id\":\"gpt-4.1\",\"context_length\":128000," <> "\"capabilities\":{\"limits\":{\"max_prompt_tokens\":120000," <> "\"max_output_tokens\":16000}},\"supported_endpoints\":[" <> "\"responses\"]}", ) should.equal(legacy.info.context_tokens, Some(128_000)) should.equal(legacy.info.max_context_tokens, Some(128_000)) should.equal(legacy.info.max_output_tokens, Some(16_000)) // A prompt budget without an output limit caps nothing. let unpadded = one( "{\"id\":\"gpt-4.1-mini\",\"capabilities\":{\"limits\":" <> "{\"max_prompt_tokens\":120000}},\"supported_endpoints\":[" <> "\"responses\"]}", ) should.equal(unpadded.info.context_tokens, None) Nil}
pub fn non_positive_limits_read_as_unpublished_test() -> Nil { let body = roster([ "{\"id\":\"zeroed\",\"context_length\":0,\"max_completion_tokens\":-5," <> "\"capabilities\":{\"limits\":{\"max_context_window_tokens\":0," <> "\"max_prompt_tokens\":0,\"max_output_tokens\":0}}," <> "\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"unknown\",\"supported_endpoints\":[\"responses\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) list.each(models, fn(model: Model) { should.equal(model.info.context_tokens, None) should.equal(model.info.max_context_tokens, None) should.equal(model.info.max_output_tokens, None) }) Nil}
pub fn modalities_follow_vision_and_published_inputs_test() -> Nil { let body = roster([ "{\"id\":\"seeing\",\"capabilities\":{\"supports\":{\"vision\":true}}," <> "\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"declared\",\"input_modalities\":[\"text\",\"image\"]," <> "\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"textual\",\"input_modalities\":[\"text\"]," <> "\"supported_endpoints\":[\"responses\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) let assert [seeing, declared, textual] = models should.equal(seeing.info.input_modalities, ["text", "image"]) should.equal(declared.info.input_modalities, ["text", "image"]) should.equal(textual.info.input_modalities, ["text"]) Nil}
pub fn efforts_come_only_from_published_ladders_test() -> Nil { let body = roster([ "{\"id\":\"ladder\",\"supported_reasoning_efforts\":[\"low\",\"high\"]," <> "\"supported_endpoints\":[\"responses\"]}", "{\"id\":\"supports-ladder\",\"capabilities\":{\"supports\":{" <> "\"reasoning_efforts\":[\"medium\"]}},\"supported_endpoints\":" <> "[\"responses\"]}", "{\"id\":\"live-ladder\",\"capabilities\":{\"supports\":{" <> "\"reasoning_effort\":[\"low\",\"medium\",\"high\"]}}," <> "\"supported_endpoints\":[\"responses\"]}", // Copilot rejects reasoning parameters on Chat Completions, so a chat // row keeps no ladder even when the roster publishes one. "{\"id\":\"chat-ladder\",\"supported_reasoning_efforts\":[\"low\"]," <> "\"supported_endpoints\":[\"chat.completions\"]}", // A thinking bit is not an effort ladder. "{\"id\":\"thinker\",\"capabilities\":{\"supports\":{\"thinking\":true}}," <> "\"supported_endpoints\":[\"responses\"]}", ]) let assert Ok(models) = models.parse(body, endpoint) let assert [ladder, supports_ladder, live_ladder, chat_ladder, thinker] = models should.equal(ladder.info.efforts, ["low", "high"]) should.equal(supports_ladder.info.efforts, ["medium"]) should.equal(live_ladder.info.efforts, ["low", "medium", "high"]) should.equal(chat_ladder.info.efforts, []) should.equal(thinker.info.efforts, []) Nil}
pub fn parsing_attributes_every_model_to_the_endpoint_test() -> Nil { let model = one("{\"id\":\"gpt-5.1\",\"supported_endpoints\":[\"responses\"]}") should.equal(model.info.provider, "github-copilot") should.equal(model.info.endpoint, Some(endpoint)) should.equal(model.info.source, "GitHub Copilot /models") should.equal(model.info.environment, []) Nil}
fn roster(rows: List(String)) -> String { "{\"data\":[" <> string.join(rows, ",") <> "]}"}
fn one(row: String) -> Model { let assert Ok([model]) = models.parse(roster([row]), endpoint) model}