My agentic slop goes here. Not intended for anyone else!
1open Eio.Std
2
3let src = Logs.Src.create "camel_jokes" ~doc:"Camel joke competition"
4module Log = (val Logs.src_log src : Logs.LOG)
5
6let process_claude_response client name =
7 Log.info (fun m -> m "=== %s's Response ===" name);
8 let messages = Claude.Client.receive_all client in
9 List.iter (fun msg ->
10 match msg with
11 | Claude.Message.Assistant msg ->
12 List.iter (function
13 | Claude.Content_block.Text t ->
14 let text = Claude.Content_block.Text.text t in
15 Log.app (fun m -> m "%s: %s" name text)
16 | Claude.Content_block.Tool_use t ->
17 Log.debug (fun m -> m "%s using tool: %s" name
18 (Claude.Content_block.Tool_use.name t))
19 | Claude.Content_block.Thinking t ->
20 Log.debug (fun m -> m "%s thinking: %s" name
21 (Claude.Content_block.Thinking.thinking t))
22 | _ -> ()
23 ) (Claude.Message.Assistant.content msg);
24 Log.debug (fun m -> m "%s using model: %s" name
25 (Claude.Message.Assistant.model msg))
26 | Claude.Message.Result msg ->
27 if Claude.Message.Result.is_error msg then
28 Log.err (fun m -> m "Error from %s!" name)
29 else
30 (match Claude.Message.Result.total_cost_usd msg with
31 | Some cost ->
32 Log.info (fun m -> m "%s's joke cost: $%.6f" name cost)
33 | None -> ());
34 Log.debug (fun m -> m "%s session: %s, duration: %dms"
35 name
36 (Claude.Message.Result.session_id msg)
37 (Claude.Message.Result.duration_ms msg))
38 | Claude.Message.System _ ->
39 (* System messages are already logged by the library *)
40 ()
41 | Claude.Message.User _ ->
42 (* User messages are already logged by the library *)
43 ()
44 ) messages
45
46let run_claude ~sw ~env name prompt =
47 Log.info (fun m -> m "🐪 Starting %s..." name);
48 let options = Claude.Options.create ~model:(Claude.Model.of_string "sonnet") ~allowed_tools:[] () in
49
50 let client = Claude.Client.create ~options ~sw
51 ~process_mgr:env#process_mgr
52 () in
53
54 Claude.Client.query client prompt;
55 process_claude_response client name
56
57let main ~env =
58 Switch.run @@ fun sw ->
59
60 Log.app (fun m -> m "🐪 Starting the Great Camel Joke Competition! 🐪");
61 Log.app (fun m -> m "================================================\n");
62
63 let prompts = [
64 "Claude 1", "Tell me a short, funny joke about camels! Make it original and clever.";
65 "Claude 2", "Give me your best camel joke - something witty and unexpected!";
66 "Claude 3", "Share a hilarious camel joke that will make everyone laugh!";
67 ] in
68
69 (* Run all three Claudes concurrently *)
70 Fiber.all (
71 List.map (fun (name, prompt) ->
72 fun () -> run_claude ~sw ~env name prompt
73 ) prompts
74 );
75
76 Log.app (fun m -> m "\n================================================");
77 Log.app (fun m -> m "🎉 The Camel Joke Competition is complete! 🎉")
78
79(* Command-line interface *)
80open Cmdliner
81
82let main_term env =
83 let setup_log style_renderer level =
84 Fmt_tty.setup_std_outputs ?style_renderer ();
85 Logs.set_level level;
86 Logs.set_reporter (Logs_fmt.reporter ());
87 (* Set default to App level if not specified *)
88 if level = None then Logs.set_level (Some Logs.App);
89 (* Enable debug for Client module if in debug mode *)
90 if level = Some Logs.Debug then
91 Logs.Src.set_level Claude.Client.src (Some Logs.Debug)
92 in
93 let run style level =
94 setup_log style level;
95 main ~env
96 in
97 Term.(const run $ Fmt_cli.style_renderer () $ Logs_cli.level ())
98
99let cmd env =
100 let doc = "Run the Great Camel Joke Competition using Claude" in
101 let man = [
102 `S Manpage.s_description;
103 `P "This program runs three concurrent Claude instances to generate camel jokes.";
104 `P "Use $(b,-v) or $(b,--verbosity=info) to see RPC message traffic.";
105 `P "Use $(b,-vv) or $(b,--verbosity=debug) to see all internal operations.";
106 `S Manpage.s_examples;
107 `P "Run with normal output:";
108 `Pre " $(mname)";
109 `P "Run with info-level logging (RPC traffic):";
110 `Pre " $(mname) -v";
111 `Pre " $(mname) --verbosity=info";
112 `P "Run with debug logging (all operations):";
113 `Pre " $(mname) -vv";
114 `Pre " $(mname) --verbosity=debug";
115 `P "Enable debug for specific modules:";
116 `Pre " LOGS='claude.transport=debug' $(mname)";
117 `Pre " LOGS='claude.message=info,camel_jokes=debug' $(mname)";
118 `S Manpage.s_bugs;
119 `P "Report bugs at https://github.com/your-repo/issues";
120 ] in
121 let info = Cmd.info "camel_jokes" ~version:"1.0" ~doc ~man in
122 Cmd.v info (main_term env)
123
124let () =
125 Eio_main.run @@ fun env ->
126 exit (Cmd.eval (cmd env))