feat(converters): 为请求添加 metadata 支持并优化会话缓存
- 在 CodexConverter 和 ClaudeConverter 中增加 metadata 字段,透传上游元数据 - 重构 CodexApiService 的缓存键生成逻辑,优先使用 session_id 或 conversation_id - 从上游请求体中移除 metadata 避免透传,仅用于生成缓存键
This commit is contained in:
parent
105bb39c1a
commit
55879396c8
3 changed files with 23 additions and 5 deletions
|
|
@ -1871,6 +1871,7 @@ export class ClaudeConverter extends BaseConverter {
|
||||||
stream: true,
|
stream: true,
|
||||||
store: false,
|
store: false,
|
||||||
parallel_tool_calls: true,
|
parallel_tool_calls: true,
|
||||||
|
metadata: claudeRequest.metadata || {},
|
||||||
reasoning: {
|
reasoning: {
|
||||||
effort: claudeRequest.reasoning?.effort || 'medium',
|
effort: claudeRequest.reasoning?.effort || 'medium',
|
||||||
summary: 'auto'
|
summary: 'auto'
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,7 @@ export class CodexConverter extends BaseConverter {
|
||||||
input: this.convertMessages(data.messages || []),
|
input: this.convertMessages(data.messages || []),
|
||||||
stream: true,
|
stream: true,
|
||||||
store: false,
|
store: false,
|
||||||
|
metadata: data.metadata || {},
|
||||||
reasoning: {
|
reasoning: {
|
||||||
effort: data.reasoning_effort || 'medium',
|
effort: data.reasoning_effort || 'medium',
|
||||||
summary: 'auto'
|
summary: 'auto'
|
||||||
|
|
|
||||||
|
|
@ -300,8 +300,25 @@ export class CodexApiService {
|
||||||
* 准备请求体
|
* 准备请求体
|
||||||
*/
|
*/
|
||||||
prepareRequestBody(model, requestBody, stream) {
|
prepareRequestBody(model, requestBody, stream) {
|
||||||
// 添加会话缓存 ID
|
// 提取 metadata 并从请求体中移除,避免透传到上游
|
||||||
const cacheKey = `${model}-${requestBody.metadata?.user_id || 'default'}`;
|
const metadata = requestBody.metadata || {};
|
||||||
|
|
||||||
|
// 明确会话维度:优先使用 session_id 或 conversation_id,其次 user_id
|
||||||
|
const sessionId = metadata.session_id || metadata.conversation_id || metadata.user_id || 'default';
|
||||||
|
|
||||||
|
const cleanedBody = { ...requestBody };
|
||||||
|
delete cleanedBody.metadata;
|
||||||
|
|
||||||
|
// 生成会话缓存键
|
||||||
|
// 默认弱化 model 依赖,以提升同会话跨模型的缓存命中率
|
||||||
|
// 如果 sessionId 为 'default',则必须加上 model 以提供基础隔离
|
||||||
|
let cacheKey = sessionId;
|
||||||
|
if (sessionId === 'default') {
|
||||||
|
cacheKey = `${model}-default`;
|
||||||
|
} else {
|
||||||
|
cacheKey = `${model}-${sessionId}`;
|
||||||
|
}
|
||||||
|
|
||||||
let cache = this.conversationCache.get(cacheKey);
|
let cache = this.conversationCache.get(cacheKey);
|
||||||
|
|
||||||
if (!cache || cache.expire < Date.now()) {
|
if (!cache || cache.expire < Date.now()) {
|
||||||
|
|
@ -312,10 +329,9 @@ export class CodexApiService {
|
||||||
this.conversationCache.set(cacheKey, cache);
|
this.conversationCache.set(cacheKey, cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注意:requestBody 已经是转换后的 Codex 格式
|
// 注意:requestBody 已经去除了 metadata
|
||||||
// 只需要添加 cache key 和 stream 参数
|
|
||||||
return {
|
return {
|
||||||
...requestBody,
|
...cleanedBody,
|
||||||
stream,
|
stream,
|
||||||
prompt_cache_key: cache.id
|
prompt_cache_key: cache.id
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue