--- license: apache-2.0 language: - en pipeline_tag: text-generation library_name: transformers base_model: - SL-AI/GRaPE-Mini --- ![GRaPE_Logo](https://cdn-uploads.huggingface.co/production/uploads/66960602f0ffd8e3a381106a/XjHkzctrE41e1qqJYeDzN.png) _The **G**eneral **R**easoning **A**gent (for) **P**roject **E**xploration_ # The GRaPE Family | Attribute | Size | Modalities | Domain | | :--- | :--- | :--- | :--- | | **GRaPE Flash** | 7B A1B | Text in, Text out | High-Speed Applications | | **GRaPE Mini** | 3B | Text + Image + Video in, Text out | On-Device Deployment | | **GRaPE Nano** | 700M | Text in, Text out | Extreme Edge Deployment | *** # Capabilities The GRaPE Family was trained on about **14 billion** tokens of data after pre-training. About half was code related tasks, with the rest being heavy on STEAM. Ensuring the model has a sound logical basis. *** GRaPE Flash and Nano are monomodal models, only accepting text. GRaPE Mini being trained most recently supports image and video inputs. *** ## Reasoning Modes As GRaPE Mini is the only model that thinks, it has *some* support for reasoning modes. In testing, these modes sometimes work. Likely due to an innefficient dataset formatting for it. To use thinking modes, you need an XML tag, ``, which can equal these values: - **Minimal**: Skip thinking *(does not work most of the time, you'll have to be careful with this one)* - **Low**: Think Below 1024 tokens - **Medium**: Think between 1024 and 8192 tokens - **High**: Think for any amount above 8192 tokens In your prompt, place the thinking mode at the *end* of your prompt, like this: ``` Build me a website called "Aurora Beats." <|image_pad|><|vision_end|>             {%- elif 'video' in item or item.type == 'video' %}                 {%- if do_vision_count %}                     {%- set video_count.value = video_count.value + 1 %}                 {%- endif %}                 {%- if add_vision_id %}Video {{ video_count.value }}: {% endif -%}                 <|vision_start|><|video_pad|><|vision_end|>             {%- elif 'text' in item %}                 {{- item.text }}             {%- endif %}         {%- endfor %}     {%- endif %} {%- endmacro %} {%- if tools %}     {{- '<|im_start|>system\n' }}     {%- if messages[0].role == 'system' %}         {{- render_content(messages[0].content, false) + '\n\n' }}     {%- endif %}     {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n" }}     {%- for tool in tools %}         {{- "\n" }}         {{- tool | tojson }}     {%- endfor %}     {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} {%- else %}     {%- if messages[0].role == 'system' %}         {{- '<|im_start|>system\n' + render_content(messages[0].content, false) + '<|im_end|>\n' }}     {%- endif %} {%- endif %} {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} {%- for message in messages[::-1] %}     {%- set index = (messages|length - 1) - loop.index0 %}     {%- if ns.multi_step_tool and message.role == "user" %}         {%- set content = render_content(message.content, false) %}         {%- if not(content.startswith('') and content.endswith('')) %}             {%- set ns.multi_step_tool = false %}             {%- set ns.last_query_index = index %}         {%- endif %}     {%- endif %} {%- endfor %} {%- for message in messages %}     {%- set content = render_content(message.content, True) %}     {%- if (message.role == "user") or (message.role == "system" and not loop.first) %}         {%- if message.role == "user" and loop.last %}             {{- '<|im_start|>' + message.role + '\n' + content + '\n\nRespond by first generating a tag to reason through the user\'s prompt.<|im_end|>\n' }}         {%- else %}             {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>\n' }}         {%- endif %}     {%- elif message.role == "assistant" %}         {%- set reasoning_content = '' %}         {%- if message.reasoning_content is string %}             {%- set reasoning_content = message.reasoning_content %}         {%- else %}             {%- if '' in content %}                 {%- set reasoning_content = content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') %}                 {%- set content = content.split('')[-1].lstrip('\n') %}             {%- endif %}         {%- endif %}         {%- if loop.index0 > ns.last_query_index %}             {%- if loop.last or (not loop.last and reasoning_content) %}                 {{- '<|im_start|>' + message.role + '\n\n' + reasoning_content.strip('\n') + '\n\n\n' + content.lstrip('\n') }}             {%- else %}                 {{- '<|im_start|>' + message.role + '\n' + content }}             {%- endif %}         {%- else %}             {{- '<|im_start|>' + message.role + '\n' + content }}         {%- endif %}         {%- if message.tool_calls %}             {%- for tool_call in message.tool_calls %}                 {%- if (loop.first and content) or (not loop.first) %}                     {{- '\n' }}                 {%- endif %}                 {%- if tool_call.function %}                     {%- set tool_call = tool_call.function %}                 {%- endif %}                 {{- '\n{"name": "' }}                 {{- tool_call.name }}                 {{- '", "arguments": ' }}                 {%- if tool_call.arguments is string %}                     {{- tool_call.arguments }}                 {%- else %}                     {{- tool_call.arguments | tojson }}                 {%- endif %}                 {{- '}\n' }}             {%- endfor %}         {%- endif %}         {{- '<|im_end|>\n' }}     {%- elif message.role == "tool" %}         {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}             {{- '<|im_start|>user' }}         {%- endif %}         {{- '\n\n' }}         {{- content }}         {{- '\n' }}         {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}             {{- '<|im_end|>\n' }}         {%- endif %}     {%- endif %} {%- endfor %} {%- if add_generation_prompt %}     {{- '<|im_start|>assistant\n' }} {%- endif %} ``` *** # Notes The GRaPE Family started all the way back in August of 2025, meaning these models are severely out of date on architecture, and training data. GRaPE 2 will come sooner than the GRaPE 1 family had, and will show multiple improvements. There are no benchmarks for GRaPE 1 Models due to the costly nature of running them, as well as prioritization of newer models. Updates for GRaPE 2 models will be posted here on Huggingface, as well as [Skinnertopia](https://www.skinnertopia.com/) Demos for select GRaPE Models can be found here: https://github.com/Sweaterdog/GRaPE-Demos