mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-15 15:52:21 +00:00
feat(voice): voice core — honest layer reach, spoken summary with on-screen card, narration, point-and-ask
- Voice layer manifest (src/voice/layerManifest.js) generates the layer enums, aliases and analyst field hints; a test fails when a catalog layer has no entry. - analyst_query validates fields, operators, units, values and scopes, counts up to 250,000 loaded records per layer, reports complete/partial/unanswered, tells LAYER_OFF / NOT_READY / FEED_UNAVAILABLE apart from zero, refuses mismatched follow-ups and never lets a superseded query replace follow-up memory. Seven more layers expose analyst records. - Tool results carry a code-built say line and a display card; the voice card in the mic control shows captions, plan steps and the result (src/voice/resultDisplay.js is the one adapter). Slow tools narrate their current step out of band; holding Space while the assistant talks cuts it off. Turn spans go to the debug log; caption transcription is metered; the log omits what was said unless GEV_VOICE_LOG_CONTENT=1. - Point and ask: the Space-down pointer snapshot resolves "this", "that one" and "around here" through 'pointer' targets, and "the second one" through referent:n from the last numbered list. - Prompt states each policy once (instructions + tools 48.5k -> 46.7k chars). - Voice benchmark harness (scripts/qa-voice-bench.mjs, scripts/voice-bench/) shares its phrase table and grading with scripts/qa-voice-routing.mjs.
This commit is contained in:
1 parent
e7707d9a0f
commit
a19897ad15
97 files changed
+14343
-755
No files matched your search
@@ -8,6 +8,7 @@ import {
|
||||
createVoiceCostTracker,
|
||||
resolveVoiceModel,
|
||||
formatCostUsd,
|
||||
estimateTranscriptionCostUsd,
|
||||
} from './voiceCost.js';
|
||||
|
||||
/** Own next-session preferences and the immutable-model session cost meter. */
|
||||
@@ -16,6 +17,7 @@ export class RealtimeCost {
|
||||
Object.assign(this, { readUi, readStatus }, operations);
|
||||
this.voiceTier = readStoredVoiceTier();
|
||||
this.voiceLimits = readStoredVoiceLimits();
|
||||
this.transcribeModel = null;
|
||||
this.costTracker = createVoiceCostTracker({
|
||||
tier: this.voiceTier,
|
||||
limits: this.voiceLimits,
|
||||
@@ -136,7 +138,28 @@ export class RealtimeCost {
|
||||
*/
|
||||
recordUsage(usage) {
|
||||
if (!usage) return null;
|
||||
const state = this.costTracker.record(usage);
|
||||
return this.applyCost(this.costTracker.record(usage));
|
||||
}
|
||||
|
||||
/**
|
||||
* Meter one input transcription (voice-card captions). It is billed apart
|
||||
* from responses, so it is priced with the transcription model the server
|
||||
* reported and folded into the same total, warning and cap.
|
||||
*/
|
||||
recordTranscriptionUsage(usage) {
|
||||
if (!usage) return null;
|
||||
return this.applyCost(
|
||||
this.costTracker.recordUsd(
|
||||
estimateTranscriptionCostUsd(usage, this.transcribeModel),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
bindTranscriptionModel(model) {
|
||||
this.transcribeModel = model && model !== 'off' ? model : null;
|
||||
}
|
||||
|
||||
applyCost(state) {
|
||||
this.syncCostUi();
|
||||
if (state.warnCrossed) {
|
||||
// Exactly one line — the latch in the tracker guarantees it.
|
||||
|
||||
Reference in new issue
Block a user