Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
ff99d4b
feat(ml): store embeddings and retrain a classifier head from verifie…
mohamedelabbas1996 Sep 3, 2026
c8999fa
feat(ml): return embeddings from the BioCLIP service and let it retra…
mohamedelabbas1996 Sep 3, 2026
fcdb01e
feat(ml): train a head from a project's taxa list and record what it …
mohamedelabbas1996 Sep 13, 2026
f60ac2d
feat(ml): keep the species a head already knew, and offer every head …
mohamedelabbas1996 Sep 13, 2026
d0cb601
fix(compose): stop nginx rejecting real trap captures in local develo…
mohamedelabbas1996 Sep 13, 2026
101a83d
fix(ml): stop a retrain from registering two versions of the same head
mohamedelabbas1996 Sep 14, 2026
bf5e050
feat(ml): score a model against a fixed set of occurrences people hav…
mohamedelabbas1996 Sep 14, 2026
f0be001
feat(ml): show how each model performs, per species and per taxa list
mohamedelabbas1996 Sep 14, 2026
9c8bdd7
feat(jobs): let people start training and evaluation jobs without the…
mohamedelabbas1996 Sep 15, 2026
00e8c67
Merge upstream main into the classifier-head retraining branch
mohamedelabbas1996 Sep 17, 2026
cdd09bc
fix(ml): stop the BioCLIP service losing the requests module inside a…
mohamedelabbas1996 Sep 17, 2026
be1abd1
fix(jobs): stop requiring a pipeline on ML jobs that never needed one
mohamedelabbas1996 Sep 17, 2026
8ec3704
refactor(ml): move the BioCLIP service to the companion repo where th…
mohamedelabbas1996 Sep 17, 2026
7501e29
Merge the model-performance UI branch
mohamedelabbas1996 Sep 17, 2026
7c8ede8
Merge the UI branch: evaluation-set picker follows its route
mohamedelabbas1996 Sep 17, 2026
93acc47
refactor(main): keep occurrence sets with the other named collections…
mohamedelabbas1996 Sep 17, 2026
e971071
fix(ml): count the crops a retrain will actually use, not the ones pa…
mohamedelabbas1996 Sep 17, 2026
8ab83b3
Merge the UI branch: show occurrences a model was not asked about
mohamedelabbas1996 Sep 17, 2026
d0827df
fix(ml): record which training set each retrained version was fitted on
mohamedelabbas1996 Sep 18, 2026
9cec79d
Merge remote-tracking branch 'upstream/main' into feat/bioclip-antenn…
mohamedelabbas1996 Sep 20, 2026
7214491
fix(ml): show a project the evaluation sets it is allowed to score ag…
mohamedelabbas1996 Sep 21, 2026
cc71547
perf(ml): look up the best model once per page, not once per taxa list
mohamedelabbas1996 Sep 21, 2026
8b30351
fix(ml): show a project only the evaluations it is allowed to see
mohamedelabbas1996 Sep 21, 2026
ad2e799
chore(lint): fix the import order that was failing the lint job
mohamedelabbas1996 Sep 21, 2026
cd3f2b3
fix(jobs): stop the job form saying "A Evaluate algorithm job"
mohamedelabbas1996 Sep 21, 2026
c04a2ce
Merge remote-tracking branch 'upstream/main' into feat/bioclip-antenn…
mohamedelabbas1996 Sep 23, 2026
cde6975
fix(permissions): let project managers run the retraining jobs, not o…
mohamedelabbas1996 Sep 23, 2026
531dbe3
feat(ml): keep a copy of every head a retraining run produces
mohamedelabbas1996 Sep 24, 2026
ccc23ef
fix(ml): stop reading /info from erasing where a retrained head's wei…
mohamedelabbas1996 Sep 24, 2026
f2bd01b
test(ml): use the request headers argument Django 4.2 expects
mohamedelabbas1996 Sep 24, 2026
1542960
fix(jobs): refuse an evaluation set or taxa list from another project
mohamedelabbas1996 Sep 28, 2026
02c2b28
fix(ml): take the callback and upload targets from settings, not the …
mohamedelabbas1996 Sep 29, 2026
d992624
style(jobs): reformat the scoping tests as black wants them
mohamedelabbas1996 Sep 29, 2026
ac6ae68
fix(jobs): let a job type say how long it may go quiet before it look…
mohamedelabbas1996 Sep 29, 2026
533c5cc
fix(jobs): refuse a head upload once the training job has finished
mohamedelabbas1996 Sep 29, 2026
756ef8e
fix(ml): scope evaluation reads to a project the caller may actually see
mohamedelabbas1996 Sep 29, 2026
01cfb45
fix(ml): score a model against people, and say what the score covers
mohamedelabbas1996 Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions ami/base/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,15 @@ def _get_project(self):
if hasattr(view, "get_active_project"):
return view.get_active_project()
return None


class TrainingDataPagination(LimitOffsetPagination):
"""
Paging for embedding rows, which are far bigger than a normal API row.

A 1024-dimension vector serialises to roughly 20 KB of JSON, so the platform default
of 10 is uselessly small and an unbounded limit would return hundreds of megabytes.
"""

default_limit = 200
max_limit = 1000
31 changes: 31 additions & 0 deletions ami/jobs/migrations/0024_train_classifier_job_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 4.2.10 on 2026-09-02 13:35

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("jobs", "0023_alter_job_job_type_key"),
]

operations = [
migrations.AlterField(
model_name="job",
name="job_type_key",
field=models.CharField(
choices=[
("ml", "ML pipeline"),
("populate_captures_collection", "Populate capture set"),
("data_storage_sync", "Data storage sync"),
("regroup_events", "Regroup sessions"),
("unknown", "Unknown"),
("data_export", "Data Export"),
("post_processing", "Post Processing"),
("train_classifier", "Train classifier"),
],
default="unknown",
max_length=255,
verbose_name="Job Type",
),
),
]
32 changes: 32 additions & 0 deletions ami/jobs/migrations/0025_generate_embeddings_job_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 4.2.10 on 2026-09-03 16:54

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("jobs", "0024_train_classifier_job_type"),
]

operations = [
migrations.AlterField(
model_name="job",
name="job_type_key",
field=models.CharField(
choices=[
("ml", "ML pipeline"),
("populate_captures_collection", "Populate capture set"),
("data_storage_sync", "Data storage sync"),
("regroup_events", "Regroup sessions"),
("unknown", "Unknown"),
("data_export", "Data Export"),
("post_processing", "Post Processing"),
("train_classifier", "Train classifier"),
("generate_embeddings", "Generate embeddings"),
],
default="unknown",
max_length=255,
verbose_name="Job Type",
),
),
]
33 changes: 33 additions & 0 deletions ami/jobs/migrations/0026_evaluation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.10 on 2026-09-13 15:49

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("jobs", "0025_generate_embeddings_job_type"),
]

operations = [
migrations.AlterField(
model_name="job",
name="job_type_key",
field=models.CharField(
choices=[
("ml", "ML pipeline"),
("populate_captures_collection", "Populate capture set"),
("data_storage_sync", "Data storage sync"),
("regroup_events", "Regroup sessions"),
("unknown", "Unknown"),
("data_export", "Data Export"),
("post_processing", "Post Processing"),
("train_classifier", "Train classifier"),
("generate_embeddings", "Generate embeddings"),
("evaluate_algorithm", "Evaluate algorithm"),
],
default="unknown",
max_length=255,
verbose_name="Job Type",
),
),
]
Loading