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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit c2dbaa0bf8ae4f19aaa3f9d56714ce450793c63c

12GitHub stars
Not availablestars in 7 days
3skills in this repository
8commits in 30 days

Heat

Insufficient history

Not 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

Nov 2, 2026Nov 6, 202612

30-day change not yet available: not enough history.

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

3,258 tokens

When the skill is activated

Reference documents

11,587 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 默认职责
  2. 适用范围(不限 SD-Trainer)
  3. 触发与分支
  4. 读取导航
  5. 运行体检
  6. 解读结论
  7. 修复手册(对应 issue code)
  8. 自检
  9. 可验证案例
  10. 执行交接

Scripts executed separately

  • scripts/_common.py
  • scripts/check_cache.py
  • scripts/check_captions.py
  • scripts/check_subjects.py
  • scripts/doctor.py
  • scripts/fix_dataset.py
  • scripts/fix_extras.py
  • scripts/scan_dataset.py
  • tests/test_dataset_doctor.py
  • tests/test_fix_dataset.py
  • tests/test_fix_in_use.py
  • tests/test_stale_cache.py
  • tests/test_subject_counts.py
  • ../lora-pipeline/scripts/tag_dataset.py

Files

  • SKILL.mdcore11,249 bytes
  • agents/openai.yamlasset210 bytes
  • scripts/_common.pyruns6,432 bytes
  • scripts/check_cache.pyruns10,226 bytes
  • scripts/check_captions.pyruns21,153 bytes
  • scripts/check_subjects.pyruns7,577 bytes
  • scripts/doctor.pyruns7,944 bytes
  • scripts/fix_dataset.pyruns22,890 bytes
  • scripts/fix_extras.pyruns4,528 bytes
  • scripts/scan_dataset.pyruns19,689 bytes
  • tests/test_dataset_doctor.pyruns12,616 bytes
  • tests/test_fix_dataset.pyruns11,259 bytes
  • tests/test_fix_in_use.pyruns3,967 bytes
  • tests/test_stale_cache.pyruns12,691 bytes
  • tests/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 GitHub

Skills 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 shell

Automated signals, not a guarantee

Checked Nov 4, 2026

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

  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file
  • Executable scriptline 1
    Executable file

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

  • Executable scriptline 1
    Executable file
  • Network accessline 29
    NO_TRAINER = ["--trainer-url", "http://127.0.0.1:9"]  # never ask a real trainer from a test

dataset-doctor/tests/test_subject_counts.py

  • Executable scriptline 1
    Executable file
  • Network accessline 25
    NO_TRAINER = ["--trainer-url", "http://127.0.0.1:9"]  # never ask a real trainer from a test

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

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 42
    DEFAULT_BASE_URL = "http://127.0.0.1:28000"
  • Network accessline 56
    try:         with urllib.request.urlopen(url, timeout=timeout) as response:
  • Network accessline 57
    with urllib.request.urlopen(url, timeout=timeout) as response:

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

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 40
    DEFAULT_BASE_URL = "http://127.0.0.1:28000"
  • Network accessline 325
    try:         with urllib.request.urlopen(  # noqa: S310 - local trusted service
  • Network accessline 326
    with urllib.request.urlopen(  # noqa: S310 - local trusted service

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 `

references/validate-and-publish.md

  • Network accessline 14
    Before publishing, prove the character is consistent. Driver: `lora-pipeline/scripts/validate.py` → drives ComfyUI's API (`http://127.0.0.1:8188`, env `COMFY_URL`).
  • Network accessline 16
    (`http://127.0.0.1:8188`, env `COMFY_URL`).

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
Signal confidence: 213 facts

and 163 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md dataset-doctor/SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md dataset-doctor/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md dataset-doctor/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md dataset-doctor/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md dataset-doctor/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.