Skip to content

Commit c0f671d

Browse files
authored
fix(ai): Lower icd10 polling interval; no clinical data means no prompt (#5492)
1 parent 92a511f commit c0f671d

File tree

4 files changed

+71
-3
lines changed

4 files changed

+71
-3
lines changed

apps/ehr/src/features/visits/shared/components/AiPotentialDiagnosesCard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const AiPotentialDiagnosesCard: FC = () => {
1717
requestedFields: {
1818
aiPotentialDiagnosis: {},
1919
},
20-
refetchInterval: 5000,
20+
refetchInterval: 3000,
2121
});
2222
const aiPotentialDiagnoses = chartFieldsData?.aiPotentialDiagnosis ?? [];
2323
const { mutateAsync: recommendBillingSuggestions } = useRecommendBillingSuggestions();

packages/zambdas/src/subscriptions/task/sub-recommend-diagnosis-codes/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,13 @@ export async function createDiagnosisCodeRecommendations(
111111
)[] = [];
112112

113113
console.timeLog('time', 'before generating codes');
114-
console.log('Generating ICD-10 codes from clinical notes');
115-
const potentialDiagnoses = await generateIcdTenCodesFromNotes(aiClient, hpiTextUpdated, mdmTextUpdated);
114+
let potentialDiagnoses: { icd10: string; diagnosis: string }[] = [];
115+
if (!hpiTextUpdated && !mdmTextUpdated) {
116+
console.log('No HPI or MDM text available, skipping ICD-10 code generation');
117+
} else {
118+
console.log('Generating ICD-10 codes from clinical notes');
119+
potentialDiagnoses = await generateIcdTenCodesFromNotes(aiClient, hpiTextUpdated, mdmTextUpdated);
120+
}
116121
console.timeLog('time', 'after generating codes');
117122
const existingAiDiagnoses: Condition[] = allResources.filter(
118123
(resource) =>

packages/zambdas/test/helpers/integration-test-seed-data-setup.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface InsertFullAppointmentDataBaseResult {
3939
appointment: Appointment;
4040
encounter: Encounter;
4141
questionnaireResponse: QuestionnaireResponse;
42+
clinicalImpression: ClinicalImpression;
4243
}
4344

4445
/**
@@ -188,6 +189,9 @@ export const insertInPersonAppointmentBase = async (
188189
questionnaireResponse: createdResources.find(
189190
(resource) => resource!.resourceType === 'QuestionnaireResponse'
190191
) as QuestionnaireResponse,
192+
clinicalImpression: createdResources.find(
193+
(resource) => resource!.resourceType === 'ClinicalImpression'
194+
) as ClinicalImpression,
191195
};
192196
};
193197

packages/zambdas/test/integration/sub-recommend-diagnosis-codes.test.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,5 +217,64 @@ describe('sub-recommend-diagnosis-codes integration tests', () => {
217217
expect(aiConditions[0].code?.coding?.[0].code).toBe('R06.02');
218218
expect(aiConditions[0].code?.coding?.[0].display).toBe('Sneezing');
219219
});
220+
it('should remove all prior recommendations when all input is empty-- success', async () => {
221+
const task: Task = {
222+
id: '8665a43e-d0d5-41d2-9f0e-1322db6f1bd5',
223+
resourceType: 'Task',
224+
status: 'requested',
225+
intent: 'order',
226+
focus: { reference: `Encounter/${baseResources.encounter.id}` },
227+
code: {
228+
coding: [
229+
{
230+
system: OttehrTaskSystem,
231+
code: 'recommend-diagnosis-codes',
232+
},
233+
],
234+
},
235+
};
236+
const mockAIClient = new FakeListChatModel({
237+
responses: [
238+
`{
239+
"potentialDiagnoses": [
240+
{
241+
"diagnosis": "Sneezing",
242+
"icd10": "R06.02"
243+
}
244+
]
245+
}`,
246+
],
247+
});
248+
249+
await oystehr.fhir.delete({ resourceType: 'ClinicalImpression', id: baseResources.clinicalImpression.id! });
250+
251+
let result: { taskStatus: Task['status']; statusReason?: string } | undefined;
252+
let error: any;
253+
try {
254+
result = await createDiagnosisCodeRecommendations(task, oystehr, mockAIClient);
255+
} catch (err) {
256+
error = err as Error;
257+
}
258+
expect(error).toBeUndefined();
259+
expect(result).toBeDefined();
260+
expect(result).toHaveProperty('taskStatus');
261+
expect(result?.taskStatus).toEqual('completed');
262+
expect(result).toHaveProperty('statusReason');
263+
expect(result?.statusReason).toEqual('Recommended 0 diagnosis codes');
264+
265+
const savedConditions = (
266+
await oystehr.fhir.search<Condition>({
267+
resourceType: 'Condition',
268+
params: [{ name: 'encounter', value: baseResources.encounter.id! }],
269+
})
270+
).unbundle();
271+
const aiConditions = savedConditions.filter((resource) => {
272+
return (
273+
resource.meta?.tag?.find((tag) => tag.system === `${PRIVATE_EXTENSION_BASE_URL}/ai-potential-diagnosis`)
274+
?.code === 'ai-potential-diagnosis'
275+
);
276+
});
277+
expect(aiConditions.length).toBe(0);
278+
});
220279
});
221280
});

0 commit comments

Comments
 (0)