{
"backend": "tokenizers",
"bos_token": "",
"clean_up_tokenization_spaces": true,
"eos_token": "",
"is_local": true,
"model_max_length": 1000000000000000019884624838656,
"pad_token": "<|PAD_TOKEN|>",
"padding_side": "left",
"tokenizer_class": "TokenizersBackend",
"unk_token": null,
"chat_template": "{#--------TOOL RENDERING FUNCTIONS---------#}\n\n{#---------------------------------------------------------------\n Converts JSON Schema (dict) to a TypeScript type definition\n----------------------------------------------------------------#}\n{%- macro json_schema_to_typescript(schema, indent=\"\") -%}\n\t{%- set ADDITIONAL_JSON_KEYS = ['format', 'maxItems', 'maximum', 'minItems', 'minimum', 'pattern'] -%}\n\t{%- set ty = schema.get(\"type\") -%}\n\n\t{# ---------------- OBJECT ---------------- #}\n\t{%- if ty == \"object\" -%}\n\t\t{{- \"{\\n\" -}}\n\n\t\t{# Start building property list #}\n\t\t{%- set props = schema.get(\"properties\", {}) -%}\n\t\t{%- set required = schema.get(\"required\", []) -%}\n\t\t{%- set has_additional_props = schema.get(\"additionalProperties\") is defined -%}\n\t\t{%- set additional_props_type = none -%}\n\t\t{%- if has_additional_props -%}\n\t\t\t{%- if schema.additionalProperties == true -%}\n\t\t\t\t{%- set additional_props_type = {'type': 'any'} -%}\n\t\t\t{%- elif schema.additionalProperties is mapping -%}\n\t\t\t\t{%- set additional_props_type = schema.additionalProperties -%}\n\t\t\t{%- endif -%}\n\t\t{%- endif -%}\n\n\t\t{%- for key, val in props.items() -%}\n\t\t\t{# ---------- Description Comments ---------- #}\n\t\t\t{%- if \"description\" in val -%}\n\t\t\t\t{%- for line in val['description'].split('\\n') -%}\n\t\t\t\t\t{%- if line.strip() -%}\n\t\t\t\t\t\t{{- indent + '// ' + line + '\\n' -}}\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t{%- endif -%}\n\n\t\t\t{# ---------- Additional JSON Keys ---------- #}\n\t\t\t{%- for add_key, add_val in val.items() -%}\n\t\t\t\t{%- if add_key in ADDITIONAL_JSON_KEYS -%}\n\t\t\t\t\t{%- if add_val is string -%}\n\t\t\t\t\t\t{{- indent + '// ' + add_key + ': \"' + add_val + '\"' + '\\n' -}}\n\t\t\t\t\t{%- else -%}\n\t\t\t\t\t\t{{- indent + '// ' + add_key + ': ' ~ add_val ~ '\\n' -}}\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endif -%}\n\t\t\t{%- endfor -%}\n\n\t\t\t{# ---------- Property Definition ---------- #}\n {%- set type_str = json_schema_to_typescript(\n val, \n indent + \" \"\n ) -%}\n\n\t\t\t{{- indent + key + ('' if key in required else '?') + ': ' + type_str + ',' -}}\n\n\t\t\t{%- if \"default\" in val or \"defalut_value\" in val -%}\n\t\t\t\t{%- set default = val.get(\"default\", val.get(\"defalut_value\")) -%}\n\t\t\t\t{%- if default is string -%}\n\t\t\t\t\t{{- ' // default: \"' + default + '\"' -}}\n\t\t\t\t{%- else -%}\n\t\t\t\t\t{{- ' // default: ' ~ default -}}\n\t\t\t\t{%- endif -%}\n\t\t\t{%- endif -%}\n\n\t\t\t{{- \"\\n\" -}}\n\t\t{%- endfor -%}\n\n\t\t{# Handle additionalProperties as index signature #}\n\t\t{%- if has_additional_props and additional_props_type is not none -%}\n\t\t\t{%- set additional_type_str = json_schema_to_typescript(\n\t\t\t\tadditional_props_type,\n\t\t\t\tindent + \" \"\n\t\t\t) -%}\n\t\t\t{{- indent + '[key: string]: ' + additional_type_str + '\\n' -}}\n\t\t{%- endif -%}\n\n\t\t{{- indent[: (indent|length - \" \"|length) ] + '}' -}}\n\n\t{# ---------------- STRING ---------------- #}\n\t{%- elif ty == \"string\" -%}\n\t\t{%- if schema.get(\"enum\") -%}\n {%- set ns = namespace(enum = []) -%}\n {%- for en in schema['enum'] -%}\n {%- set ns.enum = ns.enum + ['\"' ~ en ~ '\"'] -%}\n {%- endfor -%}\n\t\t\t{{- ns.enum | join(' | ') -}}\n\t\t{%- elif schema.get(\"format\", \"none\") in ['date-time', 'date'] -%}\n\t\t\t{{- 'Date' -}}\n\t\t{%- else -%}\n\t\t\t{{- 'string' -}}\n\t\t{%- endif -%}\n\n\t{# ---------------- NUMBER / INTEGER ---------------- #}\n\t{%- elif ty in [\"number\", \"integer\"] -%}\n\t\t{%- if schema.get(\"enum\") -%}\n\t\t\t{{- schema.enum | join(' | ') -}}\n\t\t{%- else -%}\n\t\t\t{{- 'number' -}}\n\t\t{%- endif -%}\n\n\t{# ---------------- BOOLEAN ---------------- #}\n\t{%- elif ty == \"boolean\" -%}\n\t\t{{- 'boolean' -}}\n\n\t{# ---------------- ARRAY ---------------- #}\n\t{%- elif ty == \"array\" -%}\n\t\t{%- if \"items\" in schema -%}\n\t\t\t{{- json_schema_to_typescript(schema['items'], indent) + '[]' -}}\n\t\t{%- else -%}\n\t\t\t{{- 'Array' -}}\n\t\t{%- endif -%}\n\n\t{# ---------------- FALLBACK ---------------- #}\n\t{%- else -%}\n\t\t{{- 'any' -}}\n\t{%- endif -%}\n{%- endmacro -%}\n\n{#---------------------------------------------------------------\n Renders a namespace and its tool definitions in TypeScript style\n----------------------------------------------------------------#}\n\n{%- macro render_tool_namespace(namespace_name, tools) -%}\n\t{%- set ns = namespace(sections = ['namespace ' ~ namespace_name ~ ' {']) -%}\n\n\t{%- for tool in tools -%}\n\t\t{%- if tool.function -%}\n\t\t\t{%- set tool = tool.function -%}\n\t\t{%- endif -%}\n\n\t\t{%- set ns_tool = namespace(content_lines=[]) -%}\n\n\t\t{# ---------- TOOL DESCRIPTION ---------- #}\n\t\t{%- if tool.get('description') -%}\n\t\t\t{%- for line in tool['description'].split('\\n') -%}\n\t\t\t\t{%- if line.strip() -%}\n\t\t\t\t\t{%- set ns_tool.content_lines = ns_tool.content_lines + ['// ' ~ line] -%}\n\t\t\t\t{%- endif -%}\n\t\t\t{%- endfor -%}\n\t\t{%- endif -%}\n\n\t\t{# ---------- TOOL SIGNATURE ---------- #}\n\t\t{%- set main_body = \"\" -%}\n\t\t{%- set params = tool.get(\"parameters\") -%}\n\t\t{%- if params and params.get(\"properties\") -%}\n\t\t\t{%- set param_type = json_schema_to_typescript(params, \" \") -%}\n\t\t\t{%- set main_body = 'type ' ~ tool.name ~ ' = (_: ' ~ param_type ~ ') => ' -%}\n\t\t{%- else -%}\n\t\t\t{%- set main_body = 'type ' ~ tool.name ~ ' = () => ' -%}\n\t\t{%- endif -%}\n\n\t\t{# ---------- RETURN TYPE ---------- #}\n\t\t{%- set return_params = tool.get(\"return_parameters\") -%}\n\t\t{%- if return_params and return_params.get(\"properties\") -%}\n\t\t\t{%- set return_type = json_schema_to_typescript(return_params, \" \") -%}\n\t\t\t{%- set main_body = main_body ~ return_type -%}\n\t\t{%- else -%}\n\t\t\t{%- set main_body = main_body ~ 'any' -%}\n\t\t{%- endif -%}\n\n\t\t{%- set main_body = main_body ~ ';\\n' -%}\n\n\t\t{%- set ns_tool.content_lines = ns_tool.content_lines + [main_body] -%}\n\n\t\t{# ---------- ADD TOOL TO SECTIONS ---------- #}\n\t\t{%- set ns.sections = ns.sections + [ns_tool.content_lines | join('\\n')] -%}\n\t{%- endfor -%}\n\n\t{%- set ns.sections = ns.sections + ['} // namespace ' ~ namespace_name] -%}\n\n\t{{- ns.sections | join('\\n') -}}\n{%- endmacro -%}\n\n\n{# ----------- MESSAGE RENDERING HELPER FUNCTIONS ------------ #}\n\n{%- macro render_function_call(call) -%}\n {%- if call.function -%}\n {%- set call = call.function -%}\n {%- endif -%}\n\n {%- set arguments = call['arguments'] -%}\n\t{%- if arguments is not string -%}\n\t\t{%- set arguments = arguments| tojson(ensure_ascii=False) -%}\n\t{%- endif -%}\n\n {{- '{\"name\": \"' ~ call['name'] ~ '\", \"arguments\": ' ~ arguments ~ '}' -}}\n{%- endmacro -%}\n\n\n{%- macro render_role_message(message, role=None) -%}\n {%- if not role -%}\n {%- set role = message[\"role\"] -%}\n {%- endif -%}\n\n {%- set message_content = message['content'] or '' -%}\n {%- if message_content is not string -%}\n {%- set message_content = message_content | tojson(ensure_ascii=False) -%}\n {%- endif -%}\n\n {{- role + add_tokens.role_sep + message_content -}}\n\n {%- if message.tool_calls is defined and message.tool_calls -%}\n {{- add_tokens.function_call + render_function_call(message.tool_calls[0]) -}}\n {%- endif -%}\n\n {{- add_tokens.message_sep -}}\n\n{%- endmacro -%}\n\n\n\n{# ----- SPECIAL TOKENS ----- #}\n\n{%- set add_tokens = namespace(\n role_sep=\"<|role_sep|>\\n\", \n message_sep=\"<|message_sep|>\\n\\n\",\n function_call=\"<|function_call|>\"\n) -%}\n\n{# ----- DEFAULT DEVSYSTEM ----- #}\n\n{%- set DEVSYSTEM -%}\n\nОписание доступных в диалоге ролей.\n\n`developer system`\nСообщение, добавленное Сбером до основного диалога. Имеет самый высокий приоритет и определяет глобальные, неотменяемые условия (например, правила ведения диалога, политику безопасности, общий стиль ответов ассистента и пр.).\n\n`system`\nСистемная инструкция, добавляемая разработчиками или пользователем, но с приоритетом ниже, чем `developer system`. Обычно описывает инструкции ассистента, конкретный стиль ответа и другие условия для данного конкретного диалога.\n\n`user`\nСообщение или запрос от пользователя. Ассистент следует ему, если это не противоречит инструкциям более высокого приоритета (см. ).\n\n`user memory`\nПоследовательность наиболее актуальных долговременных фактов о пользователе на момент его запроса, представленная в виде JSON‑списка строк. Факты в ней перечислены в хронологическом порядке, то есть более новые факты дописываются в конец последовательности. При этом при изменении или удалении фактов записи о предыдущих фактах остаются в последовательности. Ассистент сохраняет факты с помощью функции и использует их в соответствии с указаниями из блока ниже.\n\n`added files`\nМетаинформация о файлах, доступных для использования в диалоге, представленная в формате JSON. Содержит следующие ключи: id (уникальный идентификатор файла), name (имя файла), type (тип файла).\n\n`assistant`\nОтвет ассистента на запрос пользователя. Если системная инструкция или пользователь не задаёт дополнительных правил для `assistant`, то такая реплика должна соответствовать указаниям из блока ниже. Список доступных для вызова функций содержится в последней реплике роли `available functions`. Название необходимой для вызова функции и аргументы будут сгенерированы после специального токена вызова функции. В своих репликах ассистент следует инструкциям в соответствии с .\nВызов функции осуществляется в строгом соответствии с инструкцией из блока .\n\n`function descriptions`\nОписания функций в формате TypeScript. Функция — это специальный инструмент (или набор инструкций), который ассистент может вызвать для выполнения конкретных действий, вычислений или получения данных, необходимых для решения задачи пользователя. Каждое описание функции содержит блоки с именем, описанием, аргументами. Иногда описание содержит отдельные блоки с возвращаемыми параметрами и примерами применения, иллюстрирующими правильный вызов и аргументы.\n\n`available functions`\nСписок, который содержит названия функций, доступных для вызова. Если список не содержит элементов, то в следующем сообщении функции, доступные для вызова, отсутствуют.\n\n`function result`\nРезультат последнего вызова функции.\n\n\n\n\nАссистент умеет работать со следующими модальностями: текст, доступные функции.\n\n\n\n\nВ случае противоречия инструкций разных ролей в контексте диалога соблюдай приоритеты:\n`developer system` > `system` > `user` > `function descriptions` > `function result` > `user memory`\n\n\n\n\nБазовые инструкции для работы с функциями.\n\nМожно вызывать только те функции, которые доступны исходя из последнего сообщения `available functions`.\n\nВызывай доступные функции в случае, если согласно их описанию такой вызов поможет дать более полный и/или точный ответ на запрос пользователя. Заполняй аргументы функций, используя информацию из контекста диалога. Если функция может помочь ответить на запрос, но для её обязательного аргумента отсутствует информация в контексте, уточни у пользователя недостающие данные перед вызовом функции. При недоступности необходимой функции или ошибке — кратко сообщи об этом пользователю и по возможности предложи альтернативу.\n\n\n\n\nПравила использования фактов в долговременной памяти:\n\nЕсли в диалоге нет сообщения под ролью `user memory`, то это равносильно отсутствию долговременных фактов о пользователе в памяти. В таком случае информация о пользователе ограничена текущим диалогом, и новые факты не должны сохраняться.\n\n\n\n\nGigaChat — нейросетевая модель искусственного интеллекта, созданная компанией Сбер в России.\n\nGigaChat старается отвечать на языке, на котором пользователь задал запрос. Если из запроса пользователя и контекста диалога язык определить невозможно, GigaChat использует русский.\nGigaChat предоставляет подробные ответы на более сложные и открытые вопросы.\nGigaChat в ответе не использует названия доступных функций.\nGigaChat отвечает безопасно, в соответствии с действующим законодательством Российской Федерации, стараясь помочь пользователю решить задачу или поддержать беседу.\n\nТы — GigaChat.\n\n\n\nНиже будет приведён диалог.\nВ диалоге могут быть разнообразные роли, описанные в блоке .\nКаждая реплика начинается с названия роли и специального токена, обозначающего конец полного наименования роли, а заканчивается специальным токеном конца реплики.\nТвоя задача — продолжить диалог от последней указанной роли в соответствии с контекстом диалога.\n{%- endset -%}\n\n\n{#- ---------------------- RENDERING STARTS HERE ---------------------- -#}\n\n\n{# ----- RENDER BOS TOKEN ----- #}\n{{- bos_token -}}\n\n\n{# ----- RENDER DEVSYSTEM ----- #}\n{{- render_role_message({\"role\": \"developer system\", \"content\": DEVSYSTEM}) -}}\n\n{# ----- RENDER SYSTEM IF PRESENT ----- #}\n{%- if messages and messages[0]['role'] == 'system' -%}\n {{- render_role_message(messages[0]) -}}\n {%- set messages = messages[1:] -%}\n{%- else -%}\n {{- render_role_message({\"role\": \"system\", \"content\": \"\"}) -}}\n{%- endif -%}\n\n{# ----- RENDER TOOLS ----- #}\n{%- if tools -%}\n {%- set tools_content = (\n render_tool_namespace('functions', tools) \n + \"\\n\\n\"\n ) -%}\n {{- render_role_message({'role': 'function descriptions', 'content': tools_content}) -}}\n{%- endif -%}\n\n{# ----- MAIN MESSAGE LOOP ----- #}\n{%- for message in messages -%}\n\n {# ----- TOOL MESSAGE -------#}\n {%- if message['role'] == 'tool' -%}\n {{- render_role_message(message, 'function result') -}}\n \n {# ----- OTHER MESSAGES ----- #}\n {%- else -%}\n {{- render_role_message(message) -}}\n {%- endif -%}\n\n {# ----- ADDING GENERATION PROMPT ----- #}\n\n {%- if loop.last and add_generation_prompt and message['role'] != 'assistant' -%}\n {{- 'assistant' + add_tokens.role_sep -}}\n {%- endif -%}\n\n{%- endfor -%}"
}