Emc
aklofas/kicad-happy
EMC pre-compliance risk analysis for KiCad PCB designs — 18 check categories, 44 rule IDs covering ground planes, decoupling, I/O filtering, switching harmonics, clock routing, differential pair…
Patterns, gotchas, and conventions for threading changes through LemonadeClient, its callers, and the GAIA test suite.
$ npx skills add amd/gaia --skill lemonade-client-patterns -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install amd/gaia lemonade-client-patterns --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/amd/gaia.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/lemonade-client-patterns .claude/skills/lemonade-client-patterns && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "lemonade-client-patterns" agent skill from https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patterns into .claude/skills/lemonade-client-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lemonade-client-patterns", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patternsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add amd/gaia --skill lemonade-client-patterns -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install amd/gaia lemonade-client-patterns --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/amd/gaia.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/lemonade-client-patterns .agents/skills/lemonade-client-patterns && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "lemonade-client-patterns" agent skill from https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patterns into .agents/skills/lemonade-client-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lemonade-client-patterns", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add amd/gaia --skill lemonade-client-patterns -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install amd/gaia lemonade-client-patterns --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/amd/gaia.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/lemonade-client-patterns .cursor/skills/lemonade-client-patterns && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "lemonade-client-patterns" agent skill from https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patterns into .cursor/skills/lemonade-client-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lemonade-client-patterns", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/amd/gaia.git --path .claude/skills/lemonade-client-patterns--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add amd/gaia --skill lemonade-client-patterns -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install amd/gaia lemonade-client-patterns --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/amd/gaia.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/lemonade-client-patterns .gemini/skills/lemonade-client-patterns && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "lemonade-client-patterns" agent skill from https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patterns into .gemini/skills/lemonade-client-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lemonade-client-patterns", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install amd/gaia lemonade-client-patternsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add amd/gaia --skill lemonade-client-patterns -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/amd/gaia.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/lemonade-client-patterns .github/skills/lemonade-client-patterns && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "lemonade-client-patterns" agent skill from https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patterns into .github/skills/lemonade-client-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lemonade-client-patterns", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add amd/gaia --skill lemonade-client-patterns -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install amd/gaia lemonade-client-patterns --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/amd/gaia.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/lemonade-client-patterns .opencode/skills/lemonade-client-patterns && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "lemonade-client-patterns" agent skill from https://github.com/amd/gaia/tree/main/.claude/skills/lemonade-client-patterns into .opencode/skills/lemonade-client-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lemonade-client-patterns", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
lemonade-client-patternsPatterns, gotchas, and conventions for threading changes through LemonadeClient, its callers, and the GAIA test suite.
Lemonade Client Patterns is an agent skill from amd/gaia. Patterns, gotchas, and conventions for threading changes through LemonadeClient, its callers, and the GAIA test suite. Apply when modifying lemonadeclient.py, its providers, VLMClient, UI routers, or any file that calls Lemonade HTTP endpoints.
Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Test generation. The repository describes itself as: Build AI agents for your PC. The licence is MIT.
Read from SKILL.md and the folder at commit 6c3bb5c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitpythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
LEMONADE_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Lemonade Client Patterns loads about 2.5k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 1,050 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from amd/gaia at commit 6c3bb5c, republished under its MIT licence (© amd). 1,050 words, ~2,458 tokens.
.claude/skills/lemonade-client-patterns/SKILL.md (or your agent's skills folder).src/gaia/llm/lemonade_client.py is GAIA's primary Lemonade HTTP client. Changes to its interface ripple through LemonadeProvider, VLMClient, Agent UI routers, _chat_helpers.py, server.py, and agents/base/agent.py. The test suite mixes responses (for requests-based calls) and mocker.patch on httpx (for async calls).
_send_requestLemonadeClient has a central _send_request, but several call sites bypass it with a
direct requests.post (non-streaming chat/completions, the responses API, and the SSE
endpoints), plus OpenAI(...) constructor sites. Any change that must affect ALL outbound
calls (e.g. adding an auth header) has to reach every one of them.
Enumerate them, don't trust a count — the set grows, and a stale number here is exactly the miss this section exists to prevent:
grep -n "requests\.post\|requests\.get\|OpenAI(" src/gaia/llm/lemonade_client.py__init__create_lemonade_client() at the bottom of lemonade_client.py is a convenience factory. When adding a new LemonadeClient.__init__ parameter, update the factory to accept and forward it, or callers that use the factory won't pick up the new param.
It is a public SDK surface that real user paths reach. In-tree callers: __main__, the
client's own tests, the flagship sidecar's warm-up turn
(hub/agents/gaia/python/gaia_agent/server.py) and the audio tools' transcript-refinement
LLM (src/gaia/agents/tools/audio_tools.py). Both of those pass no host/port, so a
change to how the factory resolves the server address changes audio transcription
and the flagship's warm-up (#3558).
Helpers shared across packages (vlm_client.py, ui/routers/system.py, ui/_chat_helpers.py, ui/server.py, agents/base/agent.py) must be public-named (no leading _). Leading underscore signals "package-internal" and creates confusion. Precedent: system.py already imports DEFAULT_CONTEXT_SIZE from lemonade_client.
agents/base/agent.py — mostly deferred imports, but not Lemonade-freeagent.py imports a few constants and helpers from gaia.llm.lemonade_client at module level (DEFAULT_MODEL_NAME, the ctx-budget helpers) and CONNECTION_FAILURE_RE from gaia.llm.providers.lemonade, so importing the base Agent already loads lemonade_client. Everything else (LemonadeClient, LemonadeManager, cloud_model_provider, …) is imported inside the methods that use it. Keep new Lemonade-specific behavior behind those deferred imports, and keep lemonade_client cheap to import, since every agent pays for it.
VLMClient forwards api_key= raw to LemonadeClient, which does the single canonical resolution. VLMClient has no direct HTTP calls (delegates everything to self.client), so pre-resolving env vars there violates single-source-of-truth.
response.textMisconfigured reverse proxies can reflect the Authorization header back in a 401 response body. If response.text is included in a user-visible error message, the API key leaks to CLI output, logs, and bug reports. Always use a fixed-string 401 error that names LEMONADE_API_KEY without including the response body.
openai.AuthenticationError is NOT a subclass of openai.APIError in openai>=1.0. It must be caught separately, and the except openai.AuthenticationError: branch MUST come BEFORE the generic except (openai.APIError, openai.APIConnectionError, openai.RateLimitError) branch — Python evaluates except clauses in order and AuthenticationError would otherwise fall through to the generic one. Never include str(e) from an OpenAI exception (the SDK may stringify the request including the Authorization header).
src/gaia/llm/lemonade_client.py — Primary client; _send_request is the central chokepoint, but direct requests.post bypass sites exist (grep for them — see above)src/gaia/llm/providers/lemonade.py — LemonadeProvider.__init__ uses backend_kwargs dict to forward to LemonadeClient; add new params with if param is not None: backend_kwargs["param"] = paramsrc/gaia/llm/vlm_client.py — VLMClient.__init__ uses deferred import of LemonadeClientsrc/gaia/ui/routers/system.py — already imports DEFAULT_CONTEXT_SIZE from lemonade_client (established cross-package import precedent)src/gaia/ui/_chat_helpers.py — 4 Lemonade-bound httpx call sites: auto-title POST (~337), health GET (~1006, ~1058), stats GET (~2289). (Line numbers drift — grep the call, don't trust the offset.)src/gaia/ui/server.py — 2 health probe httpx GET sites (~299, ~311)src/gaia/agents/base/agent.py — _is_loaded_ctx_too_small() is the reference for the deferred pattern (lemonade_client and LemonadeManager imported inside the method)tests/unit/test_lemonade_client_http.py — mocked HTTP via the responses library (TestLemonadeClientMock); _mock_cold_load / _assert_one_load answer and check the pre-request ctx loadtests/test_lemonade_client.py — live-server TestLemonadeClientIntegration only (CI selects it with -k Integration)docs/.env.example — This is a Mintlify/docs-proxy config file, NOT GAIA's env var file. GAIA env vars go in .env.example at the repo root.lemonade_client.py as public module-level functions (single source of truth)value.strip() or Noneapi_key=self.api_key or "lemonade" placeholder when unauthenticated — the SDK rejects None/"" with OpenAIError; Lemonade ignores the placeholder value{"Authorization": f"Bearer {api_key}"} — omit the header entirely when key is None (don't send Bearer )self.log.debug("Lemonade API key configured") — NEVER log the valueWhen a class uses deferred imports (import inside __init__ or a method body), patching via the IMPORTING module fails with AttributeError. Patch at the SOURCE module where the symbol is defined.
Wrong: mocker.patch("gaia.llm.vlm_client.LemonadeClient") (deferred import; the name doesn't exist at module level)
Right: mocker.patch("gaia.llm.lemonade_client.LemonadeClient") (patches the definition, affects all users)
assertLogs doesn't escalate child logger levelsself.assertLogs("gaia", level=logging.DEBUG) does NOT force child loggers like gaia.llm.lemonade_client to DEBUG — they inherit their configured level. To capture DEBUG messages from a specific child logger in tests:
lc_logger = logging.getLogger("gaia.llm.lemonade_client")
original_level = lc_logger.level
lc_logger.setLevel(logging.DEBUG)
try:
with self.assertLogs("gaia", level=logging.DEBUG) as cm:
# ... test body
finally:
lc_logger.setLevel(original_level)Tests that call SSE-generating methods (pull_model, load_model) via responses library will block forever on iter_lines() unless the mock body is a complete SSE event ending with \n\n:
responses.add(
responses.POST, f"{base_url}/pull",
body=b"event: complete\ndata: {}\n\n",
content_type="text/event-stream",
stream=True,
)
gen = client.pull_model("model")
next(gen) # consume one item; don't iterate fully or it blocks_ensure_model_loaded makes its own network callsIn test_401_does_not_trigger_auto_download_retry-style tests, forgetting to mock _ensure_model_loaded causes the test to fail because _ensure_model_loaded itself calls get_status() → list_models(), which makes HTTP requests that can trigger model loading. Always patch _ensure_model_loaded when testing chat_completions error paths. On happy paths, answer it instead (_mock_cold_load) and assert the /load body (model_name, ctx_size, llamacpp_args) — patching it away hides the load the user actually triggers.
maintests/unit/test_lemonade_client_http.py (formerly the mock class in tests/test_lemonade_client.py) has historically carried a few failures unrelated to any
given change (model-name drift, removed kwargs, deprecated APIs). Do not work from a
remembered list — a test that was broken last month may have been fixed since, and
dismissing it as "pre-existing" would hide a real regression you just introduced.
Confirm empirically for each failing test, every time:
git stash && python -m pytest tests/unit/test_lemonade_client_http.py::<Class>::<test> -x; git stash popFails on a clean main too → pre-existing. Passes there → you broke it.
docs/.env.example is NOT the GAIA env vars filedocs/.env.example is a Mintlify/docs-proxy configuration file. GAIA env variable documentation belongs in .env.example at the repo root.
Follow CLAUDE.md → How You Communicate: lead with
the plain-language outcome ("auth headers now reach every Lemonade call site"), then layer
the file.py:line detail underneath. Say each point once.
© amd, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/lemonade-client-patterns of amd/gaia.
Open the folder on GitHubat commit 6c3bb5c
Lemonade Client Patterns next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Lemonade Client Patterns this skillamd/gaia | 1.6k | — | ~2.5k | Automated safety check: Pass | MIT | |
| Emcaklofas/kicad-happy | 1.3k | 1 repos | ~2.8k | Automated safety check: Pass | MIT | |
| Swig Testswig/swig | 6.3k | — | ~2.3k | Automated safety check: Pass | Custom licence | |
| Generate Test Cases342164796/generate-test-cases | 119 | 1 repos | ~2.9k | Automated safety check: Pass | None | |
| Verify Cc Safety Netkenryu42/cc-safety-net | 1.6k | — | ~2k | Automated safety check: Pass | MIT | |
| Wioworkersio/skills | 180 | — | ~5.8k | Automated safety check: Pass | MIT |
aklofas/kicad-happy
EMC pre-compliance risk analysis for KiCad PCB designs — 18 check categories, 44 rule IDs covering ground planes, decoupling, I/O filtering, switching harmonics, clock routing, differential pair…
swig/swig
Run SWIG test suite for specific languages. An agent skill from swig/swig.
342164796/generate-test-cases
自主学习型测试文档生成器。从需求文档(Markdown)生成测试用例 XMind 文件,支持持久化记忆和持续学习。当用户提到"生成测试用例"、"根据需求生成测试"时触发。
kenryu42/cc-safety-net
Launch and drive the real cc-safety-net CLI — the hook decision path, explain, status/doctor, logs, and the local policy GUI — against an isolated home, capturing evidence.
workersio/skills
Testing workflow skill for finding high-value test candidates, writing focused tests, generating realistic workloads, reviewing test value, and diagnosing test-suite health.
microsoft/WindowsProtocolTestSuites
ALWAYS LOAD THIS SKILL when working with FileServer, SMB, SMB2, SMB3, CIFS, file sharing, MS-SMB2, MS-FSCC, MS-FSA, MS-DFSC, MS-FSRVP, MS-RSVD, MS-SQOS, or any file server protocol test…
amd/gaia
Adds a release eval scorecard to a GAIA hub agent by writing a harness adapter, running a real eval, and wiring the result into the agent's README and release gate.
amd/gaia
Walks through releasing a GAIA sidecar agent as a frozen binary plus npm client through the tag-triggered Agent Hub CI pipeline, with a human gate before publishing.
amd/gaia
Mines local Claude Code session transcripts with a deterministic Python pipeline to show what the agent is actually used for, how often it fails and what it costs.
amd/gaia
Benchmarks AMD's GAIA agent against Claude Code and across models on quality, honesty, steps, tokens, time and real cost, using gaia eval tasks.
amd/gaia
Guides safe code changes by finding the right file with grep or semantic search, reading before editing, reproducing bugs first, and proving a fix with a real test run.
amd/gaia
Walks through scaffolding, writing and testing a new GAIA agent as a Python class with the SDK, from the base Agent subclass to registered tool methods.
Categories
Patterns, gotchas, and conventions for threading changes through LemonadeClient, its callers, and the GAIA test suite. Lemonade Client Patterns is an agent skill from amd/gaia. Patterns, gotchas, and conventions for threading changes through LemonadeClient, its callers, and the GAIA test suite.
Lemonade Client Patterns fits situations like: tasks that involve Test generation.
Run `npx skills add amd/gaia --skill lemonade-client-patterns -a claude-code`. Or copy the skill folder (.claude/skills/lemonade-client-patterns in amd/gaia) into .claude/skills/lemonade-client-patterns in your project. Claude Code loads it when a task matches its description.
Run `npx skills add amd/gaia --skill lemonade-client-patterns -a codex`. Or copy the skill folder (.claude/skills/lemonade-client-patterns in amd/gaia) into .agents/skills/lemonade-client-patterns in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add amd/gaia --skill lemonade-client-patterns -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/lemonade-client-patterns, .gemini/skills/lemonade-client-patterns, .github/skills/lemonade-client-patterns and .opencode/skills/lemonade-client-patterns in your project.
Going by SKILL.md and its folder, Lemonade Client Patterns needs the command-line tools its instructions call (git and python) and credentials named LEMONADE_API_KEY. Our summary lists: Python 3; A credential in LEMONADE_API_KEY.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Lemonade Client Patterns is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.5k tokens (SKILL.md is roughly 9.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Lemonade Client Patterns: Emc (aklofas/kicad-happy, 1.3k stars), Swig Test (swig/swig, 6.3k stars), Generate Test Cases (342164796/generate-test-cases, 119 stars) and Verify Cc Safety Net (kenryu42/cc-safety-net, 1.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
amd (a GitHub organization) maintains it in amd/gaia, which has 1,580 GitHub stars. The repository holds 44 skills in this directory. The repository was last updated on October 6, 2026.
Source: amd/gaia on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.