feat: add dictionary support for STT boosting in voice agents (#136)

* feat: add dictionary support for voice agents

Also fixes #132

* chore: add keyterms in evals
This commit is contained in:
Abhishek 2026-01-29 11:20:07 +05:30 committed by GitHub
parent e3a1e0bf07
commit db75d90535
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
23 changed files with 9666 additions and 53 deletions

View file

@ -27,6 +27,7 @@ export async function GET() {
duration: data.duration,
created_at: data.created_at,
event_count: data.events.length,
keyterms: data.keyterms,
});
} catch {
console.error(`Failed to parse ${file}`);

View file

@ -93,31 +93,45 @@ export default function Home() {
href={`/view/${result.id}`}
className="block bg-zinc-900 hover:bg-zinc-800 rounded-lg p-4 transition-colors"
>
<div className="flex items-center justify-between">
<div className="space-y-1">
<div className="flex items-center gap-3">
<span className="font-medium">{result.audio_file}</span>
<span
className={`text-xs px-2 py-0.5 rounded ${
PROVIDER_COLORS[result.provider] ||
"bg-zinc-700 text-zinc-300"
}`}
>
{result.provider}
</span>
<div className="space-y-2">
<div className="flex items-center justify-between">
<div className="space-y-1">
<div className="flex items-center gap-3">
<span className="font-medium">{result.audio_file}</span>
<span
className={`text-xs px-2 py-0.5 rounded ${
PROVIDER_COLORS[result.provider] ||
"bg-zinc-700 text-zinc-300"
}`}
>
{result.provider}
</span>
</div>
<div className="text-sm text-zinc-500">
{formatDate(result.created_at)}
</div>
</div>
<div className="text-sm text-zinc-500">
{formatDate(result.created_at)}
<div className="text-right space-y-1">
<div className="text-sm text-zinc-400">
{formatDuration(result.duration)}
</div>
<div className="text-xs text-zinc-500">
{result.event_count} events
</div>
</div>
</div>
<div className="text-right space-y-1">
<div className="text-sm text-zinc-400">
{formatDuration(result.duration)}
{result.keyterms && result.keyterms.length > 0 && (
<div className="flex flex-wrap gap-1.5">
{result.keyterms.map((term, index) => (
<span
key={index}
className="text-xs px-2 py-0.5 rounded bg-amber-500/10 text-amber-300 border border-amber-500/20"
>
{term}
</span>
))}
</div>
<div className="text-xs text-zinc-500">
{result.event_count} events
</div>
</div>
)}
</div>
</Link>
))}

View file

@ -104,7 +104,24 @@ export default function ViewPage() {
>
{result.provider}
</span>
{result.keyterms && result.keyterms.length > 0 && (
<span className="text-sm px-2 py-0.5 rounded bg-amber-500/20 text-amber-300">
{result.keyterms.length} keyterm{result.keyterms.length !== 1 ? "s" : ""}
</span>
)}
</div>
{result.keyterms && result.keyterms.length > 0 && (
<div className="mt-2 flex flex-wrap gap-2">
{result.keyterms.map((term, index) => (
<span
key={index}
className="text-xs px-2 py-1 rounded bg-amber-500/10 text-amber-300 border border-amber-500/30"
>
{term}
</span>
))}
</div>
)}
{result.transcript && (
<p className="text-zinc-400 mt-2 text-sm line-clamp-2">
{result.transcript}

View file

@ -12,6 +12,7 @@ export interface EventCaptureResult {
created_at: string;
events: CapturedEvent[];
transcript: string;
keyterms?: string[];
}
export interface ResultSummary {
@ -21,4 +22,5 @@ export interface ResultSummary {
duration: number;
created_at: string;
event_count: number;
keyterms?: string[];
}