1"use strict";(self.webpackChunkhermes_agent_cn=self.webpackChunkhermes_agent_cn||[]).push([[22419],{35478:(e,n,s)=>{s.d(n,{R:()=>l,x:()=>d});var t=s(58101);const r={},i=t.createContext(r);function l(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),t.createElement(i.Provider,{value:n},e.children)}},57194:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"developer-guide/context-engine-plugin","title":"\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6","description":"\u5982\u4f55\u6784\u5efa\u4e00\u4e2a\u66ff\u6362\u5185\u7f6e `ContextCompressor` \u7684\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6","source":"@site/docs/developer-guide/context-engine-plugin.md","sourceDirName":"developer-guide","slug":"/developer-guide/context-engine-plugin","permalink":"/docs/developer-guide/context-engine-plugin","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"sidebar_position":9,"title":"\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6","description":"\u5982\u4f55\u6784\u5efa\u4e00\u4e2a\u66ff\u6362\u5185\u7f6e `ContextCompressor` \u7684\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6","translationStatus":"translated","upstreamPath":"website/docs/developer-guide/context-engine-plugin.md","upstreamSha":"5a606f8ea0c8c006aed05343b6c77fd68038959e","sourceUrl":"https://github.com/NousResearch/hermes-agent/blob/main/website/docs/developer-guide/context-engine-plugin.md","translatedAt":"2026-04-11T03:22:34.246Z","translationModel":"qwen/qwen3-30b-a3b-instruct-2507"},"sidebar":"docs","previous":{"title":"\u8bb0\u5fc6\u63d0\u4f9b\u8005\u63d2\u4ef6","permalink":"/docs/developer-guide/memory-provider-plugin"},"next":{"title":"\u6a21\u578b\u63d0\u4f9b\u5546\u63d2\u4ef6","permalink":"/docs/developer-guide/model-provider-plugin"}}');var r=s(25105),i=s(35478);const l={sidebar_position:9,title:"\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6",description:"\u5982\u4f55\u6784\u5efa\u4e00\u4e2a\u66ff\u6362\u5185\u7f6e `ContextCompressor` \u7684\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6",translationStatus:"translated",upstreamPath:"website/docs/developer-guide/context-engine-plugin.md",upstreamSha:"5a606f8ea0c8c006aed05343b6c77fd68038959e",sourceUrl:"https://github.com/NousResearch/hermes-agent/blob/main/website/docs/developer-guide/context-engine-plugin.md",translatedAt:new Date("2026-04-11T03:22:34.246Z"),translationModel:"qwen/qwen3-30b-a3b-instruct-2507"},d="\u6784\u5efa\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6 {#building-a-context-engine-plugin}",o={},c=[{value:"\u5de5\u4f5c\u539f\u7406",id:"how-it-works",level:2},{value:"\u76ee\u5f55\u7ed3\u6784",id:"directory-structure",level:2},{value:"ContextEngine \u62bd\u8c61\u57fa\u7c7b",id:"the-contextengine-abc",level:2},{value:"\u5f15\u64ce\u5fc5\u987b\u7ef4\u62a4\u7684\u7c7b\u5c5e\u6027",id:"class-attributes-your-engine-must-maintain",level:3},{value:"\u53ef\u9009\u65b9\u6cd5",id:"optional-methods",level:3},{value:"\u5f15\u64ce\u5de5\u5177",id:"engine-tools",level:2},{value:"\u6ce8\u518c",id:"registration",level:2},{value:"\u901a\u8fc7\u76ee\u5f55\uff08\u63a8\u8350\u65b9\u5f0f\uff09",id:"via-directory-recommended",level:3},{value:"\u901a\u8fc7\u901a\u7528\u63d2\u4ef6\u7cfb\u7edf",id:"via-general-plugin-system",level:3},{value:"\u751f\u547d\u5468\u671f",id:"lifecycle",level:2},{value:"\u914d\u7f6e",id:"configuration",level:2},{value:"\u6d4b\u8bd5",id:"testing",level:2},{value:"\u53c2\u89c1",id:"see-also",level:2}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"building-a-context-engine-plugin",children:"\u6784\u5efa\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6"})}),"\n",(0,r.jsxs)(n.p,{children:["\u4e0a\u4e0b\u6587\u5f15\u64ce\u63d2\u4ef6\u4f1a\u66ff\u6362\u5185\u7f6e\u7684 ",(0,r.jsx)(n.code,{children:"ContextCompressor"}),"\uff0c\u91c7\u7528\u66ff\u4ee3\u7b56\u7565\u6765\u7ba1\u7406\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u3002\u4f8b\u5982\uff0c\u4e00\u79cd\u65e0\u635f\u4e0a\u4e0b\u6587\u7ba1\u7406\uff08LCM\uff09\u5f15\u64ce\uff0c\u5b83\u6784\u5efa\u77e5\u8bc6\u6709\u5411\u65e0\u73af\u56fe\uff08DAG\uff09\u800c\u975e\u6709\u635f\u6458\u8981\u3002"]}),"\n",(0,r.jsx)(n.h2,{id:"how-it-works",children:"\u5de5\u4f5c\u539f\u7406"}),"\n",(0,r.jsxs)(n.p,{children:["Agent \u7684\u4e0a\u4e0b\u6587\u7ba1\u7406\u57fa\u4e8e ",(0,r.jsx)(n.code,{children:"ContextEngine"})," \u62bd\u8c61\u57fa\u7c7b\uff08",(0,r.jsx)(n.code,{children:"agent/context_engine.py"}),"\uff09\u3002\u5185\u7f6e\u7684 ",(0,r.jsx)(n.code,{children:"ContextCompressor"})," \u662f\u9ed8\u8ba4\u5b9e\u73b0\u3002\u63d2\u4ef6\u5f15\u64ce\u5fc5\u987b\u5b9e\u73b0\u76f8\u540c\u7684\u63a5\u53e3\u3002"]}),"\n",(0,r.jsxs)(n.p,{children:["\u540c\u4e00\u65f6\u95f4",(0,r.jsx)(n.strong,{children:"\u53ea\u80fd\u6fc0\u6d3b\u4e00\u4e2a"}),"\u4e0a\u4e0b\u6587\u5f15\u64ce\u3002\u9009\u62e9\u7531\u914d\u7f6e\u9a71\u52a8\uff1a"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'# config.yaml\ncontext:\n engine: "compressor" # \u9ed8\u8ba4\u5185\u7f6e\n engine: "lcm" # \u6fc0\u6d3b\u540d\u4e3a\u201c0\u201d\u7684\u63d2\u4ef6\u5f15\u64ce\n'})}),"\n",(0,r.jsxs)(n.p,{children:["\u63d2\u4ef6\u5f15\u64ce",(0,r.jsx)(n.strong,{children:"\u4e0d\u4f1a\u81ea\u52a8\u6fc0\u6d3b"}),"\u2014\u2014\u7528\u6237\u5fc5\u987b\u663e\u5f0f\u5c06 ",(0,r.jsx)(n.code,{children:"context.engine"})," \u8bbe\u7f6e\u4e3a\u63d2\u4ef6\u540d\u79f0\u3002"]}),"\n",(0,r.jsx)(n.h2,{id:"directory-structure",children:"\u76ee\u5f55\u7ed3\u6784"}),"\n",(0,r.jsxs)(n.p,{children:["\u6bcf\u4e2a\u4e0a\u4e0b\u6587\u5f15\u64ce\u4f4d\u4e8e ",(0,r.jsx)(n.code,{children:"plugins/context_engine/<name>/"})," \u76ee\u5f55\u4e0b\uff1a"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"plugins/context_engine/lcm/\n\u251c\u2500\u2500 __init__.py # \u5bfc\u51fa ContextEngine \u5b50\u7c7b\n\u251c\u2500\u2500 plugin.yaml # \u5143\u6570\u636e\uff08\u540d\u79f0\u3001\u63cf\u8ff0\u3001\u7248\u672c\uff09\n\u2514\u2500\u2500 ... # \u60a8\u7684\u5f15\u64ce\u9700\u8981\u7684\u4efb\u4f55\u5176\u4ed6\u6a21\u5757\n"})}),"\n",(0,r.jsx)(n.h2,{id:"the-contextengine-abc",children:"ContextEngine \u62bd\u8c61\u57fa\u7c7b"}),"\n",(0,r.jsxs)(n.p,{children:["\u60a8\u7684\u5f15\u64ce\u5fc5\u987b\u5b9e\u73b0\u4ee5\u4e0b",(0,r.jsx)(n.strong,{children:"\u5fc5\u9700"}),"\u65b9\u6cd5\uff1a"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'from agent.context_engine import ContextEngine\n\nclass LCMEngine(ContextEngine):\n\n @property\n def name(self) -> str:\n """Short identifier, e.g. \'lcm\'. Must match config.yaml value."""\n return "lcm"\n\n def update_from_response(self, usage: dict) -> None:\n """Called after every LLM call with the usage dict.\n\n Update self.last_prompt_tokens, self.last_completion_tokens,\n self.last_total_tokens from the response.\n """\n\n def should_compress(self, prompt_tokens: int = None) -> bool:\n """Return True if compaction should fire this turn."""\n\n def compress(self, messages: list, current_tokens: int = None) -> list:\n """Compact the message list and return a new (possibly shorter) list.\n\n The returned list must be a valid OpenAI-format message sequence.\n """\n'})}),"\n",(0,r.jsx)(n.h3,{id:"class-attributes-your-engine-must-maintain",children:"\u5f15\u64ce\u5fc5\u987b\u7ef4\u62a4\u7684\u7c7b\u5c5e\u6027"}),"\n",(0,r.jsx)(n.p,{children:"Agent \u4f1a\u76f4\u63a5\u8bfb\u53d6\u8fd9\u4e9b\u5c5e\u6027\u7528\u4e8e\u663e\u793a\u548c\u65e5\u5fd7\u8bb0\u5f55\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"last_prompt_tokens: int = 0\nlast_completion_tokens: int = 0\nlast_total_tokens: int = 0\nthreshold_tokens: int = 0 # \u5f53compression\u89e6\u53d1\u65f6\ncontext_length: int = 0 # model \u7684\u5b8c\u6574 context window\ncompression_count: int = 0 # compress() \u8fd0\u884c\u4e86\u591a\u5c11\u6b21\n"})}),"\n",(0,r.jsx)(n.h3,{id:"optional-methods",children:"\u53ef\u9009\u65b9\u6cd5"}),"\n",(0,r.jsx)(n.p,{children:"\u8fd9\u4e9b\u65b9\u6cd5\u5728 ABC \u4e2d\u5df2\u6709\u5408\u7406\u9ed8\u8ba4\u5b9e\u73b0\u3002\u6309\u9700\u91cd\u5199\uff1a"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"\u65b9\u6cd5"}),(0,r.jsx)(n.th,{children:"\u9ed8\u8ba4\u884c\u4e3a"}),(0,r.jsx)(n.th,{children:"\u91cd\u5199\u573a\u666f"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"on_session_start(session_id, **kwargs)"})}),(0,r.jsx)(n.td,{children:"\u7a7a\u64cd\u4f5c"}),(0,r.jsx)(n.td,{children:"\u9700\u8981\u52a0\u8f7d\u6301\u4e45\u5316\u72b6\u6001\uff08DAG\u3001\u6570\u636e\u5e93\uff09"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"on_session_end(session_id, messages)"})}),(0,r.jsx)(n.td,{children:"\u7a7a\u64cd\u4f5c"}),(0,r.jsx)(n.td,{children:"\u9700\u8981\u5237\u65b0\u72b6\u6001\u3001\u5173\u95ed\u8fde\u63a5"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"on_session_reset()"})}),(0,r.jsx)(n.td,{children:"\u91cd\u7f6e token \u8ba1\u6570\u5668"}),(0,r.jsx)(n.td,{children:"\u6709\u9700\u8981\u6e05\u9664\u7684\u4f1a\u8bdd\u7ea7\u72b6\u6001"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"update_model(model, context_length, ...)"})}),(0,r.jsx)(n.td,{children:"\u66f4\u65b0 context_length + threshold"}),(0,r.jsx)(n.td,{children:"\u6a21\u578b\u5207\u6362\u65f6\u9700\u8981\u91cd\u65b0\u8ba1\u7b97\u9884\u7b97"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"get_tool_schemas()"})}),(0,r.jsxs)(n.td,{children:["\u8fd4\u56de ",(0,r.jsx)(n.code,{children:"[]"})]}),(0,r.jsxs)(n.td,{children:["\u5f15\u64ce\u63d0\u4f9b Agent \u53ef\u8c03\u7528\u7684\u5de5\u5177\uff08\u5982 ",(0,r.jsx)(n.code,{children:"lcm_grep"}),"\uff09"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"handle_tool_call(name, args, **kwargs)"})}),(0,r.jsx)(n.td,{children:"\u8fd4\u56de\u9519\u8bef JSON"}),(0,r.jsx)(n.td,{children:"\u5b9e\u73b0\u5de5\u5177\u5904\u7406\u5668"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"should_compress_preflight(messages)"})}),(0,r.jsxs)(n.td,{children:["\u8fd4\u56de ",(0,r.jsx)(n.code,{children:"False"})]}),(0,r.jsx)(n.td,{children:"\u53ef\u5728 API \u8c03\u7528\u524d\u8fdb\u884c\u4f4e\u6210\u672c\u9884\u4f30"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:(0,r.jsx)(n.code,{children:"get_status()"})}),(0,r.jsx)(n.td,{children:"\u8fd4\u56de\u6807\u51c6\u7684 token/threshold \u5b57\u5178"}),(0,r.jsx)(n.td,{children:"\u6709\u81ea\u5b9a\u4e49\u6307\u6807\u9700\u8981\u66b4\u9732"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"engine-tools",children:"\u5f15\u64ce\u5de5\u5177"}),"\n",(0,r.jsxs)(n.p,{children:["\u4e0a\u4e0b\u6587\u5f15\u64ce\u53ef\u4ee5\u5411 Agent \u66b4\u9732\u76f4\u63a5\u8c03\u7528\u7684\u5de5\u5177\u3002\u901a\u8fc7 ",(0,r.jsx)(n.code,{children:"get_tool_schemas()"})," \u8fd4\u56de\u5de5\u5177 schema\uff0c\u5e76\u5728 ",(0,r.jsx)(n.code,{children:"handle_tool_call()"})," \u4e2d\u5904\u7406\u8c03\u7528\uff1a"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'def get_tool_schemas(self):\n return [{\n "name": "lcm_grep",\n "description": "Search the context knowledge graph",\n "parameters": {\n "type": "object",\n "properties": {\n "query": {"type": "string", "description": "Search query"}\n },\n "required": ["query"],\n },\n }]\n\ndef handle_tool_call(self, name, args, **kwargs):\n if name == "lcm_grep":\n results = self._search_dag(args["query"])\n return json.dumps({"results": results})\n return json.dumps({"error": f"Unknown tool: {name}"})\n'})}),"\n",(0,r.jsx)(n.p,{children:"\u5f15\u64ce\u5de5\u5177\u4f1a\u5728 Agent \u542f\u52a8\u
165f6\u81ea\u52a8\u6ce8\u5165\u5230\u5de5\u5177\u5217\u8868\u4e2d\u5e76\u88ab\u81ea\u52a8\u5206\u53d1\u2014\u2014\u65e0\u9700\u6ce8\u518c\u5230\u6ce8\u518c\u8868\u3002"}),"\n",(0,r.jsx)(n.h2,{id:"registration",children:"\u6ce8\u518c"}),"\n",(0,r.jsx)(n.h3,{id:"via-directory-recommended",children:"\u901a\u8fc7\u76ee\u5f55\uff08\u63a8\u8350\u65b9\u5f0f\uff09"}),"\n",(0,r.jsxs)(n.p,{children:["\u5c06\u60a8\u7684\u5f15\u64ce\u653e\u7f6e\u4e8e ",(0,r.jsx)(n.code,{children:"plugins/context_engine/<name>/"})," \u76ee\u5f55\u4e0b\u3002",(0,r.jsx)(n.code,{children:"__init__.py"})," \u5fc5\u987b\u5bfc\u51fa\u4e00\u4e2a ",(0,r.jsx)(n.code,{children:"ContextEngine"})," \u5b50\u7c7b\u3002\u53d1\u73b0\u7cfb\u7edf\u4f1a\u81ea\u52a8\u67e5\u627e\u5e76\u5b9e\u4f8b\u5316\u5b83\u3002"]}),"\n",(0,r.jsx)(n.h3,{id:"via-general-plugin-system",children:"\u901a\u8fc7\u901a\u7528\u63d2\u4ef6\u7cfb\u7edf"}),"\n",(0,r.jsx)(n.p,{children:"\u901a\u7528\u63d2\u4ef6\u4e5f\u53ef\u4ee5\u6ce8\u518c\u4e00\u4e2a\u4e0a\u4e0b\u6587\u5f15\u64ce\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"def register(ctx):\n engine = LCMEngine(context_length=200000)\n ctx.register_context_engine(engine)\n"})}),"\n",(0,r.jsx)(n.p,{children:"\u53ea\u80fd\u6ce8\u518c\u4e00\u4e2a\u5f15\u64ce\u3002\u7b2c\u4e8c\u4e2a\u5c1d\u8bd5\u6ce8\u518c\u7684\u63d2\u4ef6\u5c06\u88ab\u62d2\u7edd\uff0c\u5e76\u53d1\u51fa\u8b66\u544a\u3002"}),"\n",(0,r.jsx)(n.h2,{id:"lifecycle",children:"\u751f\u547d\u5468\u671f"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"1. Engine instantiated (plugin load or directory discovery)\n2. on_session_start() \u2014 conversation begins\n3. update_from_response() \u2014 after each API call\n4. should_compress() \u2014 checked each turn\n5. compress() \u2014 called when should_compress() returns True\n6. on_session_end() \u2014 session boundary (CLI exit, /reset, gateway expiry)\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"on_session_reset()"})," \u5728 ",(0,r.jsx)(n.code,{children:"/new"})," \u6216 ",(0,r.jsx)(n.code,{children:"/reset"})," \u65f6\u88ab\u8c03\u7528\uff0c\u7528\u4e8e\u6e05\u9664\u4f1a\u8bdd\u7ea7\u72b6\u6001\uff0c\u800c\u65e0\u9700\u5b8c\u5168\u5173\u95ed\u3002"]}),"\n",(0,r.jsx)(n.h2,{id:"configuration",children:"\u914d\u7f6e"}),"\n",(0,r.jsxs)(n.p,{children:["\u7528\u6237\u901a\u8fc7 ",(0,r.jsx)(n.code,{children:"hermes plugins"})," \u2192 Provider Plugins \u2192 Context Engine \u9009\u62e9\u60a8\u7684\u5f15\u64ce\uff0c\u6216\u901a\u8fc7\u7f16\u8f91 ",(0,r.jsx)(n.code,{children:"config.yaml"})," \u8fdb\u884c\u914d\u7f6e\uff1a"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:'context:\n engine: "lcm" # \u5fc5\u987b\u4e0e\u60a8\u7684\u5f15\u64ce\u7684\u540d\u79f0\u5c5e\u6027\u5339\u914d\n'})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"compression"})," \u914d\u7f6e\u5757\uff08\u5982 ",(0,r.jsx)(n.code,{children:"compression.threshold"}),"\u3001",(0,r.jsx)(n.code,{children:"compression.protect_last_n"})," \u7b49\uff09\u4e13\u5c5e\u4e8e\u5185\u7f6e\u7684 ",(0,r.jsx)(n.code,{children:"ContextCompressor"}),"\u3002\u5982\u679c\u60a8\u7684\u5f15\u64ce\u9700\u8981\u81ea\u5b9a\u4e49\u914d\u7f6e\u683c\u5f0f\uff0c\u5e94\u5728\u521d\u59cb\u5316\u65f6\u4ece ",(0,r.jsx)(n.code,{children:"config.yaml"})," \u8bfb\u53d6\u3002"]}),"\n",(0,r.jsx)(n.h2,{id:"testing",children:"\u6d4b\u8bd5"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'from agent.context_engine import ContextEngine\n\ndef test_engine_satisfies_abc():\n engine = YourEngine(context_length=200000)\n assert isinstance(engine, ContextEngine)\n assert engine.name == "your-name"\n\ndef test_compress_returns_valid_messages():\n engine = YourEngine(context_length=200000)\n msgs = [{"role": "user", "content": "hello"}]\n result = engine.compress(msgs)\n assert isinstance(result, list)\n assert all("role" in m for m in result)\n'})}),"\n",(0,r.jsxs)(n.p,{children:["\u8bf7\u53c2\u9605 ",(0,r.jsx)(n.code,{children:"tests/agent/test_context_engine.py"})," \u4ee5\u83b7\u53d6\u5b8c\u6574\u7684 ABC \u5408\u7ea6\u6d4b\u8bd5\u5957\u4ef6\u3002"]}),"\n",(0,r.jsx)(n.h2,{id:"see-also",children:"\u53c2\u89c1"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/developer-guide/context-compression-and-caching",children:"\u4e0a\u4e0b\u6587\u538b\u7f29\u4e0e\u7f13\u5b58"})," \u2014 \u5185\u7f6e\u538b\u7f29\u5668\u7684\u5de5\u4f5c\u539f\u7406"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/developer-guide/memory-provider-plugin",children:"\u8bb0\u5fc6\u63d0\u4f9b\u8005\u63d2\u4ef6"})," \u2014 \u4e0e\u4e0a\u4e0b\u6587\u5f15\u64ce\u7c7b\u4f3c\u7684\u5355\u9009\u63d2\u4ef6\u7cfb\u7edf"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/docs/user-guide/features/plugins",children:"\u63d2\u4ef6"})," \u2014 \u901a\u7528\u63d2\u4ef6\u7cfb\u7edf\u6982\u89c8"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.