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
6let src = Logs.Src.create "claude.control" ~doc:"Claude control messages"
7
8module Log = (val Logs.src_log src : Logs.LOG)
9
10type t = {
11 request_id : string;
12 subtype : string;
13 data : Jsont.json;
14 unknown : Unknown.t;
15}
16
17let jsont =
18 Jsont.Object.map ~kind:"Control" (fun request_id subtype data unknown ->
19 { request_id; subtype; data; unknown })
20 |> Jsont.Object.mem "request_id" Jsont.string ~enc:(fun t -> t.request_id)
21 |> Jsont.Object.mem "subtype" Jsont.string ~enc:(fun t -> t.subtype)
22 |> Jsont.Object.mem "data" Jsont.json ~enc:(fun t -> t.data)
23 |> Jsont.Object.keep_unknown Jsont.json_mems ~enc:(fun t -> t.unknown)
24 |> Jsont.Object.finish
25
26let create ~request_id ~subtype ~data =
27 { request_id; subtype; data; unknown = Unknown.empty }
28
29let request_id t = t.request_id
30let subtype t = t.subtype
31let data t = t.data
32
33let to_json t =
34 Jsont_bytesrw.encode_string ~format:Jsont.Minify jsont t
35 |> Err.get_ok ~msg:"Control.to_json: "
36 |> Jsont_bytesrw.decode_string' Jsont.json
37 |> Result.map_error Jsont.Error.to_string
38 |> Err.get_ok ~msg:"Control.to_json: "
39
40let of_json json =
41 Jsont_bytesrw.encode_string ~format:Jsont.Minify Jsont.json json
42 |> Err.get_ok' ~msg:"Control.of_json: "
43 |> Jsont_bytesrw.decode_string jsont
44 |> Err.get_ok' ~msg:"Control.of_json: "
45
46let log_received t =
47 Log.debug (fun m ->
48 m "Received control message: %a" (Jsont.pp_value jsont ()) t)
49
50let log_sending t =
51 Log.debug (fun m ->
52 m "Sending control message: %a" (Jsont.pp_value jsont ()) t)