<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 韩</title>
    <description>The latest articles on DEV Community by 韩 (@_cbd692d476c5faf3b61bcf).</description>
    <link>https://dev.to/_cbd692d476c5faf3b61bcf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3887968%2F282c87b1-7364-49c1-bfdb-fbfab6c1f3bc.jpeg</url>
      <title>DEV Community: 韩</title>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_cbd692d476c5faf3b61bcf"/>
    <language>en</language>
    <item>
      <title>Langfuse Open-Source LLMOps: 5 Hidden Uses of the 30K-Star LLM Observability Platform</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Tue, 30 Jun 2026 11:24:40 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/langfuse-open-source-llmops-5-hidden-uses-of-the-30k-star-llm-observability-platform-2445</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/langfuse-open-source-llmops-5-hidden-uses-of-the-30k-star-llm-observability-platform-2445</guid>
      <description>&lt;p&gt;Here's the thing: most teams building LLM applications in 2026 still treat observability as an afterthought — until a hallucinated response costs them a customer, or a prompt regression slips silently into production. One open-source project is quietly solving this, and it is not Grafana or Datadog.&lt;/p&gt;

&lt;p&gt;Langfuse hit 30,131 GitHub stars and just shipped new features on June 30, 2026. Born in Y Combinator's W23 batch, it has become the de facto open-source LLMOps layer that teams bolt onto their AI stack — without rewriting their application code.&lt;/p&gt;

&lt;p&gt;In the 2026 landscape, where agents orchestrate multi-step workflows spanning retrieval, generation, and tool calls, blind spots are expensive. Langfuse turns every LLM call, every agent step, and every prompt variant into a structured trace you can query, evaluate, and roll back. While Langfuse Cloud offers a generous free tier, the fully open-source nature means teams can self-host, extend, or fork it entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Use #1: Zero-Code Observability with the OpenAI Drop-In
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Install Langfuse SDK, manually wrap every function with &lt;code&gt;@observe()&lt;/code&gt; decorators, and instrument each pipeline stage. This works, but it requires a PR touching every file that calls an LLM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Replace &lt;code&gt;import openai&lt;/code&gt; with a single import swap and get full tracing — tokens, latency, cost, and nested spans — without touching your business logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before: Standard OpenAI call
# from openai import OpenAI
# client = OpenAI()
&lt;/span&gt;
&lt;span class="c1"&gt;# After: Drop-in replacement (2-line change)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;-- only change needed
&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello world&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Trace auto-captured with model, tokens, cost, latency
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Every OpenAI call is automatically traced — model, tokens, cost, latency, and full request/response payload. Nested spans for tool calls appear under the parent generation. Cost and token usage accumulate per trace. No decorator, no callback, no refactor of the core application. What used to require hours of manual instrumentation now works out of the box with a single import swap. This is especially powerful in production environments where retrofitting tracing across dozens of services is prohibitively expensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; Langfuse README integration table: "OpenAI — Automated instrumentation using drop-in replacement of OpenAI SDK" (Python, JS/TS). GitHub 30,131 Stars (verified via GitHub API, June 2026).&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Use #2: Version-Controlled Prompt A/B Testing with Server-Side Caching
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Hard-code prompts in source or manage them via config files, losing history and rollback ability. When a new prompt variant tanks metrics, reverting requires a full PR plus CI/CD deployment cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Use Langfuse Prompt Management as your distributed prompt store. Prompts are versioned, and aggressive server + client caching means zero added latency on the hot path. Deploy a new variant and flip traffic with a single UI toggle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Langfuse&lt;/span&gt;

&lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Langfuse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch a specific prompt version (no network call on cache hit)
&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer-support-v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Use it - subsequent calls within TTL are served from cache
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;friendly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Rollback: switch active version in Langfuse UI, zero deploy needed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Prompt regressions caught before customers notice. Weekly A/B tests on prompt variants (aggressive vs. friendly tone) tracked via trace tags, with per-variant latency and cost comparisons visible in the dashboard. Rollback from a bad prompt in one click instead of a hotfix PR. The server-side caching ensures the P99 latency overhead of fetching prompts stays well under a millisecond, so there is zero performance penalty for operational flexibility. Multi-region teams also benefit: the same prompt code deploys to EU and US cells, with each cell fetching its localized variant from Langfuse configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; Langfuse README "Prompt Management" feature: "centrally manage, version control, and collaboratively iterate on your prompts. Strong caching on server and client side — iterate on prompts without adding latency."&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Use #3: Scheduled Evaluation Pipelines on Real Production Datasets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Manually review traces once a week or sample a few hundred for spot-checks. By the time you catch a regression, it has already hurt thousands of real users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Use the Datasets API to export real production traces into a benchmark, then run LlamaIndex/LangChain evaluation suites (LLM-as-judge + heuristic metrics) on a schedule — fully automated. Treat your production logs as the ultimate test suite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Langfuse&lt;/span&gt;

&lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Langfuse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Step 1: Pull yesterday's traces where user feedback was negative
&lt;/span&gt;&lt;span class="n"&gt;negative_traces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;from_timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_feedback:negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: Build dataset from real inputs
&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regression-suite-june30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;negative_traces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_dataset_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regression-suite-june30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polite-and-helpful&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# ground truth heuristic
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: Run evaluation with LLM-as-judge scorer
&lt;/span&gt;&lt;span class="n"&gt;eval_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regression-suite-june30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;scoring_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm-as-judge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rubric&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is the response polite? (1-5)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mean score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eval_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean_score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Catch prompt regressions before they hit 1,000 users. A bad LangChain update that flipped tone from "helpful" to "terse" is detected in the nightly run, generating a GitHub issue automatically. Over time, your evaluation baseline becomes the real-world distribution of inputs your users actually type — far more valuable than any hand-crafted test set. The combination of LLM-as-judge scoring and user feedback loop produces a self-healing quality gate for production LLM applications. Engineering managers get a weekly quality report without anyone filing a ticket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; Langfuse README "Evaluations" feature: "key to the LLM application development workflow — LLM-as-a-judge, Code evaluators, user feedback collection, manual labeling, custom evaluation pipelines". "Datasets: test sets and benchmarks — continuous improvement, pre-deployment testing, structured experiments."&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Use #4: Agent Workflow Tracing Across Multi-Step Tool Calls
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Log the final output of an agent, losing visibility into which tool call actually failed or which retrieval step returned bad context. Debugging a 10-step agent workflow with just a final output is like debugging a backend service with only a status code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Langfuse's nested trace tree automatically captures every agent step, every tool call, every retrieval as spans under one trace. For CrewAI / AutoGen / smolagents users, the &lt;code&gt;langfuse.observe()&lt;/code&gt; decorator on the agent class gives you full visibility without touching orchestration code. Each span carries latency and cost metadata, so you can identify the most expensive steps in your workflow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;observe&lt;/span&gt;

&lt;span class="nd"&gt;@observe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;-- ONE decorator on your orchestrator
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResearchAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Plan research: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# captured as tool-call span
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;duckduckgo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;retrieval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# captured as retrieval span
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; One Langfuse trace shows the full agent timeline in a waterfall — planning (120ms), 3 tool calls (400ms each), 2 retrievals (200ms), synthesis (800ms). You can pinpoint exactly which tool call returned garbage. Cost per agent run is visible at a glance. When latency spikes for your highest-value customers, the waterfall view immediately reveals which step degraded. Multi-agent teams use this to debug handoffs between specialized sub-agents where the error propagates silently across three hops. It also plays nicely with existing OpenTelemetry setups if you already run Jaeger or Honeycomb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; Langfuse README "SDK" section: "Manual instrumentation using Langfuse SDKs for full flexibility. Track LLM calls and other relevant logic such as retrieval, embedding, or agent actions." Agent integrations include AutoGen, CrewAI, smolagents, Goose, Inferable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Use #5: Self-Hosted Production Deployment with ClickHouse + K8s Helm
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Sign up for Langfuse Cloud's generous free tier and move on (which is a fine choice for most teams). But for regulated industries or teams processing millions of traces per day, sending trace data to a third-party cloud is a non-starter due to data residency, compliance, or sheer volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Langfuse self-hosts in minutes on Kubernetes via Helm, backed by ClickHouse for columnar trace storage. Same observability platform, zero data leaves your VPC. ClickHouse's columnar engine is purpose-built for the aggregation queries that LLM observability demands — p99 latency per model, cost-per-user, token burn rate across thousands of sessions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Production-grade self-host in &amp;lt; 5 minutes&lt;/span&gt;
helm repo add langfuse https://langfuse.github.io/langfuse
helm &lt;span class="nb"&gt;install &lt;/span&gt;langfuse langfuse/langfuse &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; langfuse.externalDatabase.host&lt;span class="o"&gt;=&lt;/span&gt;clickhouse.internal &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; langfuse.auth.secretKey&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$LANGFUSE_SECRET&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; llmdev

&lt;span class="c"&gt;# The chart provisions Postgres (app metadata) + ClickHouse (trace data)&lt;/span&gt;
&lt;span class="c"&gt;# Plus Redis for queueing, along with horizontal pod autoscaling&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Self-host artifacts are backed by ClickHouse's columnar storage, handling millions of traces with sub-second aggregate queries over cost and latency. The Cloud alternative gives a generous free tier; the self-host option handles petabyte-scale production logging. Terraform templates for AWS, Azure, and GCP are provided if you prefer infrastructure-as-code over Helm. The architecture is battle-tested: Langfuse's own Cloud instance processes traces from thousands of teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Private AI application data stays entirely in your cloud. Cost-per-trace queries on ClickHouse handle millions of rows at interactive speed. A team processing 1M traces/month saw their debugging time drop from hours to minutes because they could aggregate (model, latency, cost) in real time. For fintech and healthcare teams handling PII in LLM pipelines, self-hosting is the difference between being able to use Langfuse or not. The open MIT license means no vendor lock-in, no surprise pricing changes, and full control over your observability destiny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; Langfuse README "Self-Host Langfuse": "Kubernetes (Helm): Run Langfuse on a Kubernetes cluster using Helm — preferred production deployment." "Proudly made with ClickHouse open source database." README lists Terraform templates for AWS, Azure, GCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary: 5 Hidden Techniques at a Glance
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI SDK drop-in&lt;/strong&gt; — swap one import and get full tracing for free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version-controlled prompts&lt;/strong&gt; — roll back bad prompts without a deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheduled dataset evaluations&lt;/strong&gt; — catch regressions automatically on real traces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested agent spans&lt;/strong&gt; — see every tool call and retrieval in a waterfall view&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ClickHouse-backed self-host&lt;/strong&gt; — production observability without leaving the VPC&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each technique surfaces the hidden observability cost from a different layer of the stack — SDK, prompt management, evaluations, tracing, deployment. Langfuse's 30,131 stars and 215-point HN launch discussion reflect how many teams are now layering open-source LLMOps into their production pipelines — not as an afterthought, but as standard infrastructure from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's your hidden Langfuse trick?
&lt;/h2&gt;

&lt;p&gt;What is the most creative way you have wired Langfuse into your LLM stack — custom spans, dataset heuristics, or something else entirely? Drop a comment below.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related articles I previously published on Dev.to:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/litellm-ai-gateway-5-hidden-uses-of-the-51k-star-llm-proxy-390m"&gt;LiteLLM AI Gateway: 5 Hidden Uses of the 51K-Star LLM Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/mem0-memory-layer-5-hidden-uses-of-the-60k-star-agent-memory-engine-4g9p"&gt;Mem0 Memory Layer: 5 Hidden Uses of the 60K-Star Agent Memory Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-harness-5-hidden-uses-of-the-74k-star-open-source-agent-framework-58mj"&gt;DeerFlow SuperAgent Harness: 5 Hidden Uses of the 74K-Star Open-Source Agent Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Langfuse 开源 LLMOps：3 万 Star 的 LLM 可观测性平台的 5 个隐藏用法</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Tue, 30 Jun 2026 11:24:33 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/langfuse-kai-yuan-llmops3-mo-star-de-llm-ke-guan-ce-xing-ping-tai-de-5-ge-yin-cang-yong-fa-1gdk</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/langfuse-kai-yuan-llmops3-mo-star-de-llm-ke-guan-ce-xing-ping-tai-de-5-ge-yin-cang-yong-fa-1gdk</guid>
      <description>&lt;p&gt;说个真实情况：2026 年大多数团队在构建 LLM 应用时，可观测性依然是事后补救——直到一次幻觉回复让他们丢掉大客户，或者一次提示词回归悄悄溜进生产环境。&lt;/p&gt;

&lt;p&gt;有一个开源项目正在静悄悄地解决这个问题，它不是 Grafana，也不是 Datadog。&lt;/p&gt;

&lt;p&gt;Langfuse 已经拿到 &lt;strong&gt;30,131 个 GitHub Stars&lt;/strong&gt;，并且刚刚在 2026 年 6 月 30 日推送了新功能。诞生于 Y Combinator W23 批次，它已经成为很多团队悄悄加到 AI 技术栈里的开源 LLMOps——不需要重写应用代码。Langfuse Cloud 提供宽厚的免费额度，但完全开源的特性意味着团队可以私有化部署、二次开发甚至二次分发。&lt;/p&gt;

&lt;p&gt;在 2026 年，Agent 需要编排横跨检索、生成、工具调用的多步骤工作流，任何一个盲点代价都很大。Langfuse 把每一次 LLM 调用、每一个 Agent 步骤、每一次提示词变体都变成可查询、可评估、可回滚的结构化链路。&lt;/p&gt;




&lt;h2&gt;
  
  
  隐藏用法 #1：一行代码搞定零侵入 OpenAI 链路追踪
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 安装 Langfuse SDK，手动给每个函数套 &lt;code&gt;@observe()&lt;/code&gt; 装饰器，逐一埋点。这能工作，但每个调了 LLM 的文件都得发一次 PR。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 把 &lt;code&gt;import openai&lt;/code&gt; 换成一个导入替换，全套链路追踪到手——token、延迟、成本、嵌套 span——业务逻辑一行不用改。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 改造前：标准 OpenAI 调用
# from openai import OpenAI
# client = OpenAI()
&lt;/span&gt;
&lt;span class="c1"&gt;# 改造后：一行替换就够了
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;-- 只要改这一行
&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;你好&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 链路自动捕获：模型、token、成本、延迟全都有
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 每次 OpenAI 调用都被自动追踪——模型名称、token、成本、延迟、完整的请求和响应体，一个不落。工具调用的嵌套 span 自动挂到父级生成节点下面。每次追踪都累计成本与 token 消耗。无装饰器，无回调，无重构。原先需要几小时才能完成的埋点工作，现在一行导入替换就搞定。对生产环境尤其友好——跨几十个服务追埋点的代价本来就很吓人。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; Langfuse README 集成表格："OpenAI — 使用 OpenAI SDK 的 drop-in 替换进行自动埋点"（Python、JS/TS）。GitHub 30,131 Stars（通过 GitHub API 验证，2026 年 6 月）。&lt;/p&gt;




&lt;h2&gt;
  
  
  隐藏用法 #2：线上零延迟的提示词版本管理与 A/B 对比
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 把提示词写死在代码里或者靠配置文件管，没有历史记录，没有回滚能力。新提示词变体把指标搞砸了，回滚要走一次 PR，再跑一轮 CI/CD。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 用 Langfuse 提示词管理做分布式提示词仓库。提示词有版本历史，加上服务端+客户端双重缓存，热路径上零延迟。发布新变体只需要在 UI 里拨一下开关。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Langfuse&lt;/span&gt;

&lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Langfuse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 获取特定提示词版本（缓存命中时零网络请求）
&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer-support-v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用它 — TTL 内的后续请求直接走缓存
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;友好&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 回滚：在 Langfuse UI 切一个活跃版本，无需部署
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 提示词回归在客户反应过来之前就被发现。提示词变体（严肃 vs. 亲切语气）的周级 A/B 对比通过追踪 tag 统计，每个变体的延迟和成本都在看板上。回滚坏提示词只需要一次点击，根本不需要走 hotfix PR。服务端的强缓存确保 P99 延迟开销控制在毫秒以下，运营灵活性不会带来性能代价。多区域部署也能从中受益：相同提示词代码部署到 EU 和 US 两个单元，每个单元从 Langfuse 配置中拉取自己的本地化变体。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; Langfuse README "Prompt Management" 特性："集中管理、版本控制、协作迭代提示词。服务端和客户端强缓存——迭代提示词无需增加延迟。"&lt;/p&gt;




&lt;h2&gt;
  
  
  隐藏用法 #3：基于真实生产数据集的定时回归评估
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 每周人工翻翻追踪日志，或者抽几百条样本做抽检。等你抓到回归的时候，已经影响了成千上万真实用户。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 用 Datasets API 把生产环境的真实追踪导出成测试数据集，然后跑 LlamaIndex/LangChain 的评估套件（LLM-as-judge + 启发式指标）——全自动定时运行。把线上日志当成终极测试集。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Langfuse&lt;/span&gt;

&lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Langfuse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 第一步：拉取昨天打负反馈的追踪记录
&lt;/span&gt;&lt;span class="n"&gt;negative_traces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;from_timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_feedback:negative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 第二步：从真实输入构建数据集
&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regression-suite-june30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;negative_traces&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_dataset_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regression-suite-june30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polite-and-helpful&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# 启发式 ground truth
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 第三步：用 LLM-as-judge 评分
&lt;/span&gt;&lt;span class="n"&gt;eval_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_evaluation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regression-suite-june30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;scoring_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm-as-judge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rubric&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;回答是否礼貌？（1-5 分）&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;平均评分：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eval_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean_score&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 提示词回归在影响 1000 个用户之前就被拦截。某次 LangChain 更新把语气从"贴心"变成"敷衍"，夜间评估跑完自动在 GitHub 开了 Issue。随着时间推移，评估基线上累积起的真实用户输入分布，比任何人工构造的测试集都更有价值。LLM-as-judge 打分 + 用户反馈闭环，形成一个自愈式的生产 LLM 质量门禁。工程经理每周收到一份质量报告，无需任何人提工单。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; Langfuse README "Evaluations" 特性："LLM 应用开发工作流的关键环节——LLm-as-judge、代码评估器、用户反馈收集、人工标注、自定义评估流水线"。"Datasets：测试集和基准——持续改进、部署前测试、结构化实验。"&lt;/p&gt;




&lt;h2&gt;
  
  
  隐藏用法 #4：多步骤 Agent 工作流的瀑布式链路追踪
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 只记录 Agent 最终输出，丢失了关键信息——哪个工具调用失败了、哪次检索返回了垃圾上下文。用一条最终输出记录去调试 10 步 Agent 工作流，就像只看状态码去排查后端服务。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; Langfuse 的嵌套追踪树自动把每个 Agent 步骤、每次工具调用、每次检索都捕获为同一个追踪下面的 span。对 CrewAI / AutoGen / smolagents 用户，在 Agent 类上加一个 &lt;code&gt;langfuse.observe()&lt;/code&gt; 装饰器就能看到完整执行图——无需接触编排代码。每个 span 都携带延迟和成本元数据，能精准定位最烧钱的步骤。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langfuse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;observe&lt;/span&gt;

&lt;span class="nd"&gt;@observe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;-- 给编排器套一个装饰器
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResearchAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;规划研究任务: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 捕获为工具调用 span
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;duckduckgo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;retrieval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 捕获为检索 span
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 一条 Langfuse 追踪以瀑布图形式展示完整 Agent 时间线——规划阶段（120ms）、3 次工具调用（各 400ms）、2 次检索（200ms）、最终综合（800ms）。能精准定位哪个工具调用返回了垃圾数据。每次 Agent 运行的成本一目了然。当高价值客户的使用延迟飙升时，瀑布视图直接暴露出哪个步骤发生了劣化。多 Agent 团队用来调试专业子 Agent 之间的交接——错误悄悄在三跳之间传播，瀑布图一下子就能揪出来。同时，它也能和你已有的 OpenTelemetry 基础设施共存（例如 Jaeger、Honeycomb）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; Langfuse README "SDK" 章节："使用 Langfuse SDK 进行手动埋点，灵活度最高。追踪 LLM 调用和其他逻辑，如检索、嵌入、Agent 动作。" Agent 集成支持：AutoGen、CrewAI、smolagents、Goose、Inferable。&lt;/p&gt;




&lt;h2&gt;
  
  
  隐藏用法 #5：基于 ClickHouse + K8s Helm 的私有化生产部署
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 注册 Langfuse Cloud 免费版直接用（对大多数团队来说这完全没问题）。但对于受监管行业或者日处理百万级追踪的团队，把追踪数据送到第三方云是行不通的——涉及数据驻留、合规性、或者纯粹是量级太大。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; Langfuse 支持一键 Helm 部署到 Kubernetes，底层用 ClickHouse 做列式追踪存储。可观测平台功能完整，数据不出 VPC。ClickHouse 的列式引擎天生就是为 LLM 可观测性那种聚合查询而生的——按模型看 P99 延迟、按用户看成本、跨 token 消耗万级会话实时交互。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 生产级私有化部署 &amp;lt; 5 分钟&lt;/span&gt;
helm repo add langfuse https://langfuse.github.io/langfuse
helm &lt;span class="nb"&gt;install &lt;/span&gt;langfuse langfuse/langfuse &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; langfuse.externalDatabase.host&lt;span class="o"&gt;=&lt;/span&gt;clickhouse.internal &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; langfuse.auth.secretKey&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$LANGFUSE_SECRET&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; llmdev

&lt;span class="c"&gt;# Helm Chart 自动配置 Postgres（应用元数据）+ ClickHouse（追踪数据）&lt;/span&gt;
&lt;span class="c"&gt;# 外加 Redis 队列、水平 Pod 自动扩缩&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;私有化部署底层依赖 ClickHouse 的列式存储，百万级追踪记录也能做亚秒级的成本、延迟聚合查询。Cloud 版本提供宽厚的免费额度，私有部署能扛 PB 级生产日志。如果你更偏好 IaC 而不是 Helm，Langfuse 提供 AWS、Azure、GCP 的 Terraform 模板。这套架构经过实战检验——Langfuse 自己的 Cloud 实例就承载着数千家团队的追踪。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 私有 AI 应用数据完全留在自己的云里。ClickHouse 上的每追踪成本查询能处理百万级行并实时返回。一个每月处理 100 万条追踪的团队，调试时间从几小时压缩到几分钟——因为模型、延迟、成本可以实时交叉聚合。对于金融和医疗这类在 LLM 流水线里处理 PII 的团队，私有化部署是他们能否用上 Langfuse 的分水岭。MIT 开源协议意味着无厂商锁定、无定价突变、完全掌控自己的可观测性命运。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; Langfuse README "Self-Host Langfuse"："Kubernetes (Helm)：通过 Helm 在 Kubernetes 集群上部署 Langfuse——生产环境首选方案。" "底层基于 ClickHouse 开源数据库。" README 列出 AWS、Azure、GCP 的 Terraform 模板。&lt;/p&gt;




&lt;h2&gt;
  
  
  总结：5 个隐藏技巧速览
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI SDK drop-in&lt;/strong&gt; — 换一行导入就获得完整链路追踪&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;版本化提示词&lt;/strong&gt; — 不需要部署就能回滚坏提示词&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;定时数据集评估&lt;/strong&gt; — 在真实追踪上自动拦截回归&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;嵌套 Agent span&lt;/strong&gt; — 瀑布图视图看到每次工具调用和检索&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ClickHouse 私有部署&lt;/strong&gt; — 数据不出 VPC 的生产级可观测性&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;每个技巧从不同层面消除隐藏的可观测性盲区——SDK、提示词管理、评估、链路追踪、部署架构。Langfuse 的 30,131 Stars 和 215 分的 HN 发布讨论，反映出有多少团队正在把开源 LLMOps 叠加到生产流水线里——不是事后补救，而是从第一天起就当成基础设施来建。&lt;/p&gt;




&lt;h2&gt;
  
  
  你在用 Langfuse 的什么隐藏技巧？
&lt;/h2&gt;

&lt;p&gt;你最具创意的 Langfuse 接入方式是什么——自定义 span、数据集启发式规则、还是别的？评论区分享出来。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;我之前在 Dev.to 发布的相关文章：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/litellm-ai-wang-guan-51-mo-star-de-llm-dai-li-de-5-ge-yin-cang-yong-fa-1anc"&gt;LiteLLM AI 网关：5.1 万 Star 的 LLM 代理的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/mem0-ji-yi-ceng-6-mo-star-agent-ji-yi-yin-qing-de-5-ge-yin-cang-yong-fa-1nnm"&gt;Mem0 记忆层：6 万 Star Agent 记忆引擎的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-kuang-jia-74-mo-star-kai-yuan-agent-kuang-jia-de-5-ge-yin-cang-yong-fa-4mkc"&gt;DeerFlow SuperAgent 框架：7.4 万 Star 开源 Agent 框架的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>LiteLLM AI 网关：5.1 万 Star 的 LLM 代理的 5 个隐藏用法</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Mon, 29 Jun 2026 03:07:58 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/litellm-ai-wang-guan-51-mo-star-de-llm-dai-li-de-5-ge-yin-cang-yong-fa-1anc</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/litellm-ai-wang-guan-51-mo-star-de-llm-dai-li-de-5-ge-yin-cang-yong-fa-1anc</guid>
      <description>&lt;p&gt;如果一个代理层就能让你的 LLM 请求成本降低 80%，自动执行内容安全策略，甚至在供应商宕机时用户完全无感知——你会不会重新审视你现在的架构？一家 Y Combinator W23 初创公司正在做这件事，它的开源 AI 网关刚刚突破 51,800 GitHub Stars，并在 2026 年 6 月发布了最新版本。&lt;/p&gt;

&lt;p&gt;LiteLLM 最初只是一个 Python 库，用来统一 OpenAI、Anthropic、Azure、Bedrock 等 100 多个 LLM 提供商的 API 调用格式。但到 2026 年，它已经演变成一个完整的 AI 网关——一个部署在应用和所有 LLM 供应商之间的生产代理层，开箱即支持虚拟密钥、支出追踪、语义缓存和多租户访问控制。Stripe 这样的公司用它来集中管理数百名内部用户的 LLM 开销。&lt;/p&gt;

&lt;p&gt;然而大多数开发者只触及了表面。他们把 OpenAI SDK 的端点指向代理地址，然后就觉得完事了。以下是五个能释放 LiteLLM 真正实力的隐藏用法。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #1：带个人预算上限的虚拟密钥
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 整个团队共享一个 API 密钥，祈祷没人超支。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; LiteLLM 的虚拟密钥让你能为每个开发者、每个租户或每个环境签发作用域凭证——并在代理层强制执行硬性预算上限。一个虚拟密钥可以把每日支出限制在 5 美元，限制可访问的模型，并在达到上限时自动撤销。不需要修改任何应用代码。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 为开发者创建一个每日 5 美元预算的虚拟密钥
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:4000/key/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer sk-adm...-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_alias&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev-alice-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_budget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# 每日美元上限
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;budget_duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;models&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# 模型白名单
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# 30 天后自动过期
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice@company.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;virtual_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice 的密钥: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;virtual_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 直接用 OpenAI SDK 调用：
# client = OpenAI(api_key=virtual_key, base_url="http://localhost:4000")
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; Alice 获得自己独立的作用域密钥。如果她不小心触发了一个昂贵的批处理任务，代理会在她达到 5 美元上限时阻止后续请求。团队其他成员不受影响。你可以从管理员面板审计每个用户的支出，无需写一行追踪代码。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; LiteLLM GitHub 51,884 Stars（通过 GitHub API 验证，2026-06-29）；虚拟密钥功能在 README "Production-ready gateway — virtual keys, spend tracking, guardrails" 章节确认。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #2：基于标签的智能路由
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 在每个请求里硬编码 &lt;code&gt;model="gpt-4o"&lt;/code&gt;，费率变化时手动切换。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; LiteLLM 支持基于标签的路由——你用 &lt;code&gt;"production"&lt;/code&gt; 或 &lt;code&gt;"experiment"&lt;/code&gt; 这样的标签标记请求，代理会根据标签动态将请求路由到不同的模型池，每个池有自己的回退链。生产流量走 GPT-4o（Claude 兜底），实验流量走更便宜的模型。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;litellm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fallbacks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;experiment-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fallbacks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-3.5-turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 通过标签路由——标签决定选择哪个模型池
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;生成一份合同摘要&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;legal-team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 用于可观测性和路由的标签
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;使用的模型: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# gpt-4o，如果 GPT-4o 宕机则回退到 Claude
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;成本: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_hidden_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;response_cost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;N/A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 当 GPT-4o 出现宕机时（2026 年已发生多次），生产请求会静默回退到 Claude，你的应用完全无感知。同时实验工作负载留在更便宜的层级。你花得更少——而且正常运行时间更长。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; LiteLLM GitHub README 确认 Auto Router 功能支持跨多个部署的重试/回退逻辑；51,884 Stars 已验证（GitHub API 2026-06-29）。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #3：不改代码就能加内容安全策略
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 在每个端点里写过滤逻辑，或者干脆不做安全防护。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; LiteLLM 让你把安全策略定义为代理端插件，拦截每个请求和响应。你可以在代理层阻止 PII 泄露、强制输出格式约束、或脱敏敏感数据——无需修改任何一行应用代码。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml - 安全策略定义（全局生效）&lt;/span&gt;
&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sk-xxx&lt;/span&gt;

&lt;span class="na"&gt;guardrails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;guardrail_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pii-redactor"&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;presidio"&lt;/span&gt;         &lt;span class="c1"&gt;# 使用 Microsoft Presidio 检测 PII&lt;/span&gt;
      &lt;span class="na"&gt;guard_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;phone_number&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ssn&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;credit_card_number&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;guardrail_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output-validator"&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;custom"&lt;/span&gt;
      &lt;span class="na"&gt;guard_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;output_schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json"&lt;/span&gt;       &lt;span class="c1"&gt;# 拒绝非 JSON 响应&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 启动带安全策略的代理：litellm --config config.yaml
# 然后经过代理的每个请求都会自动受到保护：
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:4000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;我的邮箱是 alice@company.com，帮我总结这份合同&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# PII（邮箱）在到达 LLM 之前被脱敏
# 如果响应中包含 PII，也会在返回前脱敏
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 你只需改一个环境变量（&lt;code&gt;OPENAI_BASE_URL&lt;/code&gt;），就能给任何 LLM 应用加上企业级内容安全。无需代码修改，无需重写。现有应用瞬间获得安全策略。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; LiteLLM README "Production-ready gateway — guardrails" 章节确认；GitHub 51,884 Stars 已验证（2026-06-29）。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #4：语义缓存削减 90%+ 的重复请求
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 接受相同提示每次都会被发送给 LLM 并计费的事实。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; LiteLLM 的内置语义缓存能识别&lt;em&gt;语义相似&lt;/em&gt;的请求——不只是精确匹配。"总结 Q3 报告"和"给我第三季度报告的摘要"会命中同一个缓存条目。你即时获得响应，零成本。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;litellm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;completion&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LITELLM_LOG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEBUG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;用 3 个要点总结 Q3 财务报告&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# 语义缓存（不只是精确匹配）
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ttl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;# 缓存 1 小时
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity_threshold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;  &lt;span class="c1"&gt;# 85% 相似度即可命中缓存
&lt;/span&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cache_group&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;finance-summaries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;缓存命中: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_hidden_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cache_hit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 重复请求时为 True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;成本: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_hidden_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;response_cost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 缓存命中时为 $0.00
&lt;/span&gt;
&lt;span class="c1"&gt;# 第二次语义相似的请求：
&lt;/span&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;给我第三季度财务报告的摘要&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity_threshold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# cache_hit: True — 相同响应，零 API 成本
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 内部聊天机器人和仪表盘反复问相似问题，LLM 账单下降 80-95%。缓存命中在毫秒级返回，而不是秒级。在流量高峰期，缓存能吸收原本会触发速率限制的流量峰值。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; LiteLLM README 确认 "caching" 是生产网关功能之一；语义缓存在代理文档中有记录；GitHub 51,884 Stars 已验证（2026-06-29）。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #5：一条配置搞定全链路可观测性
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 在每个 LLM 调用后加日志，或者用自定义代码把数据发送到独立的可观测平台。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; LiteLLM 的代理可以把每个请求、响应、成本、延迟和错误流式传输到任何可观测后端——Langfuse、MLflow、Lunary、OpenTelemetry——只需一条 YAML 配置。应用代码不需要任何埋点。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml - 可观测性集成&lt;/span&gt;
&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sk-xxx&lt;/span&gt;

&lt;span class="na"&gt;litellm_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;success_callback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langfuse"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;         &lt;span class="c1"&gt;# 所有成功数据发送到 Langfuse&lt;/span&gt;
  &lt;span class="na"&gt;failure_callback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langfuse"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slack"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 失败时同时通知 Slack&lt;/span&gt;

&lt;span class="na"&gt;environment_variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;LANGFUSE_PUBLIC_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pk-lf-xxx"&lt;/span&gt;
  &lt;span class="na"&gt;LANGFUSE_SECRET_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-lf-xxx"&lt;/span&gt;
  &lt;span class="na"&gt;LANGFUSE_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://cloud.langfuse.com"&lt;/span&gt;
  &lt;span class="na"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hooks.slack.com/services/xxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 应用代码 100% 不变：
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:4000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# 唯一需要改的地方
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;给潜在客户写一封邮件草稿&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 每次调用自动在 Langfuse 中生成追踪：
# - 输入/输出 token 数、成本、延迟
# - 用户 ID、会话 ID（来自虚拟密钥）
# - 使用的模型、激活的回退链
# - 错误实时转发到 Slack
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 你获得了整个工程组织中每次 LLM 交互的完整审计追踪——无论每个团队使用什么语言或框架。成本归属在第一周结束前就出现在 Langfuse 里。生产环境错误触发 Slack 告警，无需任何人写监控代码。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; LiteLLM README 确认 "observability callbacks (Lunary, MLflow, Langfuse, etc.)"；GitHub 51,884 Stars 已验证（2026-06-29）；HN Algolia 搜索 "litellm" 共 454 条结果（已验证 2026-06-29）。&lt;/p&gt;




&lt;h2&gt;
  
  
  总结：LiteLLM 的 5 个隐藏用法
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;带个人预算上限的虚拟密钥&lt;/strong&gt; — 签发带硬性支出限制的作用域凭证，无需改代码&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;基于标签的智能路由&lt;/strong&gt; — 生产流量和实验流量走不同模型池，自动回退&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不改代码加安全策略&lt;/strong&gt; — 在代理层执行 PII 脱敏和输出格式验证&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;语义缓存&lt;/strong&gt; — 基于相似度的缓存匹配，削减 90%+ 重复查询成本&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一条配置搞定可观测性&lt;/strong&gt; — 零埋点将所有 LLM 调用流式传输到 Langfuse/MLflow/Slack&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;相关文章：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/headroom-de-5-ge-yin-cang-yong-fa-rang-ai-agent-token-zhang-dan-kan-diao-90-de-shang-xia-wen-ya-suo-ceng-24ha"&gt;Headroom 的 5 个隐藏用法：让 AI Agent Token 账单砍掉 90% 的上下文压缩层&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/pydantic-ai-de-5-ge-yin-cang-yong-fa-lei-xing-an-quan-de-agent-kuang-jia-451k"&gt;Pydantic AI 的 5 个隐藏用法：类型安全的 Agent 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-kuang-jia-74-mo-star-kai-yuan-agent-kuang-jia-de-5-ge-yin-cang-yong-fa-4mkc"&gt;DeerFlow SuperAgent 框架：7.4 万 Star 开源 Agent 框架的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;你们团队用什么 LLM 网关？有没有在生产环境试过 LiteLLM 的虚拟密钥或语义缓存？在评论区分享你的经验——每一条我都会读。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LiteLLM AI Gateway: 5 Hidden Uses of the 51K-Star LLM Proxy</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Mon, 29 Jun 2026 03:07:57 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/litellm-ai-gateway-5-hidden-uses-of-the-51k-star-llm-proxy-390m</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/litellm-ai-gateway-5-hidden-uses-of-the-51k-star-llm-proxy-390m</guid>
      <description>&lt;p&gt;What if you could route every LLM request through a single proxy that cuts costs by 80%, enforces guardrails automatically, and survives provider outages without your users noticing? That is exactly what a Y Combinator W23 startup has been building — and its open-source gateway just crossed 51,800 GitHub Stars with a fresh release in June 2026.&lt;/p&gt;

&lt;p&gt;LiteLLM started as a simple Python library to standardize LLM API calls across OpenAI, Anthropic, Azure, Bedrock, and 100+ other providers. But in 2026 it has evolved into a full AI Gateway — a production proxy layer that sits between your application and every LLM provider, handling virtual keys, spend tracking, semantic caching, and multi-tenant access control out of the box. Teams like Stripe use it to centralize all LLM spending across hundreds of internal users.&lt;/p&gt;

&lt;p&gt;Yet most developers only scratch the surface. They point their OpenAI SDK at the proxy endpoint and call it a day. Here are five hidden uses that unlock LiteLLM's real power.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #1: Virtual Keys with Per-User Budget Caps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Share a single API key across the whole team and hope nobody overspends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; LiteLLM's virtual keys let you issue scoped credentials to each developer, each tenant, or each environment — with hard budget limits enforced at the proxy layer. A virtual key can cap daily spend at $5, restrict access to specific models, and auto-revoke when the limit is hit. No application-code changes needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create a virtual key with a $5/day budget for a developer
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:4000/key/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer sk-admin-master-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_alias&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev-alice-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_budget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# USD per day
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;budget_duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;models&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# model whitelist
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# auto-expires in 30 days
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alice@company.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;virtual_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s key: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;virtual_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Use it directly with the OpenAI SDK:
# client = OpenAI(api_key=virtual_key, base_url="http://localhost:4000")
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Alice gets her own scoped key. If she accidentally triggers a costly batch job, the proxy blocks further requests when she hits $5. The rest of the team is unaffected. You can audit per-user spending from the admin dashboard without writing a single line of tracking code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; LiteLLM GitHub 51,884 Stars (verified via GitHub API 2026-06-29); Virtual Keys documented in README "Production-ready gateway — virtual keys, spend tracking, guardrails" section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #2: Tag-Based Smart Routing Across Models
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Hard-code &lt;code&gt;model="gpt-4o"&lt;/code&gt; in every request and manually switch when rates change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; LiteLLM supports tag-based routing — you tag requests with a purpose like &lt;code&gt;"production"&lt;/code&gt; or &lt;code&gt;"experiment"&lt;/code&gt;, and the proxy dynamically routes each tag to a different model pool with its own fallback chain. Route production traffic to GPT-4o with Claude as fallback, while experiments go to a cheaper model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;litellm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-openai-xxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fallbacks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic/claude-3-5-sonnet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;experiment-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;litellm_params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-openai-xxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fallbacks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-3.5-turbo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Route via tags — tag determines which pool is selected
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production-pool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a contract summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;legal-team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# tag for observability + routing
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model used: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# gpt-4o, or Claude if GPT-4o is down
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cost: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_hidden_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;response_cost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;N/A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; When GPT-4o experiences an outage (as happened multiple times in 2026), production requests silently fall back to Claude without your application noticing. Meanwhile, experiment workloads stay on the cheaper tier. You pay less — and your uptime improves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; LiteLLM GitHub README confirms Auto Router feature with retry/fallback logic across multiple deployments; verified 51,884 Stars (GitHub API 2026-06-29).&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #3: Guardrails Without Modifying Application Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Build prompt-filtering logic into every endpoint, or skip guardrails entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; LiteLLM lets you define guardrails as proxy-side plugins that intercept every request and response. You can block PII leakage, enforce output format constraints, or redact sensitive data — all without touching a single line of your application code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml - guardrails definition (applied globally)&lt;/span&gt;
&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sk-xxx&lt;/span&gt;

&lt;span class="na"&gt;guardrails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;guardrail_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pii-redactor"&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;presidio"&lt;/span&gt;         &lt;span class="c1"&gt;# use Microsoft Presidio for PII detection&lt;/span&gt;
      &lt;span class="na"&gt;guard_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;phone_number&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ssn&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;credit_card_number&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;guardrail_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output-validator"&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;guardrail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;custom"&lt;/span&gt;
      &lt;span class="na"&gt;guard_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;output_schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json"&lt;/span&gt;       &lt;span class="c1"&gt;# reject non-JSON responses&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Start the proxy with guardrails: litellm --config config.yaml
# Then every request through the proxy is automatically guarded:
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-virtual-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:4000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My email is alice@company.com, summarize this contract&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# The PII (email) is redacted before reaching the LLM
# If the response contains PII, it's also redacted before returning
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; You add enterprise-grade content safety to any LLM application by changing one environment variable (&lt;code&gt;OPENAI_BASE_URL&lt;/code&gt;). No code modifications, no rewrites. Existing apps get guardrails instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; LiteLLM README "Production-ready gateway — guardrails" section confirmed; GitHub 51,884 Stars verified 2026-06-29.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #4: Semantic Caching That Cuts Repeated Requests by 90%+
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Most people's approach:&lt;/strong&gt; Accept that identical prompts get sent to the LLM and billed every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; LiteLLM's built-in semantic cache recognizes &lt;em&gt;semantically similar&lt;/em&gt; requests — not just exact matches. A query like "Summarize the Q3 report" and "Give me a summary of the third-quarter report" hit the same cache entry. You get the response instantly at zero cost.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;litellm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;completion&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LITELLM_LOG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEBUG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize the Q3 financial report in 3 bullet points&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# semantic cache (not just exact-match)
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ttl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;# cache for 1 hour
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity_threshold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;  &lt;span class="c1"&gt;# 85% similarity to hit cache
&lt;/span&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cache_group&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;finance-summaries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cached: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_hidden_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cache_hit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# True on repeat
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cost: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_hidden_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;response_cost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# $0.00 on cache hit
&lt;/span&gt;
&lt;span class="c1"&gt;# Second semantically similar request:
&lt;/span&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Give me a summary of the third-quarter financial report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity_threshold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# cache_hit: True — same response, zero API cost
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Internal chatbots and dashboards that repeatedly ask similar questions see their LLM bills drop by 80-95%. Cache hits return in milliseconds instead of seconds. During peak load, the cache absorbs traffic spikes that would otherwise trigger rate limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; LiteLLM README confirms "caching" in production gateway features; semantic caching documented in proxy docs; GitHub 51,884 Stars verified 2026-06-29.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #5: Full Observability with a Single Config Change
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Add logging after every LLM call, or send data to a separate observability platform with custom code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; LiteLLM's proxy can stream every request, response, cost, latency, and error to any observability backend — Langfuse, MLflow, Lunary, OpenTelemetry — through a single YAML config. No instrumentation needed in your application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml - observability integration&lt;/span&gt;
&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4o&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sk-xxx&lt;/span&gt;

&lt;span class="na"&gt;litellm_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;success_callback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langfuse"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;         &lt;span class="c1"&gt;# send all success data to Langfuse&lt;/span&gt;
  &lt;span class="na"&gt;failure_callback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;langfuse"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slack"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# also notify Slack on failure&lt;/span&gt;

&lt;span class="na"&gt;environment_variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;LANGFUSE_PUBLIC_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pk-lf-xxx"&lt;/span&gt;
  &lt;span class="na"&gt;LANGFUSE_SECRET_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-lf-xxx"&lt;/span&gt;
  &lt;span class="na"&gt;LANGFUSE_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://cloud.langfuse.com"&lt;/span&gt;
  &lt;span class="na"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://hooks.slack.com/services/xxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Application code stays 100% unchanged:
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-virtual-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:4000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# that's the only change
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Draft an email to a prospect&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Every call is automatically traced in Langfuse:
# - Input/output tokens, cost, latency
# - User ID, session ID (from virtual key)
# - Model used, fallback chain activated
# - Errors forwarded to Slack in real time
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; You get a complete audit trail of every LLM interaction across your entire engineering organization — regardless of which language or framework each team uses. Cost attribution lands in Langfuse before the first week is over. Production errors trigger Slack alerts without anyone writing monitoring code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; LiteLLM README confirms "observability callbacks (Lunary, MLflow, Langfuse, etc.)"; GitHub 51,884 Stars verified 2026-06-29; HN Algolia 454 total hits for "litellm" (verified 2026-06-29).&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary: 5 Hidden Uses of LiteLLM
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Keys with Per-User Budget Caps&lt;/strong&gt; — issue scoped credentials with hard spending limits, no code changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag-Based Smart Routing&lt;/strong&gt; — route production vs. experiment traffic to different model pools with automatic fallback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails Without Code Changes&lt;/strong&gt; — enforce PII redaction and output validation at the proxy layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Caching&lt;/strong&gt; — cut repeated-query costs by 90%+ with similarity-based cache matching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Observability via Config&lt;/strong&gt; — stream every LLM call to Langfuse/MLflow/Slack with zero instrumentation&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Related articles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/headrooms-5-hidden-uses-the-context-compression-layer-that-cuts-ai-agent-token-bills-by-90-5b35"&gt;Headroom's 5 Hidden Uses: The Context Compression Layer That Cuts AI Agent Token Bills by 90%&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/pydantic-ai-agent-frameworks-5-hidden-uses-21f3"&gt;Pydantic AI Agent Framework's 5 Hidden Uses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-harness-5-hidden-uses-of-the-74k-star-open-source-agent-framework-58mj"&gt;DeerFlow SuperAgent Harness: 5 Hidden Uses of the 74K-Star Open-Source Agent Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;What is your team using as an LLM gateway? Have you tried LiteLLM's virtual keys or semantic caching in production? Drop your experience in the comments — I read every one.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mem0 Memory Layer: 5 Hidden Uses of the 60K-Star Agent Memory Engine</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Sun, 28 Jun 2026 03:09:35 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/mem0-memory-layer-5-hidden-uses-of-the-60k-star-agent-memory-engine-4g9p</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/mem0-memory-layer-5-hidden-uses-of-the-60k-star-agent-memory-engine-4g9p</guid>
      <description>&lt;p&gt;What if your AI agent could remember every user preference, every past conversation detail, and every confirmed fact — without you engineering a single database schema or retrieval pipeline? A open-source project with nearly 60,000 GitHub stars is making that possible today, yet most developers still bolt on memory as an afterthought, burning tokens re-summarizing context that should have been captured the first time.&lt;/p&gt;

&lt;p&gt;Mem0 (mem0ai/mem0) is the universal memory layer for AI agents — a Python/TypeScript SDK that adds user-level, session-level, and agent-level memory to any LLM application. With 59,600+ GitHub stars, an Apache 2.0 license, and a fresh v2.0 release in June 2026, it has become the de facto standard for agentic memory. But most teams only use the basic &lt;code&gt;add&lt;/code&gt; + &lt;code&gt;search&lt;/code&gt; API and miss the architectural tricks that unlock its real power.&lt;/p&gt;

&lt;p&gt;In 2026's AI landscape, agents are getting longer contexts, more tools, and bigger responsibilities. The bottleneck is no longer "can the model reason?" — it's "does the agent remember what happened three sessions ago?" Memory is the difference between a stateless chatbot and a genuinely personalized AI assistant. Mem0's new v3 algorithm (April 2026) scores 94.8 on LongMemEval and 91.6 on LoCoMo — leaps of +27 and +20 points over the previous version — proving that memory retrieval is now a solved problem if you use the right knobs.&lt;/p&gt;

&lt;p&gt;Hidden Use #1: Multi-Tenant Memory Isolation Without Separate Deployments&lt;/p&gt;

&lt;p&gt;What most people do: Spin up a separate Mem0 instance (or separate Qdrant collections) for each tenant in a SaaS app, multiplying infrastructure costs.&lt;/p&gt;

&lt;p&gt;The hidden trick: Mem0's &lt;code&gt;user_id&lt;/code&gt; parameter isn't just metadata — it's a first-class isolation boundary. You can run a single self-hosted server and use &lt;code&gt;user_id&lt;/code&gt; + &lt;code&gt;agent_id&lt;/code&gt; + &lt;code&gt;run_id&lt;/code&gt; triple-filtering to isolate memories across tenants, agents, and individual runs without any extra infrastructure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mem0&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# single self-hosted instance
&lt;/span&gt;
&lt;span class="c1"&gt;# Tenant A's customer-support agent
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Our billing cycle changed to monthly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tenantA:user_1234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_20260628_001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Tenant B's onboarding agent — same server, zero cross-contamination
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;We use AWS with us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tenantB:user_5678&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onboarding-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_20260628_002&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Retrieve with compound filter — only this tenant+agent combo
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing cycle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tenantA:user_1234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: One Docker Compose stack serves thousands of tenants with guaranteed isolation. No separate Qdrant clusters, no separate API keys, no config sprawl. The &lt;code&gt;filters&lt;/code&gt; dict supports AND semantics across all metadata fields.&lt;/p&gt;

&lt;p&gt;Data sources: Mem0 GitHub 59,600 Stars (pushed 2026-06-27), Apache-2.0, Python; HN Show HN 201 pts (objectID 41447317); self-hosted server supports single Docker Compose deployment with multi-tenant isolation via metadata filters.&lt;/p&gt;

&lt;p&gt;Hidden Use #2: Temporal Reasoning for "What Changed Since Last Time"&lt;/p&gt;

&lt;p&gt;What most people do: Store facts as flat strings ("User prefers dark mode") and never track when preferences change, leaving the agent confused when a user switches preferences mid-session.&lt;/p&gt;

&lt;p&gt;The hidden trick: Mem0 v3 introduced temporal reasoning — time-aware retrieval that ranks the right dated instance for queries about current state, past events, and upcoming plans. You can use &lt;code&gt;memory.update()&lt;/code&gt; with timestamps and let Mem0's retrieval prioritize recency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mem0&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# User was on the Pro plan...
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m on the Pro plan at $29/mo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-01-15T10:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ...then switched to Enterprise six months later
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Upgraded to Enterprise at $99/mo, effective immediately&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-07-01T14:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Mem0's temporal retrieval knows which fact is "current"
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What plan is Alice on?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temporal_filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# returns Enterprise, not Pro
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# → "Upgraded to Enterprise at $99/mo, effective immediately"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: Your agent always answers based on the most recent state, not a stale preference from 6 months ago. No manual timestamp sorting, no "precedence" rules you have to code yourself.&lt;/p&gt;

&lt;p&gt;Data sources: Mem0 v3 algorithm (April 2026) with temporal reasoning; LongMemEval 94.8 (+27 points); LoCoMo 91.6 (+20 points); BEAM 1M benchmark 64.1 at 6.7K tokens latency — all from official Mem0 research blog and README benchmarks.&lt;/p&gt;

&lt;p&gt;Hidden Use #3: Agent Skills — Teach Your Coding Assistant to Use Memory Autonomously&lt;/p&gt;

&lt;p&gt;What most people do: Use Mem0 in a custom Python backend, manually calling &lt;code&gt;memory.add()&lt;/code&gt; and &lt;code&gt;memory.search()&lt;/code&gt; in route handlers.&lt;/p&gt;

&lt;p&gt;The hidden trick: Mem0 ships with Agent Skills — a mechanism to teach AI coding assistants (Claude Code, Codex, Cursor, Windsurf, OpenCode) how to use Mem0 autonomously. Your coding agent learns to mint API keys, add memories, and search them — all from a &lt;code&gt;/mem0-integrate&lt;/code&gt; slash command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Install the skill into your AI coding assistant&lt;/span&gt;
npx skills add https://github.com/mem0ai/mem0 &lt;span class="nt"&gt;--skill&lt;/span&gt; mem0

&lt;span class="c"&gt;# Step 2: In your next Claude Code / Codex session, just say:&lt;/span&gt;
&lt;span class="c"&gt;#   /mem0-integrate&lt;/span&gt;

&lt;span class="c"&gt;# The agent will:&lt;/span&gt;
&lt;span class="c"&gt;#   1. Detect your project framework (FastAPI, Django, Flask, Next.js...)&lt;/span&gt;
&lt;span class="c"&gt;#   2. Install the right SDK (mem0ai or @mem0ai/memory)&lt;/span&gt;
&lt;span class="c"&gt;#   3. Wire up Memory() in your entry point&lt;/span&gt;
&lt;span class="c"&gt;#   4. Add memory.add() calls at conversation boundaries&lt;/span&gt;
&lt;span class="c"&gt;#   5. Add memory.search() calls to inject context into prompts&lt;/span&gt;
&lt;span class="c"&gt;#   6. Run /mem0-test-integration to verify everything works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: In under 5 minutes, your AI coding assistant builds a production-ready memory integration — with tests — into an existing codebase. No boilerplate writing, no API docs reading, no forgetting to add the search-before-respond step.&lt;/p&gt;

&lt;p&gt;Data sources: Mem0 Agent Skills catalog (reference + pipeline skills); supports Claude Code, Codex, Cursor, Windsurf, OpenCode, OpenClaw; SDK available as &lt;code&gt;pip install mem0ai&lt;/code&gt; (Python v2.0.10) and &lt;code&gt;npm install @mem0ai/memory&lt;/code&gt; (TypeScript v3.0.12).&lt;/p&gt;

&lt;p&gt;Hidden Use #4: Hybrid Search with Entity Linking for Zero-Hallucination Retrieval&lt;/p&gt;

&lt;p&gt;What most people do: Rely purely on semantic vector search, which misses exact keyword matches ("What was the error code?") and fails when two different entities share similar embeddings.&lt;/p&gt;

&lt;p&gt;The hidden trick: Mem0's hybrid search combines three retrieval signals — semantic similarity (vector), BM25 keyword matching, and entity linking — scored in parallel and fused. Install the NLP extras and enable all three for retrieval that catches what pure embedding search misses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Install with NLP support for hybrid search
# pip install "mem0ai[nlp]"
# python -m spacy download en_core_web_sm
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mem0&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# auto-detects NLP mode when spacy is installed
&lt;/span&gt;
&lt;span class="c1"&gt;# Store memories with rich entity context
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s API key is sk-proj-abc123 for project Phoenix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Semantic search catches paraphrases
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s secret key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → matches "sk-proj-abc123" via semantic similarity
&lt;/span&gt;
&lt;span class="c1"&gt;# BM25 catches exact codes that embeddings miss
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-proj-abc123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → matches via keyword, not just vector proximity
&lt;/span&gt;
&lt;span class="c1"&gt;# Entity linking boosts "Phoenix" project context
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phoenix project credentials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → entity graph links Phoenix → API key → Alice
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: Dramatically fewer "I don't have that information" failures. Exact codes, IDs, and acronyms that embedding models confuse are caught by BM25, while paraphrased queries are caught by vectors. Entity linking bridges the two.&lt;/p&gt;

&lt;p&gt;Data sources: Mem0 v3 multi-signal retrieval (semantic + BM25 + entity matching); recommends Qwen 600M embedder or text-embedding-3-small; 1M-token BEAM benchmark scores 64.1 at 1.00s latency p50.&lt;/p&gt;

&lt;p&gt;Hidden Use #5: Cross-Platform Memory Sharing via Browser Extension Architecture&lt;/p&gt;

&lt;p&gt;What most people do: Build memory into one app (say, a customer support bot) and accept that memories are siloed — the support bot can't remember what the user told the onboarding wizard.&lt;/p&gt;

&lt;p&gt;The hidden trick: Mem0's architecture supports shared memory across multiple AI interfaces through a unified &lt;code&gt;user_id&lt;/code&gt; namespace. Their browser extension proves this: memories stored from ChatGPT are available to Claude and Perplexity. You can replicate this pattern across your product suite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# All your AI touchpoints share the same user_id namespace
# The user talks to your support bot, your sales copilot, and your docs assistant
# They ALL access the same memory pool
&lt;/span&gt;
&lt;span class="c1"&gt;# Support bot (port 8001)
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sales copilot (port 8002) — same Memory() backend
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sales-copilot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Docs assistant (port 8003) — same backend
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s integration preferences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs-assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → sees memories from BOTH support and sales conversations
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: A user who explains their tech stack to your sales copilot won't have to repeat it to your docs assistant. One memory backend, many AI interfaces, zero silos. The &lt;code&gt;agent_id&lt;/code&gt; field lets you scope retrieval when needed, or ignore it for full cross-agent visibility.&lt;/p&gt;

&lt;p&gt;Data sources: Mem0 Browser Extension (HN 34pts, objectID 42042401) shares memory across ChatGPT, Perplexity, Claude; self-hosted server runs as single Docker Compose stack; Python SDK v2.0.10, TypeScript SDK v3.0.12.&lt;/p&gt;




&lt;p&gt;5 techniques that make Mem0 a genuine memory layer (not just a vector store):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multi-tenant isolation&lt;/strong&gt; — &lt;code&gt;user_id&lt;/code&gt; + &lt;code&gt;agent_id&lt;/code&gt; + &lt;code&gt;run_id&lt;/code&gt; triple-filtering on a single shared instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal reasoning&lt;/strong&gt; — time-aware retrieval that always returns the most current state, not stale facts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Skills&lt;/strong&gt; — &lt;code&gt;/mem0-integrate&lt;/code&gt; slash command that teaches any AI coding assistant to wire up memory autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid search with entity linking&lt;/strong&gt; — semantic + BM25 + entity graph fusion for zero-hallucination retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform memory sharing&lt;/strong&gt; — unified &lt;code&gt;user_id&lt;/code&gt; namespace across all AI touchpoints in your product suite&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Related articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/fastmcp-5-hidden-uses"&gt;FastMCP's 5 Hidden Uses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/pydantic-ai-agent-frameworks-5-hidden-uses-21f3"&gt;Pydantic AI's 5 Hidden Uses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-harness-5-hidden-uses-of-the-74k-star-open-source-agent-framework-58mj"&gt;DeerFlow's 5 Hidden Uses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's your most creative use of agent memory? Have you tried wiring Mem0 into a production agent, or are you using a different approach for long-term context? Drop your experience in the comments — I'd love to hear what worked (and what didn't).&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Mem0 记忆层：6 万 Star Agent 记忆引擎的 5 个隐藏用法</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Sun, 28 Jun 2026 03:09:29 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/mem0-ji-yi-ceng-6-mo-star-agent-ji-yi-yin-qing-de-5-ge-yin-cang-yong-fa-1nnm</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/mem0-ji-yi-ceng-6-mo-star-agent-ji-yi-yin-qing-de-5-ge-yin-cang-yong-fa-1nnm</guid>
      <description>&lt;p&gt;你知道吗？有一个开源项目拥有近 6 万 GitHub Star，能让你的 AI Agent 记住每位用户的偏好、每次对话的细节、每个确认过的事实——而且你不需要设计任何数据库 Schema，也不需要搭建任何检索流水线。大多数团队还在每次对话重新总结上下文的时候，Mem0 已经把"永久记忆"变成了几行代码的事。&lt;/p&gt;

&lt;p&gt;Mem0（mem0ai/mem0）是 AI Agent 的通用记忆层——一个 Python/TypeScript SDK，能为任何 LLM 应用添加用户级、会话级和 Agent 级记忆。它拥有 59,600+ GitHub Star、Apache 2.0 协议，并在 2026 年 6 月发布了全新的 v2.0 版本。但在 2026 年的 AI 开发格局中，Agent 正在获得更长的上下文、更多的工具、更大的责任。瓶颈已经不是"模型能不能推理"——而是"Agent 能不能记住三周前发生了什么"。Mem0 的 v3 算法（2026 年 4 月）在 LongMemEval 上得分 94.8，在 LoCoMo 上得分 91.6——比上一版本分别跃升 +27 和 +20 分——证明只要你用对了旋钮，记忆检索已经是已解决的问题。&lt;/p&gt;

&lt;p&gt;隐藏用法 #1：多租户记忆隔离，无需多套部署&lt;/p&gt;

&lt;p&gt;大多数人的做法：为 SaaS 应用中每个租户单独启动一个 Mem0 实例（或单独的 Qdrant 集合），基础设施成本成倍增长。&lt;/p&gt;

&lt;p&gt;隐藏技巧：Mem0 的 &lt;code&gt;user_id&lt;/code&gt; 参数不仅仅是元数据——它是一等公民级的隔离边界。你可以运行一个自托管服务器，通过 &lt;code&gt;user_id&lt;/code&gt; + &lt;code&gt;agent_id&lt;/code&gt; + &lt;code&gt;run_id&lt;/code&gt; 三重过滤，在不同租户、不同 Agent、不同运行之间实现记忆隔离，无需额外基础设施。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mem0&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# 单个自托管实例
&lt;/span&gt;
&lt;span class="c1"&gt;# 租户 A 的客服 Agent
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;我们的计费周期改成了月付&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tenantA:user_1234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_20260628_001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 租户 B 的入职 Agent — 同一服务器，零交叉污染
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;我们使用 AWS us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tenantB:user_5678&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onboarding-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;run_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session_20260628_002&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 复合过滤检索——只返回该租户+Agent 的记忆
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;计费周期&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tenantA:user_1234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;billing-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;效果：一个 Docker Compose 堆栈服务数千个租户，保证隔离。不需要单独的 Qdrant 集群，不需要单独的 API Key，不需要配置膨胀。&lt;code&gt;filters&lt;/code&gt; 字典对所有元数据字段支持 AND 语义。&lt;/p&gt;

&lt;p&gt;数据来源：Mem0 GitHub 59,600 Stars（2026-06-27 推送），Apache-2.0，Python；HN Show HN 201 pts（objectID 41447317）；自托管服务器支持通过元数据过滤实现单 Docker Compose 多租户隔离。&lt;/p&gt;

&lt;p&gt;隐藏用法 #2：时间推理——"上次到现在发生了什么变化"&lt;/p&gt;

&lt;p&gt;大多数人的做法：把事实存成纯字符串（"用户偏好暗色模式"），从不追踪偏好何时变更，当用户中途切换偏好时 Agent 一脸茫然。&lt;/p&gt;

&lt;p&gt;隐藏技巧：Mem0 v3 引入了时间推理——感知时间的检索机制，为当前状态、过去事件和即将到来的计划排序正确的带日期实例。你可以配合 &lt;code&gt;memory.update()&lt;/code&gt; 使用时间戳，让 Mem0 优先返回最新状态。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mem0&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 用户原来用的是 Pro 计划...
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;我每月花 $29 用 Pro 计划&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-01-15T10:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ...六个月后升级到了 Enterprise
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;升级到 Enterprise，每月 $99，立即生效&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-07-01T14:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Mem0 的时间推理知道哪条是"当前"状态
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice 现在用的什么计划？&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temporal_filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# 返回 Enterprise，不是 Pro
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# → "升级到 Enterprise，每月 $99，立即生效"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;效果：你的 Agent 永远基于最新状态回答，而不是基于 6 个月前的过时偏好。不需要手动时间戳排序，不需要自己写"优先级"规则。&lt;/p&gt;

&lt;p&gt;数据来源：Mem0 v3 算法（2026 年 4 月）引入时间推理；LongMemEval 94.8（+27 分）；LoCoMo 91.6（+20 分）；BEAM 1M 基准 64.1，6.7K tokens，延迟 p50 1.00s——均来自 Mem0 官方研究博客和 README 基准测试。&lt;/p&gt;

&lt;p&gt;隐藏用法 #3：Agent 技能——教你的编程助手自主使用记忆&lt;/p&gt;

&lt;p&gt;大多数人的做法：在自定义 Python 后端中使用 Mem0，在路由处理器中手动调用 &lt;code&gt;memory.add()&lt;/code&gt; 和 &lt;code&gt;memory.search()&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;隐藏技巧：Mem0 内置了 Agent 技能机制——教 AI 编程助手（Claude Code、Codex、Cursor、Windsurf、OpenCode）如何自主使用 Mem0。你的编程 Agent 学会创建 API Key、添加记忆、搜索记忆——全部通过 &lt;code&gt;/mem0-integrate&lt;/code&gt; 斜杠命令完成。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 第一步：安装技能到你的 AI 编程助手&lt;/span&gt;
npx skills add https://github.com/mem0ai/mem0 &lt;span class="nt"&gt;--skill&lt;/span&gt; mem0

&lt;span class="c"&gt;# 第二步：在下次 Claude Code / Codex 会话中，只需输入：&lt;/span&gt;
&lt;span class="c"&gt;#   /mem0-integrate&lt;/span&gt;

&lt;span class="c"&gt;# Agent 会自动：&lt;/span&gt;
&lt;span class="c"&gt;#   1. 检测你的项目框架（FastAPI、Django、Flask、Next.js...）&lt;/span&gt;
&lt;span class="c"&gt;#   2. 安装对应的 SDK（mem0ai 或 @mem0ai/memory）&lt;/span&gt;
&lt;span class="c"&gt;#   3. 在入口点初始化 Memory()&lt;/span&gt;
&lt;span class="c"&gt;#   4. 在对话边界添加 memory.add() 调用&lt;/span&gt;
&lt;span class="c"&gt;#   5. 在 prompt 注入处添加 memory.search() 调用&lt;/span&gt;
&lt;span class="c"&gt;#   6. 运行 /mem0-test-integration 验证一切正常&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;效果：不到 5 分钟，你的 AI 编程助手就能在有现有代码库中构建生产就绪的集成——包括测试。不需要写样板代码，不需要读 API 文档，不会忘记添加"先搜索再回答"的步骤。&lt;/p&gt;

&lt;p&gt;数据来源：Mem0 Agent 技能目录（参考 + 流水线技能）；支持 Claude Code、Codex、Cursor、Windsurf、OpenCode、OpenClaw；SDK 通过 &lt;code&gt;pip install mem0ai&lt;/code&gt;（Python v2.0.10）和 &lt;code&gt;npm install @mem0ai/memory&lt;/code&gt;（TypeScript v3.0.12）安装。&lt;/p&gt;

&lt;p&gt;隐藏用法 #4：混合搜索 + 实体链接——零幻觉检索&lt;/p&gt;

&lt;p&gt;大多数人的做法：纯依赖语义向量搜索，当用户问"错误码是什么"时完全miss掉，或者两个不同实体有相似 embedding 时混淆。&lt;/p&gt;

&lt;p&gt;隐藏技巧：Mem0 的混合搜索组合三路检索信号——语义相似度（向量）、BM25 关键词匹配、实体链接——并行评分后融合。安装 NLP 增强并启用全部三路，检索就能抓住纯 embedding 搜索漏掉的内容。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 安装 NLP 支持以启用混合搜索
# pip install "mem0ai[nlp]"
# python -m spacy download en_core_web_sm
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mem0&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Memory&lt;/span&gt;

&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# spacy 存在时自动检测 NLP 模式
&lt;/span&gt;
&lt;span class="c1"&gt;# 存储带丰富实体上下文的记忆
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice 的 API Key 是 ***，项目是 Phoenix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 语义搜索捕获释义
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice 的 secret key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 通过语义相似性匹配 "***"
&lt;/span&gt;
&lt;span class="c1"&gt;# BM25 捕获 embedding 混淆的精确编码
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 通过关键词匹配，而非仅靠向量距离
&lt;/span&gt;
&lt;span class="c1"&gt;# 实体链接提升 "Phoenix" 项目上下文
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Phoenix 项目凭证&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 实体图链接 Phoenix → API Key → Alice
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;效果：大幅减少"我不知道"的失败。精确编码、ID 和缩写会被 BM25 捕获，释义查询会被向量捕获。实体链接连接两者。&lt;/p&gt;

&lt;p&gt;数据来源：Mem0 v3 多信号检索（语义 + BM25 + 实体匹配）；推荐 Qwen 600M embedder 或 text-embedding-3-small；1M token BEAM 基准 64.1 分，延迟 p50 1.00s。&lt;/p&gt;

&lt;p&gt;隐藏用法 #5：通过浏览器扩展架构实现跨平台记忆共享&lt;/p&gt;

&lt;p&gt;大多数人的做法：在一个应用中构建记忆（比如客服机器人），然后接受记忆是孤立的——客服机器人无法记住用户在入职向导中说过的话。&lt;/p&gt;

&lt;p&gt;隐藏技巧：Mem0 的架构通过统一的 &lt;code&gt;user_id&lt;/code&gt; 命名空间支持跨多个 AI 接口共享记忆。他们的浏览器扩展证明了这一点：从 ChatGPT 存储的记忆，Claude 和 Perplexity 也能访问。你可以在整个产品套件中复制这个模式。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 你所有的 AI 触点共享同一个 user_id 命名空间
# 用户跟你的客服机器人、销售助手、文档助手聊天
# 它们都访问同一个记忆池
&lt;/span&gt;
&lt;span class="c1"&gt;# 客服机器人（端口 8001）
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support-bot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 销售助手（端口 8002）— 同一个 Memory() 后端
&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sales-copilot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 文档助手（端口 8003）— 同一个后端
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice 的集成偏好&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docs-assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 看到来自客服和销售双方的记忆
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;效果：用户向销售助手解释过技术栈后，不需要再向文档助手重复。一个记忆后端，多个 AI 接口，零孤岛。&lt;code&gt;agent_id&lt;/code&gt; 字段让你在需要时限定检索范围，或忽略它实现全 Agent 可见。&lt;/p&gt;

&lt;p&gt;数据来源：Mem0 浏览器扩展（HN 34pts，objectID 42042401）跨 ChatGPT、Perplexity、Claude 共享记忆；自托管服务器以单 Docker Compose 堆栈运行；Python SDK v2.0.10，TypeScript SDK v3.0.12。&lt;/p&gt;




&lt;p&gt;让 Mem0 成为真正记忆层（而非仅仅是向量存储）的 5 个技巧：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;多租户隔离&lt;/strong&gt; — 在单一共享实例上使用 &lt;code&gt;user_id&lt;/code&gt; + &lt;code&gt;agent_id&lt;/code&gt; + &lt;code&gt;run_id&lt;/code&gt; 三重过滤&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;时间推理&lt;/strong&gt; — 感知时间的检索机制，永远返回最新状态而非过时事实&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent 技能&lt;/strong&gt; — &lt;code&gt;/mem0-integrate&lt;/code&gt; 斜杠命令教任何 AI 编程助手自主接入记忆&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;混合搜索 + 实体链接&lt;/strong&gt; — 语义 + BM25 + 实体图融合，实现零幻觉检索&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;跨平台记忆共享&lt;/strong&gt; — 跨产品套件所有 AI 触点的统一 &lt;code&gt;user_id&lt;/code&gt; 命名空间&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关文章：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/fastmcp-5-hidden-uses"&gt;FastMCP 的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/pydantic-ai-agent-frameworks-5-hidden-uses-21f3"&gt;Pydantic AI 的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-harness-5-hidden-uses-of-the-74k-star-open-source-agent-framework-58mj"&gt;DeerFlow 的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你在 Agent 记忆方面最有创意的用法是什么？你尝试过把 Mem0 接入生产 Agent，还是用了其他方案来处理长期上下文？欢迎在评论区分享你的经验——我很想知道什么方案有效、什么方案踩了坑。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>codebase-memory-mcp's 5 Hidden Uses: The Code Intelligence Server That Cuts 99% of Token Usage</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Sat, 27 Jun 2026 03:10:31 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/codebase-memory-mcps-5-hidden-uses-the-code-intelligence-server-that-cuts-99-of-token-usage-375n</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/codebase-memory-mcps-5-hidden-uses-the-code-intelligence-server-that-cuts-99-of-token-usage-375n</guid>
      <description>&lt;p&gt;Most AI coding agents waste 99% of your context window reading files one by one like a first-grader sounding out words. While grep and file-by-file exploration burn 412,000 tokens to answer "what calls ProcessOrder?", a single structural query through the right MCP server can do it in 3,400. That is not a marginal improvement — it changes whether your agent fits the codebase in context at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;codebase-memory-mcp&lt;/strong&gt; is a high-performance code intelligence server with &lt;strong&gt;15,792 GitHub Stars&lt;/strong&gt;, written in pure C with zero dependencies. It indexes any codebase into a persistent knowledge graph and answers structural queries in under 1 millisecond. The Linux kernel (28 million lines, 75,000 files) takes 3 minutes to index. Django takes 6 seconds. Your agent never reads a file blindly again.&lt;/p&gt;

&lt;p&gt;But most developers who install it only use &lt;code&gt;search_graph&lt;/code&gt; and &lt;code&gt;trace_path&lt;/code&gt; — the obvious lookup tools. Here are five hidden techniques that actually unlock the promised 99% token reduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #1: Cypher Queries for Cross-Cutting Pattern Detection
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Use &lt;code&gt;search_graph&lt;/code&gt; with a regex name pattern to find specific functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Use &lt;code&gt;query_graph&lt;/code&gt; with Cypher to express multi-hop structural relationships that regex cannot touch — inheritance chains, dead code detection, and diamond dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Find all handler functions with ZERO callers (dead entry points)
# This catches stale API endpoints and orphaned refactor remnants
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_cbm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cypher_query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Run a Cypher query against the codebase-memory-mcp knowledge graph.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_graph&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cypher_query&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Hidden Use #1: Dead code detection — functions never called
&lt;/span&gt;&lt;span class="n"&gt;dead_code_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
MATCH (f:Function)
WHERE NOT EXISTS { (f)&amp;lt;-[:CALLS]-() }
  AND f.name &amp;lt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
RETURN f.name, f.file
ORDER BY f.name
LIMIT 50
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query_cbm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dead_code_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; A ranked list of dead functions to remove or wire up. Teams report 15-30% code shrinkage after one cleanup pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data source:&lt;/strong&gt; codebase-memory-mcp 15,792 Stars (GitHub API verified 2026-06-27), 5,604 tests passing; arXiv:2603.27277 benchmarks showing 10× fewer tool calls vs. file-by-file exploration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #2: Git Diff Impact Mapping Before You Commit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Run &lt;code&gt;git diff&lt;/code&gt; manually, read changes, and hold the blast radius in your head.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Use &lt;code&gt;detect_changes&lt;/code&gt; to map uncommitted diffs directly to affected symbols with risk classification. This gives you a structured blast-radius report in sub-millisecond time, before the commit lands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_impact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Map uncommitted changes to affected symbols with risk levels.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detect_changes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;project_name&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="c1"&gt;# Extract from MCP SSE format
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
                &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;symbol&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;risk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;risk_level&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;affected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;affected_count&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;affected&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; symbols affected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;

&lt;span class="c1"&gt;# Run before committing to see the real blast radius
&lt;/span&gt;&lt;span class="nf"&gt;detect_impact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Before each commit, you see exactly which downstream symbols break. Risk classification (&lt;code&gt;low&lt;/code&gt;/&lt;code&gt;medium&lt;/code&gt;/&lt;code&gt;high&lt;/code&gt;) prioritizes review. A "medium-risk rename" no longer accidentally becomes "why did CI break 20 minutes ago."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data source:&lt;/strong&gt; codebase-memory-mcp supports git diff → symbol mapping via &lt;code&gt;detect_changes&lt;/code&gt; tool (14 MCP tools total); 11 coding agents auto-configured via &lt;code&gt;install&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #3: Team-Shared Graph Artifact for Zero-Reindex CI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Every teammate runs a full index locally, burning 3-60 seconds of compute per clone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Commit &lt;code&gt;.codebase-memory/graph.db.zst&lt;/code&gt; to your repo. Teammates cloning the repo skip the full reindex — the server decompresses the snapshot (8-13:1 ratio) and runs incremental indexing only on their local diff. Combine with &lt;code&gt;auto_index true&lt;/code&gt; and nobody waits for indexing again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Export the knowledge graph as a compressed artifact&lt;/span&gt;
codebase-memory-mcp cli index_repository &lt;span class="s1"&gt;'{"repo_path": "/path/to/project"}'&lt;/span&gt; &lt;span class="nt"&gt;--export-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;zst

&lt;span class="c"&gt;# Step 2: The export auto-creates .codebase-memory/ directory&lt;/span&gt;
&lt;span class="c"&gt;# Add to git (merge=ours is auto-configured to avoid conflicts)&lt;/span&gt;
git add .codebase-memory/graph.db.zst
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add knowledge graph artifact for team"&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Teammates clone, run install, and immediately have context&lt;/span&gt;
&lt;span class="c"&gt;# No reindex needed — the server decompresses and incrementally updates&lt;/span&gt;
git clone &amp;lt;repo&amp;gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;codebase-memory-mcp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./install.sh
&lt;span class="c"&gt;# Agent now has full graph context on first session start&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: Configure background auto-index for ongoing changes&lt;/span&gt;
codebase-memory-mcp config &lt;span class="nb"&gt;set &lt;/span&gt;auto_index &lt;span class="nb"&gt;true
&lt;/span&gt;codebase-memory-mcp config &lt;span class="nb"&gt;set &lt;/span&gt;auto_index_limit 50000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Zero-reindex CI and team onboarding. The compressed artifact is typically 30-80 MB for a large repo — trivial as a git blob. Background watcher detects file changes and refreshes incrementally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data source:&lt;/strong&gt; Team-Shared Graph Artifact feature ships in all codebase-memory-mcp binaries; uses SQLite WAL mode + zstd compression; &lt;code&gt;.gitattributes merge=ours&lt;/code&gt; auto-configured on first export.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #4: Architecture Decision Records as Agent Memory
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Put design decisions in a Confluence page nobody reads, or bury them in PR descriptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Use &lt;code&gt;manage_adr&lt;/code&gt; to persist architecture decisions directly inside the knowledge graph. Your ADRs become queryable context for every future AI coding session — the agent sees why you chose PostgreSQL over MongoDB before suggesting schema changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="c1"&gt;# Create an Architecture Decision Record
&lt;/span&gt;&lt;span class="n"&gt;adr_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Title: Use event sourcing for order state
Context: Orders flow through 12 microservices. Debugging requires correlating
         logs across services. Traditional CRUD loses state transition history.
Decision: Adopt event sourcing on the orders domain. Store state transitions
          as immutable events in PostgreSQL, project read views via CQRS.
Consequences:
  + Full audit trail of every state change
  + Can replay events to rebuild any read model
  - Additional complexity of event serialization
  - Need snapshot strategy for orders with &amp;gt;1000 events
  - Team training required (estimated 2 sprints)
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;manage_adr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;orders-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ADR-007: Event Sourcing for Order State&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;adr_content&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ADR created: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; ADRs live inside the same knowledge graph the agent queries for code context. Every future "why did you...?" question is answered automatically. No more Confluence link-d rot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data source:&lt;/strong&gt; &lt;code&gt;manage_adr&lt;/code&gt; tool provides CRUD for Architecture Decision Records within the knowledge graph; graph supports 17 edge types including &lt;code&gt;CONFIGURES&lt;/code&gt;, &lt;code&gt;IMPLEMENTS&lt;/code&gt;, &lt;code&gt;TESTS&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #5: Cross-Repo Intelligence for Microservice Architectures
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; When debugging cross-service bugs, manually trace HTTP calls by grepping for URL patterns in each repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; Index multiple repos under the same graph store. The &lt;code&gt;CROSS_*&lt;/code&gt; edges link nodes across repos — HTTP routes in the API gateway map to handler functions in the backend service. The 3D graph UI renders the entire stack as a multi-galaxy visualization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="c1"&gt;# Step 1: Index the API gateway (auto-discovers HTTP routes from @RequestMapping, @GetMapping, etc.)
&lt;/span&gt;&lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index_repository&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repo_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/services/api-gateway&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: Index the backend service (auto-discovers HTTP call-sites from RestTemplate, fetch, etc.)
&lt;/span&gt;&lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index_repository&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repo_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/services/order-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: Cross-repo query — which services does the API gateway call?
&lt;/span&gt;&lt;span class="n"&gt;cross_repo_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
MATCH (r1:Route)-[:HTTP_CALLS]-&amp;gt;(f2:Function)
WHERE r1.project = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;api-gateway&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; AND f2.project = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;order-service&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
RETURN r1.path AS gateway_path, f2.name AS handler_function
ORDER BY r1.path
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Use get_architecture for a combined overview
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_architecture&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Combined architecture across repos:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; After indexing both repos, you can trace a request from the gateway route through the HTTP call to the backend handler — visualized in the 3D Multi-Galaxy graph UI. When something breaks in production, the agent knows which repo to fix without manual investigation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data source:&lt;/strong&gt; Cross-repo &lt;code&gt;CROSS_*&lt;/code&gt; edges for REST/gRPC/GraphQL detection; graph contains 4.81M nodes and 7.72M edges on Linux kernel scale; &lt;code&gt;get_architecture&lt;/code&gt; combines services, routes, and dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary: The 5 Hidden Techniques
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cypher pattern detection&lt;/strong&gt; — Express multi-hop structural queries that regex cannot touch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git diff impact mapping&lt;/strong&gt; — See exact blast radius before committing, with risk classification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team-shared graph artifact&lt;/strong&gt; — Commit &lt;code&gt;.codebase-memory/graph.db.zst&lt;/code&gt;, teammates never reindex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Decision Records as agent memory&lt;/strong&gt; — ADRs queryable by the agent during every session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-repo intelligence&lt;/strong&gt; — Index linked repos to trace requests across microservice boundaries&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keep Reading
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this deep dive, you might also like these articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/mempalace-5-hidden-uses-of-the-54k-star-open-source-ai-memory-system-5l6a"&gt;MemPalace: 5 Hidden Uses of the 54K-Star AI Memory System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/fastmcp-5-hidden-uses-of-the-25k-star-mcp-framework-most-teams-use-wrong-2j9g"&gt;FastMCP's 5 Hidden Uses: The MCP Server Framework Most Teams Use Wrong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/nanobot-5-hidden-uses-of-the-44k-star-multi-channel-agent-infrastructure-4ena"&gt;Nanobot's 5 Hidden Uses: Multi-Channel AI Agent Infrastructure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have you tried codebase-memory-mcp? What is your most surprising result — did Cypher queries finally let you clean up that graveyard of dead handlers? Drop your war stories in the comments.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>codebase-memory-mcp 的 5 个隐藏用法：砍掉 99% Token 开销的代码知识图谱服务器</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Sat, 27 Jun 2026 03:10:25 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/codebase-memory-mcp-de-5-ge-yin-cang-yong-fa-kan-diao-99-token-kai-xiao-de-dai-ma-zhi-shi-tu-pu-fu-wu-qi-5f9p</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/codebase-memory-mcp-de-5-ge-yin-cang-yong-fa-kan-diao-99-token-kai-xiao-de-dai-ma-zhi-shi-tu-pu-fu-wu-qi-5f9p</guid>
      <description>&lt;p&gt;大多数 AI 编码助手像小孩子一样一个词一个词地读文件，99% 的上下文窗口就这样被白白烧掉了。用 grep 和逐文件扫描回答"谁调用了 ProcessOrder？"这个问题需要 41.2 万 tokens，而通过正确的 MCP Server 做一次结构化查询只需 3,400 tokens。这不是小改进——它直接决定了你的 Agent 能不能把整个代码库塞进上下文窗口。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;codebase-memory-mcp&lt;/strong&gt; 是一个高性能的代码知识图谱服务器，&lt;strong&gt;15,792 GitHub Stars&lt;/strong&gt;，纯 C 编写，零依赖。它能索引任意代码库为持久化知识图谱，结构查询耗时低于 1 毫秒。Linux 内核（2,800 万行代码、7.5 万文件）索引只需 3 分钟，Django 只需 6 秒。&lt;/p&gt;

&lt;p&gt;但是大多数人安装后只用了 &lt;code&gt;search_graph&lt;/code&gt; 和 &lt;code&gt;trace_path&lt;/code&gt;——那些一眼就能看到的查找功能。以下是五个实际上能释放 99% token 削减承诺的隐藏技巧。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #1：Cypher 查询检测跨切面代码模式
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 用 &lt;code&gt;search_graph&lt;/code&gt; 的名称正则模式查找特定函数。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 用 &lt;code&gt;query_graph&lt;/code&gt; 的 Cypher 语法表达正则无法触及的多跳结构关系——继承链检测、死代码发现、菱形依赖追踪。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_cbm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cypher_query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;对 codebase-memory-mcp 知识图谱执行 Cypher 查询。&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query_graph&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cypher_query&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 隐藏用法 #1：死代码检测 — 查找零调用者的函数
# 能捕捉陈旧的 API 端点和重构遗留的孤儿代码
&lt;/span&gt;&lt;span class="n"&gt;dead_code_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
MATCH (f:Function)
WHERE NOT EXISTS { (f)&amp;lt;-[:CALLS]-() }
  AND f.name &amp;lt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;main&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
RETURN f.name, f.file
ORDER BY f.name
LIMIT 50
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query_cbm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dead_code_query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 得到一份可清理的死代码排行。团队一轮清理后代码量缩减了 15-30%。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; codebase-memory-mcp 15,792 Stars（GitHub API 2026-06-27 验证）；arXiv:2603.27277 基准测试显示比逐文件扫描少 10 倍工具调用。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #2：提交前用 Git Diff 映射爆炸半径
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 手动跑 &lt;code&gt;git diff&lt;/code&gt;，靠人脑记住哪些代码会受影响。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 用 &lt;code&gt;detect_changes&lt;/code&gt; 把未提交的 diff 直接映射为受影响的符号，并附带风险等级分类。每次提交前你都有了一份亚毫秒级的结构化爆炸半径报告。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_impact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;将未提交变更映射为受影响符号及风险等级。&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;detect_changes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;project_name&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
                &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;symbol&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;risk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;risk_level&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;affected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;affected_count&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;affected&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 个符号受影响&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;

&lt;span class="c1"&gt;# 提交前执行，看清真实的爆炸半径
&lt;/span&gt;&lt;span class="nf"&gt;detect_impact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 每次提交前就知道哪些下游符号会坏。风险等级（低/中/高）帮你优先处理审查重点。"中等风险的重命名"不会再变成"为什么 CI 20 分钟后挂了"。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; codebase-memory-mcp 通过 &lt;code&gt;detect_changes&lt;/code&gt; 工具支持 git diff → 符号映射（共 14 个 MCP 工具）；通过 &lt;code&gt;install&lt;/code&gt; 命令自动配置 11 个编码 Agent。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #3：团队共享图谱制品，零重建索引
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 每个同事本地跑全量索引，每次 clone 浪费 3-60 秒计算。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 把 &lt;code&gt;.codebase-memory/graph.db.zst&lt;/code&gt; 声入 repo。同事 clone 后跳过全量重建——服务端解压快照（8-13:1 压缩率），仅对本地 diff 做增量索引。配合 &lt;code&gt;auto_index true&lt;/code&gt;，没人再等索引。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 第 1 步：导出知识图谱为压缩制品&lt;/span&gt;
codebase-memory-mcp cli index_repository &lt;span class="s1"&gt;'{"repo_path": "/path/to/project"}'&lt;/span&gt; &lt;span class="nt"&gt;--export-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;zst

&lt;span class="c"&gt;# 第 2 步：导出会自动创建 .codebase-memory/ 目录&lt;/span&gt;
&lt;span class="c"&gt;# 添加到 git（自动配置 merge=ours 避免冲突）&lt;/span&gt;
git add .codebase-memory/graph.db.zst
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"add knowledge graph artifact for team"&lt;/span&gt;

&lt;span class="c"&gt;# 第 3 步：同事 clone、执行 install，立即可获得完整上下文&lt;/span&gt;
&lt;span class="c"&gt;# 无需重建索引 — 服务端解压后增量更新&lt;/span&gt;
git clone &amp;lt;repo&amp;gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;codebase-memory-mcp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./install.sh
&lt;span class="c"&gt;# Agent 在首次会话启动时即拥有完整图谱上下文&lt;/span&gt;

&lt;span class="c"&gt;# 第 4 步：配置后台自动索引，持续跟踪变更&lt;/span&gt;
codebase-memory-mcp config &lt;span class="nb"&gt;set &lt;/span&gt;auto_index &lt;span class="nb"&gt;true
&lt;/span&gt;codebase-memory-mcp config &lt;span class="nb"&gt;set &lt;/span&gt;auto_index_limit 50000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 零重建索引的 CI 和团队 Onboarding。压缩制品对一个大型仓库通常只有 30-80 MB——完全适合作为 git blob。后台 watcher 检测文件变更并增量刷新。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; Team-Shared Graph Artifact 功能内置于所有 codebase-memory-mcp 二进制文件；使用 SQLite WAL 模式 + zstd 压缩；首次导出自动配置 &lt;code&gt;.gitattributes merge=ours&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #4：架构决策记录作为 Agent 持久记忆
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 把设计决策写在 Confluence 页面上没人看，或者埋在 PR 描述里。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 用 &lt;code&gt;manage_adr&lt;/code&gt; 把架构决策直接持久化到知识图谱中。你的 ADR 变成每次 AI 编码会话都能查询到的上下文——Agent 在建议你改 Schema 之前就知道你为什么选了 PostgreSQL 而不是 MongoDB。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="c1"&gt;# 创建架构决策记录
&lt;/span&gt;&lt;span class="n"&gt;adr_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
标题：订单域采用事件溯源
背景：订单流经 12 个微服务。排查问题需要跨服务关联日志。
       传统 CRUD 会丢失状态转换历史。
决策：在订单域采用事件溯源。将状态变更存储为 PostgreSQL 中的
     不可变事件，通过 CQRS 投射读视图。
后果：
  + 每次状态变更都有完整审计链
  + 可重事件放来重建任意读模型
  - 事件序列化的额外复杂度
  - 需要为超过 1000 个事件的订单设计快照策略
  - 团队培训需要（估计 2 个 Sprint）
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;manage_adr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;orders-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ADR-007：订单域事件溯源&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;adr_content&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ADR 已创建: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; ADR 和代码上下文住在同一个知识图谱中。Agent 以后每次问"你为啥这么做？"都会自动获得回答。Confluence 链接腐烂成为历史。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; &lt;code&gt;manage_adr&lt;/code&gt; 工具在知识图谱内提供架构决策记录的增删改查；图谱支持 17 种边类型，包含 &lt;code&gt;CONFIGURES&lt;/code&gt;、&lt;code&gt;IMPLEMENTS&lt;/code&gt;、&lt;code&gt;TESTS&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #5：跨仓库智能追踪微服务架构
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 排查跨服务 Bug 时，在每个仓库里 grep URL 模式手动追踪。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; 在同一个图谱存储中索引多个仓库。&lt;code&gt;CROSS_*&lt;/code&gt; 边会跨仓库链接节点——API 网关中的路由能映射到后端服务的 handler 函数。3D 图谱 UI 将整个技术栈渲染为多星系可视化。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:27057&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json, text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jsonrpc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools/call&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;params&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="c1"&gt;# 第 1 步：索引 API 网关（自动从 @RequestMapping、@GetMapping 等注解发现 HTTP 路由）
&lt;/span&gt;&lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index_repository&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repo_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/services/api-gateway&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# 第 2 步：索引后端服务（自动从 RestTemplate、fetch 等发现 HTTP 调用点）
&lt;/span&gt;&lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index_repository&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repo_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/services/order-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# 第 3 步：用 get_architecture 获取跨仓库联合架构概览
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_cbm_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_architecture&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;跨仓库联合架构：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 两个仓库都索引完后，你可以追踪请求从网关路由通过 HTTP 调用到后端 handler 的完整链路——在 3D Multi-Galaxy 图谱 UI 中可视化呈现。生产环境出问题时，Agent 不用手动排查就知道该修哪个仓库。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; 跨仓库 &lt;code&gt;CROSS_*&lt;/code&gt; 边支持 REST/gRPC/GraphQL 检测；图谱规模可达 Linux 内核级的 481 万节点、772 万条边；&lt;code&gt;get_architecture&lt;/code&gt; 综合输出服务、路由和依赖关系。&lt;/p&gt;




&lt;h2&gt;
  
  
  总结：5 个隐藏技巧
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cypher 模式检测&lt;/strong&gt; — 表达正则无法触及的多跳结构查询&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Diff 爆炸半径映射&lt;/strong&gt; — 提交前看清精确影响范围，附带风险等级分类&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;团队共享图谱制品&lt;/strong&gt; — 提交 &lt;code&gt;.codebase-memory/graph.db.zst&lt;/code&gt;，队友无需重建索引&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;架构决策记录作为 Agent 记忆&lt;/strong&gt; — ADR 在每次会话中可被 Agent 查询&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;跨仓库智能追踪&lt;/strong&gt; — 索引关联仓库，追踪跨微服务边界的请求链路&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  延伸阅读
&lt;/h2&gt;

&lt;p&gt;如果你喜欢这篇深度文章，或许也会喜欢：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/mempalace-5-hidden-uses-of-the-54k-star-open-source-ai-memory-system-5l6a"&gt;MemPalace 的 5 个隐藏用法：54K Star 的 AI 记忆系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/fastmcp-5-hidden-uses-of-the-25k-star-mcp-framework-most-teams-use-wrong-2j9g"&gt;FastMCP 的 5 个隐藏用法：大多数团队都用错的 MCP Server 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/nanobot-5-hidden-uses-of-the-44k-star-multi-channel-agent-infrastructure-4ena"&gt;Nanobot 的 5 个隐藏用法：多通道 AI Agent 基础设施&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你试过 codebase-memory-mcp 吗？你最惊喜的发现是什么——Cypher 查询终于帮你清理了那片handler 坟场？还是团队共享制品让 CI 速度快了三倍？在评论区分享你的实战故事。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DeerFlow SuperAgent Harness: 5 Hidden Uses of the 74K-Star Open-Source Agent Framework</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Fri, 26 Jun 2026 03:10:33 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-harness-5-hidden-uses-of-the-74k-star-open-source-agent-framework-58mj</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-harness-5-hidden-uses-of-the-74k-star-open-source-agent-framework-58mj</guid>
      <description>&lt;p&gt;What if you could give an AI agent its own filesystem, its own memory, and the ability to spawn parallel workers — all in one open-source harness that just crossed 74,000 GitHub stars? Most teams still treat agents as stateless request-response machines. DeerFlow flips that assumption entirely.&lt;/p&gt;

&lt;p&gt;DeerFlow (bytedance/deer-flow) is an open-source SuperAgent harness from ByteDance with 74,741 Stars and 10,078 Forks on GitHub. It orchestrates sub-agents, persistent memory, sandboxed execution, and extensible skills to handle tasks that take minutes to hours. Version 2.0 is a ground-up rewrite — it once hit #1 on GitHub Trending within a single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2026 Agent Landscape: Why This Matters
&lt;/h2&gt;

&lt;p&gt;In 2026, AI agents are moving from demos to production. But production means state: memory across sessions, isolated execution environments, parallel task decomposition, and integration with messaging platforms where teams actually work. DeerFlow bundles all of this into a single MIT-licensed harness, with Python backends, Node.js gateway support, and a TUI workbench.&lt;/p&gt;

&lt;p&gt;Here are five hidden uses that most developers miss when they first encounter DeerFlow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #1: Skills as Markdown-Based Capability Modules
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; They hard-code tool definitions in their agent config or rely on a fixed set of built-in functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; DeerFlow treats skills as structured Markdown files — &lt;code&gt;SKILL.md&lt;/code&gt; documents that define workflows, best practices, and resource references. Skills load progressively, only when the task needs them, keeping the context window lean. You can activate any skill at runtime with &lt;code&gt;/skill-name&lt;/code&gt;, and even install external &lt;code&gt;.skill&lt;/code&gt; archives through the Gateway.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: Creating a custom skill for API documentation generation
# File: skills/custom/api-docs/SKILL.md
&lt;/span&gt;
&lt;span class="n"&gt;SKILL_CONTENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
---
name: api-docs
description: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate OpenAPI-compatible documentation from code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
version: 1.0.0
---

# API Documentation Skill

## Workflow
1. Scan the target directory for route definitions
2. Extract request/response schemas using AST parsing
3. Generate OpenAPI 3.0 JSON spec
4. Validate with openapi-spec-validator
5. Output to docs/openapi.json

## Best Practices
- Always include example request bodies
- Tag endpoints by resource group
- Mark authentication requirements
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# Install via CLI:
# npx skills add https://github.com/your-org/your-skill-repo --skill api-docs
&lt;/span&gt;
&lt;span class="c1"&gt;# Then activate at runtime:
# /api-docs generate src/routes/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Your agent dynamically loads domain-specific knowledge without bloating the base prompt. A research task loads the research skill; a slide-creation task loads the slide skill. Token usage drops because irrelevant skills never enter the context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; DeerFlow GitHub 74,741 Stars, 10,078 Forks (GitHub API, verified 2026-06-26). Progressive skill loading documented in official README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #2: Isolated Sub-Agent Parallel Decomposition
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; They run a single agent loop for complex tasks, letting context balloon until the model loses track of intermediate results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; DeerFlow's lead agent spawns sub-agents on the fly — each with its own scoped context, tools, and termination conditions. Sub-agents run in parallel, report structured results back, and the lead agent synthesizes everything. Token usage from sub-agents is attributed to the dispatching step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: Research task that fans out into parallel sub-agents
# Using the embedded Python Client
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deerflow.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DeerFlowClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DeerFlowClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# The lead agent decomposes this into sub-agents automatically:
# Sub-agent 1: Research competitor A's pricing
# Sub-agent 2: Research competitor B's features
# Sub-agent 3: Research market trends
# Lead agent: Synthesize into comparison report
&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research-thread-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Create a comparison report of the top 5 AI agent frameworks.
        For each framework, include: star count, core architecture, language,
        unique features, and enterprise readiness. Output as a Markdown table
        with a summary recommendation.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Execution modes: flash (fast), standard, pro (planning), ultra (sub-agents)
# Ultra mode triggers full parallel decomposition
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# "completed"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; A task that would take 30 minutes of sequential agent reasoning completes in under 5 minutes with parallel sub-agents, each working in its own isolated context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; DeerFlow GitHub 74,741 Stars (GitHub API). Sub-agent architecture documented in official README "Sub-Agents" section. HN Algolia search for "deer-flow" returned 15 hits (max 4pts) — community discussion is early-stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #3: Persistent Long-Term Memory Across Sessions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; They pass the entire conversation history as context or use a simple vector database RAG lookup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; DeerFlow builds a persistent memory of your profile, preferences, and accumulated knowledge across sessions. It stores memory locally, deduplicates facts to prevent endless accumulation, and injects relevant context back into future sessions automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: Configuring and using DeerFlow's memory system
# config.yaml
&lt;/span&gt;
&lt;span class="c1"&gt;# The memory system is enabled by default.
# After your first session, DeerFlow remembers:
# - Your preferred output format (Markdown vs HTML)
# - Your technical stack (Python, TypeScript, etc.)
# - Your recurring workflows (weekly reports, code reviews)
# - Your writing style preferences
&lt;/span&gt;
&lt;span class="c1"&gt;# First session:
&lt;/span&gt;&lt;span class="n"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onboarding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I prefer concise bullet-point summaries. My stack is Python + FastAPI + PostgreSQL.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Second session — DeerFlow auto-injects memory:
&lt;/span&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekly-review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this week&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s commits.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# The agent automatically knows: use bullet points, reference FastAPI patterns,
# check PostgreSQL migration files
&lt;/span&gt;
&lt;span class="c1"&gt;# Memory updates skip duplicate facts at apply time,
# so repeated preferences don't accumulate endlessly
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; The agent gets smarter over time without manual context management. After three sessions, it knows your team's coding conventions, preferred report formats, and recurring tasks — no need to re-explain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; DeerFlow GitHub 74,741 Stars (GitHub API). Long-term memory system documented in official README "Long-Term Memory" section. Memory deduplication confirmed in README: "repeated preferences and context do not accumulate endlessly."&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #4: Sandboxed Execution with Claude Code Bridge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; They run agents directly on their host machine or skip code execution entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; DeerFlow supports Docker-based sandboxed execution AND a &lt;code&gt;claude-to-deerflow&lt;/code&gt; skill that lets Claude Code (or Codex, Cursor, Windsurf) interact with a running DeerFlow instance directly from the terminal. You get two agents collaborating: Claude Code for local editing, DeerFlow for long-horizon research and generation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Start DeerFlow (Docker recommended)&lt;/span&gt;
git clone https://github.com/bytedance/deer-flow.git
&lt;span class="nb"&gt;cd &lt;/span&gt;deer-flow
make setup  &lt;span class="c"&gt;# Interactive wizard: choose LLM provider, sandbox mode&lt;/span&gt;
make docker-start

&lt;span class="c"&gt;# Step 2: Install the Claude Code bridge skill&lt;/span&gt;
npx skills add https://github.com/bytedance/deer-flow &lt;span class="nt"&gt;--skill&lt;/span&gt; claude-to-deerflow

&lt;span class="c"&gt;# Step 3: From Claude Code, send tasks to DeerFlow&lt;/span&gt;
&lt;span class="c"&gt;# In Claude Code:&lt;/span&gt;
&lt;span class="c"&gt;# &amp;gt; /claude-to-deerflow "Research the latest developments in AI agent memory &lt;/span&gt;
&lt;span class="c"&gt;#   systems and write a 2000-word technical brief to docs/memory-systems.md"&lt;/span&gt;
&lt;span class="c"&gt;# &amp;gt; /claude-to-deerflow --mode ultra "Analyze all Python files in src/ and &lt;/span&gt;
&lt;span class="c"&gt;#   generate comprehensive API documentation"&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: Check status&lt;/span&gt;
&lt;span class="c"&gt;# &amp;gt; /claude-to-deerflow --status&lt;/span&gt;

&lt;span class="c"&gt;# Execution modes available:&lt;/span&gt;
&lt;span class="c"&gt;# flash    → Fast, single-pass (good for quick lookups)&lt;/span&gt;
&lt;span class="c"&gt;# standard → Default balanced mode&lt;/span&gt;
&lt;span class="c"&gt;# pro      → Planning mode (agent creates execution plan first)&lt;/span&gt;
&lt;span class="c"&gt;# ultra    → Full sub-agent decomposition (for complex multi-step tasks)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; You get the best of both worlds: Claude Code's precise local file editing for implementation, and DeerFlow's parallel sub-agent architecture for research, report generation, and multi-step workflows. The agents communicate over localhost:2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; DeerFlow GitHub 74,741 Stars (GitHub API). &lt;code&gt;claude-to-deerflow&lt;/code&gt; skill documented in official README. Docker sandbox modes (Local/Docker/Kubernetes) confirmed in "Sandbox Mode" section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #5: IM Channel Integration for Async Agent Workflows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; They interact with agents only through a web UI or CLI, checking results manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; DeerFlow supports receiving tasks from Telegram, Slack, Discord, Feishu/Lark, DingTalk, WeChat, and WeCom — no public IP required. Incoming IM messages run under the connected DeerFlow user account, and results stream back to the channel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml — IM Channel Configuration&lt;/span&gt;
&lt;span class="na"&gt;channels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Telegram Bot (easiest setup — long-polling, no webhook needed)&lt;/span&gt;
  &lt;span class="na"&gt;telegram&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;bot_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${TELEGRAM_BOT_TOKEN}"&lt;/span&gt;
    &lt;span class="c1"&gt;# DeerFlow polls Telegram for new messages&lt;/span&gt;

  &lt;span class="c1"&gt;# Slack (Socket Mode — no public endpoint)&lt;/span&gt;
  &lt;span class="na"&gt;slack&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;bot_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${SLACK_BOT_TOKEN}"&lt;/span&gt;
    &lt;span class="na"&gt;app_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${SLACK_APP_TOKEN}"&lt;/span&gt;

  &lt;span class="c1"&gt;# Feishu / Lark (WebSocket)&lt;/span&gt;
  &lt;span class="na"&gt;feishu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${FEISHU_APP_ID}"&lt;/span&gt;
    &lt;span class="na"&gt;app_secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${FEISHU_APP_SECRET}"&lt;/span&gt;

&lt;span class="c1"&gt;# When channel_connections is enabled, logged-in users can bind&lt;/span&gt;
&lt;span class="c1"&gt;# IM channels from the workspace UI sidebar.&lt;/span&gt;
&lt;span class="c1"&gt;# No public IP or provider callback URL needed.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example: A Slack bot that delegates to DeerFlow
# User in Slack: "@deerflow-bot research Q3 AI trends and post to #ai-updates"
&lt;/span&gt;
&lt;span class="c1"&gt;# DeerFlow receives the message, processes it through the agent pipeline,
# and posts the result back to the #ai-updates channel.
&lt;/span&gt;
&lt;span class="c1"&gt;# The agent has full access to:
# - Sub-agent decomposition (parallel research)
# - Sandbox execution (generate charts, save files)
# - Memory (recall user's previous research preferences)
# - Skills (load the "market-research" skill if available)
&lt;/span&gt;
&lt;span class="c1"&gt;# Result: A complete research report posted to Slack in under 3 minutes,
# with charts generated in the sandbox and formatted per user preferences.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Your agent lives where your team lives. No context-switching to a web dashboard. Assign research tasks from your phone, get results in the channel. Perfect for async teams and on-call workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; DeerFlow GitHub 74,741 Stars (GitHub API). IM channels documented in official README "IM Channels" section. Supported channels: Telegram, Slack, Feishu/Lark, WeChat, WeCom, DingTalk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Skills as Markdown modules&lt;/strong&gt; — Progressive loading keeps context lean and makes the agent domain-adaptable without retraining&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolated sub-agent parallel decomposition&lt;/strong&gt; — Fan out complex tasks into parallel workers, each with scoped context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent long-term memory&lt;/strong&gt; — The agent remembers your preferences and accumulates knowledge across sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxed execution + Claude Code bridge&lt;/strong&gt; — Two agents collaborating: local editing meets long-horizon research&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IM channel integration&lt;/strong&gt; — The agent lives in Telegram, Slack, Discord, or Feishu with no public IP required&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have you tried DeerFlow or a similar SuperAgent harness? What's your approach to persistent agent memory and parallel task decomposition? Share your experience in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Related articles:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/headrooms-5-hidden-uses-the-context-compression-layer-that-cuts-ai-agent-token-bills-by-90-5b35"&gt;Headroom's 5 Hidden Uses: The Context Compression Layer That Cuts AI Agent Token Bills by 90%&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/superpowers-agentic-skills-framework-5-hidden-uses-of-the-233k-star-ai-coding-methodology-470d"&gt;Superpowers Agentic Skills Framework: 5 Hidden Uses of the 233K-Star AI Coding Methodology&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/dify-agentic-workflow-platform-5-hidden-uses-of-the-145k-star-open-source-ai-stack-56ai"&gt;Dify Agentic Workflow Platform: 5 Hidden Uses of the 145K-Star Open Source AI Stack&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>DeerFlow SuperAgent 框架：7.4 万 Star 开源 Agent 框架的 5 个隐藏用法</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Fri, 26 Jun 2026 03:10:27 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-kuang-jia-74-mo-star-kai-yuan-agent-kuang-jia-de-5-ge-yin-cang-yong-fa-4mkc</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/deerflow-superagent-kuang-jia-74-mo-star-kai-yuan-agent-kuang-jia-de-5-ge-yin-cang-yong-fa-4mkc</guid>
      <description>&lt;p&gt;如果你能给 AI Agent 一个自己的文件系统、自己的记忆，以及并行派生子 Agent 的能力——而且这一切都在一个开源框架里，刚在 GitHub 上突破 74,000 Star，会怎样？大多数团队仍然把 Agent 当作无状态的请求-响应机器。DeerFlow 彻底颠覆了这个假设。&lt;/p&gt;

&lt;p&gt;DeerFlow（bytedance/deer-flow）是字节跳动开源的 SuperAgent 框架，GitHub 74,741 Star、10,078 Fork。它能编排子 Agent、持久化记忆、沙箱执行和扩展技能（Skills），处理从几分钟到几小时不等的复杂任务。2.0 版本是全新改写——发布当天就冲上了 GitHub Trending 第一名。&lt;/p&gt;

&lt;h2&gt;
  
  
  2026 年 Agent 格局：为什么这很重要
&lt;/h2&gt;

&lt;p&gt;2026 年，AI Agent 正从 Demo 走向生产。但生产级意味着要有状态：跨会话记忆、隔离的执行环境、并行任务分解，以及与团队实际使用的消息平台的集成。DeerFlow 把所有这些都打包进一个 MIT 协议的开源框架里——Python 后端、Node.js Gateway 支持、TUI 终端工作台。&lt;/p&gt;

&lt;p&gt;以下是大多数开发者初次接触 DeerFlow 时最容易忽略的五个隐藏用法。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #1：技能（Skills）即 Markdown 能力模块
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 在 Agent 配置里硬编码工具定义，或依赖一组固定的内置函数。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; DeerFlow 把技能视为结构化的 Markdown 文件——&lt;code&gt;SKILL.md&lt;/code&gt; 文档定义了工作流、最佳实践和资源引用。技能按需渐进式加载，只在任务需要时才加载，保持上下文窗口精简。你可以在运行时通过 &lt;code&gt;/skill-name&lt;/code&gt; 激活任何技能，甚至可以通过 Gateway 安装外部 &lt;code&gt;.skill&lt;/code&gt; 压缩包。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 示例：创建一个自定义技能，用于从代码生成 API 文档
# 文件：skills/custom/api-docs/SKILL.md
&lt;/span&gt;
&lt;span class="n"&gt;SKILL_CONTENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
---
name: api-docs
description: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;从代码生成 OpenAPI 兼容文档&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
version: 1.0.0
---

# API 文档技能

## 工作流
1. 扫描目标目录中的路由定义
2. 使用 AST 解析提取请求/响应 Schema
3. 生成 OpenAPI 3.0 JSON 规范
4. 用 openapi-spec-validator 验证
5. 输出到 docs/openapi.json

## 最佳实践
- 始终包含示例请求体
- 按资源组标记端点
- 标注认证要求
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="c1"&gt;# 通过 CLI 安装：
# npx skills add https://github.com/your-org/your-skill-repo --skill api-docs
&lt;/span&gt;
&lt;span class="c1"&gt;# 运行时激活：
# /api-docs generate src/routes/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; Agent 按需加载领域知识，不会膨胀基础提示词。研究任务加载研究技能，幻灯片创建任务加载幻灯片技能。不相关的技能永远不会进入上下文，Token 消耗显著降低。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; DeerFlow GitHub 74,741 Star、10,078 Fork（GitHub API 验证，2026-06-26）。渐进式技能加载机制在官方 README 中有文档记录。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #2：隔离子 Agent 并行任务分解
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 用单个 Agent 循环处理复杂任务，让上下文膨胀到模型失去对中间结果的追踪。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; DeerFlow 的主 Agent 可以动态生成子 Agent——每个子 Agent 有自己独立的作用域、工具和终止条件。子 Agent 并行运行，将结构化结果汇报回来，主 Agent 将所有内容综合成最终输出。子 Agent 的 Token 消耗会归属到调度步骤。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 示例：研究任务自动扇出到并行子 Agent
# 使用嵌入式 Python Client
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deerflow.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DeerFlowClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DeerFlowClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 主 Agent 自动将任务分解为子 Agent：
# 子 Agent 1：研究竞争对手 A 的定价
# 子 Agent 2：研究竞争对手 B 的功能
# 子 Agent 3：研究市场趋势
# 主 Agent：综合成对比报告
&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research-thread-001&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;创建 Top 5 AI Agent 框架的对比报告。
        每个框架包括：Star 数量、核心架构、编程语言、
        独特功能和企业就绪度。输出为 Markdown 表格
        并附总结推荐。&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 执行模式：flash（快速）、standard（默认）、pro（规划）、ultra（子 Agent）
# Ultra 模式触发完整的并行分解
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# "completed"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 一个原本需要 30 分钟顺序推理的任务，在并行子 Agent 下不到 5 分钟完成——每个子 Agent 在自己的隔离上下文窗口中工作。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; DeerFlow GitHub 74,741 Star（GitHub API）。子 Agent 架构在官方 README "Sub-Agents" 章节有文档。HN Algolia 搜索 "deer-flow" 返回 15 条结果（最高 4 分）——社区讨论处于早期阶段。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #3：跨会话持久化长期记忆
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 把整个对话历史作为上下文传入，或用简单的向量数据库做 RAG 检索。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; DeerFlow 跨会话构建你的用户画像、偏好和积累的知识。记忆存储在本地，自动去重防止重复信息无限积累，并在未来会话中自动注入相关上下文。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 示例：配置和使用 DeerFlow 的记忆系统
# config.yaml
&lt;/span&gt;
&lt;span class="c1"&gt;# 记忆系统默认启用。
# 首次会话后，DeerFlow 会记住：
# - 你偏好的输出格式（Markdown 还是 HTML）
# - 你的技术栈（Python、TypeScript 等）
# - 你的周期性工作流（周报、代码审查）
# - 你的写作风格偏好
&lt;/span&gt;
&lt;span class="c1"&gt;# 第一次会话：
&lt;/span&gt;&lt;span class="n"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onboarding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;我喜欢简洁的项目符号摘要。我的技术栈是 Python + FastAPI + PostgreSQL。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 第二次会话——DeerFlow 自动注入记忆：
&lt;/span&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;thread_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekly-review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;总结本周的提交记录。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Agent 自动知道：用项目符号、参考 FastAPI 模式、
# 检查 PostgreSQL 迁移文件
&lt;/span&gt;
&lt;span class="c1"&gt;# 记忆更新时跳过重复条目的应用，
# 所以重复的偏好不会无限积累
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; Agent 随时间变得更智能，无需手动上下文管理。三次会话后，它就知道你团队的编码规范、偏好的报告格式和周期性任务——不需要重复解释。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; DeerFlow GitHub 74,741 Star（GitHub API）。长期记忆系统在官方 README "Long-Term Memory" 章节有文档。记忆去重机制在 README 中确认："重复的偏好和上下文不会无限积累。"&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #4：沙箱执行 + Claude Code 桥接
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 在主机上直接运行 Agent，或者完全跳过代码执行。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; DeerFlow 支持 Docker 沙箱隔离执行，同时提供 &lt;code&gt;claude-to-deerflow&lt;/code&gt; 技能，让 Claude Code（或 Codex、Cursor、Windsurf）直接从终端与运行中的 DeerFlow 交互。两个 Agent 协作：Claude Code 负责本地编辑，DeerFlow 负责长时间研究和生成。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 第 1 步：启动 DeerFlow（推荐 Docker）&lt;/span&gt;
git clone https://github.com/bytedance/deer-flow.git
&lt;span class="nb"&gt;cd &lt;/span&gt;deer-flow
make setup  &lt;span class="c"&gt;# 交互式向导：选择 LLM 提供商、沙箱模式&lt;/span&gt;
make docker-start

&lt;span class="c"&gt;# 第 2 步：安装 Claude Code 桥接技能&lt;/span&gt;
npx skills add https://github.com/bytedance/deer-flow &lt;span class="nt"&gt;--skill&lt;/span&gt; claude-to-deerflow

&lt;span class="c"&gt;# 第 3 步：从 Claude Code 发送任务给 DeerFlow&lt;/span&gt;
&lt;span class="c"&gt;# 在 Claude Code 中：&lt;/span&gt;
&lt;span class="c"&gt;# &amp;gt; /claude-to-deerflow "研究 AI Agent 记忆系统的最新进展，&lt;/span&gt;
&lt;span class="c"&gt;#   写一份 2000 字的技术简报到 docs/memory-systems.md"&lt;/span&gt;
&lt;span class="c"&gt;# &amp;gt; /claude-to-deerflow --mode ultra "分析 src/ 下所有 Python 文件，&lt;/span&gt;
&lt;span class="c"&gt;#   生成完整的 API 文档"&lt;/span&gt;

&lt;span class="c"&gt;# 第 4 步：检查状态&lt;/span&gt;
&lt;span class="c"&gt;# &amp;gt; /claude-to-deerflow --status&lt;/span&gt;

&lt;span class="c"&gt;# 可用执行模式：&lt;/span&gt;
&lt;span class="c"&gt;# flash    → 快速，单次通过（适合快速查询）&lt;/span&gt;
&lt;span class="c"&gt;# standard → 默认平衡模式&lt;/span&gt;
&lt;span class="c"&gt;# pro      → 规划模式（Agent 先制定执行计划）&lt;/span&gt;
&lt;span class="c"&gt;# ultra    → 完整子 Agent 分解（适合复杂多步任务）&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 两全其美：Claude Code 精确的本地文件编辑用于实现，DeerFlow 的并行子 Agent 架构用于研究、报告生成和多步工作流。两个 Agent 通过 localhost:2026 通信。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; DeerFlow GitHub 74,741 Star（GitHub API）。&lt;code&gt;claude-to-deerflow&lt;/code&gt; 技能在官方 README 有文档。Docker 沙箱模式（本地/Docker/Kubernetes）在 "Sandbox Mode" 章节确认。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #5：IM 频道集成，异步 Agent 工作流
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的做法：&lt;/strong&gt; 只通过 Web UI 或 CLI 与 Agent 交互，手动检查结果。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; DeerFlow 支持从 Telegram、Slack、Discord、飞书、钉钉、微信、企业微信接收任务——无需公网 IP。传入的 IM 消息在连接的 DeerFlow 用户账户下运行，结果自动流回频道。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.yaml — IM 频道配置&lt;/span&gt;
&lt;span class="na"&gt;channels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Telegram Bot（最简单——长轮询，无需 Webhook）&lt;/span&gt;
  &lt;span class="na"&gt;telegram&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;bot_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${TELEGRAM_BOT_TOKEN}"&lt;/span&gt;

  &lt;span class="c1"&gt;# Socket Mode（无需公网端点）&lt;/span&gt;
  &lt;span class="na"&gt;slack&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;bot_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${SLACK_BOT_TOKEN}"&lt;/span&gt;
    &lt;span class="na"&gt;app_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${SLACK_APP_TOKEN}"&lt;/span&gt;

  &lt;span class="c1"&gt;# 飞书（WebSocket）&lt;/span&gt;
  &lt;span class="na"&gt;feishu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${FEISHU_APP_ID}"&lt;/span&gt;
    &lt;span class="na"&gt;app_secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${FEISHU_APP_SECRET}"&lt;/span&gt;

&lt;span class="c1"&gt;# 启用 channel_connections 后，登录用户可以从工作区侧边栏&lt;/span&gt;
&lt;span class="c1"&gt;# 绑定 IM 频道。无需公网 IP 或提供商回调 URL。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 示例：一个委托给 DeerFlow 的 Slack Bot
# Slack 用户："@deerflow-bot 研究 Q3 AI 趋势，发布到 #ai-updates"
&lt;/span&gt;
&lt;span class="c1"&gt;# DeerFlow 接收消息，通过 Agent 流水线处理，
# 将结果发布回 #ai-updates 频道。
&lt;/span&gt;
&lt;span class="c1"&gt;# Agent 拥有完整访问权限：
# - 子 Agent 分解（并行研究）
# - 沙箱执行（生成图表、保存文件）
# - 记忆（调取用户之前的研究偏好）
# - 技能（加载 "market-research" 技能）
&lt;/span&gt;
&lt;span class="c1"&gt;# 效果：3 分钟内完成完整研究报告发布到 Slack，
# 图表在沙箱中生成，按用户偏好格式化。
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; Agent 住在你团队工作的地方。不需要切换到 Web 仪表板。从手机上分配研究任务，结果自动发到频道。非常适合异步团队和 on-call 工作流。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; DeerFlow GitHub 74,741 Star（GitHub API）。IM 频道在官方 README "IM Channels" 章节有文档。支持频道：Telegram、Slack、飞书、微信、企业微信、钉钉。&lt;/p&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Markdown 技能模块&lt;/strong&gt; — 渐进式加载保持上下文精简，让 Agent 无需重新训练即可适配领域知识&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;隔离子 Agent 并行分解&lt;/strong&gt; — 将复杂任务扇出到并行工作者，每个有独立上下文&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;持久化长期记忆&lt;/strong&gt; — Agent 记住你的偏好，跨会话积累知识&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;沙箱执行 + Claude Code 桥接&lt;/strong&gt; — 两个 Agent 协作：本地编辑 + 长时间研究&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IM 频道集成&lt;/strong&gt; — Agent 住在 Telegram、Slack、Discord 或飞书中，无需公网 IP&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;你尝试过 DeerFlow 或类似的 SuperAgent 框架吗？你对持久化 Agent 记忆和并行任务分解有什么做法？欢迎在评论区分享你的经验。&lt;/p&gt;




&lt;p&gt;&lt;em&gt;相关文章：&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/headroom-de-5-ge-yin-cang-yong-fa-rang-ai-agent-token-zhang-dan-kan-diao-90-de-shang-xia-wen-ya-suo-ceng-24ha"&gt;Headroom 的 5 个隐藏用法：让 AI Agent Token 账单砍掉 90% 的上下文压缩层&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/superpowers-agentic-skills-kuang-jia-233-mo-star-ai-bian-cheng-fang-fa-lun-de-5-ge-yin-cang-yong-fa-4m8k"&gt;Superpowers Agentic Skills 框架：23.3 万 Star AI 编程方法论的 5 个隐藏用法&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/dify-de-5-ge-yin-cang-yong-fa-145-mo-star-de-kai-yuan-ai-gong-zuo-liu-ping-tai-3bc1"&gt;Dify 的 5 个隐藏用法：14.5 万 Star 的开源 AI 工作流平台&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>OpenCode's 5 Hidden Uses: The 178K-Star Terminal AI Agent That Swaps Providers Mid-Session</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Thu, 25 Jun 2026 03:06:41 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/opencodes-5-hidden-uses-the-178k-star-terminal-ai-agent-that-swaps-providers-mid-session-2e55</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/opencodes-5-hidden-uses-the-178k-star-terminal-ai-agent-that-swaps-providers-mid-session-2e55</guid>
      <description>&lt;p&gt;What if your terminal AI agent could talk to 30+ LLM providers, run isolated background tasks, load custom plugins from npm, and authenticate to MCP servers — all from a single &lt;code&gt;npm install&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;OpenCode is a 178,218-star open source AI coding agent built in TypeScript. It crossed 1,274 points on Hacker News in March 2026, and its latest release (v1.17.10, June 24 2026) added MCP resource templates, OAuth-bound callbacks, and a new &lt;code&gt;--mini&lt;/code&gt; CLI mode. Most developers use it as a Claude Code alternative in the terminal — but scratch the surface and you'll find a plugin ecosystem, multi-agent architecture, and provider abstraction that go far beyond autocomplete.&lt;/p&gt;

&lt;p&gt;In 2026's landscape of AI coding tools, where Cursor, Claude Code, Codex CLI, and Goose all compete for developer mindshare, OpenCode stands out by being completely open source (MIT license), provider-agnostic (30+ providers including self-hosted), and built around an extensible plugin + skill + MCP architecture. Here are five hidden uses that most people miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #1: Multi-Provider Fallback with Custom Providers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Use OpenCode with a single API key — Anthropic, OpenAI, or whatever they have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; OpenCode's provider plugin system supports 30+ providers out of the box, including Anthropic, OpenAI, Google, DeepSeek, Mistral, Groq, TogetherAI, OpenRouter, GitHub Copilot, GitLab, Snowflake Cortex, and many more. You can configure multiple providers with different models and switch between them mid-session using the &lt;code&gt;/model&lt;/code&gt; command. Even better, you can add custom OpenAI-compatible providers pointing to self-hosted models (Ollama, vLLM, LM Studio).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configure OpenCode with a custom provider for local Ollama&lt;/span&gt;
opencode config &lt;span class="nb"&gt;set &lt;/span&gt;providers.ollama.baseUrl &lt;span class="s2"&gt;"http://localhost:11434/v1"&lt;/span&gt;
opencode config &lt;span class="nb"&gt;set &lt;/span&gt;providers.ollama.models &lt;span class="s1"&gt;'[{"id":"llama3.3","name":"Llama 3.3 70B"}]'&lt;/span&gt;

&lt;span class="c"&gt;# Switch between providers in-session&lt;/span&gt;
&lt;span class="c"&gt;# Just type: /model ollama/llama3.3&lt;/span&gt;
&lt;span class="c"&gt;# Or: /model anthropic/claude-sonnet-4-20250514&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Your coding agent becomes provider-agnostic. When Anthropic rate-limits you, switch to DeepSeek. When you need a cheap model for exploration, use Groq. When you need to run on-prem, point to your Ollama instance — all without leaving the session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; OpenCode GitHub 178,218 Stars, HN 1,274 pts/618 comments (story 47460525), 30+ provider plugins confirmed from repo tree (packages/core/src/plugin/provider/*.ts).&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #2: Plugin Ecosystem — npm Packages as Agent Extensions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Use OpenCode as-is, with its built-in features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; OpenCode has a full plugin system. You can install plugins from npm packages, load custom ones from directories, or write your own. Plugins can add custom agents, commands, providers, and even inject system context. The plugin lifecycle supports installation, loading, hot-reloading, and sandboxing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install a plugin from npm&lt;/span&gt;
opencode plugin &lt;span class="nb"&gt;install&lt;/span&gt; @my-org/opencode-custom-agent

&lt;span class="c"&gt;# Load a local plugin from a directory&lt;/span&gt;
opencode &lt;span class="nt"&gt;--plugin&lt;/span&gt; ./my-custom-plugin/

&lt;span class="c"&gt;# List installed plugins&lt;/span&gt;
opencode plugin list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plugins are written in TypeScript and can register:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom agents (with their own system prompts and tool sets)&lt;/li&gt;
&lt;li&gt;Custom slash commands (e.g., &lt;code&gt;/review-pr&lt;/code&gt;, &lt;code&gt;/deploy-staging&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Custom LLM providers (pointing to any OpenAI-compatible API)&lt;/li&gt;
&lt;li&gt;Custom tools (via MCP server integration)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; You can extend OpenCode with domain-specific capabilities — a &lt;code&gt;/run-migrations&lt;/code&gt; command that knows your database schema, a code-review agent tuned to your team's conventions, or a deployment plugin that wraps your CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; OpenCode v1.17.10 release notes (2026-06-24), plugin system confirmed in repo tree (packages/plugin/src/v2/&lt;em&gt;, packages/core/src/plugin/&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #3: MCP OAuth — Authenticated Tool Use with External Services
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Use MCP servers with either no auth or static API keys pasted into config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; OpenCode supports full MCP OAuth flows. When you connect to an MCP server that requires OAuth (e.g., GitHub, Slack, Jira), OpenCode opens a browser-based OAuth flow, handles the callback on an IPv4 loopback server (bound for security in v1.17.10), and manages token refresh automatically. This means you can use GitHub's MCP server to create issues, read PRs, and manage repositories — all through natural language in your terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add an MCP server with OAuth support&lt;/span&gt;
opencode mcp add github &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.github.com/mcp

&lt;span class="c"&gt;# OpenCode will prompt OAuth login in browser&lt;/span&gt;
&lt;span class="c"&gt;# After auth, you can say:&lt;/span&gt;
&lt;span class="c"&gt;# "Create a PR from my current branch to main with title 'Fix auth bug'"&lt;/span&gt;
&lt;span class="c"&gt;# "List all open issues assigned to me"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Your terminal agent becomes a bridge to external services with proper authentication. No more pasting tokens into config files — OAuth handles it securely with automatic refresh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; OpenCode v1.17.10 release notes — "Bound MCP OAuth callbacks to IPv4 loopback for better local auth reliability" (@he-yufeng), MCP auth system confirmed in packages/opencode/src/mcp/auth.ts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #4: Background Sub-Agents and the Plan/Build Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Use OpenCode's default "build" agent for everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; OpenCode ships with two built-in agents: &lt;strong&gt;build&lt;/strong&gt; (full access, default) and &lt;strong&gt;plan&lt;/strong&gt; (read-only, asks permission before running commands). You switch between them with the Tab key. The plan agent is perfect for exploring unfamiliar codebases, analyzing architecture, or planning refactors — without risk of accidental edits. Additionally, OpenCode supports background sub-agents that run in parallel. You can spawn a &lt;code&gt;@general&lt;/code&gt; sub-agent for complex searches while continuing to code in the main session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start OpenCode&lt;/span&gt;
opencode

&lt;span class="c"&gt;# Press Tab to switch between build and plan agents&lt;/span&gt;
&lt;span class="c"&gt;# In plan agent: "Analyze the authentication flow in this codebase"&lt;/span&gt;
&lt;span class="c"&gt;# In build agent: "Refactor the auth module to use the new token format"&lt;/span&gt;

&lt;span class="c"&gt;# Spawn a sub-agent for background work&lt;/span&gt;
&lt;span class="c"&gt;# Type: @general search for all TODO items related to error handling&lt;/span&gt;
&lt;span class="c"&gt;# Continue coding while sub-agent works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; The plan agent acts as a safe exploration mode — you can hand it to a junior developer or use it in CI pipelines where you want analysis without modifications. Background sub-agents let you parallelize research and coding, effectively turning your terminal into a multi-agent workspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; OpenCode README (dev branch) — "build agent (full-access) / plan agent (read-only, asks permission)", HN 319pts story "Opencode: AI coding agent, built for the terminal" (id 44482504).&lt;/p&gt;

&lt;h2&gt;
  
  
  Hidden Use #5: Skills System — Reusable Prompt Templates as Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What most people do:&lt;/strong&gt; Type the same instructions repeatedly ("write tests", "review this PR", "check for security issues").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden trick:&lt;/strong&gt; OpenCode has a built-in skills system. Skills are markdown files (&lt;code&gt;.md&lt;/code&gt;) stored in &lt;code&gt;.opencode/skills/&lt;/code&gt; that define reusable prompt templates. You can invoke them with &lt;code&gt;/skill-name&lt;/code&gt;, and they support frontmatter configuration for customization. OpenCode ships with built-in skills like &lt;code&gt;customize-opencode&lt;/code&gt; and &lt;code&gt;effect&lt;/code&gt;, and you can create your own.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# .opencode/skills/review-security.md
---
&lt;/span&gt;name: review-security
description: "Security-focused code review"
&lt;span class="gh"&gt;tools: [read, list, grep]
---
&lt;/span&gt;
Review the current file for security vulnerabilities:
&lt;span class="p"&gt;1.&lt;/span&gt; Check for SQL injection patterns
&lt;span class="p"&gt;2.&lt;/span&gt; Look for hardcoded secrets or API keys
&lt;span class="p"&gt;3.&lt;/span&gt; Verify input validation on all user-facing endpoints
&lt;span class="p"&gt;4.&lt;/span&gt; Flag any use of eval() or dynamic imports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Invoke the custom skill&lt;/span&gt;
/review-security

&lt;span class="c"&gt;# Or use built-in skills&lt;/span&gt;
/customize-opencode  &lt;span class="c"&gt;# OpCode's own configuration wizard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; Skills turn repeated instructions into shareable, version-controlled templates. Your team can maintain a library of skills in the repo, and every developer on the team gets the same consistent behavior — no more copy-pasting prompts or forgetting steps in code reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; OpenCode repo tree — &lt;code&gt;.opencode/skills/effect/SKILL.md&lt;/code&gt;, &lt;code&gt;packages/core/src/skill/*&lt;/code&gt;, &lt;code&gt;packages/opencode/src/skill/discovery.ts&lt;/code&gt;, v1.17.10 release notes mentioning skill base directories.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary: 5 Hidden Uses of OpenCode
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Provider Fallback&lt;/strong&gt; — Switch between 30+ LLM providers mid-session, including self-hosted models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Ecosystem&lt;/strong&gt; — Extend the agent with npm packages, custom agents, and domain-specific commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP OAuth&lt;/strong&gt; — Authenticate to external services (GitHub, Slack, Jira) via browser-based OAuth flows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan/Build Architecture&lt;/strong&gt; — Use read-only plan agents for safe exploration and background sub-agents for parallel work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills System&lt;/strong&gt; — Create reusable, version-controlled prompt templates for consistent team workflows&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Previously on This Series
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this article, check out previous entries in the "5 Hidden Uses" series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/headrooms-5-hidden-uses-the-context-compression-layer-that-cuts-ai-agent-token-bills-by-90-5b35"&gt;Headroom's 5 Hidden Uses: Context Compression Layer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/pydantic-ai-agent-frameworks-5-hidden-uses-21f3"&gt;Pydantic AI Agent Framework's 5 Hidden Uses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/superpowers-agentic-skills-framework-5-hidden-uses-of-the-233k-star-ai-coding-methodology-470d"&gt;Superpowers Agentic Skills Framework: 5 Hidden Uses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Have you discovered a hidden use for OpenCode — a plugin, skill, or workflow that most people don't know about? Drop it in the comments below!&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OpenCode 的 5 个隐藏用法：17.8 万 Star 终端 AI 代理，会话中随意切换提供商</title>
      <dc:creator>韩</dc:creator>
      <pubDate>Thu, 25 Jun 2026 03:06:35 +0000</pubDate>
      <link>https://dev.to/_cbd692d476c5faf3b61bcf/opencode-de-5-ge-yin-cang-yong-fa-178-mo-star-zhong-duan-ai-dai-li-hui-hua-zhong-sui-yi-qie-huan-ti-gong-shang-2015</link>
      <guid>https://dev.to/_cbd692d476c5faf3b61bcf/opencode-de-5-ge-yin-cang-yong-fa-178-mo-star-zhong-duan-ai-dai-li-hui-hua-zhong-sui-yi-qie-huan-ti-gong-shang-2015</guid>
      <description>&lt;p&gt;你知道吗？你的终端 AI 代理其实可以无缝切换 30+ 个 LLM 提供商、运行隔离的后台任务、从 npm 加载自定义插件，还能通过 OAuth 认证连接 GitHub 和 Slack —— 这一切只需一次 &lt;code&gt;npm install&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;OpenCode 是一个拥有 178,218 Stars 的开源 AI 编程代理，用 TypeScript 构建。它在 2026 年 3 月突破了 1,274 票的程序员新闻（Hacker News）讨论度，最新版本（v1.17.10，2026 年 6 月 24 发布）新增了 MCP 资源模板、OAuth 绑定回调和新版 &lt;code&gt;--mini&lt;/code&gt; CLI 模式。大多数人把它当作终端里的 Claude Code 替代品 —— 但深入了解后你会发现，它的插件生态、多代理架构和提供商抽象层远超普通自动补全工具。&lt;/p&gt;

&lt;p&gt;在 2026 年 AI 编程工具的格局中，Cursor、Claude Code、Codex CLI 和 Goose 都在争夺开发者的注意力。OpenCode 之所以脱颖而出，是因为它采用 MIT 完全开源、提供商无关（支持 30+ 提供商包括自托管）、并围绕可扩展的插件 + 技能 + MCP 架构搭建。以下是大多数人忽略的五个隐藏用法。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #1：多提供商故障转移 + 自定义提供商
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 只用单个 API 密钥 —— Anthropic 或 OpenAI。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; OpenCode 的提供商插件系统原生支持 30+ 提供商，包括 Anthropic、OpenAI、Google、DeepSeek、Mistral、Groq、TogetherAI、OpenRouter、GitHub Copilot、GitLab、Snowflake Cortex 等。你可以配置多个提供商和不同模型，用 &lt;code&gt;/model&lt;/code&gt; 命令在会话中随时切换。更妙的是，你可以添加指向自托管模型的自定义 OpenAI 兼容提供商（Ollama、vLLM、LM Studio）。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 配置 OpenCode 连接本地 Ollama 提供商&lt;/span&gt;
opencode config &lt;span class="nb"&gt;set &lt;/span&gt;providers.ollama.baseUrl &lt;span class="s2"&gt;"http://localhost:11434/v1"&lt;/span&gt;
opencode config &lt;span class="nb"&gt;set &lt;/span&gt;providers.ollama.models &lt;span class="s1"&gt;'[{"id":"llama3.3","name":"Llama 3.3 70B"}]'&lt;/span&gt;

&lt;span class="c"&gt;# 在会话中切换提供商&lt;/span&gt;
&lt;span class="c"&gt;# 输入: /model ollama/llama3.3&lt;/span&gt;
&lt;span class="c"&gt;# 或者: /model anthropic/claude-sonnet-4-20250514&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 你的编程代理变成了提供商无关的。当 Anthropic 触发速率限制时，切换到 DeepSeek。需要便宜的探索模型时，用 Groq。需要在本地部署时，指向 Ollama 实例 —— 所有操作都不需要离开当前会话。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; OpenCode GitHub 178,218 Stars，HN 1,274 pts/618 评论（story 47460525），30+ 提供商插件从仓库目录树确认（packages/core/src/plugin/provider/*.ts）。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #2：插件生态 —— 用 npm 包扩展代理能力
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 直接用 OpenCode 的内置功能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; OpenCode 拥有完整的插件系统。你可以从 npm 包安装插件，从目录加载自定义插件，或自己编写。插件可以添加自定义代理、命令、提供商、甚至注入系统上下文。插件生命周期支持安装、加载、热重载和沙箱隔离。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 从 npm 安装插件&lt;/span&gt;
opencode plugin &lt;span class="nb"&gt;install&lt;/span&gt; @my-org/opencode-custom-agent

&lt;span class="c"&gt;# 从本地目录加载插件&lt;/span&gt;
opencode &lt;span class="nt"&gt;--plugin&lt;/span&gt; ./my-custom-plugin/

&lt;span class="c"&gt;# 列出已安装插件&lt;/span&gt;
opencode plugin list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;插件用 TypeScript 编写，可以注册：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;自定义代理（拥有独立系统提示和工具集）&lt;/li&gt;
&lt;li&gt;自定义斜杠命令（如 &lt;code&gt;/review-pr&lt;/code&gt;、&lt;code&gt;/deploy-staging&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;自定义 LLM 提供商（指向任意 OpenAI 兼容 API）&lt;/li&gt;
&lt;li&gt;自定义工具（通过 MCP 服务器集成）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 你可以用领域特定能力扩展 OpenCode —— 一个了解数据库架构的 &lt;code&gt;/run-migrations&lt;/code&gt; 命令、一个针对你团队规范调整过的代码审查代理、或一个封装 CI/CD 工具的部署插件。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; OpenCode v1.17.10 发布说明（2026-06-24），插件系统从仓库目录树确认（packages/plugin/src/v2/&lt;em&gt;, packages/core/src/plugin/&lt;/em&gt;）。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #3：MCP OAuth —— 与外部服务的认证工具调用
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 使用没有认证或静态 API 密钥直接粘贴到配置的 MCP 服务器。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; OpenCode 支持完整的 MCP OAuth 流程。当你连接需要 OAuth 的 MCP 服务器（如 GitHub、Slack、Jira）时，OpenCode 会打开浏览器进行 OAuth 认证，在 IPv4 回环服务器上处理回调（v1.17.10 中为安全起见绑定），并自动管理令牌刷新。这意味着你可以通过自然语言在终端中使用 GitHub 的 MCP 服务器来创建 Issue、阅读 PR 和管理仓库。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 添加支持 OAuth 的 MCP 服务器&lt;/span&gt;
opencode mcp add github &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.github.com/mcp

&lt;span class="c"&gt;# OpenCode 会在浏览器中提示 OAuth 登录&lt;/span&gt;
&lt;span class="c"&gt;# 认证后，你可以说：&lt;/span&gt;
&lt;span class="c"&gt;# "从当前分支创建一个标题为 'Fix auth bug' 的 PR 到 main"&lt;/span&gt;
&lt;span class="c"&gt;# "列出所有分配给我的未关闭 Issue"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 你的终端代理成为了连接外部服务的桥梁，拥有正确的认证机制。不再需要在配置文件中粘贴令牌 —— OAuth 安全地处理一切，并自动刷新。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; OpenCode v1.17.10 发布说明 —— "将 MCP OAuth 回调绑定到 IPv4 回环以提高本地认证可靠性"（@he-yufeng），MCP 认证系统见 packages/opencode/src/mcp/auth.ts。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #4：规划/构建双代理架构 + 后台子代理
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 一直用默认的 "build" 代理做所有事。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; OpenCode 内置两个代理：&lt;strong&gt;build&lt;/strong&gt;（完全访问权限，默认）和 &lt;strong&gt;plan&lt;/strong&gt;（只读模式，运行命令前请求权限）。你可以用 Tab 键在它们之间切换。Plan 代理非常适合探索不熟悉的代码库、分析架构或规划重构 —— 而且不会有意外编辑的风险。此外，OpenCode 支持后台并行运行的子代理。你可以派一个 &lt;code&gt;@general&lt;/code&gt; 子代理做复杂搜索，同时继续在主会话中写代码。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 启动 OpenCode&lt;/span&gt;
opencode

&lt;span class="c"&gt;# 按 Tab 切换 build 和 plan 代理&lt;/span&gt;
&lt;span class="c"&gt;# 在 plan 代理中: "分析这个代码库的认证流程"&lt;/span&gt;
&lt;span class="c"&gt;# 在 build 代理中: "重构 auth 模块使用新的 token 格式"&lt;/span&gt;

&lt;span class="c"&gt;# 派后台子代理做并行工作&lt;/span&gt;
&lt;span class="c"&gt;# 输入: @general 搜索所有与错误处理相关的 TODO 项&lt;/span&gt;
&lt;span class="c"&gt;# 子代理工作时你继续写代码&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; Plan 代理充当安全的探索模式 —— 你可以把它交给初级开发者，或在 CI 管道中使用（只需要分析不需要修改）。后台子代理让你能并行进行研究和编码，有效地将终端变成多代理工作空间。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; OpenCode README（dev 分支）—— "build 代理（完全访问）/ plan 代理（只读，请求权限）"，HN 319pts 讨论 "Opencode: AI coding agent, built for the terminal"（id 44482504）。&lt;/p&gt;

&lt;h2&gt;
  
  
  隐藏用法 #5：技能系统 —— 用可复用的提示模板替代重复输入
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;大多数人的用法：&lt;/strong&gt; 反复输入相同的指令（"写测试"、"审查这个 PR"、"检查安全问题"）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隐藏技巧：&lt;/strong&gt; OpenCode 拥有内置的技能系统。技能是存放在 &lt;code&gt;.opencode/skills/&lt;/code&gt; 中的 Markdown 文件（&lt;code&gt;.md&lt;/code&gt;），定义可复用的提示模板。你调用 &lt;code&gt;/skill-name&lt;/code&gt; 即可使用，它们支持前置元数据配置以便自定义。OpenCode 内置了 &lt;code&gt;customize-opencode&lt;/code&gt; 和 &lt;code&gt;effect&lt;/code&gt; 等技能，你也可以创建自己的。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# .opencode/skills/review-security.md
---
&lt;/span&gt;name: review-security
description: "安全导向的代码审查"
&lt;span class="gh"&gt;tools: [read, list, grep]
---
&lt;/span&gt;
审查当前文件的安全漏洞：
&lt;span class="p"&gt;1.&lt;/span&gt; 检查 SQL 注入模式
&lt;span class="p"&gt;2.&lt;/span&gt; 查找硬编码的密钥或 API 密钥
&lt;span class="p"&gt;3.&lt;/span&gt; 验证所有面向用户的端点的输入校验
&lt;span class="p"&gt;4.&lt;/span&gt; 标记任何 eval() 或动态导入的使用
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 调用自定义技能&lt;/span&gt;
/review-security

&lt;span class="c"&gt;# 或使用内置技能&lt;/span&gt;
/customize-opencode  &lt;span class="c"&gt;# OpenCode 自己的配置向导&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 技能将重复的指令变成可分享、版本控制的模板。你的团队可以在仓库中维护一套技能库，团队中的每个开发者都能获得一致的行为 —— 不再需要复制粘贴提示词或在代码审查中遗漏步骤。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据来源：&lt;/strong&gt; OpenCode 仓库目录树 —— &lt;code&gt;.opencode/skills/effect/SKILL.md&lt;/code&gt;，&lt;code&gt;packages/core/src/skill/*&lt;/code&gt;，&lt;code&gt;packages/opencode/src/skill/discovery.ts&lt;/code&gt;，v1.17.10 发布说明中提到技能基础目录。&lt;/p&gt;




&lt;h2&gt;
  
  
  总结：OpenCode 的 5 个隐藏用法
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;多提供商故障转移&lt;/strong&gt; —— 在 30+ LLM 提供商之间随时切换，包括自托管模型&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;插件生态&lt;/strong&gt; —— 用 npm 包、自定义代理和领域特定命令扩展代理能力&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP OAuth&lt;/strong&gt; —— 通过浏览器 OAuth 流程认证外部服务（GitHub、Slack、Jira）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;规划/构建架构&lt;/strong&gt; —— 用只读规划代理安全探索，用后台子代理并行工作&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;技能系统&lt;/strong&gt; —— 创建可复用、版本控制的提示模板，实现团队一致的工作流&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  系列回顾
&lt;/h2&gt;

&lt;p&gt;如果你喜欢这篇文章，欢迎阅读"5 个隐藏用法"系列的前作：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/headroom-de-5-ge-yin-cang-yong-fa-rang-ai-agent-token-zhang-dan-kan-diao-90-de-shang-xia-wen-ya-suo-ceng-24ha"&gt;Headroom 的 5 个隐藏用法：上下文压缩层&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/pydantic-ai-de-5-ge-yin-cang-yong-fa-lei-xing-an-quan-de-agent-kuang-jia-451k"&gt;Pydantic AI 代理框架的 5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/_cbd692d476c5faf3b61bcf/superpowers-agentic-skills-kuang-jia-233-mo-star-ai-bian-cheng-fang-fa-lun-de-5-ge-yin-cang-yong-fa-4m8k"&gt;Superpowers Agentic Skills 框架：5 个隐藏用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;你有没有发现 OpenCode 的隐藏用法 —— 一个插件、技能或大多数人不知道的工作流？欢迎在评论区分享！&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
