[{"data":1,"prerenderedAt":2048},["ShallowReactive",2],{"navigation_docs":3,"-context-engineering-summarization":208,"-context-engineering-summarization-surround":2043},[4,33,60,82,109,151],{"title":5,"path":6,"stem":7,"children":8,"icon":32},"OpenSSL","/openssl","1.openssl/1.index",[9,12,17,22,27],{"title":10,"path":6,"stem":7,"icon":11},"Overview","i-lucide-info",{"title":13,"path":14,"stem":15,"icon":16},"Certificates","/openssl/certificates","1.openssl/2.certificates","i-lucide-file-badge",{"title":18,"path":19,"stem":20,"icon":21},"Keys","/openssl/keys","1.openssl/3.keys","i-lucide-key",{"title":23,"path":24,"stem":25,"icon":26},"Encryption","/openssl/encryption","1.openssl/4.encryption","i-lucide-shield",{"title":28,"path":29,"stem":30,"icon":31},"Verification","/openssl/verification","1.openssl/5.verification","i-lucide-check-circle","i-lucide-lock",{"title":34,"path":35,"stem":36,"children":37,"icon":59},"Voice AI","/voice-ai","2.voice-ai/1.index",[38,39,44,49,54],{"title":10,"path":35,"stem":36,"icon":11},{"title":40,"path":41,"stem":42,"icon":43},"Twilio Media Streams","/voice-ai/twilio","2.voice-ai/2.twilio","i-lucide-radio",{"title":45,"path":46,"stem":47,"icon":48},"WebSocket & Streaming","/voice-ai/websocket","2.voice-ai/3.websocket","i-lucide-cable",{"title":50,"path":51,"stem":52,"icon":53},"LLM Integration","/voice-ai/llm","2.voice-ai/4.llm","i-lucide-brain",{"title":55,"path":56,"stem":57,"icon":58},"Speech Services","/voice-ai/speech","2.voice-ai/5.speech","i-lucide-audio-lines","i-lucide-phone",{"title":61,"path":62,"stem":63,"children":64,"icon":81},"Agents","/agents","3.agents/1.index",[65,66,71,76],{"title":10,"path":62,"stem":63,"icon":11},{"title":67,"path":68,"stem":69,"icon":70},"RAG","/agents/rag","3.agents/2.rag","i-lucide-database",{"title":72,"path":73,"stem":74,"icon":75},"ReAct Agents","/agents/react-agents","3.agents/3.react-agents","i-lucide-activity",{"title":77,"path":78,"stem":79,"icon":80},"OpenAI Agent","/agents/openai-agent","3.agents/4.openai-agent","i-lucide-bot","i-lucide-users",{"title":83,"path":84,"stem":85,"children":86,"icon":88},"Context Engineering","/context-engineering","4.context-engineering/1.index",[87,89,94,99,104],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-brain-circuit",{"title":90,"path":91,"stem":92,"icon":93},"Managing The Context Window","/context-engineering/managing-context-window","4.context-engineering/2.managing-context-window","i-lucide-settings",{"title":95,"path":96,"stem":97,"icon":98},"Sliding Window Strategy","/context-engineering/sliding-window","4.context-engineering/3.sliding-window","i-lucide-arrow-left-right",{"title":100,"path":101,"stem":102,"icon":103},"Token-based Management","/context-engineering/token-based","4.context-engineering/4.token-based","i-lucide-hash",{"title":105,"path":106,"stem":107,"icon":108},"Summarization Techniques","/context-engineering/summarization","4.context-engineering/5.summarization","i-lucide-file-text",{"title":110,"path":111,"stem":112,"children":113,"icon":150},"AI SDK 6","/ai-sdk","5.ai-sdk/1.index",[114,115,120,125,130,135,140,145],{"title":10,"path":111,"stem":112,"icon":11},{"title":116,"path":117,"stem":118,"icon":119},"Installation & Setup","/ai-sdk/installation","5.ai-sdk/2.installation","i-lucide-package",{"title":121,"path":122,"stem":123,"icon":124},"Model Method","/ai-sdk/model","5.ai-sdk/3.model","i-lucide-box",{"title":126,"path":127,"stem":128,"icon":129},"generateText","/ai-sdk/generate-text","5.ai-sdk/4.generate-text","i-lucide-message-square",{"title":131,"path":132,"stem":133,"icon":134},"streamText","/ai-sdk/stream-text","5.ai-sdk/5.stream-text","i-lucide-zap",{"title":136,"path":137,"stem":138,"icon":139},"Structured Output","/ai-sdk/structured-output","5.ai-sdk/6.structured-output","i-lucide-layers",{"title":141,"path":142,"stem":143,"icon":144},"Text Embeddings","/ai-sdk/embeddings","5.ai-sdk/7.embeddings","i-lucide-git-branch",{"title":146,"path":147,"stem":148,"icon":149},"Agent Loop – ToolLoopAgent","/ai-sdk/agent-loop","5.ai-sdk/8.agent-loop","i-lucide-refresh-cw","i-lucide-cpu",{"title":152,"icon":153,"path":154,"stem":155,"children":156,"page":207},"Syntax Reference","i-lucide-book-open","/syntax-reference","999.syntax-reference",[157,162,167,172,177,182,187,192,197,202],{"title":158,"path":159,"stem":160,"icon":161},"Markdown Syntax","/syntax-reference/markdown-syntax","999.syntax-reference/1.markdown-syntax","i-lucide-heading-1",{"title":163,"path":164,"stem":165,"icon":166},"Code Blocks","/syntax-reference/code-blocks","999.syntax-reference/2.code-blocks","i-lucide-code-xml",{"title":168,"path":169,"stem":170,"icon":171},"Introduction","/syntax-reference/introduction","999.syntax-reference/2.introduction","i-lucide-house",{"title":173,"path":174,"stem":175,"icon":176},"Components","/syntax-reference/components","999.syntax-reference/3.components","i-lucide-component",{"title":178,"path":179,"stem":180,"icon":181},"Installation","/syntax-reference/installation","999.syntax-reference/3.installation","i-lucide-download",{"title":183,"path":184,"stem":185,"icon":186},"Images and Embeds","/syntax-reference/images-embeds","999.syntax-reference/4.images-embeds","i-lucide-image",{"title":188,"path":189,"stem":190,"icon":191},"Project Structure","/syntax-reference/project-structure","999.syntax-reference/4.project-structure","i-lucide-folder-tree",{"title":193,"path":194,"stem":195,"icon":196},"Studio module","/syntax-reference/studio","999.syntax-reference/5.studio","i-lucide-mouse-pointer-2",{"title":198,"path":199,"stem":200,"icon":201},"Migration","/syntax-reference/migration","999.syntax-reference/6.migration","i-lucide-replace",{"title":203,"path":204,"stem":205,"icon":206},"Troubleshooting","/syntax-reference/troubleshooting","999.syntax-reference/7.troubleshooting","i-lucide-wrench",false,{"id":209,"title":105,"body":210,"description":2036,"extension":2037,"links":2038,"meta":2039,"navigation":2040,"path":106,"seo":2041,"stem":107,"__hash__":2042},"docs/4.context-engineering/5.summarization.md",{"type":211,"value":212,"toc":1980},"minimark",[213,217,222,226,231,242,246,583,587,593,597,605,673,680,728,735,805,812,884,888,894,1026,1032,1097,1103,1218,1222,1228,1234,1240,1246,1252,1265,1269,1275,1330,1336,1417,1423,1486,1492,1569,1573,1579,1673,1679,1727,1733,1858,1862,1866,1892,1896,1921,1925,1928,1948,1951,1973,1976],[214,215,105],"h1",{"id":216},"summarization-techniques",[218,219,221],"h2",{"id":220},"how-summarizing-older-messages-works","How Summarizing Older Messages Works",[223,224,225],"p",{},"Summarization compresses older messages into condensed forms before dropping them, preserving key information while reducing token usage. This approach maintains important context across long conversations.",[227,228,230],"h3",{"id":229},"basic-concept","Basic Concept",[232,233,238],"pre",{"className":234,"code":236,"language":237},[235],"language-text","Original Messages:\nUser: \"I'm building a React app with TypeScript\"\nAssistant: \"Great choice! What features are you implementing?\"\nUser: \"User authentication, dashboard, and data visualization\"\nAssistant: \"Sounds comprehensive. What's your tech stack?\"\nUser: \"React, TypeScript, Node.js, PostgreSQL, and Redis\"\nAssistant: \"Excellent stack. Are you using any specific libraries?\"\nUser: \"For auth: Auth0, for charts: D3.js, for state: Redux Toolkit\"\n\nInstead of dropping all these messages, create a summary:\n\nSummary: \"User is building a React/TypeScript app with user auth, dashboard,\ndata visualization using Node.js, PostgreSQL, Redis, Auth0, D3.js, and Redux Toolkit.\"\n","text",[239,240,236],"code",{"__ignoreMap":241},"",[227,243,245],{"id":244},"implementation-strategy","Implementation Strategy",[232,247,251],{"className":248,"code":249,"language":250,"meta":241,"style":241},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class SummarizingContextManager:\n    def __init__(self, max_tokens=4000, summary_threshold=2000):\n        self.max_tokens = max_tokens\n        self.summary_threshold = summary_threshold\n        self.messages = []\n        self.summaries = []\n    \n    def add_message(self, role, content):\n        self.messages.append({\"role\": role, \"content\": content})\n        self._manage_context()\n    \n    def _manage_context(self):\n        total_tokens = self._count_tokens(self.get_full_context())\n        \n        if total_tokens > self.max_tokens:\n            # Need to summarize older messages\n            self._summarize_older_messages()\n    \n    def _summarize_older_messages(self):\n        # Keep recent messages, summarize older ones\n        recent_messages = self.messages[-3:]  # Keep last 3 messages\n        older_messages = self.messages[:-3]\n        \n        if older_messages:\n            summary = self._create_summary(older_messages)\n            self.summaries.append({\n                \"role\": \"system\", \n                \"content\": f\"Previous conversation summary: {summary}\"\n            })\n            \n            # Replace old messages with summary\n            self.messages = recent_messages\n    \n    def get_full_context(self):\n        return self.summaries + self.messages\n    \n    def _create_summary(self, messages):\n        # Use LLM to create summary\n        conversation = \"\\n\".join([\n            f\"{msg['role']}: {msg['content']}\" \n            for msg in messages\n        ])\n        \n        summary_prompt = f\"\"\"\n        Summarize this conversation, preserving key information:\n        {conversation}\n        \n        Keep it concise but include important details like:\n        - User's goals and requirements\n        - Technical decisions made\n        - Problems discussed and solutions\n        - Any specific preferences or constraints\n        \"\"\"\n        \n        # Call LLM API for summarization\n        return call_llm_api(summary_prompt)\n","python",[239,252,253,261,267,273,279,285,291,297,303,309,315,320,326,332,338,344,350,356,361,367,373,379,385,390,396,402,408,414,420,426,432,438,444,449,455,461,466,472,478,484,490,496,502,507,513,519,525,530,536,542,548,554,560,566,571,577],{"__ignoreMap":241},[254,255,258],"span",{"class":256,"line":257},"line",1,[254,259,260],{},"class SummarizingContextManager:\n",[254,262,264],{"class":256,"line":263},2,[254,265,266],{},"    def __init__(self, max_tokens=4000, summary_threshold=2000):\n",[254,268,270],{"class":256,"line":269},3,[254,271,272],{},"        self.max_tokens = max_tokens\n",[254,274,276],{"class":256,"line":275},4,[254,277,278],{},"        self.summary_threshold = summary_threshold\n",[254,280,282],{"class":256,"line":281},5,[254,283,284],{},"        self.messages = []\n",[254,286,288],{"class":256,"line":287},6,[254,289,290],{},"        self.summaries = []\n",[254,292,294],{"class":256,"line":293},7,[254,295,296],{},"    \n",[254,298,300],{"class":256,"line":299},8,[254,301,302],{},"    def add_message(self, role, content):\n",[254,304,306],{"class":256,"line":305},9,[254,307,308],{},"        self.messages.append({\"role\": role, \"content\": content})\n",[254,310,312],{"class":256,"line":311},10,[254,313,314],{},"        self._manage_context()\n",[254,316,318],{"class":256,"line":317},11,[254,319,296],{},[254,321,323],{"class":256,"line":322},12,[254,324,325],{},"    def _manage_context(self):\n",[254,327,329],{"class":256,"line":328},13,[254,330,331],{},"        total_tokens = self._count_tokens(self.get_full_context())\n",[254,333,335],{"class":256,"line":334},14,[254,336,337],{},"        \n",[254,339,341],{"class":256,"line":340},15,[254,342,343],{},"        if total_tokens > self.max_tokens:\n",[254,345,347],{"class":256,"line":346},16,[254,348,349],{},"            # Need to summarize older messages\n",[254,351,353],{"class":256,"line":352},17,[254,354,355],{},"            self._summarize_older_messages()\n",[254,357,359],{"class":256,"line":358},18,[254,360,296],{},[254,362,364],{"class":256,"line":363},19,[254,365,366],{},"    def _summarize_older_messages(self):\n",[254,368,370],{"class":256,"line":369},20,[254,371,372],{},"        # Keep recent messages, summarize older ones\n",[254,374,376],{"class":256,"line":375},21,[254,377,378],{},"        recent_messages = self.messages[-3:]  # Keep last 3 messages\n",[254,380,382],{"class":256,"line":381},22,[254,383,384],{},"        older_messages = self.messages[:-3]\n",[254,386,388],{"class":256,"line":387},23,[254,389,337],{},[254,391,393],{"class":256,"line":392},24,[254,394,395],{},"        if older_messages:\n",[254,397,399],{"class":256,"line":398},25,[254,400,401],{},"            summary = self._create_summary(older_messages)\n",[254,403,405],{"class":256,"line":404},26,[254,406,407],{},"            self.summaries.append({\n",[254,409,411],{"class":256,"line":410},27,[254,412,413],{},"                \"role\": \"system\", \n",[254,415,417],{"class":256,"line":416},28,[254,418,419],{},"                \"content\": f\"Previous conversation summary: {summary}\"\n",[254,421,423],{"class":256,"line":422},29,[254,424,425],{},"            })\n",[254,427,429],{"class":256,"line":428},30,[254,430,431],{},"            \n",[254,433,435],{"class":256,"line":434},31,[254,436,437],{},"            # Replace old messages with summary\n",[254,439,441],{"class":256,"line":440},32,[254,442,443],{},"            self.messages = recent_messages\n",[254,445,447],{"class":256,"line":446},33,[254,448,296],{},[254,450,452],{"class":256,"line":451},34,[254,453,454],{},"    def get_full_context(self):\n",[254,456,458],{"class":256,"line":457},35,[254,459,460],{},"        return self.summaries + self.messages\n",[254,462,464],{"class":256,"line":463},36,[254,465,296],{},[254,467,469],{"class":256,"line":468},37,[254,470,471],{},"    def _create_summary(self, messages):\n",[254,473,475],{"class":256,"line":474},38,[254,476,477],{},"        # Use LLM to create summary\n",[254,479,481],{"class":256,"line":480},39,[254,482,483],{},"        conversation = \"\\n\".join([\n",[254,485,487],{"class":256,"line":486},40,[254,488,489],{},"            f\"{msg['role']}: {msg['content']}\" \n",[254,491,493],{"class":256,"line":492},41,[254,494,495],{},"            for msg in messages\n",[254,497,499],{"class":256,"line":498},42,[254,500,501],{},"        ])\n",[254,503,505],{"class":256,"line":504},43,[254,506,337],{},[254,508,510],{"class":256,"line":509},44,[254,511,512],{},"        summary_prompt = f\"\"\"\n",[254,514,516],{"class":256,"line":515},45,[254,517,518],{},"        Summarize this conversation, preserving key information:\n",[254,520,522],{"class":256,"line":521},46,[254,523,524],{},"        {conversation}\n",[254,526,528],{"class":256,"line":527},47,[254,529,337],{},[254,531,533],{"class":256,"line":532},48,[254,534,535],{},"        Keep it concise but include important details like:\n",[254,537,539],{"class":256,"line":538},49,[254,540,541],{},"        - User's goals and requirements\n",[254,543,545],{"class":256,"line":544},50,[254,546,547],{},"        - Technical decisions made\n",[254,549,551],{"class":256,"line":550},51,[254,552,553],{},"        - Problems discussed and solutions\n",[254,555,557],{"class":256,"line":556},52,[254,558,559],{},"        - Any specific preferences or constraints\n",[254,561,563],{"class":256,"line":562},53,[254,564,565],{},"        \"\"\"\n",[254,567,569],{"class":256,"line":568},54,[254,570,337],{},[254,572,574],{"class":256,"line":573},55,[254,575,576],{},"        # Call LLM API for summarization\n",[254,578,580],{"class":256,"line":579},56,[254,581,582],{},"        return call_llm_api(summary_prompt)\n",[227,584,586],{"id":585},"visual-flow","Visual Flow",[232,588,591],{"className":589,"code":590,"language":237},[235],"Step 1: Context Full\n┌─────────────────────────────────────────────────┐\n│ [Msg1] [Msg2] [Msg3] [Msg4] [Msg5] [Msg6] [Msg7] │\n│ Total: 4500/4000 tokens ✗                       │\n└─────────────────────────────────────────────────┘\n\nStep 2: Identify Messages to Summarize\n┌─────────────────────────────────────────────────┐\n│ [Msg1] [Msg2] [Msg3] [Msg4] │ [Msg5] [Msg6] [Msg7] │\n│     Summarize these          │    Keep recent      │\n└─────────────────────────────────────────────────┘\n\nStep 3: Create Summary\n┌─────────────────────────────────────────────────┐\n│ [Summary: User discussed React app with auth...] │\n│ [Msg5] [Msg6] [Msg7]                            │\n│ Total: 2800/4000 tokens ✓                        │\n└─────────────────────────────────────────────────┘\n",[239,592,590],{"__ignoreMap":241},[218,594,596],{"id":595},"summarization-strategies","Summarization Strategies",[227,598,600,601],{"id":599},"_1-incremental-summarization","1. ",[602,603,604],"strong",{},"Incremental Summarization",[232,606,608],{"className":248,"code":607,"language":250,"meta":241,"style":241},"def incremental_summarization(messages, window_size=5):\n    \"\"\"Summarize in chunks to preserve more detail\"\"\"\n    summaries = []\n    \n    for i in range(0, len(messages), window_size):\n        chunk = messages[i:i + window_size]\n        if len(chunk) == window_size:  # Only summarize full chunks\n            summary = create_summary(chunk)\n            summaries.append(summary)\n        else:\n            summaries.extend(chunk)  # Keep partial chunk as-is\n    \n    return summaries\n",[239,609,610,615,620,625,629,634,639,644,649,654,659,664,668],{"__ignoreMap":241},[254,611,612],{"class":256,"line":257},[254,613,614],{},"def incremental_summarization(messages, window_size=5):\n",[254,616,617],{"class":256,"line":263},[254,618,619],{},"    \"\"\"Summarize in chunks to preserve more detail\"\"\"\n",[254,621,622],{"class":256,"line":269},[254,623,624],{},"    summaries = []\n",[254,626,627],{"class":256,"line":275},[254,628,296],{},[254,630,631],{"class":256,"line":281},[254,632,633],{},"    for i in range(0, len(messages), window_size):\n",[254,635,636],{"class":256,"line":287},[254,637,638],{},"        chunk = messages[i:i + window_size]\n",[254,640,641],{"class":256,"line":293},[254,642,643],{},"        if len(chunk) == window_size:  # Only summarize full chunks\n",[254,645,646],{"class":256,"line":299},[254,647,648],{},"            summary = create_summary(chunk)\n",[254,650,651],{"class":256,"line":305},[254,652,653],{},"            summaries.append(summary)\n",[254,655,656],{"class":256,"line":311},[254,657,658],{},"        else:\n",[254,660,661],{"class":256,"line":317},[254,662,663],{},"            summaries.extend(chunk)  # Keep partial chunk as-is\n",[254,665,666],{"class":256,"line":322},[254,667,296],{},[254,669,670],{"class":256,"line":328},[254,671,672],{},"    return summaries\n",[227,674,676,677],{"id":675},"_2-topic-based-summarization","2. ",[602,678,679],{},"Topic-based Summarization",[232,681,683],{"className":248,"code":682,"language":250,"meta":241,"style":241},"def topic_based_summarization(messages):\n    \"\"\"Group messages by topic before summarizing\"\"\"\n    topics = detect_topics(messages)\n    topic_summaries = {}\n    \n    for topic, topic_messages in topics.items():\n        topic_summaries[topic] = create_summary(topic_messages)\n    \n    return format_topic_summaries(topic_summaries)\n",[239,684,685,690,695,700,705,709,714,719,723],{"__ignoreMap":241},[254,686,687],{"class":256,"line":257},[254,688,689],{},"def topic_based_summarization(messages):\n",[254,691,692],{"class":256,"line":263},[254,693,694],{},"    \"\"\"Group messages by topic before summarizing\"\"\"\n",[254,696,697],{"class":256,"line":269},[254,698,699],{},"    topics = detect_topics(messages)\n",[254,701,702],{"class":256,"line":275},[254,703,704],{},"    topic_summaries = {}\n",[254,706,707],{"class":256,"line":281},[254,708,296],{},[254,710,711],{"class":256,"line":287},[254,712,713],{},"    for topic, topic_messages in topics.items():\n",[254,715,716],{"class":256,"line":293},[254,717,718],{},"        topic_summaries[topic] = create_summary(topic_messages)\n",[254,720,721],{"class":256,"line":299},[254,722,296],{},[254,724,725],{"class":256,"line":305},[254,726,727],{},"    return format_topic_summaries(topic_summaries)\n",[227,729,731,732],{"id":730},"_3-hierarchical-summarization","3. ",[602,733,734],{},"Hierarchical Summarization",[232,736,738],{"className":248,"code":737,"language":250,"meta":241,"style":241},"def hierarchical_summarization(messages, levels=3):\n    \"\"\"Create multi-level summaries for different detail needs\"\"\"\n    summaries = {}\n    \n    # Level 1: Very brief overview\n    summaries['brief'] = create_summary(messages, max_length=50)\n    \n    # Level 2: Moderate detail\n    summaries['detailed'] = create_summary(messages, max_length=200)\n    \n    # Level 3: Full context\n    summaries['full'] = create_summary(messages, max_length=500)\n    \n    return summaries\n",[239,739,740,745,750,755,759,764,769,773,778,783,787,792,797,801],{"__ignoreMap":241},[254,741,742],{"class":256,"line":257},[254,743,744],{},"def hierarchical_summarization(messages, levels=3):\n",[254,746,747],{"class":256,"line":263},[254,748,749],{},"    \"\"\"Create multi-level summaries for different detail needs\"\"\"\n",[254,751,752],{"class":256,"line":269},[254,753,754],{},"    summaries = {}\n",[254,756,757],{"class":256,"line":275},[254,758,296],{},[254,760,761],{"class":256,"line":281},[254,762,763],{},"    # Level 1: Very brief overview\n",[254,765,766],{"class":256,"line":287},[254,767,768],{},"    summaries['brief'] = create_summary(messages, max_length=50)\n",[254,770,771],{"class":256,"line":293},[254,772,296],{},[254,774,775],{"class":256,"line":299},[254,776,777],{},"    # Level 2: Moderate detail\n",[254,779,780],{"class":256,"line":305},[254,781,782],{},"    summaries['detailed'] = create_summary(messages, max_length=200)\n",[254,784,785],{"class":256,"line":311},[254,786,296],{},[254,788,789],{"class":256,"line":317},[254,790,791],{},"    # Level 3: Full context\n",[254,793,794],{"class":256,"line":322},[254,795,796],{},"    summaries['full'] = create_summary(messages, max_length=500)\n",[254,798,799],{"class":256,"line":328},[254,800,296],{},[254,802,803],{"class":256,"line":334},[254,804,672],{},[227,806,808,809],{"id":807},"_4-selective-summarization","4. ",[602,810,811],{},"Selective Summarization",[232,813,815],{"className":248,"code":814,"language":250,"meta":241,"style":241},"def selective_summarization(messages):\n    \"\"\"Only summarize certain types of messages\"\"\"\n    important_messages = []\n    regular_messages = []\n    \n    for msg in messages:\n        if is_important_message(msg):\n            important_messages.append(msg)\n        else:\n            regular_messages.append(msg)\n    \n    # Keep important messages, summarize regular ones\n    summary = create_summary(regular_messages)\n    return important_messages + [{\"role\": \"system\", \"content\": summary}]\n",[239,816,817,822,827,832,837,841,846,851,856,860,865,869,874,879],{"__ignoreMap":241},[254,818,819],{"class":256,"line":257},[254,820,821],{},"def selective_summarization(messages):\n",[254,823,824],{"class":256,"line":263},[254,825,826],{},"    \"\"\"Only summarize certain types of messages\"\"\"\n",[254,828,829],{"class":256,"line":269},[254,830,831],{},"    important_messages = []\n",[254,833,834],{"class":256,"line":275},[254,835,836],{},"    regular_messages = []\n",[254,838,839],{"class":256,"line":281},[254,840,296],{},[254,842,843],{"class":256,"line":287},[254,844,845],{},"    for msg in messages:\n",[254,847,848],{"class":256,"line":293},[254,849,850],{},"        if is_important_message(msg):\n",[254,852,853],{"class":256,"line":299},[254,854,855],{},"            important_messages.append(msg)\n",[254,857,858],{"class":256,"line":305},[254,859,658],{},[254,861,862],{"class":256,"line":311},[254,863,864],{},"            regular_messages.append(msg)\n",[254,866,867],{"class":256,"line":317},[254,868,296],{},[254,870,871],{"class":256,"line":322},[254,872,873],{},"    # Keep important messages, summarize regular ones\n",[254,875,876],{"class":256,"line":328},[254,877,878],{},"    summary = create_summary(regular_messages)\n",[254,880,881],{"class":256,"line":334},[254,882,883],{},"    return important_messages + [{\"role\": \"system\", \"content\": summary}]\n",[218,885,887],{"id":886},"advanced-summarization-techniques","Advanced Summarization Techniques",[227,889,600,891],{"id":890},"_1-structured-summaries",[602,892,893],{},"Structured Summaries",[232,895,897],{"className":248,"code":896,"language":250,"meta":241,"style":241},"def create_structured_summary(messages):\n    \"\"\"Create summaries with specific structure\"\"\"\n    summary_prompt = \"\"\"\n    Create a structured summary with these sections:\n    \n    GOALS: What the user wants to accomplish\n    TECH_STACK: Technologies and tools mentioned\n    DECISIONS: Important decisions made\n    PROBLEMS: Issues discussed and their solutions\n    CONSTRAINTS: Any limitations or requirements\n    \n    Conversation:\n    {conversation}\n    \"\"\"\n    \n    return call_llm_api(summary_prompt.format(conversation=format_messages(messages)))\n\n# Result:\n\"\"\"\nSUMMARY:\nGOALS: Build a React dashboard with user authentication\nTECH_STACK: React, TypeScript, Node.js, PostgreSQL, Auth0\nDECISIONS: Use Redux Toolkit for state management, D3.js for charts\nPROBLEMS: Resolved CORS issues with API integration\nCONSTRAINTS: Must support 1000+ concurrent users\n\"\"\"\n",[239,898,899,904,909,914,919,923,928,933,938,943,948,952,957,962,967,971,976,982,987,992,997,1002,1007,1012,1017,1022],{"__ignoreMap":241},[254,900,901],{"class":256,"line":257},[254,902,903],{},"def create_structured_summary(messages):\n",[254,905,906],{"class":256,"line":263},[254,907,908],{},"    \"\"\"Create summaries with specific structure\"\"\"\n",[254,910,911],{"class":256,"line":269},[254,912,913],{},"    summary_prompt = \"\"\"\n",[254,915,916],{"class":256,"line":275},[254,917,918],{},"    Create a structured summary with these sections:\n",[254,920,921],{"class":256,"line":281},[254,922,296],{},[254,924,925],{"class":256,"line":287},[254,926,927],{},"    GOALS: What the user wants to accomplish\n",[254,929,930],{"class":256,"line":293},[254,931,932],{},"    TECH_STACK: Technologies and tools mentioned\n",[254,934,935],{"class":256,"line":299},[254,936,937],{},"    DECISIONS: Important decisions made\n",[254,939,940],{"class":256,"line":305},[254,941,942],{},"    PROBLEMS: Issues discussed and their solutions\n",[254,944,945],{"class":256,"line":311},[254,946,947],{},"    CONSTRAINTS: Any limitations or requirements\n",[254,949,950],{"class":256,"line":317},[254,951,296],{},[254,953,954],{"class":256,"line":322},[254,955,956],{},"    Conversation:\n",[254,958,959],{"class":256,"line":328},[254,960,961],{},"    {conversation}\n",[254,963,964],{"class":256,"line":334},[254,965,966],{},"    \"\"\"\n",[254,968,969],{"class":256,"line":340},[254,970,296],{},[254,972,973],{"class":256,"line":346},[254,974,975],{},"    return call_llm_api(summary_prompt.format(conversation=format_messages(messages)))\n",[254,977,978],{"class":256,"line":352},[254,979,981],{"emptyLinePlaceholder":980},true,"\n",[254,983,984],{"class":256,"line":358},[254,985,986],{},"# Result:\n",[254,988,989],{"class":256,"line":363},[254,990,991],{},"\"\"\"\n",[254,993,994],{"class":256,"line":369},[254,995,996],{},"SUMMARY:\n",[254,998,999],{"class":256,"line":375},[254,1000,1001],{},"GOALS: Build a React dashboard with user authentication\n",[254,1003,1004],{"class":256,"line":381},[254,1005,1006],{},"TECH_STACK: React, TypeScript, Node.js, PostgreSQL, Auth0\n",[254,1008,1009],{"class":256,"line":387},[254,1010,1011],{},"DECISIONS: Use Redux Toolkit for state management, D3.js for charts\n",[254,1013,1014],{"class":256,"line":392},[254,1015,1016],{},"PROBLEMS: Resolved CORS issues with API integration\n",[254,1018,1019],{"class":256,"line":398},[254,1020,1021],{},"CONSTRAINTS: Must support 1000+ concurrent users\n",[254,1023,1024],{"class":256,"line":404},[254,1025,991],{},[227,1027,676,1029],{"id":1028},"_2-query-aware-summarization",[602,1030,1031],{},"Query-aware Summarization",[232,1033,1035],{"className":248,"code":1034,"language":250,"meta":241,"style":241},"def query_aware_summary(messages, current_query):\n    \"\"\"Summarize with focus on current query relevance\"\"\"\n    summary_prompt = f\"\"\"\n    Summarize this conversation, emphasizing information relevant to:\n    \"{current_query}\"\n    \n    Include background context but focus on details that help answer the current query.\n    \n    Conversation:\n    {format_messages(messages)}\n    \"\"\"\n    \n    return call_llm_api(summary_prompt)\n",[239,1036,1037,1042,1047,1052,1057,1062,1066,1071,1075,1079,1084,1088,1092],{"__ignoreMap":241},[254,1038,1039],{"class":256,"line":257},[254,1040,1041],{},"def query_aware_summary(messages, current_query):\n",[254,1043,1044],{"class":256,"line":263},[254,1045,1046],{},"    \"\"\"Summarize with focus on current query relevance\"\"\"\n",[254,1048,1049],{"class":256,"line":269},[254,1050,1051],{},"    summary_prompt = f\"\"\"\n",[254,1053,1054],{"class":256,"line":275},[254,1055,1056],{},"    Summarize this conversation, emphasizing information relevant to:\n",[254,1058,1059],{"class":256,"line":281},[254,1060,1061],{},"    \"{current_query}\"\n",[254,1063,1064],{"class":256,"line":287},[254,1065,296],{},[254,1067,1068],{"class":256,"line":293},[254,1069,1070],{},"    Include background context but focus on details that help answer the current query.\n",[254,1072,1073],{"class":256,"line":299},[254,1074,296],{},[254,1076,1077],{"class":256,"line":305},[254,1078,956],{},[254,1080,1081],{"class":256,"line":311},[254,1082,1083],{},"    {format_messages(messages)}\n",[254,1085,1086],{"class":256,"line":317},[254,1087,966],{},[254,1089,1090],{"class":256,"line":322},[254,1091,296],{},[254,1093,1094],{"class":256,"line":328},[254,1095,1096],{},"    return call_llm_api(summary_prompt)\n",[227,1098,731,1100],{"id":1099},"_3-progressive-summarization",[602,1101,1102],{},"Progressive Summarization",[232,1104,1106],{"className":248,"code":1105,"language":250,"meta":241,"style":241},"class ProgressiveSummarizer:\n    def __init__(self):\n        self.summaries = []  # List of (timestamp, summary) tuples\n        self.detail_levels = ['brief', 'moderate', 'detailed']\n    \n    def add_messages(self, messages):\n        # Create summaries at different detail levels\n        for level in self.detail_levels:\n            summary = create_summary(messages, detail_level=level)\n            self.summaries.append({\n                'timestamp': datetime.now(),\n                'level': level,\n                'summary': summary\n            })\n    \n    def get_relevant_summary(self, query):\n        # Return most appropriate summary based on query\n        if is_simple_query(query):\n            return self.get_brief_summary()\n        elif is_complex_query(query):\n            return self.get_detailed_summary()\n        else:\n            return self.get_moderate_summary()\n",[239,1107,1108,1113,1118,1123,1128,1132,1137,1142,1147,1152,1156,1161,1166,1171,1175,1179,1184,1189,1194,1199,1204,1209,1213],{"__ignoreMap":241},[254,1109,1110],{"class":256,"line":257},[254,1111,1112],{},"class ProgressiveSummarizer:\n",[254,1114,1115],{"class":256,"line":263},[254,1116,1117],{},"    def __init__(self):\n",[254,1119,1120],{"class":256,"line":269},[254,1121,1122],{},"        self.summaries = []  # List of (timestamp, summary) tuples\n",[254,1124,1125],{"class":256,"line":275},[254,1126,1127],{},"        self.detail_levels = ['brief', 'moderate', 'detailed']\n",[254,1129,1130],{"class":256,"line":281},[254,1131,296],{},[254,1133,1134],{"class":256,"line":287},[254,1135,1136],{},"    def add_messages(self, messages):\n",[254,1138,1139],{"class":256,"line":293},[254,1140,1141],{},"        # Create summaries at different detail levels\n",[254,1143,1144],{"class":256,"line":299},[254,1145,1146],{},"        for level in self.detail_levels:\n",[254,1148,1149],{"class":256,"line":305},[254,1150,1151],{},"            summary = create_summary(messages, detail_level=level)\n",[254,1153,1154],{"class":256,"line":311},[254,1155,407],{},[254,1157,1158],{"class":256,"line":317},[254,1159,1160],{},"                'timestamp': datetime.now(),\n",[254,1162,1163],{"class":256,"line":322},[254,1164,1165],{},"                'level': level,\n",[254,1167,1168],{"class":256,"line":328},[254,1169,1170],{},"                'summary': summary\n",[254,1172,1173],{"class":256,"line":334},[254,1174,425],{},[254,1176,1177],{"class":256,"line":340},[254,1178,296],{},[254,1180,1181],{"class":256,"line":346},[254,1182,1183],{},"    def get_relevant_summary(self, query):\n",[254,1185,1186],{"class":256,"line":352},[254,1187,1188],{},"        # Return most appropriate summary based on query\n",[254,1190,1191],{"class":256,"line":358},[254,1192,1193],{},"        if is_simple_query(query):\n",[254,1195,1196],{"class":256,"line":363},[254,1197,1198],{},"            return self.get_brief_summary()\n",[254,1200,1201],{"class":256,"line":369},[254,1202,1203],{},"        elif is_complex_query(query):\n",[254,1205,1206],{"class":256,"line":375},[254,1207,1208],{},"            return self.get_detailed_summary()\n",[254,1210,1211],{"class":256,"line":381},[254,1212,658],{},[254,1214,1215],{"class":256,"line":387},[254,1216,1217],{},"            return self.get_moderate_summary()\n",[218,1219,1221],{"id":1220},"benefits-of-summarization","Benefits of Summarization",[227,1223,600,1225],{"id":1224},"_1-context-preservation",[602,1226,1227],{},"Context Preservation",[232,1229,1232],{"className":1230,"code":1231,"language":237},[235],"Without Summarization:\nUser: \"What was my original requirement?\"\nAssistant: \"I don't remember, that message was dropped.\"\n\nWith Summarization:\nUser: \"What was my original requirement?\"\nAssistant: \"Based on the summary, you wanted to build a React dashboard with user authentication and data visualization.\"\n",[239,1233,1231],{"__ignoreMap":241},[227,1235,676,1237],{"id":1236},"_2-token-efficiency",[602,1238,1239],{},"Token Efficiency",[232,1241,1244],{"className":1242,"code":1243,"language":237},[235],"Original Messages: 2000 tokens\nSummary: 200 tokens\nSavings: 90% reduction while preserving key information\n",[239,1245,1243],{"__ignoreMap":241},[227,1247,731,1249],{"id":1248},"_3-conversation-continuity",[602,1250,1251],{},"Conversation Continuity",[1253,1254,1255,1259,1262],"ul",{},[1256,1257,1258],"li",{},"Maintains thread of conversation",[1256,1260,1261],{},"Preserves user preferences and constraints",[1256,1263,1264],{},"Keeps track of decisions and progress",[218,1266,1268],{"id":1267},"challenges-and-limitations","Challenges and Limitations",[227,1270,600,1272],{"id":1271},"_1-information-loss",[602,1273,1274],{},"Information Loss",[232,1276,1278],{"className":248,"code":1277,"language":250,"meta":241,"style":241},"# What gets lost in summarization?\ndef analyze_summary_loss(original, summary):\n    lost_information = {\n        'specific_numbers': [],  # Exact values, measurements\n        'nuance': [],           # Subtle details and context\n        'conversation_flow': [], # How discussion evolved\n        'user_personality': [],  # User's communication style\n        'emotional_context': []  # User's frustration/excitement\n    }\n    return lost_information\n",[239,1279,1280,1285,1290,1295,1300,1305,1310,1315,1320,1325],{"__ignoreMap":241},[254,1281,1282],{"class":256,"line":257},[254,1283,1284],{},"# What gets lost in summarization?\n",[254,1286,1287],{"class":256,"line":263},[254,1288,1289],{},"def analyze_summary_loss(original, summary):\n",[254,1291,1292],{"class":256,"line":269},[254,1293,1294],{},"    lost_information = {\n",[254,1296,1297],{"class":256,"line":275},[254,1298,1299],{},"        'specific_numbers': [],  # Exact values, measurements\n",[254,1301,1302],{"class":256,"line":281},[254,1303,1304],{},"        'nuance': [],           # Subtle details and context\n",[254,1306,1307],{"class":256,"line":287},[254,1308,1309],{},"        'conversation_flow': [], # How discussion evolved\n",[254,1311,1312],{"class":256,"line":293},[254,1313,1314],{},"        'user_personality': [],  # User's communication style\n",[254,1316,1317],{"class":256,"line":299},[254,1318,1319],{},"        'emotional_context': []  # User's frustration/excitement\n",[254,1321,1322],{"class":256,"line":305},[254,1323,1324],{},"    }\n",[254,1326,1327],{"class":256,"line":311},[254,1328,1329],{},"    return lost_information\n",[227,1331,676,1333],{"id":1332},"_2-summarization-cost",[602,1334,1335],{},"Summarization Cost",[232,1337,1339],{"className":248,"code":1338,"language":250,"meta":241,"style":241},"# Summarization requires additional API calls\ndef calculate_summarization_cost(messages, model=\"gpt-4\"):\n    original_tokens = count_tokens(messages)\n    summary_tokens = estimate_summary_tokens(original_tokens)\n    \n    # Cost to create summary\n    summary_cost = (original_tokens + summary_tokens) * get_pricing(model)\n    \n    # Savings from reduced context in future calls\n    future_savings = (original_tokens - summary_tokens) * get_pricing(model)\n    \n    return {\n        'summary_cost': summary_cost,\n        'future_savings': future_savings,\n        'break_even': summary_cost / future_savings\n    }\n",[239,1340,1341,1346,1351,1356,1361,1365,1370,1375,1379,1384,1389,1393,1398,1403,1408,1413],{"__ignoreMap":241},[254,1342,1343],{"class":256,"line":257},[254,1344,1345],{},"# Summarization requires additional API calls\n",[254,1347,1348],{"class":256,"line":263},[254,1349,1350],{},"def calculate_summarization_cost(messages, model=\"gpt-4\"):\n",[254,1352,1353],{"class":256,"line":269},[254,1354,1355],{},"    original_tokens = count_tokens(messages)\n",[254,1357,1358],{"class":256,"line":275},[254,1359,1360],{},"    summary_tokens = estimate_summary_tokens(original_tokens)\n",[254,1362,1363],{"class":256,"line":281},[254,1364,296],{},[254,1366,1367],{"class":256,"line":287},[254,1368,1369],{},"    # Cost to create summary\n",[254,1371,1372],{"class":256,"line":293},[254,1373,1374],{},"    summary_cost = (original_tokens + summary_tokens) * get_pricing(model)\n",[254,1376,1377],{"class":256,"line":299},[254,1378,296],{},[254,1380,1381],{"class":256,"line":305},[254,1382,1383],{},"    # Savings from reduced context in future calls\n",[254,1385,1386],{"class":256,"line":311},[254,1387,1388],{},"    future_savings = (original_tokens - summary_tokens) * get_pricing(model)\n",[254,1390,1391],{"class":256,"line":317},[254,1392,296],{},[254,1394,1395],{"class":256,"line":322},[254,1396,1397],{},"    return {\n",[254,1399,1400],{"class":256,"line":328},[254,1401,1402],{},"        'summary_cost': summary_cost,\n",[254,1404,1405],{"class":256,"line":334},[254,1406,1407],{},"        'future_savings': future_savings,\n",[254,1409,1410],{"class":256,"line":340},[254,1411,1412],{},"        'break_even': summary_cost / future_savings\n",[254,1414,1415],{"class":256,"line":346},[254,1416,1324],{},[227,1418,731,1420],{"id":1419},"_3-summary-quality-variability",[602,1421,1422],{},"Summary Quality Variability",[232,1424,1426],{"className":248,"code":1425,"language":250,"meta":241,"style":241},"def ensure_summary_quality(summary, original_messages):\n    \"\"\"Validate that summary preserves critical information\"\"\"\n    checks = {\n        'goals_preserved': check_goals(summary, original_messages),\n        'decisions_preserved': check_decisions(summary, original_messages),\n        'constraints_preserved': check_constraints(summary, original_messages),\n        'technical_details_preserved': check_tech_details(summary, original_messages)\n    }\n    \n    if not all(checks.values()):\n        return improve_summary(summary, original_messages, failed_checks=checks)\n    return summary\n",[239,1427,1428,1433,1438,1443,1448,1453,1458,1463,1467,1471,1476,1481],{"__ignoreMap":241},[254,1429,1430],{"class":256,"line":257},[254,1431,1432],{},"def ensure_summary_quality(summary, original_messages):\n",[254,1434,1435],{"class":256,"line":263},[254,1436,1437],{},"    \"\"\"Validate that summary preserves critical information\"\"\"\n",[254,1439,1440],{"class":256,"line":269},[254,1441,1442],{},"    checks = {\n",[254,1444,1445],{"class":256,"line":275},[254,1446,1447],{},"        'goals_preserved': check_goals(summary, original_messages),\n",[254,1449,1450],{"class":256,"line":281},[254,1451,1452],{},"        'decisions_preserved': check_decisions(summary, original_messages),\n",[254,1454,1455],{"class":256,"line":287},[254,1456,1457],{},"        'constraints_preserved': check_constraints(summary, original_messages),\n",[254,1459,1460],{"class":256,"line":293},[254,1461,1462],{},"        'technical_details_preserved': check_tech_details(summary, original_messages)\n",[254,1464,1465],{"class":256,"line":299},[254,1466,1324],{},[254,1468,1469],{"class":256,"line":305},[254,1470,296],{},[254,1472,1473],{"class":256,"line":311},[254,1474,1475],{},"    if not all(checks.values()):\n",[254,1477,1478],{"class":256,"line":317},[254,1479,1480],{},"        return improve_summary(summary, original_messages, failed_checks=checks)\n",[254,1482,1483],{"class":256,"line":322},[254,1484,1485],{},"    return summary\n",[227,1487,808,1489],{"id":1488},"_4-latency-impact",[602,1490,1491],{},"Latency Impact",[232,1493,1495],{"className":248,"code":1494,"language":250,"meta":241,"style":241},"# Summarization adds processing time\nasync def add_message_with_summary(self, message):\n    start_time = time.time()\n    \n    # Add message\n    self.messages.append(message)\n    \n    # Check if summarization needed\n    if self._needs_summarization():\n        # This adds latency\n        summary = await self._create_summary_async()\n        self._apply_summary(summary)\n    \n    processing_time = time.time() - start_time\n    return processing_time\n",[239,1496,1497,1502,1507,1512,1516,1521,1526,1530,1535,1540,1545,1550,1555,1559,1564],{"__ignoreMap":241},[254,1498,1499],{"class":256,"line":257},[254,1500,1501],{},"# Summarization adds processing time\n",[254,1503,1504],{"class":256,"line":263},[254,1505,1506],{},"async def add_message_with_summary(self, message):\n",[254,1508,1509],{"class":256,"line":269},[254,1510,1511],{},"    start_time = time.time()\n",[254,1513,1514],{"class":256,"line":275},[254,1515,296],{},[254,1517,1518],{"class":256,"line":281},[254,1519,1520],{},"    # Add message\n",[254,1522,1523],{"class":256,"line":287},[254,1524,1525],{},"    self.messages.append(message)\n",[254,1527,1528],{"class":256,"line":293},[254,1529,296],{},[254,1531,1532],{"class":256,"line":299},[254,1533,1534],{},"    # Check if summarization needed\n",[254,1536,1537],{"class":256,"line":305},[254,1538,1539],{},"    if self._needs_summarization():\n",[254,1541,1542],{"class":256,"line":311},[254,1543,1544],{},"        # This adds latency\n",[254,1546,1547],{"class":256,"line":317},[254,1548,1549],{},"        summary = await self._create_summary_async()\n",[254,1551,1552],{"class":256,"line":322},[254,1553,1554],{},"        self._apply_summary(summary)\n",[254,1556,1557],{"class":256,"line":328},[254,1558,296],{},[254,1560,1561],{"class":256,"line":334},[254,1562,1563],{},"    processing_time = time.time() - start_time\n",[254,1565,1566],{"class":256,"line":340},[254,1567,1568],{},"    return processing_time\n",[218,1570,1572],{"id":1571},"best-practices","Best Practices",[227,1574,600,1576],{"id":1575},"_1-smart-summarization-triggers",[602,1577,1578],{},"Smart Summarization Triggers",[232,1580,1582],{"className":248,"code":1581,"language":250,"meta":241,"style":241},"class SmartSummarizer:\n    def should_summarize(self, messages):\n        # Don't summarize too frequently\n        if len(messages) \u003C 5:\n            return False\n        \n        # Summarize when context is full\n        if self._token_count(messages) > self.max_tokens * 0.8:\n            return True\n        \n        # Summarize if topic changed significantly\n        if self._topic_shift(messages):\n            return True\n        \n        # Summarize if time gap is large\n        if self._time_gap(messages) > timedelta(hours=1):\n            return True\n        \n        return False\n",[239,1583,1584,1589,1594,1599,1604,1609,1613,1618,1623,1628,1632,1637,1642,1646,1650,1655,1660,1664,1668],{"__ignoreMap":241},[254,1585,1586],{"class":256,"line":257},[254,1587,1588],{},"class SmartSummarizer:\n",[254,1590,1591],{"class":256,"line":263},[254,1592,1593],{},"    def should_summarize(self, messages):\n",[254,1595,1596],{"class":256,"line":269},[254,1597,1598],{},"        # Don't summarize too frequently\n",[254,1600,1601],{"class":256,"line":275},[254,1602,1603],{},"        if len(messages) \u003C 5:\n",[254,1605,1606],{"class":256,"line":281},[254,1607,1608],{},"            return False\n",[254,1610,1611],{"class":256,"line":287},[254,1612,337],{},[254,1614,1615],{"class":256,"line":293},[254,1616,1617],{},"        # Summarize when context is full\n",[254,1619,1620],{"class":256,"line":299},[254,1621,1622],{},"        if self._token_count(messages) > self.max_tokens * 0.8:\n",[254,1624,1625],{"class":256,"line":305},[254,1626,1627],{},"            return True\n",[254,1629,1630],{"class":256,"line":311},[254,1631,337],{},[254,1633,1634],{"class":256,"line":317},[254,1635,1636],{},"        # Summarize if topic changed significantly\n",[254,1638,1639],{"class":256,"line":322},[254,1640,1641],{},"        if self._topic_shift(messages):\n",[254,1643,1644],{"class":256,"line":328},[254,1645,1627],{},[254,1647,1648],{"class":256,"line":334},[254,1649,337],{},[254,1651,1652],{"class":256,"line":340},[254,1653,1654],{},"        # Summarize if time gap is large\n",[254,1656,1657],{"class":256,"line":346},[254,1658,1659],{},"        if self._time_gap(messages) > timedelta(hours=1):\n",[254,1661,1662],{"class":256,"line":352},[254,1663,1627],{},[254,1665,1666],{"class":256,"line":358},[254,1667,337],{},[254,1669,1670],{"class":256,"line":363},[254,1671,1672],{},"        return False\n",[227,1674,676,1676],{"id":1675},"_2-summary-validation",[602,1677,1678],{},"Summary Validation",[232,1680,1682],{"className":248,"code":1681,"language":250,"meta":241,"style":241},"def validate_summary(summary, original_messages):\n    \"\"\"Ensure summary doesn't lose critical information\"\"\"\n    critical_elements = extract_critical_elements(original_messages)\n    \n    for element in critical_elements:\n        if not contains_information(summary, element):\n            return False, f\"Missing critical element: {element}\"\n    \n    return True, \"Summary is valid\"\n",[239,1683,1684,1689,1694,1699,1703,1708,1713,1718,1722],{"__ignoreMap":241},[254,1685,1686],{"class":256,"line":257},[254,1687,1688],{},"def validate_summary(summary, original_messages):\n",[254,1690,1691],{"class":256,"line":263},[254,1692,1693],{},"    \"\"\"Ensure summary doesn't lose critical information\"\"\"\n",[254,1695,1696],{"class":256,"line":269},[254,1697,1698],{},"    critical_elements = extract_critical_elements(original_messages)\n",[254,1700,1701],{"class":256,"line":275},[254,1702,296],{},[254,1704,1705],{"class":256,"line":281},[254,1706,1707],{},"    for element in critical_elements:\n",[254,1709,1710],{"class":256,"line":287},[254,1711,1712],{},"        if not contains_information(summary, element):\n",[254,1714,1715],{"class":256,"line":293},[254,1716,1717],{},"            return False, f\"Missing critical element: {element}\"\n",[254,1719,1720],{"class":256,"line":299},[254,1721,296],{},[254,1723,1724],{"class":256,"line":305},[254,1725,1726],{},"    return True, \"Summary is valid\"\n",[227,1728,731,1730],{"id":1729},"_3-hybrid-approaches",[602,1731,1732],{},"Hybrid Approaches",[232,1734,1736],{"className":248,"code":1735,"language":250,"meta":241,"style":241},"def hybrid_context_management(messages, max_tokens):\n    \"\"\"Combine summarization with other strategies\"\"\"\n    \n    # 1. Always keep system messages\n    system_messages = get_system_messages(messages)\n    \n    # 2. Keep very recent messages\n    recent_messages = get_recent_messages(messages, count=3)\n    \n    # 3. Summarize middle messages\n    middle_messages = get_middle_messages(messages)\n    if middle_messages:\n        summary = create_summary(middle_messages)\n        summary_message = {\"role\": \"system\", \"content\": f\"Summary: {summary}\"}\n    else:\n        summary_message = None\n    \n    # 4. Combine everything\n    final_context = system_messages\n    if summary_message:\n        final_context.append(summary_message)\n    final_context.extend(recent_messages)\n    \n    # 5. Trim if still too long\n    return trim_to_token_limit(final_context, max_tokens)\n",[239,1737,1738,1743,1748,1752,1757,1762,1766,1771,1776,1780,1785,1790,1795,1800,1805,1810,1815,1819,1824,1829,1834,1839,1844,1848,1853],{"__ignoreMap":241},[254,1739,1740],{"class":256,"line":257},[254,1741,1742],{},"def hybrid_context_management(messages, max_tokens):\n",[254,1744,1745],{"class":256,"line":263},[254,1746,1747],{},"    \"\"\"Combine summarization with other strategies\"\"\"\n",[254,1749,1750],{"class":256,"line":269},[254,1751,296],{},[254,1753,1754],{"class":256,"line":275},[254,1755,1756],{},"    # 1. Always keep system messages\n",[254,1758,1759],{"class":256,"line":281},[254,1760,1761],{},"    system_messages = get_system_messages(messages)\n",[254,1763,1764],{"class":256,"line":287},[254,1765,296],{},[254,1767,1768],{"class":256,"line":293},[254,1769,1770],{},"    # 2. Keep very recent messages\n",[254,1772,1773],{"class":256,"line":299},[254,1774,1775],{},"    recent_messages = get_recent_messages(messages, count=3)\n",[254,1777,1778],{"class":256,"line":305},[254,1779,296],{},[254,1781,1782],{"class":256,"line":311},[254,1783,1784],{},"    # 3. Summarize middle messages\n",[254,1786,1787],{"class":256,"line":317},[254,1788,1789],{},"    middle_messages = get_middle_messages(messages)\n",[254,1791,1792],{"class":256,"line":322},[254,1793,1794],{},"    if middle_messages:\n",[254,1796,1797],{"class":256,"line":328},[254,1798,1799],{},"        summary = create_summary(middle_messages)\n",[254,1801,1802],{"class":256,"line":334},[254,1803,1804],{},"        summary_message = {\"role\": \"system\", \"content\": f\"Summary: {summary}\"}\n",[254,1806,1807],{"class":256,"line":340},[254,1808,1809],{},"    else:\n",[254,1811,1812],{"class":256,"line":346},[254,1813,1814],{},"        summary_message = None\n",[254,1816,1817],{"class":256,"line":352},[254,1818,296],{},[254,1820,1821],{"class":256,"line":358},[254,1822,1823],{},"    # 4. Combine everything\n",[254,1825,1826],{"class":256,"line":363},[254,1827,1828],{},"    final_context = system_messages\n",[254,1830,1831],{"class":256,"line":369},[254,1832,1833],{},"    if summary_message:\n",[254,1835,1836],{"class":256,"line":375},[254,1837,1838],{},"        final_context.append(summary_message)\n",[254,1840,1841],{"class":256,"line":381},[254,1842,1843],{},"    final_context.extend(recent_messages)\n",[254,1845,1846],{"class":256,"line":387},[254,1847,296],{},[254,1849,1850],{"class":256,"line":392},[254,1851,1852],{},"    # 5. Trim if still too long\n",[254,1854,1855],{"class":256,"line":398},[254,1856,1857],{},"    return trim_to_token_limit(final_context, max_tokens)\n",[218,1859,1861],{"id":1860},"when-to-use-summarization","When to Use Summarization",[227,1863,1865],{"id":1864},"ideal-scenarios","Ideal Scenarios:",[1253,1867,1868,1874,1880,1886],{},[1256,1869,1870,1873],{},[602,1871,1872],{},"Long-term conversations"," (hours or days)",[1256,1875,1876,1879],{},[602,1877,1878],{},"Complex projects"," with many decisions",[1256,1881,1882,1885],{},[602,1883,1884],{},"Multi-session interactions"," where context needs to persist",[1256,1887,1888,1891],{},[602,1889,1890],{},"Educational contexts"," where learning progress matters",[227,1893,1895],{"id":1894},"less-ideal-scenarios","Less Ideal Scenarios:",[1253,1897,1898,1904,1909,1915],{},[1256,1899,1900,1903],{},[602,1901,1902],{},"Quick Q&A"," sessions",[1256,1905,1906],{},[602,1907,1908],{},"Stateless API calls",[1256,1910,1911,1914],{},[602,1912,1913],{},"Real-time chat"," where latency is critical",[1256,1916,1917,1920],{},[602,1918,1919],{},"Simple transactions"," with minimal context",[218,1922,1924],{"id":1923},"summary","Summary",[223,1926,1927],{},"Summarization is a powerful technique for maintaining context in long conversations, offering:",[1253,1929,1930,1936,1942],{},[1256,1931,1932,1935],{},[602,1933,1934],{},"Better context preservation"," than simple dropping",[1256,1937,1938,1941],{},[602,1939,1940],{},"Token efficiency"," through compression",[1256,1943,1944,1947],{},[602,1945,1946],{},"Conversation continuity"," across sessions",[223,1949,1950],{},"However, it comes with trade-offs:",[1253,1952,1953,1958,1963,1968],{},[1256,1954,1955],{},[602,1956,1957],{},"Additional computational cost",[1256,1959,1960],{},[602,1961,1962],{},"Potential information loss",[1256,1964,1965],{},[602,1966,1967],{},"Increased latency",[1256,1969,1970],{},[602,1971,1972],{},"Quality variability",[223,1974,1975],{},"When implemented carefully with validation and smart triggering, summarization can dramatically improve the user experience in long-running AI interactions.",[1977,1978,1979],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":241,"searchDepth":263,"depth":263,"links":1981},[1982,1987,1997,2005,2013,2023,2031,2035],{"id":220,"depth":263,"text":221,"children":1983},[1984,1985,1986],{"id":229,"depth":269,"text":230},{"id":244,"depth":269,"text":245},{"id":585,"depth":269,"text":586},{"id":595,"depth":263,"text":596,"children":1988},[1989,1991,1993,1995],{"id":599,"depth":269,"text":1990},"1. Incremental Summarization",{"id":675,"depth":269,"text":1992},"2. Topic-based Summarization",{"id":730,"depth":269,"text":1994},"3. Hierarchical Summarization",{"id":807,"depth":269,"text":1996},"4. Selective Summarization",{"id":886,"depth":263,"text":887,"children":1998},[1999,2001,2003],{"id":890,"depth":269,"text":2000},"1. Structured Summaries",{"id":1028,"depth":269,"text":2002},"2. Query-aware Summarization",{"id":1099,"depth":269,"text":2004},"3. Progressive Summarization",{"id":1220,"depth":263,"text":1221,"children":2006},[2007,2009,2011],{"id":1224,"depth":269,"text":2008},"1. Context Preservation",{"id":1236,"depth":269,"text":2010},"2. Token Efficiency",{"id":1248,"depth":269,"text":2012},"3. Conversation Continuity",{"id":1267,"depth":263,"text":1268,"children":2014},[2015,2017,2019,2021],{"id":1271,"depth":269,"text":2016},"1. Information Loss",{"id":1332,"depth":269,"text":2018},"2. Summarization Cost",{"id":1419,"depth":269,"text":2020},"3. Summary Quality Variability",{"id":1488,"depth":269,"text":2022},"4. Latency Impact",{"id":1571,"depth":263,"text":1572,"children":2024},[2025,2027,2029],{"id":1575,"depth":269,"text":2026},"1. Smart Summarization Triggers",{"id":1675,"depth":269,"text":2028},"2. Summary Validation",{"id":1729,"depth":269,"text":2030},"3. Hybrid Approaches",{"id":1860,"depth":263,"text":1861,"children":2032},[2033,2034],{"id":1864,"depth":269,"text":1865},{"id":1894,"depth":269,"text":1895},{"id":1923,"depth":263,"text":1924},"Compressing older messages before dropping them to preserve context.","md",null,{},{"icon":108},{"title":105,"description":2036},"OowwzB8toxDmFVs8-1isyYE8o4g8cV2hTir5vdnA4XI",[2044,2046],{"title":100,"path":101,"stem":102,"description":2045,"icon":103,"children":-1},"Dropping older messages based on max_token limits and their challenges.",{"title":10,"path":111,"stem":112,"description":2047,"icon":11,"children":-1},"Quick reference guide for building AI applications with Vercel's AI SDK 6.",1772944811492]