更新配置和聊天路由,添加会话中止与分叉功能
This commit is contained in:
Vendored
+60
@@ -44,6 +44,66 @@ export class ChatSessionBridge {
|
||||
getSessionContext(sessionId) {
|
||||
return this.sessionContexts.get(sessionId) ?? null;
|
||||
}
|
||||
async abort(context) {
|
||||
const clientSessionId = context.clientSessionId?.trim();
|
||||
if (!clientSessionId) {
|
||||
return null;
|
||||
}
|
||||
const requestContext = {
|
||||
clientSessionId,
|
||||
accessToken: context.accessToken,
|
||||
projectId: context.projectId,
|
||||
traceId: context.traceId?.trim() || `trace-${randomUUID().slice(0, 12)}`,
|
||||
};
|
||||
this.cleanupExpired();
|
||||
const binding = this.registry.get(requestContext);
|
||||
if (!binding) {
|
||||
return null;
|
||||
}
|
||||
this.sessionContexts.set(binding.sessionId, requestContext);
|
||||
await this.runtime.abortSession(binding.sessionId);
|
||||
return binding;
|
||||
}
|
||||
async fork(context) {
|
||||
const currentClientSessionId = context.clientSessionId?.trim();
|
||||
const nextRequestContext = {
|
||||
clientSessionId: `agent-${randomUUID().slice(0, 12)}`,
|
||||
accessToken: context.accessToken,
|
||||
projectId: context.projectId,
|
||||
traceId: context.traceId?.trim() || `trace-${randomUUID().slice(0, 12)}`,
|
||||
};
|
||||
this.cleanupExpired();
|
||||
if (!currentClientSessionId || context.keepMessageCount <= 0) {
|
||||
const session = await this.runtime.createSession(nextRequestContext.clientSessionId);
|
||||
const binding = this.registry.upsert(nextRequestContext, session.id);
|
||||
this.sessionContexts.set(binding.sessionId, nextRequestContext);
|
||||
return { binding, requestContext: nextRequestContext, created: true };
|
||||
}
|
||||
const currentContext = {
|
||||
clientSessionId: currentClientSessionId,
|
||||
accessToken: context.accessToken,
|
||||
projectId: context.projectId,
|
||||
traceId: nextRequestContext.traceId,
|
||||
};
|
||||
const current = this.registry.get(currentContext);
|
||||
if (!current) {
|
||||
const session = await this.runtime.createSession(nextRequestContext.clientSessionId);
|
||||
const binding = this.registry.upsert(nextRequestContext, session.id);
|
||||
this.sessionContexts.set(binding.sessionId, nextRequestContext);
|
||||
return { binding, requestContext: nextRequestContext, created: true };
|
||||
}
|
||||
await this.runtime.getSession(current.sessionId);
|
||||
const messages = await this.runtime.messages(current.sessionId, Math.max(100, context.keepMessageCount + 20));
|
||||
const chatMessages = messages.filter((message) => message.info.role === "user" || message.info.role === "assistant");
|
||||
const keepMessage = chatMessages[context.keepMessageCount - 1];
|
||||
if (!keepMessage) {
|
||||
throw new Error(`fork keep point not found for message count ${context.keepMessageCount}`);
|
||||
}
|
||||
const session = await this.runtime.forkSession(current.sessionId, keepMessage.info.id);
|
||||
const binding = this.registry.upsert(nextRequestContext, session.id);
|
||||
this.sessionContexts.set(binding.sessionId, nextRequestContext);
|
||||
return { binding, requestContext: nextRequestContext, created: true };
|
||||
}
|
||||
cleanupExpired() {
|
||||
const expiredSessionIds = this.registry.evictExpired();
|
||||
for (const sessionId of expiredSessionIds) {
|
||||
|
||||
Reference in New Issue
Block a user