{"id":7042803,"date":"2026-08-20T13:32:08","date_gmt":"2026-08-20T13:32:08","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/build-ai-agents-with-langchain-skills-generate-ppts-excel\/"},"modified":"2026-08-20T13:32:08","modified_gmt":"2026-08-20T13:32:08","slug":"build-ai-agents-with-langchain-skills-generate-ppts-excel","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=7042803","title":{"rendered":"Build AI Agents with LangChain Skills: Generate PPTs &#038; Excel"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"article-start\">\n<p class=\"wp-block-paragraph\">Ever wondered how ChatGPT, Gemini, and other chat interfaces generate PDFs, PowerPoints, and more when all they have under the hood is an LLM? The trick isn\u2019t a smarter model. It\u2019s something simpler:\u00a0<mark class=\"has-inline-color\" style=\"background-color: #7bdcb5;\">skills<\/mark> which are<em> instructions an agent loads only when needed.<\/em><\/p>\n<p class=\"wp-block-paragraph\">Next, let\u2019s explore how skills work using LangChain and how they can make your own agents more capable, flexible, and efficient.\u00a0In this article<strong>,<\/strong>\u00a0we\u2019ll break down the concept and build a practical understanding of how skills transform agentic workflows.<\/p>\n<h2 id=\"h-about-langchain-middleware-and-skills\" class=\"wp-block-heading\">About LangChain, Middleware, and Skills<\/h2>\n<p class=\"wp-block-paragraph\"><strong>LangChain<\/strong> is a framework for building LLM-powered systems, such as agents, chains, or retrieval pipelines. Moreover, the framework helps with model calls, tools (pre-built and custom), and memory. Consequently, its \u2018create_agent\u2019 helper wires up a model, a set of tools, and a system prompt into a working agent in a few lines.<\/p>\n<h3 id=\"h-middleware-functionality-and-skills\" class=\"wp-block-heading\">Middleware functionality and Skills<\/h3>\n<p class=\"wp-block-paragraph\"><strong>Middleware<\/strong> sits between the agent and the model on every turn. It can rewrite the request before the model sees it, inspect the response before it returns, or inject extra tools, all without touching the agent\u2019s core logic. Developers mirror the idea of HTTP middleware here.<\/p>\n<p class=\"wp-block-paragraph\"><strong>Skills <\/strong>build on top of middleware. A skill is a self-contained set of instructions the agent loads only when it\u2019s relevant, usually via a <code>load_skill<\/code> tool. The agent sees a short list of the available skills and pulls in the full detail only for the skill it needs. For example, you can treat them as specialized sets of prompts. This is a better alternative than stuffing every possible instruction into one giant system prompt, which can be expensive, as the model must read all of it every time.<\/p>\n<h2 id=\"h-building-a-specialized-agent\" class=\"wp-block-heading\">Building a specialized agent<\/h2>\n<p class=\"wp-block-paragraph\">Finally, let us now make a specialized agent with two skills: one that writes PPT decks and one that writes Excel reports. Similarly, both skills live as <code>SKILL.md<\/code> files and hand off to a real tool that saves the file. Let\u2019s go step-by-step.<\/p>\n<h3 id=\"h-pre-requisites\" class=\"wp-block-heading\">Pre-Requisites<\/h3>\n<ul class=\"wp-block-list\">&#13;<\/p>\n<li>Make sure to get yourself an OpenAI key for the demo (<a href=\"https:\/\/platform.openai.com\/api-keys\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https:\/\/platform.openai.com\/api-keys<\/a>) or you can use an alternative model as well.<\/li>\n<p>&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n&#13;<\/p>\n<li>Python Notebook to run the code:<br \/>You can use Google Colab or a local Jupyter Notebook as well.<\/li>\n<p>&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n&#13;<\/p>\n<li>Therefore, make a skills folder and define the skills in the markdown files:<br \/><img decoding=\"async\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image-1-f98bs1.webp\" alt=\"File directory structure for project skills\"\/><\/li>\n<p>&#13;<br \/>\n&#13;<br \/>\n&#13;<br \/>\n&#13;<\/p>\n<li><code>excel_reporter\/SKILL.md<\/code>:<\/li>\n<p>&#13;\n<\/ul>\n<pre class=\"wp-block-code\"><code>---&#13;\nname: excel_reporter&#13;\ndescription: Build an Excel (.xlsx) report from one or more named tables&#13;\n---&#13;\n&#13;\nYou are now a **spreadsheet analyst**. Turn the user's request into a&#13;\nclean Excel report.&#13;\n&#13;\nGuidelines:&#13;\n- Organize data into one or more sheets; each sheet is a named table.&#13;\n- First row of each sheet is the header row.&#13;\n- Keep numbers as numbers (not strings) so Excel can sum\/format them.&#13;\n- Once you've drafted the data, call the `create_excel` tool with:&#13;\n- `title`: workbook file name (no extension)&#13;\n- `sheets`: a list of {\"sheet_name\": str, \"headers\": list[str], \"rows\": list[list]}&#13;\n- Tell the user the file path once it's created.<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>---&#13;\nname: pptx_builder&#13;\ndescription: Build a PowerPoint (.pptx) deck from a title and a list of slides&#13;\n---&#13;\n&#13;\nYou are now a **presentation specialist**. Turn the user's request into a&#13;\nshort, well-structured slide deck.&#13;\n&#13;\nGuidelines:&#13;\n- 4-8 slides unless the user asks for more.&#13;\n- Each slide needs a short title and 2-4 concise bullet points (no walls of text).&#13;\n- The first slide is a title slide (title + optional subtitle, no bullets).&#13;\n- Pick a `theme_color` and `font_name` that fit the topic (e.g. green for eco\/sustainability,&#13;\n  navy\/gray for finance, warm orange for food\/hospitality). Don't default to the same colors&#13;\n  every time \u2014 vary them based on what the deck is about, or honor an explicit request&#13;\n  (\"make it blue\", \"use Georgia\").&#13;\n- Once you've drafted the outline, call the `create_pptx` tool with:&#13;\n- `title`: deck title&#13;\n- `slides`: a list of {\"heading\": str, \"bullets\": list[str]}&#13;\n- `theme_color`: 6-digit hex (no `#`) used for the title slide background and accent bars&#13;\n- `font_name`: a font available in PowerPoint's defaults, e.g. \"Calibri\", \"Georgia\", \"Verdana\"&#13;\n- Tell the user the file path once it's created.<\/code><\/pre>\n<p class=\"wp-block-paragraph\">1. Install everything the notebook needs.<\/p>\n<pre class=\"wp-block-code\"><code>!pip install -q langchain langchain-core langchain-openai langgraph python-pptx openpyxl<\/code><\/pre>\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> <code>python-pptx<\/code> and <code>openpyxl<\/code> will be used to create the PPT and Excel respectively<\/p>\n<p class=\"wp-block-paragraph\">2. Ask for the <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2024\/10\/openai-api-key-and-add-credits\/\" target=\"_blank\" rel=\"noreferrer noopener\">OpenAI key<\/a> at runtime, so the system never saves it into the notebook file.<\/p>\n<pre class=\"wp-block-code\"><code>import os&#13;\nfrom getpass import getpass&#13;\nif not os.environ.get(\"OPENAI_API_KEY\"):&#13;\n    os.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter your OpenAI API key: \")<\/code><\/pre>\n<p class=\"wp-block-paragraph\">3. Load every SKILL.md under skills\/ into memory; show just the name and description to the model up front.<\/p>\n<pre class=\"wp-block-code\"><code>from pathlib import Path&#13;\nfrom typing import TypedDict&#13;\n&#13;\nSKILLS_DIR = Path(\"skills\")&#13;\nOUTPUT_DIR = Path(\"outputs\")&#13;\nOUTPUT_DIR.mkdir(exist_ok=True)&#13;\n&#13;\nclass Skill(TypedDict):&#13;\n    name: str&#13;\n    description: str&#13;\n    content: str&#13;\n&#13;\ndef _load_skills() -&gt; list[Skill]:&#13;\n    skills = []&#13;\n    for skill_file in sorted(SKILLS_DIR.glob(\"*\/SKILL.md\")):&#13;\n        text = skill_file.read_text()&#13;\n        _, front_matter, content = text.split(\"---\", 2)&#13;\n        name = front_matter.split(\"name:\")[1].split(\"\\n\")[0].strip()&#13;\n        description = front_matter.split(\"description:\")[1].split(\"\\n\")[0].strip()&#13;\n        skills.append(Skill(name=name, description=description, content=content.strip()))&#13;\n    return skills&#13;\n&#13;\nSKILLS = _load_skills()&#13;\n[(s[\"name\"], s[\"description\"]) for s in SKILLS]<\/code><\/pre>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image-2-f98bs1.webp\" alt=\"List of available software tools and descriptions\"\/><\/figure>\n<\/div>\n<p class=\"wp-block-paragraph\">4. Give the agent one tool that fetches a skill\u2019s full instructions by name.<\/p>\n<pre class=\"wp-block-code\"><code>from langchain.tools import tool&#13;\n&#13;\n@tool&#13;\ndef load_skill(skill_name: str) -&gt; str:&#13;\n    \"\"\"Load the full instructions for a specialized skill by name.\"\"\"&#13;\n    for skill in SKILLS:&#13;\n        if skill[\"name\"] == skill_name:&#13;\n            return skill[\"content\"]&#13;\n    return f\"Unknown skill '{skill_name}'. Options: {[s['name'] for s in SKILLS]}\"<\/code><\/pre>\n<h3 id=\"h-skills-mechanism-implementation\" class=\"wp-block-heading\">Skills mechanism implementation<\/h3>\n<p class=\"wp-block-paragraph\">5. This is the actual \u201cskills\u201d mechanism: middleware that announces what\u2019s available and hands the agent <code>load_skill<\/code>.<\/p>\n<pre class=\"wp-block-code\"><code>from typing import Callable&#13;\nfrom langchain.agents.middleware import AgentMiddleware, ModelRequest, ModelResponse&#13;\nfrom langchain.messages import SystemMessage&#13;\n&#13;\nclass SkillMiddleware(AgentMiddleware):&#13;\n    \"\"\"Injects skill descriptions into the system prompt and exposes load_skill.\"\"\"&#13;\n    tools = [load_skill]&#13;\n&#13;\n    def __init__(self):&#13;\n        self.skills_prompt = \"\\n\".join(&#13;\n            f\"- **{skill['name']}**: {skill['description']}\" for skill in SKILLS&#13;\n        )&#13;\n&#13;\n    def wrap_model_call(&#13;\n        self,&#13;\n        request: ModelRequest,&#13;\n        handler: Callable[[ModelRequest], ModelResponse],&#13;\n    ) -&gt; ModelResponse:&#13;\n        skills_addendum = (&#13;\n            f\"\\n\\n## Available Skills\\n\\n{self.skills_prompt}\\n\\n\"&#13;\n            \"Call load_skill with the matching name before generating content \"&#13;\n            \"for that kind of request.\"&#13;\n        )&#13;\n        new_content = list(request.system_message.content_blocks) + [&#13;\n            {\"type\": \"text\", \"text\": skills_addendum}&#13;\n        ]&#13;\n        modified_request = request.override(&#13;\n            system_message=SystemMessage(content=new_content)&#13;\n        )&#13;\n        return handler(modified_request)<\/code><\/pre>\n<p class=\"wp-block-paragraph\">6. The tool the <code>pptx_builder<\/code> skill hands off to; it also takes a theme color and font, so decks aren\u2019t always the same.<\/p>\n<pre class=\"wp-block-code\"><code>from pptx import Presentation&#13;\nfrom pptx.dml.color import RGBColor&#13;\nfrom pptx.util import Emu&#13;\n&#13;\n&#13;\ndef _rgb(hex_color: str) -&gt; RGBColor:&#13;\n    return RGBColor.from_string(hex_color.lstrip(\"#\"))&#13;\n&#13;\n&#13;\ndef _tint(color: RGBColor, amount: float) -&gt; RGBColor:&#13;\n    \"\"\"Lighten an RGBColor toward white by `amount` (0-1).\"\"\"&#13;\n    blend = lambda c: int(c + (255 - c) * amount)&#13;\n    return RGBColor(blend(color[0]), blend(color[1]), blend(color[2]))&#13;\n&#13;\n&#13;\n@tool&#13;\ndef create_pptx(&#13;\n    title: str,&#13;\n    slides: list[dict],&#13;\n    theme_color: str = \"1F4E79\",&#13;\n    font_name: str = \"Calibri\",&#13;\n) -&gt; str:&#13;\n    \"\"\"Create a styled .pptx deck and save it to outputs.\"\"\"&#13;\n    accent = _rgb(theme_color)&#13;\n    tint = _tint(accent, 0.85)&#13;\n&#13;\n    prs = Presentation()&#13;\n    title_layout = prs.slide_layouts[0]&#13;\n    bullet_layout = prs.slide_layouts[1]&#13;\n&#13;\n    def style_text(text_frame, color=None, bold=None):&#13;\n        for paragraph in text_frame.paragraphs:&#13;\n            for run in paragraph.runs:&#13;\n                run.font.name = font_name&#13;\n&#13;\n                if color is not None:&#13;\n                    run.font.color.rgb = color&#13;\n&#13;\n                if bold is not None:&#13;\n                    run.font.bold = bold&#13;\n&#13;\n    for i, slide_data in enumerate(slides):&#13;\n        heading = slide_data.get(\"heading\", \"\")&#13;\n        bullets = slide_data.get(\"bullets\", [])&#13;\n&#13;\n        if i == 0:&#13;\n            slide = prs.slides.add_slide(title_layout)&#13;\n            slide.background.fill.solid()&#13;\n            slide.background.fill.fore_color.rgb = accent&#13;\n&#13;\n            slide.shapes.title.text = heading&#13;\n            style_text(&#13;\n                slide.shapes.title.text_frame,&#13;\n                color=RGBColor(0xFF, 0xFF, 0xFF),&#13;\n                bold=True,&#13;\n            )&#13;\n&#13;\n            if bullets:&#13;\n                slide.placeholders[1].text = bullets[0]&#13;\n                style_text(&#13;\n                    slide.placeholders[1].text_frame,&#13;\n                    color=tint,&#13;\n                )&#13;\n&#13;\n        else:&#13;\n            slide = prs.slides.add_slide(bullet_layout)&#13;\n            slide.background.fill.solid()&#13;\n            slide.background.fill.fore_color.rgb = RGBColor(&#13;\n                0xFF, 0xFF, 0xFF&#13;\n            )&#13;\n&#13;\n            # Accent bar under the title&#13;\n            bar = slide.shapes.add_shape(&#13;\n                MSO_SHAPE.RECTANGLE,  # 1&#13;\n                Emu(0),&#13;\n                Emu(0),&#13;\n                prs.slide_width,&#13;\n                Emu(60000),&#13;\n            )&#13;\n            bar.fill.solid()&#13;\n            bar.fill.fore_color.rgb = accent&#13;\n            bar.line.fill.background()&#13;\n            bar.shadow.inherit = False&#13;\n&#13;\n            slide.shapes.title.text = heading&#13;\n            style_text(&#13;\n                slide.shapes.title.text_frame,&#13;\n                color=accent,&#13;\n                bold=True,&#13;\n            )&#13;\n&#13;\n            body = slide.placeholders[1].text_frame&#13;\n            body.clear()&#13;\n&#13;\n            for j, bullet in enumerate(bullets):&#13;\n                p = body.paragraphs[0] if j == 0 else body.add_paragraph()&#13;\n                p.text = bullet&#13;\n&#13;\n            style_text(&#13;\n                body,&#13;\n                color=RGBColor(0x33, 0x33, 0x33),&#13;\n            )&#13;\n&#13;\n    file_path = OUTPUT_DIR \/ f\"{title.replace(' ', '_')}.pptx\"&#13;\n    prs.save(file_path)&#13;\n&#13;\n    return (&#13;\n        f\"Saved deck with {len(slides)} slides \"&#13;\n        f\"({font_name}, #{theme_color}) to {file_path}\"&#13;\n    )<\/code><\/pre>\n<p class=\"wp-block-paragraph\">7. The tool the <code>excel_reporter<\/code> skill hands off to, headers plus rows per sheet.<\/p>\n<pre class=\"wp-block-code\"><code>from openpyxl import Workbook&#13;\n&#13;\n&#13;\n@tool&#13;\ndef create_excel(title: str, sheets: list[dict]) -&gt; str:&#13;\n    \"\"\"Create an .xlsx workbook and save it to outputs.\"\"\"&#13;\n    wb = Workbook()&#13;\n    wb.remove(wb.active)&#13;\n&#13;\n    for sheet_data in sheets:&#13;\n        ws = wb.create_sheet(sheet_data[\"sheet_name\"][:31])  # Excel sheet-name limit&#13;\n        ws.append(sheet_data[\"headers\"])&#13;\n&#13;\n        for row in sheet_data[\"rows\"]:&#13;\n            ws.append(row)&#13;\n&#13;\n    file_path = OUTPUT_DIR \/ f\"{title.replace(' ', '_')}.xlsx\"&#13;\n    wb.save(file_path)&#13;\n&#13;\n    return f\"Saved workbook with {len(sheets)} sheet(s) to {file_path}\"<\/code><\/pre>\n<p class=\"wp-block-paragraph\">8. <strong>Assemble the agent:<\/strong> the two document tools, a one-line system prompt, and SkillMiddleware doing the rest.<\/p>\n<pre class=\"wp-block-code\"><code>from langchain.agents import create_agent&#13;\n&#13;\nagent = create_agent(&#13;\n    model=\"openai:gpt-4o-mini\",&#13;\n    tools=[create_pptx, create_excel],&#13;\n    system_prompt=\"You are a document-generation assistant.\",&#13;\n    middleware=[SkillMiddleware()],&#13;\n)<\/code><\/pre>\n<p class=\"wp-block-paragraph\">9. Ask for a slide deck. The agent should load <code>pptx_builder<\/code>, draft the outline, and pick a theme.<\/p>\n<pre class=\"wp-block-code\"><code>result = agent.invoke(&#13;\n    {&#13;\n        \"messages\": [&#13;\n            {&#13;\n                \"role\": \"user\",&#13;\n                \"content\": \"Make a slide pitch deck for a startup that sells eco-friendly reusable coffee cups. Use a green theme and a clean font.\",&#13;\n            }&#13;\n        ]&#13;\n    }&#13;\n)&#13;\nprint(result[\"messages\"][-1].content)<\/code><\/pre>\n<pre class=\"wp-block-preformatted\">Done, I created the pitch deck here: <br\/>`outputs\/Eco-Friendly_Reusable_Coffee_Cups_Pitch_Deck.pptx` <br\/>It uses a green theme and a clean font.<\/pre>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image-3-f98bs1-scaled.webp\" alt=\"Presentation slides for a reusable coffee cup startup\"\/>&#13;<figcaption class=\"wp-element-caption\">Look at the outputs folder and open the PPT to see what the agent has created<\/figcaption>&#13;<br \/>\n<\/figure>\n<\/div>\n<p class=\"wp-block-paragraph\">10. Let\u2019s task the agent to make a spreadsheet.<\/p>\n<pre class=\"wp-block-code\"><code>result = agent.invoke(&#13;\n    {&#13;\n        \"messages\": [&#13;\n            {&#13;\n                \"role\": \"user\",&#13;\n                \"content\": \"Build a spreadsheet tracking Q1-Q4 revenue and expenses for a small bakery\",&#13;\n            }&#13;\n        ]&#13;\n    }&#13;\n)&#13;\nprint(result[\"messages\"][-1].content)<\/code><\/pre>\n<pre class=\"wp-block-preformatted\">Done, your spreadsheet is ready: `outputs\/bakery_q1_q4_revenue_expenses.xlsx`<\/pre>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2026\/08\/image-4-f98bs1.webp\" alt=\"Quarterly financial performance table for a bakery\"\/><\/figure>\n<\/div>\n<h2 id=\"h-conclusion\" class=\"wp-block-heading\">Conclusion<\/h2>\n<p class=\"wp-block-paragraph\">Skills won\u2019t make your agent smarter: <em>they make it more organized<\/em>. By loading detailed instructions only when needed, you can teach one agent dozens of specialized behaviors without bloating its prompt or spinning up a sub-agent for every task. Start with one skill, then add more as needs surface.<\/p>\n<p class=\"wp-block-paragraph\"><strong>Read more:<\/strong> <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2026\/06\/build-an-ai-voice-agent-with-langchain\/\" target=\"_blank\" rel=\"noreferrer noopener\">Build an Emergency Helpline Voice Agent with LangChain<\/a><\/p>\n<h2 id=\"h-frequently-asked-questions\" class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n<div class=\"schema-faq wp-block-yoast-faq-block\">\n<div id=\"faq-question-1786949541470\" class=\"schema-faq-section\"><strong class=\"schema-faq-question\">Q1. Is LangChain the only way to use skills?<\/strong><\/p>\n<p class=\"schema-faq-answer\">A. No, other frameworks provide similar patterns, and you can implement skills from scratch without a framework at all. It\u2019s just a tool plus some prompts.<\/p>\n<\/div>\n<div id=\"faq-question-1786949541607\" class=\"schema-faq-section\"><strong class=\"schema-faq-question\">Q2. Do skills cost an extra API call?<\/strong><\/p>\n<p class=\"schema-faq-answer\">A. Yes, one the model calls <code>load_skill<\/code> as a regular tool, which is one extra round trip before it drafts the real answer.<\/p>\n<\/div>\n<div id=\"faq-question-1786949541744\" class=\"schema-faq-section\"><strong class=\"schema-faq-question\">Q3. Can one request use more than one skill?<\/strong><\/p>\n<p class=\"schema-faq-answer\">A. Yes, the agent can call <code>load_skill<\/code> multiple times in the same run if the request spans more than one specialty.<\/p>\n<\/div>\n<\/div>\n<div class=\"border-top py-3 author-info my-4\">\n<div class=\"author-card d-flex align-items-center\">\n<div class=\"flex-shrink-0 overflow-hidden\">\n                                    <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/author\/mounish12439\/\" class=\"text-decoration-none active-avatar\"><br \/>\n                                                                       <img decoding=\"async\" src=\"https:\/\/av-eks-lekhak.s3.amazonaws.com\/media\/lekhak-profile-images\/converted_image_ZFxQ96b.webp\" width=\"48\" height=\"48\" alt=\"Mounish V\" loading=\"lazy\" class=\"rounded-circle\"\/><br \/>\n                                                                <\/a>\n                                <\/div>\n<\/p><\/div>\n<p>Passionate about technology and innovation, a graduate of Vellore Institute of Technology. Currently working as a Data Science Trainee, focusing on Data Science. Deeply interested in Deep Learning and Generative AI, eager to explore cutting-edge techniques to solve complex problems and create impactful solutions.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<p><h4 class=\"fs-24 text-dark\">Login to continue reading and enjoy expert-curated content.<\/h4>\n<p>                        <button class=\"btn btn-primary mx-auto d-table\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModal\" id=\"readMoreBtn\">Keep Reading for Free<\/button>\n                    <\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Ever wondered how ChatGPT, Gemini, and other chat interfaces generate PDFs, PowerPoints, and more when all they have under the hood is an LLM? The trick isn\u2019t a smarter model. It\u2019s something simpler:\u00a0skills which are instructions an agent loads only when needed. Next, let\u2019s explore how skills work using LangChain and how they can make [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7042804,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[11530,5293,38923,11020,37075,155392,3910],"dealstore":[],"offerexpiration":[],"class_list":["post-7042803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-agents","tag-build","tag-excel","tag-generate","tag-langchain","tag-ppts","tag-skills"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Build AI Agents with LangChain Skills: Generate PPTs &amp; Excel - Som2ny Network<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fivemor.com\/?p=7042803\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build AI Agents with LangChain Skills: Generate PPTs &amp; Excel - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"Ever wondered how ChatGPT, Gemini, and other chat interfaces generate PDFs, PowerPoints, and more when all they have under the hood is an LLM? The trick isn\u2019t a smarter model. It\u2019s something simpler:\u00a0skills which are instructions an agent loads only when needed. Next, let\u2019s explore how skills work using LangChain and how they can make [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=7042803\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-20T13:32:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1386\" \/>\n\t<meta property=\"og:image:height\" content=\"752\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=7042803#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=7042803\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Build AI Agents with LangChain Skills: Generate PPTs &#038; Excel\",\"datePublished\":\"2026-08-20T13:32:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=7042803\"},\"wordCount\":791,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=7042803#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp\",\"keywords\":[\"agents\",\"Build\",\"Excel\",\"generate\",\"LangChain\",\"PPTs\",\"Skills\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=7042803#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=7042803\",\"url\":\"https:\/\/fivemor.com\/?p=7042803\",\"name\":\"Build AI Agents with LangChain Skills: Generate PPTs & Excel - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=7042803#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=7042803#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp\",\"datePublished\":\"2026-08-20T13:32:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=7042803#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=7042803\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=7042803#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp\",\"width\":1386,\"height\":752},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=7042803#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build AI Agents with LangChain Skills: Generate PPTs &#038; Excel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fivemor.com\/#website\",\"url\":\"https:\/\/fivemor.com\/\",\"name\":\"Som2ny Network\",\"description\":\"Daily Deals\",\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fivemor.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fivemor.com\/#organization\",\"name\":\"Som2ny Network\",\"url\":\"https:\/\/fivemor.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"width\":300,\"height\":86,\"caption\":\"Som2ny Network\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/fivemor.com\"],\"url\":\"https:\/\/fivemor.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Build AI Agents with LangChain Skills: Generate PPTs & Excel - Som2ny Network","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fivemor.com\/?p=7042803","og_locale":"en_US","og_type":"article","og_title":"Build AI Agents with LangChain Skills: Generate PPTs & Excel - Som2ny Network","og_description":"Ever wondered how ChatGPT, Gemini, and other chat interfaces generate PDFs, PowerPoints, and more when all they have under the hood is an LLM? The trick isn\u2019t a smarter model. It\u2019s something simpler:\u00a0skills which are instructions an agent loads only when needed. Next, let\u2019s explore how skills work using LangChain and how they can make [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=7042803","og_site_name":"Som2ny Network","article_published_time":"2026-08-20T13:32:08+00:00","og_image":[{"width":1386,"height":752,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp","type":"image\/webp"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=7042803#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=7042803"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Build AI Agents with LangChain Skills: Generate PPTs &#038; Excel","datePublished":"2026-08-20T13:32:08+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=7042803"},"wordCount":791,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=7042803#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp","keywords":["agents","Build","Excel","generate","LangChain","PPTs","Skills"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=7042803#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=7042803","url":"https:\/\/fivemor.com\/?p=7042803","name":"Build AI Agents with LangChain Skills: Generate PPTs & Excel - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=7042803#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=7042803#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp","datePublished":"2026-08-20T13:32:08+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=7042803#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=7042803"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=7042803#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/08\/Generated-Image-August-17-2026-4_49PM.webp.webp","width":1386,"height":752},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=7042803#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Build AI Agents with LangChain Skills: Generate PPTs &#038; Excel"}]},{"@type":"WebSite","@id":"https:\/\/fivemor.com\/#website","url":"https:\/\/fivemor.com\/","name":"Som2ny Network","description":"Daily Deals","publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fivemor.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/fivemor.com\/#organization","name":"Som2ny Network","url":"https:\/\/fivemor.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","width":300,"height":86,"caption":"Som2ny Network"},"image":{"@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","caption":"admin"},"sameAs":["https:\/\/fivemor.com"],"url":"https:\/\/fivemor.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/7042803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7042803"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/7042803\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/7042804"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7042803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7042803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7042803"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=7042803"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=7042803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}