OCaml Claude SDK using Eio and Jsont
at main 52 lines 1.8 kB view raw
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)