# We implemented Anthropic's Skills approach using LangChain v1, feedbacks

**URL:** <https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126>\
**Category:** LangChain\
**Tags:** product-feedback, python-help\
**Created:** [November 7, 2025, 10:02am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126 "2025-11-07T10:02:40Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Batiste](https://avatars.discourse-cdn.com/v4/letter/b/a88e4f/32.png) [@Batiste](https://forum.langchain.com/u/Batiste)\
**Post date:** [November 7, 2025, 10:02am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/1 "2025-11-07T10:02:40Z")

</div>

Hi,

The explanation for the project and the code is here : [Building Claude-Style Skills in LangChain v1](https://www.linkedin.com/pulse/building-claude-style-skills-langchain-v1-batiste-roger-e5pdf)

Feedback I’d like to share:

- It is confusing that create\_agent requires all tools to be defined upfront.
- I was surprised to see that the State has to be defined in the middleware. Maybe the docs for LangChain v1 could explain why that is the case in greater details, and how to leverage this.
- The types and objects we use there (runtime, request, handler) were quite a headache. Sometimes I was wondering where I had to get the state from, etc… Somehow I think the concept of State is less important in v1 than in v0.x, but it creates a bit of complexity.

This is the first project I do in plain v1 from scratch, so this might be the normal learning curve.

I hope this feedback helps,

Have fun !

---

<div class="post-metadata">

**Author:** ![eyurtsev](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/eyurtsev/32/125_2.png) [@eyurtsev](https://forum.langchain.com/u/eyurtsev)\
**Post date:** [November 7, 2025, 7:22pm UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/2 "2025-11-07T19:22:19Z")

</div>

- It is confusing that create\_agent requires all tools to be defined upfront.

We might relax this requirement in the future. It hasn’t come up in the past as a feature that folks need.

- I was surprised to see that the State has to be defined in the middleware. Maybe the docs for LangChain v1 could explain why that is the case in greater details, and how to leverage this

It doesn’t have to be, you can define provide state as a parameter to create\_agent.

- The types and objects we use there (runtime, request, handler) were quite a headache. Sometimes I was wondering where I had to get the state from, etc… Somehow I think the concept of State is less important in v1 than in v0.x, but it creates a bit of complexity.

The request and handler were introduced to raise the ceiling of what can be done in the hook (e.g., retries, rate limiting, fallbacks, short-circuiting, caches, running requests in **parallel** with different models). All of this functionality is enabled by request and handler. So the ceiling in terms of what you can do is very high here!

What would you suggest we improve or which parts did you not like in this API?

---

<div class="post-metadata">

**Author:** ![rhlarora84](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/rhlarora84/32/1578_2.png) [@rhlarora84](https://forum.langchain.com/u/rhlarora84)\
**Post date:** [November 11, 2025, 1:15am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/3 "2025-11-11T01:15:16Z")

</div>

_“We might relax this requirement in the future. It hasn’t come up in the past as a feature that folks need.”_

Please see my comment on [Are dynamic tool lists allowed when using create\_agent? - #8 by rhlarora84](https://forum.langchain.com/t/are-dynamic-tool-lists-allowed-when-using-create-agent/1920/8)

---

<div class="post-metadata">

**Author:** ![Batiste](https://avatars.discourse-cdn.com/v4/letter/b/a88e4f/32.png) [@Batiste](https://forum.langchain.com/u/Batiste)\
**Post date:** [November 12, 2025, 9:57am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/4 "2025-11-12T09:57:02Z")

</div>

Apart from allowing tools declaration/discovery mid-run, I think most of what can be improved is related to the docs and examples. If you can nail those, then the API is pretty well designed. I simply wanted to share how it felt (for me) right now - it doesn’t necessarily mean you made incorrect choices. 😉 Thanks for answering.

---

<div class="post-metadata">

**Author:** ![clafoutis](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/clafoutis/32/1769_2.png) [@clafoutis](https://forum.langchain.com/u/clafoutis)\
**Post date:** [November 27, 2025, 5:07pm UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/5 "2025-11-27T17:07:45Z")

</div>

_“We might relax this requirement in the future. It hasn’t come up in the past as a feature that folks need.”_

How? Are people really compiling each time a user talk to their agents? This very issue is preventing my company from migrating to langchain v1 ☹

Is there a workaround for this?

---

<div class="post-metadata">

**Author:** ![Batiste](https://avatars.discourse-cdn.com/v4/letter/b/a88e4f/32.png) [@Batiste](https://forum.langchain.com/u/Batiste)\
**Post date:** [November 28, 2025, 8:46am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/6 "2025-11-28T08:46:55Z")

</div>

The only one I can think of is using a real Claude Skill approach where you basically have only one tool (command line) and this command line tool calls your other tools. This is really not something I advize you to do (since mistakes are likely), but until langchain moves… I don’t know.

@rhlarora84 any news on this ?

---

<div class="post-metadata">

**Author:** ![charlesmichau](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/charlesmichau/32/1958_2.png) [@charlesmichau](https://forum.langchain.com/u/charlesmichau)\
**Post date:** [December 17, 2025, 11:00am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/7 "2025-12-17T11:00:34Z")

</div>

Thanks @Batiste for the really interesting write-up.

I’d also like to have a “skill-like” setup with Langchain, but my issue is that in this approach, the LLM will typically use many more iterations (bash “ls …”, bash “cat…”, etc), which increases the cost very quickly as each call typically bills the whole input history.

How do you handle this issue ? Do you manually manipulate the history to have reduced input tokens for these small iterative steps ? Or do you use caching / Claude sessions ?

---

<div class="post-metadata">

**Author:** ![miniboxhaha](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/miniboxhaha/32/2200_2.png) [@miniboxhaha](https://forum.langchain.com/u/miniboxhaha)\
**Post date:** [January 20, 2026, 1:54am UTC](https://forum.langchain.com/t/we-implemented-anthropics-skills-approach-using-langchain-v1-feedbacks/2126/8 "2026-01-20T01:54:58Z")

</div>

hi. I learned a lot from it.  
and what i think the diff between langchain and cloude

1. form langchain skills doc demo, skills organization more like code, not file system.  
it lack of Infrastructure tools for skills architecture  
For example，to load skills from file system, i have to write a tool name **load\_skills** , inside the tool , use Programming Language api read it  
for same reason, there is a tool use for call local script in command line way. how to write command and args can be describe in skill content

```javascript
const load_skills = tool(
    async ({ skill_file_path }) => {
        try {
            return readFileSync(skill_file_path, 'utf8');
        } catch (error) {
            return `${skill_file_path} not found`
        }
    },
    {
        name: "load_skills",
        description: "load_skills",
        schema: z.object({
            skill_file_path: z.string().describe("path"),
        }),
    }
)

```

1. i can tell skills when there is some thing wrong, use **throw\_error** tool.  
but, in **throw\_error** when use **interrupt** func, i wish command goto can set **throw\_error**. but in createAgent, it not. i have to set goto to START. that make context hard to management
