70a9a154a4
Server API: - 扩展 Agent Adapter 接口添加压缩相关方法 - 新增 context.ts 路由 (GET /sessions/:id/context, POST /sessions/:id/compress) - 扩展 config.ts 添加摘要模型配置接口 (GET/PUT /config/summary) UI 组件: - 新增 ContextUsage 组件显示上下文使用情况 - 扩展 ConfigPanel 添加摘要模型配置区域 - 添加 API 客户端方法和类型定义 Web 集成: - 在 Chat 页面头部集成 ContextUsage 紧凑模式显示
107 lines
2.1 KiB
TypeScript
107 lines
2.1 KiB
TypeScript
/**
|
|
* Context API Routes
|
|
*
|
|
* 上下文压缩相关的 REST API
|
|
*/
|
|
|
|
import { Hono } from 'hono';
|
|
import { getSessionManager } from '../session/manager.js';
|
|
import {
|
|
getContextUsage,
|
|
compressContext,
|
|
type ContextUsageInfo,
|
|
type CompressionResult,
|
|
} from '../agent/adapter.js';
|
|
|
|
export const contextRouter = new Hono();
|
|
|
|
/**
|
|
* GET /sessions/:id/context - 获取会话上下文使用情况
|
|
*/
|
|
contextRouter.get('/sessions/:id/context', (c) => {
|
|
const sessionId = c.req.param('id');
|
|
const sessionManager = getSessionManager();
|
|
|
|
// 验证会话存在
|
|
if (!sessionManager.exists(sessionId)) {
|
|
return c.json(
|
|
{
|
|
success: false,
|
|
error: 'Session not found',
|
|
},
|
|
404
|
|
);
|
|
}
|
|
|
|
const usage = getContextUsage(sessionId);
|
|
|
|
if (!usage) {
|
|
// Agent 未初始化,返回默认值
|
|
return c.json({
|
|
success: true,
|
|
data: {
|
|
input: 0,
|
|
contextLimit: 200000,
|
|
available: 180000,
|
|
usagePercent: 0,
|
|
formatted: '0/180K (0%)',
|
|
shouldCompress: false,
|
|
} as ContextUsageInfo,
|
|
});
|
|
}
|
|
|
|
return c.json({
|
|
success: true,
|
|
data: usage,
|
|
});
|
|
});
|
|
|
|
/**
|
|
* POST /sessions/:id/compress - 触发手动压缩
|
|
*/
|
|
contextRouter.post('/sessions/:id/compress', async (c) => {
|
|
const sessionId = c.req.param('id');
|
|
const sessionManager = getSessionManager();
|
|
|
|
// 验证会话存在
|
|
if (!sessionManager.exists(sessionId)) {
|
|
return c.json(
|
|
{
|
|
success: false,
|
|
error: 'Session not found',
|
|
},
|
|
404
|
|
);
|
|
}
|
|
|
|
try {
|
|
const body = await c.req.json().catch(() => ({}));
|
|
const force = body.force === true;
|
|
|
|
const result = await compressContext(sessionId, force);
|
|
|
|
if (!result) {
|
|
return c.json(
|
|
{
|
|
success: false,
|
|
error: 'Agent not initialized for this session',
|
|
},
|
|
400
|
|
);
|
|
}
|
|
|
|
return c.json({
|
|
success: true,
|
|
data: result,
|
|
});
|
|
} catch (error) {
|
|
return c.json(
|
|
{
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Compression failed',
|
|
},
|
|
500
|
|
);
|
|
}
|
|
});
|