Status: v3, a clear step up but not finished. On the same 72 probes (wording held out from training) v3 passes 88% greedy and 83% sampled, against 63% for v2. Greetings under agent prompts: 24/24 (v2: 11/24). On held-out real turns it picks the right kind of reply 91% of the time, never wrote another turn, made no duplicate calls and at most 4 parallel calls. It still repeats the call it just made instead of answering after a tool result under the
piprompt (after-tool probes: 4/10 greedy, 3/10 sampled; v2: 3/10), and once answered a thank-you with a tool call. Likely cause: thepiprompt never appears in the training data together with a tool result. It missed the pass bar set before the run (90% overall, 90% after-tool, 90% silent), so the 1,625-step run was not done.
A LoRA adapter (rank 16, alpha 16) for yandex/AliceAI-T5-35B-A0.6B, a 35B-total / 0.6B-active sparse-MoE encoder-decoder base model with no chat format. It teaches the model to chat, to call tools when a task needs them, to answer in text when it does not, and to say nothing when there is nothing to say.
| Adapter | kaivoss/AliceAI-T5-35B-A0.6B-chat-lora-v3 (this repo) |
| Merged bf16 weights | kaivoss/AliceAI-T5-35B-A0.6B-chat-v3 |
| Fine-tuning example | finetune_chat_lora.py in this repo |
| Earlier versions | v2 (61% of v2's probes, same recipe), v1 (superseded, known flaw) |
v1 ran inside an agent harness and misbehaved: a bare "hi" produced 17 to 22 parallel tool calls, "don't read any skills"
was ignored, replies were empty or endless. Cause, measured: its chat format used the vocabulary's [INST_START],
[REPLY_END], [SYSTEM_*], [TOOL_RESULT_*] tokens, whose embeddings in the base model are untrained placeholders,
identical to the unused <SPAN#5000>. The model could not tell roles apart or emit [REPLY_END], and LoRA on attention cannot
teach embeddings. placeholder_ids.json lists all 5,832 placeholder tokens, and a unit test fails if
the chat format ever uses one.
v2 switched to plain-text role markers and </s> as the end of a turn, and mixed plain chat into the data. It passed 61%
of its behaviour probes (base model: 11%) but still, under a coding-agent prompt, invented a task for a bare "hi" and called a
tool, repeated a tool call after its result instead of answering, over-thought simple questions, and answered "thanks" with
reasoning instead of silence.
v3 changes only the data (same recipe, so any difference is attributable to it): more greetings, small talk and "no tools" instructions under varied agent prompts; real "final answer right after a tool result" turns; reasoning capped at 600 tokens and stripped from a share of targets, so thinking is optional and short; thank-you silence under harness prompts; calls that repeat a recent call are never training targets. The probes were also rebuilt: greeting, negation, small-talk and thank-you wording is split by hash into train and probe pools, so the probes share no wording with the training data (a test asserts it). v2's probes partly overlapped its training phrasings, which flattered v2's negation score.
The base repo ships no chat template; chat_template.jinja defines one inside the model's UL2 frame:
encoder: [_S_]<|system|>…\n<|user|>…\n<|assistant|>…\n<|tool|>…\n<|assistant|><SPAN#0>
decoder: <s><SPAN#0> → <think>reasoning</think>text\n<tool_call>name<arg_key>k</arg_key><arg_value>v</arg_value></tool_call></s>
Tools go in the system message as text in the GLM format (# Tools … <tools>{json per line}</tools> …), produced by
glm_tools.py. Reasoning is optional and short. An empty reply is just </s>. Pass alice_frame=False to
apply_chat_template when a runtime adds [_S_] and <SPAN#0> itself (vLLM plugin below).
import torch
from huggingface_hub import hf_hub_download
from peft import PeftModel
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
hf_hub_download("kaivoss/AliceAI-T5-35B-A0.6B-chat-lora-v3", "alice_chat.py", local_dir=".")
from alice_chat import clean_decode, parse_output
BASE, ADAPTER = "yandex/AliceAI-T5-35B-A0.6B", "kaivoss/AliceAI-T5-35B-A0.6B-chat-lora-v3"
tok = AutoTokenizer.from_pretrained(ADAPTER, trust_remote_code=True) # carries the chat template
model = AutoModelForSeq2SeqLM.from_pretrained(BASE, trust_remote_code=True, dtype=torch.bfloat16,
attn_implementation="eager", device_map={"": "cuda:0"})
model = PeftModel.from_pretrained(model, ADAPTER).eval() # or load the merged repo directly
messages = [{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Give me one fact about Zürich."}]
prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
src = tok(prompt, add_special_tokens=False, return_tensors="pt").input_ids.to(model.device)
span = tok.convert_tokens_to_ids("<SPAN#0>")
dec = torch.tensor([[model.config.decoder.bos_token_id, span]], device=model.device)
out = model.generate(input_ids=src, attention_mask=torch.ones_like(src), decoder_input_ids=dec,
do_sample=True, temperature=0.6, top_p=0.95, max_new_tokens=512)
gen = out[0, 2:].tolist()
gen = gen[: gen.index(tok.eos_token_id)] if tok.eos_token_id in gen else gen
reasoning, content, tool_calls = parse_output(clean_decode(tok, gen))
Use sampling, not greedy: greedy decoding looped in testing.
The community plugin (AntonProkopyev/AliceAI-T5-35B-A0.6B-vLLM)
loads the merged repo unchanged, but it only serves /v1/completions and adds the UL2 frame itself.
alice_openai_shim.py sits in front of it and provides /v1/chat/completions with tools,
reasoning and streaming (simulated). It also samples by default (the harness sends no temperature), merges duplicate tool
calls, caps parallel calls, never lets a turn continue as the user, and retries an empty reply after a user or tool message.
serve_smoke.py exercises it with the openai Python client.
| Method | LoRA (bf16 base; not QLoRA, not full fine-tuning) |
| Rank / alpha / dropout | 16 / 16 / 0.05 (scale 1.0) |
| Targets | q_proj, k_proj, v_proj, o_proj in encoder self-attn, decoder self-attn and decoder cross-attn (experts are fused parameters, not nn.Linear) |
| Steps | 200 (batch 1 × 8 accumulation, each example seen once) |
| Optimiser | AdamW, lr 2e-4, cosine, 10 warmup steps, bf16, gradient checkpointing |
| Context | up to 32,768 tokens; longer examples are skipped per turn, never truncated, and turn choice is fit-aware so no row is lost |
| Attention | SDPA (the remote code does not declare it; enable_sdpa() sets the flag, checked against eager on padded batches) |
| Hardware | 1 × H200 |
One example per assistant turn: the encoder reads everything before it, the decoder learns that turn, then </s>.
| category | examples | mean tokens | max tokens | reply kinds |
|---|---|---|---|---|
agent_action |
700 | 16,678 | 31,243 | {'action': 700} |
agent_final |
300 | 13,169 | 30,144 | {'final': 300} |
agent_plain |
220 | 6,503 | 22,574 | {'plain': 220} |
chat_plain |
220 | 363 | 1,605 | {'plain': 220} |
chat_tools |
200 | 4,333 | 7,464 | {'plain': 200} |
eval_agent |
100 | 13,667 | 29,464 | {'action': 87, 'plain': 13} |
eval_chat |
40 | 585 | 1,240 | {'plain': 40} |
harness |
250 | 2,599 | 6,805 | {'plain': 250} |
silent_agent |
55 | 13,256 | 27,671 | {'silent': 55} |
silent_synth |
55 | 2,118 | 6,047 | {'silent': 55} |
Sources: real agent trajectories (UltraData-SFT-Agent-2609,
GLM-formatted copy linked above), plain Q&A from UltraData-SFT-2605
(English IF and Knowledge), greetings and system-prompted chats from
smoltalk, a sanitized capture of the pi coding-agent prompt and tool
schemas (harness_pi.json), and templated greetings, small talk, "no tools" instructions and thank-yous
(phrases.py). Targets are filtered to at most 8 parallel calls, 600 reasoning tokens and no repeat of a recent call.
Held-out rows are never trained on.
Behaviour probes (probes.py): greetings, "don't use tools", small talk and plain questions under pi-style
prompts (with and without a 14-skill list, and with a tool subset) and a non-coding weather / calculator / search assistant;
real actions; answering after a tool result; silence after a thank-you. A probe passes only if every expectation holds, the reply
finished, and it never wrote another turn. The previous adapter is scored on the same probes.
| probe category | this adapter, greedy | this adapter, sampled | previous adapter (v2), greedy |
|---|---|---|---|
| action | 7/8 | 8/8 | 6/8 |
| after_tool | 4/10 | 3/10 | 3/10 |
| greeting | 24/24 | 23/24 | 11/24 |
| neg_question | 4/4 | 4/4 | 4/4 |
| negation | 7/8 | 6/8 | 6/8 |
| plain_question | 4/4 | 3/4 | 4/4 |
| silent | 7/8 | 7/8 | 5/8 |
| smalltalk | 6/6 | 6/6 | 6/6 |
| all probes passed | 88% | 83% | 62% |
Held-out real turns (this adapter):
n = 60 held-out rows, greedy, 1,024 new tokens.
| metric | adapter |
|---|---|
| generations cut off at the token cap (not judged below) | 5.0% |
| right kind of reply (tool call / text / nothing) | 91.2% |
| ... when the right reply was a tool call | 88.1% |
| ... when the right reply was text | 100.0% |
| ... when the right reply was nothing | n/a |
| first tool name matches the real one | 51.4% |
| wrote another turn (`< | user |
| turns with duplicate tool calls | 0.0% |
| most tool calls in one turn | 4 |
These are small samples (72 probes, a few dozen held-out rows) of greedy or single-sample generations. They check for the specific failures above; they are not a capability benchmark. Tool-call arguments are not checked, only the tool name, and the tool-name metric counts a reasonable alternative as wrong.
clean_decode from
alice_chat.py (important for code in tool arguments).bash commands if a harness lets it.Apache-2.0, matching the base model (© Yandex LLC) and the data (UltraData: arXiv:2602.09003; smoltalk: Apache-2.0 for its new subsets).
Have the files? Submit a torrent.
Submit a torrentHave the complete files and permission to share them? Replace the example folder path. The script checks the files, makes a torrent and submits its magnet and checksums. Keep your torrent client seeding. Get your community key from your settings, and read the script before running it.
curl -fsSL https://pirateface.co/package.sh | bash -s -- --repo kaivoss/AliceAI-T5-35B-A0.6B-chat-lora-v3 ./model-folderyandex/AliceAI-T5-35B-A0.6B