How to use from
SGLang
Install from pip and serve model
# Install SGLang from pip:
pip install sglang
# Start the SGLang server:
python3 -m sglang.launch_server \
    --model-path "OpenDCAI/Omni-Edu-9B" \
    --host 0.0.0.0 \
    --port 30000
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:30000/v1/chat/completions" \
	-H "Content-Type: application/json" \
	--data '{
		"model": "OpenDCAI/Omni-Edu-9B",
		"messages": [
			{
				"role": "user",
				"content": [
					{
						"type": "text",
						"text": "Describe this image in one sentence."
					},
					{
						"type": "image_url",
						"image_url": {
							"url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
						}
					}
				]
			}
		]
	}'
Use Docker images
docker run --gpus all \
    --shm-size 32g \
    -p 30000:30000 \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HF_TOKEN=<secret>" \
    --ipc=host \
    lmsysorg/sglang:latest \
    python3 -m sglang.launch_server \
        --model-path "OpenDCAI/Omni-Edu-9B" \
        --host 0.0.0.0 \
        --port 30000
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:30000/v1/chat/completions" \
	-H "Content-Type: application/json" \
	--data '{
		"model": "OpenDCAI/Omni-Edu-9B",
		"messages": [
			{
				"role": "user",
				"content": [
					{
						"type": "text",
						"text": "Describe this image in one sentence."
					},
					{
						"type": "image_url",
						"image_url": {
							"url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
						}
					}
				]
			}
		]
	}'
Quick Links

OmniEdu-9B

OmniEdu-9B is part of OmniEdu, an open family of foundation models for K--12 learning and teaching, trained with a capability-oriented instruction-tuning corpus. It is a full-parameter fine-tune of Qwen/Qwen3.5-9B-Base on the OmniEdu corpus.

The corpus combines more than 100 educational resources and general instruction sources and organizes supervision around four complementary capabilities: subject competence (solving K--12 problems and explaining answers), curriculum grounding (grade level, knowledge points, prerequisites, difficulty and curriculum localization), diagnostic reasoning (identifying errors, misconceptions and missing prerequisites from learner work) and pedagogical action and scaffolding (selecting and executing interventions such as questions, hints, prerequisite review or direct explanation). A multi-stage pipeline performs deterministic cleaning, semantic auditing and rewriting, task-specific quality scoring, token-budgeted diversity selection, and pedagogical instruction assignment, yielding 69,999 examples and 15.96M supervised response tokens, including 60,951 education-specific examples.

Training

Training uses Llama-Factory with a learning rate of 5e-6, a maximum sequence length of 32,768, and 3 epochs.

Usage

1. Run with Transformers

import torch
from transformers import AutoProcessor, AutoModelForImageTextToText

model_id = "OmniEdu/Omni-Edu-9B"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id, dtype=torch.bfloat16).to("cuda")

messages = [
    {
        "role": "user",
        "content": [{"type": "text", "text": "Your question here."}],
    },
]
inputs = processor.apply_chat_template(
    messages, add_generation_prompt=True, tokenize=True,
    return_dict=True, return_tensors="pt",
).to(model.device)
out = model.generate(**inputs, max_new_tokens=512, do_sample=False)
print(processor.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))

For image inputs, add an image entry to the same message.

messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "path/or/url/to/image.jpg"},
            {"type": "text", "text": "Your question here."},
        ],
    },
]

2. Serve an OpenAI-compatible API with vLLM

Install a current vLLM release with Qwen3.5 support in a separate environment from the Transformers example, then launch the checkpoint:

pip install -U vllm

vllm serve OmniEdu/Omni-Edu-9B \
  --served-model-name omniedu \
  --dtype bfloat16 \
  --tensor-parallel-size 1 \
  --max-model-len 32768 \
  --reasoning-parser qwen3 \
  --default-chat-template-kwargs '{"enable_thinking": false}'

Set --tensor-parallel-size to the number of GPUs used for the model. Required GPU memory also depends on context length, concurrency, and vision inputs; reduce --max-model-len if needed.

Query the running server from another terminal:

curl http://localhost:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "omniedu",
    "messages": [{"role": "user", "content": "Your question here."}],
    "temperature": 0.0,
    "max_tokens": 512,
    "chat_template_kwargs": {"enable_thinking": false}
  }'

Intended use and limitations

OmniEdu supports research, educational prototypes, and teacher-assistance tools. Benchmark performance does not establish classroom learning gains. Models can give incorrect answers or unsuitable guidance; educators should review outputs before consequential use. The paper discusses evaluation coverage, multimodal limitations, and deployment considerations in more detail.

Citation

@article{liang2026omniedu,
  title={OmniEdu: Open Foundation Models for Learning and Teaching},
  author={Liang, Hao and Lin, Qihan and Qiang, Meiyi and Sun, Linzhuang and Feng, Hengyi and Chen, Mingrui and Qiu, Sizhe and Zhang, Wentao},
  journal={arXiv preprint arXiv:2609.23088},
  year={2026}
}
Downloads last month
29
Safetensors
Model size
9B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for OpenDCAI/Omni-Edu-9B

Finetuned
(613)
this model

Collection including OpenDCAI/Omni-Edu-9B

Paper for OpenDCAI/Omni-Edu-9B