mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-08-27 04:07:05 +00:00
🪙 feat: Context-projection backend endpoint
POST /api/endpoints/context-projection → resolveContextProjection (packages/api): reconstructs the viewed branch (parent-chain walk from messageId), resolves the agent config (instructions/provider/model/maxContextTokens), reuses LibreChat's stored per-message tokenCounts as the index map (no re-tokenizing), and calls the agents SDK projectAgentContextUsage — no model call. Thin controller injects db.getMessages/db.getAgent; route mirrors /token-config. First cut targets message-windowing accuracy; tool-schema tokens are deferred to a follow-up that reuses the full initializeAgent path.
This commit is contained in:
parent
03ab2a7e73
commit
e2310c9433
4 changed files with 173 additions and 0 deletions
31
api/server/controllers/ContextProjectionController.js
Normal file
31
api/server/controllers/ContextProjectionController.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
const { logger } = require('@librechat/data-schemas');
|
||||
const { resolveContextProjection } = require('@librechat/api');
|
||||
const db = require('~/models');
|
||||
|
||||
/**
|
||||
* Returns a server-side context-usage projection for the viewed branch + config
|
||||
* (agents SDK, no model call) — powers the gauge for snapshot-less branches and
|
||||
* after a model/window switch. Resolution lives in `@librechat/api`; this
|
||||
* controller only injects request-scoped model accessors.
|
||||
* @param {ServerRequest} req
|
||||
* @param {ServerResponse} res
|
||||
*/
|
||||
async function contextProjectionController(req, res) {
|
||||
try {
|
||||
const params = req.body ?? {};
|
||||
if (!params.conversationId || !params.messageId) {
|
||||
res.json(null);
|
||||
return;
|
||||
}
|
||||
const projection = await resolveContextProjection(
|
||||
{ getMessages: db.getMessages, getAgent: db.getAgent },
|
||||
params,
|
||||
);
|
||||
res.json(projection ?? null);
|
||||
} catch (error) {
|
||||
logger.error('[contextProjectionController]', error);
|
||||
res.status(500).json({ error: 'Failed to resolve context projection' });
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = contextProjectionController;
|
||||
|
|
@ -3,10 +3,12 @@ const requireJwtAuth = require('~/server/middleware/requireJwtAuth');
|
|||
const configMiddleware = require('~/server/middleware/config/app');
|
||||
const endpointController = require('~/server/controllers/EndpointController');
|
||||
const tokenConfigController = require('~/server/controllers/TokenConfigController');
|
||||
const contextProjectionController = require('~/server/controllers/ContextProjectionController');
|
||||
|
||||
const router = express.Router();
|
||||
/** Auth required for role/tenant-scoped endpoint config resolution. */
|
||||
router.get('/', requireJwtAuth, endpointController);
|
||||
router.get('/token-config', requireJwtAuth, configMiddleware, tokenConfigController);
|
||||
router.post('/context-projection', requireJwtAuth, configMiddleware, contextProjectionController);
|
||||
|
||||
module.exports = router;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue