OCaml Claude SDK using Eio and Jsont
at main 74 lines 2.1 kB view raw
1(*--------------------------------------------------------------------------- 2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved. 3 SPDX-License-Identifier: ISC 4 ---------------------------------------------------------------------------*) 5 6module J = Jsont.Json 7 8type t = { 9 name : string; 10 description : string; 11 input_schema : Jsont.json; 12 handler : Tool_input.t -> (Jsont.json, string) result; 13} 14 15let create ~name ~description ~input_schema ~handler = 16 { name; description; input_schema; handler } 17 18let name t = t.name 19let description t = t.description 20let input_schema t = t.input_schema 21let call t input = t.handler input 22 23(* Convenience constructors using Jsont.Json builders *) 24 25let text_result s = 26 J.list 27 [ 28 J.object' 29 [ 30 J.mem (J.name "type") (J.string "text"); 31 J.mem (J.name "text") (J.string s); 32 ]; 33 ] 34 35let error_result s = 36 J.list 37 [ 38 J.object' 39 [ 40 J.mem (J.name "type") (J.string "text"); 41 J.mem (J.name "text") (J.string s); 42 J.mem (J.name "is_error") (J.bool true); 43 ]; 44 ] 45 46(* Schema helpers *) 47 48let schema_string = J.object' [ J.mem (J.name "type") (J.string "string") ] 49let schema_int = J.object' [ J.mem (J.name "type") (J.string "integer") ] 50let schema_number = J.object' [ J.mem (J.name "type") (J.string "number") ] 51let schema_bool = J.object' [ J.mem (J.name "type") (J.string "boolean") ] 52 53let schema_array item_schema = 54 J.object' 55 [ 56 J.mem (J.name "type") (J.string "array"); 57 J.mem (J.name "items") item_schema; 58 ] 59 60let schema_string_enum values = 61 J.object' 62 [ 63 J.mem (J.name "type") (J.string "string"); 64 J.mem (J.name "enum") (J.list (List.map J.string values)); 65 ] 66 67let schema_object props ~required = 68 J.object' 69 [ 70 J.mem (J.name "type") (J.string "object"); 71 J.mem (J.name "properties") 72 (J.object' (List.map (fun (k, v) -> J.mem (J.name k) v) props)); 73 J.mem (J.name "required") (J.list (List.map J.string required)); 74 ]