Tech Thoughts
Tuesday, September 22, 2026
Most developers treat LLM tool-calling as a linear request-response loop. But if you want to build robust AI agents, you need to stop thinking about sequential chains and start thinking about stateful execution graphs.
The biggest point of failure in automation workflows is the feedback loop. When an agent fails a tool execution, it often hallucinates a fix or enters a repetitive failure state.
Stop relying on simple prompt chaining. Instead, implement a self-correcting loop using a structured state machine. Define your tool output as a Pydantic model and force the agent to validate its own output against a schema before triggering the execution layer.
If the tool returns a non-zero exit code or an unexpected data format, don’t just pass the error back to the LLM. Catch it in the orchestration layer and inject a diagnostic prompt: Here is the error, here is the original goal, and here is why the previous attempt failed. Correcting the context before the next inference step increases success rates significantly.
By treating the orchestration layer as an event-driven system rather than a prompt pipeline, you gain visibility into exactly where the logic breaks.
How are you handling retries in your agent workflows? Let’s talk about your error recovery patterns below.
#AI #LLM #SoftwareEngineering #MultiAgentSystems #BuildInPublic
Monday, September 21, 2026
Most developers treat LLM tool-calling as a linear process
Most developers treat LLM tool-calling as a linear process, but that is where your agent reliability breaks down.
When you allow an agent to call multiple tools in a single turn, the context window gets messy. The model often struggles to map output from Tool A to the input of Tool B, leading to hallucinated arguments or infinite recursion.
The fix? Shift from a single-turn "do everything" prompt to a ReAct (Reasoning and Acting) orchestration pattern.
Instead of asking the LLM to call a suite of functions at once, force a strict sequence: Thought, Action, Observation. Treat the output of each tool as a mandatory state update in your workflow.
If you are using LangChain or DSPy, implement a tool-use constraint that restricts the agent to one function call per turn. Force the model to pause, observe the result, and re-evaluate its plan. It increases latency slightly, but it decreases your error rate by an order of magnitude.
Reliability in agents isn't about better prompts. It is about tighter control over the execution loop.
How are you handling your agentic feedback loops?
Friday, June 27, 2025
NVM Activation error
>> nvm install 22.13.1
Installation complete. If you want to use this version,
type: nvm use 22.13.1
operable program or batch file.
activation error: exit status 1: 'C:\Program' is not recognized as an internal or external command, operable program or batch file.
nvm is installed in a path that includes a space (like C:\Program Files\...), and it's not properly handling that space.nvm-windows to a path without spacesUninstall the current NVM:
Go to Add or Remove Programs and uninstall nvm.
Download the latest
nvm-setup.zip from https://github.com/coreybutler/nvm-windows/releases.During installation, change the installation path to something like:
Also set the Node.js install path to something like:
You can temporarily fix this by manually editing your
settings.txt file:Go to:
Update these paths to use short path notation (like
C:\Progra~1) or better: move them to a location without spaces.
-
-
C:\nvm
-
C:\nodejs
-
-
nvm install 22.13.1
nvm use 22.13.1 - C:\Users\<YourUsername>\AppData\Roaming\nvm\settings.txt
Wednesday, June 18, 2025
Implementation of seamless authentication between two Laravel apps
When a user logs in to one application, they should also be authenticated in other application without logging in again.
1. Use a Common Authentication System
Ensure both Laravel apps share the same user database (either directly or via API).
2. Use tymon/jwt-auth in both apps
Install JWT package in both:
composer require tymon/jwt-authphp artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret
Do this in both apps. Say App A and App B
3. Generate Token in App A on Login
In App A, modify the login logic to generate a JWT token:
use Tymon\JWTAuth\Facades\JWTAuth;
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
// Send token to front-end
return response()->json(['token' => $token]);
}
4. Share JWT Token with App B
When user logs in:
-
Save token in a secure cookie:
return response()->json(['success' => true])->cookie(
'jwt_token', $token, 60, '/', '.seellab.com', true, true, false, 'Strict'
);
✅ This cookie is available to all subdomains, like App A and App B
-
Alternatively, you can redirect to App B with token in query:
ahttps://appbUrl/auth/jwt-login?token=xyz123
5. Accept and Authenticate in App B
In AppB, create a route like:
Route::get('/auth/jwt-login', function (Request $request) {
$token = $request->get('token') ?? $request->cookie('jwt_token');
try {
$user = JWTAuth::setToken($token)->authenticate();
Auth::login($user);
return redirect('/dashboard'); // or wherever
} catch (\Exception $e) {
return redirect('/login')->withErrors('Token Invalid');
}
});
You can auto-trigger this on page load, or have a middleware that checks and redirects accordingly.
6. Keep It Secure
-
Use HTTPS.
-
Mark cookie as
Secure,HttpOnly, andSameSite=Strictif possible. -
Tokens should expire, and refresh tokens can be used optionally.
-
If hosting under different domains (not subdomains), cookies won't be shareable — you'll need to redirect with the token.
Optional: Middleware in App B
Create a middleware to auto-login using the JWT cookie if user not logged in:
public function handle($request, Closure $next){
if (!Auth::check() && $request->cookie('jwt_token')) {
try {
$user = JWTAuth::setToken($request->cookie('jwt_token'))->authenticate();
Auth::login($user);
} catch (\Exception $e) {
// token expired or invalid
}
}
return $next($request);
}
Summary
| Feature | Implementation |
|---|---|
| Token Generation | On login in App A |
| Token Sharing | Secure Cookie or URL param |
| Token Reading | App B reads token from cookie/URL |
| Login Session | Auth::login($user) in App B |
| Security | HTTPS, HttpOnly, SameSite, Token Expiry |
Thursday, February 27, 2025
Implementation of Tabview in Laravel
To create a tabbed view in Laravel Blade for "My Organizations" and "All Organizations," you can use Bootstrap, a popular CSS framework. Below is an example:
Steps:
Add Bootstrap CSS and JS:
Include the Bootstrap CSS and JS files in your Blade layout file, e.g.,app.blade.php.<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>Create a Blade File with Tabs:
Create a Blade view file, e.g.,organizations.blade.php.<!-- resources/views/organizations.blade.php --><div class="container mt-5"> <ul class="nav nav-tabs" id="organizationTabs" role="tablist"> <!-- Tab Links --> <li class="nav-item" role="presentation"> <button class="nav-link active" id="my-organizations-tab" data-bs-toggle="tab" data-bs-target="#my-organizations" type="button" role="tab" aria-controls="my-organizations" aria-selected="true"> My Organizations </button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" id="all-organizations-tab" data-bs-toggle="tab" data-bs-target="#all-organizations" type="button" role="tab" aria-controls="all-organizations" aria-selected="false"> All Organizations </button> </li> </ul> <div class="tab-content" id="organizationTabsContent"> <!-- My Organizations Tab --> <div class="tab-pane fade show active" id="my-organizations" role="tabpanel" aria-labelledby="my-organizations-tab"> <h3 class="mt-3">My Organizations</h3> <ul> @foreach ($myOrganizations as $organization) <li>{{ $organization->name }}</li> @endforeach </ul> </div> <!-- All Organizations Tab --> <div class="tab-pane fade" id="all-organizations" role="tabpanel" aria-labelledby="all-organizations-tab"> <h3 class="mt-3">All Organizations</h3> <ul> @foreach ($allOrganizations as $organization) <li>{{ $organization->name }}</li> @endforeach </ul> </div> </div> </div>Pass Data to the View:
In your controller, pass themyOrganizationsandallOrganizationscollections to the view.public function showOrganizations(){ $myOrganizations = Organization::where('user_id', auth()->id())->get(); $allOrganizations = Organization::all(); return view('organizations', compact('myOrganizations', 'allOrganizations')); }Route to the View:
Add a route for the controller method inweb.php.Route::get('/organizations', [OrganizationController::class, 'showOrganizations'])->name('organizations.index');
Result:
- A tabbed interface where:
- The "My Organizations" tab lists only the organizations related to the logged-in user.
- The "All Organizations" tab lists all organizations in the database.