mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-08-27 03:10:41 +02:00
* refactor(model-routing): centralize explicit foreground fallback policy Make foreground fallback an explicit per-user, availability-only policy shared by streaming Chat, non-stream Chat, and Agent runs. Preserve strict defaults, owner/model and credential boundaries, pinned Agent routes, and truthful per-round provenance/accounting. Carry provider-reported model identifiers through native streaming adapters, non-stream responses, and caches, and keep legacy default_model_fallbacks as tombstoned raw storage that generic settings APIs and agent tools cannot expose or mutate. * fix(agent-loop): restore rebase-dropped qwen routing, workspace prompt, and temperature clamp * fix(model-routing): thread selected endpoint identity, fix cost classification and fallback eligibility * fix(chat): restore stream helpers and harden run stop lifecycle * fix(model-routing): let numeric provider codes win over symbolic rate-limit statuses * fix(agent-loop): apply qwen temperature and notes-tool clamps per fallback candidate * fix(chat): honor queued stop across resend and reload canonical terminal on EOF * fix(chat): track stop queue and cleanup ownership by per-send generation * fix(agent-loop): preserve requested temperature for non-qwen fallback candidates * fix(chat): reserve send ownership before any await and scope stop to the current send * fix(chat): clear the previous run identity at send reservation --------- Co-authored-by: RaresKeY <158580472+RaresKeY@users.noreply.github.com> Co-authored-by: StressTestor <212606152+StressTestor@users.noreply.github.com>
104 lines
4.2 KiB
JavaScript
104 lines
4.2 KiB
JavaScript
/** Select and update the response holder for a route-provenance event. */
|
|
export function applyModelRouteEventState(event, holder, roundHolder, defaultModel = '') {
|
|
const target = event && event.round && roundHolder ? roundHolder : holder;
|
|
if (!target) return null;
|
|
|
|
target._requestedModel = (
|
|
event.requested_model
|
|
|| event.selected_model
|
|
|| target._requestedModel
|
|
|| defaultModel
|
|
);
|
|
target._actualModel = (
|
|
event.model
|
|
|| event.answered_by
|
|
|| target._actualModel
|
|
|| target._requestedModel
|
|
);
|
|
const hasEndpointRoute = Boolean(
|
|
event.requested_endpoint_id
|
|
|| event.selected_endpoint_id
|
|
|| event.endpoint_id
|
|
|| event.answered_by_endpoint_id
|
|
|| event.requested_endpoint_label
|
|
|| event.selected_endpoint_label
|
|
|| event.endpoint_label
|
|
|| event.answered_by_endpoint_label
|
|
|| target._requestedEndpointLabel
|
|
);
|
|
if (hasEndpointRoute) {
|
|
target._requestedEndpointId = (
|
|
event.requested_endpoint_id
|
|
|| event.selected_endpoint_id
|
|
|| target._requestedEndpointId
|
|
|| null
|
|
);
|
|
target._requestedEndpointLabel = (
|
|
event.requested_endpoint_label
|
|
|| event.selected_endpoint_label
|
|
|| target._requestedEndpointLabel
|
|
|| 'Selected route'
|
|
);
|
|
target._actualEndpointId = (
|
|
event.endpoint_id
|
|
|| event.answered_by_endpoint_id
|
|
|| target._actualEndpointId
|
|
|| target._requestedEndpointId
|
|
|| null
|
|
);
|
|
target._actualEndpointLabel = (
|
|
event.endpoint_label
|
|
|| event.answered_by_endpoint_label
|
|
|| target._actualEndpointLabel
|
|
|| target._requestedEndpointLabel
|
|
);
|
|
}
|
|
return target;
|
|
}
|
|
|
|
/** Copy the active route into the bubble created for the next Agent round. */
|
|
export function inheritModelRouteState(holder, roundHolder, target, defaultModel = '') {
|
|
if (!target) return null;
|
|
const source = roundHolder || holder;
|
|
target._requestedModel = source?._requestedModel || defaultModel;
|
|
target._actualModel = source?._actualModel || target._requestedModel;
|
|
if (source?._requestedEndpointLabel || source?._actualEndpointLabel) {
|
|
target._requestedEndpointId = source?._requestedEndpointId || null;
|
|
target._requestedEndpointLabel = source?._requestedEndpointLabel || 'Selected route';
|
|
target._actualEndpointId = source?._actualEndpointId || target._requestedEndpointId;
|
|
target._actualEndpointLabel = source?._actualEndpointLabel || target._requestedEndpointLabel;
|
|
}
|
|
return target;
|
|
}
|
|
|
|
/** Apply final/metrics provenance to the active round, not the first bubble. */
|
|
export function applyModelMetricsState(metrics, holder, roundHolder, defaultModel = '') {
|
|
const target = roundHolder || holder;
|
|
if (!target || !metrics) return target || null;
|
|
const roundModels = Array.isArray(metrics.round_models) ? metrics.round_models : [];
|
|
const roundModel = roundHolder && roundModels.length
|
|
? roundModels[roundModels.length - 1]
|
|
: null;
|
|
target._requestedModel = metrics.requested_model || target._requestedModel || defaultModel;
|
|
target._actualModel = roundModel || metrics.model || target._actualModel || target._requestedModel;
|
|
const roundEndpointIds = Array.isArray(metrics.round_endpoint_ids) ? metrics.round_endpoint_ids : [];
|
|
const roundEndpointLabels = Array.isArray(metrics.round_endpoint_labels) ? metrics.round_endpoint_labels : [];
|
|
if (
|
|
metrics.requested_endpoint_label
|
|
|| metrics.endpoint_label
|
|
|| roundEndpointLabels.length
|
|
|| target._requestedEndpointLabel
|
|
) {
|
|
target._requestedEndpointId = metrics.requested_endpoint_id || target._requestedEndpointId || null;
|
|
target._requestedEndpointLabel = metrics.requested_endpoint_label || target._requestedEndpointLabel || 'Selected route';
|
|
const hasRoundEndpointId = Boolean(roundHolder && roundEndpointIds.length);
|
|
const hasRoundEndpointLabel = Boolean(roundHolder && roundEndpointLabels.length);
|
|
target._actualEndpointId = hasRoundEndpointId
|
|
? roundEndpointIds[roundEndpointIds.length - 1]
|
|
: (metrics.endpoint_id || target._actualEndpointId || target._requestedEndpointId);
|
|
target._actualEndpointLabel = hasRoundEndpointLabel
|
|
? roundEndpointLabels[roundEndpointLabels.length - 1]
|
|
: (metrics.endpoint_label || target._actualEndpointLabel || target._requestedEndpointLabel);
|
|
}
|
|
return target;
|
|
}
|