KBaba7/llama.cpp
0
1{# version=v3.llama3 #}{%- macro append_new_param_info(param_declaration, comment_info, examples_info, depth) -%}2 {%- set offset = "" -%}3 {%- if depth >= 1 -%}4 {%- set offset = " " * depth -%}5 {%- endif -%}6 {%- if comment_info != "<|NONE|>" -%}7 {{ "\n" + offset + comment_info }}8 {%- if examples_info | length > 0 -%}9 {# Append each example info #}10 {%- for example in examples_info -%}11 {{ "\n" + offset + "// " + example|string|replace("'", '"') }}12 {%- endfor -%}13 {%- endif -%}14 {%- endif -%}15 {{ "\n" + offset + param_declaration }}16{%- endmacro -%}17 18{%- macro convert_data_type(param_type) -%}19 {%- if param_type == "integer" or param_type == "float" -%}20 {{ "number" }}21 {%- else -%}22 {{ param_type }}23 {%- endif -%}24{%- endmacro -%}25 26{%- macro get_param_type(param) -%}27 {%- set param_type = "any" -%}28 29 {%- if "type" in param -%}30 {%- set raw_param_type = param["type"] -%}31 {%- if raw_param_type is iterable and raw_param_type is not string -%}32 {%- set param_type = raw_param_type | join(" | ") -%}33 {%- else -%}34 {%- set param_type = raw_param_type -%}35 {%- endif -%}36 {{ convert_data_type(param_type) }}37 {%- elif "oneOf" in param -%}38 {%- set one_of_types = param["oneOf"]|selectattr("type", "defined")|list -%}39 {%- set one_of_types = one_of_types|map(attribute="type")|unique|list -%}40 {{ convert_data_type(one_of_types | join(" | ")) }}41 {%- endif -%}42{%- endmacro -%}43 44{%- macro get_format_param(param) -%}45 {%- if "format" in param -%}46 {{ param["format"] }}47 {%- elif "oneOf" in param -%}48 {%- set formats = [] -%}49 {%- for item in param["oneOf"] -%}50 {%- if "format" in item -%}51 {%- if item["format"] == param["oneOf"][-1]["format"] -%}52 {{ item["format"] }}53 {%- else -%}54 {{ item["format"] + " or "}}55 {%- endif -%}56 {%- endif -%}57 {%- endfor -%}58 {%- else -%}59 {{ "<|NONE|>" }}60 {%- endif -%}61{%- endmacro -%}62 63{%- macro get_param_info(param) -%}64 {%- set param_type = param.get("type", "any") -%}65 {%- set format_param = get_format_param(param) -%}66 67 {%- if "description" in param or "default" in param or format_param != "<|NONE|>" or param["maximum"] or param["minimum"] or param["maxLength"] or param["minLength"] -%}68 {{ "//" }}69 {%- if "description" in param -%}70 {%- set desc = param["description"] -%}71 {%- if not desc.endswith(".") -%}72 {%- set desc = desc + "." -%}73 {%- endif -%}74 {{ " " + desc }}75 {%- endif -%}76 77 {%- if "default" in param -%}78 {%- set default_value = param["default"] -%}79 {%- if param_type == "string" -%}80 {%- set default_value = '"' ~ default_value ~ '"' -%}81 {%- endif -%}82 {{ " Default=" ~ default_value ~ "." }}83 {%- endif -%}84 85 {%- set format_param = get_format_param(param) -%}86 {%- if format_param != "<|NONE|>" -%}87 {{ " Format=" ~ format_param }}88 {%- endif -%}89 90 {%- for field, field_name in [("maximum", "Maximum"), ("minimum", "Minimum"), ("maxLength", "Maximum length"), ("minLength", "Minimum length")] -%}91 {%- if field in param -%}92 {{ " " + field_name ~ "=" ~ param[field] }}93 {%- endif -%}94 {%- endfor -%}95 {%- else -%}96 {{ "<|NONE|>"}}97 {%- endif -%}98{%- endmacro -%}99 100{%- macro get_enum_option_str(enum_options) -%}101 {%- for v in enum_options -%}102 {%- if v is string -%}103 {{ '"' + v + '"' }}104 {%- else -%}105 {{ v }}106 {%- endif -%}107 {%- if enum_options|length > 0 and v != enum_options[-1] -%}108 {{ " | " }}109 {%- endif -%}110 {%- endfor -%}111{%- endmacro -%}112 113{%- macro get_array_typescript(param_name, param_dic, depth) -%}114 {%- set offset = '' -%}115 {%- if depth >= 1 -%}116 {%- set offset = " " * depth -%}117 {%- endif -%}118 {%- set items_info = param_dic.get('items', {}) -%}119 120 {%- if items_info|length == 0 -%}121 {%- if param_name -%}122 {{ "\n" + offset + param_name + ": []" }}123 {%- else -%}124 {{ "\n" + offset + "[]" }}125 {%- endif -%}126 {%- else -%}127 {%- set array_type = get_param_type(items_info) -%}128 {%- if array_type == 'object' -%}129 {%- if param_name -%}130 {{ "\n" + offset + param_name + ": {" }}131 {%- else -%}132 {{ "\n" + offset + "{" }}133 {%- endif -%}134 {{ get_parameter_typescript(items_info.get('properties', {}), items_info.get('required', []), depth + 1) -}}135 {{- "\n" + offset + "}[]" }}136 {%- elif array_type == 'array' -%}137 {%- set item_info = get_array_typescript(None, items_info, depth + 1) -%}138 {%- if not param_name -%}139 {{ "\n" + item_info + "[]" }}140 {%- else -%}141 {{ "\n" + offset + param_name + ": " + item_info|trim + "[]" }}142 {%- endif -%}143 {%- else -%}144 {%- if 'enum' in items_info -%}145 {%- set item_type = get_enum_option_str(items_info['enum']) -%}146 {%- if param_name is none -%}147 {{ "(" + item_type + ")[]"}}148 {%- else -%}149 {{ "\n" + offset + param_name + ": (" + item_type + ")[]" }}150 {%- endif -%}151 {%- else -%}152 {%- if param_name is none -%}153 {{ "\n" + array_type + "[]" }}154 {%- else -%}155 {{ "\n" + offset + param_name + ": " + array_type + "[]," }}156 {%- endif -%}157 {%- endif -%}158 {%- endif -%}159 {%- endif -%}160{%- endmacro -%}161 162{%- macro get_parameter_typescript(properties, required_params, depth=0) -%}163 {%- set res = "" -%}164 {%- for param_name, param in properties.items() -%}165 {%- if param is mapping -%}166 {%- set comment_info = get_param_info(param) -%}167 {# Param Examples #}168 {%- set examples_info = [] -%}169 {%- if "examples" in param -%}170 {%- set examples_info = ["Example " + param_name + ":"] -%}171 {%- set examples_info = examples_info + param["examples"] -%}172 {%- endif -%}173 174 {# Param Name declaration #}175 {%- set param_declaration = param_name -%}176 {%- if required_params is iterable and param_name not in required_params -%}177 {%- set param_declaration = param_declaration + "?" -%}178 {%- endif -%}179 180 {%- set param_type = get_param_type(param) -%}181 182 {# Handle indentation based on depth #}183 {%- set offset = "" -%}184 {%- if depth >= 1 -%}185 {%- set offset = " " * depth -%}186 {%- endif -%}187 188 {%- if param_type == "object" -%}189 {%- if comment_info != "<|NONE|>" -%}190 {{ "\n" + offset + comment_info }}191 {%- endif -%}192 {%- if examples_info|length > 0 -%}193 {%- for example in examples_info -%}194 {{ "\n" + offset + "// " + example|string|replace("'", '"') }}195 {%- endfor -%}196 {%- endif -%}197 {%- set param_declaration = param_declaration + ": {" -%}198 {{ "\n" + offset + param_declaration -}}199 {{- get_parameter_typescript(param.get("properties", {}), param.get("required", []), depth + 1) -}}200 {{- "\n" + offset + "}," }}201 {%- elif param_type == "array" -%}202 {%- set item_info = param.get("items", {}) -%}203 {%- if "type" not in item_info -%}204 {%- set param_declaration = param_declaration + ": []," -%}205 {{ append_new_param_info(param_declaration, comment_info, examples_info, depth) }}206 {%- else -%}207 {%- if comment_info != "<|NONE|>" -%}208 {{ "\n" + offset + comment_info }}209 {%- endif -%}210 {%- if examples_info|length > 0 -%}211 {%- for example in examples_info -%}212 {{ "\n" + offset + "// " + example|string|replace("'", '"') }}213 {%- endfor -%}214 {%- endif -%}215 {%- set array_declaration = get_array_typescript(param_declaration, param, depth) -%}216 {%- if not array_declaration.endswith(",") -%}217 {%- set array_declaration = array_declaration + "," -%}218 {%- endif -%}219 {{ array_declaration}}220 {%- endif -%}221 {%- else -%}222 {%- if "enum" in param -%}223 {%- set param_type = get_enum_option_str(param["enum"]) -%}224 {%- endif -%}225 {%- if "nullable" in param and param["nullable"] -%}226 {%- set param_type = param_type + " | null" -%}227 {%- endif -%}228 {%- set param_declaration = param_declaration + ": " + param_type + "," -%}229 {{ append_new_param_info(param_declaration, comment_info, examples_info, depth) }}230 {%- endif -%}231 {%- endif -%}232 {%- endfor -%}233{%- endmacro -%}234 235{%- macro generate_schema_from_functions(functions, namespace='functions') -%}236 {{ "// Supported function definitions that should be called when necessary.\n" -}}237 {{- "namespace " + namespace + " {\n\n" -}}238 239 {%- for function in functions -%}240 {%- if function.get("function") -%}241 {%- set function = function.get("function") -%}242 {%- endif -%}243 244 {%- set function_name = function.get("name") -%}245 {%- if function_name -%}246 {%- set description = function.get('description', '') -%}247 {%- set parameters = function.get('parameters', {}) -%}248 {{- "// " + description + "\n" -}}249 {{- "type " + function_name -}}250 {%- if parameters and parameters.get("properties") -%}251 {{- " = (_: {" -}}252 {%- set required_params = parameters.get("required", []) -%}253 {{ get_parameter_typescript(parameters.get("properties"), required_params, 0) -}}254 {{- "\n}) => any;\n\n" }}255 {%- else -%}256 {{ " = () => any;\n\n" }}257 {%- endif -%}258 {%- endif -%}259 {%- endfor -%}260 {{ "} // namespace " + namespace }}261{%- endmacro -%}262{%- if not tools -%}263 {%- set tools = [] -%}264{%- endif -%}265{{ bos_token + '<|start_header_id|>system<|end_header_id|>\n\nYou are capable of executing available function(s) if required.\nOnly execute function(s) when absolutely necessary.\nAsk for the required input to:recipient==all\nUse JSON for function arguments.\nRespond in this format:\n>>>${recipient}\n${content}\nAvailable functions:\n' + generate_schema_from_functions(tools) + '<|eot_id|>' -}}266{%- if tools|length > 0 and tools|selectattr("type", "equalto", "code_interpreter")|list|length > 0 -%}267 {{ '<|start_header_id|>system<|end_header_id|>\n\nWhen you send a message containing Python code to python, it will be executed in a stateful Jupyter notebook environment. python will respond with the output of the execution or time out after 60.0 seconds. The drive at \'/mnt/data\' can be used to save and persist user files.<|eot_id|>' }}268{%- endif -%}269{%- for message in messages -%}270 {%- if message['role'] == 'user' or message['role'] == 'system' -%}271 {{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' + message['content'] + '<|eot_id|>' }}272 {%- elif message['role'] == 'tool' -%}273 {{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' + message['content'] + '<|eot_id|>' }}274 {%- else -%}275 {{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'}}276 {%- if message['content'] -%}277 {{ '>>>all\n' + message['content'] }}278 {%- endif -%}279 {%- if 'tool_calls' in message and message['tool_calls'] -%}280 {%- for tool_call in message['tool_calls'] -%}281 {{ '>>>' + tool_call['function']['name'] + '\n' + tool_call['function']['arguments'] }}282 {%- endfor -%}283 {%- endif -%}284 {{ '<|eot_id|>' }}285 {%- endif -%}286{%- endfor -%}287{% if add_generation_prompt %}{{ '<|start_header_id|>assistant<|end_header_id|>\n\n>>>' }}{% endif %}