<?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: noear</title>
    <description>The latest articles on DEV Community by noear (@noear).</description>
    <link>https://dev.to/noear</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3732237%2F72176a7d-a67c-44d0-8157-b86381ad05f5.jpeg</url>
      <title>DEV Community: noear</title>
      <link>https://dev.to/noear</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/noear"/>
    <language>en</language>
    <item>
      <title>Snack4 JSON Streaming Parser &amp; Auto-Repair Deep Guide</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Wed, 18 Mar 2026 05:40:57 +0000</pubDate>
      <link>https://dev.to/noear/snack4-json-streaming-parser-auto-repair-deep-guide-5ccg</link>
      <guid>https://dev.to/noear/snack4-json-streaming-parser-auto-repair-deep-guide-5ccg</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/noear/snackjson" rel="noopener noreferrer"&gt;Snack4&lt;/a&gt; is a high-performance Java JSON library designed for demanding scenarios. Its core component &lt;code&gt;JsonReader&lt;/code&gt; uses a non-recursive state machine architecture, natively supporting &lt;strong&gt;Streaming Parse&lt;/strong&gt; and &lt;strong&gt;Auto-Repair&lt;/strong&gt;, making it ideal for handling unstable LLM outputs and large NDJSON files.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Streaming Parse: From Bulk to Incremental
&lt;/h2&gt;

&lt;p&gt;Traditional parsers require JSON to be complete and loaded into memory at once. Snack4 supports extracting valid data in chunks (Nodes) while the data is flowing.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Core Scenarios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM Real-time Rendering&lt;/strong&gt;: Parse while generating, update UI without waiting for the conversation to end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NDJSON/JSONL&lt;/strong&gt;: Process multi-line JSON objects from log streams or database exports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low Memory Processing&lt;/strong&gt;: When processing GB-level files, memory usage stays at KB-level buffer size.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2 Key APIs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;JsonReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JsonReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonStream&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Method A: Iterator pattern (recommended, most elegant syntax)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;iterableNext&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Method B: Precisely get the last complete node (commonly used for LLM final state)&lt;/span&gt;
&lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;finalState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLast&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Method C: Manual chunked reading control&lt;/span&gt;
&lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readNext&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// business logic&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Auto-Repair: Fault Tolerance at Its Best
&lt;/h2&gt;

&lt;p&gt;When &lt;code&gt;Feature.Read_AutoRepair&lt;/code&gt; is enabled, &lt;code&gt;JsonReader&lt;/code&gt; transforms from a "strict validator" into a "smart completer". By maintaining an internal type stack, it automatically infers missing symbols when encountering unexpected endings.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Repair Logic Reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Damage Type&lt;/th&gt;
&lt;th&gt;Original Input (Broken)&lt;/th&gt;
&lt;th&gt;Repaired Output&lt;/th&gt;
&lt;th&gt;Repair Logic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keyword Truncation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"status": tru&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"status": true}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Incomplete &lt;code&gt;true&lt;/code&gt; literal auto-repaired to &lt;code&gt;true&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unclosed Container&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"a":{"b":1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"a":{"b":1}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-completes missing &lt;code&gt;}&lt;/code&gt; based on parsing stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trailing Comma&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 2,&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 2]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Automatically ignores trailing comma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing Key-Value&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"key":&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"key": null}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Found colon then directly ended, auto-completes value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invalid Character Interference&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"a":1} #comment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"a":1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Works with Read_AllowComment to filter non-JSON content&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2.2 Code Demo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Even deeply nested and severely truncated strings&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;brokenJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"{\"user\":{\"tags\":[\"java\",\"ai\""&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 

&lt;span class="nc"&gt;Options&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Read_AutoRepair&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;JsonReader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brokenJson&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toJson&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// Output: {"user":{"tags":["java","ai"]}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Advanced: Best Practices for Handling LLM Mixed Output
&lt;/h2&gt;

&lt;p&gt;LLMs sometimes output text followed by a JSON, or multiple separate JSON blocks. Using Snack4's combination features, you can easily handle these complex scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Mixed Stream Parse Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleLlmStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;rawOutput&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Enable auto-repair + allow single quotes (increased robustness)&lt;/span&gt;
    &lt;span class="nc"&gt;Options&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Read_AutoRepair&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Feature&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Read_AllowSingleQuotes&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;JsonReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JsonReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rawOutput&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Auto-filter non-valid JSON parts from stream (like leading text)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;iterableNext&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isObject&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Only process structured data&lt;/span&gt;
            &lt;span class="n"&gt;dispatchToBusiness&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Streaming &amp;amp; Auto-Repair&lt;/th&gt;
&lt;th&gt;Normal Mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Parse Method&lt;/td&gt;
&lt;td&gt;Streaming pointer sliding, continuously parsing json chunks&lt;/td&gt;
&lt;td&gt;Parses only one json chunk, throws exception for extras&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exception Handling&lt;/td&gt;
&lt;td&gt;Auto-repairs, no exceptions thrown&lt;/td&gt;
&lt;td&gt;Throws ParseException on missing colon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM Adaptation&lt;/td&gt;
&lt;td&gt;Natively supports truncation, keyword repair&lt;/td&gt;
&lt;td&gt;Requires developers to write regex or preprocessing (non-compliant throws ParseException)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By combining &lt;strong&gt;Streaming Parse&lt;/strong&gt; with &lt;strong&gt;Auto-Repair&lt;/strong&gt;, Snack4 provides developers with a robust data defense line, ensuring that no matter how bad the upstream data is, downstream business logic receives stable structured objects.&lt;/p&gt;

</description>
      <category>json</category>
      <category>jsonpath</category>
      <category>jsonschema</category>
      <category>java</category>
    </item>
    <item>
      <title>Snack4-JsonPath v4.0.36 Released (IETF RFC 9535 Standard Support)</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Fri, 13 Mar 2026 01:48:37 +0000</pubDate>
      <link>https://dev.to/noear/snack4-jsonpath-v4036-released-ietf-rfc-9535-standard-support-2402</link>
      <guid>https://dev.to/noear/snack4-jsonpath-v4036-released-ietf-rfc-9535-standard-support-2402</guid>
      <description>&lt;p&gt;Provides JSON DOM construction, encoding/decoding (serialization), retrieval, JsonPath queries, JsonSchema validation, and more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.noear&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;snack4-jsonpath&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.0.36&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Snack-JsonPath draws inspiration from JavaScript's &lt;code&gt;var&lt;/code&gt; declaration for all variables and XML DOM's "everything is a Node" design philosophy. All underlying data is represented as &lt;code&gt;ONode&lt;/code&gt;, which stands for "One node" - capable of representing any type and converting to any type.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emphasizes document tree construction and manipulation capabilities&lt;/li&gt;
&lt;li&gt;High-performance JSON Path queries (significantly faster than jayway.jsonpath). Compatible with both &lt;code&gt;jayway.jsonpath&lt;/code&gt; and the &lt;a href="https://www.rfc-editor.org/rfc/rfc9535.html" rel="noopener noreferrer"&gt;IETF JSONPath (RFC 9535) standard&lt;/a&gt; (switchable via &lt;code&gt;options&lt;/code&gt;). Delivering a robust JsonPath experience for the next decade.&lt;/li&gt;
&lt;li&gt;Supports &lt;code&gt;Json schema&lt;/code&gt; validation&lt;/li&gt;
&lt;li&gt;Supports partial &lt;code&gt;json5&lt;/code&gt; features (unquoted keys, comments, etc.)&lt;/li&gt;
&lt;li&gt;Prioritizes no-argument constructors + field encoding/decoding (reduces risks of injection-triggered actions)&lt;/li&gt;
&lt;li&gt;Supports Java 8 to Java 25&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dependency packages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;org.noear:snack4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides &lt;code&gt;json dom&lt;/code&gt; construction and encoding/decoding support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;org.noear:snack4-jsonpath&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides &lt;code&gt;json path&lt;/code&gt; query support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;org.noear:snack4-jsonschema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provides &lt;code&gt;json schema&lt;/code&gt; validation support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Open source repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gitee.com/noear/snackjson" rel="noopener noreferrer"&gt;https://gitee.com/noear/snackjson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/noear/snackjson" rel="noopener noreferrer"&gt;https://github.com/noear/snackjson&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://solon.noear.org/article/snack" rel="noopener noreferrer"&gt;https://solon.noear.org/article/snack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Recent Updates
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; Json Feature.Read_TrimString feature&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; JsonReader.iterableNext method (supports JSON streaming, particularly adapted for LLM stream output)&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; JsonReader.readLast method&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; ONode field type deserialization support&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; custom annotation retrieval support&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; Options.then method for chained building&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; CodecLib.patternCreators, patternDecoders, patternEncoders deduplication handling&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; MapperLib.schemaPatternMappers, typePatternMappers deduplication handling&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; AtomicBoolean, AtomicLong, AtomicInteger support&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; Optional built-in codec support (also customizable)&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4&lt;/code&gt; ONode:delete method to assist with jsonpath deletion&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4-jsonschema&lt;/code&gt; JsonSchema default value generation&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;snack4-jsonschema&lt;/code&gt; type mapping mechanism, supporting wrapper or delivery types like Future, Optional&lt;/li&gt;
&lt;li&gt;Optimized &lt;code&gt;snack4&lt;/code&gt; Iterable support (replacing previous Collection)&lt;/li&gt;
&lt;li&gt;Optimized &lt;code&gt;snack4&lt;/code&gt; deserialization to automatically remove '@type' property declaration&lt;/li&gt;
&lt;li&gt;Optimized &lt;code&gt;snack4-jsonpath&lt;/code&gt; logical expression compatibility to support space-less "a=='a'"&lt;/li&gt;
&lt;li&gt;Optimized &lt;code&gt;snack4-jsonschema&lt;/code&gt; Optional type handling&lt;/li&gt;
&lt;li&gt;Changed &lt;code&gt;snack4&lt;/code&gt; JsonReader.streamRead to readNext (former marked as deprecated)&lt;/li&gt;
&lt;li&gt;Changed &lt;code&gt;snack4-jsonpath&lt;/code&gt; JsonPath.delete to return bool (previously void)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;snack4&lt;/code&gt; ONode.ofBean and ofJson throwing exception when passed null&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;snack4&lt;/code&gt; Json BeanDecoder not restoring array.item when null (incorrectly filtered)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;snack4-jsonschema&lt;/code&gt; JsonSchema TypeRule.getSchemaTypeName not recognizing initial node as null (was recognized as undefined)&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;snack4-jsonpath&lt;/code&gt; JsonPathProvider:delete(root, path) out-of-bounds issue when deleting multiple array indexes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. JSONPath Syntax Reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Syntax Element&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Root node identifier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current node identifier (valid only in filter selectors)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[&amp;lt;selectors&amp;gt;]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Child segment: selects zero or more child nodes of a node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shorthand for &lt;code&gt;['name']&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shorthand for &lt;code&gt;[*]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;..[&amp;lt;selectors&amp;gt;]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Descendant segment: selects zero or more descendants of a node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;..name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shorthand for &lt;code&gt;..['name']&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;..*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shorthand for &lt;code&gt;..[*]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'name'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Name selector: selects named child of an object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wildcard selector: selects all children of a node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Index selector: selects array index item (0-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0:100:5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Array slice selector: &lt;code&gt;start:end:step&lt;/code&gt; for arrays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&amp;lt;logical-expr&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filter selector: selects specific items using logical expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fun(@.foo)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filter function: calls function in filter expression (IETF standard)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.fun()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aggregate function: used as a segment (jayway style)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Filter selector syntax reference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Syntax&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Precedence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Grouping&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Function extension&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logical &lt;code&gt;NOT&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;==&lt;/code&gt;,&lt;code&gt;!=&lt;/code&gt;,&lt;code&gt;&amp;lt;&lt;/code&gt;,&lt;code&gt;&amp;lt;=&lt;/code&gt;,&lt;code&gt;&amp;gt;&lt;/code&gt;,&lt;code&gt;&amp;gt;=&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Relational comparison operators&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logical &lt;code&gt;AND&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`\&lt;/td&gt;
&lt;td&gt;\&lt;/td&gt;
&lt;td&gt;`&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;IETF JSONPath (RFC 9535) Standard Defined Operators (Supported)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;==&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left equals right (note: 1 does not equal '1')&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.a == 1)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left does not equal right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.a != 1)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left is less than right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.a &amp;lt; 1)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left is less than or equal to right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.a &amp;lt;= 1)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left is greater than right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.a &amp;gt; 1)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left is greater than or equal to right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.a &amp;gt;= 1)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;jayway.jsonpath Extended Operators (Supported)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;=~&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left matches regex&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[?(@.s =~ /foo.*?/i)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;in&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left exists in right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[?(@.s in ['S', 'M'])]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left does not exist in right&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;subsetof&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left is a subset of right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[?(@.s subsetof ['S', 'M', 'L'])]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;anyof&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left has at least one intersection with right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[?(@.s anyof ['M', 'L'])]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;noneof&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left has no intersection with right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[?(@.s noneof ['M', 'L'])]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left (array or string) size should match right&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.s size @.expected_size)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;empty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Left (array or string) should be empty&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$[?(@.s empty false)]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;IETF JSONPath (RFC 9535) Standard Defined Functions (Supported)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Parameter Type&lt;/th&gt;
&lt;th&gt;Result Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;length(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Length of string, array, or object&lt;/td&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;count(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Size of node list&lt;/td&gt;
&lt;td&gt;Node List&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;match(x,y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Regex full match&lt;/td&gt;
&lt;td&gt;Value, Value&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search(x,y)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Regex substring match&lt;/td&gt;
&lt;td&gt;Value, Value&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;value(x)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Value of single node in node list&lt;/td&gt;
&lt;td&gt;Node List&lt;/td&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;jayway.jsonpath Functions (Supported)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Output Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;length()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Length of string, array, or object&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;min()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find minimum value in current numeric array&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find maximum value in current numeric array&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;avg()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Calculate average of current numeric array&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stddev()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Calculate standard deviation of current numeric array&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sum()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Calculate sum of current numeric array&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keys()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get property key set of current object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Set&amp;lt;E&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;concat(X)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Concatenate an item or collection with current array into new array&lt;/td&gt;
&lt;td&gt;like input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;append(X)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Append an item or collection to current path's output array&lt;/td&gt;
&lt;td&gt;like input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;first()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Return first element of current array&lt;/td&gt;
&lt;td&gt;Depends on array element type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;last()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Return last element of current array&lt;/td&gt;
&lt;td&gt;Depends on array element type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index(X)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Return element at index X in current array. X can be negative (counting from end)&lt;/td&gt;
&lt;td&gt;Depends on array element type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>java</category>
      <category>json</category>
      <category>jsonpath</category>
    </item>
    <item>
      <title>Breathing Soul into AI: How to Implement a Self-Reflecting Long-Term Memory System in Java AI</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:41:03 +0000</pubDate>
      <link>https://dev.to/noear/breathing-soul-into-ai-how-to-implement-a-self-reflecting-long-term-memory-system-in-java-ai-19lh</link>
      <guid>https://dev.to/noear/breathing-soul-into-ai-how-to-implement-a-self-reflecting-long-term-memory-system-in-java-ai-19lh</guid>
      <description>&lt;p&gt;In the world of AI Agents, there is a famous saying: "An Agent without memory is just a sophisticated function; an Agent with memory has a soul."&lt;/p&gt;

&lt;p&gt;However, implementing a memory system in the Java ecosystem that truly possesses "self-evolving" capabilities is no easy feat. This article provides a deep dive into how to build a long-term memory component capable of extraction, consolidation, pruning, and retrieval based on the &lt;strong&gt;Solon AI&lt;/strong&gt; framework and inspired by the core concepts of the &lt;strong&gt;MemSkill&lt;/strong&gt; paper.&lt;/p&gt;

&lt;h3&gt;
  
  
  I. The Challenge of Long-Term Memory in Agents
&lt;/h3&gt;

&lt;p&gt;Currently, memory implementation in most AI applications is overly simplistic: they just stuff recent conversation logs into the context window. This approach faces three major hurdles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context Overflow&lt;/strong&gt;: LLM context windows are expensive and finite. "Stream-of-consciousness" memory hits the limit very quickly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Noise&lt;/strong&gt;: Irrelevant information in historical logs interferes with the AI's judgment on current tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Conflict&lt;/strong&gt;: When a user's status changes (e.g., "I used to like Java, but now I prefer Go"), simple retrieval (RAG) often pulls up outdated information, leading to logical confusion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Core Philosophy of MemSkill&lt;/strong&gt;: An Agent should not just passively store and retrieve data. Like a human, it should actively summarize facts, correct errors, and upscale fragmented information into a structured &lt;strong&gt;Mental Model&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  II. Thinking and Design: Mental Model Self-Evolution
&lt;/h3&gt;

&lt;p&gt;The MemSkill we are designing follows four core actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt;: Identify key facts from the conversation and assign importance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidate&lt;/strong&gt;: Compress multiple low-level facts into high-level user preference summaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prune&lt;/strong&gt;: Identify and delete outdated or incorrect memories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: Use semantic search to retrieve the most relevant context.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Architecture Design
&lt;/h4&gt;

&lt;p&gt;To ensure production-grade reliability, we utilize a Two-Tier Storage Architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis (KV Storage)&lt;/strong&gt;: Leverages TTL mechanisms to physically expire memories based on their Importance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector/Lucene (Semantic Index)&lt;/strong&gt;: Provides multi-tenant isolated semantic retrieval capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  III. Code Implementation: Building the MemSkill Core
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. The Memory Search Provider (MemSearchProvider)
&lt;/h4&gt;

&lt;p&gt;First, we define an abstraction layer that can interface with either a distributed Vector Database or a local Lucene index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;MemSearchProvider&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/** Semantic/Fuzzy Search */&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="cm"&gt;/** Get high-value "hot" memories for profile injection */&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getHotMemories&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="cm"&gt;/** Sync Index */&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;updateIndex&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="cm"&gt;/** Remove Index */&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;removeIndex&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. The Core Skill Class: MemSkill
&lt;/h4&gt;

&lt;p&gt;This is the "mental processor" of the Agent. It provides tools for the AI to call and dynamically injects the user profile via getInstruction before the dialogue begins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MemSkill&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AbsSkill&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;RedisClient&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;MemSearchProvider&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getInstruction&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Dynamically load the top 5 core cognitive fragments&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHotMemories&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mentalModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;formatModel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"### Long-Term Memory Self-Evolution Guide\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
               &lt;span class="s"&gt;"1. **Core Mental Model**: This is your existing knowledge of the user:\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mentalModel&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
               &lt;span class="s"&gt;"\n2. **Cognitive Evolution Principles**:\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
               &lt;span class="s"&gt;"   - **Temporal Priority**: In case of conflict, trust the most recent timestamp.\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
               &lt;span class="s"&gt;"   - **Active Correction**: If the current status conflicts with the model, you MUST update via `mem_extract` or `mem_prune`."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mem_extract"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Extract facts or preferences into the mental model"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fact"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"importance"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 1. Retrieve old memory for reflection&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;oldJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBucket&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getFinalKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="c1"&gt;// 2. Dynamic TTL: Core summaries (&amp;gt;=10) last forever; common facts last 7-30 days&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculateTTL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// 3. Sync to Redis and Search Provider&lt;/span&gt;
        &lt;span class="n"&gt;saveMemory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"[Operation Successful] Mental model updated. If cognitive differences are found, please reflect this evolution in your response."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Local Implementation: Lucene Adapter
&lt;/h3&gt;

&lt;p&gt;For many Java developers, deploying a full vector database is too costly. We implemented a &lt;code&gt;Lucene&lt;/code&gt;-based MemSearchProvider that supports multi-tenant isolated semantic matching on local disk or in memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MemSearchProviderLuceneImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;MemSearchProvider&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;AutoCloseable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;IndexWriter&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Implementation via BooleanQuery (user_id = X AND content LIKE query)&lt;/span&gt;
        &lt;span class="nc"&gt;BooleanQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;mainQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BooleanQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;mainQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TermQuery&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Term&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_id"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="nc"&gt;BooleanClause&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Occur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MUST&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// ... Add QueryParser for the query string&lt;/span&gt;

        &lt;span class="c1"&gt;// Sort by relevance (or importance) and return&lt;/span&gt;
        &lt;span class="nc"&gt;TopDocs&lt;/span&gt; &lt;span class="n"&gt;topDocs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;searcher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mainQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// ... Map to MemSearchResult&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  IV. The Elegance of This Implementation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Reflection (Reflexion)&lt;/strong&gt;: During mem_extract, the system feeds the old memory fragment back to the AI. This triggers an "awareness" mechanism in the Agent, allowing it to say: "I remember you mentioned A before, but now you seem to prefer B. I have updated my understanding for you."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Importance-Driven Lifecycle&lt;/strong&gt;: Not all memories are created equal. By controlling TTL through importance, we achieve a natural sedimentation from "ephemeral memory" to "long-term experience."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Designer Role Injection&lt;/strong&gt;: Through getInstruction, we turn the mental model into the Agent's "pre-conscious awareness," which is more efficient and human-like than simple Tool Call retrieval.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  V. Conclusion
&lt;/h3&gt;

&lt;p&gt;In the Solon AI ecosystem, the implementation of &lt;code&gt;solon-ai-skill-memory&lt;/code&gt; proves that &lt;strong&gt;long-term memory is not just about data stacking, but about cognitive management&lt;/strong&gt;. Through this self-evolving solution based on Lucene/Redis, Java developers can easily build Agents that never forget and are capable of deep self-reflection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Appendix: Full Implementation Reference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.skills.memory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.redisx.RedisClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.snack4.ONode&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.Utils&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.annotation.ToolMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.skill.AbsSkill&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.prompt.Prompt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.annotation.Param&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.core.util.Assert&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.lang.Preview&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.slf4j.Logger&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.slf4j.LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.time.LocalDateTime&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.time.format.DateTimeFormatter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * MemSkill: Long-term memory skill based on a self-evolving mental model.
 *
 * Follows core MemSkill principles: Extract, Consolidate, Prune, Search.
 * Guides the Agent's cognitive updates via Designer instructions.
 */&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MemSkill&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AbsSkill&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="no"&gt;LOG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLogger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MemSkill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;BASE_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ai:memskill:"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;RedisClient&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;MemSearchProvider&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MemSkill&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RedisClient&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;MemSearchProvider&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;searchProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"mem_skill"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Long-term memory expert: Manages extraction, evolution, conflict resolution, and deep retrieval of user mental models."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getInstruction&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mentalModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchProvider&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHotMemories&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;StringBuilder&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StringBuilder&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"- %s: %s (Time: %s)\n"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;mentalModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"### Long-Term Memory Self-Evolution Guide (Current System Time: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;getNow&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;")\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"You have the ability to autonomously manage and evolve the user's mental model. Please follow these principles:\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"1. **Core Mental Model**: This is your existing knowledge of the current user. Base your conversation on this:\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mentalModel&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"- (Mental model under construction, please ask questions to learn about the user)"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mentalModel&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"\n\n2. **Cognitive Evolution Principles**:\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"   - **Temporal Priority**: If records conflict, the one with the most recent timestamp prevails.\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"   - **Active Correction**: If the user's current status conflicts with the model above, you MUST update via `mem_extract` or remove via `mem_prune`.\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="s"&gt;"   - **Inductive Upscaling**: When the cognitive base becomes redundant, proactively use `mem_consolidate` to summarize low-level facts into high-level preferences."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getFinalKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;BASE_PREFIX&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNow&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DateTimeFormatter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofPattern&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"yyyy-MM-dd HH:mm:ss"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mem_extract"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Store facts, preferences, or progress into the user mental model. If the Key exists, the system returns the old record for reflection."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                          &lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fact"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                          &lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"importance"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;finalKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getFinalKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;oldJson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBucket&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finalKey&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getNow&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="nc"&gt;StringBuilder&lt;/span&gt; &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StringBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[Operation Successful] Mental model updated."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldJson&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ONode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldJson&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\n[Cognitive Contrast] Historical record found:"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\n- Old Content: "&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\n- Old Time: "&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\nPlease compare the differences. If a change occurred, reflect this cognitive evolution in subsequent dialogue."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"importance"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;importance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;importance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2592000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 30 days&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;604800&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 7 days&lt;/span&gt;

            &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBucket&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;finalKey&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ONode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;serialize&lt;/span&gt;&lt;span class="o"&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;ttl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchProvider&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;updateIndex&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;importance&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="no"&gt;LOG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MemSkill extract error"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Storage exception."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mem_search"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Semantic Retrieval: Find relevant memory fragments in the mental model via natural language to retrieve background information."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"query"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchProvider&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Search provider not configured."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;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;searchProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"No relevant cognitive fragments found."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;StringBuilder&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StringBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Matched cognitive references (Prefer the most recent timestamps):\n"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MemSearchResult&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"- [%s] (Key: %s): %s\n"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                    &lt;span class="nc"&gt;Utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;time&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Unknown Time"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mem_recall"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Exact Recall: Get full details of a cognitive entry via Key."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBucket&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getFinalKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Cognitive entry ["&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"] not found."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nc"&gt;ONode&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ONode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[Cognitive Details] Content: %s | Time: %s | Importance: %s"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"importance"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Read exception."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mem_consolidate"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Cognitive Consolidation: Merge multiple low-level fact fragments into a high-level preference model and prune redundant fragments."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;consolidate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"keys_to_merge"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;oldKeys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                              &lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"new_key"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;newKey&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                              &lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"evolved_insight"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;insight&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[Evolved Insight] "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;insight&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;extract&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newKey&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;oldKeys&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;prune&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"[Cognitive Evolution Successful] Fragments summarized into core insights; redundant records removed."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mem_prune"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Cognitive Correction: Delete incorrect, duplicate, or outdated knowledge."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;prune&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Param&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBucket&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getFinalKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchProvider&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;searchProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;removeIndex&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Key cleared from model: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>java</category>
      <category>llm</category>
      <category>memory</category>
    </item>
    <item>
      <title>Java Edition of Claude Code CLI is Here! Solon Code CLI Released</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Fri, 20 Feb 2026 08:38:35 +0000</pubDate>
      <link>https://dev.to/noear/java-edition-of-claude-code-cli-is-here-solon-code-cli-released-1lpb</link>
      <guid>https://dev.to/noear/java-edition-of-claude-code-cli-is-here-solon-code-cli-released-1lpb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;When AI meets code, and the essence of Claude Code meets the Solon AI framework—a smart terminal assistant truly belonging to the Java ecosystem is born.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Remember the shock when Claude Code CLI was released? That AI assistant capable of chatting in the terminal, generating videos, sending emails, writing code, and understanding project structures finally has a Java implementation!&lt;/p&gt;

&lt;p&gt;Today, the Solon AI framework officially launches &lt;strong&gt;Solon Code CLI&lt;/strong&gt; — a smart terminal tool that fully embraces the design philosophy of Claude Code CLI while deeply integrating with the Java ecosystem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compatible with Claude Code Agent Skills specifications&lt;/li&gt;
&lt;li&gt;Compatible with CLAUDE.md specifications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. This is Not a Simple "Wrapper"
&lt;/h3&gt;

&lt;p&gt;Solon Code CLI does more than just mimic the surface features of Claude Code CLI. From its foundation (Solon AI) to its core logic and interaction patterns, it aligns with the Claude Code philosophy across the board and features deep optimizations for Java development scenarios. Licensed under the &lt;strong&gt;MIT Open Source License&lt;/strong&gt;, it allows for arbitrary modification and customization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8y28ox8mvs911jhexif1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8y28ox8mvs911jhexif1.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Minimalist Interaction, Ultimate Experience
&lt;/h3&gt;

&lt;p&gt;After modifying the LLM configuration in &lt;code&gt;README.md&lt;/code&gt; (you can even give it a nickname like "Xiaohua"), run &lt;code&gt;run.sh&lt;/code&gt; (Mac/Linux) or &lt;code&gt;run.cmd&lt;/code&gt; (Windows) to enter a whole new world:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Xiaohua v0.0.12
/Users/yourname/projects/myapp/


User
&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No bloated command parameters, no complex configurations. Just like talking to an experienced programmer, you only need to state your requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Intelligent Project Recognition
&lt;/h3&gt;

&lt;p&gt;Like Claude Code CLI, Solon Code CLI uses the &lt;code&gt;init&lt;/code&gt; command to automatically identify your project structure, technology stack, and local file index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Xiaohua v0.0.12
/Users/yourname/projects/myapp/


User
&amp;gt; init
Re-initializing workspace...
Local index refreshed successfully! 172 files scanned and indexed in 154ms.
Verified project contract. (Maven(Root))

User
&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It generates a &lt;code&gt;CLAUDE.md&lt;/code&gt; file in your project root—the heart of the Claude Code specification—recording build commands, testing methods, and coding standards. This file serves as a "living document" for both the AI and your team members.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. True "Engineering-Grade" AI Capabilities
&lt;/h3&gt;

&lt;p&gt;Solon Code CLI is not just a chatbot; it is an AI assistant that understands engineering and code.&lt;/p&gt;

&lt;h4&gt;
  
  
  a) Code Understanding and Search
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Xiaohua v0.0.12
/Users/yourname/projects/myapp/


User
&amp;gt; init
Re-initializing workspace...
Local index refreshed successfully! 172 files scanned and indexed in 154ms.
Verified project contract. (Maven(Root))

User
&amp;gt; Local search server related code

Xiaohua
  Users who want to find the server-specific code of the protocol need to search locally for the server-specific code. I should use full_text_search to search for server related content in the project.



❯ full_text_search query=server
 Found 19 results (sorted by relevance) :

  Path: acp-core/src/test/java/com/agentclientprotocol/sdk/spec/McpServerConfigurationTest.java (Score: 1.94, Line: ~22)
     Preview: ...sertj.core.api.Assertions.assertThat;  /**  * Tests for MCP server configuration serialization and deserialization.  *  * &amp;lt;p&amp;gt;  * Per the ACP spec:  * &amp;lt;ul&amp;gt;  * &amp;lt;li&amp;gt;Stdio transport: N...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Based on Lucene-powered intelligent search, it instantly locates the critical code you need.&lt;/p&gt;

&lt;h4&gt;
  
  
  b) Code Modification and Verification
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
&amp;gt; Give WebSocketAcpAgentTransport class under the perfect log (based on slf4j specification)

Xiaohua
  I searched for this class first and then refined the SLF4J log for it.

❯ full_text_search query=WebSocketAcpAgentTransport
  Five results were found (in order of relevance) :

  Path: acp-websocket-jetty/src/test/java/com/agentclientprotocol/sdk/agent/transport/WebSocketAcpAgentTransportTest.java (Score: 3.28, Line: ~18)
     Preview: ...ssertions.assertThatThrownBy;  /**  * Unit tests for {@link WebSocketAcpAgentTransport}.  */ class WebSocketAcpAgentTransportTest {    private McpJsonMapper jsonMapper;   @BeforeEac...

  Path: acp-websocket-jetty/src/test/java/com/agentclientprotocol/sdk/integration/WebSocketClientAgentTest.java (Score: 2.68, Line: ~14)
     Preview: ...ncAgent; import com.agentclientprotocol.sdk.agent.transport.WebSocketAcpAgentTransport; import com.agentclientprotocol.sdk.client.AcpAsyncClient; import com.agentclientprotocol.sdk...

  Path: acp-websocket-jetty/src/main/java/com/agentclientprotocol/sdk/agent/transport/WebSocketAcpAgentTransport.java (Score: 2.57, Line: ~70)
     Preview: ...ncy&amp;gt;  * }&amp;lt;/pre&amp;gt;  *  * @author Mark Pollack  */ public class WebSocketAcpAgentTransport implements AcpAgentTransport {      private static final Logger logger = LoggerFactory.getLogger...

  Path: README.md (Score: 1.65, Line: ~342)
     Preview: ...```

java import com.agentclientprotocol.sdk.agent.transport.WebSocketAcpAgentTransport;  var transport = new WebSocketAcpAgentTransport(     8080,                           // port...

  Path: acp-agent-support/README.md (Score: 1.01, Line: ~291)
     Preview: ...create())     .run();

 ```  ### WebSocket Transport  ```

java WebSocketAcpAgentTransport transport = WebSocketAcpAgentTransport.builder()     .host("localhost")     .port(8080)     ....
  (End of output)

❯ read_file



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Solon Code CLI follows the "verification-driven" principle of Claude Code: &lt;strong&gt;tests must be run after modifying code&lt;/strong&gt; to ensure changes are safe and reliable.&lt;/p&gt;

&lt;h4&gt;
  
  
  c) Secure Command Execution
&lt;/h4&gt;

&lt;p&gt;For high-risk operations, Solon Code CLI features a built-in security audit policy similar to Claude Code. It intelligently intercepts:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

User
&amp;gt; Get the contents of https://solon.noear.org/ web page

Xiaohua
  The user wants to access the contents of https://solon.noear.org/. I need to use a tool that fetches web content.

  Looking at the available tools, I see that there are these related tools:
  1. 'bash' - can execute shell commands like curl or wget
  2. 'full_text_search' - This is a local full-text search, not getting the content of the web page
  3. Other tools are mainly related to file manipulation

  The most straightforward way is to use the 'bash' tool to execute the curl command to get the content of the web page.

  Let me help you get the content of this web page.
   (8554 tokens)

Permission Required
Command: curl -s https://solon.noear.org/
Approve? (y/n)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It intelligently intercepts (via the customizable HitlStrategy) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System privileged commands (&lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;chmod&lt;/code&gt;, &lt;code&gt;chown&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Network outbound operations (&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, &lt;code&gt;ssh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Path traversal attacks (&lt;code&gt;../&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Combined command injections (&lt;code&gt;;&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only risky operations that you confirm will be executed, and security is fully aligned with Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Three Connection Modes: AI Everywhere
&lt;/h3&gt;

&lt;p&gt;Solon Code CLI adopts the "Pool-Box Model"—one AI core with three connection methods:&lt;/p&gt;

&lt;h4&gt;
  
  
  a) CLI Mode
&lt;/h4&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yml
solon.code.cli:
  cliEnabled: true
  cliPrintSimplified: true


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Directly chat with AI in the terminal for the purest experience. (Enabled by default via cliEnabled: true).&lt;/p&gt;

&lt;h4&gt;
  
  
  b) Web Mode
&lt;/h4&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yml
solon.code.cli:
  webEnabled: false
  webEndpoint: "/cli"


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Access &lt;code&gt;http://localhost:8080/cl&lt;/code&gt;i via a browser for a visual interactive interface.&lt;/p&gt;

&lt;h4&gt;
  
  
  c) ACP Protocol Mode
&lt;/h4&gt;

&lt;p&gt;Solon Code CLI implements the &lt;strong&gt;ACP (Agent Communication Protocol)&lt;/strong&gt;, allowing seamless connection to any IDE plugin or client supporting the protocol. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Future direct use in VS Code or IntelliJ IDEA.&lt;/li&gt;
&lt;li&gt;Support for remote connections (AI runs on your server while you operate locally).&lt;/li&gt;
&lt;li&gt;Shared AI computing resources for teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yml
solon.code.cli:
  acpEnabled: false
  acpTransport: "websocket" # "stdio" or "websocket"
  acpEndpoint: "/acp"


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  6. Quick Start
&lt;/h3&gt;

&lt;p&gt;Download (17MB):&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://github.com/opensolon/soloncodecli/releases/download/v0.0.12/SolonCodeCLI_v0.0.12.zip
https://gitee.com/opensolon/soloncodecli/releases/download/v0.0.12/SolonCodeCLI_v0.0.12.zip


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Configuration:&lt;/p&gt;

&lt;p&gt;Extract the package and adjust application.yaml with your API Key and Model details (e.g., DeepSeek, OpenAI, etc.).&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yaml
solon:
  code:
    cli:
      nickname: "Xiaohua"
      workDir: "my-project"
      chatModel:
        apiUrl: "https://api.deepseek.com/v1/chat/completions"
        apiKey: "sk-xxxx"
        model: "deepseek-chat"
      planningMode: true
      hitlEnabled: true


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

# For Mac or Linux
sh run.sh

# For Windows
run.cmd

# Or native Java command
java -jar SolonCodeCLI.jar


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Conclusion
&lt;/h3&gt;

&lt;p&gt;Solon Code CLI is not intended to replace Claude Code; rather, it brings this advanced AI programming paradigm into the &lt;strong&gt;customizable Java world&lt;/strong&gt; , allowing every Java developer to enjoy the efficiency revolution brought by AI.&lt;/p&gt;

&lt;p&gt;It is open-source (MIT), customizable, and deeply integrated. You can integrate it into your CI/CD pipelines, build your own AI toolchains, or empower your entire development team.&lt;/p&gt;

&lt;p&gt;The Java edition of Claude Code is here. Are you ready?&lt;/p&gt;




&lt;p&gt;Project Address: &lt;a href="https://github.com/opensolon/soloncodecli" rel="noopener noreferrer"&gt;https://github.com/opensolon/soloncodecli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Solon Code CLI — Born for Java developers, an intelligent terminal assistant sharing the same DNA as Claude Code.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>java</category>
      <category>ai</category>
    </item>
    <item>
      <title>Converting Everything to MCP is Foolish! AI Skills Are the Way Forward</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Mon, 02 Feb 2026 10:51:47 +0000</pubDate>
      <link>https://dev.to/noear/converting-everything-to-mcp-is-foolish-ai-skills-are-the-way-forward-283g</link>
      <guid>https://dev.to/noear/converting-everything-to-mcp-is-foolish-ai-skills-are-the-way-forward-283g</guid>
      <description>&lt;p&gt;The hype surrounding &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; has arguably gone too far. Since Anthropic unveiled this protocol, many in the industry have become restless, acting as if they won’t secure a ticket to the AI era unless they rewrite their business interfaces as MCP Servers overnight.&lt;/p&gt;

&lt;p&gt;Every few years, the tech world is swept by a hurricane of "unified protocols" (much like a few years ago when everyone rushed to dismantle monoliths into microservices). The essence of architecture is solving problems, not chasing an expensive sense of ritual. Forcing every business function into MCP is not just strategic laziness; it is tactical self-torture. For developers deeply rooted in real-world business logic, the Skill Pattern is the true path to clarity.&lt;/p&gt;

&lt;h3&gt;
  
  
  I. The Deification of MCP: Ritual Should Not Outweigh Productivity
&lt;/h3&gt;

&lt;p&gt;We must admit that the intention behind MCP is good; it attempts to establish a universal "dialogue logic" between heterogeneous systems and AI Agents. Enterprises are flocking to it because they hope a standardized protocol will once and for all solve the problem of connecting AI to internal private data.&lt;/p&gt;

&lt;p&gt;However, in the eyes of senior architects, "standardization" is often a smokescreen for &lt;strong&gt;over-engineering&lt;/strong&gt;. Consider our core requirement: we simply want the AI to smoothly call an inquiry interface that has been running reliably for three years. To get this "sip of vinegar," MCP forces you to make a complex "feast of dumplings": you must set up a compliant Server, wrestle with intricate transport protocols, and map resources. This isn’t integration; it’s building a massive wall around your business system. &lt;strong&gt;Great architecture should dissolve into the background, not impose itself with overbearing "diplomatic formalities."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  II. The "Three Mountains" of MCP Implementation
&lt;/h3&gt;

&lt;p&gt;In a real production environment, MCP is far from the panacea it's advertised to be. It presents at least three hurdles that can mire a mature team in a swamp of technical debt.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. The Curse of Development Cost and Dual Codebases
&lt;/h4&gt;

&lt;p&gt;MCP requires a full protocol implementation. This means you must maintain not only your original business logic but also a separate "protocol translation logic." This isn't just a few extra lines of code; it means double the documentation, double the test cases, and a double breeding ground for bugs. For teams wanting AI to take over logic quickly, this "dual maintenance" is an architectural disaster.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Context Bloat vs. Token Consumption
&lt;/h4&gt;

&lt;p&gt;This is MCP’s fatal weakness. Defining a large number of tools involves massive amounts of metadata and redundant descriptions. When an LLM tries to understand a tool list provided by an MCP Server, this verbose protocol text quickly chokes the &lt;strong&gt;Context Window&lt;/strong&gt;. The result? A sharp spike in Token consumption and agonizingly long response latencies. In high-concurrency business scenarios, this waste is unacceptable.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. The Mystery of Debugging Nightmares
&lt;/h4&gt;

&lt;p&gt;With every layer added to an architecture, the system's entropy doubles. When an AI call fails, where do you look? Is it a "prompt drift"? A misconfiguration in the protocol layer? Or a failure in the underlying business logic? This bottomless path of troubleshooting is a nightmare that no veteran architect wants to face.&lt;/p&gt;

&lt;h3&gt;
  
  
  III. Why "Skills" Are the Soul of Business
&lt;/h3&gt;

&lt;p&gt;Stepping away from heavy protocols, let’s look at what we call a Skill. In the design philosophy of Solon AI, a Skill is not a heavy contract, but an "elegant packaging of capability."&lt;/p&gt;

&lt;p&gt;The core logic is simple: the business does not need to adapt to the protocol; the protocol should adapt to the business.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code as a Skill&lt;/strong&gt;: A method you’ve already written perfectly, once annotated, becomes a Skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface as a Skill&lt;/strong&gt;: An existing Swagger/OpenAPI document, once imported, becomes a Skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data as a Skill&lt;/strong&gt;: A database connection with read-only permissions becomes a Skill (Text-to-SQL).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This bottom-up evolution aligns with the natural laws of system development.&lt;/p&gt;

&lt;h3&gt;
  
  
  IV. A Dimensional Strike: Skill Practice in Solon AI
&lt;/h3&gt;

&lt;p&gt;As a senior developer, I care most about the "Input-Output Ratio." Let’s see how Solon AI uses the Skill pattern to deliver a "dimensional strike" against the complexity of MCP.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example 1: RestApiSkill — Activating Legacy Interfaces at Zero Cost
&lt;/h4&gt;

&lt;p&gt;If you have a collection of REST interfaces, you don't need to write a single line of new code for them. In Solon AI, this is seamless:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. "Take-ism": Directly read the business system's Swagger documentation.&lt;/span&gt;
&lt;span class="c1"&gt;// Just provide a URL, and the AI automatically parses all Paths, Methods, and parameter descriptions.&lt;/span&gt;
&lt;span class="nc"&gt;RestApiSkill&lt;/span&gt; &lt;span class="n"&gt;orderSkill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RestApiSkill&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://api.yoursite.com/v2/api-docs"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://api.yoursite.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Drop it into the Agent; it becomes a "Business Expert" instantly.&lt;/span&gt;
&lt;span class="nc"&gt;ReActAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ReActAgent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatModel&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Order Manager"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultSkillAdd&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderSkill&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Injecting the Skill&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// 3. The AI now knows how to check inventory, place orders, and update statuses.&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Has the order ending in 9527 been shipped?"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example 2: Text2SqlSkill — Turning Data Directly into Reports
&lt;/h4&gt;

&lt;p&gt;Previously, if a boss wanted a figure, you had to write a DAO, SQL, and a Controller. Now, you give the database capability directly to the AI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Connect to the database and tell it which tables it manages.&lt;/span&gt;
&lt;span class="nc"&gt;Text2SqlSkill&lt;/span&gt; &lt;span class="n"&gt;sqlSkill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Text2SqlSkill&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataSource&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"users"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"orders"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"refunds"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;maxRows&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Security policy: return a maximum of 50 rows.&lt;/span&gt;

&lt;span class="nc"&gt;ReActAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ReActAgent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatModel&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Financial Analyst"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultSkillAdd&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqlSkill&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// The AI reasons: "To check the total, I need to execute SUM(...)," then generates and runs the SQL.&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"What was the total refund amount for the East China region last month?"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contrast is clear: &lt;strong&gt;agent.defaultSkillAdd(...)&lt;/strong&gt; is exponentially more efficient than developing a complex MCP node. This is true business-centric "dimensional strike."&lt;/p&gt;

&lt;h3&gt;
  
  
  V. Deep Dive: Architectural Advantages of the Skill Pattern
&lt;/h3&gt;

&lt;p&gt;In terms of architectural selection, the Skill pattern wins on three fronts: Agility, Stability, and Reusability.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Low Coupling (Agility)&lt;/strong&gt;: Skills can be local or remote. They attach to an Agent like plugins—unplug them at any time without hurting the core business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong Type Safety (Stability)&lt;/strong&gt;: By leveraging Java’s mature type system and JSON Schema validation, we can precisely control every parameter the AI passes. Unlike the loose messaging of MCP, the Skill pattern locks down risks before execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Reusability (Reusability)&lt;/strong&gt;: Once a Skill is written, it can be used in a simple ChatModel / SimpleAgent or called within a complex ReActAgent reasoning loop.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  VI. Conclusion: Return to Engineering Essence, Choose Path Wisely
&lt;/h3&gt;

&lt;p&gt;The true meaning of architectural design lies not in chasing the "newest" but in pursuing the "most suitable." By comparison, the Skill pattern offers a more pragmatic choice: it implements a seamless connection between business logic and Agents via lightweight packaging, ensuring every bit of computing power is spent on core business reasoning.&lt;/p&gt;

&lt;p&gt;We need surgical precision and lightness. Abandon those cumbersome protocol translations and release your business potential with the Skill pattern. Remember: &lt;strong&gt;The best technology is the one you don't even feel is there&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slogan: Business is King, Skill is the Path. Don't let protocols become the stumbling block to your AI era.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>llm</category>
      <category>solon</category>
    </item>
    <item>
      <title>On the Inevitability of Distributed AI Skills: The Transition from Monolithic Intelligence to a "Cloud-Based Brain"</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Wed, 28 Jan 2026 02:47:37 +0000</pubDate>
      <link>https://dev.to/noear/on-the-inevitability-of-distributed-ai-skills-the-transition-from-monolithic-intelligence-to-a-2992</link>
      <guid>https://dev.to/noear/on-the-inevitability-of-distributed-ai-skills-the-transition-from-monolithic-intelligence-to-a-2992</guid>
      <description>&lt;p&gt;In the evolution of Artificial Intelligence from "Conversational Models" to "Agentic AI," we are at a critical turning point—similar to the transition of the Internet from standalone software to distributed architectures. At the heart of this transformation lies the rise of &lt;strong&gt;AI Skills&lt;/strong&gt; and the inevitability of their distributed development.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. What are AI Skills: Evolution from Tool-level to Framework-level
&lt;/h3&gt;

&lt;p&gt;The concept of &lt;strong&gt;AI Skills&lt;/strong&gt; was initially popularized in cutting-edge Agent practices like &lt;strong&gt;Claude Code&lt;/strong&gt;. Originally, Skills were viewed as "tool-level" enhancements—simple file I/O or terminal operations—allowing users to quickly perform various tasks.&lt;/p&gt;

&lt;p&gt;However, in modern application development frameworks like &lt;strong&gt;Solon AI,&lt;/strong&gt; AI Skills have evolved into a higher-dimensional abstraction designed for Agent application development.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool-level&lt;/strong&gt;: Solves the problem of the "hands"; these are specific execution functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework-level&lt;/strong&gt;: Solves the problem of the "brain." A Skill is an aggregation of Tools, Instructions, and Metadata. It encompasses not just execution logic, but also admission control, instruction augmentation, and tool "tinting" (tracing/tagging) capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Core Characteristics of AI Skills
&lt;/h3&gt;

&lt;p&gt;To address the issues of context noise, permission vacuums, and loss of behavioral control found in traditional Tool models, a mature AI Skill must possess the following traits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Admission&lt;/strong&gt; (&lt;code&gt;isSupported&lt;/code&gt;): A Skill is activated only when specific intents, tenants, or environmental conditions (Prompt Context) are met. This prevents ineffective tools from cluttering the model's context and wasting tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instruction Injection&lt;/strong&gt; (&lt;code&gt;getInstruction&lt;/code&gt;): Provides the model with "rules of conduct" based on the current context, solving the problem of how the model should act.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Routing&lt;/strong&gt; (&lt;code&gt;getTools&lt;/code&gt;): Dynamically distributes tools based on the current context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High Autonomy&lt;/strong&gt;: Logic within a specific domain is handled as a closed loop within the Skill, outputting standardized results to the external environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. MCP: The World Wide Web Protocol for the AI Era
&lt;/h3&gt;

&lt;p&gt;With the explosion of skill demands, the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; emerged. It is the standard protocol connecting AI models with external data and tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP is to AI what HTTP is to the World Wide Web.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Internet era, HTTP allows any browser to access resources on any server. In the AI era, MCP allows any Agent to seamlessly call skills provided by different vendors across different physical locations. This standardization completely shatters the "hard-coded" shackles between Agents and the external world.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Distributed Evolution of Tools: The Birth of MCP Tools
&lt;/h3&gt;

&lt;p&gt;The form of "Tools" is undergoing a fundamental change: evolving from local monoliths to &lt;strong&gt;MCP Tools (Distributed Tools)&lt;/strong&gt;. These possess physical location transparency; they are no longer functions in local memory, but independent distributed capability nodes. This "node-ization" of capabilities is the first step for AI toward a microservices architecture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traditional Tools&lt;/strong&gt;: Code-level coupling, running inside the Agent process, difficult to reuse across languages or environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Tools (Distributed Tools)&lt;/strong&gt;: Exposed via the MCP protocol, offering location transparency. They function as independent capability nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Architectural Mapping: From Distributed MCP Tools to MCP Skills
&lt;/h3&gt;

&lt;p&gt;The distribution of Tools provides a natural path for the distribution of AI Skills. When we publish a set of Skills—comprising business logic, instruction guidance, and toolsets—via the MCP protocol, they evolve into &lt;strong&gt;MCP Skills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can clearly map the distributed blueprint of AI Agents to traditional architectures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP is equivalent to RPC (Remote Procedure Call)&lt;/strong&gt;: It defines how models and capability nodes communicate; it is the underlying pipeline of the Agent world.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Skills are equivalent to Microservices&lt;/strong&gt;: Each Skill is an independent business unit with its own business semantics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: Distributed AI Skills can also be implemented via traditional RPC systems, though this requires significantly more manual work.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Implementing MCP Skills: Collaboration between Client and Server
&lt;/h3&gt;

&lt;p&gt;The core of implementing MCP Skills lies in mapping the lifecycle semantics of a Skill onto the endpoints of the MCP protocol.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. McpSkillClient (Local Proxy for Remote Skills)
&lt;/h4&gt;

&lt;p&gt;The McpSkillClient acts as a local proxy. Its responsibility is to shake hands with remote services and wrap network calls into a Skill interface.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metadata Perception&lt;/strong&gt;: Synchronizes remote &lt;code&gt;metadata&lt;/code&gt; via agreed-upon paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Mapping&lt;/strong&gt;: At runtime, it converts local &lt;code&gt;isSupported&lt;/code&gt; or &lt;code&gt;getInstruction&lt;/code&gt; calls into remote MCP Tool calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Filtering&lt;/strong&gt;: Automatically removes management tools marked as &lt;code&gt;hide&lt;/code&gt;, presenting the LLM only with the business tools relevant at that moment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Application Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. Build the MCP client provider (handles protocol communication and schema caching)&lt;/span&gt;
&lt;span class="nc"&gt;McpClientProvider&lt;/span&gt; &lt;span class="n"&gt;mcpClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpClientProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;McpChannel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STREAMABLE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:8081/skill/order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Evolve the MCP client into a Skill proxy&lt;/span&gt;
&lt;span class="nc"&gt;McpSkillClient&lt;/span&gt; &lt;span class="n"&gt;skillClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpSkillClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mcpClient&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Build a Prompt with business context&lt;/span&gt;
&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Order: A001, please query order details."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;// Inject tenant context&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_role"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"admin"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Inject role permissions&lt;/span&gt;

&lt;span class="c1"&gt;// 4. Call the LLM; the skill will automatically complete: remote admission, instruction retrieval, and tool filtering&lt;/span&gt;
&lt;span class="n"&gt;chatModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;skillAdd&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skillClient&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. McpSkillServer (Perceptive Skill Server)
&lt;/h4&gt;

&lt;p&gt;By extending &lt;code&gt;McpSkillServer&lt;/code&gt;, developers can export local business logic as remote skills.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lifecycle Exposure&lt;/strong&gt;: Uses &lt;code&gt;@ToolMapping&lt;/code&gt; and &lt;code&gt;@ResourceMapping&lt;/code&gt; to export logic like &lt;code&gt;isSupported&lt;/code&gt; and &lt;code&gt;getInstruction&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Perception&lt;/strong&gt;: The server perceives intent through the passed Prompt state. For example, it decides which tools to return via &lt;code&gt;getToolsName&lt;/code&gt; based on user roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Tagging&lt;/strong&gt;: Adds &lt;code&gt;hide:1&lt;/code&gt; tags to management endpoints to ensure system-level instructions are not leaked to the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Application Example&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@McpServerEndpoint&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpChannel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STREAMABLE_STATELESS&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mcpEndpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/skill/order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderManagerSkillServer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;McpSkillServer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Expert skill for order queries and cancellations"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Intelligent Admission: Decide whether to respond based on Prompt content and attributes&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Semantic check: Is the intent relevant?&lt;/span&gt;
        &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isOrderTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserContent&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"order"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Security check: Tenant ID must be present&lt;/span&gt;
        &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;hasTenant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;isOrderTask&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;hasTenant&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Dynamic Instruction: Inject real-time "rules of conduct" for the LLM based on context&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getInstruction&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tenantName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrOrDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_name"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Unknown Tenant"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"You are now the order supervisor for ["&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tenantName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"]. Process only order data for this tenant; cross-tenant queries are forbidden."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Attachment Hook: Triggered when the skill is activated; used for logs or initializing context&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onAttach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Few-shot or background knowledge can be injected here via prompt.addMessage()&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Order skill attached. Current tenant: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Dynamic Capability Discovery: Decide which tools to expose based on user permissions
     * @return null: expose all; Empty: disable all; List: precisely expose specific tools.
     */&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getToolsName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Basic permission: Visible to all compliant users&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderQueryTool"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Fine-grained permission: Cancellation tool visible only to ADMIN role&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ADMIN"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_role"&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderCancelTool"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Query details by order ID"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;OrderQueryTool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Order "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" Status: Shipped"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Cancel specific order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;OrderCancelTool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Order "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" successfully cancelled"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Summary of Inevitability
&lt;/h3&gt;

&lt;p&gt;The distributed path for AI Skills is irreversible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decoupling and Reuse&lt;/strong&gt;: Complex skills (e.g., legal auditing, professional code refactoring) no longer need to be rewritten in every project; they exist independently as services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Boundaries&lt;/strong&gt;: Sensitive data processing skills can be deployed in private, protected intranets, communicating with public Agents only through controlled MCP protocols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heterogeneous Ecosystems&lt;/strong&gt;: Capabilities across different languages and computing environments can connect via a unified MCP interface, forming a true "Agent Microservices Network."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The emergence of &lt;strong&gt;MCP Skills&lt;/strong&gt; (currently an architectural pattern rather than a formal specification) marks the end of the "personal toolbox" era in AI application development and the beginning of a true "&lt;strong&gt;Agent Microservices Network&lt;/strong&gt;" era.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>java</category>
      <category>solon</category>
    </item>
    <item>
      <title>Solon AI Remote Skills: Enabling the "perception" of Distributed Skills</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:17:35 +0000</pubDate>
      <link>https://dev.to/noear/solon-ai-remote-skills-enabling-the-perception-of-distributed-skills-3edo</link>
      <guid>https://dev.to/noear/solon-ai-remote-skills-enabling-the-perception-of-distributed-skills-3edo</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction: The "Last Mile" Challenge of AI Agents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the engineering practice of AI agents, we are undergoing a transformation from "local integration" to "cloud-based plug-in." Over the past year, the industry has witnessed the rise of &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, which successfully solved the "protocol standardization" problem for cross-process connections between large models and external tools. However, with the deepening of enterprise-level scenarios, developers have found that simply achieving connectivity is not enough.&lt;/p&gt;

&lt;p&gt;Today, Solon AI 3.9.0 officially proposes the concept of &lt;strong&gt;Remote Skills&lt;/strong&gt;. This feature is not a simple encapsulation of MCP, but rather an evolution of the originally static, passively triggered MCP toolset into a distributed intelligent unit with business awareness, lifecycle management, and dynamic routing capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  I. The Leap from MCP Tools to Remote Skills
&lt;/h3&gt;

&lt;p&gt;The traditional MCP interaction mode is essentially a kind of "static broadcast." Once the server starts, it exposes all tools to the large model. This model works well in single-machine experimental environments, but in complex, multi-tenant, and high-security enterprise-level businesses, it triggers three critical engineering pain points:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Context Noise and Token Inflation:
&lt;/h4&gt;

&lt;p&gt;The context window of a large model is expensive and finite. If a system has 500 tools, even for simple chat or basic queries, traditional MCP will cram the JSON schemas of all 500 tools into the System Prompt. This not only wastes a significant amount of token resources, but more seriously, excessive distracting information can cause the model to become "distracted," reducing the accuracy of inference.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Security Risks and Unauthorized Calls:
&lt;/h4&gt;

&lt;p&gt;In the native architecture of MCP, the model's visibility to tools is "full." The model cannot spontaneously and dynamically hide sensitive operations based on the current user's role. For example, if an intern inquires about order information, the model might attempt to call the &lt;code&gt;OrderCancel&lt;/code&gt; tool during inference. Although the execution layer can intercept this, the "see-and-try" approach itself poses a significant security risk.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Instruction Gap:
&lt;/h4&gt;

&lt;p&gt;Tools describe "what they can do," but fail to tell the model "how to do it" in a specific context. For example, the same "interest rate query" tool might have drastically different preconditions in the business logic of the Shenzhen branch and the Shanghai branch; a static MCP protocol cannot convey this dynamic "behavioral guidelines."&lt;/p&gt;

&lt;p&gt;The core idea of ​​Remote Skills is to wrap remote tools within the Skill lifecycle, enabling them to perceive the current Prompt context, thus achieving a leap from "static description" to "dynamic contract."&lt;/p&gt;

&lt;h3&gt;
  
  
  II. Core Mechanisms: Perception, Mounting, and Dynamic Routing
&lt;/h3&gt;

&lt;p&gt;Solon AI endows remote skills with the ability to "think" by establishing a context negotiation mechanism between &lt;code&gt;McpSkillClient&lt;/code&gt; (client-side agent) and &lt;code&gt;McpSkillServer&lt;/code&gt; (server-side implementation). This is primarily reflected in the following three aspects:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Intelligent Admission (isSupported): From "Full Loading" to "On-Demand Activation"
&lt;/h4&gt;

&lt;p&gt;Remote Skills are no longer blindly activated. Before the session begins, the server parses the current Prompt attributes (such as tenant ID, user profile, and current intent attributes). By executing the &lt;code&gt;isSupported&lt;/code&gt; logic, the server can determine whether the current skill participates in the conversation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engineering Value: Financial skills are only mounted to the memory graph when the conversation involves "financial statements" and the user has "auditor" permissions. This physically eliminates interference from irrelevant tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Dynamic Instruction Injection (getInstruction): Giving Tools a "Business Soul"
&lt;/h4&gt;

&lt;p&gt;Skills are no longer just APIs. During mounting, the server dynamically issues instruction constraints based on the context using &lt;code&gt;getInstruction&lt;/code&gt;. This mechanism allows developers to adjust the Agent's behavioral logic in real time without modifying the model prompts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: When a request is detected to originate from a mobile device, the server injects: "Please keep your replies concise, use Markdown tables whenever possible, and do not exceed 200 characters."&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Three-State Routing Capability (getToolsName): Fine-grained Permission Isolation
&lt;/h4&gt;

&lt;p&gt;This is the most groundbreaking feature of Remote Skills. The server can dynamically determine which tool names to distribute based on the requester's identity, achieving "tool-level RBAC":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Full Authorization: Exposes all debugging and management tools to super administrators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Precise Filtering: Hides high-risk tools like &lt;code&gt;Delete&lt;/code&gt; or &lt;code&gt;BatchUpdate&lt;/code&gt; for ordinary users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete Interception: When an abnormal request is detected (such as an abnormal IP address), all tool access permissions can be instantly disabled even if the skill is activated.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  III. Practical Application: Building Remote Skills with "Self-Reflection" Capabilities
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Client: Extremely Simplified Integration Experience
&lt;/h4&gt;

&lt;p&gt;In the Solon AI framework, McpSkillClient makes complex remote communication and protocol conversions transparent. Developers only need to focus on injecting business attributes (Attrs).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.ChatModel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.prompt.Prompt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.McpChannel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.client.McpClientProvider&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.client.McpSkillClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Build the mcp client&lt;/span&gt;
&lt;span class="nc"&gt;McpClientProvider&lt;/span&gt; &lt;span class="n"&gt;mcpClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpClientProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;McpChannel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STREAMABLE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:8081//skill/order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Build prompt words with deep business attributes&lt;/span&gt;
&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Help me with order A001"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"solon_cloud"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_role"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ADMIN"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"client_ip"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"10.0.0.1"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Injecting remote skill agents, the framework handles context pass-through automatically&lt;/span&gt;
&lt;span class="n"&gt;chatModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;skillAdd&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpSkillClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mcpClient&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; 
         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Server-side: Declarative security capability export
&lt;/h4&gt;

&lt;p&gt;By inheriting &lt;code&gt;McpSkillServer&lt;/code&gt;, you can easily implement remote services with dynamic defense capabilities. Note how the tool is exposed through code logic control.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.annotation.ToolMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.prompt.Prompt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.McpChannel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.server.McpSkillServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@McpServerEndpoint&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpChannel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STREAMABLE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mcpEndpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/skill/order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderRemoteSkillServer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;McpSkillServer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Logical admission: If the request has no tenant identity, simply refuse to mount the skill&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getToolsName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Dynamic Routing: Achieving physical isolation of tools&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderQuery"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ADMIN"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_role"&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderCancel"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Visible only to administrators&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Query order details, including logistics status"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;OrderQuery&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Emergency cancel order, this action is not reversible"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;OrderCancel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  IV. Architectural Reflection: Why is this an inevitable choice for enterprise-level agents?
&lt;/h3&gt;

&lt;p&gt;Evolving MCP into Remote Skills represents a qualitative leap in the architectural quality of AI systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extreme Context Purity:&lt;/strong&gt; Through dynamic filtering, the model only sees the tools it should see "at this moment, by this person, and with this authority." This "minimize information principle" significantly improves inference success rate and substantially reduces token consumption, which directly impacts operational costs for large-scale concurrent systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hardened Security:&lt;/strong&gt; In the past, we attempted to defend against unauthorized calls using "prompt injections." However, under the Remote Skills architecture, access control has been elevated from a "constraint model" to "server-side physical filtering." Even if a large model attempts to attack unauthorized tools, the attack is impossible because the tool definitions have never been distributed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hot Updates and Governance of Capabilities:&lt;/strong&gt; In a distributed environment, business logic, tool lists, and behavioral guidelines all converge on the remote server. This means that when business operations are adjusted (such as adding a refund restriction logic), developers only need to update the McpSkillServer code, and hundreds or thousands of running client agents can instantly receive capability upgrades without redeployment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solon AI Remote Skills is more than just an implementation of a protocol; it represents a profound reflection on "how to manage the capabilities of distributed intelligent agents." It allows AI plugins to move beyond the era of "static broadcasting" and into a new stage of "on-demand allocation and intelligent perception."&lt;/p&gt;

&lt;h3&gt;
  
  
  V. Looking to the Future: Towards "Skills as a Service"
&lt;/h3&gt;

&lt;p&gt;Solon AI Remote Skills is more than just an implementation of a protocol; it represents a profound reflection on &lt;strong&gt;"how to manage AI capabilities like managing microservices."&lt;/strong&gt; In future AI architectures, large models will no longer be bloated "universal boxes," but rather streamlined "inference hubs," connecting distributed expert units around the world on demand through the Remote Skills protocol.&lt;/p&gt;

&lt;p&gt;By enabling AI plugins to move beyond "static broadcasting" and enter a new phase of "on-demand allocation and intelligent perception," Solon AI is providing developers with a more robust, controllable, and commercially valuable agent development framework.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>mcp</category>
      <category>java</category>
    </item>
    <item>
      <title>Claude Code Agent Skills vs. Solon AI Skills: Deep Alignment of Architectural Philosophy with Engineering Boundaries</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:13:36 +0000</pubDate>
      <link>https://dev.to/noear/claude-code-agent-skills-vs-solon-ai-skills-deep-alignment-of-architectural-philosophy-with-5f6</link>
      <guid>https://dev.to/noear/claude-code-agent-skills-vs-solon-ai-skills-deep-alignment-of-architectural-philosophy-with-5f6</guid>
      <description>&lt;p&gt;With the explosive growth of AI Agent technology, the concept of "Skill" is gradually evolving from simple function calls into architectural units with lifecycles, perceptual capabilities, and complex logic. Recently, Anthropic's Claude Code and Solon AI have both proposed their own Skill systems.&lt;/p&gt;

&lt;p&gt;Although they share the same name, their design intentions, application scenarios, and implementation logic are fundamentally different.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. Role Positioning: Production Tool vs. Business Foundation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Claude Code Agent Skills: Efficiency Improvement Tools for "Developers"
&lt;/h3&gt;

&lt;p&gt;Claude Code's Skills are essentially Local-First Agent capability extensions. They primarily serve end-users (developers), focusing on operating system-level interactions.&lt;/p&gt;

&lt;p&gt;Core Scenarios: File system read/write, terminal command execution, code repository search.&lt;/p&gt;

&lt;p&gt;Interaction Model: Typically runs in the user's local development environment, possessing extremely high local privileges.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Solon AI Skills: An Architecture Solution for "Enterprise-Level Business"
&lt;/h3&gt;

&lt;p&gt;Solon AI's Skill is an Enterprise-Ready software architecture abstraction. It defines not only "what it can do," but also "what it can do in what business environment."&lt;/p&gt;

&lt;p&gt;Core Scenarios: Multi-tenant SaaS systems, distributed business logic, cross-process capability discovery.&lt;/p&gt;

&lt;p&gt;Interaction Model: Supports cross-process communication (e.g., via the MCP protocol), emphasizing capability scheduling in complex server-side environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Core Differences in Technical Features
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature Dimensions&lt;/th&gt;
&lt;th&gt;Claude Code Agent Skills&lt;/th&gt;
&lt;th&gt;Solon AI Skills&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Perception Capabilities&lt;/td&gt;
&lt;td&gt;Static/Passive: Explicitly granted by the user or invoked on demand by the model.&lt;/td&gt;
&lt;td&gt;Dynamic/Active: Possesses isSupported semantics, capable of context-aware activation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction Injection&lt;/td&gt;
&lt;td&gt;Fixed: Skill descriptions are typically passed in as static Prompts.&lt;/td&gt;
&lt;td&gt;Dynamic: Supports &lt;code&gt;getInstruction&lt;/code&gt;, dynamically generating instructions based on the current tenant/role.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Control&lt;/td&gt;
&lt;td&gt;Terminal Control: Relies on local permissions of the runtime environment.&lt;/td&gt;
&lt;td&gt;Tri-state Routing: Supports dynamic distribution of tool lists based on business attributes (Role/Tenant).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol Standard&lt;/td&gt;
&lt;td&gt;Dedicated to the Claude ecosystem.&lt;/td&gt;
&lt;td&gt;Compatible with the MCP protocol, enabling cross-process evolution through MCP.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  III. The Game of Core Architecture Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Static Definition vs. Dynamic Lifecycle
&lt;/h3&gt;

&lt;p&gt;Claude Code's skills are more like a tool library. When a model needs a certain ability, it looks in the library. Solon AI introduces complete lifecycle hooks (&lt;code&gt;onAttach&lt;/code&gt;, &lt;code&gt;isSupported&lt;/code&gt;, etc.). This means that before the model speaks, the Skill has already completed identity verification, environment preparation, and instruction warm-up.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. System Constraints vs. Business Constraints
&lt;/h3&gt;

&lt;p&gt;Claude Code's constraints mainly come from the environment (e.g., prohibiting deletion of the root directory). Solon AI's constraints come from the business context.&lt;/p&gt;

&lt;p&gt;Example: In Solon AI, a "refund skill" is aware of the user_role in the Prompt. If it's a regular user, the skill will return false in the isSupported phase; the model won't even see the word "refund" in the context, thus completely eliminating the possibility of unauthorized calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Summary: How Should You Choose?
&lt;/h2&gt;

&lt;p&gt;If you are developing a personal assistant, command-line tool, or assisted programming agent: Claude Code's approach is more suitable. It pursues extreme efficiency in operating local resources, allowing the model to manipulate files and terminals like a human developer.&lt;/p&gt;

&lt;p&gt;If you are building an enterprise-level agent, a multi-tenant SaaS backend, or a complex distributed system: Solon AI Skills are a better choice. It solves the three major pain points of "contextual noise," "permission vacuum," and "uncontrolled behavior" by evolving MCPs into skills with awareness.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Conclusion: The Future of Skills is "Awareness"
&lt;/h2&gt;

&lt;p&gt;LLM's native standards only include Prompt and Tool-Call. Both Claude and Solon's exploration of Skills demonstrates an engineering consensus: models shouldn't see all tools, but only those tools that are properly constrained, at the right time, and with the right permissions.&lt;/p&gt;

&lt;p&gt;By deeply integrating MCP with the Skill system, Solon AI effectively provides enterprise-level agents with a capability distribution network "with a security gate."&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>solon</category>
      <category>llm</category>
    </item>
    <item>
      <title>Will Solon AI Skills be the future of Java AI Agents?</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:10:34 +0000</pubDate>
      <link>https://dev.to/noear/will-solon-ai-skills-be-the-future-of-java-ai-agents-42lc</link>
      <guid>https://dev.to/noear/will-solon-ai-skills-be-the-future-of-java-ai-agents-42lc</guid>
      <description>&lt;p&gt;As AI agents evolve from "conversational toys" to "industrial-grade infrastructure," the core challenge for developers is no longer model intelligence, but rather the lack of engineering constraints.&lt;/p&gt;

&lt;p&gt;If you simply pile up scattered tools (functions) on a model, it's like a child wielding a scalpel without medical training. The emergence of Solon AI Skills marks a shift in AI development from "chaotic integration" to &lt;strong&gt;"capability internalization"&lt;/strong&gt;, injecting agents with truly practical "professional qualities."&lt;/p&gt;

&lt;p&gt;Solon AI Skills (skills). The conceptual prototype references the design philosophy of Claude Code Agent Skills: endowing agents with domain-specific expert capabilities through structured definitions (metadata, instructions/SOPs, scripts/tools).&lt;/p&gt;

&lt;h2&gt;
  
  
  I. Redefining Skill: From "Component Assembly" to "Software-Defined Capabilities"
&lt;/h2&gt;

&lt;p&gt;Solon AI Skills draws on the ideas of DDD (Domain-Driven Design), believing that a Skill is not merely a simple encapsulation of an API, but an autonomous semantic context.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metadata (Identity Recognition):&lt;/strong&gt; Defines the boundaries of capabilities, solving the "Who am I?" question.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Admission (Access Control):&lt;/strong&gt; Borrows from Software-Defined Permissions (SDP), dynamically determines the visibility of capabilities, solving the "Should I use it?" question.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instruction (Semantic Soul):&lt;/strong&gt; Injects SOPs (Standard Operating Procedures), solving the "How to do it correctly?" question.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tools (Physical Muscles):&lt;/strong&gt; Equipped with atomic execution methods, solving the "What to use to do it?" question.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  II. Core Value: Solving Four Major Pain Points of Industrial-Grade Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Logical Closed Loop: Enables the model to "think before you act, and act according to the rules."
&lt;/h3&gt;

&lt;p&gt;A simple Tool cannot self-regulate. Through Skill.getInstruction(), developers can directly translate industry standards and compliance requirements into the model's "factory settings."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architectural Upgrade:&lt;/strong&gt; This achieves a shift from "model self-regulation" to &lt;strong&gt;"rule-driven execution"&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scenario Example:&lt;/strong&gt; A "database migration skill."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tool Mode: Directly calling &lt;code&gt;drop_table&lt;/code&gt; by the model can lead to disaster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skill Mode: Skill commands mandate: "Before performing any deletion operation, &lt;code&gt;backup_table&lt;/code&gt; must be called first, and an impact assessment report must be output to the console for user confirmation."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Dynamic Topology: Solving "Context Inflation" and the Curse of Attention
&lt;/h3&gt;

&lt;p&gt;The context window of large models is not only expensive but also suffers from the "loss in the middle" effect. Full loading of tools can lead to excessive cognitive load on the model, resulting in severe task illusion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skill Solution:&lt;/strong&gt; Dynamic mounting technology based on semantic triggering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Engineering Value:&lt;/strong&gt; Utilizing the &lt;code&gt;isSupported&lt;/code&gt; interface, the system activates the relevant Skill only in specific intents. This &lt;strong&gt;"on-demand loading"&lt;/strong&gt; mode greatly improves token utilization, ensuring the model makes high-precision decisions within a focused semantic field.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a user says, "Analyze this financial statement for me," the system only activates the &lt;code&gt;FinanceSkill&lt;/code&gt;. At this point, only relevant professional instructions and tools are injected into the System Message, keeping the mind clear and ensuring accurate decision-making.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Capability Coloring: Aligning with MCP (Model Context Protocol) Standards
&lt;/h3&gt;

&lt;p&gt;Solon AI's "coloring" of tools under a Skill essentially builds a structured knowledge graph.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Macro-level Guidance:&lt;/strong&gt; This aligns perfectly with the cutting-edge MCP (Model Context Protocol) concept. Tools are no longer flat, but layered and context-dependent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Engineering Significance:&lt;/strong&gt; The model perceives an "expert group" rather than a "tool library." This architecture gives the Agent macro-level orchestration capabilities for handling complex, multi-stage tasks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Stateful Governance: Deep Alignment with Enterprise-level Business
&lt;/h3&gt;

&lt;p&gt;Through the onAttach lifecycle hook, Skill achieves seamless integration with existing enterprise middleware (such as Auth, Session, Tracing).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SDP Practice:&lt;/strong&gt; Injecting environmental fingerprints (such as merchant ID and environmental tags) at the moment of skill activation. This means that when AI calls tools, its underlying permissions are already preset by the Skill, achieving automatic alignment of security capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Application Scenarios:&lt;/strong&gt; For example, when activating the "Order Inquiry Skill," the currently logged-in merchant ID is automatically extracted from the Session and injected into the context, ensuring that all tools called by the model have built-in permission isolation, eliminating the need for repeated explanations in each Prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  III. Practical Exercise: Defining an Expert with "Professional Ethics"
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FinancialAuditSkill&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Skill&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Financial audit expert"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Semantic trigger: Wake up only when dealing with financially sensitive data&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastContent&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;matches&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".*(Money|invoices|reimbursement|bills).*"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getInstruction&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Injecting SOP: Achieving "Capability Internalization"&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"You are now a financial auditor. After calling the query tool, it is necessary to follow the "&lt;/span&gt;&lt;span class="nc"&gt;Enterprise&lt;/span&gt; &lt;span class="n"&gt;internal&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="nc"&gt;Guidelines&lt;/span&gt;&lt;span class="s"&gt;" for comparison, and it is strictly forbidden to skip the compliance check."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Collection&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FunctionTool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getTools&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Inject controlled execution units&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvoiceVerifyTool&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BudgetQueryTool&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  IV. Summary: Why Solon AI Skills is the Future?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimensions&lt;/th&gt;
&lt;th&gt;Traditional Tool Pattern&lt;/th&gt;
&lt;th&gt;Solon AI Skill Pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Integration Depth&lt;/td&gt;
&lt;td&gt;Shallow Interface Calls&lt;/td&gt;
&lt;td&gt;Deep Behavior Specifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token Consumption&lt;/td&gt;
&lt;td&gt;Static Loading, Wasting Tokens&lt;/td&gt;
&lt;td&gt;Dynamic Admission, On-Demand Consumption (Simplifying Context)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Disorganized Logic, Difficult to Audit&lt;/td&gt;
&lt;td&gt;Structured Coloring, Supports Automated Auditing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reusability&lt;/td&gt;
&lt;td&gt;Poor, Prompts are Difficult to Migrate Across Projects&lt;/td&gt;
&lt;td&gt;Strong, Supports Distribution Capabilities as Components (Jars)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  V. Conclusion: Empowering Agents with "Engineering Literacy"
&lt;/h2&gt;

&lt;p&gt;The core philosophy of Solon AI Skills is "to enable AI to collaborate like human experts." It transforms disorganized Prompt engineering into predictable and maintainable capability engineering.&lt;/p&gt;

&lt;p&gt;Within the Solon AI ecosystem, developers are not just writing code, but also &lt;strong&gt;"software-defined capabilities"&lt;/strong&gt;. If the large model is the engine of the agent, then the Skills system is its navigator and operating procedures. This is not only a shift in development paradigms, but also an essential path to industrial-grade agents.&lt;/p&gt;

&lt;p&gt;GitHub address: &lt;a href="https://github.com/opensolon/solon-ai" rel="noopener noreferrer"&gt;https://github.com/opensolon/solon-ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>solon</category>
      <category>java</category>
    </item>
    <item>
      <title>MCP Evolution: Transforming Static Tools into Remote Skills with "Context Awareness"</title>
      <dc:creator>noear</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:03:18 +0000</pubDate>
      <link>https://dev.to/noear/mcp-evolution-transforming-static-tools-into-remote-skills-with-context-awareness-32mp</link>
      <guid>https://dev.to/noear/mcp-evolution-transforming-static-tools-into-remote-skills-with-context-awareness-32mp</guid>
      <description>&lt;p&gt;In AI Agent engineering practice, Model Context Protocol (MCP) has become the standard bridge connecting large models with the external world. However, as application scenarios shift from "personal assistants" to "complex enterprise-level business," the traditional MCP interaction mode is beginning to reveal its &lt;strong&gt;"static" bottleneck&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Solon AI supports encapsulating MCP as Skills, achieving a leap from a "cold collection of APIs" to "intelligent skills with perception capabilities."&lt;/p&gt;

&lt;h3&gt;
  
  
  I. Three Major Pain Points of Static Tools
&lt;/h3&gt;

&lt;p&gt;Traditional MCP interaction is similar to an "unclosable toolbox," where all tools flood in regardless of the scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context Noise:&lt;/strong&gt; Even a simple greeting injects hundreds or thousands of lines of tool schema definitions into the model, wasting tokens and interfering with the model's focus on inference.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security Risks:&lt;/strong&gt; The model's visibility to tools is "full." It's difficult to dynamically hide sensitive operations (e.g., deleting an order) based on the currently logged-in user's role (e.g., regular user vs. administrator).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instruction Gap:&lt;/strong&gt; The tool only provides "what can be done," but cannot tell the model "how to do it in the current context." The model lacks immediate instruction constraints specific to particular business scenarios.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  II. Core Solutions: Perception, Mounting, and Dynamic Distribution
&lt;/h3&gt;

&lt;p&gt;Solon AI addresses the above pain points by introducing a Skill (Solon AI Skills) lifecycle to wrap the MCP protocol, implementing the following mechanisms:&lt;/p&gt;

&lt;h4&gt;
  
  
  A. Intelligent Admission (isSupported):
&lt;/h4&gt;

&lt;p&gt;Skills are only activated when the Prompt context (intent, tenant information, environment variables) meets the conditions.&lt;/p&gt;

&lt;h4&gt;
  
  
  B. Instruction Injection (getInstruction):
&lt;/h4&gt;

&lt;p&gt;When a skill is mounted, a "behavioral guideline" (System Message) specific to the current context is automatically injected into the model.&lt;/p&gt;

&lt;h4&gt;
  
  
  C. Three-State Routing (getToolsName):
&lt;/h4&gt;

&lt;p&gt;The server dynamically determines which tools to display to the model based on the Prompt attribute. Three routing modes are supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Full Use: Displays all business tools when no filtering logic is defined.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Precise Authorization: Only displays tools within the current user's permission scope.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete Denial: Even if the skill is activated, security policies may block all tool calls at this time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  III. Practical Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Client-Side: Calling Like a Local Skill
&lt;/h4&gt;

&lt;p&gt;Developers only need to focus on injecting business attributes; they don't need to worry about tool filtering logic. Everything is agreed upon and negotiated between the MCP Skill proxy and the remote server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.ChatModel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.prompt.Prompt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.McpChannel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.client.McpClientProvider&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.client.McpSkillClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//Build the mcp client&lt;/span&gt;
&lt;span class="nc"&gt;McpClientProvider&lt;/span&gt; &lt;span class="n"&gt;mcpClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpClientProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;McpChannel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STREAMABLE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:8081//skill/order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Build prompt words with business attributes&lt;/span&gt;
&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Help me cancel order A001"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"solon_001"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attrPut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_role"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ADMIN"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Impersonating an administrator&lt;/span&gt;

&lt;span class="c1"&gt;// Inject skills and the model will only see tools with "administrator" permissions&lt;/span&gt;
&lt;span class="n"&gt;chatModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;skillAdd&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpSkillClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mcpClient&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;//Wrap the mcp client as Solon AI Skills&lt;/span&gt;
         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Server-side: Implementing skills with "perception"
&lt;/h4&gt;

&lt;p&gt;The server no longer blindly responds, but determines its behavior by parsing the Prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.annotation.ToolMapping&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.chat.prompt.Prompt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.McpChannel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.server.McpSkillServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@McpServerEndpoint&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpChannel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STREAMABLE_STATELESS&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mcpEndpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/skill/order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderSkillServer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;McpSkillServer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Perceived intent: Activated only when an "order" is involved and the tenant is compliant&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserContent&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"订单"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; 
               &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getInstruction&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Dynamic directives: Inject tenant-specific business rules&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"你现在是租户["&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tenant_id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"]的订单助手。"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getToolsName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Prompt&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Privilege isolation: Dynamically issue tool names based on user roles&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderQuery"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 基础权限&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ADMIN"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user_role"&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OrderCancel"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Visible only to administrators&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Query order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;OrderQuery&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ToolMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Cancel an order"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;OrderCancel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  IV. Skills Architecture Reflection and Limitations Supplement
&lt;/h3&gt;

&lt;p&gt;While evolving MCP into Skills brings significant engineering advantages, developers still need to clarify its technical boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-standardized architectural enhancements:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LLM's underlying standard only includes Prompt and Tool-Call. Skills are not a native model standard, nor are they part of MCP's public protocol specification; rather, they are an architectural design pattern (a general pattern). They are typically implemented on the consumer side by AI development frameworks (such as Solon AI) to solve capability scheduling problems in complex business scenarios.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consumer-side driven customization:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The evolution from MCP to Skills is essentially "business-driven" or "domain-driven." When designing remote MCP Skills, deep customization must be performed with reference to the specific specifications of the consumer side (i.e., the Agent execution engine).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Applicable Scenarios:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tool: Suitable for simple functional plugins that are atomic, stateless, and fully public.&lt;/p&gt;

&lt;p&gt;Skill: Suitable for complex business logic blocks requiring context awareness, multi-tenant isolation, and dynamic instruction constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  V. Summary of Benefits
&lt;/h3&gt;

&lt;p&gt;After evolving MCP into Skills, your AI Agent architecture will gain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extreme Context Purity:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model only sees the tools it should see at that moment (on-demand loading via getToolsName, or access control).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Natural Access Security:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;True cross-process role-based access control (RBAC for Tools) is achieved through server-aware dynamic distribution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loosely Coupled Business Evolution:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Business logic and rule changes are centralized on the server side; clients can obtain the latest capabilities "without" any code modifications.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>java</category>
      <category>solon</category>
    </item>
  </channel>
</rss>
