no longer rely on json

This commit is contained in:
2026-06-08 09:40:01 -04:00
parent 9f9b88c8db
commit edfe2a3331
9 changed files with 148 additions and 645 deletions

View File

@@ -19,7 +19,7 @@
// @vitest-environment node
import { describe, it, expect, beforeAll } from "vitest";
import { getDiseaseById } from "@/lib/api/diseases";
import { getDiseaseById } from "@/lib/api/diseases-db";
const BASE_URL = process.env.TEST_BASE_URL || "http://localhost:3000";
@@ -172,7 +172,7 @@ describe("POST /api/identify", () => {
const { data } = await callIdentify(imageId);
for (const pred of data.predictions) {
const disease = getDiseaseById(pred.diseaseId);
const disease = await getDiseaseById(pred.diseaseId);
expect(disease).toBeDefined();
expect(disease!.id).toBe(pred.diseaseId);
expect(disease!.name).toBe(pred.disease.name);
@@ -184,7 +184,7 @@ describe("POST /api/identify", () => {
for (let i = 0; i < data.predictions.length - 1; i++) {
expect(data.predictions[i].confidence.adjusted).toBeGreaterThanOrEqual(
data.predictions[i + 1].confidence.adjusted
data.predictions[i + 1].confidence.adjusted,
);
}
}, 30000);
@@ -194,7 +194,7 @@ describe("POST /api/identify", () => {
for (const pred of data.predictions) {
for (const lookalikeId of pred.lookalikes) {
const lookalike = getDiseaseById(lookalikeId);
const lookalike = await getDiseaseById(lookalikeId);
expect(lookalike).toBeDefined();
}
}

View File

@@ -19,7 +19,7 @@ import { runInference } from "@/lib/ml/inference";
import { calibrateConfidence } from "@/lib/ml/confidence";
import { getDiseaseIdForIndex } from "@/lib/ml/labels";
import { getModel } from "@/lib/ml/model-loader";
import { getDiseaseById, getPlantById } from "@/lib/api/diseases-db";
import { getDiseaseById, getPlantById, getLookalikeDiseases } from "@/lib/api/diseases-db";
import type { IdentifyRequest, IdentifyResponse, PredictionResult } from "@/lib/types";
// ─── Constants ───────────────────────────────────────────────────────────────
@@ -121,7 +121,7 @@ async function preprocessImageBuffer(buffer: Buffer): Promise<Float32Array> {
* For each prediction:
* - Look up disease by ID in knowledge base
* - Calibrate confidence score
* - Include lookalike disease cross-references
* - Include lookalike disease cross-references (IDs and full objects)
*
* @param topPredictions - Top-K raw predictions from inference
* @returns Enriched prediction results
@@ -149,8 +149,10 @@ async function enrichPredictions(
// Calibrate confidence
const confidence = calibrateConfidence(pred.probability);
// Get lookalike diseases
// Pre-resolve lookalike disease objects server-side so the client
// doesn't need sync access to JSON files
const lookalikes = disease.lookalikeDiseaseIds;
const lookalikeDiseases = await getLookalikeDiseases(diseaseId);
// Look up the plant for client convenience
const plant = await getPlantById(disease.plantId).catch(() => null);
@@ -160,6 +162,7 @@ async function enrichPredictions(
disease,
confidence,
lookalikes,
lookalikeDiseases,
plant: plant ?? null,
});
}