<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Yogendra Sisodia on Medium]]></title>
        <description><![CDATA[Stories by Yogendra Sisodia on Medium]]></description>
        <link>https://medium.com/@scholarly360?source=rss-c9f8feddbead------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*xpKmn9ACHjiwcTSErsMLzA.png</url>
            <title>Stories by Yogendra Sisodia on Medium</title>
            <link>https://medium.com/@scholarly360?source=rss-c9f8feddbead------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 10:13:00 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@scholarly360/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Microsoft Decision-1 (System One) on Microsoft Foundry]]></title>
            <link>https://medium.com/@scholarly360/microsoft-decision-1-system-one-on-microsoft-foundry-bd1896e28bca?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/bd1896e28bca</guid>
            <category><![CDATA[jevai]]></category>
            <category><![CDATA[microsoft-azure]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[enterprise-technology]]></category>
            <category><![CDATA[agents]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sat, 14 Nov 2026 12:32:06 GMT</pubDate>
            <atom:updated>2026-11-14T12:32:06.072Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W4TwZEGp7g_gJ3_uddmc6w.png" /><figcaption>Microsoft Decision-1 (System One) on Microsoft Foundry</figcaption></figure><h3>Introduction</h3><p>Most AI applications today rely on Large Language Models (LLMs) to generate responses, summarize documents, or reason through complex problems. But what happens when your application doesn’t need a paragraph of generated text?</p><p>What if all you need is to:</p><ul><li>Determine whether a contract requires written notice.</li><li>Classify an HR complaint into a predefined category.</li><li>Evaluate the risk associated with a contractual clause.</li><li>Prioritize an incoming sales lead.</li><li>Make a structured decision that another application can consume.</li></ul><p>Traditional generative LLMs can accomplish these tasks, but often with unnecessary output generation and additional parsing.</p><p><strong>Microsoft Decision-1 takes a different approach.</strong></p><p>Announced in October 2026, Microsoft Decision-1 is a specialized decision model available in Microsoft Foundry. Built on the open-weight Qwen3.5–9B base model, it focuses on classification, scoring, and binary decisions rather than generating long-form responses.</p><p>The model follows a <strong>System One</strong> approach: making focused, structured judgments from supplied information.</p><p>In this tutorial, we’ll deploy the model through Microsoft Foundry and use Python to explore its three primary decision types:</p><ol><li><strong>Noul—Binary</strong> decisions with probabilities.</li><li><strong>Choice—Classification</strong> into predefined categories.</li><li><strong>Score—Evaluation</strong> using an ordered scoring rubric.</li></ol><p>We’ll use examples drawn from three enterprise functions: legal, human resources, and marketing.</p><p><strong>Complete source code and Jupyter notebooks:</strong></p><p><a href="https://github.com/scholarly360/Microsoft-Decision-1-on-Microsoft-Foundry">https://github.com/scholarly360/Microsoft-Decision-1-on-Microsoft-Foundry</a></p><h3>1. Understanding Microsoft Decision-1</h3><p>The key difference between a generative LLM and a decision model is the type of output.</p><p>Consider the question:</p><p>“Does this contract require advance written notice for termination?”</p><p>A generative LLM might produce:</p><blockquote><em>Yes. Based on the termination clause, the Customer must provide 30 days’ written notice before terminating the agreement for convenience.</em></blockquote><p>Microsoft Decision-1 can instead return a probability:</p><pre>0.9972</pre><p>Your application can interpret this numerical result according to predefined business rules.</p><p>This is particularly useful in enterprise systems where applications need <strong>predictable output structures rather than generated explanations</strong>.</p><p>Let’s explore these capabilities using Python.</p><h3>2. Deploy Microsoft Decision-1 on Microsoft Foundry</h3><p>Before we write code, we need to deploy the model.</p><p>Open Microsoft Foundry:</p><p><a href="https://ai.azure.com/">https://ai.azure.com</a></p><p>Inside your Foundry project:</p><ol><li>Open the model catalog.</li><li>Search for Microsoft-Decision-1.</li><li>Select the model and deploy it using an available deployment option.</li><li>Record the deployment name, endpoint URL, and API key.</li></ol><p>For this tutorial, we’ll use the deployment name:</p><pre>Decision-1</pre><p>The endpoint used in the accompanying notebooks follows this structure:</p><pre>https://&lt;your-resource&gt;.services.ai.azure.com/providers/microsoft</pre><p>Use the exact endpoint provided by your deployment.</p><h3>Set up the Python environment.</h3><p>Start by cloning the repository:</p><pre>git clone https://github.com/scholarly360/Microsoft-Decision-1-on-Microsoft-Foundry.git</pre><pre>cd Microsoft-Decision-1-on-Microsoft-Foundry</pre><p>Create a virtual environment:</p><pre>python -m venv .venv</pre><p>Activate it on Windows:</p><pre>.venv\Scripts\activate</pre><p>Or on macOS/Linux:</p><pre>source .venv/bin/activate</pre><p>Install the dependencies:</p><pre>pip install -r requirements.txt</pre><p>The repository includes the following packages:</p><pre>typesafe-sdk<br>python-dotenv<br>ipykernel</pre><h3>Configure credentials.</h3><p>Create a .env file using the provided sample.env template.</p><pre>api_key=YOUR_FOUNDRY_API_KEY<br>endpoint=https://YOUR_RESOURCE.services.ai.azure.com/providers/microsoft</pre><h3>Import the SDK</h3><pre>import os<br>from dotenv import load_dotenv<br>from typesafe_sdk import (<br>    TypeSafeClient,<br>    Noul,<br>    Choice,<br>    Score<br>)<br>load_dotenv()<br>api_key = os.getenv(&quot;api_key&quot;)<br>endpoint = os.getenv(&quot;endpoint&quot;)<br>deployment_name = &quot;Decision-1&quot;</pre><p>Now let’s create a simple helper function to reuse across our examples.</p><pre>def decide(state, questions):<br>    with TypeSafeClient(<br>        api_key=api_key,<br>        base_url=endpoint,<br>        model=deployment_name,<br>        timeout=60<br>    ) as client:<br>      response = client.system_one(<br>            state=state,<br>            questions=questions<br>        )<br>    return response.answers</pre><p>This wrapper handles the connection to Microsoft Foundry and returns the structured decisions.</p><p>Notice two important arguments:</p><ul><li>state: The text or structured input the model evaluates.</li><li>questions: A dictionary containing the decisions the model must make.</li></ul><p>Now we’re ready to experiment.</p><h3>3. Example 1: Legal Contract Analysis Using Noul</h3><p>Let’s begin with a legal contract.</p><p>Consider this termination clause:</p><pre>contract_clause = &quot;&quot;&quot;<br>12. TERMINATION The Customer may terminate this Agreement for<br>convenience by providing thirty (30) days&#39;<br>prior written notice.<br>The Supplier may terminate this Agreement only<br>if the Customer fails to pay undisputed<br>invoices within fifteen (15) days after<br>receiving written notice of non-payment.<br>&quot;&quot;&quot;</pre><p><strong>Does the Customer have to provide advance written notice before termination?</strong></p><p>This is a binary decision, making Noul an appropriate option.</p><h3>Python implementation</h3><pre>answers = decide(<br>    state=contract_clause,<br>    questions={<br>        &quot;notice_requirement&quot;: Noul(<br>            instructions=(<br>                &quot;Is the Customer required to provide &quot;<br>                &quot;advance written notice before termination?&quot;<br>            )<br>        )<br>    }<br>)<br>result = answers[&quot;notice_requirement&quot;]<br>print(f&quot;Probability: {result.noul:.2%}&quot;)</pre><h3>Output</h3><pre>Probability: 99.72%</pre><p>The noul property represents the model&#39;s estimated probability that the answer to our question is true.</p><p>A value approaching 1 indicates strong model support for the proposition. A value approaching 0 indicates support for the opposite.</p><h3>Applying business rules</h3><p>The numerical output can be incorporated directly into application logic.</p><p>For example:</p><pre>probability = result.noul</pre><pre>if probability &gt;= 0.90:<br>    decision = &quot;Written notice requirement detected&quot;<br>elif probability &lt;= 0.10:<br>    decision = &quot;Written notice requirement not detected&quot;<br>else:<br>    decision = &quot;Requires manual review&quot;</pre><pre>print(decision)</pre><p>These thresholds are illustrative. In production, they should be selected using representative evaluation data and the consequences of incorrect decisions.</p><p>This is the first practical advantage of a decision model.</p><p><strong>Instead of asking an application to parse a generated paragraph, we can directly consume a typed numerical output.</strong></p><h3>4. Example 2: Contract Classification Using Choice</h3><p>Let’s extend the same legal scenario.</p><p>Our contract allows the Customer to terminate for convenience, while the Supplier has a narrower termination right tied to non-payment.</p><p>We now want to identify:</p><p><strong>Which party has termination-for-convenience rights?</strong></p><p>The valid categories are:</p><ul><li>Both parties</li><li>Customer only</li><li>Supplier only</li><li>Neither party</li></ul><p>This is a classification problem.</p><h3>Python implementation</h3><pre>answers = decide(<br>    state=contract_clause,<br>    questions={<br>        &quot;termination_rights&quot;: Choice(<br>            instructions=(<br>                &quot;Classify the parties&#39; termination-for-&quot;<br>                &quot;convenience rights under this contract.&quot;<br>            ),<br>            criteria={<br>                &quot;mutual&quot;: (<br>                    &quot;Both parties can terminate &quot;<br>                    &quot;for convenience&quot;<br>                ),<br>                &quot;customer_only&quot;: (<br>                    &quot;Only the Customer can terminate &quot;<br>                    &quot;for convenience&quot;<br>                ),<br>                &quot;supplier_only&quot;: (<br>                    &quot;Only the Supplier can terminate &quot;<br>                    &quot;for convenience&quot;<br>                ),<br>                &quot;neither&quot;: (<br>                    &quot;Neither party can terminate &quot;<br>                    &quot;for convenience&quot;<br>                )<br>            }<br>        )<br>    }<br>)<br>result = answers[&quot;termination_rights&quot;]<br>print(&quot;Selected category:&quot;, result.choice)<br>print(&quot;Confidence:&quot;, result.confidence)<br>print(&quot;Probabilities:&quot;, result.probabilities)</pre><h3>Output</h3><pre>Selected category: customer_only<br>Confidence: 0.998947</pre><p>The returned probabilities were approximately:</p><pre>{<br>    &quot;customer_only&quot;: 0.999210,<br>    &quot;mutual&quot;: 0.000123,<br>    &quot;supplier_only&quot;: 0.000040,<br>    &quot;neither&quot;: 0.000626<br>}</pre><h3>Understanding Choice</h3><p>Unlike Noul, which evaluates a proposition, Choice selects from a predefined set of categories.</p><p>The criteria dictionary provides the available labels and their descriptions.</p><p>The response includes:</p><ul><li>choice: The selected classification.</li><li>confidence: A confidence measure for the decision.</li><li>probabilities: The model&#39;s probability distribution across the available categories.</li></ul><p>For enterprise applications, this is useful for contract classification, support ticket routing, document categorization, and workflow selection.</p><p>One important consideration: Choice selects from the supplied options. If a classification problem requires an &quot;unknown&quot; or &quot;insufficient information&quot; outcome, design the categories and review process accordingly rather than forcing every input into an unsuitable business label.</p><h3>5. Example 3: Contract Risk Assessment Using Score</h3><p>Binary decisions and classifications are useful, but many enterprise workflows require a more nuanced assessment.</p><p>For example:</p><p><strong>How risky is this termination clause for the Supplier?</strong></p><p>The answer is not simply Yes or No.</p><p>We need an ordered risk rubric.</p><p>Microsoft Decision-1 provides the Score decision type for this requirement.</p><h3>Python implementation</h3><pre>answers = decide(<br>    state=contract_clause,<br>    questions={<br>        &quot;termination_risk&quot;: Score(<br>            instructions=(<br>                &quot;Assess the contractual risk to the &quot;<br>                &quot;Supplier arising from asymmetric &quot;<br>                &quot;termination rights.&quot;<br>            ),<br>            criteria=[<br>                &quot;Very low: Both parties have equal &quot;<br>                &quot;termination rights&quot;,<br>                &quot;Low: Minor differences in &quot;<br>                &quot;termination rights&quot;,<br>                &quot;Moderate: Some imbalance in &quot;<br>                &quot;termination rights&quot;,<br>                &quot;High: One party has significantly &quot;<br>                &quot;more termination rights&quot;,<br>                &quot;Critical: One party has unrestricted &quot;<br>                &quot;termination rights with severe &quot;<br>                &quot;consequences&quot;<br>            ]<br>        )<br>    }<br>)<br>result = answers[&quot;termination_risk&quot;]<br>print(&quot;Risk score:&quot;, result.score)<br>print(&quot;Confidence:&quot;, result.confidence)<br>print(&quot;Risk levels:&quot;, result.legend)<br>print(&quot;Probabilities:&quot;, result.probabilities)</pre><h3>Output</h3><pre>Risk score: 3.0568<br>Confidence: 0.8652</pre><p>The highest probability was associated with level 3:</p><pre>3: High — One party has significantly<br>more termination rights</pre><h3>How does the score work?</h3><p>With five criteria, the model evaluates levels indexed from 0 through 4.</p><p>The returned numerical score is a probability-weighted value across these levels, so it does not have to be an integer.</p><p>For example, a score 3.0568 is close to the high-risk level, but the full probability distribution provides a more informative representation.</p><p>We can also extract the most probable risk category:</p><pre>most_likely_level = max(<br>    result.probabilities,<br>    key=result.probabilities.get<br>)<br>risk_description = result.legend[most_likely_level]<br>print(&quot;Most likely level:&quot;, most_likely_level)<br>print(&quot;Risk description:&quot;, risk_description)</pre><p>This provides a clear separation between the model’s numerical score and its most likely category.</p><p>For an actual contract management system, the assessment should be treated as a triage signal, not a definitive legal conclusion.</p><h3>6. Combining Multiple Decisions in One API Call</h3><p><strong>We can request multiple decisions about the same input in a single call.</strong></p><p>Instead of invoking the model three times, we can combine related questions.</p><pre>answers = decide(<br>    state=contract_clause,<br>    questions={<br>        &quot;notice_requirement&quot;: Noul(<br>            instructions=(<br>                &quot;Is the Customer required to provide &quot;<br>                &quot;advance written notice before termination?&quot;<br>            )<br>        ),<br>&quot;termination_rights&quot;: Choice(<br>            instructions=(<br>                &quot;Which party has termination-for-&quot;<br>                &quot;convenience rights?&quot;<br>            ),<br>            criteria={<br>                &quot;mutual&quot;: &quot;Both parties&quot;,<br>                &quot;customer_only&quot;: &quot;Customer only&quot;,<br>                &quot;supplier_only&quot;: &quot;Supplier only&quot;,<br>                &quot;neither&quot;: &quot;Neither party&quot;<br>            }<br>        ),<br>        &quot;termination_risk&quot;: Score(<br>            instructions=(<br>                &quot;Evaluate termination-rights risk &quot;<br>                &quot;from the Supplier&#39;s perspective.&quot;<br>            ),<br>            criteria=[<br>                &quot;Very low: Equal rights&quot;,<br>                &quot;Low: Minor imbalance&quot;,<br>                &quot;Moderate: Some imbalance&quot;,<br>                &quot;High: Significant imbalance&quot;,<br>                &quot;Critical: Severe imbalance&quot;<br>            ]<br>        )<br>    }<br>)</pre><p>We can then extract the individual results:</p><pre>notice_probability = (<br>    answers[&quot;notice_requirement&quot;].noul<br>)<br>termination_category = (<br>    answers[&quot;termination_rights&quot;].choice<br>)<br>risk_score = (<br>    answers[&quot;termination_risk&quot;].score<br>)<br>print(&quot;Notice probability:&quot;, notice_probability)<br>print(&quot;Termination category:&quot;, termination_category)<br>print(&quot;Risk score:&quot;, risk_score)</pre><p>Combining related decisions reduces separate API requests and allows all questions to share the same input context.</p><p>For document-intelligence systems that evaluate multiple attributes of a contract, this can be particularly useful.</p><p><strong>Before deploying such a workflow into production:</strong></p><p><strong>1. Evaluate against labeled data.</strong> Test using representative examples, ambiguous inputs, and edge cases.</p><p><strong>2. Validate thresholds.</strong> Do not assume a model probability is perfectly calibrated for your business process.</p><p><strong>3. Include human review.</strong> Particularly for HR complaints, legal risk, and other consequential workflows.</p><p><strong>4. Design your criteria carefully.</strong> A useful classification or scoring system depends heavily on clear labels, mutually understandable categories, and well-defined rubrics.</p><p><strong>5. Monitor outcomes.</strong> Track classification errors, latency, cost, and how outputs change as your input data evolves.</p><h3>7. Download the Complete Jupyter Notebooks</h3><p>I’ve put together three hands-on notebooks demonstrating the decision types across different enterprise scenarios.</p><p>Each notebook includes Python code for the three decision types, with the examples structured for experimentation against a Microsoft Foundry deployment.</p><p><strong>GitHub Repository:</strong></p><p><a href="https://github.com/scholarly360/Microsoft-Decision-1-on-Microsoft-Foundry">https://github.com/scholarly360/Microsoft-Decision-1-on-Microsoft-Foundry</a></p><p>The project is open source under the Apache 2.0 license.</p><h3>Final Thoughts</h3><p>As AI systems become more integrated into enterprise workflows, we need to think beyond using generative LLMs for every operation.</p><p>Some tasks require reasoning and natural language generation. Others require repeatable, bounded decisions that downstream software can consume directly.</p><p>Microsoft Decision-1 is an interesting example of the latter approach.</p><p>With just three decision types—Noul,<strong> Choice, and Score—developers</strong> can experiment with binary evaluations, classification, and ordered scoring in a consistent API.</p><p>The important architectural question is no longer simply</p><p><em>Which LLM should I use?</em></p><p>It is also:</p><p><strong>Does this step need a generative model at all, or would a specialized decision model be a better fit?</strong></p><p>Enterprise AI developers should explore the distinction between using a generative model and a specialized decision model for building classification pipelines, agent routing, contract analytics, or operational workflows.</p><p>If you find the examples useful, consider starring the GitHub repository or contributing additional use cases.</p><h3>References</h3><ul><li><a href="https://ai.azure.com/catalog/models/Microsoft-Decision-1">Microsoft Decision-1 Model Catalog</a></li><li><a href="https://learn.microsoft.com/en-us/azure/foundry/foundry-models/how-to/use-foundry-models-microsoft-decision">Microsoft Foundry Decision-1 Documentation</a></li><li><a href="https://docs.typesafe.ai/sdk/python">TypeSafe Python SDK</a></li><li><a href="https://github.com/scholarly360/Microsoft-Decision-1-on-Microsoft-Foundry">Complete GitHub Repository</a></li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FaSr75_NMftk%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DaSr75_NMftk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FaSr75_NMftk%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/938cd96d823e39f0f687c78d7fc4ddb3/href">https://medium.com/media/938cd96d823e39f0f687c78d7fc4ddb3/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bd1896e28bca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Mods Exploration]]></title>
            <link>https://medium.com/@scholarly360/claude-mods-exploration-911df4637f01?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/911df4637f01</guid>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[anthropic-claude]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[claude]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sun, 04 Oct 2026 13:44:40 GMT</pubDate>
            <atom:updated>2026-10-04T13:44:40.399Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/869/1*cbWayzqNjLUOJYh2oBsYlQ.png" /><figcaption>Claude Mods</figcaption></figure><h3><strong>Demystifying the Claude Mod</strong></h3><p>Claude mods are a way to customize Claude Code, Anthropic’s coding tool. They are small TypeScript functions that change how Claude Code works. Anthropic announced them on October 1, 2026.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CNQ-YwaXak_CoFDlQnzZyg.png" /></figure><p>In this Medium article, we will build a mod/plugin that explores architecture from an existing directory.</p><h3>Demystifying the Claude Mod Architecture Tree</h3><p><strong>How to build smarter, modular AI systems without the headache.</strong></p><p>Have you ever tried to give an AI a massive task, only to watch it get confused halfway through? We have all been there. As we push tools like Claude Code to handle complex software engineering, throwing everything into one giant prompt no longer works.</p><p>Enter the Claude Mod Architecture Tree.</p><p>The GitHub repository <a href="https://github.com/scholarly360/claude-mod-architecture-tree/blob/main/README.md">scholarly360/claude-mod-architecture-tree</a> offers a brilliant framework for solving this exact problem. But what exactly is it? Let us break it down into plain English.</p><h3>Think of It Like a Real Tree</h3><p>Imagine a large corporation. The CEO does not personally handle payroll, marketing, and fixing the office printer. They delegate. The Claude Mod Architecture Tree applies this same logic to your AI workflow.</p><p>Instead of a single brain trying to juggle every part of your codebase, the architecture splits responsibilities into a hierarchical structure:</p><ul><li><strong>The Root (Core Identity):</strong> This is your main configuration. It sets the baseline rules, project context, and overarching goals.</li><li><strong>The Branches (Modules):</strong> These are specialized task managers or sub-agents. One branch might handle database operations, while another focuses strictly on user interface design.</li><li><strong>The Leaves (Tools and Skills):</strong> These are the highly specific actions your AI can take, such as reading a file, running a shell script, or formatting code.</li></ul><h3>Why Do We Need This?</h3><p>When you build a system using a modular architecture tree, you gain three massive benefits:</p><ol><li><strong>Laser Focus:</strong> Because tasks are separated into branches, the AI does not get overwhelmed by unrelated information. A database module only looks at database code.</li><li><strong>Easy Updates:</strong> If you need to change how your app handles security, you do not have to rewrite your entire AI system. You just update the specific security leaf or branch.</li><li><strong>Fewer Hallucinations:</strong> By restricting what each module can see and do, you dramatically reduce the chances of the AI making things up or hallucinating incorrect code.</li></ol><h3>How It Works Under the Hood</h3><p>In practical terms, this repository emphasizes a few core technical concepts made simple for developers:</p><p><strong>1. Modular Context</strong> Instead of feeding Claude an entire textbook of code at once, the system uses targeted context. It relies on specific files to guide behavior only in the relevant areas of your project.</p><p><strong>2. Sub-Agent Orchestration</strong> When a big task comes in, the root system breaks it down and hands the pieces to smaller, specialized AI agents. Once the sub-agents finish their specialized tasks, they report back up the chain.</p><p><strong>3. Clear Boundaries</strong> The tree structure prevents different parts of the AI from stepping on each other’s toes. It creates a clean, predictable workflow where every component knows its exact job.</p><p>This is a small Claude Code plugin (a “mod”) that automatically gets Claude to draw your project’s architecture as a text tree whenever you ask an architecture-style question. It’s version 0.1.0, public, and has no stars or forks yet.</p><p>The plugin hooks into the prompt.submit event, which fires when you send a prompt in Claude Code. It checks your prompt for architecture-related language. If it finds some, it does two things:</p><ol><li>It shows a toast saying “Architecture words found: asking for a mindmap”.</li><li>It quietly attaches a hidden instruction to the prompt. The instruction tells Claude to read the actual repo and also produce a box-drawing tree of the system architecture in a code block, plus a couple of sentences of notes.</li></ol><p>Your own prompt text isn’t modified. Only Claude’s instructions are extended. It also only applies to prompts a person actually typed (or sent via an app/SDK). Relayed messages from plugins, peers or notifications pass through untouched.</p><h3>What triggers it</h3><p>The detection logic lives in hooks/register.ts and matches two kinds of language:</p><ul><li><strong>Architecture words that trigger on their own:</strong> architecture, tech stack, microservice, monolith, data flow, system overview, project structure, and phrasings like &quot;how is this structured&quot;.</li><li><strong>“Design” next to a software word:</strong> “design” alone is ambiguous, since it could mean UI or fashion. So it only counts when paired with words like system, api, database, schema, service or pattern, in either order. &quot;Database design&quot; and &quot;design patterns&quot; both match.</li></ul><p><strong>Opt-out:</strong> adding phrases like “no diagram”, “without a mindmap” or “skip mermaid” disables it. The opt-out only recognizes diagram, mindmap, mind map and mermaid, so &quot;skip the tree&quot; would <em>not</em> work.</p><pre>my-app<br>├── Entry points<br>│   ├── src/server.ts<br>│   └── src/cli.ts<br>├── Core modules<br>│   ├── router<br>│   └── services<br>└── Data and storage<br>    ├── Postgres<br>    └── Redis cache</pre><figure><img alt="Screenshot" src="https://cdn-images-1.medium.com/max/974/1*OEPuWAkz5Ad9xLKJ4YB6wQ.png" /></figure><h3>Getting Started</h3><p>You do not need a PhD in computer science to appreciate modular design. By adopting the principles found in the claude-mod-architecture-tree repository, you can start treating your AI assistants less like magic eight balls and more like structured, reliable engineering teams.</p><p>Next time you are building a complex project with Claude, ask yourself: are you building a tangled web, or are you growing a healthy tree.</p><p><strong><em>GitHub Link</em></strong></p><p><a href="https://github.com/scholarly360/claude-mod-architecture-tree">https://github.com/scholarly360/claude-mod-architecture-tree</a></p><p><strong><em>YouTube Video</em></strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FW4xxevSSz9M%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DW4xxevSSz9M&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FW4xxevSSz9M%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/d7a00c864c36db06f31979b084418395/href">https://medium.com/media/d7a00c864c36db06f31979b084418395/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=911df4637f01" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code Skills for Creating Powerpoint]]></title>
            <link>https://medium.com/@scholarly360/claude-code-skills-for-creating-powerpoint-06d7770dcff1?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/06d7770dcff1</guid>
            <category><![CDATA[office]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[powerpoint]]></category>
            <category><![CDATA[pptx]]></category>
            <category><![CDATA[claude]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sun, 02 Aug 2026 10:19:14 GMT</pubDate>
            <atom:updated>2026-08-02T10:19:14.430Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kRsceZ0Z7r0rRZuZQPre_w.png" /><figcaption>Claude Code Skills for Creating Powerpoint</figcaption></figure><h3>Introduction</h3><p>In the modern enterprise landscape, teams are constantly churning out content, especially PPTX. Turning vast amounts of raw text and data into polished, brand-compliant PowerPoint presentations is often a tedious, manual bottleneck. But what if you could automate this process entirely in the background.</p><p>In a recent experiments I tried to a practical look at how to build a continuous “churning machine” for PowerPoint presentations using <strong>Claude</strong>, <strong>Microsoft Foundry</strong>, and <strong>OfficeCLI</strong>.</p><p>Here is a breakdown of how this automated document-generation pipeline works and how you can replicate it using the companion GitHub repository.</p><h3>The Core Technology Stack</h3><p>To build this programmatic presentation generator, the workflow relies on a few key components:</p><ul><li><strong>Microsoft Foundry:</strong> Acts as the hosting platform for the Claude models (such as Claude 4.5 Haiku and Claude 4.6 Sonnet), functioning similarly to AWS Bedrock but within the Azure ecosystem.</li><li><strong>Claude Agent SDK:</strong> The orchestrator of the operation. It allows the Claude AI to interact programmatically with predefined “skills” or tools to execute complex tasks.</li><li><strong>OfficeCLI:</strong> A purpose-built command-line tool and agent skill designed to read, create, and crucially verify Microsoft Office documents (like .pptx and .docx).</li></ul><h3>How the Automated Pipeline Works</h3><p>The goal of the workflow is to take raw text, apply corporate branding, and output a verifiable PowerPoint document without human intervention. Here is the step-by-step execution:</p><h3>1. Authentication and Setup</h3><p>The system requires access to the Claude models hosted on Microsoft Foundry. By utilizing the Azure CLI (az login), the environment authenticates and connects to the Foundry endpoint securely.</p><h3>2. Defining “Skills” for the AI</h3><p>Instead of just asking an LLM to write text, the Claude Agent SDK is equipped with two specific local skills in this testbed:</p><ul><li><strong>The </strong><strong>office-cli Skill:</strong> Gives Claude the ability to programmatically draft and save a .pptx file.</li><li><strong>The </strong><strong>brand-guideline Skill:</strong> A crucial addition for enterprises. The acts as a strict guardrail (e.g., for a fictitious company named &quot;Acme CRM&quot;), ensuring the generated slides use the correct corporate fonts, layout structures, and color palettes.</li></ul><h3>3. Processing the Content</h3><p>The user provides a simple raw text document (content.txt) containing the baseline information about Acme CRM.</p><h3>4. Generation and Verification</h3><p>By running a simple Python script, the Claude Agent SDK takes over. It reads the raw text, consults the brand guidelines skill to understand the aesthetic requirements, and then invokes the OfficeCLI. In just a few minutes, it generates a complete, properly formatted two-slide PowerPoint presentation directly into the local directory.</p><h3>Hands-On: The GitHub Testbed</h3><p>To allow developers to experiment with this architecture, all the code used in the demonstration is open-sourced in the following repository:</p><p><a href="https://github.com/scholarly360/office-cli-claude-agent-sdk"><strong>scholarly360/office-cli-claude-agent-sdk</strong></a>.</p><p>This repository serves as a lightweight testbed for exercising OfficeCLI through the Claude Agent SDK. If you want to build upon this workflow, the repo includes:</p><ul><li><strong>test-officecli.py</strong> main Python execution script that initializes the Claude client and sends the prompt.</li><li><strong>/skills directory:</strong> Contains the definitions for the office-cli and brand-guideline skills so you can see exactly how to constrain the AI&#39;s output.</li><li><strong>sample.env:</strong> Environment variables template to easily plug in your Microsoft Foundry endpoints and API keys.</li><li><strong>content.txt:</strong> The sample data file used to generate the slides.</li></ul><h3>Why This Matters</h3><p>This architecture shifts AI from being a simple conversational assistant to a background enterprise worker. By decoupling the content from the design (via the brand guideline skill) and using a tool like OfficeCLI to handle the actual file generation, organizations can build continuous pipelines that automatically convert daily reports, data dumps, or meeting transcripts into presentation-ready decks.</p><p><strong>Want to try it yourself?</strong> Clone the <a href="https://github.com/scholarly360/office-cli-claude-agent-sdk">GitHub repository</a> and connect it to your Microsoft Foundry environment to see automated slide generation in action.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FOzxTFBo6G-U%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DOzxTFBo6G-U&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FOzxTFBo6G-U%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/784370684e2f84aff24e645c9490cf79/href">https://medium.com/media/784370684e2f84aff24e645c9490cf79/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=06d7770dcff1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gemini Enterprise Agent Platform Model Garden SDK]]></title>
            <link>https://medium.com/@scholarly360/gemini-enterprise-agent-platform-model-garden-sdk-0348d23b5196?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/0348d23b5196</guid>
            <category><![CDATA[gemma]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[gemini-enterprise]]></category>
            <category><![CDATA[vertex-ai]]></category>
            <category><![CDATA[gcp]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sun, 05 Jul 2026 14:21:13 GMT</pubDate>
            <atom:updated>2026-07-05T14:21:13.087Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IjIBp4vtQjrrv2xuhyUlXA.png" /><figcaption>Gemini Enterprise Agent Platform Model Garden SDK</figcaption></figure><h3><strong>Introduction</strong></h3><p>As enterprise AI strategies mature, organizations are moving beyond standard out-of-the-box APIs and shifting toward hosting, fine-tuning, and managing open-source and custom models. Google Cloud’s <strong>Gemini Enterprise Agent Platform (formerly Vertex AI)</strong> provides a robust foundation for these tasks. Within this ecosystem, the <strong>Model Garden SDK</strong> offers a clean, programmatic way for developers to browse, configure, and provision production-ready endpoints for open-weight models like Google’s Gemma 3.</p><p>This small Medium guide provides a practical walkthrough for programmatically deploying a model from Hugging Face or Google’s open-source repository directly onto a managed Google Cloud GPU instance using the Vertex AI Model Garden SDK.</p><h3>Prerequisites</h3><p>Before diving into the Python environment, ensure you have the following prerequisites configured:</p><ol><li><strong>Python 3.x</strong> installed locally or in your development environment.</li><li><strong>Google Cloud CLI (gcloud)</strong> installed and initialized.</li><li>A <strong>Google Cloud Project</strong> with the Vertex AI (Gemini Enterprise Agent Platform) API enabled.</li><li>An environment configuration file (.env) in your root directory containing your project coordinates:</li></ol><pre>GOOGLE_CLOUD_PROJECT_ID=your-project-id<br>GOOGLE_CLOUD_REGION=us-central1</pre><h3>Step 1: Authentication and Setup</h3><p>To allow your local script or Jupyter notebook to provision infrastructure on GCP, initialize your Application Default Credentials (ADC) via the terminal:</p><pre>gcloud auth application-default login</pre><p>Next, install the required Python dependencies. We will need the official Google Cloud AI Platform library along with python-dotenv securely managing our environment variables.</p><pre>pip install google-cloud-aiplatform python-dotenv</pre><h3>Step 2: Initialize Vertex AI</h3><p>With the environment ready, read your variables and initialize the Vertex AI SDK. This configures the global context for your deployment target.</p><pre>import os<br>import vertexai<br>from dotenv import load_dotenv<br>from vertexai import model_garden</pre><pre># Load project credentials<br>load_dotenv()<br>PROJECT_ID = os.environ.get(&quot;GOOGLE_CLOUD_PROJECT_ID&quot;)<br>LOCATION = os.environ.get(&quot;GOOGLE_CLOUD_REGION&quot;, &quot;us-central1&quot;)</pre><pre># Initialize Vertex AI<br>vertexai.init(project=PROJECT_ID, location=LOCATION)</pre><h3>Step 3: Discovering and Inspecting Models</h3><p>The Model Garden SDK makes it simple to search for deployable assets programmatically. For instance, if you want to inspect available configurations for the gemma family of models (including Hugging Face integrations), you can query them directly:</p><pre># List available models matching a specific filter<br>models = model_garden.list_deployable_models(model_filter=&quot;gemma&quot;, list_hf_models=True)</pre><pre># Select an open-source model identifier<br>model_id = &quot;google/gemma3@gemma-3-1b-it&quot;<br>gemma_model = model_garden.OpenModel(model_id)</pre><pre># Inspect the available hardware and deployment deployment options<br>deploy_options = gemma_model.list_deploy_options(concise=True)<br>print(deploy_options)</pre><h3>Step 4: Provisioning Infrastructure and Deploying</h3><p>Once you select your model, the SDK lets you specify hardware profiles — such as machine types, accelerator requirements, and auto-scaling boundaries — and kick off infrastructure provisioning.</p><p>Below, we provision a single <strong>NVIDIA L4 GPU</strong> instance (g2-standard-12) to serve our endpoint:</p><pre>print(&quot;Deploying model endpoint. This framework provisioning step may take some time...&quot;)</pre><pre>gemma_endpoint = gemma_model.deploy(<br>    machine_type=&quot;g2-standard-12&quot;,<br>    accelerator_type=&quot;NVIDIA_L4&quot;,<br>    accelerator_count=1,<br>    min_replica_count=1,<br>    max_replica_count=1,<br>    endpoint_display_name=&quot;gemma_model_endpoint&quot;,<br>    model_display_name=&quot;gemma_model_self&quot;,<br>    deploy_request_timeout=3 * 60 * 60, # 3-hour timeout limit for allocation<br>)</pre><pre>print(f&quot;Endpoint successfully deployed! Resource ID: {gemma_endpoint.resource_name}&quot;)</pre><h3>Step 5: Running Predictions</h3><p>Once the endpoint is live, serving inference requests requires just a structured JSON payload containing your prompt configuration and generation hyperparameters:</p><pre>prediction = gemma_endpoint.predict(<br>    instances=[{<br>        &quot;prompt&quot;: &quot;Explain the architectural differences between specialized custom model endpoints and generic LLM APIs.&quot;, <br>        &quot;temperature&quot;: 0.0001, <br>        &quot;max_tokens&quot;: 150<br>    }]<br>)</pre><pre>print(&quot;Model Response:&quot;)<br>print(prediction.predictions[0])</pre><h3>Step 6: Resource Cleanup</h3><p>To avoid ongoing billing for cloud GPU allocation when your workflows or testing cycles are complete, please ensure to explicitly teardown the endpoint resource:</p><pre># Force-deletes the deployed endpoint and stops active billing<br>gemma_endpoint.delete(force=True)<br>print(&quot;Endpoint successfully decommissioned.&quot;)</pre><h3>Summary &amp; Code Repository</h3><p>Using the Model Garden SDK through the Gemini Enterprise Agent Platform simplifies the complex containerization and Kubernetes management that is usually needed for custom LLM hosting. It provides a highly developer-friendly bridge between open-weight model architectures and enterprise-grade Vertex AI inference infrastructure.</p><p><em>GitHub:</em> <a href="https://github.com/scholarly360/Gemini-Enterprise-Agent-Platform-Model-Garden-SDK">scholarly360/Gemini-Enterprise-Agent-Platform-Model-Garden-SDK</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FFZhx2M5P5KI%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DFZhx2M5P5KI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FFZhx2M5P5KI%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/6ad7ed7315941a0d20b66ad67ceedfda/href">https://medium.com/media/6ad7ed7315941a0d20b66ad67ceedfda/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0348d23b5196" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code with OpenRouter in a Sandbox]]></title>
            <link>https://medium.com/@scholarly360/claude-code-with-openrouter-in-a-sandbox-3fc4a984e4cc?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/3fc4a984e4cc</guid>
            <category><![CDATA[ubuntu]]></category>
            <category><![CDATA[open-router]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[kasm]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sat, 06 Jun 2026 14:48:31 GMT</pubDate>
            <atom:updated>2026-06-06T14:48:31.528Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jmmOebnzXstfXnEppWjwUA.png" /><figcaption>Claude Code with OpenRouter in a Sandbox</figcaption></figure><h3>Introduction</h3><p>As developers, we love experimenting with the latest AI developer tools. But let’s be honest: installing every new CLI tool directly onto your host machine can quickly turn into a configuration nightmare. Conflicts between dependencies, messy global environments, and security concerns are enough to make anyone hesitate.</p><p>If you want to test <strong>Claude Code</strong> Anthropic’s powerful command-line agent without cluttering your main operating system, there is a better way.</p><p>By isolating Claude Code inside a persistent Docker container running a full Ubuntu desktop environment and routing its power through OpenRouter, you get a completely walled-off, highly customizable, and secure developer sandbox.</p><p>Here is precisely how to set it up.</p><h3>Why Sandbox Claude Code?</h3><p>Sandboxing your AI development tools offers three massive advantages:</p><ul><li><strong>Isolation:</strong> Your host OS (whether Windows, macOS, or Linux) remains completely untouched.</li><li><strong>Persistence:</strong> By using Docker volumes, all of your files, projects, and configurations stay intact even if you stop or restart the container.</li><li><strong>Flexibility via OpenRouter:</strong> Instead of juggling multiple individual LLM accounts and API keys, OpenRouter gives you a unified interface to access Claude models seamlessly with a single token.</li></ul><h3>The Prerequisites</h3><p>Before diving into the terminal, please ensure you have two things ready:</p><ol><li><strong>Docker Desktop:</strong> Installed and running on your host machine.</li><li><strong>An OpenRouter Account:</strong> Sign up, log in, and generate a new API key (it will look like sk-or-...).</li></ol><h3>Step 1: Spin Up the Ubuntu Desktop Sandbox</h3><p>Instead of a bare-bones terminal container, we are using a <strong>Kasm Web</strong> Ubuntu Jammy desktop image. This gives us a full visual desktop environment accessible directly from any web browser.</p><p>Open your host terminal (like PowerShell or bash) and execute the Docker run command to start your sandbox:</p><p>Powershell</p><pre>## Run Docker<br>&gt;&gt; docker run -d --name kasm-desktop --shm-size=1024m -p 6901:6901 -e VNC_PW=Random@32 -e KASM_USER=root --user root -v C:\Users\yogen\kasm-files:/home/kasm-user/persistent  kasmweb/ubuntu-jammy-desktop:1.18.0</pre><pre>## See all docker containers<br>&gt;&gt; docker ps</pre><blockquote><strong><em>Note:</em></strong><em> You can adjust the configuration to attach a local storage volume to ensure your project files remain persistent on your host machine.</em></blockquote><p>Once the container is running, open your favorite browser and navigate to: <a href="https://localhost:6901/">https://localhost:6901</a></p><p>Log in using the credentials configured in your setup, and you’ll be greeted by a shiny new Ubuntu desktop interface right inside your browser tab.</p><h3>Step 2: Install the Claude Code CLI</h3><p>Inside your browser-based Ubuntu desktop, open up a terminal application. Because this is a fresh environment, you have full root access to experiment.</p><p>To download and install the official Claude Code command-line tool, simply run the following installation script:</p><p>Bash</p><pre><br>## Check Linux (Ubuntu) Version (Optional Only for Sanity)<br>&gt;&gt; cat /etc/os-release</pre><pre>## Install Claude Code<br>&gt;&gt; curl -fSSL https://claude.ai/install.sh | bash</pre><p>The script will automatically configure the necessary paths and binary configurations for you.</p><h3>Step 3: Wire OpenRouter to Claude&#39;s Code</h3><p>By default, Claude Code expects a standard Anthropic API key. To trick it into using OpenRouter’s unified interface instead, we need to create a project-level local settings file.</p><ul><li>Create your main project folder and navigate into it:</li></ul><pre><br>## Sample Folder<br><br>&gt;&gt; mkdir FirstProject &amp;&amp; cd FirstProject</pre><pre>## Create a hidden configuration directory named `.claude`:<br><br>&gt;&gt; mkdir .claude &amp;&amp; cd .claude</pre><pre>## Create settings.local.json<br><br>&gt;&gt; touch settings.local.json</pre><ul><li>Create a file named settings.local.json and paste the following structure, making sure to substitute your actual OpenRouter key:</li></ul><p>JSON</p><pre>{<br>  &quot;env&quot;: {<br>    &quot;ANTHROPIC_BASE_URL&quot;: &quot;https://openrouter.ai/api&quot;,<br>    &quot;ANTHROPIC_AUTH_TOKEN&quot;: &quot;sk-or-your-actual-open-router-key-here&quot;,<br>    &quot;ANTHROPIC_API_KEY&quot;: &quot;&quot;<br>  }<br>}</pre><p>By pointing the ANTHROPIC_BASE_URL directly to OpenRouter and feeding your token into the auth parameter, Claude Code will now communicate effortlessly through the OpenRouter proxy network.</p><h3>Step 4: Launch and Test inside VS Code</h3><p>The beauty of the Kasm Ubuntu image is that it comes pre-installed with <strong>Visual Studio Code</strong>.</p><ul><li>Launch VS Code inside your container sandbox and open your FirstProject folder.</li><li>Head to the Extensions marketplace, search for <strong>Claude Code for VS Code</strong>, and install it.</li><li>Open the integrated Claude Code panel. Thanks to your settings.local.json environment variables, the tool will initialize without demanding a standard Anthropic login.</li></ul><p>To verify that everything works, type a test instruction into the agent chat terminal, such as:</p><blockquote>“List files in directory”</blockquote><p>You will see Claude Code analyze your sandbox file structure, execute the bash query locally within the container bounds, and report back the results in real-time.</p><h3>Wrap Up</h3><p>You now have a fully operational, completely isolated playground for Claude Code. You can let the AI agent read files, write scripts, and execute terminal commands with zero anxiety about what it might do to your primary computer. If anything ever breaks or goes sideways, you can simply tear down the Docker container and spin up a pristine new sandbox in seconds.</p><p>Github Link :: <a href="https://github.com/scholarly360/Claude-Code-with-OpenRouter-in-a-Sandbox">https://github.com/scholarly360/Claude-Code-with-OpenRouter-in-a-Sandbox</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FgnEhNpar1_M%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DgnEhNpar1_M&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FgnEhNpar1_M%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/fb24a3d0b48f1c7adc9dc7ce604db949/href">https://medium.com/media/fb24a3d0b48f1c7adc9dc7ce604db949/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3fc4a984e4cc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code Skills using Claude Agent SDK]]></title>
            <link>https://medium.com/@scholarly360/claude-code-skills-using-claude-agent-sdk-783b99d43ac8?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/783b99d43ac8</guid>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[amazon-bedrock]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sun, 03 May 2026 10:10:15 GMT</pubDate>
            <atom:updated>2026-05-03T10:10:15.002Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eZBr-FQWNnl_bvJguhWrqQ.png" /><figcaption>Claude Code Skills using Claude Agent SDK</figcaption></figure><h3><strong>Introduction</strong></h3><p>In the rapidly evolving landscape of generative AI, Anthropic’s Claude has emerged as a powerhouse for coding and reasoning tasks. While many developers are familiar with using Claude through a web interface or basic API calls, the real power lies in <strong>Claude Code Skills</strong>.</p><p>Normally, we run these skills in local environments. However, to truly scale for enterprise productivity, we need to expose these capabilities via web services. In this article, we’ll explore how to use the <strong>Claude Agent SDK</strong> to run custom code skills within a <strong>FastAPI</strong> API.</p><h3>The Challenge: Moving Beyond Local Scripts</h3><p>Claude &quot;skills&quot; are specialized capabilities essentially encapsulated instructions and tools that allow the model to perform specific tasks (like humanizing text, generating humor, or interacting with a file system) with high precision.</p><p>The problem? Most implementations are designed for local CLI usage. To build a robust enterprise application, you need to:</p><ol><li>Centralize AI logic.</li><li>Provide a scalable API for front-end applications.</li><li>Securely manage credentials (like AWS Bedrock keys).</li></ol><h3>The Solution Architecture</h3><p>To solve this problem, we combine three powerful technologies:</p><ul><li><strong>Claude Agent SDK:</strong> The library that manages “Agentic” workflows and skill execution.</li><li><strong>FastAPI:</strong> A modern, high-performance web framework for building APIs with Python.</li><li><strong>Amazon Bedrock:</strong> To provide secure, enterprise-grade access to Claude models (not the consumer version).</li></ul><h3>Step 1: Environment Setup</h3><p>First, you need to install the necessary dependencies. In your development environment (or a Docker container as shown in the <a href="https://www.google.com/url?sa=E&amp;q=https%3A%2F%2Fgithub.com%2Fscholarly360%2FClaude-Code-Skills-Using-Claude-Agent-SDK">GitHub repo</a>), install the following:</p><pre>pip install fastapi uvicorn python-dotenv claude-agent-sdk</pre><p>Next, configure your .env file to connect to Amazon Bedrock.</p><pre>CLAUDE_CODE_USE_BEDROCK=1<br>AWS_REGION=us-east-1<br>ANTHROPIC_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0<br>ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION=us-east-1<br>ANTHROPIC_DEFAULT_HAIKU_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0<br>AWS_BEARER_TOKEN_BEDROCK=AWS_KEY</pre><p>The Claude Agent SDK looks for skills in a specific directory structure: .claude/skills/. Each skill consists of a directory with a SKILL.md file that defines its behavior.</p><p>For example here are two skills</p><pre>---<br>name: my-humanizer<br>description: Rewrites and transforms text to sound natural, warm, and authentically human — eliminating AI-sounding patterns like stiff structure<br>---<br><br># My Humanizer Skill<br><br>## Goal<br><br>Transform AI-generated or stiff text into prose that sounds like it was written by a real, thoughtful human being with personality, natural rhythm, and genuine voice.</pre><pre>---<br>name: my-humour-creator<br>description: Generate creative, high-quality humourous text on any topic, theme, emotion, or occasion. <br>---<br> <br># my-humour-creator Skill<br>Generate humourous text<br> <br>## Goal<br>Generate creative, evocative, and humourous text</pre><h3>Step 3: Integrating the SDK with FastAPI</h3><p>The core of the implementation is the run_query function. This function initializes the ClaudeAgentOptions, points the SDK to your skills directory, and executes the prompt.</p><p>Here is the simplified logic:</p><pre>from claude_agent_sdk import query, ClaudeAgentOptions<br>from fastapi import FastAPI<br><br>app = FastAPI()<br>async def run_query(prompt: str):<br>    options = ClaudeAgentOptions(<br>        cwd=&quot;.&quot;, # Current working directory<br>        setting_sources=[&quot;user&quot;, &quot;project&quot;],<br>        allowed_tools=[&quot;Skill&quot;, &quot;Read&quot;, &quot;Write&quot;] # Give the agent permission to use skills<br>    )<br>    <br>    result = &quot;&quot;<br>    # The SDK uses an asynchronous generator to stream the response<br>    async for message in query(prompt, options=options):<br>        if hasattr(message, &#39;text&#39;):<br>            result += message.text<br>    return result<br>@app.post(&quot;/chat&quot;)<br>async def chat(request: PromptRequest):<br>    response = await run_query(request.prompt)<br>    return {&quot;response&quot;: response}</pre><h3>Step 4: Invoking Skills via API</h3><p>Once the server is running (using uvicorn app:app --port 5000), you can invoke specific skills directly through your API endpoint.</p><p>In the video, the developer demonstrates using a prompt like</p><blockquote>“Using skill ‘my-humanizer’ convert following text: [Your Stiff Text Here]”</blockquote><p>The Claude Agent SDK recognizes the “Skill” tool, looks up my-humanizer in the .claude/skills directory, applies the system instructions defined in the Markdown file, and returns the processed text.</p><h3>Testing with Swagger UI</h3><p>FastAPI automatically generates a /docs endpoint. You can use the interface to fire POST requests to the /chat endpoint and see the “humanized” output in real-time.</p><h3>Why This Matters for Enterprise</h3><ol><li><strong>Simply Modular AI Logic:</strong> You can update the behavior of your AI (the “Skill”) just by editing a Markdown file, without changing a single line of application code.</li><li><strong>Tool Governance:</strong> By using allowed_tools, you can strictly control what the AI can do (e.g., it can read files but not run Bash commands in a production environment).</li><li><strong>Bedrock Integration:</strong> Leveraging Amazon Bedrock ensures that your data remains within your VPC and meets corporate compliance standards.</li></ol><h3>Conclusion</h3><p>The combination of <strong>Claude’s reasoning capabilities</strong>, the <strong>Agent SDK’s tool-use management</strong>, and <strong>FastAPI’s speed</strong> creates a formidable stack for any developer looking to build professional AI agents.</p><p>You are no longer limited to basic chat; you can now build a library of specialized skills and expose them to your entire organization through a simple, scalable API.</p><h3>Resources</h3><ul><li><strong>GitHub Repository:</strong></li></ul><p><a href="https://github.com/scholarly360/Claude-Code-Skills-Using-Claude-Agent-SDK">https://github.com/scholarly360/Claude-Code-Skills-Using-Claude-Agent-SDK</a></p><ul><li><strong>Full Video Tutorial:</strong></li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FDU6ozVjWep8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DDU6ozVjWep8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FDU6ozVjWep8%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7c4957a53f52d5e0f249ee64bcf905d3/href">https://medium.com/media/7c4957a53f52d5e0f249ee64bcf905d3/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=783b99d43ac8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude Code Skills for OWASP Top 10]]></title>
            <link>https://medium.com/@scholarly360/claude-code-skills-for-owasp-top-10-7b4b4bfe9b82?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/7b4b4bfe9b82</guid>
            <category><![CDATA[owasp]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[vulnerability]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sun, 12 Apr 2026 06:31:37 GMT</pubDate>
            <atom:updated>2026-04-12T06:31:37.322Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hn8hChNKttpK3OwQBPl5aw.png" /><figcaption>Claude Code Skills for OWASP Top 10</figcaption></figure><h3>Introduction</h3><p>In the fast-paced world of web development, &quot;security&quot; is often the thing we say we care about, but frequently the thing that gets squeezed at the end of a sprint. We’ve all been there: A deadline is looming, the features are finally working, and the security audit is treated as a final hurdle rather than a core part of the process.</p><p>But what if you could bake security into your development workflow using the same AI tools that you use to write code?</p><pre>https://owasp.org/www-project-top-ten/</pre><h3>The “Shift Left” Reality</h3><p>In the cybersecurity world, we talk a lot about “shifting left.” It simply means moving security checks earlier in the development lifecycle. The earlier you find a bug, the cheaper it is to fix.</p><p>The <a href="https://github.com/scholarly360/owasp-top10-web-skills">https://github.com/scholarly360/owasp-top10-web-skills</a> repository provides custom &quot;skills&quot; for Claude Code that allow developers to scan their codebase for the most critical web security risks, from SQL Injection to Broken Access Control, directly from the terminal.</p><h3>What are “Claude code skills&quot;?</h3><p>Claude Code allows users to define custom &quot;skills,&quot; specialized prompts, and instructions that give the AI a specific lens through which to view your code. Instead of just asking, “Is this code safe?” These skills instruct Claude to search for specific patterns, misconfigurations, and logic flaws defined by OWASP.</p><h3>A Deep Dive: Identifying SQL Injection</h3><p>One of the most common (and dangerous) vulnerabilities is <strong>injection.</strong> In the video demo, I demonstrated a main.py file with an intentionally vulnerable FastAPI endpoint:</p><h4>Sample</h4><pre>@app.get(&quot;/login&quot;)<br>def login(username: str = Query(...), password: str = Query(...)):<br>    db = sqlite3.connect(&quot;users.db&quot;)<br>    # VULNERABLE: Direct string interpolation<br>    query = f&quot;SELECT * FROM users WHERE username = &#39;{username}&#39; AND password = &#39;{password}&#39;&quot;<br>    # ...</pre><pre>https://owasp.org/Top10/2025/A05_2025-Injection/</pre><p>By invoking the injection skill, Claude Code Skill doesn’t just see a function; it sees a potential disaster. It identifies that user input is interpolated directly into a SQL query and crucially provides the remediation: <strong>Parameterized queries.</strong></p><h3>Tackling Broken Access Control</h3><p>Access control is notoriously difficult to test manually because it involves complex business logic. The project includes a broken access control skill that scans for things like</p><ul><li>Missing authorization on sensitive endpoints.</li><li>IDOR (Insecure Direct Object Reference) vulnerabilities.</li><li>CORS misconfigurations.</li></ul><p>In the demo, Claude identifies that several endpoints are “Unguarded,” meaning anyone with the URL could potentially execute system commands or read arbitrary files.</p><pre>&quot;&quot;&quot;<br>FastAPI Demo — Intentionally Vulnerable Endpoints<br>==================================================<br>Each endpoint is annotated with its vulnerability.<br>DO NOT use in production.<br>&quot;&quot;&quot;<br><br>from fastapi import FastAPI, Header, Query<br>import sqlite3, subprocess, os<br><br>app = FastAPI(title=&quot;Vulnerable Demo API&quot;)<br><br>DB = &quot;users.db&quot;<br><br>def init_db():<br>    con = sqlite3.connect(DB)<br>    con.execute(&quot;CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username TEXT, password TEXT, role TEXT)&quot;)<br>    con.execute(&quot;INSERT OR IGNORE INTO users VALUES (1, &#39;admin&#39;, &#39;admin123&#39;, &#39;admin&#39;)&quot;)<br>    con.execute(&quot;INSERT OR IGNORE INTO users VALUES (2, &#39;alice&#39;, &#39;password1&#39;, &#39;user&#39;)&quot;)<br>    con.commit()<br>    con.close()<br><br>init_db()<br><br><br># ─────────────────────────────────────────────<br># 1. VULNERABILITY: SQL Injection<br>#    User input is interpolated directly into<br>#    the SQL query — an attacker can pass:<br>#    username=admin&#39; OR &#39;1&#39;=&#39;1<br># ─────────────────────────────────────────────<br>@app.get(&quot;/login&quot;)<br>def login(username: str = Query(...), password: str = Query(...)):<br>    con = sqlite3.connect(DB)<br>    query = f&quot;SELECT * FROM users WHERE username = &#39;{username}&#39; AND password = &#39;{password}&#39;&quot;<br>    row = con.execute(query).fetchone()<br>    con.close()<br>    if row:<br>        return {&quot;status&quot;: &quot;logged in&quot;, &quot;user&quot;: row[1], &quot;role&quot;: row[3]}<br>    return {&quot;status&quot;: &quot;invalid credentials&quot;}<br><br><br># ─────────────────────────────────────────────<br># 2. VULNERABILITY: Command Injection<br>#    User-supplied `host` is passed directly to<br>#    the shell. An attacker can pass:<br>#    host=127.0.0.1; cat /etc/passwd<br># ─────────────────────────────────────────────<br>@app.get(&quot;/ping&quot;)<br>def ping(host: str = Query(...)):<br>    result = subprocess.check_output(f&quot;ping -c 1 {host}&quot;, shell=True, text=True)<br>    return {&quot;output&quot;: result}<br><br><br># ─────────────────────────────────────────────<br># 3. VULNERABILITY: Broken Authentication<br>#    The &quot;token&quot; is just the username in plain<br>#    text. Anyone can impersonate any user by<br>#    passing their name as the token.<br># ─────────────────────────────────────────────<br>@app.get(&quot;/profile&quot;)<br>def profile(x_token: str = Header(...)):<br>    # No real verification — token IS the username<br>    con = sqlite3.connect(DB)<br>    row = con.execute(f&quot;SELECT * FROM users WHERE username = &#39;{x_token}&#39;&quot;).fetchone()<br>    con.close()<br>    if row:<br>        return {&quot;username&quot;: row[1], &quot;role&quot;: row[3]}<br>    return {&quot;error&quot;: &quot;user not found&quot;}<br><br><br># ─────────────────────────────────────────────<br># 4. VULNERABILITY: Path Traversal<br>#    The filename is not sanitised. An attacker<br>#    can read arbitrary files:<br>#    filename=../../etc/passwd<br># ─────────────────────────────────────────────<br>@app.get(&quot;/file&quot;)<br>def read_file(filename: str = Query(...)):<br>    path = os.path.join(&quot;uploads&quot;, filename)   # no realpath / jail check<br>    with open(path, &quot;r&quot;) as f:<br>        content = f.read()<br>    return {&quot;content&quot;: content}<br><br><br># ─────────────────────────────────────────────<br># 5. VULNERABILITY: Sensitive Data Exposure<br>#    The endpoint returns every user&#39;s password<br>#    in plain text with no authorisation check.<br># ─────────────────────────────────────────────<br>@app.get(&quot;/users&quot;)<br>def list_users():<br>    con = sqlite3.connect(DB)<br>    rows = con.execute(&quot;SELECT id, username, password, role FROM users&quot;).fetchall()<br>    con.close()<br>    return [{&quot;id&quot;: r[0], &quot;username&quot;: r[1], &quot;password&quot;: r[2], &quot;role&quot;: r[3]} for r in rows]<br><br><br># ─────────────────────────────────────────────<br># 6. VULNERABILITY: Mass Assignment / IDOR<br>#    Any caller can change any user&#39;s role,<br>#    including escalating themselves to &quot;admin&quot;,<br>#    with no ownership or permission check.<br># ─────────────────────────────────────────────<br>@app.put(&quot;/user/{user_id}&quot;)<br>def update_user(user_id: int, username: str = Query(None), role: str = Query(None)):<br>    con = sqlite3.connect(DB)<br>    if username:<br>        con.execute(f&quot;UPDATE users SET username=&#39;{username}&#39; WHERE id={user_id}&quot;)<br>    if role:<br>        con.execute(f&quot;UPDATE users SET role=&#39;{role}&#39; WHERE id={user_id}&quot;)<br>    con.commit()<br>    con.close()<br>    return {&quot;status&quot;: &quot;updated&quot;}</pre><h3>How to Set It Up</h3><p>If you’re already using Claude Code, setting this up is incredibly straightforward.</p><p><strong>Clone the Repository:</strong></p><pre>clone https://github.com/scholarly360/test-owasp-top10-web-skills.git</pre><p><strong>Locate Your Skills Folder:</strong> Claude Code looks for custom skills in the .claude/skills directory of your project.</p><p><strong>Copy the Skills:</strong> Move the .json skill files from the cloned repo into your project’s .claude/skills folder.</p><p><strong>Run the Scan:</strong> Inside the Claude Code CLI, you can simply say:</p><p>“Test the file ‘main.py’ using ‘broken-access-control’ local skill”</p><p>Claude will then “noodle,” “think,” and “percolate” (as the CLI status messages charmingly put it) before delivering a detailed report of findings, severity levels, and fix suggestions.</p><h3>Why This Matters for the Enterprise</h3><p>For enterprise teams, this isn’t just about catching bugs; it’s about</p><ul><li><strong>Consistency:</strong> By using standardized OWASP skills, you ensure that every developer on the team is checking for the same risks.</li><li><strong>Education:</strong> When Claude flags a vulnerability and explains <em>why</em> it’s a risk, it acts as a real-time security coach for the developer.</li></ul><h3>The Future of AI-Assisted Security</h3><p>We are moving toward a future where “security by design” isn’t just a buzzword but a default state. Tools like Claude Code, paired with community-driven repositories like this one, lower the barrier to entry for robust security testing.</p><p>You don’t need to be a penetration tester to write secure code; you just need the right tools in your terminal.</p><p><em>Check out the full project on GitHub:</em></p><p><a href="https://github.com/scholarly360/owasp-top10-web-skills">GitHub - scholarly360/owasp-top10-web-skills: Agent Skills for OWASP Top 10 Application Security Risks (https://owasp.org/Top10/2025/)</a></p><p><a href="https://github.com/scholarly360/test-owasp-top10-web-skill">https://github.com/scholarly360/test-owasp-top10-web-skill</a></p><p><strong><em>Youtube Video</em></strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F94LYg666B9U%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D94LYg666B9U&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F94LYg666B9U%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/e20ec5ded3961f68a4b96358a6cfe724/href">https://medium.com/media/e20ec5ded3961f68a4b96358a6cfe724/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7b4b4bfe9b82" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Claude for Enterprise Productivity: Claude Code with Amazon Bedrock]]></title>
            <link>https://medium.com/@scholarly360/claude-for-enterprise-productivity-claude-code-with-amazon-bedrock-b22303ed526e?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/b22303ed526e</guid>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[anthropic-claude]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[amazon-bedrock]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 08:13:45 GMT</pubDate>
            <atom:updated>2026-03-22T08:13:45.943Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*54vZDU8myi37ImyBnSTghw.png" /></figure><h3><strong>Background</strong></h3><p>Claude Code is brilliant. But in an enterprise, you can’t just pipe AI calls directly to Anthropic’s servers. You need everything routed through your cloud provider for billing, compliance, and your security team’s sanity. This Medium article shows you how to wire Claude code through Amazon Bedrock in under 15 minutes.</p><p>If you’re working in an enterprise environment, you’ve probably run into this wall: your cloud team doesn’t want LLM traffic bypassing your AWS account. It is not bureaucracy for its own sake. Routing through Bedrock gives you centralized billing, audit logs, VPC controls, and the ability to apply your existing IAM policies. It’s actually the right call.</p><h3>Before we start: what you actually need</h3><p>Node and Git should be installed</p><ol><li><strong>Node.js</strong>: (e.g., version v24.14.0). Download from <strong>nodejs.org</strong></li><li><strong>Git</strong>: (e.g., version 2.33.0). Download from <strong>git-scm.com</strong></li></ol><pre>node -v<br>git --version</pre><h3>The four-step setup</h3><p><em>Install Claude Code globally</em></p><p>One command, and you’re done. This installs the latest version of Claude Code globally via npm so you can run it from any directory:</p><pre>npm install -g @anthropic-ai/claude-code@latest</pre><p><em>Create your local settings file</em></p><p>Navigate to your project directory. Then create a .claude folder with a settings.local.json file inside it. This file is where you tell Claude Code to use Bedrock instead of calling Anthropic directly.</p><pre>{<br>  &quot;env&quot;: {<br>    &quot;CLAUDE_CODE_USE_BEDROCK&quot;: &quot;1&quot;,<br>    &quot;AWS_REGION&quot;: &quot;us-east-1&quot;,<br>    &quot;ANTHROPIC_MODEL&quot;: &quot;us.anthropic.claude-sonnet-4-6&quot;,<br>    &quot;ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION&quot;: &quot;us-east-1&quot;,<br>    &quot;AWS_BEARER_TOKEN_BEDROCK&quot;: &quot;YOUR_LONG_TERM_API_KEY&quot;<br>  }<br>}</pre><p><em>Generate your Bedrock API key</em></p><p>Head over to your Amazon Bedrock console. In the left nav, look for <strong>API Keys</strong>. You’ll see two options—short-term and long-term. For any kind of team or production setup, pick <strong>long-term API keys</strong>.</p><p>Click <strong>Generate long-term API keys</strong>, copy what it gives you, and drop it into the AWS_BEARER_TOKEN_BEDROCK field in your settings file. Treat this key like a password; don&#39;t commit it to version control.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TlvXWmYkzHxUNNvltqRzSQ.png" /><figcaption>Bedrock Home</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vBdMt6K57csqSUWlrY1rGg.png" /><figcaption>Long Term API Key</figcaption></figure><p><em>Fire it up</em></p><p>From your project directory, just run:</p><pre>claude</pre><p>If everything is wired correctly, the CLI will initialize and confirm it’s connecting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-yRZ0RgqGjbDdfaAxTnRvg.png" /><figcaption>Claude Code CLI</figcaption></figure><p><a href="https://www.youtube.com/watch?v=_vfZnWDo504&amp;t">https://www.youtube.com/watch?v=_vfZnWDo504&amp;t</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b22303ed526e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting Started: TanStack AI with Azure OpenAI]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@scholarly360/getting-started-tanstack-ai-with-azure-openai-b85ab7d30a76?source=rss-c9f8feddbead------2"><img src="https://cdn-images-1.medium.com/max/1323/1*L4FD07uKQYdm59iAspeiKw.png" width="1323"></a></p><p class="medium-feed-snippet">This Medium article is practical walkthrough of connecting one of the most exciting new AI libraries to Microsoft&#x2019;s enterprise-grade model&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@scholarly360/getting-started-tanstack-ai-with-azure-openai-b85ab7d30a76?source=rss-c9f8feddbead------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@scholarly360/getting-started-tanstack-ai-with-azure-openai-b85ab7d30a76?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/b85ab7d30a76</guid>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[tanstack-ai]]></category>
            <category><![CDATA[azure]]></category>
            <category><![CDATA[tanstack]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sat, 07 Mar 2026 15:19:43 GMT</pubDate>
            <atom:updated>2026-03-07T15:19:43.728Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[I Gave My Next.js App Ears—Real-Time STT with Azure]]></title>
            <link>https://medium.com/@scholarly360/i-gave-my-next-js-app-ears-real-time-stt-with-azure-a857379d4251?source=rss-c9f8feddbead------2</link>
            <guid isPermaLink="false">https://medium.com/p/a857379d4251</guid>
            <category><![CDATA[azureopenai]]></category>
            <category><![CDATA[voice-assistant]]></category>
            <category><![CDATA[azure]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[speech-recognition]]></category>
            <dc:creator><![CDATA[Yogendra Sisodia]]></dc:creator>
            <pubDate>Sat, 14 Feb 2026 13:15:39 GMT</pubDate>
            <atom:updated>2026-02-14T13:15:39.660Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pRqI_ccyKC4BFfxZqiweMQ.png" /><figcaption>I Gave My Next.js App Ears Real-Time STT with Azure</figcaption></figure><h3>I built a real-time speech-to-text app with Next.js and Azure.</h3><p>I’ve been tinkering with voice interfaces for a while now. Most of the tutorials out there are either way too complicated or use outdated browser APIs that barely work. Last weekend, I dedicated myself to creating a straightforward Next.js (Next JS 16) application that utilizes a microphone to display words on the screen as we speak.</p><p>No fancy UI. No twelve-step configuration wizards. The interface consists solely of a text box and a button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*47F0p1i6CNvugg8X.png" /><figcaption>localhost</figcaption></figure><h3>Why I Built This Application</h3><p>Here’s the thing: the Web Speech API is unreliable. It works differently across browsers, drops connections randomly, and the accuracy isn’t great. I wanted something that actually works consistently, and Azure’s VoiceLive API turned out to be that thing. On the contrary, <a href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/voice-live">Azure Voice LiveAPI</a> is an overkill, as it is a real-time speech-to-text and text-to-speech service in one package.</p><p>Here is the <a href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/speech-sdk">link </a>for Speech SDK, also known as Cognitive Services</p><p><strong>Azure Cognitive Services Speech SDK</strong> is a developer toolkit from Microsoft that lets you add <strong>speech-to-text, text-to-speech, and speech translation</strong> capabilities into your applications using simple APIs. It is part of the broader <strong>Azure AI Speech</strong> service under Azure Cognitive Services.</p><p><strong>Capabilities</strong></p><ul><li>Real-time transcription (streaming mic/audio)</li><li>Batch transcription (audio files)</li><li>Custom speech models (domain vocabulary)</li><li>Speaker diarization (who spoke when)</li><li>Multi-language recognition</li></ul><p><strong>Typical uses</strong></p><ul><li>Meeting transcription</li><li>Voice command systems</li><li>Call center analytics</li><li>Dictation apps</li></ul><p>It took me about a day to get it working properly.</p><h3>The Stack</h3><p>I went with Next.js 16, TypeScript, Tailwind CSS, and shadcn/ui for the handful of components I needed. The speech recognition logic lives in a single custom hook, use-voicelive-stt.ts which handles the Azure connection, audio capture, format conversion, and streaming. Everything else is just a clean editor UI.</p><p>The project structure is minimal on purpose:</p><ul><li>An app/ folder with the layout and main page</li><li>A components/ui/ folder for the button and textarea</li><li>A lib/ folder where the STT hook and utilities live</li></ul><p>That’s it. There is no need for a state management library, complex routing, or over-engineering.</p><h3>How the Hook Works</h3><pre>&quot;use client&quot;;<br>/** <br>   This is client side next js client side rendering<br><br>   Versions :: <br>   &quot;microsoft-cognitiveservices-speech-sdk&quot;: &quot;^1.42.0&quot;,<br>    &quot;next&quot;: &quot;16.1.6&quot;,<br>    &quot;react&quot;: &quot;^19.0.0&quot;<br>*/ <br><br>import { useRef, useState, useCallback } from &quot;react&quot;;<br><br>/**<br> * Speech-to-text hook using the Azure Cognitive Services Speech SDK.<br> * Requires:<br> *   NEXT_PUBLIC_AZURE_SPEECH_KEY    - your Speech resource key<br> *   NEXT_PUBLIC_AZURE_SPEECH_REGION - e.g. &quot;eastus2&quot; <br> *   Pls make &quot;.env.local&quot; and add above to it.<br> */<br><br>export function useSpeechToText(onTranscript: (text: string) =&gt; void) {<br>  const [isListening, setIsListening] = useState(false);<br>  const [isConnecting, setIsConnecting] = useState(false);<br>  const [error, setError] = useState&lt;string | null&gt;(null);<br>  const [interimText, setInterimText] = useState&lt;string&gt;(&quot;&quot;);<br><br>  const recognizerRef = useRef&lt;any&gt;(null);<br><br>  /* ═══════════════════════ START ════════════════════════════ */<br>  const startListening = useCallback(async () =&gt; {<br>    try {<br>      setError(null);<br>      setIsConnecting(true);<br>      setInterimText(&quot;&quot;);<br><br>      // 1. Validate env vars<br>      const speechKey = process.env.NEXT_PUBLIC_AZURE_SPEECH_KEY;<br>      const speechRegion = process.env.NEXT_PUBLIC_AZURE_SPEECH_REGION;<br><br>      if (!speechKey || !speechRegion) {<br>        throw new Error(<br>          &quot;Missing NEXT_PUBLIC_AZURE_SPEECH_KEY or NEXT_PUBLIC_AZURE_SPEECH_REGION. &quot; +<br>            &quot;Copy .env.local.example → .env.local and fill in your values.&quot;<br>        );<br>      }<br><br>      // 2. Dynamic import (keeps the SDK out of the server bundle)<br>      const sdk = await import(&quot;microsoft-cognitiveservices-speech-sdk&quot;);<br><br>      // 3. Configure<br>      const speechConfig = sdk.SpeechConfig.fromSubscription(<br>        speechKey,<br>        speechRegion<br>      );<br>      speechConfig.speechRecognitionLanguage = &quot;en-US&quot;;<br>      // Change en-US to your Language e.g. &quot;en-IN&quot;<br><br>      // Use browser microphone<br>      const audioConfig = sdk.AudioConfig.fromDefaultMicrophoneInput();<br><br>      // 4. Create recognizer<br>      const recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);<br>      recognizerRef.current = recognizer;<br><br>      // ── &quot;recognizing&quot; — fires continuously with interim/partial results ──<br>      recognizer.recognizing = (_sender: any, event: any) =&gt; {<br>        const partial = event.result?.text ?? &quot;&quot;;<br>        console.log(&quot;[STT] 📝 Recognizing:&quot;, partial);<br>        setInterimText(partial);<br>      };<br><br>      // ── &quot;recognized&quot; — fires when a phrase is finalized ──<br>      recognizer.recognized = (_sender: any, event: any) =&gt; {<br>        const sdk2 = sdk; // capture for ResultReason<br>        if (event.result.reason === sdk2.ResultReason.RecognizedSpeech) {<br>          const finalText = event.result.text?.trim();<br>          console.log(&quot;[STT] ✅ Recognized:&quot;, finalText);<br>          if (finalText) {<br>            onTranscript(finalText);<br>          }<br>        } else if (event.result.reason === sdk2.ResultReason.NoMatch) {<br>          console.log(&quot;[STT] No match — could not recognize speech&quot;);<br>        }<br>        setInterimText(&quot;&quot;);<br>      };<br><br>      // ── &quot;canceled&quot; — fires on errors or end of stream ──<br>      recognizer.canceled = (_sender: any, event: any) =&gt; {<br>        const sdk2 = sdk;<br>        console.error(&quot;[STT] ❌ Canceled:&quot;, event.errorDetails);<br>        if (event.reason === sdk2.CancellationReason.Error) {<br>          setError(event.errorDetails ?? &quot;Speech recognition error&quot;);<br>        }<br>        setIsListening(false);<br>      };<br><br>      // ── session events ──<br>      recognizer.sessionStarted = () =&gt; {<br>        console.log(&quot;[STT] 🎤 Session started — listening&quot;);<br>        setIsListening(true);<br>        setIsConnecting(false);<br>      };<br><br>      recognizer.sessionStopped = () =&gt; {<br>        console.log(&quot;[STT] Session stopped&quot;);<br>        setIsListening(false);<br>      };<br><br>      // 5. Start continuous recognition<br>      recognizer.startContinuousRecognitionAsync(<br>        () =&gt; {<br>          console.log(&quot;[STT] ✅ Continuous recognition started&quot;);<br>        },<br>        (err: string) =&gt; {<br>          console.error(&quot;[STT] Failed to start:&quot;, err);<br>          setError(err);<br>          setIsConnecting(false);<br>        }<br>      );<br>    } catch (err: any) {<br>      console.error(&quot;[STT] startListening error:&quot;, err);<br>      setError(err?.message ?? &quot;Failed to start listening.&quot;);<br>      setIsConnecting(false);<br>    }<br>  }, [onTranscript]);<br><br>  /* ═══════════════════════ STOP ═════════════════════════════ */<br>  const stopListening = useCallback(async () =&gt; {<br>    const recognizer = recognizerRef.current;<br>    if (recognizer) {<br>      recognizer.stopContinuousRecognitionAsync(<br>        () =&gt; {<br>          console.log(&quot;[STT] Stopped ✅&quot;);<br>          recognizer.close();<br>          recognizerRef.current = null;<br>        },<br>        (err: string) =&gt; {<br>          console.error(&quot;[STT] Stop error:&quot;, err);<br>          recognizer.close();<br>          recognizerRef.current = null;<br>        }<br>      );<br>    }<br>    setIsListening(false);<br>    setInterimText(&quot;&quot;);<br>  }, []);<br><br>  return {<br>    isListening,<br>    isConnecting,<br>    error,<br>    interimText,<br>    startListening,<br>    stopListening,<br>  };<br>}</pre><p>This is a custom React hook called useSpeechToText that provides real-time speech-to-text functionality using <strong>Azure Cognitive Services Speech SDK</strong>. Here&#39;s how it works:</p><p><strong>Purpose:</strong> It captures audio from the user’s microphone, streams it to Azure’s speech recognition service, and returns transcribed text in real time.</p><p><strong>State it manages:</strong></p><ul><li>isListening — whether the mic is actively capturing</li><li>isConnecting — brief transition state while setting up the connection</li><li>error — any error message</li><li>interimText — partial/in-progress transcription (updates as you speak, before a phrase is finalized)</li></ul><p><strong>startListening flow:</strong></p><ol><li>Reads the Azure API key and region from environment variables</li><li>Dynamically imports the Speech SDK (so it doesn’t bloat the server-side bundle in Next.js)</li><li>Creates a SpeechConfig (credentials + language) and an AudioConfig (browser microphone)</li><li>Instantiates and wires up four event handlers:</li></ol><ul><li><strong>recognizing</strong> — fires repeatedly with partial results as you speak (the &quot;live caption&quot; effect)</li><li><strong>recognized</strong> — fires when Azure finalizes a complete phrase; calls onTranscript(finalText) to pass it to the parent component</li><li><strong>canceled</strong> — handles errors or unexpected disconnections</li><li><strong>sessionStarted/</strong><strong>sessionStopped </strong>toggle the isListening state</li></ul><p><strong>Usage pattern:</strong> A component would call startListening on a button press, display interimText as a live preview, and receive finalized sentences via the onTranscript callback, for example, appending them to a text input field.</p><p><strong>Azure Cognitive Services Speech SDK</strong> is the traditional, modular toolkit for adding individual speech capabilities to your applications. It provides discrete services like speech-to-text, text-to-speech, speech translation, and speaker recognition. You integrate each component separately and orchestrate the pipeline yourself, for example, taking audio input, running STT, sending text to your LLM, and then running TTS on the response. It’s available across many programming languages (C#, C++, Java, JavaScript, Python, Go, etc.) and platforms and supports both real-time and non-real-time scenarios using local devices, files, blob storage, and streams.</p><p><strong>Azure Voice Live</strong> (sometimes called “Voice Live API”) is a newer, higher-level managed service specifically designed for <strong>real-time speech-to-speech voice agents</strong>. It consolidates speech recognition, generative AI, and text-to-speech into a single unified interface, so you can build end-to-end voice experiences with less integration work. Instead of having to stitch together the speech-to-text (STT), large language model (LLM), and text-to-speech (TTS) components yourself, Voice Live manages the entire pipeline for you.</p><h3>When to Use Which</h3><p>Use the <strong>Speech SDK</strong> when you need individual speech components (just transcription, just synthesis), batch processing, custom speech models, translation, or fine-grained control over each piece of the pipeline.</p><p>Use <strong>Voice Live</strong> when you’re building a real-time conversational voice agent and want a turnkey solution that handles the full STT → LLM → TTS pipeline with minimal latency and integration effort.</p><h3>Setting It Up</h3><p>If you want to try it yourself, the setup is about five minutes. Clone the repo, run npm install, create a .env.local file with your Azure endpoint and API key, and hit npm run dev. The README walks through it step by step.</p><p>You will need an Azure account that includes a Microsoft Foundry resource (formerly known as Azure Foundry).</p><p><strong>GitHub repo:</strong> <a href="https://github.com/scholarly360/Azure-Voice-STT-With-Next-JS">github.com/scholarly360/Azure-Voice-STT-With-Next-JS</a></p><h3>A Word About Security</h3><p>The demo uses NEXT_PUBLIC_ environment variables, which means your API key is exposed in the browser. This is fine for local development and quick demos, but please don&#39;t ship it to production as-is. In a real app, you&#39;d want to proxy requests through a backend route so your keys stay server-side.</p><h3>What I’d Add Next</h3><p>A few things are on my mind for future iterations. Language selection would be helpful; right now it defaults to English. Speaker diarization (identifying who’s talking) would make this useful for meeting transcription. And exporting the transcript to a file seems like an obvious quality-of-life feature.</p><p>But honestly? For a weekend project, I’m happy with where it landed. The project performs a single function effectively.</p><p><em>If you’re building voice features into a web app and want a clean starting point, feel free to fork the repo and make it your own. It’s MIT licensed; do whatever you want with it.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a857379d4251" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>