<?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: Ved Sharma</title>
    <description>The latest articles on DEV Community by Ved Sharma (@ved_sharma_e776421e694cdc).</description>
    <link>https://dev.to/ved_sharma_e776421e694cdc</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%2F3405812%2F0af043b6-ef47-4683-9b52-ccf147b9acbb.png</url>
      <title>DEV Community: Ved Sharma</title>
      <link>https://dev.to/ved_sharma_e776421e694cdc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ved_sharma_e776421e694cdc"/>
    <language>en</language>
    <item>
      <title>Lets create no cost personal coding assistant alternative to Claude code/Cursor</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Tue, 10 Feb 2026 08:14:18 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/lets-create-no-cost-personal-coding-assistant-alternative-to-claude-codecursor-1ekb</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/lets-create-no-cost-personal-coding-assistant-alternative-to-claude-codecursor-1ekb</guid>
      <description>&lt;h2&gt;
  
  
  Orchestrating Semi-Autonomous Agentic Workflows: A Technical Framework for Integrating Cline, n8n, and the Model Context Protocol
&lt;/h2&gt;

&lt;p&gt;The transition from static code completion to dynamic, semi-autonomous agentic systems represents the current frontier in software engineering productivity. While traditional large language models (LLMs) operate with significant internal reasoning capabilities, their utility is fundamentally constrained by the “sandbox” of their training data and the isolation of their execution environment. To transcend these limitations, an architecture must be established that bridges high-level reasoning with real-world tool execution. The integration of Cline, an advanced interface for Visual Studio Code, with n8n, a comprehensive workflow automation platform, provides this necessary infrastructure. By utilizing the Model Context Protocol (MCP) as a standardized communication layer, developers can construct a system where the “hard work” of environmental interaction — such as searching global package registries, executing multi-language test suites, and performing live internet research — is offloaded to a deterministic automation engine while leaving the sophisticated code generation and structural reasoning to the agentic core.1&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Overview of the Semi-Autonomous Ecosystem
&lt;/h2&gt;

&lt;p&gt;The proposed ecosystem functions as a distributed intelligence network where components are categorized by their role in the decision-execution cycle. Cline serves as the primary orchestrator, maintaining the state of the local codebase and acting as the human-facing interface within the Integrated Development Environment (IDE). n8n serves as the external nervous system, capable of reaching out to APIs, registries, and the underlying host operating system to perform tasks that would be computationally expensive or contextually impossible for a standalone LLM to perform reliably.3 The Model Context Protocol (MCP) serves as the bridge, ensuring that these two distinct systems can share tools and data schemas without the need for bespoke, fragile integration code.1&lt;/p&gt;

&lt;p&gt;To satisfy the operational requirements of a modern development environment, this system must fulfill seven core functional pillars.&lt;/p&gt;

&lt;h2&gt;
  
  
  Functional Requirements (The 7 Pillars)
&lt;/h2&gt;

&lt;p&gt;A professional-grade semi-autonomous agent must satisfy these core requirements to be effective in a production environment :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Internet Search:&lt;/strong&gt; Query GitHub, StackOverflow, and blogs for real-time documentation and bug fixes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Registry Discovery:&lt;/strong&gt; Interact with Pub.dev (Flutter), npm (Node.js), Maven (Java), NuGet (.NET), Docker Hub, and Helm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Safe Multi-File Modification:&lt;/strong&gt; Inject imports, update cross-file logic, and refactor without losing project context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Language-Specific Validation:&lt;/strong&gt; Execute native test runners like mvn test, npm test, or flutter test to ensure code integrity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Human-in-the-Loop (HITL) Approval:&lt;/strong&gt; Require explicit developer consent for high-impact terminal commands or file writes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Multi-LanguageEcosystem Support:&lt;/strong&gt; Detect the active stack and adjust search/validation strategies automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Dynamic Intelligence Switching:&lt;/strong&gt; Toggle between zero-cost local models and high-reasoning paid cloud APIs based on task difficulty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Component Requirements and Comparative Analysis
&lt;/h2&gt;

&lt;p&gt;The selection of tools for this ecosystem is predicated on their ability to interoperate via open standards. The following table identifies the requisite components and their specific roles within the semi-autonomous framework.&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%2Fm1g94qmnj3hha4avg650.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%2Fm1g94qmnj3hha4avg650.png" alt=" " width="499" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Interactive Installation and Environment Baseline&lt;/p&gt;

&lt;p&gt;The establishment of a hands-on environment begins with the local infrastructure. For the agent to function without constant reliance on external cloud services, a local inference engine is indispensable. Ollama is the preferred solution for this requirement, providing a standardized API that mimics cloud providers while running entirely on local hardware.5&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Deploying the Local Inference Engine
&lt;/h2&gt;

&lt;p&gt;Installation of Ollama is the first prerequisite. For macOS and Linux users, a simple shell command initiates the process, while Windows users utilize a traditional installer.5 Once installed, the primary task is to fetch a model optimized for coding. The codellama:13b-instruct or llama3 models are frequently cited as the baseline for local reasoning.5&lt;/p&gt;

&lt;p&gt;Interactive Command Sequence for Ollama:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Execute curl -fsSL &lt;a href="https://ollama.com/install.sh" rel="noopener noreferrer"&gt;https://ollama.com/install.sh&lt;/a&gt; | sh to install the backend.2&lt;/li&gt;
&lt;li&gt;Execute ollama pull codellama:13b-instruct to download the specific weights for the coding agent.&lt;/li&gt;
&lt;li&gt;Verify the service is operational by querying the local endpoint: curl &lt;a href="http://localhost:11434/api/tags" rel="noopener noreferrer"&gt;http://localhost:11434/api/tags&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The availability of a local model ensures that the agent can perform routine tasks — such as boilerplate generation or simple refactoring — without incurring API costs or transmitting sensitive codebase details to external servers.14&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Orchestration Layer Deployment with n8n
&lt;/h2&gt;

&lt;p&gt;The deployment of n8n must be approached with the understanding that it will act as the primary interface for “hard work” tasks.2 Running n8n via Docker is recommended because it allows the “Execute Command” node to run within a controlled, containerized environment, which is vital for multi-language testing.6&lt;/p&gt;

&lt;p&gt;To initialize n8n with the necessary persistence, a dedicated Docker volume must be created. This ensures that the workflows and credentials configured during the setup are not lost upon container restart.16&lt;/p&gt;

&lt;p&gt;Bash (Assuming you have some familarity with Docker)&lt;/p&gt;

&lt;p&gt;docker volume create n8n_data&lt;br&gt;
docker run -it — rm — name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n n8nio/n8n&lt;/p&gt;

&lt;p&gt;Upon successful startup, the user navigates to &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt; to finalize the account setup. It is critical to note that n8n Cloud is a viable alternative for users who do not wish to manage infrastructure, although some “Execute Command” capabilities are restricted on the cloud tier.6&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Installing and Configuring Cline in VS Code
&lt;/h2&gt;

&lt;p&gt;Cline is the final piece of the local installation. It is acquired through the Visual Studio Code Extension Marketplace. After installation, the user must navigate to the settings gear (⚙️) within the Cline panel to establish the connection to the Ollama backend.18&lt;/p&gt;

&lt;p&gt;Key Configuration Settings for Cline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Provider: Select “Ollama” from the dropdown menu.14&lt;/li&gt;
&lt;li&gt;Base URL: Ensure it points to &lt;a href="http://localhost:11434.14" rel="noopener noreferrer"&gt;http://localhost:11434.14&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Model ID: Select the codellama:13b-instruct model downloaded in Step 1.14&lt;/li&gt;
&lt;li&gt;Context Window: Set this to at least 32,000 tokens. Coding tasks require significant context to understand multi-file structures.14&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Engineering the Bridge: Connecting Cline to n8n via MCP
&lt;/h2&gt;

&lt;p&gt;The core of the “semi-autonomous” functionality lies in the bridge. Without this connection, Cline can only reason about files and run local terminal commands; it cannot leverage the sophisticated automation workflows of n8n. The Model Context Protocol (MCP) enables Cline to discover n8n workflows as if they were built-in tools.7&lt;/p&gt;
&lt;h2&gt;
  
  
  The Role of the MCP Server in Workflow Execution
&lt;/h2&gt;

&lt;p&gt;There are two primary methods for establishing this bridge, depending on the user’s specific goals. Method A involves using a dedicated bridge package (n8n-mcp) to allow Cline to manage and build n8n workflows.1 Method B utilizes n8n’s built-in “Instance-level MCP” to expose specific workflows as deterministic tools.22&lt;/p&gt;

&lt;p&gt;For the purpose of offloading “hard work,” Method B is often superior. It allows the developer to pre-define complex logic in n8n — such as a recursive search across multiple documentation sites — and expose it to Cline as a single, simple tool call.&lt;/p&gt;
&lt;h2&gt;
  
  
  Interactive Bridge Configuration (stdio Method)
&lt;/h2&gt;

&lt;p&gt;To connect Cline to a local n8n instance, the cline_mcp_settings.json file must be modified. This file is located in the VS Code global storage directory.21 The configuration requires the use of npx to execute the bridge server.1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
 "mcpServers": {
 "n8n-bridge": {
 "command": "npx",
 "args": ["-y", "n8n-mcp"],
 "env": {
 "MCP_MODE": "stdio",
 "N8N_API_URL": "http://localhost:5678",
 "N8N_API_KEY": "YOUR_N8N_API_KEY",
 "LOG_LEVEL": "error",
 "DISABLE_CONSOLE_OUTPUT": "true"
 }
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The N8N_API_KEY is generated within the n8n settings dashboard under the “API” tab.&lt;/p&gt;

&lt;p&gt;Setting MCP_MODE to stdio is a non-negotiable requirement for Cline to communicate with the bridge via standard input/output streams.1&lt;/p&gt;

&lt;h2&gt;
  
  
  The Remote Bridge Alternative (SSE Method)
&lt;/h2&gt;

&lt;p&gt;For n8n instances running on remote servers or in the cloud, the “MCP Server Trigger” node is used. This node generates a unique URL that supports Server-Sent Events (SSE). Because Cline expects a local process, a tool like supergateway can be used to bridge the remote SSE endpoint to a local stdio process.&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%2Fxypzzfzmct7mgy9f6i25.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%2Fxypzzfzmct7mgy9f6i25.png" alt=" " width="512" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Functional Implementation 1: Internet and Registry Queries&lt;/p&gt;

&lt;p&gt;Once the bridge is established, n8n must be configured with workflows that perform the “hard work” of environmental research. The agent’s ability to suggest the correct library depends on real-time data from package registries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the Language Detection and Routing Logic
&lt;/h2&gt;

&lt;p&gt;Using Docker is required for the “Execute Command” node to have a consistent environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bash
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n n8nio/n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Access N8N on this port:&lt;/strong&gt; Open &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt; and create your account.&lt;br&gt;
The first node in the n8n workflow after the “Manual Trigger” or “MCP Server Trigger” is typically a Function Node that identifies the programming language and specific ecosystem mentioned in the user’s prompt. This ensures that a request for “a standard HTTP client” routes to the npm registry for Node.js projects or Pub.dev for Flutter projects.&lt;/p&gt;

&lt;p&gt;Function Node Example for Detection:&lt;/p&gt;

&lt;p&gt;JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const prompt = $json["prompt"];
let lang = "unknown";
if(prompt.match(/flutter|dart/i)) lang = "flutter";
else if(prompt.match(/node|js|javascript/i)) lang = "node";
else if(prompt.match(/java|maven/i)) lang = "java";
else if(prompt.match(/.net|c#/i)) lang = "dotnet";
return [{json: {language: lang, prompt}}];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Following this detection, a Switch Node routes the flow to the appropriate HTTP Request Node for the respective registry API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Registry Integration Endpoints
&lt;/h2&gt;

&lt;p&gt;The n8n workflow must utilize the structured APIs provided by package managers. The data returned by these nodes allows the agent to reason about version compatibility and licensing.&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%2F2yxs6xirt7s9kd3sm4x1.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%2F2yxs6xirt7s9kd3sm4x1.png" alt=" " width="451" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By aggregating the results from these endpoints, n8n constructs a response for Cline that includes the top three recommended packages, their current versions, and their installation commands.2 This transforms Cline from a code-generator into an informed consultant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Functional Implementation : Safe Multi-File Modification
&lt;/h2&gt;

&lt;p&gt;One of the most complex requirements for an autonomous agent is the ability to modify multiple files safely.2 Cline achieves this by maintaining a high-context view of the project, while n8n provides the necessary background checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reasoning-Execution Cycle
&lt;/h2&gt;

&lt;p&gt;When the agent decides to implement a feature that spans multiple files — such as adding a new API endpoint that requires changes to the controller, the service layer, and the database schema — it follows a specific sequence. First, the agent calls an n8n workflow to “Scrape Documentation” or “Verify Schema”.3 This ensures the agent is working with the most current architectural patterns.&lt;/p&gt;

&lt;p&gt;Next, the agent generates the specific code blocks for each file. Cline’s internal logic allows it to “inject” these imports and code changes without rewriting the entire file, which is crucial for preserving existing functionality.2&lt;/p&gt;

&lt;h2&gt;
  
  
  Safeguarding Multi-File Edits
&lt;/h2&gt;

&lt;p&gt;Safety is maintained through n8n’s ability to act as a pre-validation engine. Before Cline applies the changes to the disk, it can send the proposed diff to an n8n workflow that performs a “Lint Check” or “Syntax Validation” using the Execute Command node.17 If the linting fails, n8n returns the error to Cline, which then adjusts its code generation accordingly. This iterative loop drastically reduces the frequency of broken builds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Functional Implementation : Multi-Language Test Execution
&lt;/h2&gt;

&lt;p&gt;Validation is the cornerstone of autonomous reliability. The agent must not only write code but also ensure that the code performs as expected across different languages and ecosystems.2&lt;/p&gt;

&lt;h2&gt;
  
  
  The Execute Command Engine
&lt;/h2&gt;

&lt;p&gt;n8n’s Execute Command node is the primary tool for this validation. When running in Docker, this node can execute shell commands within the n8n container.17 It is important to realize that the default n8n image is based on Alpine Linux and might lack the necessary SDKs for Flutter,.NET, or Java.17&lt;/p&gt;

&lt;p&gt;To support multi-language tests, a custom Dockerfile is required to build an augmented n8n image:&lt;/p&gt;

&lt;p&gt;Dockerfile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM n8nio/n8n:latest
USER root
RUN apk add - no-cache bash curl git openjdk17-jdk python3
# Add Flutter SDK,.NET SDK, etc.
USER node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the environment is equipped with the relevant toolchains, n8n can execute tests based on the project type.&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%2Fwt7ph3u1n10s1myu9o02.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%2Fwt7ph3u1n10s1myu9o02.png" alt=" " width="512" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Returning Test Results to Cline&lt;/p&gt;

&lt;p&gt;The output of these commands (STDOUT and STDERR) is captured by n8n and returned to Cline. The agent interprets these logs; if a test fails, it analyzes the stack trace and attempts a “Self-Correction” cycle.&lt;/p&gt;

&lt;p&gt;This autonomous loop&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning -&amp;gt; Editing -&amp;gt; Testing -&amp;gt; Analyzing -&amp;gt; Re-editing&lt;/strong&gt;&lt;br&gt;
is what distinguishes an agent from a simple chat assistant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hands-On Lab: Testing on a Sample Java Repo&lt;/strong&gt;&lt;br&gt;
Now, test your creation by letting the agent perform a real development task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Create or clone a simple Maven project (e.g., a Spring Boot “Hello World”). Open the project folder in VS Code.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Autonomous Cycle
&lt;/h2&gt;

&lt;p&gt;Prompt Cline: &lt;em&gt;“I need to implement JSON parsing. Find the latest version of Jackson Databind in the Maven registry, add it to my pom.xml, and then create a new class ‘JsonParser.java’ that converts a sample String to a Map. Finally, run ‘mvn compile’ to ensure it works.”&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic LLM Switching and Cost Management
&lt;/h2&gt;

&lt;p&gt;An enterprise-grade agent must be economically viable. While high-reasoning models like Claude 3.5 Sonnet or GPT-4o are superior for architecture and planning, they are significantly more expensive than local models or lighter cloud models like DeepSeek V3.18&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategy for Model Orchestration
&lt;/h2&gt;

&lt;p&gt;The system allows for dynamic switching within the Cline settings panel.19 A recommended operational pattern is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architectural Design: Use a high-reasoning paid model (e.g., Claude 3.5 Sonnet) to analyze the project structure and plan the multi-file changes.18&lt;/li&gt;
&lt;li&gt;Routine Implementation: Once the plan is established, switch to a local model (e.g., Code Llama via Ollama) to generate the repetitive code blocks and unit tests.2&lt;/li&gt;
&lt;li&gt;Research Tasks: Offload searches to n8n, which uses free registry APIs and low-cost web search nodes, reducing the token count sent to the primary LLM.2&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Optimization and Caching
&lt;/h2&gt;

&lt;p&gt;To further reduce costs and latency, n8n can implement a caching layer for registry and web search results.2 For example, if the agent repeatedly asks for the latest version of axios, n8n can store the result in a local database (like SQLite or Redis) and return the cached version if the last check was within a 24-hour window.2 This not only saves API credits but also makes the agent feel significantly more responsive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human-in-the-Loop Logic and Safety Guardrails
&lt;/h2&gt;

&lt;p&gt;Autonomous agents operate with a level of unpredictability that requires deterministic safeguards.11 The system implements Human-in-the-Loop (HITL) logic at critical junctions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deterministic Approval in n8n
&lt;/h2&gt;

&lt;p&gt;n8n provides a robust mechanism for HITL. Before an “Execute Command” node runs a potentially destructive shell script or an “HTTP Request” node sends data to a production API, a “Wait for Approval” node can be inserted.38&lt;/p&gt;

&lt;p&gt;This workflow pattern typically includes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Request:&lt;/strong&gt; The agent proposes an action.&lt;br&gt;
&lt;strong&gt;2. Notification:&lt;/strong&gt; n8n sends the details of the action to the developer via Slack, Telegram, or Discord.38&lt;br&gt;
&lt;strong&gt;3. Decision:&lt;/strong&gt; The developer clicks “Approve” or “Reject” in the chat app.&lt;br&gt;
&lt;strong&gt;4. Execution:&lt;/strong&gt; n8n only continues if the approval is received.40&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrated Safety in Cline
&lt;/h2&gt;

&lt;p&gt;Cline itself offers a layer of HITL by presenting every proposed file change as a diff in VS Code.5 The agent cannot overwrite files without the user specifically allowing the write operation. This dual-layered safety approach — n8n for environment-level actions and Cline for codebase-level actions — ensures that the developer maintains total control over the autonomous process.2&lt;/p&gt;

&lt;h2&gt;
  
  
  Synthesis of the Agentic Lifecycle
&lt;/h2&gt;

&lt;p&gt;The successful implementation of a semi-autonomous coding agent requires a shift in how developers conceptualize the software development lifecycle. By integrating Cline and n8n via MCP, the workflow becomes a synchronized dance between reasoning and automation. The agent acts as the brain, identifying the “what” and “why” of a task, while n8n acts as the hands and eyes, handling the “how” and the real-world data retrieval.3&lt;/p&gt;

&lt;p&gt;The multi-language support is not merely a feature but a byproduct of n8n’s universal connectivity. Whether the project is in Dart, JavaScript, or C#, the agent uses the same bridge to access language-specific tools and registries.2 This modularity allows the system to scale; as new technologies emerge, adding support is as simple as adding a new node to an n8n workflow, without needing to modify the agent’s core reasoning logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By isolating &lt;strong&gt;Reasoning (Cline/Ollama) from Environmental Interaction (n8n)&lt;/strong&gt;, we have created a modular agent that grows with your needs. While the LLM’s internal data may be outdated, its connection to n8n ensures it always has access to the latest versions in 2026 and beyond.&lt;/p&gt;

</description>
      <category>generativeaitools</category>
      <category>ollama</category>
      <category>n8n</category>
      <category>softwareachitecture</category>
    </item>
    <item>
      <title>Why you should take Free Claude Code Skills Assessment</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Sat, 07 Feb 2026 08:32:18 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/why-you-should-take-free-claude-code-skills-assessment-k28</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/why-you-should-take-free-claude-code-skills-assessment-k28</guid>
      <description>&lt;p&gt;You write code every day.&lt;br&gt;
But do you know &lt;strong&gt;how well you actually think in code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Claude Code Skill Assessment by &lt;a href="//www.thinkhymble.in"&gt;ThinkHumble&lt;/a&gt;&lt;/strong&gt; is designed to test something interviews often miss &lt;br&gt;
&lt;strong&gt;real-world reasoning, not just syntax.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this assessment really measures
&lt;/h2&gt;

&lt;p&gt;✔ Your ability to &lt;strong&gt;understand large codebases&lt;/strong&gt;&lt;br&gt;
✔ How you &lt;strong&gt;break down and solve problems&lt;/strong&gt;&lt;br&gt;
✔ Your skill in &lt;strong&gt;refactoring, debugging, and explaining code&lt;/strong&gt;&lt;br&gt;
✔ How effectively you &lt;strong&gt;use AI-assisted reasoning&lt;/strong&gt; (yes, the future skill)&lt;/p&gt;

&lt;p&gt;This isn’t about speed.&lt;br&gt;
It’s about &lt;strong&gt;thinking like an engineer.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;Developers who complete this assessment:&lt;br&gt;
• Demonstrate &lt;strong&gt;real-world coding judgment&lt;/strong&gt;&lt;br&gt;
• Showcase &lt;strong&gt;AI-augmented development skills&lt;/strong&gt;&lt;br&gt;
• Stand out beyond &lt;strong&gt;resumes and interviews&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Get a FREE certificate&lt;/strong&gt;&lt;br&gt;
✅ Add credibility to your profile&lt;br&gt;
✅ Prove how well you reason with code — not just write it&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take the Free Claude Code Skill Assessment now&lt;/strong&gt; &lt;a href="https://forms.gle/oAzmsHDGz9pjM2MG7" rel="noopener noreferrer"&gt;https://forms.gle/oAzmsHDGz9pjM2MG7&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>certification</category>
      <category>coding</category>
      <category>programming</category>
    </item>
    <item>
      <title>𝐓𝐡𝐢𝐧𝐤 𝐲𝐨𝐮 𝐫𝐞𝐚𝐥𝐥𝐲 𝐤𝐧𝐨𝐰 𝐲𝐨𝐮𝐫 𝐂𝐥𝐚𝐮𝐝𝐞 𝐂𝐨𝐝𝐞 𝐒𝐤𝐢𝐥𝐥𝐬? ☁️ 𝐎𝐫 𝐚𝐫𝐞 𝐲𝐨𝐮 𝐣𝐮𝐬𝐭 𝐠𝐮𝐞𝐬𝐬𝐢𝐧𝐠?</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Tue, 03 Feb 2026 11:41:04 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/--44k2</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/--44k2</guid>
      <description>&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%2Fi5djtsnqe3u80xpn7pwd.jpg" 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%2Fi5djtsnqe3u80xpn7pwd.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
Built for 𝐂𝐥𝐚𝐮𝐝𝐞 𝐂𝐨𝐝𝐞 𝐞𝐧𝐭𝐡𝐮𝐬𝐢𝐚𝐬𝐭𝐬, 𝐁𝐞𝐠𝐢𝐧𝐧𝐞𝐫𝐬, 𝐢𝐧𝐭𝐞𝐫𝐦𝐞𝐝𝐢𝐚𝐭𝐞𝐬, 𝐚𝐧𝐝 𝐂𝐥𝐚𝐮𝐝𝐞 𝐂𝐨𝐝𝐞 𝐞𝐱𝐩𝐞𝐫𝐭𝐬 alike, a way to test your skills, benchmark yourself, and get actionable insights instantly.&lt;/p&gt;

&lt;p&gt;𝐑𝐞𝐠𝐢𝐬𝐭𝐞𝐫 𝐇𝐞𝐫𝐞: &lt;a href="https://forms.gle/PqCgPgMdhHTneHSq9" rel="noopener noreferrer"&gt;https://forms.gle/PqCgPgMdhHTneHSq9&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claudecodeskills</category>
      <category>claudecodecomputing</category>
      <category>claude</category>
      <category>claudeai</category>
    </item>
    <item>
      <title>Careers in Cybersecurity: Building a Secure Digital Future</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:43:13 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/careers-in-cybersecurity-building-a-secure-digital-future-23b1</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/careers-in-cybersecurity-building-a-secure-digital-future-23b1</guid>
      <description>&lt;p&gt;Why Cybersecurity Has Become One of the World’s Most In-Demand Career Paths&lt;/p&gt;

&lt;p&gt;As digital transformation accelerates across industries worldwide, cybersecurity has emerged as one of the most critical and future-ready career paths. Organizations across finance, healthcare, education, manufacturing, and technology rely heavily on digital infrastructure, cloud platforms, and data-driven systems. This global dependence on technology has created a strong demand for professionals who can identify risks, respond to cyber threats, and ensure digital trust.&lt;/p&gt;

&lt;p&gt;To gain deeper insight into how cybersecurity careers are evolving globally, watch this in-depth discussion:&lt;br&gt;
&lt;strong&gt;👉 Watch the full video:&lt;/strong&gt; &lt;a href="https://youtu.be/Fj4cDMv5qsU" rel="noopener noreferrer"&gt;https://youtu.be/Fj4cDMv5qsU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cybersecurity is considered a &lt;strong&gt;future-proof career&lt;/strong&gt; because security challenges evolve alongside technology. While tools and platforms continue to change, the need to protect systems, data, and users remains constant. As cyberattacks grow more sophisticated and frequent, organizations are shifting their focus from credentials alone to &lt;strong&gt;validated, role-ready cybersecurity skills&lt;/strong&gt; that reflect real-world capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Career Roles in Cybersecurity
&lt;/h2&gt;

&lt;p&gt;Cybersecurity offers diverse global career opportunities, including:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Analyst —&lt;/strong&gt; Monitors systems, investigates threats, and analyzes vulnerabilities&lt;br&gt;
&lt;strong&gt;SOC Analyst —&lt;/strong&gt; Responds to incidents in real time within security operations environments&lt;br&gt;
&lt;strong&gt;Penetration Tester (Ethical Hacker) —&lt;/strong&gt; Simulates attacks to uncover security weaknesses&lt;br&gt;
&lt;strong&gt;Cloud Security Specialist —&lt;/strong&gt; Secures cloud-based and hybrid infrastructures&lt;br&gt;
&lt;strong&gt;Governance, Risk, and Compliance (GRC) Professional —&lt;/strong&gt; Ensures alignment with global security standards and regulations&lt;br&gt;
Each role requires a blend of technical knowledge, analytical thinking, and situational awareness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills That Matter in Today’s Market
&lt;/h2&gt;

&lt;p&gt;Modern cybersecurity careers emphasize &lt;strong&gt;practical skills over theoretical knowledge.&lt;/strong&gt; Employers worldwide value professionals who can:&lt;/p&gt;

&lt;p&gt;● Solve security problems using real-world scenarios&lt;br&gt;
● Apply role-specific security expertise&lt;br&gt;
● Respond effectively to cyber incidents&lt;br&gt;
● Understand attacker behavior and threat models&lt;br&gt;
● Communicate risks clearly to technical and business teams&lt;/p&gt;

&lt;p&gt;This shift has increased the importance of &lt;strong&gt;GenAI-powered skill evaluation,&lt;/strong&gt; adaptive assessments, and behavioral simulations. Platforms like &lt;a href="https://thinkhumble.in/" rel="noopener noreferrer"&gt;ThinkHumble&lt;/a&gt; enable scalable, SME-free, role-based cybersecurity assessments that help organizations evaluate real readiness and gain actionable talent insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Career Growth in the Age of GenAI
&lt;/h2&gt;

&lt;p&gt;Cybersecurity offers strong long-term career progression, from entry-level roles to advanced positions such as &lt;strong&gt;Security Architect, Consultant, or Chief Information Security Officer (CISO).&lt;/strong&gt; GenAI enhances this journey by enabling predictive insights and realistic skill evaluation while keeping human judgment at the center.&lt;/p&gt;

&lt;p&gt;In a globally connected digital economy, cybersecurity careers provide stability, growth, and meaningful impact by protecting systems, data, and trust.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>futureproofcareer</category>
      <category>careeroptions</category>
      <category>job</category>
    </item>
    <item>
      <title>Lets decipher versioning hell</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Sat, 17 Jan 2026 06:12:02 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/lets-decipher-versioning-hell-5ced</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/lets-decipher-versioning-hell-5ced</guid>
      <description>&lt;p&gt;Often heard of seen by all of new version of IPhone is getting released or new version of Windows is getting released. What does that mean ? and Why you care about a version ?&lt;/p&gt;

&lt;p&gt;Lets discuss the nuance of versioning software or hardware in detail and Semantic versioning specifically. Take a example some company ABC is trying to create a Ticket booking platform and it started to support searching a flight and booking in version 1.0.0, but now there is an issue in the booking system it is booking 2 tickets instead of one.&lt;/p&gt;

&lt;p&gt;So this is a bug and should be fixed. So ABC is going to release a new version of software say 1.0.1.&lt;/p&gt;

&lt;p&gt;Now an obvious question why not 2.0.0 that is much easier to understand and follow correct ?&lt;/p&gt;

&lt;p&gt;That is where semantic versioning comes into play whenever software of hardware is patched essentially fixed for certain bugs it will increment last digit of semantic version string in this case it is 1.0.0 to 1.0.1.&lt;/p&gt;

&lt;p&gt;Now lets understand another scenario, same company ABC wants to add an option of seat selection to its interface and release a new feature on its website now it will name this version as 1.1.0.&lt;/p&gt;

&lt;p&gt;Curios why it is not named as 2.0.0 ?&lt;br&gt;
Answer to above question is since this is an incremental change and it will not break the experience of the user that is backward compatible with older feature thus it is kept as 1.1.0. For example if someone don’t want to do seat selection still want to book is still guaranteed.&lt;/p&gt;

&lt;p&gt;Now one last scenario, imagine same ABC company want to start train booking and release a new version of application and name it 2.0.0.&lt;/p&gt;

&lt;p&gt;This time you wonder why this has moved to 2.0.0 ?&lt;/p&gt;

&lt;p&gt;Answer is this change is a bigger change a new stream of work or new user experience has been enabled thus application is version to 2.0.0. Here newer changes may not be compatible with the older one say a new feature working on this version may not work for those seamlessly if added to the older version until an effort is made to back port it on older version. For example ABC may put a restriction of booking Airline ticket with seat selection as mandatory which was not there earlier.&lt;/p&gt;

&lt;p&gt;Semantic string syntax is MAJOR_VERSION.MINOR_VERSION.PATCH_VERSION.&lt;/p&gt;

&lt;p&gt;So next time you upgrade your phone software just observe the string coming on your screen.&lt;/p&gt;

&lt;p&gt;🌐 Explore more at &lt;a href="http://www.thinkhumble.in" rel="noopener noreferrer"&gt;www.thinkhumble.in&lt;/a&gt;&lt;/p&gt;

</description>
      <category>versioncontrol</category>
      <category>sementicversioning</category>
      <category>softwaredevelopment</category>
      <category>devops</category>
    </item>
    <item>
      <title>LLM Parameter fine tuning with Spring AI</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Wed, 07 Jan 2026 12:30:01 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/llm-parameter-fine-tuning-with-spring-ai-kbo</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/llm-parameter-fine-tuning-with-spring-ai-kbo</guid>
      <description>&lt;p&gt;Ever wondered what it takes to be more creative while generating a story with LLM versus doing a technical task, answer lies in the parameters of LLM you play around, if you know what to pick and choose for a given activity results will be significantly different.&lt;/p&gt;

&lt;p&gt;This tutorial explains how to “tune” the behavior of your Large Language Models (LLMs) using &lt;strong&gt;Spring AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is important to clarify a technical distinction: while “finetuning” often refers to retraining a model on new data, most developers use the term to describe &lt;strong&gt;Inference Parameter Tuning&lt;/strong&gt; — adjusting the “knobs” that control how a model generates text in real-time. Spring AI makes this easy through the ChatOptions interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding the “Knobs”
&lt;/h2&gt;

&lt;p&gt;Before diving into code, let’s understand the primary parameters you can control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Temperature:&lt;/strong&gt; Controls randomness. A value of &lt;strong&gt;0&lt;/strong&gt; makes the model deterministic (it will always pick the most likely word). A value of &lt;strong&gt;1.0+&lt;/strong&gt; makes it highly creative and unpredictable.&lt;br&gt;
&lt;strong&gt;- Top-P (Nucleus Sampling):&lt;/strong&gt; The model considers only the tokens whose cumulative probability reaches the value P (e.g., 0.9). It’s more dynamic than Top-K.&lt;br&gt;
&lt;strong&gt;- Top-K:&lt;/strong&gt; The model only considers the top $K$ most likely next words. This “cuts the tail” of low-probability words.&lt;br&gt;
&lt;strong&gt;- Frequency Penalty:&lt;/strong&gt; Discourages the model from repeating the same words or phrases.&lt;br&gt;
&lt;strong&gt;- Presence Penalty:&lt;/strong&gt; Encourages the model to talk about new topics.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Spring AI Implementation
&lt;/h2&gt;

&lt;p&gt;In Spring AI, you can set these parameters globally in your application.properties or per-request using ChatOptions.&lt;/p&gt;
&lt;h2&gt;
  
  
  Per-Request Configuration (Recommended)
&lt;/h2&gt;

&lt;p&gt;This approach allows you to use different settings for different parts of your app (e.g., a “Creative Story” endpoint vs. a “Data Extraction” endpoint).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/creative-chat")
public String creativeChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.options(OpenAiChatOptions.builder()
.withTemperature(0.9f) // High creativity
.withTopP(0.9f) // Diverse vocabulary
.withMaxTokens(500) // Length limit
.build())
.call()
.content();
}
@GetMapping("/precise-chat")
public String preciseChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.options(OpenAiChatOptions.builder()
.withTemperature(0.1f) // Low randomness
.withFrequencyPenalty(0.5f) // Prevent repetition
.build())
.call()
.content();
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Global Configuration
&lt;/h2&gt;

&lt;p&gt;If you want a consistent “vibe” across your entire application, use application.properties:&lt;br&gt;
Properties&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spring.ai.openai.chat.options.temperature=0.7
spring.ai.openai.chat.options.model=gpt-4o
spring.ai.openai.chat.options.top-p=1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Parameter Recommendations by Use Case
&lt;/h2&gt;

&lt;p&gt;Choosing the right values depends entirely on your goal. Here is a guide for common scenarios:&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%2F80yjphdi4887zaok0g8b.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%2F80yjphdi4887zaok0g8b.png" alt=" " width="512" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Pro-Tips for Tuning
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don’t tweak both Temp and Top P:&lt;/strong&gt; Most AI labs (like OpenAI) recommend adjusting either Temperature or Top-P, but not both at once, as they can conflict or produce erratic results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use 0 for JSON:&lt;/strong&gt; If you are using Spring AI’s BeanOutputConverter to get structured data, set Temperature to 0. Hallucinations in JSON keys will break your code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Frequency vs. Presence:&lt;/strong&gt; Use &lt;strong&gt;Frequency Penalty&lt;/strong&gt; if the model gets stuck repeating a specific word. Use &lt;strong&gt;Presence Penalty&lt;/strong&gt; if the model keeps circling back to the same concept.&lt;/p&gt;

&lt;p&gt;Connect with me at below email if you need a curated learning path for yourself in AI/Gen AI. It does not matter which stream or role you come from. There is a learning path for everyone.&lt;/p&gt;

&lt;p&gt;&lt;a href="mailto:connect@thinkhumble.in"&gt;connect@thinkhumble.in&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>genai</category>
      <category>springboot</category>
      <category>java</category>
    </item>
    <item>
      <title>Why Log levels matter?</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Tue, 30 Dec 2025 09:42:29 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/why-log-levels-matter-2j39</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/why-log-levels-matter-2j39</guid>
      <description>&lt;h2&gt;
  
  
  The Definitive Guide to Log Levels and Centralized Logging
&lt;/h2&gt;

&lt;p&gt;Ever wondered why people dont use system.out to print/log ? Or why at one place someone use log.debug and other places log.info. Why your review comments always ask for more logging statements. Why it matters to choose right logging level. How to effectively use it ?&lt;/p&gt;

&lt;p&gt;Effective logging is the backbone of application health monitoring and debugging. By consistently and correctly using log levels, developers can maintain a crucial b*&lt;em&gt;alance between visibility and noise&lt;/em&gt;* across all environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Log Levels and Their Usage
&lt;/h2&gt;

&lt;p&gt;Log levels are a hierarchical system used to categorize the severity or importance of a log message. The common hierarchy, from least to most severe, is generally:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TRACE: Very granular&lt;/strong&gt; information, typically used for detailed tracing of a request or process flow. You’d enable this only for deep, short-term debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. DEBUG: Fine-grained&lt;/strong&gt; informational events that are most useful to debug an application. This includes variable values, entry/exit points of methods, and steps taken within a process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. INFO: Confirmation that things are working&lt;/strong&gt; as expected. This level provides general application health and progress messages, such as service startup/shutdown, major state changes, or successful key operations. This is often the default level for production environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. WARN: Potentially harmful situations&lt;/strong&gt; or unexpected events that might indicate a problem but do not necessarily prevent the application from continuing. Examples include use of deprecated APIs, hitting a soft limit, or a recoverable failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. ERROR: Serious errors&lt;/strong&gt; that prevent certain parts of the application from functioning, but the application as a whole might still be running. Examples are exceptions that cause a feature to fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. FATAL: Very severe error events&lt;/strong&gt; that will likely cause the application to abort. This is usually reserved for catastrophic failures that bring down the entire system or a critical component.&lt;/p&gt;

&lt;h2&gt;
  
  
  WARN vs. INFO: Distinguishing the Difference
&lt;/h2&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%2Fs3ybny0dkvo5lw9uvlkg.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%2Fs3ybny0dkvo5lw9uvlkg.png" alt=" " width="512" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Java Logging Anti-Patterns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why Avoid e.printStackTrace()&lt;/strong&gt;&lt;br&gt;
Calling e.printStackTrace() directly within application code is highly discouraged:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Uncontrolled Output Stream:&lt;/strong&gt;  It writes directly to the** Standard Error Stream (System.err)**, bypassing the configured logging framework (e.g., Log4j, SLF4J).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. No Filtering or Formatting:&lt;/strong&gt; The output &lt;strong&gt;cannot be formatted&lt;/strong&gt; (no timestamp, log level) and &lt;strong&gt;cannot be filtered.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Bypasses Log Destination:&lt;/strong&gt; It ignores your configuration for centralized systems like Splunk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The recommended practice&lt;/strong&gt; is to log the exception using the framework at the ERROR level, ensuring the full stack trace is captured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Preferred approach:
try {
// … code that might throw an exception
} catch (Exception e) {
logger.error(“Error processing request X”, e); // The ‘e’ parameter logs the full stack trace
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Problem with System.out.println()
&lt;/h2&gt;

&lt;p&gt;Using System.out.println() for application logging is problematic because it&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Writes to Standard Output Stream (System.out):&lt;/strong&gt; This bypasses the logging framework entirely, leading to &lt;strong&gt;unstructured and untagged&lt;/strong&gt; output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. No Context:&lt;/strong&gt; The message lacks crucial metadata like the &lt;strong&gt;log level, timestamp, or thread name.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Inflexible Configuration:&lt;/strong&gt; You &lt;strong&gt;cannot easily control or filter&lt;/strong&gt; the output without code redeployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sending Logs to Centralized Systems (Splunk, LogicMonitor, etc.)
&lt;/h2&gt;

&lt;p&gt;To leverage the power of &lt;strong&gt;Centralized Logging Systems&lt;/strong&gt; (Splunk, LogicMonitor, ELK Stack), you must configure your logging framework (Log4j, Logback) to direct output to them. This is done via &lt;strong&gt;Appenders (or Handlers)&lt;/strong&gt; in your external configuration file.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Robust Approach: File-Based Logging with an Agent (Recommended)
&lt;/h2&gt;

&lt;p&gt;This is the most common and reliable method, favored by large-scale deployments:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;● Application Action:&lt;/strong&gt; The application uses a standard &lt;strong&gt;RollingFileAppender&lt;/strong&gt; to write highly structured logs (preferably JSON) to a local file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;● Agent Action:&lt;/strong&gt; A dedicated, lightweight log forwarding agent (e.g., &lt;strong&gt;Splunk Universal Forwarder, LogicMonitor Collector&lt;/strong&gt;, Fluentd) runs on the same server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;● Shipping:&lt;/strong&gt; The agent is configured to &lt;strong&gt;“tail”&lt;/strong&gt; (monitor) the application’s log file, read new entries in real-time, and forward them over the network to the central log aggregator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefit for Centralized Logging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reliability&lt;/strong&gt; Logs are safely stored locally if the network or collector is down, ensuring no data loss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt; Writing to a local file is much faster than synchronous network calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parsing&lt;/strong&gt; The agent can standardize the data into JSON or key-value pairs before ingestion.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Direct Network Appenders
&lt;/h2&gt;

&lt;p&gt;For specialized needs, you can configure the logging library to send logs directly over the network:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• Network Protocol Appender:&lt;/strong&gt; Configure an appender to send logs via a protocol like &lt;strong&gt;Syslog (TCP/UDP).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;• HTTP/API Appender:&lt;/strong&gt; Use a specialized appender (like SplunkHttpEventCollectorAppender) to send structured JSON data directly to the vendor’s API endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crucially, no modification to the application’s core logging calls is needed.&lt;/strong&gt; You continue to use standard calls (e.g., logger.info(…)). The logging framework handles the delivery mechanism based on the external configuration file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary and Best Practices
&lt;/h2&gt;

&lt;p&gt;Choosing the right log level is a fundamental step in building maintainable software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log Level Usage Guidelines&lt;/strong&gt;&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%2F6v9u0tyeccl0929zmxzw.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%2F6v9u0tyeccl0929zmxzw.png" alt=" " width="512" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Potential Pitfalls of Using Wrong Log Levels&lt;/strong&gt;&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%2F3u1bdv4v48wt717oz5dk.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%2F3u1bdv4v48wt717oz5dk.png" alt=" " width="512" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>logging</category>
      <category>springboot</category>
      <category>java</category>
    </item>
    <item>
      <title>Multi step RAG with Spring AI</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Wed, 24 Dec 2025 13:52:32 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/multi-step-rag-with-spring-ai-nd4</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/multi-step-rag-with-spring-ai-nd4</guid>
      <description>&lt;p&gt;Standard &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt; follows a simple, linear path: take a user query, find similar documents, and send them to the LLM. While effective for basic FAQs, this “one-shot” approach fails when faced with complex, real-world problems.&lt;/p&gt;

&lt;p&gt;This guide explores &lt;strong&gt;Multistep RAG,&lt;/strong&gt; a sophisticated pattern where the AI system functions as an agent — reasoning, searching, and refining its answers through multiple iterations.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. When is Multistep RAG Required?
&lt;/h2&gt;

&lt;p&gt;In a production environment, you should transition from simple RAG to a multistep architecture when your system encounters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Multi-Hop Reasoning:&lt;/strong&gt; When an answer requires connecting two unrelated facts (e.g., “How does the CEO’s bonus in our 2023 report compare to the market average for tech firms in 2024?”). One search won’t find both pieces of data.&lt;br&gt;
&lt;strong&gt;- Missing Context (The “Web Bridge”):&lt;/strong&gt; When internal documents are outdated or incomplete. The system must recognize it lacks info and “step out” to a web search tool.&lt;br&gt;
&lt;strong&gt;- Query Ambiguity:&lt;/strong&gt; When the user’s initial question is too broad. The system needs a “Query Transformation” step to break one question into three specific sub-queries for the vector database.&lt;/p&gt;
&lt;h2&gt;
  
  
  Spring AI vs. LangChain: The Orchestration Battle
&lt;/h2&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%2F5m07qai6qt2rgurdpj10.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%2F5m07qai6qt2rgurdpj10.png" alt=" " width="512" height="100"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Project Configuration (pom.xml)
&lt;/h2&gt;

&lt;p&gt;As of late 2025, Spring AI 1.1.x and 2.0.x provide the most robust support for these patterns. Ensure you have the following dependencies:&lt;/p&gt;

&lt;p&gt;XML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-ai-openai-spring-boot-starter&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-ai-pgvector-store-spring-boot-starter&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-ai-tavily-ai-spring-boot-starter&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&amp;lt;dependencyManagement&amp;gt;
&amp;lt;dependencies&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-ai-bom&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.1.1&amp;lt;/version&amp;gt;
&amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
&amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Implementation: Multistep RAG with Web Search
&lt;/h2&gt;

&lt;p&gt;In this architecture, the ChatClient uses a &lt;strong&gt;RetrievalAugmentationAdvisor&lt;/strong&gt; to fetch internal data and a &lt;strong&gt;ToolCallAdvisor&lt;/strong&gt; to perform external web searches if the model determines it is necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define the Web Search Tool
&lt;/h3&gt;

&lt;p&gt;First, we expose a web search function as a Spring Bean. The LLM will “see” this tool and its description.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Configuration
public class AiToolsConfig {
@Bean
@Description("Search the internet for real-time news, current events, or missing technical data.")
public Function&amp;lt;SearchRequest, String&amp;gt; webSearch(TavilyAiApi tavilyApi) {
return request -&amp;gt; {
var response = tavilyApi.search(new TavilyAiApi.SearchRequest(request.query()));
return response.results().toString();
};
}
public record SearchRequest(String query) {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: The Service with Re-ranking logic
&lt;/h3&gt;

&lt;p&gt;To ensure the model isn’t overwhelmed by “noise” from the web or internal docs, we implement a &lt;strong&gt;DocumentPostProcessor&lt;/strong&gt; for re-ranking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Service
public class AdvancedRagService {
private final ChatClient chatClient;
public AdvancedRagService(ChatClient.Builder builder, VectorStore vectorStore) {
// 1. Setup the Multi-step Retriever with a Re-ranker
var retrievalAdvisor = RetrievalAugmentationAdvisor.builder()
.documentRetriever(VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.topK(15) // Get a wide pool first
.build())
.documentPostProcessors(List.of((query, docs) -&amp;gt; {
// Here you would integrate a model like Cohere Rerank
// For now, we simulate a 'Two-Stage' filter
return docs.stream().limit(5).toList();
}))
.build();
// 2. Build the Agentic ChatClient
this.chatClient = builder
.defaultAdvisors(
retrievalAdvisor, // Internal RAG
new ToolCallAdvisor(List.of("webSearch")) // Web Tool
)
.build();
}
public String execute(String userPrompt) {
return this.chatClient.prompt().user(userPrompt).call().content();
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. The Re-ranking Step (Two-Stage Retrieval)
&lt;/h2&gt;

&lt;p&gt;The most common reason for RAG failure is that the “top 3” documents found by vector math aren’t actually the best ones. Re-ranking solves this by taking a larger set (e.g., top 20) and running a more expensive “relevance score” on them.&lt;/p&gt;

&lt;p&gt;When implementing a custom re-ranker, you effectively compute a score $S = f(Query, Document)$ for every retrieved chunk, ensuring that the documents with the highest semantic signal are placed at the beginning of the prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Potential Pitfalls to Avoid
&lt;/h2&gt;

&lt;p&gt;Creating a multistep system introduces “Agentic” risks that standard RAG does not face:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- The Infinite Search Loop:&lt;/strong&gt; If the LLM is unsatisfied with search results, it may call the web search tool repeatedly.&lt;br&gt;
&lt;em&gt;- Solution:&lt;/em&gt; Always set maxToolCalls in your ChatOptions to cap the number of iterations.&lt;br&gt;
&lt;strong&gt;- Context Drift:&lt;/strong&gt; In a 3-step search, the prompt grows significantly as each step adds more text. This can cause the model to lose the original user intent.&lt;br&gt;
&lt;em&gt;- Solution:&lt;/em&gt; Use a CompressionQueryTransformer to summarize previous search results before the final generation.&lt;br&gt;
&lt;strong&gt;- Latency vs. Accuracy:&lt;/strong&gt; Every “hop” adds 1–3 seconds of delay.&lt;br&gt;
&lt;em&gt;- Solution:&lt;/em&gt; Only trigger the web tool if the internal vector search similarity score is below a certain threshold (e.g., &amp;lt; 0.7).&lt;br&gt;
&lt;strong&gt;- Hallucination in the “Reasoning” Step:&lt;/strong&gt; The model might invent a “fact” during Step 1 that it then uses to search the web in Step 2.&lt;br&gt;
&lt;em&gt;- Solution:&lt;/em&gt; Use an Evaluator Advisor to check if the tool output contradicts the initial retrieved internal context.&lt;/p&gt;

</description>
      <category>springai</category>
      <category>springboot</category>
      <category>genai</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Lets start with Spring AI</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Tue, 23 Dec 2025 06:23:09 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/lets-start-with-spring-ai-3e4h</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/lets-start-with-spring-ai-3e4h</guid>
      <description>&lt;h2&gt;
  
  
  Spring AI : Your First Step into Generative AI with Java
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Often Java based enterprise systems find it difficult to work with Python libs and related tool chains. Introducing Spring AI,&lt;/strong&gt; an open-source framework designed to simplify the development of applications that incorporate Artificial Intelligence capabilities, specifically Large Language Models (LLMs), using the familiar patterns of the Spring ecosystem.&lt;/p&gt;

&lt;p&gt;If you are a Java developer looking to integrate powerful features like ChatGPT or Google Gemini into your enterprise applications without wrestling with provider-specific SDKs, Spring AI is the perfect tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Spring AI?
&lt;/h2&gt;

&lt;p&gt;At its core, Spring AI acts as a &lt;strong&gt;common abstraction layer&lt;/strong&gt; for AI models.&lt;/p&gt;

&lt;p&gt;Think of it like &lt;strong&gt;Spring Data JPA&lt;/strong&gt; for databases: just as Spring Data abstracts away SQL and database specifics, Spring AI abstracts away the differences between various AI providers (OpenAI, Google, Azure, Anthropic, etc.).&lt;/p&gt;

&lt;p&gt;This approach offers two huge benefits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Portability:&lt;/strong&gt; You can switch between different AI models and providers with minimal code changes, allowing you to choose the most cost-effective or highest-performing model for your use case.&lt;br&gt;
&lt;strong&gt;2. Familiarity:&lt;/strong&gt; It uses standard Spring concepts like dependency injection, auto-configuration, and fluent APIs (like WebClient or JdbcClient), making the learning curve shallow for millions of existing Spring developers.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Use Spring AI Over LangChain?
&lt;/h2&gt;

&lt;p&gt;While &lt;strong&gt;LangChain&lt;/strong&gt; is a powerful, provider-agnostic framework that popularized the “chaining” of LLM calls, it is primarily built for the &lt;strong&gt;Python&lt;/strong&gt; ecosystem. Spring AI, on the other hand, is built from the ground up to be &lt;strong&gt;idiomatic Java&lt;/strong&gt; and integrate seamlessly into &lt;strong&gt;Spring Boot&lt;/strong&gt; applications.&lt;/p&gt;

&lt;p&gt;Here is why a Java enterprise developer should strongly consider using Spring AI:&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%2Fucx2o1xsbsd6twzwhmu2.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%2Fucx2o1xsbsd6twzwhmu2.png" alt=" " width="512" height="361"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The “Idiomatic Java” Advantage
&lt;/h2&gt;

&lt;p&gt;For a Java team, choosing Spring AI means:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- No Polyglot Complexity:&lt;/strong&gt; You avoid introducing Python dependencies, virtual environments, and inter-process communication headaches into your production Java environment.&lt;br&gt;
&lt;strong&gt;- Performance:&lt;/strong&gt; Spring AI runs natively within the Java Virtual Machine (JVM), leveraging its excellent garbage collection and performance optimizations.&lt;br&gt;
&lt;strong&gt;- Tooling:&lt;/strong&gt; You benefit from static type checking, robust debugging, and the full ecosystem of Java testing frameworks (JUnit, Mockito).&lt;br&gt;
In short, if your application is written in Java and uses Spring Boot, Spring AI is the natural, lowest-friction choice for integrating generative AI.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Concepts in Spring AI
&lt;/h2&gt;

&lt;p&gt;To build a basic AI application, you need to understand three core components:&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%2Fbprb4ug0hk7nxox10l0r.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%2Fbprb4ug0hk7nxox10l0r.png" alt=" " width="512" height="374"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Building a Simple Chat Service
&lt;/h2&gt;

&lt;p&gt;Let’s create a minimal Spring Boot application that uses the ChatClient to generate responses based on a user’s message. For this example, we will use the OpenAI model.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Project Setup (Maven)
&lt;/h2&gt;

&lt;p&gt;Add the following to your pom.xml file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependencies&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-ai-openai-spring-boot-starter&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&amp;lt;dependencyManagement&amp;gt;
&amp;lt;dependencies&amp;gt;
&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-ai-bom&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
&amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Configuration (application.properties)
&lt;/h2&gt;

&lt;p&gt;You need to provide your AI provider’s API key. Place this in your src/main/resources/application.properties file.&lt;/p&gt;

&lt;p&gt;Properties&lt;/p&gt;

&lt;h1&gt;
  
  
  Replace with your actual OpenAI API Key
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;spring.ai.openai.api-key=&amp;lt;YOUR_OPENAI_API_KEY&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Controller (AiController.java)
&lt;/h2&gt;

&lt;p&gt;This class defines a REST endpoint that accepts a message and uses the injected ChatClient to get a response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Java
package com.example.aidemo;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AiController {
private final ChatClient chatClient;
/**
* Spring Boot automatically configures and injects the ChatClient based
* on the dependency and properties.
*/
public AiController(ChatClient.Builder chatClientBuilder) {
// Build the ChatClient instance using the injected builder
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/generate")
public String generate(@RequestParam(value = "message", defaultValue = "Tell me a short, friendly joke.") String message) {
// Use the fluent API to define the prompt and call the model
return chatClient.prompt()
.user(message) // Set the user's input message
.call() // Execute the call to the AI model
.content(); // Extract the plain text content from the response
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Run and Test
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run your Spring Boot application.&lt;/li&gt;
&lt;li&gt;Test the endpoint: &lt;a href="http://localhost:8080/generate?message=Explain%20Spring%20AI%20in%20one%20sentence" rel="noopener noreferrer"&gt;http://localhost:8080/generate?message=Explain%20Spring%20AI%20in%20one%20sentence&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Connect with me if you need advice on clearing your next tech interview at top tier companies by commenting on this post or email at &lt;a href="mailto:connect@thinkhumble.in"&gt;connect@thinkhumble.in&lt;/a&gt;&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>springai</category>
      <category>java</category>
      <category>genai</category>
    </item>
    <item>
      <title>RAG with Spring AI</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Fri, 19 Dec 2025 12:46:54 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/rag-with-spring-ai-51c4</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/rag-with-spring-ai-51c4</guid>
      <description>&lt;h2&gt;
  
  
  Build a Context-Aware Application
&lt;/h2&gt;

&lt;p&gt;RAG is in place now from at 2–3 years, still there is not much clarity on this aspect in Java ecosystem, though efforts have been made via LangChain4J but it is not that clear like mature frameworks like as spring.&lt;/p&gt;

&lt;p&gt;Retrieval-Augmented Generation (RAG) is a pattern that enhances Large Language Models (LLMs) by providing them with external, up-to-date, or proprietary data, which reduces hallucinations and grounds the response in facts. Spring AI provides an idiomatic and seamless way to implement RAG within the Spring Boot ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: Spring AI vs. LangChain
&lt;/h2&gt;

&lt;p&gt;Spring AI is a framework that aims to apply Spring ecosystem design principles — such as portability (across models and vector stores) and modular design — to the AI domain. It is a natural choice for Java/Spring Boot developers as it fully embraces Spring conventions like Dependency Injection, auto-configuration, and POJOs (Plain Old Java Objects).&lt;/p&gt;

&lt;p&gt;Spring AI can be a strong alternative to LangChain (and its Java port, LangChain4j) for RAG, especially within an enterprise setting, because:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Seamless Spring Boot Integration:&lt;/strong&gt; It uses Spring Boot starters, making setup incredibly fast. You get an automatically configured ChatClient and VectorStore by simply adding dependencies and properties.&lt;br&gt;
&lt;strong&gt;- Idiomatic Java:&lt;/strong&gt; The APIs feel like other Spring APIs (like WebClient or JdbcTemplate), leveraging familiar patterns for Java developers.&lt;br&gt;
&lt;strong&gt;- Enterprise-Grade Features:&lt;/strong&gt; It is backed by the Spring ecosystem, inheriting robust features like observability, security, and consistent configuration.&lt;br&gt;
&lt;strong&gt;- Focus on Abstraction:&lt;/strong&gt; It provides high-level abstractions like the Advisor API for RAG, which encapsulates the entire retrieval and prompt augmentation logic, often requiring less boilerplate than manually stitching together a chain.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To follow this tutorial, you will need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Java 21&lt;/strong&gt; or later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maven&lt;/strong&gt; or &lt;strong&gt;Gradle&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;API Key&lt;/strong&gt; for an LLM provider (e.g., OpenAI, Google Gemini, etc.). We will use &lt;strong&gt;OpenAI&lt;/strong&gt; for this example.&lt;/li&gt;
&lt;li&gt;The latest &lt;strong&gt;Spring AI Bill of Materials (BOM)&lt;/strong&gt;. We will assume the latest stable version of Spring AI is used.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Step 1: Project Setup (Using Maven)
&lt;/h2&gt;

&lt;p&gt;Create a new Spring Boot project (e.g., using &lt;strong&gt;start.spring.io&lt;/strong&gt;) and add the following dependencies. We will use the &lt;strong&gt;OpenAI&lt;/strong&gt; model and the &lt;strong&gt;PostgreSQL/PGVector&lt;/strong&gt; vector store for a robust, production-ready setup.&lt;/p&gt;

&lt;p&gt;In your POM.xml add&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-ai-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;

&amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;

    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-ai-openai-spring-boot-starter&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-ai-pgvector-store-spring-boot-starter&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-ai-pdf-document-reader&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;org.postgresql&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;postgresql&amp;lt;/artifactId&amp;gt;
        &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Configuration
&lt;/h2&gt;

&lt;p&gt;Configure the LLM API key and the PostgreSQL vector store in your application.properties (or application.yml).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For the PGVector store, you’ll need a running PostgreSQL database with the pgvector extension enabled. Using &lt;strong&gt;Docker Compose&lt;/strong&gt; is recommended for local development.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Properties
# LLM Configuration (OpenAI Example)
spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.openai.chat.model=gpt-4o-mini
spring.ai.openai.embedding.model=text-embedding-3-small

# PostgreSQL/PGVector Configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/ragdb
spring.datasource.username=user
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update

# Spring AI Vector Store Schema Initialization
# This creates the necessary table for the vector store
spring.ai.vectorstore.pgvector.initialize-schema=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Document Ingestion Service (ETL)
&lt;/h2&gt;

&lt;p&gt;The first part of RAG is the Extract, Transform, Load (ETL) pipeline. We read a document, split it into smaller &lt;strong&gt;chunks&lt;/strong&gt; (documents), generate &lt;strong&gt;embeddings&lt;/strong&gt; for the chunks, and store them in the VectorStore.&lt;/p&gt;

&lt;p&gt;Create a service named IngestionService.java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.ragtutorial;

import org.springframework.ai.document.Document;
import org.springframework.ai.reader.TextReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
public class IngestionService implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(IngestionService.class);
    private final VectorStore vectorStore;

    // Use a text file for simplicity. Place it in src/main/resources/data/
    @Value("classpath:/data/spring-ai-info.txt")
    private Resource dataResource;

    public IngestionService(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    @Override
    public void run(String... args) {
        log.info("Starting RAG document ingestion...");

        // 1. Extract: Read the document content
        TextReader textReader = new TextReader(dataResource);
        List&amp;lt;Document&amp;gt; rawDocuments = textReader.get();

        // 2. Transform: Split the large document into smaller, manageable chunks
        // TokenTextSplitter ensures chunks fit within the LLM's context window
        TokenTextSplitter textSplitter = new TokenTextSplitter();
        List&amp;lt;Document&amp;gt; splitDocuments = textSplitter.apply(rawDocuments);

        // 3. Load: Store the documents (which creates and stores embeddings)
        vectorStore.accept(splitDocuments);

        log.info("Document ingestion complete. {} chunks loaded into VectorStore.", splitDocuments.size());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example content for src/main/resources/data/spring-ai-info.txt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spring AI is an application framework for AI engineering. Its goal is to apply Spring ecosystem design principles to the AI domain. It connects enterprise data and APIs with AI Models. It offers a portable API across different AI providers like OpenAI, Gemini, and Ollama. For RAG, it supports vector stores such as PGVector, Chroma, and Redis. The ChatClient API is used for communication, and the Advisor API simplifies patterns like RAG.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Implement the RAG Controller
&lt;/h2&gt;

&lt;p&gt;The RAG logic is greatly simplified by Spring AI’s Advisor API, specifically QuestionAnswerAdvisor. This advisor automatically performs the retrieval and prompt augmentation before calling the LLM.&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%2Fgirk25pqfoevzjjanqra.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%2Fgirk25pqfoevzjjanqra.png" alt=" " width="512" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a REST controller named RagController.java&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.ragtutorial;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RagController {

    private final ChatClient chatClient;

    public RagController(ChatClient.Builder chatClientBuilder, VectorStore vectorStore) {
        // Configure the ChatClient with the QuestionAnswerAdvisor
        // The QuestionAnswerAdvisor handles:
        // 1. Retrieving relevant documents from the VectorStore based on the user query.
        // 2. Augmenting the user's prompt with the retrieved documents as context.
        this.chatClient = chatClientBuilder
            // This is the core of RAG implementation in Spring AI
            .defaultAdvisors(QuestionAnswerAdvisor.builder(vectorStore).build())
            .build();
    }

    @GetMapping("/rag/query")
    public String ragQuery(@RequestParam(defaultValue = "What is Spring AI and what are its features?") String query) {

        // The advisor runs before this call, injecting the retrieved context into the prompt
        return this.chatClient.prompt()
            .user(query)
            .call()
            .content();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Run and Test the Application
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Ensure PostgreSQL is running&lt;/strong&gt; with pgvector enabled (e.g., via Docker).&lt;br&gt;
&lt;strong&gt;2. Run the Spring Boot application.&lt;/strong&gt; The IngestionService will execute upon startup, loading your document into the vector store.&lt;br&gt;
&lt;strong&gt;3. Test the RAG endpoint&lt;/strong&gt; using a browser or a tool like cURL:&lt;br&gt;
&lt;strong&gt;Query based on the context:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl 'http://localhost:8080/rag/query?query=What is the primary goal of Spring AI?'

# Expected Output (grounded in your document): The primary goal of Spring AI is to apply Spring ecosystem design principles to the AI domain and to connect enterprise data and APIs with AI Models.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion and Shortcomings of RAG
&lt;/h2&gt;

&lt;p&gt;RAG with Spring AI is a powerful and convenient pattern. However, the RAG approach itself, regardless of the framework, has inherent &lt;strong&gt;shortcomings:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The “Garbage In, Garbage Out” Problem:&lt;/strong&gt; The quality of the final answer is directly dependent on the quality of the retrieved documents. If the source documents are poorly structured, incomplete, or the chunking is sub-optimal, the LLM will still provide a poor or hallucinated answer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fix:&lt;/em&gt; Requires a robust ETL pipeline for document cleaning and structured chunking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Need for Fine-Tuning Retrieval:&lt;/strong&gt; Simple &lt;strong&gt;vector similarity search&lt;/strong&gt; is not always enough.&lt;br&gt;
&lt;strong&gt;2. Advanced scenarios require:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Re-ranking: Using a separate model to re-score the top-K retrieved documents for better relevance.&lt;/li&gt;
&lt;li&gt;Query Transformation: Using the LLM to rewrite the user’s question into multiple, more specific queries to boost recall (MultiQueryExpander in Spring AI).&lt;/li&gt;
&lt;li&gt;Hybrid Search: Combining vector search with traditional keyword search (lexical search) to cover more bases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1. Context Window Management:&lt;/strong&gt; The retrieved documents must fit within the LLM’s context window. If too many relevant chunks are found, they must be truncated or summarized, which can lead to incomplete answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Complexity (Spring AI Specific):&lt;/strong&gt; While simple RAG is easy, more complex &lt;strong&gt;agentic workflows&lt;/strong&gt; or highly customized multi-step reasoning often require more explicit configuration than the high-level Advisor abstraction, potentially leading to more code than in a framework designed primarily for chaining (like LangChain4j).&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>springai</category>
      <category>java</category>
      <category>agenticrag</category>
    </item>
    <item>
      <title>What’s there in a Jar?</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Thu, 18 Dec 2025 11:33:29 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/whats-there-in-a-jar-39o5</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/whats-there-in-a-jar-39o5</guid>
      <description>&lt;p&gt;Many a times when we bundle an application in form of Jar, we need to checkout what is there in it. This is especially true when something goes wrong or application fails to startup in production or controlled environments where you don’t have access to UI tools. That is when this Jar utility come handy.&lt;/p&gt;

&lt;p&gt;We will discuss how to use this utility to view, extract, re-bundle and update the existing resources added to the application.&lt;/p&gt;

&lt;p&gt;Lets say your build system is creating a jar name connector-utility.jar and you want to list down all the content of this jar bundle, all you have to do is&lt;br&gt;
You will see something like this&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jar -tvf connector-utility.jar&lt;br&gt;
     0 Thu Jun 30 16:15:04 IST 2022 META-INF/&lt;br&gt;
   476 Thu Jun 30 16:15:04 IST 2022 META-INF/MANIFEST.MF&lt;br&gt;
     0 Fri Feb 01 00:00:00 IST 1980 org/&lt;br&gt;
     0 Fri Feb 01 00:00:00 IST 1980 org/springframework/&lt;br&gt;
     0 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/&lt;br&gt;
     0 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/&lt;br&gt;
  5871 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/ClassPathIndexFile.class&lt;br&gt;
  6806 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/ExecutableArchiveLauncher.class&lt;br&gt;
  3966 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/JarLauncher.class&lt;br&gt;
  1483 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/LaunchedURLClassLoader$DefinePackageCallType.class&lt;br&gt;
  1535 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class&lt;br&gt;
 11154 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/LaunchedURLClassLoader.class&lt;br&gt;
  5932 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/Launcher.class&lt;br&gt;
  1536 Fri Feb 01 00:00:00 IST 1980 org/springframework/boot/loader/MainMethodRunner.class&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now lets say you want to replace one the files from the above listing with new file, it can be any file including properties file/Meta-Inf file. All you have to do is run this command. You can pass multiple files as well in one go to update as well.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jar -uvf connector-utility.jar ./org/springframework/boot/loader/MainMethodRunner.class&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lets say you want to extract entire jar and see the content for debugging/replacement purpose. You can use this command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;java -xvf connector-utility.jar&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lets say you updated or remove all the stuff that is needed and bundle it again, you can use below command. This will allow jar utility to go out directory in current path and bundle all the files under it with name connector-utility.jar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jar -cvf connector-utility.jar -C out/ .&lt;/code&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>jar</category>
      <category>springboot</category>
      <category>devops</category>
    </item>
    <item>
      <title>AI Didn’t Replace Developers. It Exposed the Gap Between Knowing and Doing.</title>
      <dc:creator>Ved Sharma</dc:creator>
      <pubDate>Wed, 17 Dec 2025 08:01:26 +0000</pubDate>
      <link>https://dev.to/ved_sharma_e776421e694cdc/ai-didnt-replace-developers-it-exposed-the-gap-between-knowing-and-doing-1phm</link>
      <guid>https://dev.to/ved_sharma_e776421e694cdc/ai-didnt-replace-developers-it-exposed-the-gap-between-knowing-and-doing-1phm</guid>
      <description>&lt;p&gt;AI didn’t take your job.&lt;/p&gt;

&lt;p&gt;It just asked a question most developers were never prepared to answer:&lt;/p&gt;

&lt;p&gt;“Can you actually do this… or have you just seen it before?”&lt;/p&gt;

&lt;p&gt;That’s the uncomfortable truth many of us are facing in 2025.&lt;/p&gt;

&lt;p&gt;The Day AI Stopped Being a Tool&lt;/p&gt;

&lt;p&gt;At first, AI felt like magic.&lt;/p&gt;

&lt;p&gt;Autocomplete.&lt;br&gt;
Refactors in seconds.&lt;br&gt;
Boilerplate gone. &lt;br&gt;
Productivity went up overnight.&lt;/p&gt;

&lt;p&gt;Then something strange happened.&lt;/p&gt;

&lt;p&gt;Two developers started using the same AI tools.&lt;br&gt;
One flew ahead.&lt;br&gt;
The other got stuck, constantly rewriting prompts, fixing broken logic, unsure why things weren’t working.&lt;/p&gt;

&lt;p&gt;Same AI.&lt;br&gt;
Very different outcomes.&lt;/p&gt;

&lt;p&gt;That’s when it became clear:&lt;/p&gt;

&lt;p&gt;AI doesn’t replace developers.&lt;br&gt;
It amplifies whatever skill foundation you already have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing ≠ Doing (And AI Made That Obvious)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For years, the industry rewarded familiarity.&lt;/p&gt;

&lt;p&gt;“I’ve worked with React.”&lt;/p&gt;

&lt;p&gt;“I know microservices.”&lt;/p&gt;

&lt;p&gt;“I’ve used Kubernetes.”&lt;/p&gt;

&lt;p&gt;But AI doesn’t care about exposure.&lt;br&gt;
It cares about understanding.&lt;/p&gt;

&lt;p&gt;If you don’t grasp:&lt;/p&gt;

&lt;p&gt;why a solution works&lt;/p&gt;

&lt;p&gt;what tradeoffs exist&lt;/p&gt;

&lt;p&gt;where edge cases hide&lt;/p&gt;

&lt;p&gt;how systems fail in production&lt;/p&gt;

&lt;p&gt;AI won’t save you.&lt;/p&gt;

&lt;p&gt;It will happily generate code and quietly expose that you don’t know how to evaluate it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Skill Gap Nobody Talks About&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn’t about juniors vs seniors.&lt;/p&gt;

&lt;p&gt;Some of the most affected developers are experienced ones.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because years in a job can mask skill decay.&lt;br&gt;
You get comfortable.&lt;br&gt;
You reuse patterns.&lt;br&gt;
You stop questioning fundamentals.&lt;/p&gt;

&lt;p&gt;Then AI arrives and suddenly:&lt;/p&gt;

&lt;p&gt;juniors with strong fundamentals move faster&lt;/p&gt;

&lt;p&gt;generalists outperform specialists stuck in old stacks&lt;/p&gt;

&lt;p&gt;people who think clearly outperform people who memorized a lot&lt;/p&gt;

&lt;p&gt;The gap wasn’t created by AI.&lt;br&gt;
It was always there.&lt;/p&gt;

&lt;p&gt;AI just turned on the lights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Divide: Builders vs Describers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI exposed a sharp divide:&lt;/p&gt;

&lt;p&gt;Describers-&lt;/p&gt;

&lt;p&gt;Know the right terminology&lt;/p&gt;

&lt;p&gt;Can explain concepts verbally&lt;/p&gt;

&lt;p&gt;Depend heavily on prompts&lt;/p&gt;

&lt;p&gt;Struggle to debug AI-generated output&lt;/p&gt;

&lt;p&gt;Builders-&lt;/p&gt;

&lt;p&gt;Understand cause and effect&lt;/p&gt;

&lt;p&gt;Break problems into constraints&lt;/p&gt;

&lt;p&gt;Spot flaws in AI output instantly&lt;/p&gt;

&lt;p&gt;Use AI as leverage, not a crutch&lt;/p&gt;

&lt;p&gt;AI doesn’t make builders obsolete.&lt;/p&gt;

&lt;p&gt;It makes them dangerously efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Interviews Feel Broken Now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional hiring struggles in an AI world.&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;p&gt;resumes list tools, not thinking&lt;/p&gt;

&lt;p&gt;interviews test recall, not judgment&lt;/p&gt;

&lt;p&gt;years of experience don’t equal skill depth&lt;/p&gt;

&lt;p&gt;AI forced an uncomfortable realization:&lt;/p&gt;

&lt;p&gt;If skills can’t be measured clearly,&lt;br&gt;
they can’t be trusted by employers or by developers themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Most Important Shift Developers Must Make&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The future isn’t about learning more tools.&lt;/p&gt;

&lt;p&gt;It’s about knowing exactly where you stand.&lt;/p&gt;

&lt;p&gt;Not emotionally.&lt;br&gt;
Not based on confidence.&lt;br&gt;
Not based on job title.&lt;/p&gt;

&lt;p&gt;But in terms of:&lt;/p&gt;

&lt;p&gt;problem-solving depth&lt;/p&gt;

&lt;p&gt;real-world decision making&lt;/p&gt;

&lt;p&gt;adaptability across unknown scenarios&lt;/p&gt;

&lt;p&gt;ability to reason when documentation doesn’t help&lt;/p&gt;

&lt;p&gt;Some teams are already experimenting with structured skill clarity approaches (platforms like &lt;a href="https://thinkhumble.in/" rel="noopener noreferrer"&gt;ThinkHumble&lt;/a&gt; focus on this idea), but the bigger shift is personal: developers taking ownership of understanding their real capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Quiet Truth Most People Avoid&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI didn’t lower the bar.&lt;/p&gt;

&lt;p&gt;It removed the excuses.&lt;/p&gt;

&lt;p&gt;You can no longer hide behind:&lt;/p&gt;

&lt;p&gt;busy work&lt;/p&gt;

&lt;p&gt;long hours&lt;/p&gt;

&lt;p&gt;familiarity with frameworks&lt;/p&gt;

&lt;p&gt;impressive resumes&lt;/p&gt;

&lt;p&gt;Only one thing matters now:&lt;/p&gt;

&lt;p&gt;Can you think, adapt, and execute when the problem isn’t obvious?&lt;/p&gt;

&lt;p&gt;That’s not something AI replaces.&lt;/p&gt;

&lt;p&gt;That’s something AI reveals.&lt;/p&gt;

&lt;p&gt;The safest place in an AI-driven industry isn’t “experienced.”&lt;/p&gt;

&lt;p&gt;It’s clear.&lt;/p&gt;

&lt;p&gt;Clear about what you know.&lt;br&gt;
Clear about what you don’t.&lt;br&gt;
Clear about how you grow.&lt;/p&gt;

&lt;p&gt;Because in the end:&lt;/p&gt;

&lt;p&gt;AI doesn’t decide your future.&lt;br&gt;
Your skill clarity does.&lt;/p&gt;

&lt;p&gt;If this made you question where you actually stand as a developer, &lt;br&gt;
I’ve been using structured skill gap analysis tool to get an objective view of strengths and blind spots beyond resumes and interviews.  &lt;/p&gt;

&lt;p&gt;Have questions? Shoot.&lt;br&gt;
Happy to share what I know and learn along the way.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>careerdevelopment</category>
      <category>developers</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
