| 2804 | if (wrote) buf_putc(b, ','); |
| 2805 | append_json_arg_pair(b, &args.v[i]); |
| 2806 | wrote = true; |
| 2807 | } |
| 2808 | buf_putc(b, '}'); |
| 2809 | json_args_free(&args); |
| 2810 | } |
| 2811 | |
| 2812 | static void append_dsml_tool_calls_text(buf *b, const tool_calls *calls) { |
| 2813 | if (!calls || calls->len == 0) return; |
| 2814 | if (calls->raw_tool_text && calls->raw_tool_text[0]) { |
| 2815 | buf_puts(b, calls->raw_tool_text); |
| 2816 | return; |
| 2817 | } |
| 2818 | buf_puts(b, "\n\n<|DSML|tool_calls>\n"); |
| 2819 | for (int i = 0; i < calls->len; i++) { |
| 2820 | const tool_call *tc = &calls->v[i]; |
| 2821 | buf_puts(b, "<|DSML|invoke name=\""); |
| 2822 | append_dsml_attr_escaped(b, tc->name); |
| 2823 | buf_puts(b, "\">\n"); |
| 2824 | if (!append_dsml_arguments_from_json(b, tc->arguments, NULL)) { |
| 2825 | buf_puts(b, "<|DSML|parameter name=\"arguments\" string=\"true\">"); |
| 2826 | append_dsml_parameter_text(b, tc->arguments); |
| 2827 | buf_puts(b, "</|DSML|parameter>\n"); |
| 2828 | } |
| 2829 | buf_puts(b, "</|DSML|invoke>\n"); |
| 2830 | } |
| 2831 | buf_puts(b, "</|DSML|tool_calls>"); |
| 2832 | } |
| 2833 | |
| 2834 | static void append_glm_tool_calls_text(buf *b, const tool_calls *calls, |
| 2835 | const tool_schema_orders *tool_orders) { |
| 2836 | if (!calls || calls->len == 0) return; |
| 2837 | if (calls->raw_tool_text && calls->raw_tool_text[0]) { |
| 2838 | buf_puts(b, calls->raw_tool_text); |
| 2839 | return; |
| 2840 | } |
| 2841 | buf_putc(b, '\n'); |
| 2842 | for (int i = 0; i < calls->len; i++) { |
| 2843 | const tool_call *tc = &calls->v[i]; |
| 2844 | const tool_schema_order *order = |
| 2845 | tool_schema_orders_find(tool_orders, tc->name); |
| 2846 | buf_puts(b, "<tool_call>"); |
| 2847 | buf_puts(b, tc->name ? tc->name : ""); |
| 2848 | if (!append_glm_arguments_from_json(b, tc->arguments, order)) { |
| 2849 | buf_puts(b, "<arg_key>arguments</arg_key><arg_value>"); |
| 2850 | append_glm_arg_value_text(b, tc->arguments); |
| 2851 | buf_puts(b, "</arg_value>"); |
| 2852 | } |
| 2853 | buf_puts(b, "</tool_call>"); |
| 2854 | } |
| 2855 | buf_putc(b, '\n'); |
| 2856 | } |
| 2857 | |
| 2858 | static void append_tool_calls_text_for_syntax(buf *b, |
| 2859 | server_model_syntax syntax, |
| 2860 | const tool_calls *calls, |
| 2861 | const tool_schema_orders *tool_orders) { |
| 2862 | if (syntax == SERVER_MODEL_SYNTAX_GLM) { |
| 2863 | append_glm_tool_calls_text(b, calls, tool_orders); |
no test coverage detected