1#pragma once
2
3#include "chat.h"
4#include "peg-parser.h"
5
6class common_chat_peg_builder : public common_peg_parser_builder {
7 public:
8 static constexpr const char * REASONING_BLOCK = "reasoning-block";
9 static constexpr const char * REASONING = "reasoning";
10 static constexpr const char * CONTENT = "content";
11
12 common_peg_parser reasoning_block(const common_peg_parser & p) { return tag(REASONING_BLOCK, p); }
13 common_peg_parser reasoning(const common_peg_parser & p) { return tag(REASONING, p); }
14 common_peg_parser content(const common_peg_parser & p) { return tag(CONTENT, p); }
15};
16
17inline common_peg_arena build_chat_peg_parser(const std::function<common_peg_parser(common_chat_peg_builder & builder)> & fn) {
18 common_chat_peg_builder builder;
19 builder.set_root(fn(builder));
20 return builder.build();
21}
22
23class common_chat_peg_mapper {
24 public:
25 common_chat_msg & result;
26
27 common_chat_peg_mapper(common_chat_msg & msg) : result(msg) {}
28
29 virtual void from_ast(const common_peg_ast_arena & arena, const common_peg_parse_result & result);
30 virtual void map(const common_peg_ast_node & node);
31};
32
33class common_chat_peg_native_builder : public common_chat_peg_builder {
34 public:
35 static constexpr const char * TOOL = "tool";
36 static constexpr const char * TOOL_OPEN = "tool-open";
37 static constexpr const char * TOOL_CLOSE = "tool-close";
38 static constexpr const char * TOOL_ID = "tool-id";
39 static constexpr const char * TOOL_NAME = "tool-name";
40 static constexpr const char * TOOL_ARGS = "tool-args";
41
42 common_peg_parser tool(const common_peg_parser & p) { return tag(TOOL, p); }
43 common_peg_parser tool_open(const common_peg_parser & p) { return atomic(tag(TOOL_OPEN, p)); }
44 common_peg_parser tool_close(const common_peg_parser & p) { return atomic(tag(TOOL_CLOSE, p)); }
45 common_peg_parser tool_id(const common_peg_parser & p) { return atomic(tag(TOOL_ID, p)); }
46 common_peg_parser tool_name(const common_peg_parser & p) { return atomic(tag(TOOL_NAME, p)); }
47 common_peg_parser tool_args(const common_peg_parser & p) { return tag(TOOL_ARGS, p); }
48};
49
50class common_chat_peg_native_mapper : public common_chat_peg_mapper {
51 common_chat_tool_call * current_tool;
52
53 public:
54 common_chat_peg_native_mapper(common_chat_msg & msg) : common_chat_peg_mapper(msg) {}
55
56 void map(const common_peg_ast_node & node) override;
57};
58
59inline common_peg_arena build_chat_peg_native_parser(const std::function<common_peg_parser(common_chat_peg_native_builder & builder)> & fn) {
60 common_chat_peg_native_builder builder;
61 builder.set_root(fn(builder));
62 return builder.build();
63}
64
65class common_chat_peg_constructed_builder : public common_chat_peg_builder {
66 public:
67 static constexpr const char * TOOL = "tool";
68 static constexpr const char * TOOL_OPEN = "tool-open";
69 static constexpr const char * TOOL_CLOSE = "tool-close";
70 static constexpr const char * TOOL_NAME = "tool-name";
71 static constexpr const char * TOOL_ARG = "tool-arg";
72 static constexpr const char * TOOL_ARG_OPEN = "tool-arg-open";
73 static constexpr const char * TOOL_ARG_CLOSE = "tool-arg-close";
74 static constexpr const char * TOOL_ARG_NAME = "tool-arg-name";
75 static constexpr const char * TOOL_ARG_STRING_VALUE = "tool-arg-string-value";
76 static constexpr const char * TOOL_ARG_JSON_VALUE = "tool-arg-json-value";
77
78 common_peg_parser tool(const common_peg_parser & p) { return tag(TOOL, p); }
79 common_peg_parser tool_open(const common_peg_parser & p) { return atomic(tag(TOOL_OPEN, p)); }
80 common_peg_parser tool_close(const common_peg_parser & p) { return atomic(tag(TOOL_CLOSE, p)); }
81 common_peg_parser tool_name(const common_peg_parser & p) { return atomic(tag(TOOL_NAME, p)); }
82 common_peg_parser tool_arg(const common_peg_parser & p) { return tag(TOOL_ARG, p); }
83 common_peg_parser tool_arg_open(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_OPEN, p)); }
84 common_peg_parser tool_arg_close(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_CLOSE, p)); }
85 common_peg_parser tool_arg_name(const common_peg_parser & p) { return atomic(tag(TOOL_ARG_NAME, p)); }
86 common_peg_parser tool_arg_string_value(const common_peg_parser & p) { return tag(TOOL_ARG_STRING_VALUE, p); }
87 common_peg_parser tool_arg_json_value(const common_peg_parser & p) { return tag(TOOL_ARG_JSON_VALUE, p); }
88};
89
90class common_chat_peg_constructed_mapper : public common_chat_peg_mapper {
91 common_chat_tool_call * current_tool;
92 int arg_count = 0;
93 bool needs_closing_quote = false;
94
95 public:
96 common_chat_peg_constructed_mapper(common_chat_msg & msg) : common_chat_peg_mapper(msg) {}
97
98 void map(const common_peg_ast_node & node) override;
99};
100
101inline common_peg_arena build_chat_peg_constructed_parser(const std::function<common_peg_parser(common_chat_peg_constructed_builder & builder)> & fn) {
102 common_chat_peg_constructed_builder builder;
103 builder.set_root(fn(builder));
104 return builder.build();
105}