OCaml Claude SDK using Eio and Jsont
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6type t =
7 [ `Sonnet_4_6
8 | `Sonnet_4_5
9 | `Sonnet_4
10 | `Sonnet_3_5
11 | `Opus_4_6
12 | `Opus_4_5
13 | `Opus_4_1
14 | `Opus_4
15 | `Haiku_4_5
16 | `Haiku_4
17 | `Custom of string ]
18
19let to_string = function
20 | `Sonnet_4_6 -> "claude-sonnet-4-6"
21 | `Sonnet_4_5 -> "claude-sonnet-4-5"
22 | `Sonnet_4 -> "claude-sonnet-4"
23 | `Sonnet_3_5 -> "claude-sonnet-3-5"
24 | `Opus_4_6 -> "claude-opus-4-6"
25 | `Opus_4_5 -> "claude-opus-4-5"
26 | `Opus_4_1 -> "claude-opus-4-1"
27 | `Opus_4 -> "claude-opus-4"
28 | `Haiku_4_5 -> "claude-haiku-4-5"
29 | `Haiku_4 -> "claude-haiku-4"
30 | `Custom s -> s
31
32let pp ppf t = Format.pp_print_string ppf (to_string t)
33
34let of_string = function
35 | "claude-sonnet-4-6" | "sonnet" -> `Sonnet_4_6
36 | "claude-sonnet-4-5" -> `Sonnet_4_5
37 | "claude-sonnet-4" -> `Sonnet_4
38 | "claude-sonnet-3-5" -> `Sonnet_3_5
39 | "claude-opus-4-6" | "opus" -> `Opus_4_6
40 | "claude-opus-4-5" -> `Opus_4_5
41 | "claude-opus-4-1" -> `Opus_4_1
42 | "claude-opus-4" -> `Opus_4
43 | "claude-haiku-4-5" | "haiku" -> `Haiku_4_5
44 | "claude-haiku-4" -> `Haiku_4
45 | s -> `Custom s
46
47let json : t Json.codec =
48 let enc = to_string in
49 let open Json.Codec in
50 map ~kind:"Model" ~dec:of_string ~enc string