Image-Text-to-Text
MLX
Safetensors
dots3_note
jang
apple-silicon
dots3
multimodal
Mixture of Experts
quantized
conversational
2-bit
Instructions to use JANGQ-AI/dots3-note-prev-JANG with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use JANGQ-AI/dots3-note-prev-JANG with MLX:
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("JANGQ-AI/dots3-note-prev-JANG") config = load_config("JANGQ-AI/dots3-note-prev-JANG") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use JANGQ-AI/dots3-note-prev-JANG with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "JANGQ-AI/dots3-note-prev-JANG"
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "JANGQ-AI/dots3-note-prev-JANG" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent
How to use JANGQ-AI/dots3-note-prev-JANG with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "JANGQ-AI/dots3-note-prev-JANG"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default JANGQ-AI/dots3-note-prev-JANG
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use JANGQ-AI/dots3-note-prev-JANG with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "JANGQ-AI/dots3-note-prev-JANG"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "JANGQ-AI/dots3-note-prev-JANG" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
| {%- if enable_thinking is not defined -%} | |
| {%- set enable_thinking = true -%} | |
| {%- endif -%} | |
| {%- if clear_thinking is not defined -%} | |
| {%- set clear_thinking = false -%} | |
| {%- endif -%} | |
| {%- set image_count = namespace(value=0) -%} | |
| {%- set audio_count = namespace(value=0) -%} | |
| {%- set video_count = namespace(value=0) -%} | |
| {%- set last_user_index = namespace(value=-1) -%} | |
| {%- macro render_content(content) -%} | |
| {%- if not content -%} | |
| {{- '' -}} | |
| {%- elif content is string -%} | |
| {{- content -}} | |
| {%- else -%} | |
| {%- for item in content -%} | |
| {%- if item['type'] == 'image' or 'image' in item or 'image_url' in item -%} | |
| {%- set image_count.value = image_count.value + 1 -%} | |
| {%- if not loop.first -%}{{- '\n' -}}{%- endif -%} | |
| {%- if add_vision_id -%}Picture {{ image_count.value }}: {% endif -%} | |
| <|img|><|imgpad|><|endofimg|> | |
| {%- elif item['type'] == 'video' or 'video' in item or 'video_url' in item -%} | |
| {%- set video_count.value = video_count.value + 1 -%} | |
| {%- if not loop.first -%}{{- '\n' -}}{%- endif -%} | |
| {%- if add_vision_id -%}Video {{ video_count.value }}: {% endif -%} | |
| <|video_pad|> | |
| {%- elif item['type'] == 'audio' or 'audio' in item or 'audio_url' in item -%} | |
| {%- set audio_count.value = audio_count.value + 1 -%} | |
| {%- if not loop.first -%}{{- '\n' -}}{%- endif -%} | |
| {%- if add_vision_id -%}Audio {{ audio_count.value }}: {% endif -%} | |
| <|audio_comp_start|><|audio_comp_pad|><|audio_comp_end|> | |
| {%- elif 'text' in item -%} | |
| {{- item['text'] -}} | |
| {%- endif -%} | |
| {%- endfor -%} | |
| {%- endif -%} | |
| {%- endmacro -%} | |
| {%- if tools -%} | |
| {{- '<|system|>' -}} | |
| {%- if messages[0]['role'] == 'system' -%} | |
| {{- render_content(messages[0]['content']) -}} | |
| {%- else -%} | |
| {{- 'You are a helpful assistant.' -}} | |
| {%- endif -%} | |
| {{- "\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" -}} | |
| {%- for tool in tools -%} | |
| {{- "\n" -}} | |
| {{- tool | tojson -}} | |
| {%- endfor -%} | |
| {{- "\n</tools>\n\nWhen making tool calls, use XML format to invoke tools and pass parameters:\n\n<dots_function_call>\n<invoke name=\"tool-name-1\">\n<parameter name=\"param-key-1\">\nparam-value-1\n</parameter>\n<parameter name=\"param-key-2\">\nparam-value-2\n</parameter>\n...\n</invoke>\n</dots_function_call><|endofsystem|>" -}} | |
| {%- else -%} | |
| {%- if messages[0]['role'] == 'system' -%} | |
| {{- '<|system|>' -}} | |
| {{- render_content(messages[0]['content']) -}} | |
| {{- '<|endofsystem|>' -}} | |
| {%- else -%} | |
| {{- '<|system|>You are a helpful assistant.<|endofsystem|>' -}} | |
| {%- endif -%} | |
| {%- endif -%} | |
| {%- for m in messages -%} | |
| {%- if m['role'] == 'user' -%} | |
| {%- set last_user_index.value = loop.index0 -%} | |
| {%- endif -%} | |
| {%- endfor -%} | |
| {%- for message in messages -%} | |
| {%- set content = render_content(message['content']) -%} | |
| {%- if (message['role'] == 'user') or (message['role'] == 'system' and not loop.first) -%} | |
| {{- '<|user|>' -}} | |
| {{- content -}} | |
| {%- if message['role'] == 'user' and enable_thinking is false and not content.endswith('<no_think>') -%} | |
| {{- '<no_think>' -}} | |
| {%- endif -%} | |
| {{- '<|endofuser|>' -}} | |
| {%- elif message['role'] == 'assistant' -%} | |
| {%- set reasoning_content = '' -%} | |
| {%- if message.reasoning_content is string -%} | |
| {%- set reasoning_content = message.reasoning_content -%} | |
| {%- else -%} | |
| {%- if '</think>' in content -%} | |
| {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') -%} | |
| {%- set content = content.split('</think>')[-1].lstrip('\n') -%} | |
| {%- endif -%} | |
| {%- endif -%} | |
| {%- set reasoning_content = reasoning_content|trim -%} | |
| {{- '<|assistant|>' -}} | |
| {%- if enable_thinking is false -%} | |
| {{- '<think>\n\n</think>\n\n' + content -}} | |
| {%- elif clear_thinking and loop.index0 < last_user_index.value -%} | |
| {{- '<think>\n\n</think>\n\n' + content -}} | |
| {%- elif reasoning_content -%} | |
| {{- '<think>\n' + reasoning_content + '\n</think>\n\n' + content -}} | |
| {%- else -%} | |
| {{- content -}} | |
| {%- endif -%} | |
| {%- if message.get('tool_calls') -%} | |
| {%- for tool_call in message['tool_calls'] -%} | |
| {%- if tool_call.function is defined -%} | |
| {%- set tool_call = tool_call.function -%} | |
| {%- endif -%} | |
| {{- '\n<dots_function_call>\n<invoke name="' -}} | |
| {{- tool_call.name -}} | |
| {{- '">' -}} | |
| {%- for arg_name, arg_value in tool_call.arguments.items() -%} | |
| {{- '\n<parameter name="' -}} | |
| {{- arg_name -}} | |
| {{- '">' -}} | |
| {{- '\n' -}} | |
| {%- if arg_value is string -%} | |
| {{- arg_value -}} | |
| {%- else -%} | |
| {{- arg_value|tojson -}} | |
| {%- endif -%} | |
| {{- '\n' -}} | |
| {{- '</parameter>' -}} | |
| {%- endfor -%} | |
| {{- '\n</invoke>\n</dots_function_call>' -}} | |
| {%- endfor -%} | |
| {%- endif -%} | |
| {{- '<|endofassistant|>' -}} | |
| {%- elif message['role'] == 'tool' -%} | |
| {%- if (loop.index0 == 0) or (messages[loop.index0 - 1]['role'] != 'tool') -%} | |
| {{- '<|user|>' -}} | |
| {%- endif -%} | |
| {{- '\n<dots_function_response>\n' -}} | |
| {{- content -}} | |
| {{- '\n</dots_function_response>' -}} | |
| {%- if loop.last or (messages[loop.index0 + 1]['role'] != 'tool') -%} | |
| {{- '<|endofuser|>' -}} | |
| {%- endif -%} | |
| {%- endif -%} | |
| {%- endfor -%} | |
| {%- if add_generation_prompt -%} | |
| {{- '<|assistant|>' -}} | |
| {%- if enable_thinking is false -%} | |
| {{- '<think>\n\n</think>\n\n' -}} | |
| {%- endif -%} | |
| {%- endif -%} |