[{"articles":[{"date":"2026-08-23","excerpt":"A model is a text completion machine. It has no hands, eyes, or memory. The harness is what gives it the ability to act and remember.","markdown_url":"/blog/agent-harness-why-do-we-need-it/index.md","slug":"","title":"Agent harness - Why do we need it?","url":"https://ravichaganti.com/blog/agent-harness-why-do-we-need-it/"}],"count":1,"name":"Agent Harness","slug":"agent-harness","url":"https://ravichaganti.com/series/agent-harness/"},{"articles":[{"date":"2026-08-16","excerpt":"Agentic coding requires domain knowledge, and this domain knowledge is provided to the agents using skills.","markdown_url":"/blog/agent-skills-for-c4-diagram-and-web-demo-generation/index.md","slug":"","title":"Agent skills for C4 diagram and web demo generation","url":"https://ravichaganti.com/blog/agent-skills-for-c4-diagram-and-web-demo-generation/"}],"count":1,"name":"Agent Skills","slug":"agent-skills","url":"https://ravichaganti.com/series/agent-skills/"},{"articles":[{"date":"2026-08-07","excerpt":"The Agent Directory Service directories can be exposed to LLMs directly using the Model Context Protocol and deploying the entire stack into a production environment.","markdown_url":"/blog/navigating-agent-ai-standards-foundations-protocols-competition-and-path-to-convergence/index.md","slug":"","title":"Navigating Agent AI Standards: Foundations, Protocols, Competition, and Path to Convergence","url":"https://ravichaganti.com/blog/navigating-agent-ai-standards-foundations-protocols-competition-and-path-to-convergence/"},{"date":"2026-08-08","excerpt":"AI agent clients (IDEs, CLIs, platforms) each invented their own plugin packaging format — even when plugins contained the same underlying components.","markdown_url":"/blog/agent-plugins-package-reusable-agent-components-into-portable-and-interoperable-plugins/index.md","slug":"","title":"Agent Plugins: Package reusable agent components into portable and interoperable plugins","url":"https://ravichaganti.com/blog/agent-plugins-package-reusable-agent-components-into-portable-and-interoperable-plugins/"}],"count":2,"name":"Agentic AI Standards","slug":"agentic-ai-standards","url":"https://ravichaganti.com/series/agentic-ai-standards/"},{"articles":[{"date":"2026-02-06","excerpt":"Agent Skills and MCP are a hot topic. Understanding these standards genuinely overlap, where they serve fundamentally different purposes, and where each falls short, is essential for anyone building agent-powered systems.","markdown_url":"/blog/agent-skills-vs-model-context-protocol-how-do-you-choose/index.md","slug":"","title":"Agent skills vs Model Context Protocol - [How] do you choose?","url":"https://ravichaganti.com/blog/agent-skills-vs-model-context-protocol-how-do-you-choose/"},{"date":"2026-06-06","excerpt":"AI coding agents not only increase developer velocity but also cognitive debt!","markdown_url":"/blog/fighting-cognitive-debt-in-the-age-of-ai-coding/index.md","slug":"","title":"Fighting cognitive debt in the age of AI coding","url":"https://ravichaganti.com/blog/fighting-cognitive-debt-in-the-age-of-ai-coding/"}],"count":2,"name":"Agents","slug":"agents","url":"https://ravichaganti.com/series/agents/"},{"articles":[{"date":"2026-03-05","excerpt":"Agents are living in isolation. They are built on different frameworks, hosted in different environments, and speak different dialects. This is the agent silo problem.","markdown_url":"/blog/the-agent-silos-problem-and-agntcy/index.md","slug":"","title":"The Agent silos problem and AGNTCY","url":"https://ravichaganti.com/blog/the-agent-silos-problem-and-agntcy/"},{"date":"2026-03-09","excerpt":"Building a global network of agents is not a trivial undertaking. It requires a robust, standardized foundation. Much like the OSI model formalized how computers communicate across networks, AGNTCY introduces a structured stack to handle everything from discovery to secure invocation.","markdown_url":"/blog/understanding-agntcy-the-architecture-of-the-internet-of-agents/index.md","slug":"","title":"Understanding AGNTCY - The architecture of the internet of agents","url":"https://ravichaganti.com/blog/understanding-agntcy-the-architecture-of-the-internet-of-agents/"},{"date":"2026-03-10","excerpt":"The AI agent ecosystem is crowded with acronyms — MCP, A2A, ACP, LangGraph, CrewAI, AutoGen. It is genuinely confusing. I hear this from practitioners constantly. Everyone is building an 'agent standard,' so how do we make sense of it all?","markdown_url":"/blog/understanding-agntcy-where-it-fits-in-the-agentic-ai-ecosystem/index.md","slug":"","title":"Understanding AGNTCY - Where it fits in the agentic AI ecosystem","url":"https://ravichaganti.com/blog/understanding-agntcy-where-it-fits-in-the-agentic-ai-ecosystem/"},{"date":"2026-03-11","excerpt":"Without a standardized schema, orchestrators are left guessing what an agent can do, often resorting to fragile prompt parsing and heuristic-based routing. This is neither scalable nor reliable.","markdown_url":"/blog/understanding-agntcy-the-oasf-data-model-and-agent-schemas/index.md","slug":"","title":"Understanding AGNTCY - The OASF data model and agent schemas","url":"https://ravichaganti.com/blog/understanding-agntcy-the-oasf-data-model-and-agent-schemas/"},{"date":"2026-03-14","excerpt":"In a multi-agent environment, relying on unvalidated metadata is a recipe for disaster.","markdown_url":"/blog/understanding-agntcy-schema-validation-and-enterprise-extensions/index.md","slug":"","title":"Understanding AGNTCY - Schema validation and enterprise extensions","url":"https://ravichaganti.com/blog/understanding-agntcy-schema-validation-and-enterprise-extensions/"},{"date":"2026-05-06","excerpt":"The Agent Directory Service is the phonebook for our agent ecosystem. However, it is not just mapping a name to an address like DNS does for web servers. Instead, ADS relies on capability-based matching.","markdown_url":"/blog/understanding-agntcy-the-agent-directory-service/index.md","slug":"","title":"Understanding AGNTCY - The agent directory service","url":"https://ravichaganti.com/blog/understanding-agntcy-the-agent-directory-service/"},{"date":"2026-05-08","excerpt":"The Agent Directory Service directories can be exposed to LLMs directly using the Model Context Protocol and deploying the entire stack into a production environment.","markdown_url":"/blog/understanding-agntcy-exposing-agent-directories-via-mcp-and-enterprise-deployment/index.md","slug":"","title":"Understanding AGNTCY - Exposing agent directories via MCP and enterprise deployment","url":"https://ravichaganti.com/blog/understanding-agntcy-exposing-agent-directories-via-mcp-and-enterprise-deployment/"}],"count":7,"name":"Agntcy","slug":"agntcy","url":"https://ravichaganti.com/series/agntcy/"},{"articles":[{"date":"2026-02-01","excerpt":"Every AI demo I've ever seen works perfectly. Every AI system I've ever built breaks in ways no demo ever warned me about.","markdown_url":"/blog/ai-platform-engineering-the-platform-layer/index.md","slug":"","title":"AI Platform Engineering: The Platform Layer","url":"https://ravichaganti.com/blog/ai-platform-engineering-the-platform-layer/"},{"date":"2026-02-03","excerpt":"An AI platform is not just a web platform with a GPU attached. The core assumptions that drove web architecture for the last ten years are fundamentally broken when you introduce AI workloads.","markdown_url":"/blog/ai-platform-engineering-why-ai-platforms-are-different-from-web-platforms/index.md","slug":"","title":"AI Platform Engineering: Why AI Platforms are different from web platforms","url":"https://ravichaganti.com/blog/ai-platform-engineering-why-ai-platforms-are-different-from-web-platforms/"},{"date":"2026-02-06","excerpt":"MLOps was built on a single load-bearing assumption: that you train the model. Foundation models broke it, and the discipline had to become something else.","markdown_url":"/blog/ai-platform-engineering-how-mlops-became-platform-engineering/index.md","slug":"","title":"AI Platform Engineering: How MLOps became platform engineering","url":"https://ravichaganti.com/blog/ai-platform-engineering-how-mlops-became-platform-engineering/"}],"count":3,"name":"AI Platform Engineering","slug":"ai-platform-engineering","url":"https://ravichaganti.com/series/ai-platform-engineering/"},{"articles":[{"date":"2022-12-16","excerpt":" Practice makes permanent - Bobby Robson.\nWhen learning a new programming language or any technology for that matter, we need to practice what we learn, and that is when it becomes permanent. I am starting a new series of posts to share what I have tried or built, so that what I have learned— through Go programming books, video courses, and community content—stays with me permanently.\nThe first one in this series is about using Cobra package to build a CLI application.\n","markdown_url":"/blog/2022-12-16-applied-go-creating-a-cli-application/index.md","slug":"2022-12-16-applied-go-creating-a-cli-application","title":"Applied Go - Creating a CLI application","url":"https://ravichaganti.com/blog/2022-12-16-applied-go-creating-a-cli-application/"}],"count":1,"name":"Applied Go","slug":"applied-go","url":"https://ravichaganti.com/series/applied-go/"},{"articles":[{"date":"2015-11-02","excerpt":"Azure Resource Manager isn’t a new thing! It was announced during Build 2014. ARM is certainly the preferred way, with more and more services getting ARM support, to deploy Azure services. Microsoft also announced that the upcoming Azure Stack release will feature Azure Resource Manager and the template deployment. This means that learning how to use ARM and write you own templates is an essential skill not just for public cloud but also for the private and hybrid cloud administrators.\n","markdown_url":"/blog/building-azure-resource-manager-templates-an-introduction/index.md","slug":"building-azure-resource-manager-templates-an-introduction","title":"Building Azure Resource Manager Templates – An Introduction","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-an-introduction/"},{"date":"2015-11-06","excerpt":"As a part of this series, we will go through the language semantics of writing ARM templates. We will explore each and every aspect of the ARM template language and go through multiple examples to understand the concepts better. We won’t focus much on the resource types and resource definitions until we complete the discussion around the language semantics and artifacts.\nLet us get started.\nTools for the job JSON templates for ARM can be edited in notepad too. But, there are better tools that can help us with this.\n","markdown_url":"/blog/building-azure-resource-manager-templates-the-basics/index.md","slug":"building-azure-resource-manager-templates-the-basics","title":"Building Azure Resource Manager Templates – The Basics","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-the-basics/"},{"date":"2015-11-10","excerpt":"In the earlier parts of this series, we briefly looked at different methods of deploying ARM templates and then basics of ARM template language. Starting today’s article, we will see our leaning in action. To get going with our leaning, we will start building the ARM template for the following scenario.\nWe will incrementally build this scenario by learning different aspects of ARM template language. We won’t be covering all resource types in Azure but we will cover every aspect of the ARM template language and functions and expressions used in the template language. We will also review best practices in building these ARM templates as we proceed forward in this series.\n","markdown_url":"/blog/building-azure-resource-manager-templates-using-parameters/index.md","slug":"building-azure-resource-manager-templates-using-parameters","title":"Building Azure Resource Manager Templates – Using Parameters","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-parameters/"},{"date":"2015-11-15","excerpt":"If you have been following this series on ARM templates, in the last part, we started with a sample scenario that we are using to build an ARM template. Here it is again.\nIn the last part, we completed creation of storage account required for backing the OS and data disks for virtual machines in the deployment. The next step in our scenario is to create the virtual network for the VM connectivity. A virtual network and any subnets required must exist before the creation of virtual machines. So, in today’s article, we will see how we can use variables in the ARM template language while incrementally building an ARM template for our scenario and add virtual network. Towards the end, we will review some best practices guidance with regards to using parameters and variables in developing ARM templates.\n","markdown_url":"/blog/building-azure-resource-manager-templates-using-variables/index.md","slug":"building-azure-resource-manager-templates-using-variables","title":"Building Azure Resource Manager Templates – Using Variables","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-variables/"},{"date":"2015-11-17","excerpt":"If you are following this series, by now you know how to use parameters and variables in ARM template language. We used that knowledge to create a template that creates relevant things to like storage account and virtual network. Let us revisit the scenario.\nIn this part, we will extend the template to add publicIP, load balancer, and RDP endpoints for the virtual machines. Before we do that, let us review what we need. To achieve what we want in this, we will use copy object in the template.\n","markdown_url":"/blog/building-azure-resource-manager-templates-using-copy-object/index.md","slug":"building-azure-resource-manager-templates-using-copy-object","title":"Building Azure Resource Manager Templates – Using Copy Object","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-copy-object/"},{"date":"2015-12-08","excerpt":"We will continue learning about building ARM templates by looking at how we can define dependencies between resources. To recap, here is the scenario we are working on.\nIn the earlier parts of this series, we created the storage account, virtual network, a public IP, a load balancer, and added all inbound NAT rules required for the virtual machine RDP access. If you notice, we have components that depend on others. For example, the inbound NAT rules depend on the load balancer. Similarly, VMs depend on network interfaces which in turn depend on the virtual network. In the absence of dependencies, ARM will attempt to deploy these resources in parallel which may result in errors. So, within the resource template, we need to define these dependencies so that ARM can make decisions about the deployment sequence. There are multiple ways of doing this.\n","markdown_url":"/blog/building-azure-resource-manager-templates-defining-resource-dependencies/index.md","slug":"building-azure-resource-manager-templates-defining-resource-dependencies","title":"Building Azure Resource Manager Templates – Defining Resource Dependencies","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-defining-resource-dependencies/"},{"date":"2015-12-14","excerpt":"One of the ARM template authoring best practices is to decompose the JSON template, if applicable, into multiple target-specific templates. Think of this as creating re-usable code. You can leverage the re-usable parts of your code within multiple aspects of your application or the deployment.\nFor linking different external templates within the main template, we need to define the Microsoft.Resources/deployments resource instance. Before we proceed let us look at the scenario for which we are building an ARM template.\n","markdown_url":"/blog/building-azure-resource-manager-templates-using-linked-templates/index.md","slug":"building-azure-resource-manager-templates-using-linked-templates","title":"Building Azure Resource Manager Templates – Using Linked Templates","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-linked-templates/"},{"date":"2015-12-18","excerpt":"In this series so far, we looked at building ARM templates by example. The focus was not really on the resource types or how to use resource definitions. Instead, our focus was on learning the basics of template language. To that extent, we have a scenario that we want to deploy and we are incrementally building the template for it.\nWhile building an ARM template for this, we looked at how to use parameters and variables. We looked at using copy object to create multiple instances of a resource type without really writing the resource definition multiple times. We went on to find out how we can define dependencies between different resource types so they are orchestrated in the right order. We looked at how we can decompose the template into purpose-specific external templates and how to link them together. While learning these concepts, we created a template that almost built the scenario we started with.\n","markdown_url":"/blog/building-azure-resource-manager-templates-putting-it-all-together/index.md","slug":"building-azure-resource-manager-templates-putting-it-all-together","title":"Building Azure Resource Manager Templates – Putting it all together","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-putting-it-all-together/"},{"date":"2016-02-13","excerpt":"The scenario that we used to understand and build ARM templates contained a domain controller VM along with one or more VMs that joined the domain service hosted by the DC VM.\nTo make sure the VMs join the domain, we used PowerShell DSC configuration. One of the biggest quirks, at least what I faced, with DSC extension with ARM templates is that it takes little longer to complete. For example, the complete scenario deployment took almost 48 minutes to deploy. I am not making up that number. Here is the proof.\n","markdown_url":"/blog/building-azure-resource-manager-templates-using-domain-join-extension/index.md","slug":"building-azure-resource-manager-templates-using-domain-join-extension","title":"Building Azure Resource Manager Templates – Using Domain Join Extension","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-using-domain-join-extension/"},{"date":"2016-02-15","excerpt":"This subject won\u0026rsquo;t really need a post of its own but I will do it anyway. In the previous part of this ARM series, I showed how we can use the domain join extension instead of DSC to join a VM to an existing AD domain. This resulted is huge savings in time taken to deploy the entire scenario. When I was talking to my good friend, fellow PowerShell MVP and all-things-Azure guru, Ben Gelens, he was quick to point that the delays when using DSC extension here could be due to the install of WMF 5.0. Indeed!\n","markdown_url":"/blog/building-azure-resource-manager-templates-forcing-wmf-4-0-when-using-dsc-extension/index.md","slug":"building-azure-resource-manager-templates-forcing-wmf-4-0-when-using-dsc-extension","title":"Building Azure Resource Manager Templates – Forcing WMF 4.0 when using DSC Extension","url":"https://ravichaganti.com/blog/building-azure-resource-manager-templates-forcing-wmf-4-0-when-using-dsc-extension/"},{"date":"2016-03-29","excerpt":"When testing ARM templates, I typically use the custom template deployment option in the Azure Portal. This UI option just got better! This deployment option now supports lists the parameters, variables, and resources used in template in a nice treeview navigation.\nTo start a new deployment, you can click on New -\u0026gt; Template Deployment.\nThis opens up the Custom Deployment blade. Click on Edit Template.\n","markdown_url":"/blog/custom-template-deployment-improvements-in-azure-portal/index.md","slug":"custom-template-deployment-improvements-in-azure-portal","title":"Custom Template Deployment Improvements in Azure Portal","url":"https://ravichaganti.com/blog/custom-template-deployment-improvements-in-azure-portal/"}],"count":11,"name":"ARM Templates","slug":"arm-templates","url":"https://ravichaganti.com/series/arm-templates/"},{"articles":[{"date":"2025-01-30","excerpt":"I have been closely following developments in the Agentic AI space. AutoGen from Microsoft Research is emerging as a powerful yet easy-to-use framework for building AI agents and applications. With their re-architected release (0.4.0), they have re-imagined building advanced AI applications. This release introduces an asynchronous, event-driven architecture.\n","markdown_url":"/blog/getting-started-with-autogen-framework-for-building-ai-agents-and-applications/index.md","slug":"getting-started-with-autogen-framework-for-building-ai-agents-and-applications","title":"Getting started with AutoGen framework for building AI agents and applications","url":"https://ravichaganti.com/blog/getting-started-with-autogen-framework-for-building-ai-agents-and-applications/"},{"date":"2025-02-05","excerpt":"In the previous article in this series on Microsoft AutoGen, we looked at how to get started with Microsoft AutoGen and create a simple agent. We built a weather agent capable of retrieving real-time weather data. Through this demonstration, we gained an understanding of the basics of implementing an agent using the AutoGen framework. In this article, we will examine the process of building a team of agents or a multi-agent team to achieve a slightly more complex goal. We will start this exploration by building a single-agent team. Yes, you read that correctly. AutoGen allows you to create a single-agent team. This is useful in running an agent in a loop until a goal is achieved.\n","markdown_url":"/blog/teams-of-agents-in-autogen/index.md","slug":"teams-of-agents-in-autogen","title":"Teams of agents in AutoGen","url":"https://ravichaganti.com/blog/teams-of-agents-in-autogen/"},{"date":"2025-02-10","excerpt":"In the previous parts of this series on the Microsoft AutoGen framework, we looked at how to get started with the AutoGen framework. We examined the process of building a simple agent using the prebuilt AssistantAgent in AutoGen and explored the development of a multi-agent team.\nHowever, what is an agent in the context of AutoGen? How do agents communicate with each other? I needed answers to these questions before proceeding to the next step in using AutoGen to build larger, multi-agent applications. So, I started exploring the Core package upon which the autogen-chat is built. This article is a result of that exploration.\n","markdown_url":"/blog/understanding-agents-in-autogen-framework/index.md","slug":"understanding-agents-in-autogen-framework","title":"Understanding Agents in Microsoft AutoGen framework","url":"https://ravichaganti.com/blog/understanding-agents-in-autogen-framework/"},{"date":"2025-04-06","excerpt":"Know what went into AutoGen 0.5.1 -- the open framework for creating multi-agent systems.","markdown_url":"/blog/changes-in-autogen-release-0_5_1/index.md","slug":"changes-in-autogen-release-0_5_1","title":"Changes in Autogen release 0.5.1","url":"https://ravichaganti.com/blog/changes-in-autogen-release-0_5_1/"}],"count":4,"name":"AutoGen","slug":"autogen","url":"https://ravichaganti.com/series/autogen/"},{"articles":[{"date":"2022-11-01","excerpt":"Containerization is everywhere \u0026ndash; from on-premises data centers to the edge and in the cloud. We have been using containers right from development to production. I wrote about VS Code development containers and how I have standardized my development environment using devcontainers. There are several options for companies to run containerized applications in production. we can run individual application containers on a container host using engines like Docker. We can use tools like Docker Compose or Swarm for slightly complex multi-container, multi-host environments. However, it becomes complex to manage such environments. This needs us to implement a physical or virtualized server environment and handle all operational overhead associated with running our data center.\n","markdown_url":"/blog/2022-11-01-containerization-in-azure/index.md","slug":"2022-11-01-containerization-in-azure","title":"Containerization in Microsoft Azure","url":"https://ravichaganti.com/blog/2022-11-01-containerization-in-azure/"}],"count":1,"name":"Azure","slug":"azure","url":"https://ravichaganti.com/series/azure/"},{"articles":[{"date":"2025-09-02","excerpt":"Creating an enterprise AI application? Does your application need access to enterprise data and web content? Azure AI Search is the answer.","markdown_url":"/blog/azure-ai-search-getting-started/index.md","slug":"","title":"Azure AI Search - Getting Started","url":"https://ravichaganti.com/blog/azure-ai-search-getting-started/"},{"date":"2025-09-04","excerpt":"To make use of the power of Azure AI Search, we need to create an index, load data into it, and run queries.","markdown_url":"/blog/azure-ai-search-creating-indexes-and-loading-data/index.md","slug":"","title":"Azure AI Search - Creating Indexes and Loading Data","url":"https://ravichaganti.com/blog/azure-ai-search-creating-indexes-and-loading-data/"},{"date":"2025-09-05","excerpt":"An AI enrichment pipeline extends the indexer with a skill set, an ordered collection of skills that transform content during indexing.","markdown_url":"/blog/azure-ai-search-ai-enrichment-with-skillsets/index.md","slug":"","title":"Azure AI Search - AI Enrichment with Skillsets","url":"https://ravichaganti.com/blog/azure-ai-search-ai-enrichment-with-skillsets/"},{"date":"2025-09-08","excerpt":"In this article, we cross into vector territory. We will chunk documents using the Text Split skill, generate embeddings with Azure OpenAI, store them in a vector-enabled index, and run both vector and hybrid queries.","markdown_url":"/blog/azure-ai-search-vectorization-custom-skills-and-rag/index.md","slug":"","title":"Azure AI Search - Vectorization, Custom Skills, and RAG","url":"https://ravichaganti.com/blog/azure-ai-search-vectorization-custom-skills-and-rag/"}],"count":4,"name":"Azure AI Search","slug":"azure-ai-search","url":"https://ravichaganti.com/series/azure-ai-search/"},{"articles":[{"date":"2025-09-11","excerpt":"In this first part of our Azure AI Search Python SDK series, we install the azure-search-documents library, configure authentication, create and manage indexes programmatically, upload documents, and run your first full-text search queries — all from Python.","markdown_url":"/blog/azure-ai-search-python-sdk-installation-authentication-and-index-management/index.md","slug":"","title":"Azure AI Search Python SDK — Installation, Authentication, and Index Management","url":"https://ravichaganti.com/blog/azure-ai-search-python-sdk-installation-authentication-and-index-management/"},{"date":"2025-09-13","excerpt":"Part 2 of our Azure AI Search Python SDK series goes deeper: faceted navigation, custom scoring profiles, semantic ranking with captions and answers, vector search with embeddings, and hybrid search that combines keyword and vector retrieval for maximum relevance.","markdown_url":"/blog/azure-ai-search-python-sdk-facets-scoring-profiles-semantic-ranking-and-vector-search/index.md","slug":"","title":"Azure AI Search Python SDK — Facets, Scoring Profiles, Semantic Ranking, and Vector Search","url":"https://ravichaganti.com/blog/azure-ai-search-python-sdk-facets-scoring-profiles-semantic-ranking-and-vector-search/"}],"count":2,"name":"Azure AI Search Python SDK","slug":"azure-ai-search-python-sdk","url":"https://ravichaganti.com/series/azure-ai-search-python-sdk/"},{"articles":[{"date":"2021-03-22","excerpt":" Global Azure Bootcamp is happening this year from April 15th to 17th as an online event. And, I will be speaking this year. I submitted a couple of sessions and the Azure Bicep session got accepted.\nSo, what is Azure Bicep? Azure Bicep is the Domain-Specific Language (DSL) and a transparent abstraction built on top of Azure Resource Manager (ARM). The intention behind this project is to simplify authoring ARM templates. Bicep language transpiles into an ARM template JSON which you can deploy using already well-known methods and your existing CI/CD pipelines.\n","markdown_url":"/blog/speaking-at-global-azure-bootcamp-india-2021/index.md","slug":"speaking-at-global-azure-bootcamp-india-2021","title":"Speaking at Global Azure Bootcamp India 2021","url":"https://ravichaganti.com/blog/speaking-at-global-azure-bootcamp-india-2021/"},{"date":"2021-03-25","excerpt":" Project Bicep aims to simplify how you author Azure Resource Manager (ARM) templates. Bicep is a new declarative language and a transpiler. This transparent abstraction takes a bicep file and transpiles it into an ARM template JSON. The Bicep CLI provides the necessary capablities to compile bicep files to ARM templates and decompile ARM templates into bicep files.\nBicep language itself is very easy to understand and start using. However, as you start learning it may be helpful to see a few examples and draw some inspiration as you build your won bicep files. Project Bicep respository on GitHub has a good number of examples for varied level of complexity. While looking at these, I thought it may be a good idea to create scripts that can retrieve and save selected example locally.\n","markdown_url":"/blog/retrieve-and-save-project-bicep-examples-from-github/index.md","slug":"retrieve-and-save-project-bicep-examples-from-github","title":"Retrieve and save Project Bicep examples from GitHub","url":"https://ravichaganti.com/blog/retrieve-and-save-project-bicep-examples-from-github/"},{"date":"2021-04-05","excerpt":" As I started preparing slides and demos for my session on Azure Bicep at the Global Azure Bootcamp 2021, I made a bunch of notes. As a part of this new series of articles on Azure Bicep, I will start sharing those notes here.\nAzure Bicep is a new Domain-Specific Language (DSL) for declaratively deploying Azure resources. Bicep is not a general purpose programming language but a transparent abstraction for Azure Resource Manager (ARM) Templates. This ensures that the properties that are valid in ARM templates are valid in Bicep as well. Azure Bicep acts as a transpiler for generating ARM templates from Bicep files. But, what is wrong with ARM templates?\n","markdown_url":"/blog/introduction-to-azure-bicep/index.md","slug":"introduction-to-azure-bicep","title":"Introduction to Azure Bicep","url":"https://ravichaganti.com/blog/introduction-to-azure-bicep/"},{"date":"2021-04-06","excerpt":" In the first part of this new series of articles on Azure Bicep, you learnt about what is Azure Bicep and why it is needed. In this part, you will learn about how to get started with Azure Bicep.\nInstalling Bicep To start working with Bicep you will need, at a minimum, the Bicep CLI. There are multiple ways to get Bicep CLI on to your system. On Windows systems, you can use any of the following methods.\n","markdown_url":"/blog/getting-started-with-azure-bicep/index.md","slug":"getting-started-with-azure-bicep","title":"Getting Started With Azure Bicep","url":"https://ravichaganti.com/blog/getting-started-with-azure-bicep/"},{"date":"2021-04-11","excerpt":" In the previous part, you learned how you can get started with Bicep language to write your first Bicep file. As you learned, resource keyword along with resource declaration and resource properties are the minimum required in a Bicep file. In today\u0026rsquo;s article, you will see what is beyond those basics.\nParameters One of the goals of Infrastructure as Code (IaC) practice is to create reusable and repeatable automation for deploying your infrastructure. To make this happen, you need to parameterize your infrastructure configuration definitions. In this case, your Bicep files.\n","markdown_url":"/blog/bicep-basics-beyond-basics-parameters/index.md","slug":"bicep-basics-beyond-basics-parameters","title":"Bicep Language - Beyond Basics - Parameters","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-parameters/"},{"date":"2021-04-12","excerpt":" This part of the series will take you beyond Bicep language basics by showing you how to add variables to your Bicep files. If you have worked on ARM JSON templates, you know that variables exist there as well. The primary intention of using variables in either ARM JSON templates or Bicep language is to bring in a balance between free-form vs fixed configurations.\n","markdown_url":"/blog/bicep-basics-beyond-basics-variables/index.md","slug":"bicep-basics-beyond-basics-variables","title":"Bicep Language - Beyond Basics - Variables","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-variables/"},{"date":"2021-04-13","excerpt":" Expressions are a critical part of any programming language. For a Domain-Specific Language (DSL) such as Bicep that transpiles to ARM template JSON, expressions add a great value in reducing the complexity in authoring templates. All built-in functions available within ARM JSON template language are available within Bicep as well. Using these functions and the supported language constructs, you can create some powerful expressions in Bicep that significantly reduces the complexity compared to JSON templates. In this article, you will learn about writing a few different ways of writing expressions.\n","markdown_url":"/blog/bicep-basics-beyond-basics-expressions/index.md","slug":"bicep-basics-beyond-basics-expressions","title":"Bicep Language - Beyond Basics - Expressions","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-expressions/"},{"date":"2021-04-14","excerpt":" When working ARM templates, you may have come across a situation where you want to provision multiple instances of a resource with similar configuration. For example, multiple storage accounts or virtual machines or multiple data disks attached to a virtual machine. In the JSON template language, the copy element is used for this purpose. Bicep language has a few different ways you can achieve this at different levels like resources, resource properties, and outputs. Variable iterations are not available yet and mostly coming as a part of 0.4 release which is due by May 25th 2021.\n","markdown_url":"/blog/bicep-basics-beyond-basics-iterations/index.md","slug":"bicep-basics-beyond-basics-iterations","title":"Bicep Language - Beyond Basics - Iterations","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-iterations/"},{"date":"2021-04-15","excerpt":" You use outputs in ARM JSON templates to return value(s) from the deployment. Returning output from a template is not mandatory, but it is useful in scenarios such as deploying templates through a CI/CD pipeline or creating templates as reusable modules. To support this, Bicep language has an outputs element.\nOutput Syntax for adding an output element to Bicep is:\n","markdown_url":"/blog/bicep-basics-beyond-basics-output/index.md","slug":"bicep-basics-beyond-basics-output","title":"Bicep Language - Beyond Basics - Output","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-output/"},{"date":"2021-04-16","excerpt":" Reusability and repeatability are two basics requirements when you want to implement Infrastructure as Code (IaC) practices. You looked at how parameters can be added to Bicep files to make those programs reusable. This is the first step towards modularizing your programs. With the ARM JSON templates, you might have used linked templates that are meant to provide similar functionality. Bicep has support for modularity and helps simplify complex configurations into smaller reusable modules.\n","markdown_url":"/blog/bicep-basics-beyond-basics-modules/index.md","slug":"bicep-basics-beyond-basics-modules","title":"Bicep Language - Beyond Basics - Modules","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-modules/"},{"date":"2021-04-16","excerpt":"Today I had the opportunity to present live (virtually) at the Global Azure Bootcamp 2021. My session was around Azure Bicep. I really enjoyed preparing for and delivering this session.\nIf you follow me on Twitter or this blog, you know I\u0026rsquo;ve started a new series of articles on Azure Bicep. These articles are essentially notes from my Bicep learning sessions. There are a few more pending in the next few days, but overall, I really enjoyed learning about Bicep. This series and my session at GAB 2021 helped me share my learning with the community.\n","markdown_url":"/blog/slides-and-demo-scripts-introduction-to-azure-bicep-gab-2021/index.md","slug":"slides-and-demo-scripts-introduction-to-azure-bicep-gab-2021","title":"Slides and Demo Scripts: Global Azure Bootcamp 2021 - Azure Bicep","url":"https://ravichaganti.com/blog/slides-and-demo-scripts-introduction-to-azure-bicep-gab-2021/"},{"date":"2021-04-19","excerpt":" When you go to the Azure portal and deploy a service, you may have seen a prompt where you are asked to select an existing resource group or create a new resource group. And, a few more service deployment scenarios might ask you to select between selecting an existing or creating a new storage account.\n","markdown_url":"/blog/bicep-basics-beyond-basics-conditional-deployment/index.md","slug":"bicep-basics-beyond-basics-conditional-deployment","title":"Bicep Language - Beyond Basics - Conditional Deployment","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-conditional-deployment/"},{"date":"2021-04-20","excerpt":" When using ARM JSON templates, you can deploy to any of the four supported scopes \u0026ndash; management groups, tenants, subscriptions, and resource groups. What you can deploy using ARM JSON templates differs between these different target scopes. For example, you can create resource groups at the subscription level only. You identify the target scope for an ARM JSON template using the $schema element in the template. Each scope has a specific schema.\n","markdown_url":"/blog/bicep-basics-beyond-basics-scoped-deployment/index.md","slug":"bicep-basics-beyond-basics-scoped-deployment","title":"Bicep Language - Beyond Basics - Scoped Deployment","url":"https://ravichaganti.com/blog/bicep-basics-beyond-basics-scoped-deployment/"},{"date":"2021-05-15","excerpt":" I wrote a series of articles to introduce Bicep language fundamentals. I really enjoyed working on these articles and learnt quite a lot in that process.\nThe Bicep team released version 0.3.539 of Bicep command line as well as the VS Code extension a few hours ago and it came with a lot of goodness \u0026ndash; bug fixes as well as new shiny things! One of the first things that caught my eye was the Bicep visualizer.\n","markdown_url":"/blog/bicep-visualizer/index.md","slug":"bicep-visualizer","title":"Bicep Visualizer","url":"https://ravichaganti.com/blog/bicep-visualizer/"},{"date":"2021-05-20","excerpt":" While using the Azure CLI container image for one of my side projects, I started looking for an image that contains Bicep CLI as well. I found Mikolaj Mackowiak\u0026rsquo;s Bicep-cli image. This was what I really needed and it includes both Azure CLI and Bicep CLI. However, just as a fun side project, I wanted to publish my own image as well.\n","markdown_url":"/blog/bicep-container-image/index.md","slug":"bicep-container-image","title":"Bicep Container Image","url":"https://ravichaganti.com/blog/bicep-container-image/"},{"date":"2021-06-02","excerpt":" Bicep v0.4.1 was released yesterday. This release includes a bunch of bug fixes, more snippets, and most importantly, a linter!\nLinters bring in a variety of capabilities to a developer toolkit. These tools can help you perform static code analysis, check compliance against a style guide, find syntax errors, and flag potential optimizations in the code.\nFor a developer, linting support in an IDE is a must. With this Bicep release, Microsoft added support for linting of Bicep files in VS Code and at the command line. To realize the benefits of linting, you must upgrade Bicep CLI and the VS Code extension to v4.0.1 or later. The current set of linter rules are minimal and taken from arm-ttk test cases. Both VS Code extension and Bicep CLI check for all available rules by default and all rules are set at warning level. Based on the level of a rule, you will see errors or warnings or informational messages within the editor.\n","markdown_url":"/blog/bicep-v0-4-and-linter/index.md","slug":"bicep-v0-4-and-linter","title":"Bicep v0.4 and the linter","url":"https://ravichaganti.com/blog/bicep-v0-4-and-linter/"},{"date":"2021-06-06","excerpt":" Many are struggling to make ends meet ever since the pandemic started. Therefore, I decided that all proceeds from this book will go to charity.\nProject Bicep is undoubtedly the best thing that happened in the Azure world, and I have been following the development and using Bicep quite often. I published a series of articles on this blog around Bicep. However, there is always more. This series gave me an idea about a complete book on Bicep. And, today, I am announcing this new book project - Azure Bicep - Zero to Hero. This book is still a work in progress and 30% complete. I will be spending a few more weekends completing the rest of the chapters. You can read it as I complete and provide your feedback. Since this is a self-published book, all updates to the book will be free forever.\n","markdown_url":"/blog/book-announcing-azure-bicep-zero-to-hero/index.md","slug":"book-announcing-azure-bicep-zero-to-hero","title":"[Book] - Annoucing Azure Bicep - Zero to Hero","url":"https://ravichaganti.com/blog/book-announcing-azure-bicep-zero-to-hero/"},{"date":"2022-03-20","excerpt":"Visual Studio Code development containers are magic! With the help of VS Code Remote - Containers extension and Docker Desktop, you can run a full-featured development environment within a container.\n","markdown_url":"/blog/bicep-feature-in-vscode-devcontainer/index.md","slug":"bicep-feature-in-vscode-devcontainer","title":"Azure Bicep as a feature in VS Code development containers","url":"https://ravichaganti.com/blog/bicep-feature-in-vscode-devcontainer/"},{"date":"2022-04-19","excerpt":"Starting with Bicep version 0.5.6, Microsoft added support for consuming from a public module repository hosted on Microsoft Container Registry (MCR). To consume a module from Microsoft’s pubic registry, you need to use the following syntax.\n1 module \u0026lt;module-id\u0026gt; \u0026#39;br/public:\u0026lt;module-group\u0026gt;/\u0026lt;module-name\u0026gt;:\u0026lt;version\u0026gt;\u0026#39; = { ... } br/public indicates that you want to consume the module hosted on MCR. Here is an example of creating a Azure virtual network using the virtual-network module. The version tag is mandatory.\n","markdown_url":"/blog/working-with-azure-bicep-public-modules-registry/index.md","slug":"working-with-azure-bicep-public-modules-registry","title":"Working with Azure Bicep Public modules registry","url":"https://ravichaganti.com/blog/working-with-azure-bicep-public-modules-registry/"},{"date":"2022-07-09","excerpt":"Finally! I published the final chapter in my book Azure Bicep - Zero to Hero today. I started this project more than a year ago with an intention that I will complete it before end of year 2021. However, a few personal life events made me shift focus to my family and that pushed the book timelines to the right. In the last few weeks, I spent good amount of my personal time to explore a few new areas within Bicep and formed the content for the last few chapters.\n","markdown_url":"/blog/2022-07-09-azure-bicep-zero-to-hero-s-complete/index.md","slug":"2022-07-09-azure-bicep-zero-to-hero-s-complete","title":"[Book] Azure Bicep - Zero to Hero is complete","url":"https://ravichaganti.com/blog/2022-07-09-azure-bicep-zero-to-hero-s-complete/"},{"date":"2022-07-09","excerpt":"One of the very important aspects of Infrastructure as Code (IaC) is automation. And, it is not just about the configuration tasks that we must automate but it is also the entire validation and deployment / delivery workflow itself. We call this a continuous integration (CI) and continuous delivery / deployment (CD) pipeline. The core idea of a CI/CD pipeline is to accelerate testing and uncover any bugs and fix those bugs before the code reaches production. There are many ways and tools to implement a CI/CD pipeline. We can use GitHub actions or Jenkins or AppVeyor to name just a few. But, as a starting point, I prefer building a local CI/CD pipeline using git hooks. In this article, I will show you how I built a simple test and deploy pipeline for my Azure Bicep experiments.\n","markdown_url":"/blog/2022-07-09-local-ci-cd-for-your-bicep-templates/index.md","slug":"2022-07-09-local-ci-cd-for-your-bicep-templates","title":"Local CI/CD for your Bicep templates","url":"https://ravichaganti.com/blog/2022-07-09-local-ci-cd-for-your-bicep-templates/"},{"date":"2022-11-26","excerpt":"In an earlier article, I wrote about provisioning a virtual Kubernetes cluster with kubeadm](https://ravichaganti.com/blog/2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/). I use this method on a laptop with limited resources. This is good to a large extent but not good enough when I want to scale my experiments and learning. This is where I began planning my Kubernetes lab on Azure. I needed something I could spin quickly with no manual intervention. Given my interest in the Bicep language, I naturally wrote a Bicep template to perform this deployment.\n","markdown_url":"/blog/2022-11-26-fully-automated-kubernetes-cluster-deployment-on-azure-in-under-8-minutes/index.md","slug":"2022-11-26-fully-automated-Kubernetes-cluster-deployment-on-azure-in-under-8-minutes","title":"Fully automated Kubernetes cluster deployment on Azure in under 8 minutes","url":"https://ravichaganti.com/blog/2022-11-26-fully-automated-kubernetes-cluster-deployment-on-azure-in-under-8-minutes/"},{"date":"2022-11-26","excerpt":"Kubeadm is the go to tool for Kubernetes administrators. Understand how to use this tool combined with Bicep to provision a virtualized K8s cluster.","markdown_url":"/blog/fully-automated-kubernetes-cluster-deployment-on-azure-in-under-8-minutes/index.md","slug":"","title":"Fully Automated Kubernetes Cluster Deployment on Azure in Under 8 Minutes","url":"https://ravichaganti.com/blog/fully-automated-kubernetes-cluster-deployment-on-azure-in-under-8-minutes/"},{"date":"2023-12-01","excerpt":"Bicep simplifies provisioning Azure Red Hat OpenShift clusters. This article explains how!","markdown_url":"/blog/using-bicep-to-provision-azure-red-hat-openshift-cluster/index.md","slug":"","title":"Using Bicep to provision Azure Red Hat OpenShift cluster","url":"https://ravichaganti.com/blog/using-bicep-to-provision-azure-red-hat-openshift-cluster/"}],"count":24,"name":"Azure Bicep","slug":"azure-bicep","url":"https://ravichaganti.com/series/azure-bicep/"},{"articles":[{"date":"2021-03-19","excerpt":"Whenever I have to build a new development machine or VM, I usually go about installing a few development tools and command line tools that I use quite often. One such tool is the Azure CLI.\nThere are many alternatives for installing Azure CLI as a part of build process but what I use is this PowerShell script.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [CmdletBinding()] param ( ) $InformationPreference = \u0026#39;Continue\u0026#39; # Verify that the script is running as administrator if ([bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match \u0026#39;S-1-5-32-544\u0026#39;)) { # Download Azure CLI MSI package $uri = \u0026#39;https://aka.ms/installazurecliwindows\u0026#39; $request = Invoke-WebRequest -UseBasicParsing -Uri $uri -MaximumRedirection 0 -ErrorAction Ignore if(($request.StatusCode -ge 300) -and ($request.StatusCode -lt 400)) { $location = $request.Headers.Location $fileName = Split-Path -Path $location -Leaf $cliVersion = $fileName.Split(\u0026#39;-\u0026#39;)[2].trim(\u0026#39;.msi\u0026#39;) $downloadPath = \u0026#34;${env:Temp}\\$fileName\u0026#34; Write-Information -Message (\u0026#34;Downloading Azure CLI version {0} to {1}\u0026#34; -f $cliVersion, $downloadPath) Invoke-WebRequest -UseBasicParsing -Uri $location -OutFile $downloadPath -ErrorAction SilentlyContinue -Verbose:$false if (Test-Path -Path $downloadPath) { Write-Information -Message (\u0026#34;Installing Azure CLI version {0} from {1}\u0026#34; -f $cliVersion, $downloadPath) #Start-Process -FilePath msiexec.exe -ArgumentList \u0026#34;/i $downloadPath /qb /passive\u0026#34; -Wait -ErrorAction Stop -Verbose:$false Write-Information -Message (\u0026#34;Remove Azure CLI installer file from {0}\u0026#34; -f $downloadPath) Remove-Item -Path $downloadPath -Force } } else { throw \u0026#39;Cloud not retrieve the redirected URL\u0026#39; } } else { throw \u0026#39;This must run as administrator at an elevated PowerShell prompt.\u0026#39; } This script downloads the most recent public build and installs it.\n","markdown_url":"/blog/powershell-script-to-download-and-install-azure-cli/index.md","slug":"powerShell-script-to-download-and-install-azure-cli","title":"PowerShell script to download and install Azure CLI","url":"https://ravichaganti.com/blog/powershell-script-to-download-and-install-azure-cli/"}],"count":1,"name":"Azure CLI","slug":"azure-cli","url":"https://ravichaganti.com/series/azure-cli/"},{"articles":[{"date":"2023-07-13","excerpt":"Microsoft Azure provides vast services from basic computing to AI/ML. Azure Resource Manager (ARM) is our entry point to access and manage these services and provides a consistent management layer (APIs) that enables you to work with resources in Azure.\n","markdown_url":"/blog/2023-07-13-getting-started-with-azure-sdk-for-go/index.md","slug":"2023-07-13-getting-started-with-azure-sdk-for-go","title":"Getting Started with Azure SDK for Go","url":"https://ravichaganti.com/blog/2023-07-13-getting-started-with-azure-sdk-for-go/"},{"date":"2023-07-15","excerpt":"The earlier article introduced you to the Azure SDK for Go. In the example towards the end of that article, you may have noticed how the NewAzureCLICredential method of the azidentity package was used to access locally available Azure CLI credentials. This is perfect for local development and is not recommended for production environments. The Azure SDK supports different types of credentials depending on where your Go code is running. In this article in the Azure SDK for Go series, you will learn about each of these credential types and when you use each of these credentials.\n","markdown_url":"/blog/azure-sdk-for-go-authentication-methods-for-local-dev-environment/index.md","slug":"azure-sdk-for-go-authentication-methods-for-local-dev-environment","title":"Azure SDK for Go - Authentication methods for local development environment","url":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-for-local-dev-environment/"},{"date":"2023-07-18","excerpt":"In the last part of this series, you learned how to use different credential types in a local development environment. Another method you can use within local development and in a hosted/deployed service is providing credentials through environment variables. This is done using the NewEnvironmentCredential() method in the azidentity package.\n1 2 3 4 5 // github.com/rchaganti/azure-go/02-auth101/envCredential.go cred, err := azidentity.NewEnvironmentCredential(nil) if err != nil { log.Fatal(err) } This credential type supports multiple types of authentication in the following order.\n","markdown_url":"/blog/azure-sdk-for-go-authentication-methods-environmental-credential/index.md","slug":"azure-sdk-for-go-authentication-methods-environmental-credential","title":"Azure SDK for Go - Authentication methods - Environmental credential","url":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-environmental-credential/"},{"date":"2023-08-08","excerpt":"When you have applications or services that run in the Azure cloud infrastructure and require access to Azure services, the best way to authenticate to Azure is to use the managed identity. Using managed identity, you can eliminate the need to manage artifacts such as secrets, certificates, and credentials. For example, if you need to access Azure Key Vault to retrieve an API key for authentication purposes. To do this, you must first authenticate to the Key Vault service. With managed identity, you get automatically authenticated.\n","markdown_url":"/blog/azure-sdk-for-go-authentication-methods-managed-identity-credential/index.md","slug":"azure-sdk-for-go-authentication-methods-managed-identity-credential","title":"Azure SDK for Go - Authentication methods - Managed Identity Credential","url":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-managed-identity-credential/"},{"date":"2023-08-16","excerpt":"So far in this series, you learned how to use different types of credentials that the Azure SDK for Go offers. You used specific credential types to authenticate with Azure in all the examples. You use a set of credential types for the development environment and a different set for production use cases. However, what if you want to use the code unmodified between development and production? What if you must test the code that uses managed identity credentials locally where the type of credentials you must use are different? This is where credential chaining comes to the rescue.\n","markdown_url":"/blog/azure-sdk-for-go-authentication-methods-chained-credentials/index.md","slug":"azure-sdk-for-go-authentication-methods-chained-credentials","title":"Azure SDK for Go - Authentication methods - Chained Credentials","url":"https://ravichaganti.com/blog/azure-sdk-for-go-authentication-methods-chained-credentials/"}],"count":5,"name":"Azure Go","slug":"azure-go","url":"https://ravichaganti.com/series/azure-go/"},{"articles":[{"date":"2024-08-01","excerpt":"Generative AI and OpenAI should not be alien anymore. Several startups are already riding this new wave and creating stunning applications that solve several important use cases. I use GenAI regularly to learn and become more efficient in coding. GitHub Copilot has been a good friend. I experimented with creating Large Language Model (LLM) applications using different providers (OpenAI and Google Gemini) and in different programming languages. OpenAI provides client libraries that can be used with any provider that offers an OpenAI-compatible API. For example, we can use the OpenAI Python library to work with OpenAI and Azure OpenAI services.\n","markdown_url":"/blog/getting-started-with-azure-openai/index.md","slug":"getting-started-with-azure-openai","title":"Getting started with Azure OpenAI","url":"https://ravichaganti.com/blog/getting-started-with-azure-openai/"},{"date":"2024-08-04","excerpt":"Responses are streamed to the user interface as they are generated using ChatGPT and similar tools. This eliminates the need for the user to wait until the complete response is generated. In today\u0026rsquo;s article, we shall look at streaming LLM-generated responses when using Azure OpenAI API in Python. In the earlier part of this series, we learned about the client.completions.create() function used to send a prompt to the LLM and retrieve one or more responses. This function supports a parameter called stream when set to True, asks LLM to stream the response as it gets generated. The way to handle this response is a bit different from a standard completion response.\n","markdown_url":"/blog/streaming-completions-azure-openai/index.md","slug":"streaming-completions-azure-openai","title":"Streaming model responses when using Azure OpenAI","url":"https://ravichaganti.com/blog/streaming-completions-azure-openai/"},{"date":"2024-08-08","excerpt":"So far in this series, we have looked at the Azure OpenAI completion API, which generates a response for a given prompt. This is a legacy API, and using the chat completion API is recommended. We can build conversational chatbots and similar applications with the chat completion API. This article will examine how to use the Azure OpenAI chat completion API. In the earlier articles, we used the client.completions.create() function to generate a response. We need to use the client.chat.completions.create() in the openai library to build a conversation with the LLM.\n","markdown_url":"/blog/using-chat-completion-api-azure-openai/index.md","slug":"using-chat-completion-api-azure-openai","title":"Using chat completion API in Azure OpenAI","url":"https://ravichaganti.com/blog/using-chat-completion-api-azure-openai/"},{"date":"2024-08-12","excerpt":"In the last article of this series, we learned how to use the chat completion API. Towards the end, we learned that the LLMs have a knowledge cut-off date and no real-time access to information. However, this can be bridged using the tool/function calling feature of Azure OpenAI service. In this article, we shall learn how to implement tool calling.\nAzure OpenAI\u0026rsquo;s function calling capability lets you connect your language models to external tools and APIs, enabling them to perform a wider range of tasks and access real-time information. This opens up a world of possibilities, allowing your models to interact with the real world in ways never imagined.\n","markdown_url":"/blog/azure-openai-function-calling/index.md","slug":"azure-openai-function-calling","title":"Implementing tool/function calling when using Azure OpenAI","url":"https://ravichaganti.com/blog/azure-openai-function-calling/"},{"date":"2024-08-16","excerpt":"In the last article of this series, we learned about function/tool calling. Based on the prompt, the LLM indicates that we must call the get_weather tool. The LLM finally returns the answer to our prompt using the tool response. However, let us try to add a few more variables to our prompt. The updated prompt will be \u0026ldquo;What\u0026rsquo;s the weather like in Bengaluru next week?\u0026rdquo;.\n1 2 3 $ python .\\05_function_calling.py get_current_time called with location: Bengaluru The current temperature in Bengaluru is approximately 28.2°C. However, for next week\u0026#39;s weather prediction, you\u0026#39;d need a forecast service as I currently provide only current weather information. LLM uses the get_weather tool to determine the current weather but fails to determine next week\u0026rsquo;s weather. This is because we have not provided any tool for the LLM to determine what next week means. Determining the meaning of next week requires the knowledge of the current date and time. This article will demonstrate how to add multiple tool-calling capabilities to our program. With the updated script, you can receive the weather information for a specific date.\n","markdown_url":"/blog/azure-openai-function-calling-with-multiple-tools/index.md","slug":"azure-openai-function-calling-with-multiple-tools","title":"Implementing multiple tool/function calling when using Azure OpenAI","url":"https://ravichaganti.com/blog/azure-openai-function-calling-with-multiple-tools/"},{"date":"2024-08-18","excerpt":"In this series, we have examined the basics of Azure Open AI, using the chat completions API, streaming responses, and finally, single and multi-tool calling. In today\u0026rsquo;s article, we will examine how to return structured output from the LLM response. We will first examine structured output without function calling and then update the earlier multi-function calling example to output JSON instead of text.\nStructured outputs tell an LLM to follow the schema represented by the response_format parameter of a request to the LLM. We can use Pydantic to build the schema.\n","markdown_url":"/blog/structured-output-azure-openai/index.md","slug":"structured-output-azure-openai","title":"Structured output in Azure OpenAI","url":"https://ravichaganti.com/blog/structured-output-azure-openai/"},{"date":"2024-08-20","excerpt":"We have learned to perform single- and multi-tool calling with the Azure OpenAI API for chat completions. This part of the series on Azure OpenAI will describe the parallel tool calling feature and how to implement it. Parallel tool calling allows you to perform multiple calls together. This enables parallel execution, result retrieval, and fewer calls to the LLM. Parallelizing tool calls improves overall performance.\nIn a previous example on retrieving weather at a given location, we examined how to iterate over the LLM response for tool calls and append it to the conversation history before making the next LLM API call.\n","markdown_url":"/blog/parallel-tool-calling-azure-openai/index.md","slug":"parallel-tool-calling-azure-openai","title":"Parallel tool calling in Azure OpenAI","url":"https://ravichaganti.com/blog/parallel-tool-calling-azure-openai/"},{"date":"2025-01-10","excerpt":"Sometimes, you may want the LLM to perform only minimal changes to what is provided as a prompt. For example, you have a couple of paragraphs of text that you want the LLM to modify to ensure no spelling mistakes. You do not want the LLM to change the overall content, but make sure the misspellings are corrected. This usually helps in reducing the LLM response latency. This is useful in scenarios where you already know a large portion of the expected response and is well-suited for code completion and error detection scenarios. In this part of the series of articles on Azure OpenAI, we will use predicted outputs with Azure OpenAI to build AI applications.\n","markdown_url":"/blog/predicted-outputs-azure-openai/index.md","slug":"predicted-outputs-azure-openai","title":"Predicted outputs in Azure OpenAI","url":"https://ravichaganti.com/blog/predicted-outputs-azure-openai/"}],"count":8,"name":"Azure OpenAI","slug":"azure-openai","url":"https://ravichaganti.com/series/azure-openai/"},{"articles":[{"date":"2021-01-06","excerpt":"As your Azure adoption increases and as you on-board various departments and groups within your organization to start using Azure services, it is important that you put in place some level of governance. As cloud architect, you would want control over who can create what type resources, where can they create those resources and how many. You would also want to standardize on the deployments so that the configuration of resources is in compliance with your organization standards. Among many other aspects like this you would want the ability to track your cloud cost more granularly for every service deployed in the cloud and for every business unit or group within your organization. To address this and to implement efficient governance Azure offers features and services such as Policies, Management Groups, Resource Graph, and Blueprints. Here is an excellent depiction of Azure governance architecture from the partner blog.\n","markdown_url":"/blog/azure-policy-guest-configuration-introduction/index.md","slug":"azure-policy-guest-configuration-introduction","title":"Azure Policy Guest Configuration - Introduction","url":"https://ravichaganti.com/blog/azure-policy-guest-configuration-introduction/"},{"date":"2021-08-01","excerpt":"In the last part of this series around Azure Policy Guest Configuration, you got an introduction to what is Guest Configuration. In this part, you will learn about assigning Guest Configuration policies and initiatives.\nAzure Policy Guest Configuration (GC) is an extension to Azure Policy and therefore use the same JSON definition structure. For example, here is the (redacted) GC definition for the policy Audit Windows machines that do not have the specified Windows PowerShell execution policy.\n","markdown_url":"/blog/azure-policy-guest-configuration-assignments/index.md","slug":"azure-policy-guest-configuration-assignments","title":"Azure Policy Guest Configuration - Assignments","url":"https://ravichaganti.com/blog/azure-policy-guest-configuration-assignments/"}],"count":2,"name":"Azure Policy Guest Configuration","slug":"azure-policy-guest-configuration","url":"https://ravichaganti.com/series/azure-policy-guest-configuration/"},{"articles":[{"date":"2020-07-16","excerpt":"A while ago, I had written a series of articles introducing and diving deep into authoring Azure Resource Manager (ARM) templates. A few things have changed in authoring ARM templates and new features got added in the recent past. I thought it is probably a better time to revisit and do it all over again. At the same time, I thought why just limit to just authoring ARM templates. Over the years, I made notes around ARM and learned quite a bit. Starting today, I will share those notes with you here.\n","markdown_url":"/blog/azure-resource-manager-introduction/index.md","slug":"azure-resource-manager-introduction","title":"Azure Resource Manager - Introduction","url":"https://ravichaganti.com/blog/azure-resource-manager-introduction/"},{"date":"2020-07-17","excerpt":"The first part of this series of articles on Azure Resource Manager (ARM) provided a quick overview of ARM. You looked a quick introduction to ARM templates as well and looked at an overview of different template deployment methods. In this part of the series, we will look at different methods to author ARM templates and an in-depth look at preferred deployment methods. You can choose any of the methods mentioned here but this series of articles will use one preferred method each for authoring and deploying templates. You will read more about those methods and the reasons behind that choice as well.\n","markdown_url":"/blog/azure-resource-manager-tools-for-arm-template-design-authoring-and-deployment/index.md","slug":"azure-resource-manager-tools-for-arm-template-design-authoring-and-deployment","title":"Azure Resource Manager - Tools for ARM template design, authoring, and deployment","url":"https://ravichaganti.com/blog/azure-resource-manager-tools-for-arm-template-design-authoring-and-deployment/"},{"date":"2020-07-23","excerpt":"In the last two parts of the series, you have seen a brief introduction to Azure Resource Manager and the services that complement ARM to extend its functionality or support the services offered by ARM. You also looked at an overview of ARM templates and the tools available to design, author, and deploy these templates.\nStarting this part of the series for the next few days, you will start learning about authoring ARM templates right from the basics and to the advanced template syntax and techniques with a goal to build an ARM template that helps provision the following architecture.\n","markdown_url":"/blog/azure-resource-manager-arm-template-basics/index.md","slug":"azure-resource-manager-arm-template-basics","title":"Azure Resource Manager - ARM template basics","url":"https://ravichaganti.com/blog/azure-resource-manager-arm-template-basics/"},{"date":"2020-07-24","excerpt":" In the last part of this series, you learned the template syntax and authored an ARM template that provisions the resource group needed for the above architecture. This deployment was performed at the subscription level using Azure CLI. In this part, you will create another template for performing additional resource \u0026ndash; storage account and virtual network \u0026ndash; provisioning at the resource group level. You will, then, parameterize this template to understand how to add parameters to ARM templates.\n","markdown_url":"/blog/azure-resource-manager-adding-parameters-to-arm-templates/index.md","slug":"azure-resource-manager-adding-parameters-to-arm-templates","title":"Azure Resource Manager - Adding parameters to ARM templates","url":"https://ravichaganti.com/blog/azure-resource-manager-adding-parameters-to-arm-templates/"},{"date":"2020-07-30","excerpt":" So far in this series, you learned how to use VS Code and ARM Tools extension to get started with the ARM template development, how to perform a subscription scoped deployment to create a resource group and then looked at resource group scoped deployment to create a storage account and a virtual network resources. You learned about parameterizing the ARM template so that it becomes reusable. Equipped with that knowledge, you can now start digging into expressions and variables in the ARM templates.\n","markdown_url":"/blog/azure-resource-manager-in-30-days-using-expressions-and-variables-in-arm-templates/index.md","slug":"azure-resource-manager-in-30-days-using-expressions-and-variables-in-arm-templates","title":"Azure Resource Manager - Using expressions and variables in ARM templates","url":"https://ravichaganti.com/blog/azure-resource-manager-in-30-days-using-expressions-and-variables-in-arm-templates/"},{"date":"2020-07-31","excerpt":" Expressions in ARM template language are a way to reduce complexity in the templates. Using parameters and variables in ARM templates always requires the use of expressions. Parameter and variable values are combined with standard (built-in) template functions (STF) to create complex expressions to implement the business requirements and implement known configurations. Updated ARM template syntax introduced the ability to implement user-defined functions for complicated expressions and use repeatedly in your templates. In this part, you will learn more about standard template functions and learn how to implement user-defined functions.\n","markdown_url":"/blog/azure-resource-manager-using-functions-in-arm-templates/index.md","slug":"azure-resource-manager-using-functions-in-arm-templates","title":"Azure Resource Manager - Using functions in ARM templates","url":"https://ravichaganti.com/blog/azure-resource-manager-using-functions-in-arm-templates/"},{"date":"2020-08-07","excerpt":" In this series so far, you have seen how to get started with ARM templates, parameterize them by adding parameters, and optimize them using variables, expressions, and user-defined functions. It is now time to move on to more advanced topics and begin building the template for the remaining components of the architecture shown above. In the architecture shown above, you will implement an ARM template that provisions virtual machines, requiring the administrator and domain-join credentials as inputs. Also, the configuration scripts used to configure the guest OS may need to access an internal storage account blob, which requires the storage connection strings and access keys. Storing these secrets in plain text is not recommended. Also, as an architect, you may want to standardize on passwords for local administrator accounts and avoid sharing domain-join credentials with any user when provisioning an ARM template. This needs a more centralized credential and secret store. Azure Vault provides this capability. Today, you will learn how to handle secrets such as passwords, access keys, certificates, and more in an ARM template.\n","markdown_url":"/blog/azure-resource-manager-using-secrets-in-arm-templates/index.md","slug":"azure-resource-manager-using-secrets-in-arm-templates","title":"Azure Resource Manager - Using secrets in ARM templates","url":"https://ravichaganti.com/blog/azure-resource-manager-using-secrets-in-arm-templates/"}],"count":7,"name":"Azure Resource Manager in 30 Days","slug":"azure-resource-manager-in-30-days","url":"https://ravichaganti.com/series/azure-resource-manager-in-30-days/"},{"articles":[{"date":"2022-10-18","excerpt":"Containers have been around for a while. There is no need for an introduction to containers anymore but If you are still looking for some background, you can read a series of articles I have written on this blog. Docker simplified working with containers by introducing a way to package your applications and application dependencies as container images. It also provided the tooling that made running container instances from these images easy. This meant the user space tools abstracted all complex details and removed the need to know the inner workings of containers. Like every other technology, knowing the internals of how something is built becomes important when troubleshooting issues or optimizing what the technology does. And, of course, knowing / learning internals is fun too!\n","markdown_url":"/blog/2022-10-18-understanding-container-images-the-fundamentals/index.md","slug":"2022-10-18-understanding-container-images-the-fundamentals","title":"Understanding container images - The fundamentals","url":"https://ravichaganti.com/blog/2022-10-18-understanding-container-images-the-fundamentals/"},{"date":"2022-10-28","excerpt":"In the previous article, we looked at how OverlayFS is used to work with container images. We learned how the image layers are associated with each other and how the copy-on-write layer gets created when a containers gets created from an image. Container registries such as Docker Hub and Quay offer container images for several popular applications and you can publish your images as well. There are different tools available to build and push images to container registries. Whatever container engine you use \u0026ndash; Docker or Podman \u0026ndash; you can simply pull the image [built using any tool] from the registry and use it. How is this interoperability made possible? The answer is the work Open Container Initiative (OCI) is doing.\n","markdown_url":"/blog/2022-10-28-understanding-container-images-oci-image-specification/index.md","slug":"2022-10-28-understanding-container-images-oci-image-specification","title":"Understanding container images - OCI image specification","url":"https://ravichaganti.com/blog/2022-10-28-understanding-container-images-oci-image-specification/"},{"date":"2022-10-29","excerpt":"In the previous articles in this series, we looked at how to build container images and understand the OCI image specification that governs how the images are built and dealt with. Once the images are built, we may want to push them to a central repository for sharing with a larger community or a private container registry such as the Azure Container Registry (ACR).\nIn today\u0026rsquo;s article, we shall learn how to create an Azure Container Registry, push an image, and consume it back in the local environment. Let\u0026rsquo;s start!\n","markdown_url":"/blog/2022-10-29-publish-container-images-to-azure-container-registry/index.md","slug":"2022-10-29-publish-container-images-to-azure-container-registry","title":"Publish container images to Azure Container Registry","url":"https://ravichaganti.com/blog/2022-10-29-publish-container-images-to-azure-container-registry/"},{"date":"2022-11-28","excerpt":"In a couple of earlier articles, we looked at Linux constructs used in building container images and the OCI image specification which standardizes the container image format. It is now time to understand how we can create container images. Knowing this is important to optimize the image size and building secure container images. And, of course, this knowledge also helps us appreciate what tools like Docker CLI or Buildah among many others help us achieve. There are many tools to build container images. We shall look at each of these methods in-depth in later parts of this series of articles on container images. For today, we will look into building container images using no tools! Actually, just using built-in OS tools.\n","markdown_url":"/blog/2022-11-28-building-container-images-using-no-tools/index.md","slug":"2022-11-28-building-container-images-using-no-tools","title":"Building container images - using no tools","url":"https://ravichaganti.com/blog/2022-11-28-building-container-images-using-no-tools/"}],"count":4,"name":"Container Images","slug":"container-images","url":"https://ravichaganti.com/series/container-images/"},{"articles":[{"date":"2015-01-20","excerpt":"Containers? No, not the shipping containers but the much-hyped container technology in the computer industry. I am sure even if you have not used any of the existing container technologies, you must have at least read or heard about them.\nI am not the first one to write about containers and this is certainly not an in-depth overview of container technologies. I will eventually get there and show you how you can deploy different container technologies. This series of articles is about my own thoughts and a documentation for my own reference. In the process, I wish to help my readers as well.\n","markdown_url":"/blog/containers-what-are-they-why-do-you-need-one-part-1/index.md","slug":"containers-what-are-they-why-do-you-need-one-part-1","title":"Containers – What are they? Why do you need one? – Part 1","url":"https://ravichaganti.com/blog/containers-what-are-they-why-do-you-need-one-part-1/"},{"date":"2015-02-06","excerpt":"In the earlier article, I explained the hurdles in the traditional and virtualized ways of implementing workloads. Also, we looked how the DevOps challenges are demanding changes the continuous delivery and integration processes. Towards the end, I’d mentioned that Containers are an answer.\nIn today’s article, we will see what are containers and some history behind containerization. Let us get started. In the subsequent parts, we will dig into each building block used within container technologies and understand how to use them.\n","markdown_url":"/blog/containers-what-are-they-and-their-history-part-2/index.md","slug":"containers-what-are-they-and-their-history-part-2","title":"Containers – What are they? And, their history! – Part 2","url":"https://ravichaganti.com/blog/containers-what-are-they-and-their-history-part-2/"},{"date":"2022-11-02","excerpt":"In an earlier article, we looked at different containerization options in Microsoft Azure. In today\u0026rsquo;s article, we shall start with Azure Container Instances (ACI) and learn the fundamentals. In a later article, we will learn how to perform multi-container applications to ACI.\nAzure Container Instances Azure Container Instances (ACI) service offers a quick and easy way to run containers in the Microsoft Azure cloud. It is as simple as running a container locally using the Docker engine. ACI does not provide full container orchestration. ACI is great for applications that require faster startup times and hassle-free management. ACI runs inside Azure VMs and therefore provides isolation enabled by virtualization.\n","markdown_url":"/blog/2022-11-02-understanding-and-using-azure-container-instances-service-the-basics/index.md","slug":"2022-11-02-understanding-and-using-azure-container-instances-service-the-basics","title":"Understanding and using Azure Container Instances service - The Basics","url":"https://ravichaganti.com/blog/2022-11-02-understanding-and-using-azure-container-instances-service-the-basics/"},{"date":"2022-11-03","excerpt":"In the previous article, we looked at getting started with Azure Container Instances service, learned some basic concepts of ACI, and saw an example of provisioning a hello-world application. In this article, we shall extend this knowledge by provisioning a multi-container application to ACI using Bicep templates. You can also use a YAML method of provisioning multi-container applications to ACI. We shall look at this later.\nAs we learned earlier, a container group resembles a Kubernetes pod. The containers within the group share resources such as network and storage. The resource usage of containers can be controlled at the container group level. As a general rule of thumb, we should group containers with similar lifecycle and resource requirements into a container group. The multi-container groups are available for Linux containers only at the moment. Based on the region, there will be additional restrictions in terms of resource allocation.\n","markdown_url":"/blog/2022-11-03-understanding-and-using-azure-container-instances-service-multi-container-apps-using-bicep/index.md","slug":"2022-11-03-understanding-and-using-azure-container-instances-service-multi-container-apps-using-bicep","title":"Understanding and using Azure Container Instances service - Multi-container Applications using Bicep","url":"https://ravichaganti.com/blog/2022-11-03-understanding-and-using-azure-container-instances-service-multi-container-apps-using-bicep/"},{"date":"2024-02-03","excerpt":"Development containers are a great way to develop modern applications. Cloud-native applications usually implement more than one service to provide the application functionality. Using dev containers for microservices-based application development requires more than one container. This is where using Docker Compose with dev containers is useful. This article explores creating a multi-container development environment using VS Code dev containers and Docker Compose.","markdown_url":"/blog/devcontainers-for-cloud-native-application-development/index.md","slug":"","title":"Devcontainers for cloud-native application development","url":"https://ravichaganti.com/blog/devcontainers-for-cloud-native-application-development/"}],"count":5,"name":"Containers","slug":"containers","url":"https://ravichaganti.com/series/containers/"},{"articles":[{"date":"2025-10-16","excerpt":"Docker cagent is an open-source, multi-agent AI runtime that lets you build, orchestrate, and share teams of specialized AI agents — all defined declaratively in YAML.","markdown_url":"/blog/docker-cagent-an-introduction/index.md","slug":"","title":"Docker cagent - An introduction","url":"https://ravichaganti.com/blog/docker-cagent-an-introduction/"}],"count":1,"name":"Docker Cagent","slug":"docker-cagent","url":"https://ravichaganti.com/series/docker-cagent/"},{"articles":[{"date":"2020-08-03","excerpt":" Go programming language isn\u0026rsquo;t new. It existed for more than 13 years now. The idea of Go language was first conceived in 2007 at Google by Ken Thompson, Robert Griesemer, and Rob Pike. Go was developed in response to some of the challenges the development teams at Google were facing internally. Some of these issues included ridiculously longer build times, baggage that legacy languages imposed on modern infrastructure / systems development, and uncontrolled dependencies among many other pain points. Go was designed to make it easy and efficient to program modern multicore systems, web service backends, and command line tools. The design considerations such as rigorous dependency management and efficiency at scale make Go one of the best modern programming languages.\n","markdown_url":"/blog/get-set-go-introduction-to-go-lang/index.md","slug":"get-set-go-introduction-to-go-lang","title":"Get set Go - Introduction to Go language","url":"https://ravichaganti.com/blog/get-set-go-introduction-to-go-lang/"},{"date":"2020-08-04","excerpt":" With the background provided in the introduction part of this series, you must now be equipped with the necessary tools for the job \u0026ndash; learning Go! So, in this part, you will write your first program in Go language. You will not only learn about the very minimal structure needed for a Go program but you will also learn about organizing your Go programs and why it matters. Get set Go!\n","markdown_url":"/blog/get-set-go-first-program/index.md","slug":"get-set-go-first-program","title":"Get set Go - First program","url":"https://ravichaganti.com/blog/get-set-go-first-program/"},{"date":"2020-08-11","excerpt":" In the last part of this series, you looked at writing your first program and understood the program structure and understood the keywords such as package, import, and func. It was a good start. In this part, you will learn how to declare and use variables in Go programs.\nNaming convention in Go Before you start looking at variables in Golang, you must first understand some rules for naming different program entities \u0026ndash; variables, types, statements, packages, and constants \u0026ndash; in Go.\n","markdown_url":"/blog/get-set-go-variables-in-go-language/index.md","slug":"get-set-go-variables-in-go-language","title":"Get set Go - Variables in Go language","url":"https://ravichaganti.com/blog/get-set-go-variables-in-go-language/"},{"date":"2020-08-13","excerpt":"After looking at variables in the previous part of this series, you have a fair understanding of using different types of variable declarations and using the variable values in your program. Each of these variables you created and used have an associated type. The type of a variable dictates what that variable is allowed store. So, what are different data types in Go language? You will learn that today!\nData types in Golang Go language has several built-in data types and these types can be classified into three different categories \u0026ndash; basic data types, aggregate data types, reference types, and interface types.\n","markdown_url":"/blog/get-set-go-types-in-go-language/index.md","slug":"get-set-go-types-in-go-language","title":"Get set Go - Types in Go language","url":"https://ravichaganti.com/blog/get-set-go-types-in-go-language/"},{"date":"2020-08-31","excerpt":" In the earlier part of this series, you looked at types in Go language and learned about the basic data types \u0026ndash; int, float, and strings. You also learned about other categories of data types such as aggregate types, reference types, and interface types. In the next subsequent parts, you will dive into each of these different types.\nAggregate Types Aggregate types in Go language include arrays and structs. These data types are formed by combining basic data types. Learning structs will require knowledge of a few more things about Go language and Go types. You will learn about that soon. In today\u0026rsquo;s part, you will learn about arrays.\n","markdown_url":"/blog/get-set-go-arrays-in-go-language/index.md","slug":"get-set-go-arrays-in-go-language","title":"Get set Go - Arrays in Go language","url":"https://ravichaganti.com/blog/get-set-go-arrays-in-go-language/"},{"date":"2020-09-28","excerpt":" In the previous part of this series, you learned about arrays in Go language. As you have learned, arrays have a fixed size and therefore you cannot resize (grow or shrink) arrays. This limitation can be overcome using slices in Go language. In this part, you will learn about slices and how to use this data type in your Go programs.\n","markdown_url":"/blog/get-set-go-slices-in-go-language/index.md","slug":"get-set-go-slices-in-go-language","title":"Get set Go - Slices in Go language","url":"https://ravichaganti.com/blog/get-set-go-slices-in-go-language/"},{"date":"2020-09-29","excerpt":" In the previous part of this series, you learned about slices in Go language. Slices, unlike arrays, allow flexibility and certainly are the most used compared to arrays in Go language. Towards the end of the article on slices, you learned that slices are essentially references to an underlying array and any changes made to the slice will reflect in the underlying array as well. In this article, you shall learn about another reference type called pointers in Go language.\n","markdown_url":"/blog/get-set-go-pointers-in-go-language/index.md","slug":"get-set-go-pointers-in-go-language","title":"Get set Go - Pointers in Go language","url":"https://ravichaganti.com/blog/get-set-go-pointers-in-go-language/"},{"date":"2020-09-30","excerpt":" In the previous part of this series, you learned about pointers in Go language. In this part, you will learn about maps in Go language. Maps are another built-in data type in Go and maps store key-value pairs. This is like dictionaries in other programming languages.\nMaps First, look at the below example.\n1 2 3 4 5 6 7 8 package main import \u0026#34;fmt\u0026#34; func main() { var m1 map[string]int fmt.Println(m1) } In the above example, variable m1 is of map data type and declares an empty map. When you run this, all you will see is map[]. The zero value of map keys will be nil and therefore this will be called a nil map. Maps store key-value pairs. So, if we generalize the syntax from the above example, it will be:\n","markdown_url":"/blog/get-set-go-maps-in-go-language/index.md","slug":"get-set-go-maps-in-go-language","title":"Get set Go - Maps in Go language","url":"https://ravichaganti.com/blog/get-set-go-maps-in-go-language/"},{"date":"2020-10-01","excerpt":" So far in this series, you learned about different built-in data types such as integers, strings, floats, arrays, slices, maps, and pointers. All of these allow only one type of data. All elements in the array have to of the same time. All keys and values have to be of the same type. What if you have need to combine multiple types and create a custom type for your programs? This is where structs play a role in Go language.\n","markdown_url":"/blog/get-set-go-structs-in-go-language/index.md","slug":"get-set-go-structs-in-go-language","title":"Get set Go - Structs in Go language","url":"https://ravichaganti.com/blog/get-set-go-structs-in-go-language/"},{"date":"2020-10-05","excerpt":" With what you learned about basic data types and structs in this series so far, you are now ready to look at the branching constructs in Go language. You may have used branching constructs such as if..else if..else and switch statements in other languages. Go language too offers these constructs.\nIf .. else if .. else If construct in any programming language is a branching construct and moves the execution from one place in the code to another based on a condition. Go language is no exception.\n","markdown_url":"/blog/get-set-go-condition-statements-in-go-language/index.md","slug":"get-set-go-condition-statements-in-go-language","title":"Get set Go - Condition statements in Go language","url":"https://ravichaganti.com/blog/get-set-go-condition-statements-in-go-language/"},{"date":"2020-10-07","excerpt":" With what you learned about basic data types and structs in this series so far, you are now ready to look at the looping construct in Go language. Go language is simple and to that extent Go has just one looping construct \u0026ndash; For loop.\nFor loop A few programming languages that you may have used in the past may have more than one looping construct \u0026ndash; do - while, do - until, for, and foreach and so on. You use a specific construct based on what you need to achieve and type of conditions that need to be tested. However, Go language has just one looping construct \u0026ndash; the for loop. Although there is just one looping construct, go supports multiple variations of this construct for different use cases.\n","markdown_url":"/blog/get-set-go-loops-in-go-language/index.md","slug":"get-set-go-loops-in-go-language","title":"Get set Go - Loops in Go language","url":"https://ravichaganti.com/blog/get-set-go-loops-in-go-language/"},{"date":"2020-10-09","excerpt":" In the two previous parts of the series, you learned how to use if, switch, and for loop in Go language. You also learned about using break and continue statements in Go language to alter the control flow. What you have seen in the examples with these statements was an unlabeled way to break or continue the iteration. Go language supports labels that let you transfer control to the place in the (same function) code where the label is defined. There are different ways to use labeled statements.\n","markdown_url":"/blog/get-set-go-labels-in-go-language/index.md","slug":"get-set-go-labels-in-go-language","title":"Get set Go - Labels in Go language","url":"https://ravichaganti.com/blog/get-set-go-labels-in-go-language/"},{"date":"2020-10-12","excerpt":" Alright. In this series so far, you learned about some basics of programming in Go language, about data types, conditions, and loops. In all the examples in the earlier parts of the series, there was just the main function which is the entry point into a Go program. All execution of a Go program starts at the main function. The idea of a function in any language is to basically group together a set of instructions and these instructions can now be used repeatedly as needed. As you learned, the main function is a bit special though. Functions promote reusability and readability of your code. In this part of the series, you shall learn about functions in Go language.\n","markdown_url":"/blog/get-set-go-functions-in-go-language/index.md","slug":"get-set-go-functions-in-go-language","title":"Get set Go - Functions in Go language","url":"https://ravichaganti.com/blog/get-set-go-functions-in-go-language/"},{"date":"2020-10-21","excerpt":" In the last part of the series, you learned about functions in Go language. Functions are first-class citizens in Golang. What this means is that you can not only use function declarations as just reusable code blocks but you can also assign functions to variables, use functions as parameters on other functions, and even return functions from other functions. This is achieved using function literals which are also known as anonymous functions.\n","markdown_url":"/blog/get-set-go-anonymous-functions-in-go-language/index.md","slug":"get-set-go-anonymous-functions-in-go-language","title":"Get set Go - Anonymous Functions in Go language","url":"https://ravichaganti.com/blog/get-set-go-anonymous-functions-in-go-language/"},{"date":"2020-10-23","excerpt":" In the last two parts of this series, you looked at functions and anonymous functions. Both provide a way to create reusable blocks of code and each having its own purpose and use within Go programming. As learned earlier, Go is not a pure object oriented programming language. But, it does support some aspects of OOP. Methods in Go are one way to implement that \u0026ldquo;object-orientedness\u0026rdquo;. This is based on the concept that a type in Go language can have methods associated with it.\n","markdown_url":"/blog/get-set-go-methods-in-go-language/index.md","slug":"get-set-go-methods-in-go-language","title":"Get set Go - Methods in Go language","url":"https://ravichaganti.com/blog/get-set-go-methods-in-go-language/"}],"count":15,"name":"Get Set GO","slug":"get-set-go","url":"https://ravichaganti.com/series/get-set-go/"},{"articles":[{"date":"2026-02-15","excerpt":"GitHub Agentic Workflows let you write automation in natural language. Instead of stitching together YAML steps, shell scripts, and third-party Actions, you describe what you want an AI agent to accomplish and give it the tools to do it.","markdown_url":"/blog/github-agentic-workflows/index.md","slug":"","title":"GitHub Agentic Workflows","url":"https://ravichaganti.com/blog/github-agentic-workflows/"}],"count":1,"name":"GitHub Agentic Workflows","slug":"github-agentic-workflows","url":"https://ravichaganti.com/series/github-agentic-workflows/"},{"articles":[{"date":"2025-12-01","excerpt":"Google Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents.","markdown_url":"/blog/introduction-to-google-agent-development-kit/index.md","slug":"","title":"Introduction to Google Agent Development Kit","url":"https://ravichaganti.com/blog/introduction-to-google-agent-development-kit/"},{"date":"2025-12-03","excerpt":"Google Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. It offers different types agents.","markdown_url":"/blog/google-adk-types-of-agents/index.md","slug":"","title":"Google ADK - types of agents","url":"https://ravichaganti.com/blog/google-adk-types-of-agents/"},{"date":"2025-12-05","excerpt":"LLMs are stateless. Every API call to an LLM is independent. The model does not inherently remember what was said before. Yet meaningful conversations are inherently multi-turn, contextual, and stateful.","markdown_url":"/blog/google-adk-sessions-state-and-memory/index.md","slug":"","title":"Google ADK - Sessions, state, and memory","url":"https://ravichaganti.com/blog/google-adk-sessions-state-and-memory/"},{"date":"2025-12-12","excerpt":"Callbacks are user-defined functions that hook into an agent's execution pipeline at predefined checkpoints. They let you observe, customize, and control agent behavior without modifying the ADK framework code.","markdown_url":"/blog/google-adk-callbacks/index.md","slug":"","title":"Google ADK - Callbacks","url":"https://ravichaganti.com/blog/google-adk-callbacks/"},{"date":"2025-12-18","excerpt":"You have agents, tools, callbacks, and sessions. But what actually runs them? The Runner is the central orchestrator that powers every agent interaction in Google ADK, driving the event loop that connects all these pieces together.","markdown_url":"/blog/google-adk-runner-and-execution-architecture/index.md","slug":"","title":"Google ADK - Runner and execution architecture","url":"https://ravichaganti.com/blog/google-adk-runner-and-execution-architecture/"},{"date":"2025-12-20","excerpt":"An agent that can only use the tools you hard-code into it has a ceiling. The Model Context Protocol (MCP) shatters that ceiling by giving your ADK agents a standardized way to discover and use tools hosted anywhere — local processes, remote servers, or cloud services.","markdown_url":"/blog/google-adk-mcp-tools/index.md","slug":"","title":"Google ADK - MCP tools","url":"https://ravichaganti.com/blog/google-adk-mcp-tools/"},{"date":"2025-12-23","excerpt":"Your agent needs to talk to the outside world. It needs to call REST APIs, delegate complex work to specialized agents, authenticate with protected services, and kick off operations that take minutes instead of milliseconds. Google ADK provides four powerful patterns to make all of this possible.","markdown_url":"/blog/google-adk-openapi-tools-agents-as-tools-authentication-and-long-running-operations/index.md","slug":"","title":"Google ADK - OpenAPI tools, agents-as-tools, authentication, and long-running operations","url":"https://ravichaganti.com/blog/google-adk-openapi-tools-agents-as-tools-authentication-and-long-running-operations/"},{"date":"2026-01-26","excerpt":"Automating content creation with a team of AI agents that research, write, edit, and publish","markdown_url":"/blog/building-a-multi-agent-linkedin-newsletter-system-with-google-adk/index.md","slug":"","title":"Building a Multi-Agent LinkedIn Newsletter System with Google ADK","url":"https://ravichaganti.com/blog/building-a-multi-agent-linkedin-newsletter-system-with-google-adk/"},{"date":"2026-01-27","excerpt":"Google Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. It offers native support to interact with other agents via the agent-to-agent protocol.","markdown_url":"/blog/building-multi-agent-systems-with-google-adk-and-the-a2a-protocol/index.md","slug":"","title":"Building multi-agent systems with Google ADK and the A2A protocol","url":"https://ravichaganti.com/blog/building-multi-agent-systems-with-google-adk-and-the-a2a-protocol/"},{"date":"2026-02-28","excerpt":"Dive into a powerful new feature in Google ADK: Agent Skills. We will explore what Agent Skills are, why they matter, and how to implement a practical use case.","markdown_url":"/blog/google-adk-agent-skills/index.md","slug":"","title":"Google ADK - Agent Skills","url":"https://ravichaganti.com/blog/google-adk-agent-skills/"}],"count":10,"name":"Google ADK","slug":"google-adk","url":"https://ravichaganti.com/series/google-adk/"},{"articles":[{"date":"2026-07-25","excerpt":"Knowledge is an essential part of an agent harness!","markdown_url":"/blog/the-future-of-agentic-architectures-might-just-be-written-in-our-past/index.md","slug":"","title":"The Future of Agentic Architectures Might Just Be Written in Our Past","url":"https://ravichaganti.com/blog/the-future-of-agentic-architectures-might-just-be-written-in-our-past/"}],"count":1,"name":"Harness Engineering","slug":"harness-engineering","url":"https://ravichaganti.com/series/harness-engineering/"},{"articles":[{"date":"2022-11-13","excerpt":"This article is more like a note to myself, but this may help if you are looking at configuring a Kubernetes cluster on Ubuntu.\nThere are many ways to install and configure Kubernetes cluster for learning and development purposes. You can use Docker Desktop or Rancher Desktop or https://podman-desktop.io/ or minikube or microk8s to create a single node cluster for your development work quickly. I am a big fan of Docker Desktop and use that for any quick experiments. However, I need a multi-node cluster with additional services for anything more than simple deployment. I use Ubuntu virtual machines and configure a Kubernetes cluster using kubeadm.\n","markdown_url":"/blog/2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/index.md","slug":"2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu","title":"Installing and Configuring Kubernetes cluster using kubeadm on Ubuntu","url":"https://ravichaganti.com/blog/2022-11-13-installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/"},{"date":"2022-11-13","excerpt":"Kubeadm is a handy tool to configure Kubernetes clusters. This article explains how to create a K8s cluster using Ubuntu VMs.","markdown_url":"/blog/installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/index.md","slug":"","title":"Installing and Configuring Kubernetes Cluster using Kubeadm on Ubuntu","url":"https://ravichaganti.com/blog/installing-and-configuring-kubernetes-cluster-using-kubeadm-on-ubuntu/"}],"count":2,"name":"Kubernetes","slug":"kubernetes","url":"https://ravichaganti.com/series/kubernetes/"},{"articles":[{"date":"2025-03-09","excerpt":"Kube Resource Orchestrator (KRO) introduces a new Kubernetes-native and cloud-agnostic way to group Kubernetes resources.","markdown_url":"/blog/kube-resource-orchestrator-kro-the-basics/index.md","slug":"","title":"Kube Resource Orchestrator (KRO) - The Basics","url":"https://ravichaganti.com/blog/kube-resource-orchestrator-kro-the-basics/"},{"date":"2025-03-14","excerpt":"Extending what you learned in the previous article on the basics of kro, this article demonstrates a few more features of kro with the help of a sample voting application.","markdown_url":"/blog/kube-resource-orchestrator-kro-deploying-the-sample-voting-application/index.md","slug":"","title":"Kube Resource Orchestrator (KRO) - Deploying the sample voting application","url":"https://ravichaganti.com/blog/kube-resource-orchestrator-kro-deploying-the-sample-voting-application/"}],"count":2,"name":"Kubernetes Resource Orchestrator","slug":"kubernetes-resource-orchestrator","url":"https://ravichaganti.com/series/kubernetes-resource-orchestrator/"},{"articles":[{"date":"2025-07-14","excerpt":"There are several options available for running Large Language Model (LLM) inference locally. Ollama is one such option and my favorite among all. Ollama offers access to a wide range of models and has recently enabled cloud-hosted models as well. It offers both CLI and GUI (chat interface) to interact with the loaded models.","markdown_url":"/blog/local-model-serving-using-ollama/index.md","slug":"","title":"Local model serving - Using Ollama","url":"https://ravichaganti.com/blog/local-model-serving-using-ollama/"},{"date":"2025-07-15","excerpt":"There are several options available for running Large Language Model (LLM) inference locally. LM Studio is one such option. It is more comprehensive and offers some great features.","markdown_url":"/blog/local-model-serving-using-lm-studio/index.md","slug":"","title":"Local model serving - Using LM Studio","url":"https://ravichaganti.com/blog/local-model-serving-using-lm-studio/"},{"date":"2025-07-16","excerpt":"Docker Model Runner — a faster, simpler way to run and test AI models locally, right from your existing workflow. Whether you’re experimenting with the latest LLMs or deploying to production, Model Runner brings the performance and control you need, without the friction.","markdown_url":"/blog/local-model-serving-using-docker-model-runner/index.md","slug":"","title":"Local model serving - Using Docker model runner","url":"https://ravichaganti.com/blog/local-model-serving-using-docker-model-runner/"},{"date":"2025-07-17","excerpt":"There are several options available for running Large Language Model (LLM) inference locally. Foundry Local by Microsoft is a new entrant.","markdown_url":"/blog/local-model-serving-using-foundry-local/index.md","slug":"","title":"Local model serving - Using Foundry Local","url":"https://ravichaganti.com/blog/local-model-serving-using-foundry-local/"}],"count":4,"name":"Local LLM Serving","slug":"local-llm-serving","url":"https://ravichaganti.com/series/local-llm-serving/"},{"articles":[{"date":"2025-10-02","excerpt":"Microsoft Agent Framework is an open-source development kit for building AI agents and multi-agent workflows.","markdown_url":"/blog/introduction-to-microsoft-agent-framework/index.md","slug":"","title":"Introduction to Microsoft Agent Framework","url":"https://ravichaganti.com/blog/introduction-to-microsoft-agent-framework/"},{"date":"2025-10-04","excerpt":"The world of AI agents is evolving rapidly, and Microsoft's Agent Framework provides a powerful, unified foundation for building intelligent agents that can reason, take actions, and interact with users naturally. In this blog post, I'll walk you through a series of practical examples that demonstrate how to create and use Azure AI agents using MAF and Python.","markdown_url":"/blog/building-ai-agents-with-microsoft-agent-framework/index.md","slug":"","title":"Building AI Agents with Microsoft Agent Framework","url":"https://ravichaganti.com/blog/building-ai-agents-with-microsoft-agent-framework/"},{"date":"2025-10-10","excerpt":"The Microsoft Agent Framework represents a significant improvement in developer experience over the raw Foundry SDK. While the native SDK gives you complete control, the Agent Framework provides less boilerplate, type-safe tools, consistent patterns, and resource safety.","markdown_url":"/blog/building-persistent-ai-agents-with-microsoft-agent-framework-and-microsoft-foundry/index.md","slug":"","title":"Building persistent AI Agents with Microsoft Agent Framework and Microsoft Foundry","url":"https://ravichaganti.com/blog/building-persistent-ai-agents-with-microsoft-agent-framework-and-microsoft-foundry/"},{"date":"2025-10-12","excerpt":"Learn how to orchestrate AI agents in a step-by-step pipeline using Microsoft Agent Framework's SequentialBuilder","markdown_url":"/blog/sequential-workflows-in-microsoft-agent-framework/index.md","slug":"","title":"Sequential workflows in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/sequential-workflows-in-microsoft-agent-framework/"},{"date":"2025-10-14","excerpt":"Learn how to orchestrate AI agents in a concurrent workflow using Microsoft Agent Framework's ConcurrentBuilder","markdown_url":"/blog/concurrent-workflows-in-microsoft-agent-framework/index.md","slug":"","title":"Concurrent workflows in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/concurrent-workflows-in-microsoft-agent-framework/"},{"date":"2025-10-16","excerpt":"Learn how to orchestrate AI agents in a concurrent workflow using Microsoft Agent Framework's HandoffBuilder","markdown_url":"/blog/handoff-workflows-in-microsoft-agent-framework/index.md","slug":"","title":"Handoff workflows in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/handoff-workflows-in-microsoft-agent-framework/"},{"date":"2025-10-18","excerpt":"Building dynamic multi-agent discussions where AI agents collaborate, debate, and converge on solutions with GroupChatBuilder","markdown_url":"/blog/group-chat-workflows-in-microsoft-agent-framework/index.md","slug":"","title":"Group chat workflows in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/group-chat-workflows-in-microsoft-agent-framework/"},{"date":"2025-10-20","excerpt":"If you need a workflow that can adapt its routing decisions based on what agents discover during execution, look no further. Magentic is for you!","markdown_url":"/blog/magentic-workflows-in-microsoft-agent-framework/index.md","slug":"","title":"Magentic workflows in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/magentic-workflows-in-microsoft-agent-framework/"},{"date":"2026-01-28","excerpt":"Microsoft Agent Protocol is an open framework for building enterprise-grade agents. It offers support for using the A2A protocol for cross-agent communication.","markdown_url":"/blog/cross-framework-agent-communication-microsoft-agent-framework-meets-google-adk-via-a2a/index.md","slug":"","title":"Cross-Framework Agent Communication: Microsoft Agent Framework meets Google ADK via A2A","url":"https://ravichaganti.com/blog/cross-framework-agent-communication-microsoft-agent-framework-meets-google-adk-via-a2a/"},{"date":"2026-02-28","excerpt":"Latest release of Microsoft Agent Framework offers support for Agent Skills. We will explore implementing a practical use case for Skills with MAF.","markdown_url":"/blog/microsoft-agent-framework-agent-skills/index.md","slug":"","title":"Microsoft Agent Framework - Agent Skills","url":"https://ravichaganti.com/blog/microsoft-agent-framework-agent-skills/"},{"date":"2026-03-01","excerpt":"Across this series, we have used several Microsoft Agent Framework client classes to talk to different model surfaces. This article maps them out, explains when each one fits, and shows the same simple agent built three different ways.","markdown_url":"/blog/choosing-the-right-microsoft-agent-framework-client/index.md","slug":"","title":"Choosing the right Microsoft Agent Framework client","url":"https://ravichaganti.com/blog/choosing-the-right-microsoft-agent-framework-client/"},{"date":"2026-03-02","excerpt":"Function tools turn ordinary Python functions into capabilities your agent can call. This article looks at how MAF converts type hints into schemas, what return types it accepts, how async tools work, and what happens when a tool raises an error.","markdown_url":"/blog/function-tools-in-microsoft-agent-framework/index.md","slug":"","title":"Function tools in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/function-tools-in-microsoft-agent-framework/"},{"date":"2026-03-04","excerpt":"Real applications rarely call an agent once and walk away. They hold conversations, and they often stream the response as it is generated. This article looks at AgentSession, streaming responses, and how the two work together.","markdown_url":"/blog/streaming-and-multi-turn-conversations-in-microsoft-agent-framework/index.md","slug":"","title":"Streaming and multi-turn conversations in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/streaming-and-multi-turn-conversations-in-microsoft-agent-framework/"},{"date":"2026-03-05","excerpt":"MAF middleware lets you intercept agent runs, tool calls, and the underlying chat-client requests. This article looks at the three middleware types, when each one fires, and how to use them for logging, redaction, blocking, and result overrides without touching your agent code.","markdown_url":"/blog/middleware-in-microsoft-agent-framework/index.md","slug":"","title":"Middleware in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/middleware-in-microsoft-agent-framework/"},{"date":"2026-03-06","excerpt":"Free-text replies are fragile to parse, especially when downstream code depends on the answer's shape. This article looks at how Microsoft Agent Framework constrains an agent's reply to a Pydantic model, when to use it, and how it interacts with tool calls and streaming.","markdown_url":"/blog/structured-outputs-in-microsoft-agent-framework/index.md","slug":"","title":"Structured outputs in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/structured-outputs-in-microsoft-agent-framework/"},{"date":"2026-03-08","excerpt":"Function tools cover code you write yourself. MCP servers cover tools that other people write. This article looks at how to connect a Microsoft Agent Framework agent to a local MCP server, what the agent actually sees when you do, and how MCP tools coexist with the function tools we have already used.","markdown_url":"/blog/local-mcp-tools-in-microsoft-agent-framework/index.md","slug":"","title":"Local MCP tools in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/local-mcp-tools-in-microsoft-agent-framework/"},{"date":"2026-03-09","excerpt":"Foundry can host the MCP connection on the agent's behalf. This article looks at how a hosted MCP tool differs from the local MCP setup we built last time, where authentication moves, and how to wire one up via FoundryChatClient.get_mcp_tool.","markdown_url":"/blog/hosted-mcp-tools-in-microsoft-agent-framework/index.md","slug":"","title":"Hosted MCP tools in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/hosted-mcp-tools-in-microsoft-agent-framework/"},{"date":"2026-03-10","excerpt":"We have spent the last two articles consuming MCP servers from a MAF agent. This one flips the picture: how to publish a MAF agent as an MCP server so that other agents and applications, in any framework, can call it as a tool.","markdown_url":"/blog/exposing-microsoft-agent-framework-agents-as-mcp-servers/index.md","slug":"","title":"Exposing Microsoft Agent Framework agents as MCP servers","url":"https://ravichaganti.com/blog/exposing-microsoft-agent-framework-agents-as-mcp-servers/"},{"date":"2026-03-15","excerpt":"AgentSession keeps one conversation alive for as long as the Python process runs. Context providers let an agent remember things across sessions, across users, and across long timescales. This article looks at the provider abstraction, the built-in history and memory providers, and how to write your own.","markdown_url":"/blog/context-providers-and-pluggable-memory-in-microsoft-agent-framework/index.md","slug":"","title":"Context providers and pluggable memory in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/context-providers-and-pluggable-memory-in-microsoft-agent-framework/"},{"date":"2026-03-16","excerpt":"Sequential, concurrent, handoff, group chat, and magentic workflows are all built on the same four primitives: executors, edges, events, and a superstep-based execution model. This article looks at those primitives directly, so you know what is happening underneath when you reach for an orchestration builder, and so you can build workflows the builders do not cover.","markdown_url":"/blog/workflow-fundamentals-in-microsoft-agent-framework/index.md","slug":"","title":"Workflow fundamentals in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/workflow-fundamentals-in-microsoft-agent-framework/"},{"date":"2026-03-18","excerpt":"A workflow is a graph that runs in discrete supersteps. That structure makes two things easy that are usually hard: drawing the graph, and pausing the run cleanly so you can resume it later. This article looks at WorkflowViz for visualization and the CheckpointStorage system for persistence.","markdown_url":"/blog/visualizing-and-checkpointing-workflows-in-microsoft-agent-framework/index.md","slug":"","title":"Visualizing and checkpointing workflows in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/visualizing-and-checkpointing-workflows-in-microsoft-agent-framework/"},{"date":"2026-03-20","excerpt":"Some tool calls are too consequential to let an agent run unsupervised. Function approvals pause the agent run when a destructive or sensitive tool is about to fire, surface the call to a human, and resume only after explicit approval. This article looks at how to mark a tool as approval-required, how the run pauses, and how to wire approve and reject back into the agent.","markdown_url":"/blog/human-in-the-loop-with-function-approvals-in-microsoft-agent-framework/index.md","slug":"","title":"Human-in-the-loop with function approvals in Microsoft Agent Framework","url":"https://ravichaganti.com/blog/human-in-the-loop-with-function-approvals-in-microsoft-agent-framework/"}],"count":22,"name":"Microsoft Agent Framework","slug":"microsoft-agent-framework","url":"https://ravichaganti.com/series/microsoft-agent-framework/"},{"articles":[{"date":"2025-10-03","excerpt":"Microsoft Foundry (formerly Azure AI Foundry) is a unified system for building intelligent agents. It is a platform that provides models, tools, frameworks, and other aspects such as observability, guardrails, and enterprise-ready governance for creating AI agents.","markdown_url":"/blog/getting-started-with-foundry-agents/index.md","slug":"","title":"Getting Started with Foundry Agents","url":"https://ravichaganti.com/blog/getting-started-with-foundry-agents/"}],"count":1,"name":"Microsoft Foundry","slug":"microsoft-foundry","url":"https://ravichaganti.com/series/microsoft-foundry/"},{"articles":[{"date":"2025-02-01","excerpt":"A couple of months ago, Anthropic introduced and open-sourced the Model Context Protocol (MCP). MCP is the new standard for connecting AI models to external data sources and APIs more easily and consistently. With the advances in AI, models are becoming increasingly powerful in reasoning and quality. However, as text-completion machines, these models still lack access to real-time data. AI providers have worked around this using Retrieval Augmented Generation (RAG) and tool calling. Every data source requires custom implementation, and every provider has a way of integrating tools with AI models. MCP addresses these silos by providing a universal, open standard for connecting AI systems with data sources.\n","markdown_url":"/blog/anthropic-model-context-protocol/index.md","slug":"anthropic-model-context-protocol","title":"Model Context Protocol by Anthropic for connecting AI models to data","url":"https://ravichaganti.com/blog/anthropic-model-context-protocol/"},{"date":"2025-02-25","excerpt":"Extend knowledge of creating MCP servers to achieve more practical applications","markdown_url":"/blog/building-a-model-context-protocol-server-for-azure/index.md","slug":"building-a-model-context-protocol-server-for-azure","title":"Building a Model Context Protocol server for Azure","url":"https://ravichaganti.com/blog/building-a-model-context-protocol-server-for-azure/"},{"date":"2026-10-12","excerpt":"The Model Context Protocol isn't just for backend servers. With WebMCP, websites can expose structured JavaScript tools directly in the browser for AI agents to discover and execute. Here is how to implement WebMCP on a Hugo static site without any backend servers.","markdown_url":"/blog/adding-webmcp-support-to-hugo-static-sites/index.md","slug":"adding-webmcp-support-to-hugo-static-sites","title":"Adding WebMCP Support to Hugo Static Sites","url":"https://ravichaganti.com/blog/adding-webmcp-support-to-hugo-static-sites/"}],"count":3,"name":"Model Context Protocol","slug":"model-context-protocol","url":"https://ravichaganti.com/series/model-context-protocol/"},{"articles":[{"date":"2026-05-08","excerpt":"OpenClaw is an open-source, self-hosted AI agent framework that turns your machine into a persistent, autonomous personal assistant.","markdown_url":"/blog/introduction-to-openclaw/index.md","slug":"","title":"Introduction to OpenClaw","url":"https://ravichaganti.com/blog/introduction-to-openclaw/"},{"date":"2026-05-09","excerpt":"The best way to understand OpenClaw is to try it. The safest way to do that is to run it inside a container.","markdown_url":"/blog/openclaw-installation-and-gateway-bootstrap/index.md","slug":"","title":"OpenClaw installation and gateway bootstrap","url":"https://ravichaganti.com/blog/openclaw-installation-and-gateway-bootstrap/"}],"count":2,"name":"OpenClaw","slug":"openclaw","url":"https://ravichaganti.com/series/openclaw/"},{"articles":[{"date":"2023-03-20","excerpt":"I work on a team with members across multiple time zones. It is important to schedule meetings so that team members do not have to stay late or wake up early. Being a command line person, I quickly wrote this PowerShell script to help me determine the time differences.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 param ( [Parameter(Mandatory = $true)] [String[]] $Timezone, [Parameter()] [Datetime] $Target ) if (!$Target) { # Get the local time as the target $Target = Get-Date } $tzObject = [System.Collections.Arraylist]::new() $tzObject.Add( [PSCustomObject]@{ \u0026#39;Timezone\u0026#39; = \u0026#39;Local\u0026#39; \u0026#39;Time\u0026#39; = $Target \u0026#39;DifferenceInHours\u0026#39; = 0 } ) | Out-Null foreach ($tz in $Timezone) { # Get the timezone difference $localTz = [System.TimeZoneInfo]::Local $remoteTz = [System.TimeZoneInfo]::FindSystemTimeZoneById($tz) $tzDifference = [float]($remoteTz.BaseUtcOffset.TotalHours - $localTz.BaseUtcOffset.TotalHours) $remoteTime = [System.TimeZoneInfo]::ConvertTime($Target, $localTz, $remoteTz) $tzObject.Add( [PSCustomObject]@{ \u0026#39;Timezone\u0026#39; = $tz \u0026#39;Time\u0026#39; = $remoteTime \u0026#39;DifferenceInHours\u0026#39; = $tzDifference } ) | Out-Null } return $tzObject This one is simple to use.\n","markdown_url":"/blog/2023-03-20-determining-time-zone-differences-in-powershell-for-effective-meeting-planning/index.md","slug":"2023-03-20-determining-time-zone-differences-in-powershell-for-effective-meeting-planning","title":"Determining time zone differences in PowerShell for effective meeting planning","url":"https://ravichaganti.com/blog/2023-03-20-determining-time-zone-differences-in-powershell-for-effective-meeting-planning/"}],"count":1,"name":"PowerShell","slug":"powershell","url":"https://ravichaganti.com/series/powershell/"},{"articles":[{"date":"2010-01-22","excerpt":"I am starting a series of articles on remoting feature of PowerShell 2.0. This is one of the best features of PowerShell 2.0 and my favorite feature for sure. The number of very cool things one can achieve using this feature is just un-imaginable. I have started digging deep in to this feature as I start writing a network file browser powerpack as a part of hands-on. I hope it is worth sharing what I learn by writing about it here. So, this is the first in that series of posts. In this post, we will look at absolute basics to start using PowerShell remoting.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-1-the-basics/index.md","slug":"powershell-2-0-remoting-guide-part-1-the-basics","title":"PowerShell 2.0 remoting guide: Part 1 – The basics","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-1-the-basics/"},{"date":"2010-01-27","excerpt":"In part 1 of this series I gave a quick introduction to PowerShell 2.0 remoting. Before we look at how to enable or configure a computer for remoting, let us take a quick look at PowerShell 2.0 remoting cmdlets. Here is a complete list of cmdlets with a brief overview.\nThis list will also include cmdlets that are not directly used within remoting but help configure various aspects of remoting. The knowledge of these cmdlets such as WSMan, etc in this list is not mandatory for basic usage of PowerShell remoting. In this post, I will only discuss what each of these cmdlets are capable of and list any gotchas. A detailed usage of these cmdlets will be discussed later in the series.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-2--overview-of-remoting-cmdlets/index.md","slug":"powershell-2-0-remoting-guide-part-2-–-overview-of-remoting-cmdlets","title":"PowerShell 2.0 remoting guide: Part 2 – Overview of remoting cmdlets","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-2--overview-of-remoting-cmdlets/"},{"date":"2010-01-31","excerpt":"In this part of the series of articles on PowerShell 2.0 remoting, we will look at how to enable remoting in different scenarios. This post assumes that you are running a supported operating system and you have installed all necesary pre-requisite software.\nSo, how do you enable remoting?\nRemoting in PowerShell 2.0 can be enabled by just running the following cmdlet\nEnable-PSRemoting Note: You have to run this at a elevated PowerShell prompt. Also, all your active networks should be set to “Home” or “Work” network location. Setting firewall exceptions for remoting will fail if the network location is set to “Public”.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-3--enable-remoting/index.md","slug":"powershell-2-0-remoting-guide-part-3-–-enable-remoting","title":"PowerShell 2.0 remoting guide: Part 3 – Enable remoting","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-3--enable-remoting/"},{"date":"2010-02-01","excerpt":"In this part of PowerShell remoting series, I will discuss how to run commands or scripts on remote computer(s). Within remoting, there are couple of ways to run commands or scripts on a remote machine. This includes Invoke-Command cmdlet and interactive remoting sessions. These two methods deserve a separate post for each and hence I will discuss the Invoke-Command method in today\u0026rsquo;s post.\nOnce you have enabled remoting on all your computers, you can use Invoke-Command cmdlet to run commands and scripts on local computer or on remote computer(s). There are many possible variations of this cmdlet. I will cover most of them here.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-4--execute-commands-or-scripts-on-a-remote-computer-using-invoke-command/index.md","slug":"powershell-2-0-remoting-guide-part-4-–-execute-commands-or-scripts-on-a-remote-computer-using-invoke-command","title":"PowerShell 2.0 remoting guide: Part 4 – Execute commands or scripts on a remote computer using Invoke-Command","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-4--execute-commands-or-scripts-on-a-remote-computer-using-invoke-command/"},{"date":"2010-02-02","excerpt":"In this part of the remoting series, I will talk about using Enter-PSSession and Exit-PSSession cmdlets to perform interactive remoting.\nWhy do you need interactive remoting?\nTo understand the advantages of interactive remoting in PowerShell 2.0, let us first look at some gotchas with Invoke-Command. Take an example of a remote system where SharePoint 2010 is installed. SharePoint 2010 provides native PowerShell cmdlets and these cmdlets can be accesses only if you load Microsoft.SharePoint.PowerShell PS snap-in. So, to do this using Invoke-Command\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-5-interactive-remoting-sessions/index.md","slug":"powershell-2-0-remoting-guide-part-5-interactive-remoting-sessions","title":"PowerShell 2.0 remoting guide: Part 5 – interactive remoting sessions","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-5-interactive-remoting-sessions/"},{"date":"2010-02-03","excerpt":"In an earlier post on interactive remoting sessions, we looked at how we can enter a remote session and then execute commands as if they were local. However, if you’d observed it more closely, we were actually sitting in the remote session than local console. The change in PowerShell prompt indicates this fact clearly.\nIn this part of the remoting series, we will look at a feature called implicit remoting which makes it possible to run the commands / scripts on the remote computer while in the local session.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-6-implicit-remoting-sessions/index.md","slug":"powershell-2-0-remoting-guide-part-6-implicit-remoting-sessions","title":"PowerShell 2.0 remoting guide: Part 6 – implicit remoting sessions","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-6-implicit-remoting-sessions/"},{"date":"2010-02-04","excerpt":"In part 6 of the remoting series we looked at how we can use Import-PSSession cmdlet to execute remote commands as if they were local. This is nice but this will last only while the session ($s in the example) is alive. The moment we kill the session — using Rem0ve-PSSession, remoting session will also get killed. In this part of the series, we will look at how we can save a remoting session to disk so that we don’t even have to explicitly create a session.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-7--saving-remote-session-to-disk/index.md","slug":"powershell-2-0-remoting-guide-part-7-–-saving-remote-session-to-disk","title":"PowerShell 2.0 remoting guide: Part 7 – saving remote session to disk","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-7--saving-remote-session-to-disk/"},{"date":"2010-02-07","excerpt":"If you have been following this remoting series and using PS remoting on a test setup or even production, you must have gone through a few initial hiccups. In fact, there could be many such issues if you are working in a mixed environment where you have a few computers in a domain and a few in workgroup. So, in this part of the remoting series I will discuss some of these issues and workarounds to resolve the same. I discussed enabling remoting on workgroup computers in part3 – “Enable remoting” of this series. This post is kind of an extension to that.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-8--remoting-scenarios-and-troubleshooting/index.md","slug":"powershell-2-0-remoting-guide-part-8-–-remoting-scenarios-and-troubleshooting","title":"PowerShell 2.0 remoting guide: Part 8 – remoting scenarios and troubleshooting","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-8--remoting-scenarios-and-troubleshooting/"},{"date":"2010-02-09","excerpt":"In part2 of this series on PowerShell remoting we quickly looked at various cmdlets that form part of overall remoting infrastructure. The list there included cmdlets related to PS Session configuration. Now that we have gone through the basics of remoting, it is time for us to dig in to these additional cmdlets and explore what they really do.\nSo, in this part, we will look at all the PS session configurtion cmdlets, discuss how to create custom PS Session configurations and the need for it. Let us dive in to this now.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-9--session-configurations-and-creating-custom-configurations/index.md","slug":"powershell-2-0-remoting-guide-part-9-–-session-configurations-and-creating-custom-configurations","title":"PowerShell 2.0 remoting guide: Part 9 – Session configurations and creating custom configurations","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-9--session-configurations-and-creating-custom-configurations/"},{"date":"2010-02-11","excerpt":"“With great power comes great responsibility”, said uncle Ben. But some people don’t just understand that. That is when you have to rip-off their powers. Similarly, the default PS Session configuration allows full access to PowerShell language, cmdlets, scripts and everything available to PowerShell. Of course, you need to authenticate as a local administrator or should have execute permission to invoke the session. Running a few cmdlets such as Stop-Service or Restart-Computer can be quite dangerous on a production server. This is where a custom session configuration can help provide role based access to remote host using PowerShell remoting.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-10--restricting-available-commands-using-custom-session-configuration/index.md","slug":"powershell-2-0-remoting-guide-part-10-–-restricting-available-commands-using-custom-session-configuration","title":"PowerShell 2.0 remoting guide: Part 10 – Restricting available commands using custom session configuration","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-10--restricting-available-commands-using-custom-session-configuration/"},{"date":"2010-02-15","excerpt":"In this part of the remoting series, we look at remoting output. This includes how the output is transferred from remote computer to local, how it is displayed and how we can format this output based on a need. We already discussed various methods to execute commands (part4, part 5 and part 6) on a remote computer. In this post, for the sake of our discussion of remoting output, I will use only Invoke-Command method to execute remote commands. However, I will point out the differences as required.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-11--interpreting-formatting-and-displaying-remote-output/index.md","slug":"powershell-2-0-remoting-guide-part-11-–-interpreting-formatting-and-displaying-remote-output","title":"PowerShell 2.0 remoting guide: Part 11 – Interpreting, formatting and displaying remote output","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-11--interpreting-formatting-and-displaying-remote-output/"},{"date":"2010-02-18","excerpt":"In this part of the remoting series, we look at how CredSSP can be used for multi-hop authentication in PowerShell remoting. CredSSP and multi-hop support are not features of PowerShell 2.0 or PowerShell remoting, per se. Credential Security Service Provider (CredSSP) is a new security service provider that enables an application to delegate the user’s credentials from the client to the target server. Multi-hop support in Windows Remote Management uses CredSSP for authentication. Since PowerShell 2.0 remoting is built on top of WinRM, we can use CredSSP to perform multi-hop authentication.\n","markdown_url":"/blog/powershell-2-0-remoting-guide-part-12--using-credssp-for-multi-hop-authentication/index.md","slug":"powershell-2-0-remoting-guide-part-12-–-using-credssp-for-multi-hop-authentication","title":"PowerShell 2.0 remoting guide: Part 12 – Using CredSSP for multi-hop authentication","url":"https://ravichaganti.com/blog/powershell-2-0-remoting-guide-part-12--using-credssp-for-multi-hop-authentication/"}],"count":12,"name":"PowerShell Remoting","slug":"powershell-remoting","url":"https://ravichaganti.com/series/powershell-remoting/"},{"articles":[{"date":"2021-01-10","excerpt":"Update: This article has been updated to show the latest version of the secret management module.\nWithin the infrastructure automation, you always stumble upon a need to store and retrieve credentials. For example, imagine deploying a database instance and you want the database administrator username and password to be same across based on some IT standard. For this, you either have to hardcode the values in a script or prompt the user running the automation for these values. Storing secrets such as passwords, API keys, etc is a big NO. You should never do that. And, prompting a user will hamper the automation flow and will require manual intervention. This is where secret vaults play a role. You can store all secrets in a vault (local or remote) and then on-demand you can retrieve these values from the vault and consume in your automation. This method is most preferred when delegating automation tasks, running scripts in CI / CD pipelines, and in general anything that requires unattended automation.\n","markdown_url":"/blog/powershell-and-secret-management-introduction/index.md","slug":"powershell-and-secret-management-introduction","title":"PowerShell and Secret Management - Introduction","url":"https://ravichaganti.com/blog/powershell-and-secret-management-introduction/"},{"date":"2021-01-15","excerpt":"Update: This article has been updated to show the latest version of the secret store module.\nIn the last part, you have seen an introduction to secret management in PowerShell and towards the end you learned that they are vault extensions that provide the real functionality for storing and managing secrets. In this part of the series, you will learn more about the SecretStore vault extension for the SecretManagement PowerShell module.\nThe SecretStore extension vault is a wrapper around the .NET Crypto API. This vault stores the secrets to the local machine based on the current user account context. You can install this from the PowerShell gallery.\n","markdown_url":"/blog/powershell-and-secret-management-using-secret-store-extension-vault/index.md","slug":"powershell-and-secret-management-using-secret-store-extension-vault","title":"PowerShell and Secret Management - Using Secret Store Extension Vault","url":"https://ravichaganti.com/blog/powershell-and-secret-management-using-secret-store-extension-vault/"},{"date":"2021-03-11","excerpt":"At the recent Ignite event, Microsoft announced the release candidate 2 update of PowerShell SecretManagement module and the SecretStore extension vault modules. Both modules have been bumped up to version 0.9.1.\nIn the updated release, the secret management module has added support for secret metadata. The extension vault module must implement support for the metadata for this to work. To this extent, the SecretStore module has been updated to support metadata as well.\n","markdown_url":"/blog/powershell-and-secrets-management-updates/index.md","slug":"powerShell-and-secrets-management-updates","title":"PowerShell and Secret Management - Updates","url":"https://ravichaganti.com/blog/powershell-and-secrets-management-updates/"}],"count":3,"name":"PowerShell Secret Management","slug":"powershell-secret-management","url":"https://ravichaganti.com/series/powershell-secret-management/"},{"articles":[{"date":"2023-01-12","excerpt":"WebAssembly, a.k.a Wasm, defines a portable binary-code format for a stack-based virtual machine. Wasm enables developers to write code that runs in web browsers with near-native performance using languages such as C, C++, Rust, Go, and many other modern languages. Wasm is not a replacement for JavaScript but is designed to complement and run alongside JavaScript.\nI am still learning about Wasm and looking at opportunities to use Wasm in designing modern and cloud-native applications. My focus has been using the Go programming language for Wasm as well. So, when I started learning Wasm, I quickly looked for ways to create a development environment that would help me in my journey toward mastering Wasm. For this, I started looking at VS Code development containers. This resulted in a set of devcontainer features that I can use within a development container definition.\n","markdown_url":"/blog/2023-01-12-webassembly-learning-playground-in-vs-code/index.md","slug":"2023-01-12-webassembly-learning-playground-in-vs-code","title":"WebAssembly (wasm) learning playground in VS Code","url":"https://ravichaganti.com/blog/2023-01-12-webassembly-learning-playground-in-vs-code/"}],"count":1,"name":"Wasm","slug":"wasm","url":"https://ravichaganti.com/series/wasm/"},{"articles":[{"date":"2010-07-22","excerpt":"I have been using WMI a lot these days and got to play with WQL as well. In this series of posts, I want to write about how WMI Query Language (WQL) can be used to retrieve management data exposed by WMI. Yes, this has nothing to do with PowerShell but as a PowerShell lover (and a MVP now), I will use PowerShell for all my examples.\nWindows Management Instrumentation (WMI) is the Microsoft implementation of Web-based Enterprise Management (WBEM), which is an industry initiative to develop a standard technology for accessing management information in an enterprise environment. WMI uses the Common Information Model (CIM) industry standard to represent systems, applications, networks, devices, and other managed components. CIM is developed and maintained by the Distributed Management Task Force (DMTF). We can write WMI scripts to automate several tasks on local or remote computer(s).\n","markdown_url":"/blog/wmi-query-language-wql-an-introduction/index.md","slug":"wmi-query-language-wql-an-introduction","title":"WMI Query Language (WQL) – An introduction","url":"https://ravichaganti.com/blog/wmi-query-language-wql-an-introduction/"},{"date":"2010-08-02","excerpt":"In this post, we will look at the a brief description of WQL keywords and operators and see a classification of the keywords based on where (query types) these keywords can be used.\nKeywords Similar to SQL, WQL queries use keywords to retrieve data from the management objects. WQL has 19 keywords to perform these queries against WMI repositories. In the previous post, we discussed about three types of queries: Data, Event, and Schema. Though there are 19 WQL keywords, only a few of them can be used all 3 possible query types. The following table lists all the WQL keywords and lists the query type in which they can be used.\n","markdown_url":"/blog/wmi-query-language-wql-keywords-and-operators/index.md","slug":"wmi-query-language-wql-keywords-and-operators","title":"WMI Query Language (WQL) – Keywords and Operators","url":"https://ravichaganti.com/blog/wmi-query-language-wql-keywords-and-operators/"},{"date":"2010-08-03","excerpt":"In this part of the series on WQL, we will look at what are data queries and how some of the WQL keywords \u0026amp; operators can be used to retrieve information from WMI repository. Also, as mentioned earlier, there are many other tools that consume WQL queries to retrieve information from WMI. However, in this series, I shall use only PowerShell to demonstrate WQL.\nWQL data queries are the most simplest form of querying for WMI data. Data queries are used to retrieve class instances and data associations. For example,\n","markdown_url":"/blog/wmi-query-language-wql-data-queries-select-from-and-where/index.md","slug":"wmi-query-language-wql-data-queries-select-from-and-where","title":"WMI Query Language (WQL) – Data Queries: SELECT, FROM, and WHERE","url":"https://ravichaganti.com/blog/wmi-query-language-wql-data-queries-select-from-and-where/"},{"date":"2010-09-13","excerpt":"As we saw in the previous post, Select queries can be used to retrieve instances of WMI class. But select queries are not the only way to query for instances. We can also use Associators Of keyword to the same. However, there is a difference. Select queries always return a collection of instances of a WMI class where as “Associators Of” returns a collection of WMI objects that belong to different WMI classes or associated WMI classes. Before we dig too much in to this, let us first understand what are associated WMI classes.\n","markdown_url":"/blog/wmi-query-language-wql-data-queries-associators-of/index.md","slug":"wmi-query-language-wql-data-queries-associators-of","title":"WMI Query Language (WQL) – Data Queries: Associators Of","url":"https://ravichaganti.com/blog/wmi-query-language-wql-data-queries-associators-of/"},{"date":"2010-11-11","excerpt":"Per MSDN documentation, the REFERENCES OF statement\nRetrieves all association instances that refer to a particular source instance. The REFERENCES OF statement is similar to the ASSOCIATORS OF statement in its syntax. However, rather than retrieving endpoint instances, it retrieves the intervening association instances.\nThat is very cryptic for beginners like you and me. So, let us look at an example to understand this.\nIf you look at the above diagram (captured from the associations tab of Win32_Process in CIM Studio) and as I showed you in my earlier post, Win32_SessionProcess, in32_NamedJobObjectProcesses, Win32_SystemProcesses are the associator or association classes. Whereas, Win32_Process, Win32_LogonSession, Win32_NamedObject, and Win32_ComputerSystem are the associated classes.\n","markdown_url":"/blog/wmi-query-language-wql-data-queries-references-of/index.md","slug":"wmi-query-language-wql-data-queries-references-of","title":"WMI Query Language (WQL) – Data Queries: References Of","url":"https://ravichaganti.com/blog/wmi-query-language-wql-data-queries-references-of/"},{"date":"2010-11-15","excerpt":"In this post, I will write a bit about basics of WMI events and how Register-WMIEvent cmdlet can be used. To start with, here is an excerpt from Microsoft Scripting guide that introduces WMI events:\nJust as there is a WMI class that represents each type of system resource that can be managed using WMI, there is a WMI class that represents each type of WMI event. When an event that can be monitored by WMI occurs, an instance of the corresponding WMI event class is created. A WMI event occurs when that instance is created.\n","markdown_url":"/blog/wmi-query-language-wql--event-queries-introduction/index.md","slug":"wmi-query-language-wql-–-event-queries-introduction","title":"WMI Query Language (WQL) – Event Queries: Introduction","url":"https://ravichaganti.com/blog/wmi-query-language-wql--event-queries-introduction/"},{"date":"2010-11-24","excerpt":"This is not a part of the WQL series I am doing. I happend to take a look at the WMI timer events while providing feedback to an upcoming (cool) PowerEvents module by Trevor (@pcgeek86). BTW, this module will be released on November 30th. So, watch out for the annoncement.\nComing to the subject of this post, in WMI, there are 3 types of events possible. They are Timer events, Intrinsic events, and extrinsic events. My WQL series will soon cover intrinsic and extrensic events. Very few people have written about WMI timer events in the past but this particular post on The SysAdmins blog discusses good amount of details.\n","markdown_url":"/blog/wmi-timer-events-in-powershell-using-win32_localtime/index.md","slug":"wmi-timer-events-in-powershell-using-win32_localtime","title":"WMI Timer Events in PowerShell using Win32_LocalTime","url":"https://ravichaganti.com/blog/wmi-timer-events-in-powershell-using-win32_localtime/"},{"date":"2010-12-03","excerpt":"In my earlier post, I showed how Win32_LocalTime WMI class can be used to capture timer events. As mentioned there, WMI events can be quite helpful in creating complex scheduling tasks. For example, you can specify to run a script every Thursday of every fourth week of a month in the third quarter of every year. However, there is a bug in Win32_LocalTime that currently blocks this.\nI created a support incident with MS and reported this bug to them. I got a response that this indeed is a bug and they provided a workaround to solve this temporarily.\n","markdown_url":"/blog/workarounds-for-dayofweek-timer-events-when-using-win32_localtime/index.md","slug":"workarounds-for-dayofweek-timer-events-when-using-win32_localtime","title":"Workarounds for DayOfWeek Timer events when using Win32_LocalTime","url":"https://ravichaganti.com/blog/workarounds-for-dayofweek-timer-events-when-using-win32_localtime/"},{"date":"2010-12-22","excerpt":"Intrinsic events are used to monitor a resource represented by a class in the CIM repository. In other words, the intrinsic events occur in response to a change in the standard WMI data model. WMI creates intrinsic events for objects stored in the WMI repository. A provider generates intrinsic events for dynamic classes, but WMI can create an instance for a dynamic class if no provider is available. WMI uses polling to detect the changes.\n","markdown_url":"/blog/wmi-query-language-wql--event-queries-intrinsic-events/index.md","slug":"wmi-query-language-wql-–-event-queries-intrinsic-events","title":"WMI Query Language (WQL) – Event Queries: Intrinsic Events","url":"https://ravichaganti.com/blog/wmi-query-language-wql--event-queries-intrinsic-events/"},{"date":"2010-12-22","excerpt":"The WMI query syntax for event queries is a bit different and deserves a discussion. So, before we delve in to the types of event queries, let us first look at the syntax for WQL event queries. As we discussed earlier, we use SELECT statement for event queries too. We can combine this with other keywords such as WITHIN, HAVING, and GROUP to change how we receive these WMI events.\nHere is how a MSDN article shows the syntax for WMI event queries.\n","markdown_url":"/blog/wmi-query-language-wql-event-queries-syntax/index.md","slug":"wmi-query-language-wql-event-queries-syntax","title":"WMI Query Language (WQL) – Event Queries: Syntax","url":"https://ravichaganti.com/blog/wmi-query-language-wql-event-queries-syntax/"},{"date":"2010-12-24","excerpt":"In this part of the WQL series, we shall look at extrinsic events.\nExtrinsic events represent events that do not directly link to standard WMI model. For example, Windows registry defines extrinsic events for all registry change events. For intrinsic events, having a WMI provider isn’t mandatory. This is mostly because they are defined within the standard WMI model and WMI takes care of these if there is no WMI provider for a given resource in the standard WMI model. However, since extrinsic events are outside of the standard WMI model, having a WMI provider is mandatory.\n","markdown_url":"/blog/wmi-query-language-wql-event-queries-extrinsic-events/index.md","slug":"wmi-query-language-wql-event-queries-extrinsic-events","title":"WMI Query Language (WQL) – Event Queries: Extrinsic Events","url":"https://ravichaganti.com/blog/wmi-query-language-wql-event-queries-extrinsic-events/"},{"date":"2010-12-24","excerpt":"In this last and final part of this series, we will look at how to use WQL for querying the WMI schema.\nSchema queries are used to retrieve class definitions (rather than class instances) and schema associations. In simple words, if you need to find out what type of information (this is what schema really means) a specific class holds, you use schema queries.Here is an example of a schema query:\n","markdown_url":"/blog/wmi-query-language-wql-schema-queries/index.md","slug":"wmi-query-language-wql-schema-queries","title":"WMI Query Language (WQL) – Schema Queries","url":"https://ravichaganti.com/blog/wmi-query-language-wql-schema-queries/"},{"date":"2010-12-25","excerpt":"A few weeks ago, I wrote about WMI Timer events using Win32_LocalTime and then mentioned how to work around the DayOfWeek issue. In today’s post, I will show you how to use WMI timer events to create complex scheduled tasks.\nAs system administrators, you may have to create scheduled jobs for performing various sysadmin tasks. We generally use Task Scheduler for such jobs. However, using the regular OS task scheduler, there is no easy way to create a scheduled task that occurs — for example — every Thursday of every fourth week of a month in the third quarter of every year.\n","markdown_url":"/blog/creating-complex-scheduled-tasks-using-wmi-timer-events-and-powerevents-module/index.md","slug":"creating-complex-scheduled-tasks-using-wmi-timer-events-and-powerevents-module","title":"Creating complex scheduled tasks using WMI Timer events and PowerEvents Module","url":"https://ravichaganti.com/blog/creating-complex-scheduled-tasks-using-wmi-timer-events-and-powerevents-module/"},{"date":"2011-01-19","excerpt":"There are several ways we can create a file monitoring script using PowerShell. There is also a cmdlet in PowerShellPack called Start-FileSystemWatcher to monitor file /folder changes. However, none of these methods survive a exit at the console or wherever the script is running. This is because all these methods create a temporary event consumer. As I’d mentioned in an earlier post, Trevor’s PowerEvents module makes it very easy to create permanent event consumers in PowerShell. In today’s post, we shall look at how we can do that.\n","markdown_url":"/blog/monitoring-file-creation-using-wmi-and-powerevents-module/index.md","slug":"monitoring-file-creation-using-wmi-and-powerevents-module","title":"Monitoring file creation using WMI and PowerEvents module","url":"https://ravichaganti.com/blog/monitoring-file-creation-using-wmi-and-powerevents-module/"},{"date":"2011-06-22","excerpt":"Update: Based on feedback from @ShayLevy, we don’t have to send the background job object to Event action as a variable. It is already available as $event.Sender or just $sender. You can see that in the image below. I just picked up a wrong example to explain the -MessageData parameter. Although, the article originally showed a background job as an example, it was just to show how any object can be passed to event action. For example, if all you want to access is a background job object which you are monitoring using Register-ObjectEvent, you can access the job name using $event.Sender.Name or $sender.Name, job Id using $event.Sender.Id or $sender.Id, and so on.\n","markdown_url":"/blog/passing-variables-or-arguments-to-an-event-action-in-powershell/index.md","slug":"passing-variables-or-arguments-to-an-event-action-in-powershell","title":"Passing variables or arguments to an event action in PowerShell","url":"https://ravichaganti.com/blog/passing-variables-or-arguments-to-an-event-action-in-powershell/"},{"date":"2011-06-24","excerpt":"During a few load test iterations on a SharePoint farm, I started seeing some SQL exceptions in the application log of SharePoint servers. If you are familiar with SharePoint platform, you may have seen these events such as event ID 3355. This event complains that the SharePoint server cannot connect to SQL server. This need not really mean that the DB server is offline. So, to find out the real reason behind these event logs, I needed to start some trace activities whenever event ID 3355 gets logged.\n","markdown_url":"/blog/attaching-scripts-or-tasks-to-windows-event-log-entries-using-powershell-and-wmi/index.md","slug":"attaching-scripts-or-tasks-to-windows-event-log-entries-using-powershell-and-wmi","title":"Attaching scripts or tasks to Windows event log entries using PowerShell and WMI","url":"https://ravichaganti.com/blog/attaching-scripts-or-tasks-to-windows-event-log-entries-using-powershell-and-wmi/"},{"date":"2011-08-21","excerpt":"While I was preparing a few demo scripts for a Bangalore IT Pro UG meet session, I tumbled upon on WMI event class Win32_VolumeChangeEvent. This one is interesting. It is derived from Win32_DeviceChangeEvent class and gives us the ability to monitor local drive events directly.For example, you can get a notification when a local drive or mount point gets removed or added. The following table shows a list of event types we can monitor.\n","markdown_url":"/blog/monitoring-volume-change-events-in-powershell-using-wmi/index.md","slug":"monitoring-volume-change-events-in-powershell-using-wmi","title":"Monitoring Volume Change Events in PowerShell using WMI","url":"https://ravichaganti.com/blog/monitoring-volume-change-events-in-powershell-using-wmi/"}],"count":17,"name":"WQL via PowerShell","slug":"wql-via-powershell","url":"https://ravichaganti.com/series/wql-via-powershell/"}]