Skip to content

Commit 910f19f

Browse files
authored
Merge pull request #502 from open-edge-platform/update-branch
feat: add medical scribe sample and diarization service (#998)
2 parents fc3c6af + 9ba317f commit 910f19f

84 files changed

Lines changed: 9153 additions & 2508 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

usecases/ai/edge-ai-demo-studio/frontend/package-lock.json

Lines changed: 6 additions & 40 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

usecases/ai/edge-ai-demo-studio/frontend/src/app/(dashboard)/globals.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,13 @@
465465
transition-duration: 0.01ms;
466466
scroll-behavior: auto;
467467
}
468+
469+
/* Keep essential loading spinners visible even with reduced motion */
470+
.animate-spin {
471+
animation: spin 1.5s linear infinite;
472+
animation-duration: 1.5s;
473+
animation-iteration-count: infinite;
474+
}
468475
}
469476

470477
/* Card-lift disabled on touch devices (hover unreliable) */
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Copyright (C) 2026 Intel Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import config from '@payload-config'
5+
import { getPayload } from 'payload'
6+
import { engines } from '@/engines/registry'
7+
import { logger } from '@/lib/logger'
8+
import type { Service } from '@/payload-types'
9+
import { metaMap } from '@/services/_generated/meta'
10+
11+
async function getWorkloadModel(
12+
workloadType: Service['type'],
13+
): Promise<string> {
14+
const payload = await getPayload({ config })
15+
const textGenerationDoc = await payload.find({
16+
collection: 'services',
17+
where: { type: { equals: workloadType } },
18+
limit: 1,
19+
})
20+
21+
if (textGenerationDoc.totalDocs < 1)
22+
return Promise.reject(`No ${workloadType} workload found`)
23+
24+
const textGenerationWorkload = textGenerationDoc.docs[0]
25+
const selectedEngine = engines[textGenerationWorkload.engine]
26+
return selectedEngine.getModelName(
27+
textGenerationWorkload.models.default,
28+
true,
29+
)
30+
}
31+
32+
export async function POST(req: Request) {
33+
const textGenerationMeta = metaMap['text-generation']
34+
35+
let body: Record<string, unknown>
36+
try {
37+
body = await req.json()
38+
} catch {
39+
return Response.json(
40+
{ error: 'Invalid JSON in request body' },
41+
{ status: 400 },
42+
)
43+
}
44+
45+
let model: string
46+
try {
47+
model = await getWorkloadModel(textGenerationMeta.id)
48+
} catch (error) {
49+
logger.error('Model service error:', error)
50+
return Response.json({ error: 'No available model' }, { status: 500 })
51+
}
52+
53+
try {
54+
const res = await fetch(
55+
`http://localhost:${textGenerationMeta.port}/v1/chat/completions`,
56+
{
57+
method: 'POST',
58+
headers: { 'Content-Type': 'application/json' },
59+
body: JSON.stringify({ ...body, model }),
60+
},
61+
)
62+
63+
if (!res.ok) {
64+
const text = await res.text()
65+
return new Response(text, {
66+
status: res.status,
67+
headers: {
68+
'Content-Type': res.headers.get('Content-Type') ?? 'text/plain',
69+
},
70+
})
71+
}
72+
73+
const data = await res.json()
74+
return Response.json(data)
75+
} catch (error) {
76+
logger.error('Text generation completion error:', error)
77+
return Response.json(
78+
{ error: 'Failed to reach text generation service' },
79+
{ status: 502 },
80+
)
81+
}
82+
}

0 commit comments

Comments
 (0)