Not in the top 1,000 by GitHub stars
Rinne414/lora-training-skill
Bring a folder of images, leave with a trained LoRA. Agent skills (SKILL.md) for quality-gated LoRA training: dataset doctor + safe fixer + one-confirmation training orchestration for SD-Trainer / lora-scripts-next. Anima-first, SD1.5/SDXL/Flux.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
dataset-doctor/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c2dbaa0bf8ae
No earlier version was observed for comparison.
lora-pipeline/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c2dbaa0bf8ae
No earlier version was observed for comparison.
lora-trainer/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → c2dbaa0bf8ae
No earlier version was observed for comparison.
Heat
Insufficient historyNot enough history yet to measure heat. It appears after a few days of data.
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- dataset-doctor
dataset-doctor - lora-pipeline
lora-pipeline - lora-trainer
lora-trainer
How it works
dataset-doctor
When your agent uses it
Audit and repair a kohya-style LoRA dataset before training. Use when the user asks to check, validate, inspect, fix, clean, 体检, or 修 a dataset, captions, or tags. Inspect image count, repeats and step budget, resolution and aspect buckets, duplicates, corrupt or non-RGB images, missing or empty captions, trigger consistency, and tag-frequency hygiene. Return a structural PASS, WARN, or FAIL report and apply only confirmed fix_dataset.py actions, dry-run first with displaced originals quarantined.
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
3,258 tokensWhen the skill is activated
Reference documents
11,587 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 默认职责
- 适用范围(不限 SD-Trainer)
- 触发与分支
- 读取导航
- 运行体检
- 解读结论
- 修复手册(对应 issue code)
- 自检
- 可验证案例
- 执行交接
Scripts executed separately
scripts/_common.pyscripts/check_cache.pyscripts/check_captions.pyscripts/check_subjects.pyscripts/doctor.pyscripts/fix_dataset.pyscripts/fix_extras.pyscripts/scan_dataset.pytests/test_dataset_doctor.pytests/test_fix_dataset.pytests/test_fix_in_use.pytests/test_stale_cache.pytests/test_subject_counts.py../lora-pipeline/scripts/tag_dataset.py
Files
SKILL.mdcore11,249 bytesagents/openai.yamlasset210 bytesscripts/_common.pyruns6,432 bytesscripts/check_cache.pyruns10,226 bytesscripts/check_captions.pyruns21,153 bytesscripts/check_subjects.pyruns7,577 bytesscripts/doctor.pyruns7,944 bytesscripts/fix_dataset.pyruns22,890 bytesscripts/fix_extras.pyruns4,528 bytesscripts/scan_dataset.pyruns19,689 bytestests/test_dataset_doctor.pyruns12,616 bytestests/test_fix_dataset.pyruns11,259 bytestests/test_fix_in_use.pyruns3,967 bytestests/test_stale_cache.pyruns12,691 bytestests/test_subject_counts.pyruns8,882 bytes../lora-pipeline/scripts/tag_dataset.pyruns22,674 bytes../references/anima-params.mddoc8,352 bytes../references/caption-guide.mddoc16,726 bytes../references/trainer-api.mddoc16,944 bytes
Read SKILL.md
# dataset-doctor — LoRA 数据集 / caption 体检 + 修复
在训练前对 LoRA 数据集与标注做**结构/卫生预检**,给出 **PASS / WARN / FAIL** 结论和按优先级排序的修复建议;PASS 不代表图像与 caption 的语义已经人工验证。确认后用 `fix_dataset.py` 一行命令执行修复。**体检只读**;修复**默认 dry-run**,加 `--apply` 才动文件,且**从不删除**——被移除的文件全部进数据集内的 `_quarantine/`(体检与训练都会忽略它),随时可还原。任何 `--apply` 都必须先得到用户确认。
底层针对 `lora-scripts-next`(SD-Trainer)的数据集约定:`train_data_dir` 下放 `<repeats>_<concept>` 子文件夹(如 `7_zkz` = 重复 7 次、概念 `zkz`),caption 是与图同名的 sidecar `.txt`——**单行**、逗号分隔、可在末尾用「`. `」接自然语言(已验证格式见 `../references/caption-guide.md`)。Anima `.json` caption 仅是 UI 宣称的可选项,训练端 v2.7.0 未发现读取实现,不要依赖。
## 默认职责
接收一个数据集路径,运行体检脚本,解读 JSON/报告,向用户说明问题与修复顺序;用户确认后用 `fix_dataset.py` 执行修复并重检。trainer 本身**只检查目录是否存在、有没有图**,不检查质量——质量这块由本 skill 负责,二者互补。
## 适用范围(不限 SD-Trainer)
体检与修复是**训练器无关**的:检查对象是标准 kohya 数据集约定(`<repeats>_<concept>` 文件夹 + 同名 sidecar caption),sd-scripts / kohya_ss / OneTrainer 等训练器通用;脚本全程离线、不碰 GPU、不需要 trainer 在线。用户打算在**任何**训练器上练 LoRA,体检都照做。只有两处例外:
View the complete source on GitHublora-pipeline
When your agent uses it
Build an Anima LoRA from a single-character or style name, from Danbooru collection through curation, section-ordered WD14 captions, dataset checks, confirmed training, fixed-seed checkpoint validation, and a staged Civitai draft. Use for requests such as make a LoRA of X, collect images and train a character LoRA, train and upload to Civitai, or build a dataset from scratch and publish. Delegate training to lora-trainer and structural checks to dataset-doctor; never train without confirmation and never auto-publish.
What it loads into context
Frontmatter
123 tokensAlways available to the agent
SKILL.md
3,012 tokensWhen the skill is activated
Reference documents
17,679 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 依赖的本地工具(环境相关)
- 工作目录布局
- 七个阶段(精确步骤)
- 委派导航
- 质量词
- 自检
- 可验证案例(端到端)
- 执行交接
Scripts executed separately
../dataset-doctor/scripts/doctor.pyscripts/build_dataset.pyscripts/collect.pyscripts/curate.pyscripts/dataset_profile.pyscripts/in_use_guard.pyscripts/make_civitai_pack.pyscripts/tag_dataset.pyscripts/validate.pytests/test_in_use_guard.pytests/test_pipeline_scripts.py
Files
../dataset-doctor/SKILL.mddoc11,249 bytes../dataset-doctor/scripts/doctor.pyruns7,944 bytesSKILL.mdcore10,122 bytesagents/openai.yamlasset219 bytesscripts/build_dataset.pyruns6,745 bytesscripts/collect.pyruns3,691 bytesscripts/curate.pyruns5,563 bytesscripts/dataset_profile.pyruns2,024 bytesscripts/in_use_guard.pyruns5,045 bytesscripts/make_civitai_pack.pyruns8,600 bytesscripts/tag_dataset.pyruns22,674 bytesscripts/validate.pyruns11,903 bytestests/test_in_use_guard.pyruns7,797 bytestests/test_pipeline_scripts.pyruns9,109 bytes../lora-trainer/SKILL.mddoc21,556 bytes../references/caption-guide.mddoc16,726 bytes../references/collect-and-tag.mddoc8,873 bytes../references/validate-and-publish.mddoc5,146 bytes
Read SKILL.md
# lora-pipeline — 从「角色名字」到「Civitai 草稿」的端到端流水线
把「帮我做一个 X 的 LoRA」变成一条受控流水线:**收图 → 精修 → 打标/复查 → 体检 → 训练 → 验证 → 打包上传(停在 Draft)**。本 skill 是**总指挥**——真正的训练交给 [`lora-trainer`](../lora-trainer/SKILL.md),质量交给 [`dataset-doctor`](../dataset-doctor/SKILL.md),自己负责把两端(收集/精修/打标 和 验证/发布)接起来。默认 **Anima 优先**。
> **两道人类闸门,不可移动:**
> 1. **训练前必须出「确认卡」** 并取得明确同意(继承 `lora-trainer` 的规则)——训练慢、占显存、难回退。
> 2. **绝不自动发布。** 全流程可以自动到 **Draft(草稿)**为止;点 Publish 是公开行为、会被索引,**必须由用户亲自点**。没有用户当场明说「发布」,绝不传 `--publish`。
## 依赖的本地工具(环境相关)
这些是外部本地工具;表中路径/端口是惯例默认值,脚本都可用 flag/env 覆盖。契约细节见两份参考文档。
| 工具 | 用途 | 默认位置 |
|---|---|---|View the complete source on GitHublora-trainer
When your agent uses it
Prepare and launch LoRA, LoKr, or T-LoRA training through lora-scripts-next (SD-Trainer), Anima-first. Use when the user asks to train a character, style, or concept LoRA, choose parameters or repeats and epochs, start a run, or monitor training on Anima, SD1.5, SDXL, or Flux. Organize and caption the dataset, run dataset-doctor, choose a documented starting preset from image count and VRAM, show one confirmation card, then call the mikazuki API and monitor its log.
What it loads into context
Frontmatter
126 tokensAlways available to the agent
SKILL.md
6,454 tokensWhen the skill is activated
Reference documents
16,390 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 适用范围(用户用的不是 SD-Trainer 时怎么办)
- 两条路径
- 快速通道(只需要一个图片文件夹)
- 进阶流程
- 训练完成后(别漏这步)
- 模型与适配器分支
- 读取导航
- 自检
- 可验证案例(快速通道)
- 执行交接
Scripts executed separately
../dataset-doctor/scripts/doctor.py../dataset-doctor/scripts/fix_dataset.py../lora-pipeline/scripts/tag_dataset.pyscripts/failure_catalogue.pyscripts/lora_base_info.pyscripts/task_insights.pyscripts/trainer_state.pyscripts/wddm_sysmem.pytests/test_failure_catalogue.pytests/test_lora_base_info.pytests/test_task_insights.pytests/test_trainer_state.pytests/test_wddm_sysmem.py
Files
../dataset-doctor/SKILL.mddoc11,249 bytes../dataset-doctor/scripts/doctor.pyruns7,944 bytes../dataset-doctor/scripts/fix_dataset.pyruns22,890 bytes../lora-pipeline/scripts/tag_dataset.pyruns22,674 bytesSKILL.mdcore21,556 bytesagents/openai.yamlasset215 bytesscripts/failure_catalogue.pyruns22,230 bytesscripts/lora_base_info.pyruns9,947 bytesscripts/task_insights.pyruns13,970 bytesscripts/trainer_state.pyruns15,458 bytesscripts/wddm_sysmem.pyruns15,480 bytestests/test_failure_catalogue.pyruns18,033 bytestests/test_lora_base_info.pyruns7,132 bytestests/test_task_insights.pyruns8,731 bytestests/test_trainer_state.pyruns15,940 bytestests/test_wddm_sysmem.pyruns10,640 bytes../references/anima-params.mddoc8,352 bytes../references/caption-guide.mddoc16,726 bytes../references/presets.mddoc5,226 bytes../references/trainer-api.mddoc16,944 bytes
Read SKILL.md
# lora-trainer — LoRA 训练编排入口
把「训练一个 LoRA」的意图,变成一次受控的训练:准备数据 → 体检 → 组装配置 → **用户确认** → 通过 trainer API 开训 → 监看 log。本 skill 默认 **Anima 优先**,也支持 SD1.5 / SDXL / Flux。
> 训练耗时、占显存、难回退。**在 `POST /api/run` 之前必须把组装好的配置摊给用户、明确确认**;未确认不开训。
底层 = `lora-scripts-next`(SD-Trainer)的 `mikazuki` FastAPI(`http://127.0.0.1:28000`,路由前缀 `/api`)。完整契约见 `../references/trainer-api.md`。
## 适用范围(用户用的不是 SD-Trainer 时怎么办)
本 skill 的**开训与打标只针对 SD-Trainer** 的 mikazuki API——`trainer-api.md` 的契约只对它成立。**绝不要**把这套 `/api/run` body 发给别的训练器(kohya_ss GUI、OneTrainer、ai-toolkit…),它们的 API 完全不同。用户在用别的训练器时,按可移植性分层处理:
1. **体检照做**:`dataset-doctor` 与 `fix_dataset.py` 是训练器无关的(标准 kohya `<repeats>_<concept>` + sidecar caption 约定),完整可用,全程离线。
2. **参数知识可借用**:`anima-params.md` / `presets.md` 的键就是 kohya sd-scripts 词汇(`network_dim`、`unet_lr`、repeats/epochs 步数预算)。可以据此给参数建议,或替用户生成一份 kohya 风格 TOML / 命令行,让他们在自己的训练器里手动跑。View the complete source on GitHubSkills included
- dataset-doctor
- lora-pipeline
- lora-trainer
Repository facts
- License
- MIT
- Created
- Jul 27, 2026
- Last pushed
- Oct 26, 2026
- Forks
- 1
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
- No broad tool permissions
- No dangerous shell commands
- 165 network referencesin 26 files: lora-pipeline/scripts/tag_dataset.py:20 references/trainer-api.md:7 lora-pipeline/scripts/validate.py:11 and 23 more
- No hidden or obfuscated text
- No instruction overrides
- 38 executable scriptsin 33 files: dataset-doctor/scripts/doctor.py:1 lora-pipeline/scripts/tag_dataset.py:1 dataset-doctor/scripts/fix_dataset.py:1 and 30 more
- 10 references to secretsin 6 files: lora-pipeline/scripts/tag_dataset.py:57 dataset-doctor/scripts/fix_dataset.py:565 lora-pipeline/scripts/validate.py:29 and 3 more
- No requests to vote in Hot
Show all 213 signals by file
dataset-doctor/SKILL.md
- Network accessline 98
`--apply` 之前 `fix_dataset.py` 会先问 trainer(`GET /api/datasets/in-use`)这个文件夹是不是正被排队或运行中的训练使用:是 → 退出码 3 并打印 STOP,什么都不改;先问用户,同意后同一条命令加 `--allow-in-use`。dry-run 不问;trainer 没开或太旧只打一行提示、照常继续(`--trainer-url` 可改地址,默认 `http://127.0.0.1:28000`)。 - Network accessline 98
`--apply` 之前 `fix_dataset.py` 会先问 trainer(`GET /api/datasets/in-use`)这个文件夹是不是正被排队或运行中的训练使用:是 → 退出码 3 并打印 STOP,什么都不改;先问用户,同意后同一条命令加 `--allow-in-use`。dry-run 不问;trainer 没开或太旧只打一行提示、照常继续(`--trainer-url` 可改地址,默认 `http://127.0.0.1:28000`)。 - Network accessline 98
`--apply` 之前 `fix_dataset.py` 会先问 trainer(`GET /api/datasets/in-use`)这个文件夹是不是正被排队或运行中的训练使用:是 → 退出码 3 并打印 STOP,什么都不改;先问用户,同意后同一条命令加 `--allow-in-use`。dry-run 不问;trainer 没开或太旧只打一行提示、照常继续(`--trainer-url` 可改地址,默认 `http://127.0.0.1:28000`)。
dataset-doctor/scripts/_common.py
- Executable scriptline 1
Executable file
dataset-doctor/scripts/check_cache.py
- Executable scriptline 1
Executable file
dataset-doctor/scripts/check_captions.py
- Executable scriptline 1
Executable file
dataset-doctor/scripts/check_subjects.py
- Executable scriptline 1
Executable file
dataset-doctor/scripts/doctor.py
dataset-doctor/scripts/fix_dataset.py
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 563
p.add_argument( "--trainer-url", default=os.environ.get("SD_TRAINER_URL", "http://127.0.0.1:28000"), - Network accessline 563
p.add_argument( "--trainer-url", default=os.environ.get("SD_TRAINER_URL", "http://127.0.0.1:28000"), - Network accessline 564
"--trainer-url", default=os.environ.get("SD_TRAINER_URL", "http://127.0.0.1:28000"), help="SD-Trainer base URL, asked before --apply whether the dataset is in use", - Network accessline 564
"--trainer-url", default=os.environ.get("SD_TRAINER_URL", "http://127.0.0.1:28000"), help="SD-Trainer base URL, asked before --apply whether the dataset is in use", - Network accessline 565
[Credential-related source omitted] - Network accessline 565
[Credential-related source omitted] - Access to secretsline 565
[Credential-related source omitted] - Access to secretsline 565
[Credential-related source omitted]
dataset-doctor/scripts/fix_extras.py
- Executable scriptline 1
Executable file
dataset-doctor/scripts/scan_dataset.py
- Executable scriptline 1
Executable file
dataset-doctor/tests/test_dataset_doctor.py
- Executable scriptline 1
Executable file
dataset-doctor/tests/test_fix_dataset.py
- Executable scriptline 1
Executable file
dataset-doctor/tests/test_fix_in_use.py
- Executable scriptline 1
Executable file - Network accessline 42
handler = type("H", (Handler,), {"status": status, "body": body}) self.server = HTTPServer(("127.0.0.1", 0), handler) self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 44
self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 89
def test_dry_run_never_asks_the_trainer(self) -> None: with mock.patch.object(X, "guard_apply", side_effect=AssertionError("asked")): code, _ = self.run_fix("http://127.0.0.1:9") - Network accessline 90
with mock.patch.object(X, "guard_apply", side_effect=AssertionError("asked")): code, _ = self.run_fix("http://127.0.0.1:9") self.assertEqual(code, 0) - Network accessline 91
code, _ = self.run_fix("http://127.0.0.1:9") - Network accessline 96
self.assertEqual(self.run_fix(trainer.url, "--apply")[0], 0) self.caption.write_text("1girl, 2girls", encoding="utf-8") code, err = self.run_fix("http://127.0.0.1:9", "--apply") - Network accessline 97
self.caption.write_text("1girl, 2girls", encoding="utf-8") code, err = self.run_fix("http://127.0.0.1:9", "--apply") self.assertEqual(code, 0) - Network accessline 98
code, err = self.run_fix("http://127.0.0.1:9", "--apply") - Network accessline 102
def test_missing_guard_module_is_a_note_not_an_error(self) -> None: with mock.patch.object(X, "load_in_use_guard", return_value=None): self.assertEqual(X.guard_apply(self.root, "http://127.0.0.1:9", False), 0) - Network accessline 104
self.assertEqual(X.guard_apply(self.root, "http://127.0.0.1:9", False), 0)
dataset-doctor/tests/test_stale_cache.py
dataset-doctor/tests/test_subject_counts.py
lora-pipeline/SKILL.md
- Network accessline 19
|---|---|---| | DanbooruDownload | 按 tag 下载图 | `C:\tools\DanbooruDownload`(env `DANBOORU_DL_DIR`) | | sd-image-sorter | WD14 打标 FastAPI | [Rinne414/sd-image-sorter](https://github.com/Rinne414/sd-image-sorter),`:8487`,兼容版本见 `collect-and-tag - Network accessline 20
| DanbooruDownload | 按 tag 下载图 | `C:\tools\DanbooruDownload`(env `DANBOORU_DL_DIR`) | | sd-image-sorter | WD14 打标 FastAPI | [Rinne414/sd-image-sorter](https://github.com/Rinne414/sd-image-sorter),`:8487`,兼容版本见 `collect-and-tag.md` | | SD-Tr - Network accessline 21
| sd-image-sorter | WD14 打标 FastAPI | [Rinne414/sd-image-sorter](https://github.com/Rinne414/sd-image-sorter),`:8487`,兼容版本见 `collect-and-tag.md` | - Network accessline 22
| SD-Trainer | 训练后端 mikazuki API | `http://127.0.0.1:28000`,`run_gui.bat` 启动 | - Network accessline 23
| ComfyUI | 验证出图 | `http://127.0.0.1:8188`(env `COMFY_URL`) |
lora-pipeline/scripts/build_dataset.py
- Executable scriptline 1
Executable file
lora-pipeline/scripts/collect.py
- Network accessline 1
"""Phase 1 — COLLECT. Download a character/concept image set from Danbooru via the DanbooruDownload CLI (https://github.com/storyAura/DanbooruDownload). - Executable scriptline 1
Executable file - Network accessline 2
the DanbooruDownload CLI (https://github.com/storyAura/DanbooruDownload). - Access to secretsline 26
[Credential-related source omitted]
lora-pipeline/scripts/curate.py
- Executable scriptline 1
Executable file - Network accessline 53
def source_url(image: Path) -> str | None: return f"https://danbooru.donmai.us/posts/{image.stem}" if image.stem.isdigit() else None - Network accessline 54
return f"https://danbooru.donmai.us/posts/{image.stem}" if image.stem.isdigit() else None
lora-pipeline/scripts/dataset_profile.py
- Executable scriptline 1
Executable file
lora-pipeline/scripts/in_use_guard.py
- Executable scriptline 1
Executable file - Network accessline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 46
url = f"{base_url.rstrip('/')}/api/datasets/in-use?{query}" try: with urllib.request.urlopen(url, timeout=timeout) as response: # noqa: S310 - local trusted service - Network accessline 47
try: with urllib.request.urlopen(url, timeout=timeout) as response: # noqa: S310 - local trusted service payload = json.loads(response.read().decode("utf-8")) - Network accessline 48
with urllib.request.urlopen(url, timeout=timeout) as response: # noqa: S310 - local trusted service
lora-pipeline/scripts/make_civitai_pack.py
- Executable scriptline 1
Executable file
lora-pipeline/scripts/tag_dataset.py
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Executable scriptline 1
Executable file - Network accessline 20
Flow (sd-image-sorter, http://127.0.0.1:8487, env SORTER_URL): - Network accessline 20
Flow (sd-image-sorter, http://127.0.0.1:8487, env SORTER_URL): - Network accessline 20
Flow (sd-image-sorter, http://127.0.0.1:8487, env SORTER_URL): - Network accessline 35
the user has agreed. Environment overrides: SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) - Network accessline 35
the user has agreed. Environment overrides: SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) - Network accessline 35
the user has agreed. Environment overrides: SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) - Network accessline 36
Environment overrides: SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) """ - Network accessline 36
Environment overrides: SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) """ - Network accessline 36
Environment overrides: SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) """ - Network accessline 37
SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) - Network accessline 37
SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) - Network accessline 37
SORTER_URL base URL of sd-image-sorter (default http://127.0.0.1:8487) - Network accessline 57
[Credential-related source omitted] - Network accessline 57
[Credential-related source omitted] - Network accessline 57
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Network accessline 114
url = SORTER + path data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request( - Network accessline 114
url = SORTER + path data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request( - Network accessline 114
url = SORTER + path data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request( - Network accessline 115
data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request( url, - Network accessline 115
data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request( url, - Network accessline 115
data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request( url, - Network accessline 116
req = urllib.request.Request( - Network accessline 116
req = urllib.request.Request( - Network accessline 116
req = urllib.request.Request( - Network accessline 122
for attempt in range(1, REQUEST_ATTEMPTS + 1): try: with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service - Network accessline 122
for attempt in range(1, REQUEST_ATTEMPTS + 1): try: with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service - Network accessline 122
for attempt in range(1, REQUEST_ATTEMPTS + 1): try: with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service - Network accessline 123
try: with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service response = json.loads(r.read().decode()) - Network accessline 123
try: with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service response = json.loads(r.read().decode()) - Network accessline 123
try: with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service response = json.loads(r.read().decode()) - Network accessline 124
with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service - Network accessline 124
with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service - Network accessline 124
with urllib.request.urlopen(req, timeout=timeout) as r: # noqa: S310 — local trusted service
lora-pipeline/scripts/validate.py
- Executable scriptline 1
Executable file - Network accessline 11
--trigger mych4r --target character --subject-tag 1girl Environment overrides: COMFY_URL base URL of ComfyUI (default http://127.0.0.1:8188) - Network accessline 12
Environment overrides: COMFY_URL base URL of ComfyUI (default http://127.0.0.1:8188) """ - Network accessline 13
COMFY_URL base URL of ComfyUI (default http://127.0.0.1:8188) - Network accessline 29
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 107
def read_response(request: str | urllib.request.Request, timeout: int) -> bytes: - Network accessline 108
request_url = request.full_url if isinstance(request, urllib.request.Request) else request - Network accessline 109
for attempt in range(1, REQUEST_ATTEMPTS + 1): try: with urllib.request.urlopen(request, timeout=timeout) as response: # noqa: S310 - Network accessline 110
try: with urllib.request.urlopen(request, timeout=timeout) as response: # noqa: S310 return response.read() - Network accessline 111
with urllib.request.urlopen(request, timeout=timeout) as response: # noqa: S310 - Network accessline 226
def post(wf: dict) -> str: req = urllib.request.Request( - Network accessline 227
req = urllib.request.Request(
lora-pipeline/tests/test_in_use_guard.py
- Executable scriptline 1
Executable file - Network accessline 60
self.handler = handler self.server = HTTPServer(("127.0.0.1", 0), handler) self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 61
self.server = HTTPServer(("127.0.0.1", 0), handler) self.url = f"http://127.0.0.1:{self.server.server_port}" self.thread = threading.Thread(target=self.server.serve_forever, daemon=True) - Network accessline 62
self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 96
self.assertEqual( guard.check_in_use("D:/x", "http://127.0.0.1:9", timeout=1)["state"], "unknown" - Network accessline 97
guard.check_in_use("D:/x", "http://127.0.0.1:9", timeout=1)["state"], "unknown" - Network accessline 147
def test_unreachable_trainer_does_not_block_a_build(self): self.assertEqual(self.run_main("http://127.0.0.1:9"), 0) - Network accessline 148
self.assertEqual(self.run_main("http://127.0.0.1:9"), 0) - Network accessline 187
with TrainerStub(404, {"detail": "Not Found"}) as stub: self.assertEqual(self.run_main(stub.url), -1) self.assertEqual(self.run_main("http://127.0.0.1:9"), -1) - Network accessline 189
self.assertEqual(self.run_main("http://127.0.0.1:9"), -1)
lora-pipeline/tests/test_pipeline_scripts.py
- Executable scriptline 1
Executable file - Network accessline 200
self.assertEqual( curate.source_url(Path("123456.png")), "https://danbooru.donmai.us/posts/123456", - Network accessline 201
curate.source_url(Path("123456.png")), "https://danbooru.donmai.us/posts/123456", ) - Network accessline 202
"https://danbooru.donmai.us/posts/123456",
lora-trainer/SKILL.md
- Network accessline 12
底层 = `lora-scripts-next`(SD-Trainer)的 `mikazuki` FastAPI(`http://127.0.0.1:28000`,路由前缀 `/api`)。完整契约见 `../references/trainer-api.md`。 - Network accessline 12
底层 = `lora-scripts-next`(SD-Trainer)的 `mikazuki` FastAPI(`http://127.0.0.1:28000`,路由前缀 `/api`)。完整契约见 `../references/trainer-api.md`。
lora-trainer/scripts/failure_catalogue.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 37
DEFAULT_BASE_URL = "http://127.0.0.1:28000" - Network accessline 371
def _get_json(url: str) -> tuple[int, Any]: try: with urllib.request.urlopen(url, timeout=REQUEST_TIMEOUT_SECONDS) as response: # noqa: S310 - Network accessline 372
try: with urllib.request.urlopen(url, timeout=REQUEST_TIMEOUT_SECONDS) as response: # noqa: S310 status, body = response.status, response.read() - Network accessline 373
with urllib.request.urlopen(url, timeout=REQUEST_TIMEOUT_SECONDS) as response: # noqa: S310
lora-trainer/scripts/lora_base_info.py
- Executable scriptline 1
#!/usr/bin/env python3
lora-trainer/scripts/task_insights.py
lora-trainer/scripts/trainer_state.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 43
DEFAULT_BASE_URL = "http://127.0.0.1:28000" - Network accessline 62
url = f"{base_url.rstrip('/')}{path}" data = None if body is None else json.dumps(body).encode("utf-8") request = urllib.request.Request( - Network accessline 63
data = None if body is None else json.dumps(body).encode("utf-8") request = urllib.request.Request( url, - Network accessline 64
request = urllib.request.Request( - Network accessline 69
) try: with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS) as response: # noqa: S310 - Network accessline 70
try: with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS) as response: # noqa: S310 status, raw = response.status, response.read() - Network accessline 71
with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS) as response: # noqa: S310
lora-trainer/scripts/wddm_sysmem.py
lora-trainer/tests/test_failure_catalogue.py
- Executable scriptline 1
Executable file - Network accessline 132
"UserWarning: pkg_resources is deprecated as an API.", 'INFO: 127.0.0.1:50190 - "GET /api/train/log/tail/abc?limit=12 HTTP/1.1" 200 OK', "INFO: Uvicorn running on http://127.0.0.1:28000", - Network accessline 133
'INFO: 127.0.0.1:50190 - "GET /api/train/log/tail/abc?limit=12 HTTP/1.1" 200 OK', "INFO: Uvicorn running on http://127.0.0.1:28000", 'loss_type = "l2"', - Network accessline 134
"INFO: Uvicorn running on http://127.0.0.1:28000", - Access to secretsline 180
[Credential-related source omitted] - Network accessline 318
self.addCleanup(self.server.server_close) self.addCleanup(self.server.shutdown) self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 319
self.addCleanup(self.server.shutdown) self.url = f"http://127.0.0.1:{self.server.server_port}" self._tmp = tempfile.TemporaryDirectory() - Network accessline 320
self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 354
def test_unreachable_trainer_is_reported(self) -> None: result = fc.poll_trainer("http://127.0.0.1:1", "t1", self.state, now=0.0) - Network accessline 355
result = fc.poll_trainer("http://127.0.0.1:1", "t1", self.state, now=0.0)
lora-trainer/tests/test_lora_base_info.py
- Executable scriptline 1
Executable file
lora-trainer/tests/test_task_insights.py
- Executable scriptline 1
Executable file - Network accessline 85
@property def url(self) -> str: return f"http://127.0.0.1:{self.server.server_port}" - Network accessline 87
return f"http://127.0.0.1:{self.server.server_port}" - Network accessline 108
self.assertEqual(result["source"], "trainer_api") self.assertEqual([i["name"] for i in result["previews"]], ["run_e000001_00_a.png"]) self.assertTrue(result["previews"][0]["url"].startswith("http://127.0.0.1:")) - Network accessline 109
self.assertEqual([i["name"] for i in result["previews"]], ["run_e000001_00_a.png"]) self.assertTrue(result["previews"][0]["url"].startswith("http://127.0.0.1:")) summary = result["loss_summary"] - Network accessline 110
self.assertTrue(result["previews"][0]["url"].startswith("http://127.0.0.1:"))
lora-trainer/tests/test_trainer_state.py
- Executable scriptline 1
Executable file - Network accessline 158
self.addCleanup(self.server.server_close) self.addCleanup(self.server.shutdown) self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 159
self.addCleanup(self.server.shutdown) self.url = f"http://127.0.0.1:{self.server.server_port}" self._tmp = tempfile.TemporaryDirectory() - Network accessline 160
self.url = f"http://127.0.0.1:{self.server.server_port}" - Network accessline 225
def test_unreachable_trainer_is_a_note_not_a_crash(self) -> None: result = ts.preflight("http://127.0.0.1:1", "anima-lora", {}) - Network accessline 226
result = ts.preflight("http://127.0.0.1:1", "anima-lora", {}) - Network accessline 344
Fake.run_response = { "status": "success", "data": {"task_id": "t-1", "train_log_stream_url": "http://x/stream"}, - Network accessline 345
"status": "success", "data": {"task_id": "t-1", "train_log_stream_url": "http://x/stream"}, } - Network accessline 346
"data": {"task_id": "t-1", "train_log_stream_url": "http://x/stream"},
lora-trainer/tests/test_wddm_sysmem.py
- Executable scriptline 1
Executable file - Network accessline 251
self.addCleanup(server.server_close) self.addCleanup(server.shutdown) url = f"http://127.0.0.1:{server.server_port}" - Network accessline 252
self.addCleanup(server.shutdown) url = f"http://127.0.0.1:{server.server_port}" self.assertEqual(ws.task_config_name(url, "t1"), "20261027-1.toml") - Network accessline 253
url = f"http://127.0.0.1:{server.server_port}" - Network accessline 254
self.assertEqual(ws.task_config_name(url, "t1"), "20261027-1.toml") self.assertIsNone(ws.task_config_name(url, "other")) self.assertIsNone(ws.task_config_name("http://127.0.0.1:1", "t1")) - Network accessline 256
self.assertIsNone(ws.task_config_name("http://127.0.0.1:1", "t1"))
references/caption-guide.md
- Network accessline 315
**Anima official model card** ([circlestone-labs/Anima](https://huggingface.co/circlestone-labs/Anima)): - Network accessline 315
**Anima official model card** ([circlestone-labs/Anima](https://huggingface.co/circlestone-labs/Anima)): - Network accessline 315
**Anima official model card** ([circlestone-labs/Anima](https://huggingface.co/circlestone-labs/Anima)):
references/collect-and-tag.md
- Network accessline 14
Tool: **DanbooruDownload** (`https://github.com/storyAura/DanbooruDownload`), a CLI - Network accessline 47
Tool: **[Rinne414/sd-image-sorter](https://github.com/Rinne414/sd-image-sorter)** — a - Network accessline 49
revision is `c449e3f3ab8057353955d8128ad46a6763daa5e9` or newer; the driver also checks required OpenAPI paths before changing captions. Run `run.bat` → serves `http://127.0.0.1:8487` (env `SORTER_URL`). Models - Network accessline 50
required OpenAPI paths before changing captions. Run `run.bat` → serves `http://127.0.0.1:8487` (env `SORTER_URL`). Models `wd-eva02-large-tagger-v3` / `wd-swinv2-tagger-v3` / `camie-tagger-v2` / - Network accessline 51
`http://127.0.0.1:8487` (env `SORTER_URL`). Models
references/trainer-api.md
- Network accessline 7
> The trainer must be running. Launch it with `run_gui.bat` (portable) or > `python gui.py`. The backend then serves on **`http://127.0.0.1:28000`** and - Network accessline 7
> The trainer must be running. Launch it with `run_gui.bat` (portable) or > `python gui.py`. The backend then serves on **`http://127.0.0.1:28000`** and - Network accessline 8
> `python gui.py`. The backend then serves on **`http://127.0.0.1:28000`** and - Network accessline 8
> `python gui.py`. The backend then serves on **`http://127.0.0.1:28000`** and - Network accessline 84
"train_log_path": "/train-log", "train_log_stream": "/api/train/log/stream/<task_id>", "train_log_url": "http://127.0.0.1:28000/train-log?task_id=<task_id>", - Network accessline 84
"train_log_path": "/train-log", "train_log_stream": "/api/train/log/stream/<task_id>", "train_log_url": "http://127.0.0.1:28000/train-log?task_id=<task_id>", - Network accessline 85
"train_log_stream": "/api/train/log/stream/<task_id>", "train_log_url": "http://127.0.0.1:28000/train-log?task_id=<task_id>", "train_log_stream_url": "http://127.0.0.1:28000/api/train/log/stream/<task_id>" - Network accessline 85
"train_log_stream": "/api/train/log/stream/<task_id>", "train_log_url": "http://127.0.0.1:28000/train-log?task_id=<task_id>", "train_log_stream_url": "http://127.0.0.1:28000/api/train/log/stream/<task_id>" - Network accessline 86
"train_log_url": "http://127.0.0.1:28000/train-log?task_id=<task_id>", - Network accessline 86
"train_log_url": "http://127.0.0.1:28000/train-log?task_id=<task_id>", - Network accessline 87
"train_log_stream_url": "http://127.0.0.1:28000/api/train/log/stream/<task_id>" - Network accessline 87
"train_log_stream_url": "http://127.0.0.1:28000/api/train/log/stream/<task_id>" - Network accessline 98
$body = Get-Content config.json -Raw $r = Invoke-RestMethod -Uri http://127.0.0.1:28000/api/run -Method Post ` - Network accessline 98
$body = Get-Content config.json -Raw $r = Invoke-RestMethod -Uri http://127.0.0.1:28000/api/run -Method Post ` - Network accessline 99
$r = Invoke-RestMethod -Uri http://127.0.0.1:28000/api/run -Method Post ` - Network accessline 99
$r = Invoke-RestMethod -Uri http://127.0.0.1:28000/api/run -Method Post ` - Network accessline 273
$body = @{ path = "D:/data/myproject/5_zkz"; additional_tags = "zkz"; threshold = 0.35 } | ConvertTo-Json Invoke-RestMethod -Uri http://127.0.0.1:28000/api/interrogate -Method Post ` - Network accessline 273
$body = @{ path = "D:/data/myproject/5_zkz"; additional_tags = "zkz"; threshold = 0.35 } | ConvertTo-Json Invoke-RestMethod -Uri http://127.0.0.1:28000/api/interrogate -Method Post ` - Network accessline 274
Invoke-RestMethod -Uri http://127.0.0.1:28000/api/interrogate -Method Post ` - Network accessline 274
Invoke-RestMethod -Uri http://127.0.0.1:28000/api/interrogate -Method Post `
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 1 fact
- Contacts danbooru.donmai.us, which SKILL.md, the README and the plugin manifest do not mentionlora-pipeline/scripts/curate.py:54High confidence
Signal confidence: 213 facts
- Network access in prose of the SKILL.mddataset-doctor/SKILL.md:98Low confidence
- Network access in prose of the SKILL.mddataset-doctor/SKILL.md:98Low confidence
- Network access in prose of the SKILL.mddataset-doctor/SKILL.md:98Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/_common.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/check_cache.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/check_captions.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/check_subjects.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/doctor.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/doctor.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/doctor.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/fix_dataset.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/fix_dataset.py:1Low confidence
- Network access in code of a file that runsdataset-doctor/scripts/fix_dataset.py:563High confidence
- Network access in code of a file that runsdataset-doctor/scripts/fix_dataset.py:563High confidence
- Network access in code of a file that runsdataset-doctor/scripts/fix_dataset.py:564High confidence
- Network access in code of a file that runsdataset-doctor/scripts/fix_dataset.py:564High confidence
- Network access in code of a file that runsdataset-doctor/scripts/fix_dataset.py:565High confidence
- Network access in code of a file that runsdataset-doctor/scripts/fix_dataset.py:565High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuedataset-doctor/scripts/fix_dataset.py:565Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuedataset-doctor/scripts/fix_dataset.py:565Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/fix_extras.py:1Low confidence
- Executable script in prose of a file that runsdataset-doctor/scripts/scan_dataset.py:1Low confidence
- Executable script in prose of a testdataset-doctor/tests/test_dataset_doctor.py:1Low confidence
- Executable script in prose of a testdataset-doctor/tests/test_fix_dataset.py:1Low confidence
- Executable script in prose of a testdataset-doctor/tests/test_fix_in_use.py:1Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:42Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:44Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:89Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:90Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:91Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:96Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:97Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:98Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:102Low confidence
- Network access in code of a testdataset-doctor/tests/test_fix_in_use.py:104Low confidence
- Executable script in prose of a testdataset-doctor/tests/test_stale_cache.py:1Low confidence
- Network access in code of a testdataset-doctor/tests/test_stale_cache.py:29Low confidence
- Executable script in prose of a testdataset-doctor/tests/test_subject_counts.py:1Low confidence
- Network access in code of a testdataset-doctor/tests/test_subject_counts.py:25Low confidence
- Network access in prose of the SKILL.mdlora-pipeline/SKILL.md:19Low confidence
- Network access in prose of the SKILL.mdlora-pipeline/SKILL.md:20Low confidence
- Network access in prose of the SKILL.mdlora-pipeline/SKILL.md:21Low confidence
- Network access in prose of the SKILL.mdlora-pipeline/SKILL.md:22Low confidence
- Network access in prose of the SKILL.mdlora-pipeline/SKILL.md:23Low confidence
- Executable script in prose of a file that runslora-pipeline/scripts/build_dataset.py:1Low confidence
- Network access in prose of a file that runslora-pipeline/scripts/collect.py:1Low confidence
- Executable script in prose of a file that runslora-pipeline/scripts/collect.py:1Low confidence
- Network access in prose of a file that runslora-pipeline/scripts/collect.py:2Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuelora-pipeline/scripts/collect.py:26Low confidence
- Executable script in prose of a file that runslora-pipeline/scripts/curate.py:1Low confidence
and 163 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md dataset-doctor/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md dataset-doctor/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md dataset-doctor/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md dataset-doctor/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md dataset-doctor/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md dataset-doctor/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.