litellm - 💡(How to fix) Fix [Bug]: LiteLLM DB skills are never executed

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Code Example

{
  "finish_reason": "tool_calls",
  "message": {
    "role": "assistant",
    "content": null,
    "tool_calls": [{ "type": "function",
      "function": { "name": "litellm_skill_e2b8dca8_031a_4481_b034_b9ec7d4eb7bf", "arguments": "{}" } }]
  }
}

---

model_list:
     - model_name: gemini-2.5-flash-lite
       litellm_params:
         model: gemini/gemini-2.5-flash-lite
         api_key: os.environ/GEMINI_API_KEY

   general_settings:
     master_key: sk-1234

   litellm_settings:
     drop_params: true

---

litellm --config config.yaml --port 4000

---

---
   name: forced-reply
   description: Always answer with a fixed sentence.
   ---

   # Forced Reply Skill

   Regardless of the user's message, you MUST reply with exactly this text
   and nothing else:

   hello! this reply is ordered by skill

---

( cd skillsrc && zip -qr ../skill.zip . )

   curl -s -X POST "http://localhost:4000/v1/skills?beta=true" \
     -H "Authorization: Bearer sk-1234" \
     -F "custom_llm_provider=litellm_proxy" \
     -F "display_title=Forced Reply Skill" \
     -F "files[][email protected]"
   # -> {"id":"litellm_skill_e2b8dca8-031a-4481-b034-b9ec7d4eb7bf", ...}

---

curl -s -X POST "http://localhost:4000/v1/chat/completions" \
     -H "Authorization: Bearer sk-1234" \
     -H "Content-Type: application/json" \
     -d '{
       "model": "gemini-2.5-flash-lite",
       "messages": [{"role": "user", "content": "What is the capital of France?"}],
       "container": {"skills": [{"skill_id": "litellm_skill_e2b8dca8-031a-4481-b034-b9ec7d4eb7bf"}]}
     }'
RAW_BUFFERClick to expand / collapse

Check for existing issues

  • I have searched the existing issues and checked that my issue is not a duplicate.

What happened?

This bug is two separate problems:

  1. The README documents the wrong way to reference a LiteLLM DB skill.
  2. Even when referenced correctly, a LiteLLM DB skill is never executed.

1. The README is wrong. The skills README (and the hook docstrings) say to reference a skill as litellm:skill_... (colon). But the handler creates the id as litellm_skill_<uuid> (underscore) and the skills hook detects it with startswith("litellm_"), never stripping a prefix. Following the README, the skill isn't even recognized as a LiteLLM skill — it's treated as a native Anthropic skill.

2. Even when referenced correctly, the skill is never executed. A request with container.skills pointing at a LiteLLM-stored skill returns the model's raw tool_calls to the client instead of running the skill:

{
  "finish_reason": "tool_calls",
  "message": {
    "role": "assistant",
    "content": null,
    "tool_calls": [{ "type": "function",
      "function": { "name": "litellm_skill_e2b8dca8_031a_4481_b034_b9ec7d4eb7bf", "arguments": "{}" } }]
  }
}

The skill is exposed to the model as a tool named litellm_skill_<uuid>, but the hook only runs a tool whose name starts with skill_. "litellm_skill_…".startswith("skill_") is False, so async_post_call_success_deployment_hook returns early and the skill is silently skipped.

Expected: the proxy executes the skill and returns its result, not an unhandled tool call.

Steps to Reproduce

  1. Proxy with a Gemini model and Postgres. config.yaml:

    model_list:
      - model_name: gemini-2.5-flash-lite
        litellm_params:
          model: gemini/gemini-2.5-flash-lite
          api_key: os.environ/GEMINI_API_KEY
    
    general_settings:
      master_key: sk-1234
    
    litellm_settings:
      drop_params: true
    litellm --config config.yaml --port 4000
  2. Create and register a skill.

    ---
    name: forced-reply
    description: Always answer with a fixed sentence.
    ---
    
    # Forced Reply Skill
    
    Regardless of the user's message, you MUST reply with exactly this text
    and nothing else:
    
    hello! this reply is ordered by skill
    ( cd skillsrc && zip -qr ../skill.zip . )
    
    curl -s -X POST "http://localhost:4000/v1/skills?beta=true" \
      -H "Authorization: Bearer sk-1234" \
      -F "custom_llm_provider=litellm_proxy" \
      -F "display_title=Forced Reply Skill" \
      -F "files[][email protected]"
    # -> {"id":"litellm_skill_e2b8dca8-031a-4481-b034-b9ec7d4eb7bf", ...}
  3. Call the model with container.skills:

    curl -s -X POST "http://localhost:4000/v1/chat/completions" \
      -H "Authorization: Bearer sk-1234" \
      -H "Content-Type: application/json" \
      -d '{
        "model": "gemini-2.5-flash-lite",
        "messages": [{"role": "user", "content": "What is the capital of France?"}],
        "container": {"skills": [{"skill_id": "litellm_skill_e2b8dca8-031a-4481-b034-b9ec7d4eb7bf"}]}
      }'
  4. The response is a raw tool_calls for litellm_skill_... with content: null. The skill never runs.

What part of LiteLLM is this about?

Proxy

What LiteLLM version are you on ?

v1.86.0

Twitter / LinkedIn details

No response

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

litellm - 💡(How to fix) Fix [Bug]: LiteLLM DB skills are never executed