dphn/Dolphin3.0-Mistral-24B is the ungated mirror of the Dolphin 3.0 Mistral 24B — exactly what you asked for. It's ~48GB fp16, which needs GPU+CPU split (device_map="auto" with 32GB on GPU, ~16GB in RAM). Let me kick off the download and update the service in parallel.

This commit is contained in:
mike
2026-06-25 03:31:54 +02:00
parent 7b12ebd866
commit 27e8a09bc1
3 changed files with 214 additions and 5 deletions

View File

@@ -2362,7 +2362,8 @@ def _make_side_by_side(img1: Image.Image, img2: Image.Image,
def _scenery_worker(job_id: str, model_filename: str, scene_pil: Image.Image,
prompt: str, seed: int, extra_pils: list | None = None):
prompt: str, seed: int, extra_pils: list | None = None,
scene_video: str | None = None, extra_filename: str | None = None):
output_dir = _load_output_dir()
try:
model_path = os.path.join(output_dir, model_filename)
@@ -2390,10 +2391,16 @@ def _scenery_worker(job_id: str, model_filename: str, scene_pil: Image.Image,
try:
embedding = embeddings.generate_embedding(out_path)
next_order = database.get_next_sort_order(group_id)
# Store all source references: person image, background video (if any), extra ref (if any)
refs = [model_filename]
if scene_video:
refs.append(f"video:{scene_video}")
if extra_filename:
refs.append(extra_filename)
database.upsert_person(out_name, filepath=out_path, embedding=embedding,
group_id=group_id, prompt=prompt,
sort_order=next_order,
source_refs=json.dumps([model_filename]))
source_refs=json.dumps(refs))
except Exception as db_err:
print(f"[scenery] DB error: {db_err}")
jobs[job_id]["status"] = "done"
@@ -2455,11 +2462,50 @@ def generate_scenery(req: SceneryRequest):
threading.Thread(
target=_scenery_worker,
args=(job_id, req.model_filename, scene_pil, prompt, req.seed, extra_pils),
kwargs={"scene_video": req.scene_video if req.scene_video else None,
"extra_filename": req.extra_filename},
daemon=True,
).start()
return {"job_id": job_id, "model": req.model_filename}
@app.get("/scenery/library")
def scenery_library():
"""Return all scenery images grouped by source video reference."""
conn = database.get_db_connection()
cur = conn.cursor()
try:
cur.execute("""
SELECT filename, group_id, source_refs
FROM person
WHERE archived IS NOT TRUE
AND filename LIKE '%_sc_%'
AND source_refs IS NOT NULL
ORDER BY filename DESC
""")
rows = cur.fetchall()
finally:
cur.close()
database._put_db_connection(conn)
by_video: dict[str, list] = {}
ungrouped: list = []
for filename, group_id, source_refs_raw in rows:
try:
refs = json.loads(source_refs_raw) if source_refs_raw else []
except Exception:
refs = []
video = next((r[len("video:"):] for r in refs if r.startswith("video:")), None)
entry = {"filename": filename, "group_id": group_id, "refs": refs}
if video:
by_video.setdefault(video, []).append(entry)
else:
ungrouped.append(entry)
groups = [{"video": v, "items": items} for v, items in by_video.items()]
return {"groups": groups, "ungrouped": ungrouped}
# --- SAM2 background removal --------------------------------------------------
_sam2_predictor = None