
























@@ -1582,60 +1582,67 @@ function canRequesterAbortChatRun(
15821582return false;
15831583}
158415841585-function resolveAuthorizedRunIdsForSession(params: {
1585+function resolveAuthorizedRunsForSessionKeys(params: {
15861586chatAbortControllers: Map<string, ChatAbortControllerEntry>;
1587-sessionKey: string;
1587+sessionKeys: Iterable<string>;
15881588requester: ChatAbortRequester;
15891589}) {
1590-const authorizedRunIds: string[] = [];
1590+const sessionKeys = new Set(
1591+Array.from(params.sessionKeys, (sessionKey) => normalizeOptionalText(sessionKey)).filter(
1592+(sessionKey): sessionKey is string => Boolean(sessionKey),
1593+),
1594+);
1595+const authorizedRuns: Array<{ runId: string; sessionKey: string }> = [];
15911596let matchedSessionRuns = 0;
15921597for (const [runId, active] of params.chatAbortControllers) {
1593-if (active.sessionKey !== params.sessionKey) {
1598+if (!sessionKeys.has(active.sessionKey)) {
15941599continue;
15951600}
15961601matchedSessionRuns += 1;
15971602if (canRequesterAbortChatRun(active, params.requester)) {
1598-authorizedRunIds.push(runId);
1603+authorizedRuns.push({ runId, sessionKey: active.sessionKey });
15991604}
16001605}
16011606return {
16021607 matchedSessionRuns,
1603-authorizedRunIds,
1608+authorizedRuns,
16041609};
16051610}
1606161116071612async function abortChatRunsForSessionKeyWithPartials(params: {
16081613context: GatewayRequestContext;
16091614ops: ChatAbortOps;
16101615sessionKey: string;
1616+sessionKeyAliases?: string[];
1617+persistSessionKey?: string;
16111618abortOrigin: AbortOrigin;
16121619stopReason?: string;
16131620requester: ChatAbortRequester;
16141621}): Promise<{ aborted: boolean; runIds: string[]; unauthorized: boolean }> {
1615-const { matchedSessionRuns, authorizedRunIds } = resolveAuthorizedRunIdsForSession({
1622+const { matchedSessionRuns, authorizedRuns } = resolveAuthorizedRunsForSessionKeys({
16161623chatAbortControllers: params.context.chatAbortControllers,
1617-sessionKey: params.sessionKey,
1624+sessionKeys: [params.sessionKey, ...(params.sessionKeyAliases ?? [])],
16181625requester: params.requester,
16191626});
1620-if (authorizedRunIds.length === 0) {
1627+if (authorizedRuns.length === 0) {
16211628return {
16221629aborted: false,
16231630runIds: [],
16241631unauthorized: matchedSessionRuns > 0,
16251632};
16261633}
1627-const authorizedRunIdSet = new Set(authorizedRunIds);
1634+const authorizedRunIdSet = new Set(authorizedRuns.map((run) => run.runId));
16281635const snapshots = collectSessionAbortPartials({
16291636chatAbortControllers: params.context.chatAbortControllers,
16301637chatRunBuffers: params.context.chatRunBuffers,
16311638runIds: authorizedRunIdSet,
16321639abortOrigin: params.abortOrigin,
16331640});
16341641const runIds: string[] = [];
1635-for (const runId of authorizedRunIds) {
1642+for (const { runId, sessionKey } of authorizedRuns) {
16361643const res = abortChatRunById(params.ops, {
16371644 runId,
1638-sessionKey: params.sessionKey,
1645+ sessionKey,
16391646stopReason: params.stopReason,
16401647});
16411648if (res.aborted) {
@@ -1646,7 +1653,7 @@ async function abortChatRunsForSessionKeyWithPartials(params: {
16461653if (res.aborted) {
16471654await persistAbortedPartials({
16481655context: params.context,
1649-sessionKey: params.sessionKey,
1656+sessionKey: params.persistSessionKey ?? params.sessionKey,
16501657 snapshots,
16511658});
16521659}
@@ -2054,6 +2061,8 @@ export const chatHandlers: GatewayRequestHandlers = {
20542061 context,
20552062ops: createChatAbortOps(context),
20562063sessionKey: rawSessionKey,
2064+sessionKeyAliases: sessionKey === rawSessionKey ? undefined : [sessionKey],
2065+persistSessionKey: sessionKey,
20572066abortOrigin: "stop-command",
20582067stopReason: "stop",
20592068requester: resolveChatAbortRequester(client),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。