初始化提交
This commit is contained in:
commit
887c1f449e
963 files changed
+166869
No files matched your search
@@ -0,0 +1,47 @@
|
||||
"""上下文预算守卫:历史过长时折叠中间消息,保护 prompt 预算。"""
|
||||
|
||||
from app.ai_provider.types.messages import BaseMessage
|
||||
from app.application.agent.extensions import (
|
||||
AgentContext,
|
||||
AgentRunContext,
|
||||
ExtensionRegistry,
|
||||
)
|
||||
from app.application.agent.python_skills import PythonSkillDefinition
|
||||
|
||||
# messages 总字符数软上限;超出则保留首条与末尾 _TAIL_KEEP 条,中间折叠。
|
||||
_MAX_CONTEXT_CHARS = 12000
|
||||
_TAIL_KEEP = 8
|
||||
|
||||
|
||||
async def _trim_history(context: AgentContext, _run: AgentRunContext) -> AgentContext:
|
||||
messages = context.messages
|
||||
total = sum(len(message.content) for message in messages)
|
||||
if total <= _MAX_CONTEXT_CHARS or len(messages) <= _TAIL_KEEP + 1:
|
||||
return context
|
||||
first = messages[0]
|
||||
tail = messages[-_TAIL_KEEP:]
|
||||
dropped = len(messages) - 1 - _TAIL_KEEP
|
||||
# 在首条追加折叠提示(新建对象避免污染原 message);不在历史中间插入新消息,
|
||||
# 以免破坏 provider 对 system 位置或多轮 tool 消息配对的预期。
|
||||
folded = BaseMessage(
|
||||
content=f"{first.content}\n\n[已省略 {dropped} 条较早历史]",
|
||||
role=first.role,
|
||||
)
|
||||
return AgentContext(
|
||||
messages=(folded, *tail),
|
||||
tools=context.tools,
|
||||
model_hint=context.model_hint,
|
||||
)
|
||||
|
||||
|
||||
def _setup(registry: ExtensionRegistry) -> None:
|
||||
registry.add_context_transformer(_trim_history)
|
||||
|
||||
|
||||
SKILL = PythonSkillDefinition(
|
||||
name="context_budget",
|
||||
description="对话历史过长时折叠中间消息,控制 prompt 预算。",
|
||||
triggers=("长对话", "context", "历史"),
|
||||
instructions="历史较长时优先依赖近期消息,不必回溯很早的内容。",
|
||||
setup=_setup,
|
||||
)
|
||||
Reference in new issue
Block a user