CoolFace
Datasetpublic

jensjepsen/danish-tool-dialogues-v9

danish-tool-dialogues-v1 Danish multi-turn tool-use conversations with reasoning, translated from the Glaive subset of Nanbeige/ToolMind (Apache-2.0) by scripts/translate_toolmind_da.py. Complements danish-tool-calls-v1, which is single-turn and synthetic. Here the conversations run several turns, tool results are fed back, and the assistant reasons before calling. split rows train 34,168 eval_seen_tools 698 eval_unseen_tools 768 eval_seen_sym 752… See the full description on the dataset page: https://huggingface.co/datasets/jensjepsen/danish-tool-dialogues-v9.

sourceHugging Faceapache-2.0updated 19d agoView on Hugging Face
0likes308downloads
Dataset Card

danish-tool-dialogues-v1

Danish multi-turn tool-use conversations with reasoning, translated from the Glaive subset of `Nanbeige/ToolMind` (Apache-2.0) by scripts/translate_toolmind_da.py.

Complements danish-tool-calls-v1, which is single-turn and synthetic. Here the conversations run several turns, tool results are fed back, and the assistant reasons before calling.

splitrows
train34,168
eval_seen_tools698
eval_unseen_tools768
eval_seen_sym752
eval_unseen_sym768

923 distinct tools; 59 names are held out entirely, so eval_unseen_tools measures whether the model can call a tool it has never been trained on. eval_seen_tools holds out conversations rather than tools, isolating dialogue novelty from tool novelty.

What is Danish and what is not

Danish: user turns, the assistant's reasoning and replies, tool and parameter descriptions, enum values, and natural-language argument values — including content the user chose, such as a note title.

Unchanged: tool names, parameter keys, every JSON key, and machine values (acronyms, dates, numbers, emails, URLs, ISO codes, snake_case identifiers). A Danish user talks to an English-named API, and pinning the surface keeps the data exactly verifiable — a reward function can compare keys and names for equality.

Enum values are translated, but once: the spec's list is translated and every invocation inherits that exact string, so the contract stays coherent rather than English. A call carrying "cirkel" is valid only if the spec offers "cirkel".

Reasoning is plain assistant text. The source <think> wrapper is removed.

Gates

Every row is checked mechanically: structure identical to the source (keys, nesting, types), tool names and parameter keys byte-identical, enum spec and invocations in agreement, argument values traceable to the conversation that introduced them, machine identifiers surviving inside Danish prose, and translated fields detected as Danish by langdetect. Six planted controls, one per check, must fail on every run — a gate that never fires is indistinguishable from clean data.

failurerows
still-english90
identifier-in-danish34
segment-count-changed29
dnt-token-lost12
call-args-undeclared:['numbers']5
call-args-undeclared:['number']4
required-undeclared:['keyword']2
call-args-undeclared:['source_currency', 'target_currency']2
call-args-undeclared:['base', 'height', 'radius']2
call-args-undeclared:['diet', 'ingredients']2
call-args-undeclared:['destination', 'mode', 'origin']2
call-args-undeclared:['height', 'radius', 'width']2
call-args-undeclared:['category']2
required-undeclared:['text']2
call-args-undeclared:['word']2
call-args-undeclared:['ingredients']1
call-args-undeclared:['keyword']1
call-args-undeclared:['country', 'language']1
required-undeclared:['stock_symbol']1
call-args-undeclared:['stock_symbol']1
call-args-undeclared:['items']1
call-args-undeclared:['locations']1
call-args-undeclared:['password']1
required-undeclared:['data']1
call-args-undeclared:['data']1
call-args-undeclared:['principal']1
call-args-undeclared:['customer_name', 'price', 'product_name']1
required-undeclared:['number']1
call-args-undeclared:['keywords', 'year']1
call-args-undeclared:['cuisine']1
call-args-undeclared:['grades']1
call-args-undeclared:['movie_id']1
call-args-undeclared:['parameters']1
call-args-undeclared:['length', 'radius', 'width']1
call-args-undeclared:['loan_amount', 'loan_term']1
call-args-undeclared:['text']1
call-args-undeclared:['from_currency', 'to_currency']1
call-args-undeclared:['discount_percentage', 'original_price']1
call-args-undeclared:['type']1
call-args-undeclared:['query']1
call-args-undeclared:['year']1
required-undeclared:['category']1
call-args-undeclared:['from', 'to']1
call-args-undeclared:['include_numbers', 'include_symbols']1
required-undeclared:['word']1
required-undeclared:['numbers']1
call-args-undeclared:['destination']1
call-args-undeclared:['dimensions', 'shape']1
call-args-undeclared:['mode']1

205 rows failed and are published under the rejected config with their verdicts rather than dropped silently. Most are a single skipped short description; they are usable with care.

Known limitations

Conversations whose subject is language (translate_text, detect_language) were removed at source — translating them destroys the premise, since a user asking to translate an English sentence ends up quoting a Danish one while the call still says source_language="English".

Grammatical gender and inflection errors occur at a low rate and no mechanical gate detects them.

Configs

default (tools + conversations as JSON strings, plus counts and tool names), sft (messages only, for completion-only training), en (the untranslated source row), rejected.

tools and conversations are JSON strings rather than nested structs: the tool schemas are heterogeneous enough that Arrow cannot infer a single type across 18k rows. json.loads them. sft is structured, since its message objects are uniform.