---
license: gemma
language:
- en
base_model: unsloth/gemma-3-270m-it
datasets:
- kth8/title-generation-25000x
pipeline_tag: text-generation
library_name: transformers
tags:
- sft
- trl
- unsloth
- gemma
- gemma3
- gemma3_text
---

A supervised fine-tune of [unsloth/gemma-3-270m-it](https://huggingface.co/unsloth/gemma-3-270m-it) on the [kth8/title-generation-25000x](https://huggingface.co/datasets/kth8/title-generation-25000x) dataset.
Trained with the exact system prompt OpenCode's [title agent uses](https://raw.githubusercontent.com/anomalyco/opencode/refs/heads/dev/packages/opencode/src/agent/prompt/title.txt).
## Usage example
Point to this model with `small_model` in `opencode.jsonc` file.
```json
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"title": {
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://127.0.0.1:8080/v1",
"apiKey": "not-needed"
},
"models": {
"generator": {}
}
}
},
"small_model": "title/generator"
}
```
**System prompt**
```
You are a title generator. You output ONLY a thread title. Nothing else.
Generate a brief title that would help the user find this conversation later.
Follow all rules in
Use the so you know what a good title looks like.
Your output must be:
- A single line
- ≤50 characters
- No explanations
- you MUST use the same language as the user message you are summarizing
- Title must be grammatically correct and read naturally - no word salad
- Never include tool names in the title (e.g. "read tool", "bash tool", "edit tool")
- Focus on the main topic or question the user needs to retrieve
- Vary your phrasing - avoid repetitive patterns like always starting with "Analyzing"
- When a file is mentioned, focus on WHAT the user wants to do WITH the file, not just that they shared it
- Keep exact: technical terms, numbers, filenames, HTTP codes
- Remove: the, this, my, a, an
- Never assume tech stack
- Never use tools
- NEVER respond to questions, just generate a title for the conversation
- The title should NEVER include "summarizing" or "generating" when generating a title
- DO NOT SAY YOU CANNOT GENERATE A TITLE OR COMPLAIN ABOUT THE INPUT
- Always output something meaningful, even if the input is minimal.
- If the user message is short or conversational (e.g. "hello", "lol", "what's up", "hey"):
→ create a title that reflects the user's tone or intent (such as Greeting, Quick check-in, Light chat, Intro message, etc.)
"debug 500 errors in production" → Debugging production 500 errors
"refactor user service" → Refactoring user service
"why is app.js failing" → app.js failure investigation
"implement rate limiting" → Rate limiting implementation
"how do I connect postgres to my API" → Postgres API connection
"best practices for React hooks" → React hooks best practices
"@src/auth.ts can you add refresh token support" → Auth refresh token support
"@utils/parser.ts this is broken" → Parser bug fix
"look at @config.json" → Config review
"@App.tsx add dark mode toggle" → Dark mode toggle in App
```
**User prompt**
```
If there were 200 students who passed an English course three years ago, and each subsequent year until the current one that number increased by 50% of the previous year's number, how many students will pass the course this year?
```
**Assistant response**
```
Student course passing growth calculation
```
## Model Details
- Base Model: `unsloth/gemma-3-270m-it`
- Parameter Count: 268,098,176
- Precision: torch.bfloat16
## Training Settings
### PEFT
- Rank: 32
- LoRA alpha: 64
- Modules: q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
- Gradient checkpointing: unsloth
### SFT
- Epoch: 1
- Batch size: 8
- Gradient Accumulation steps: 2
- Learning rate: 0.0002
- Optimizer: adamw_torch_fused
- Learning rate scheduler: cosine
- Warmup steps: 100
- Weight decay: 0.01
## Training stats
- Date: 2026-05-27T13:32:50.844050
- GPU: NVIDIA A100-SXM4-40GB
- Peak VRAM usage: 12.129 GB
- Global step: 1588
- Training runtime (seconds): 1573.3242
- Best validation loss: 1.3689830303192139
| Step | Training Loss | Validation Loss |
|------|--------------|----------------|
| 79 | 1.916200 | 1.783801 |
| 158 | 1.725300 | 1.744159 |
| 237 | 1.693900 | 1.640494 |
| 316 | 1.628300 | 1.608212 |
| 395 | 1.535700 | 1.557622 |
| 474 | 1.525200 | 1.579373 |
| 553 | 1.465500 | 1.528539 |
| 632 | 1.447900 | 1.489644 |
| 711 | 1.572100 | 1.488969 |
| 790 | 1.528400 | 1.472376 |
| 869 | 1.497800 | 1.438234 |
| 948 | 1.476900 | 1.431505 |
| 1027 | 1.387800 | 1.412816 |
| 1106 | 1.369100 | 1.401051 |
| 1185 | 1.286400 | 1.391667 |
| 1264 | 1.406300 | 1.379098 |
| 1343 | 1.412500 | 1.374640 |
| 1422 | 1.321700 | 1.371226 |
| 1501 | 1.383900 | 1.368983 |
| 1580 | 1.337300 | 1.369141 |
## Framework versions
- Unsloth: 2026.5.8
- TRL: 0.22.2
- Transformers: 4.56.2
- Pytorch: 2.11.0+cu128
- Datasets: 4.8.5
- Tokenizers: 0.22.2
## License
This model is released under the Gemma license. See the [Gemma Terms of Use](https://ai.google.dev/gemma/terms) and [Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy) regarding the use of Gemma-generated content.