123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101typemeta={id:Provider.id;name:string;signatures:stringlist;env_key:string;legacy_env_key:stringoption;base_url:stringoption;}letall=[{id=Provider.Openai;name="OpenAI";signatures=["gpt";"o1";"o3";"o4";"chatgpt"];env_key="OPENAI_API_KEY";legacy_env_key=Some"API_KEY_OPENAI";base_url=Some"https://api.openai.com/v1";};{id=Provider.Anthropic;name="Anthropic";signatures=["claude"];env_key="ANTHROPIC_API_KEY";legacy_env_key=Some"API_KEY_ANTHROPIC";base_url=Some"https://api.anthropic.com/v1";};{id=Provider.Xai;name="xAI";signatures=["grok"];env_key="XAI_API_KEY";legacy_env_key=Some"API_KEY_XAI";base_url=Some"https://api.x.ai/v1";};{id=Provider.Meta;name="Meta";signatures=["muse"];env_key="META_API_KEY";(* Meta's own docs and Muse Code use MODEL_API_KEY. *)legacy_env_key=Some"MODEL_API_KEY";base_url=Some"https://api.meta.ai/v1";};{id=Provider.Local;name="Local";signatures=[];env_key="LOCAL_API_KEY";legacy_env_key=None;base_url=None;};{id=Provider.Openrouter;name="OpenRouter";signatures=[];env_key="OPENROUTER_API_KEY";legacy_env_key=Some"API_KEY_OPENROUTER";base_url=Some"https://openrouter.ai/api/v1";};]letfindid=matchList.find_opt(funmeta->meta.id=id)allwith|Somemeta->meta|None->invalid_arg"unknown provider id"letlowercase_asciivalue=String.lowercase_asciivalueletcontainshaystackneedle=lethaystack=lowercase_asciihaystackinletneedle=lowercase_asciineedleinletneedle_len=String.lengthneedleinlethaystack_len=String.lengthhaystackinletrecloopindex=ifneedle_len=0thentrueelseifindex+needle_len>haystack_lenthenfalseelseifString.subhaystackindexneedle_len=needlethentrueelseloop(index+1)inloop0letdetect_by_modelmodel=ifcontainsmodel"/"thenSomeProvider.Openrouterelseall|>List.find_opt(funmeta->meta.signatures|>List.exists(funsignature->containsmodelsignature))|>Option.map(funmeta->meta.id)letresolve_by_model~local_activemodel=matchdetect_by_modelmodelwith|Some_asprovider->provider|None->iflocal_activethenSomeProvider.LocalelseNoneletenv_keysid=letmeta=findidin(meta.env_key,meta.legacy_env_key)letbase_urlid=(findid).base_url