| #pragma once |
|
|
| #include "chat.h" |
| #include "chat-parser-xml-toolcall.h" |
| #include "json-partial.h" |
| #include "regex-partial.h" |
|
|
| #include <nlohmann/json_fwd.hpp> |
|
|
| #include <optional> |
| #include <string> |
| #include <vector> |
|
|
| class common_chat_msg_partial_exception : public std::runtime_error { |
| public: |
| common_chat_msg_partial_exception(const std::string & message) : std::runtime_error(message) {} |
| }; |
|
|
| class common_chat_msg_parser { |
| std::string input_; |
| bool is_partial_; |
| common_chat_parser_params syntax_; |
| std::string healing_marker_; |
|
|
| size_t pos_ = 0; |
| common_chat_msg result_; |
|
|
| public: |
| common_chat_msg_parser(const std::string & input, bool is_partial, const common_chat_parser_params & syntax); |
| const std::string & input() const { return input_; } |
| size_t pos() const { return pos_; } |
| const std::string & healing_marker() const { return healing_marker_; } |
| const bool & is_partial() const { return is_partial_; } |
| const common_chat_msg & result() const { return result_; } |
| const common_chat_parser_params & syntax() const { return syntax_; } |
|
|
| void move_to(size_t pos) { |
| if (pos > input_.size()) { |
| throw std::runtime_error("Invalid position!"); |
| } |
| pos_ = pos; |
| } |
| void move_back(size_t n) { |
| if (pos_ < n) { |
| throw std::runtime_error("Can't move back that far!"); |
| } |
| pos_ -= n; |
| } |
|
|
| |
| std::string str(const common_string_range & rng) const; |
|
|
| |
| void add_content(const std::string & content); |
|
|
| |
| void add_reasoning_content(const std::string & reasoning_content); |
|
|
| |
| bool add_tool_call(const std::string & name, const std::string & id, const std::string & arguments); |
|
|
| |
| bool add_tool_call(const nlohmann::ordered_json & tool_call); |
|
|
| |
| bool add_tool_calls(const nlohmann::ordered_json & arr); |
|
|
| |
| bool add_tool_call_short_form(const nlohmann::ordered_json & tool_call); |
|
|
| void finish(); |
|
|
| bool consume_spaces(); |
|
|
| void consume_literal(const std::string & literal); |
|
|
| bool try_parse_reasoning(const std::string & start_think, const std::string & end_think); |
|
|
| std::string consume_rest(); |
|
|
| struct find_regex_result { |
| std::string prelude; |
| std::vector<common_string_range> groups; |
| }; |
|
|
| std::optional<find_regex_result> try_find_regex(const common_regex & regex, size_t from = std::string::npos, bool add_prelude_to_content = true); |
|
|
| bool try_consume_literal(const std::string & literal); |
|
|
| std::optional<find_regex_result> try_find_literal(const std::string & literal); |
|
|
| find_regex_result consume_regex(const common_regex & regex); |
|
|
| std::optional<find_regex_result> try_consume_regex(const common_regex & regex); |
|
|
| std::optional<common_json> try_consume_json(); |
| common_json consume_json(); |
|
|
| struct consume_json_result { |
| nlohmann::ordered_json value; |
| bool is_partial; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| consume_json_result consume_json_with_dumped_args( |
| const std::vector<std::vector<std::string>> & args_paths = {}, |
| const std::vector<std::vector<std::string>> & content_paths = {} |
| ); |
| std::optional<consume_json_result> try_consume_json_with_dumped_args( |
| const std::vector<std::vector<std::string>> & args_paths = {}, |
| const std::vector<std::vector<std::string>> & content_paths = {} |
| ); |
|
|
| |
| |
| |
| |
| bool try_consume_xml_tool_calls(const struct xml_tool_call_format & form); |
|
|
| |
| void consume_reasoning_with_xml_tool_calls(const struct xml_tool_call_format & form, const std::string & start_think = "<think>", const std::string & end_think = "</think>"); |
|
|
| void clear_tools(); |
| }; |
|
|