Agent skill

Local AI App Integration

by amd in amd/skills

Integrates local AI capabilities into applications using Embeddable Lemonade.

MITAuto-check passedMedia & Creative

Install Local AI App Integration

skills CLI
$ npx skills add amd/skills --skill local-ai-app-integration -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install amd/skills local-ai-app-integration --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/amd/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/local-ai-app-integration .claude/skills/local-ai-app-integration && rm -rf skills-src

Use ~/.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/

Facts

Skill name
local-ai-app-integration
GitHub stars
406
Token cost
~6k tokens
SKILL.md length
2,939 words
Files
7
Skills in repo
9
Repo updated
First seen
Licence
MIT

At a glance

Integrates local AI capabilities into applications using Embeddable Lemonade.

  • Works in 7 steps: Survey the app → Pick a model + backend profile → Place Embeddable Lemonade in the app's… → …
  • The user wants to add local AI
  • SKILL.md covers When this skill is the right…, The opinionated path, Step 1: Survey the app and Step 2: Pick a model + backend…, plus 7 more sections
  • Runs Python scripts from its folder; calls curl and pip; reaches api.github.com and lemonade-server.ai; needs LEMONADE_API_KEY and OPENAI_API_KEY

What it does

Local AI App Integration is an agent skill from amd/skills. Integrates local AI capabilities into applications using Embeddable Lemonade. Use when the user wants to add local AI, offline AI, private AI, on-device AI, a local LLM, local chat, embeddings, image generation, speech-to-text, or text-to-speech to an existing app; replace or supplement OpenAI, Anthropic, Ollama, or other cloud AI APIs with a local backend; only use to convert user apps. Do not use when the user just wants the agent itself to generate images, transcribe, or speak locally in the current workspace…

Its SKILL.md is about 6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files (for example `.federated.json`, `evals/evals.json` and `evals/files/apikey-guard/main.py`).

It sits in Media & Creative, covering Transcription, Image generation and LLM inference and serving. It works with OpenAI and Ollama. The repository describes itself as: Official AMD catalog of AI agent skills. Empower your AI agents with AMD's optimized SW stack. The licence is MIT.

When your agent uses it

  • The user wants to add local AI
  • Image generation
  • Text-to-speech to an existing app
  • Supplement OpenAI

Example prompts

  • “Use the local-ai-app-integration skill to integrate local AI capabilities into applications using Embeddable Lemonade”
  • “/local-ai-app-integration”

Requirements

  • Python 3
  • A credential in OPENAI_API_KEY
  • A credential in ANTHROPIC_API_KEY

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Survey the app
  2. Pick a model + backend profile
  3. Place Embeddable Lemonade in the app's tree and install backends
  4. Add a lemond launcher
  5. Re-point the existing client at lemond
  6. Health, backend, then pull the model — before first inference
  7. Lifecycle and recovery

What it can do on your machine

Read from SKILL.md and the folder at commit 6efb39c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships script files (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • curl
    • pip

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.github.com
    • lemonade-server.ai
    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • LEMONADE_API_KEY
    • OPENAI_API_KEY
    • ANTHROPIC_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Local AI App Integration loads about 6k tokens when it runs. Until then it costs about 144 tokens; SKILL.md has 2,939 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~144
When it runs · the whole SKILL.md, loaded when a task matches
~6k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from amd/skills at commit 6efb39c, republished under its MIT licence (© amd). 2,939 words, ~6,033 tokens.

Download SKILL.mdSave it as .claude/skills/local-ai-app-integration/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
name
local-ai-app-integration
description
Integrates local AI capabilities into applications using Embeddable Lemonade. Use when the user wants to add local AI, offline AI, private AI, on-device AI, a local LLM, local chat, embeddings, image generation, speech-to-text, or text-to-speech to an existing app; replace or supplement OpenAI, Anthropic, Ollama, or other cloud AI APIs with a local backend; only use to convert user apps. Do not use when the user just wants the agent itself to generate images, transcribe, or speak locally in the current workspace, even to cut their own API bill.

Local AI App Integration (Embeddable Lemonade)

Add a local AI mode to an existing app that already talks to a cloud AI API (OpenAI, Anthropic, or Ollama-compatible). The app launches lemond, the Embeddable Lemonade binary, as a private subprocess and the existing client talks to it on http://localhost:PORT/api/v1. The user gets local, private, hardware-optimized inference (CPU, AMD iGPU/dGPU, XDNA2 NPU) with no separate install.

What you'll end up with: one new launcher module (~30 lines), three mandatory changes to the existing HTTP client (base_url, api_key, and a 120-second HTTP timeout), one vendored binary under vendor/lemonade/.

When this skill is the right tool

Use this skill when all of the following are true:

  • The app already calls a cloud AI service over HTTP (OpenAI Chat Completions, Anthropic Messages, or Ollama).
  • The user wants that AI to run on the end-user's PC, with the AI engine bundled into the app, not as a separate user install.
  • The target platform is Windows x64 or Linux x64 (macOS embeddable is in beta).

If the user instead wants a system-wide Lemonade Server (one install, shared across apps), do not use this skill; point them at https://lemonade-server.ai/install_options.html and the standard OpenAI base URL http://localhost:13305/api/v1.

The opinionated path

This skill follows one fixed sequence. Do not deviate without a stated reason.

[ ] 1. Survey the app's current AI integration
[ ] 2. Pick a model + backend profile
[ ] 3. Place Embeddable Lemonade in the app's tree (full package, not just the binary)
[ ] 4. Add a `lemond` launcher (subprocess + API key + port + per-stage logging)
[ ] 5. Re-point the existing client at lemond (base_url, api_key, 120s timeout — all three required)
[ ] 6. Wait for /api/v1/health, install backend, then PULL the model before first use
[ ] 7. Wire shutdown and error recovery

Track progress against this checklist. Move on only when each step verifies.

Log every stage. A local integration has many silent failure points — spawn, health, backend install, model download, first inference. Without a log line at each transition, "nothing happened" is indistinguishable from "broke at stage 3." Emit one clear line per stage as you build (see Step 4); the most common dead-end in this integration — a blank result with no error — is invisible without them.


Step 1: Survey the app

Find every place the app currently calls a cloud AI API. Search the repo for:

  • openai, OpenAI(, chat.completions, responses.create
  • anthropic, Anthropic(, messages.create
  • api.openai.com, api.anthropic.com, localhost:11434 (Ollama)
  • OPENAI_API_KEY, ANTHROPIC_API_KEY

Record three things before continuing:

  1. Client library and language (e.g., openai-python, openai-node, @anthropic-ai/sdk, go-openai, raw fetch).
  2. Modalities used: text chat, tool calling, embeddings, image gen, transcription, TTS. This drives the model + backend choice in Step 2.
  3. One single place where the base URL and API key are constructed. If there isn't one, refactor to one before going further. Local-mode toggling must flip exactly one config object.
  4. Any API-key gating that blocks the app before a key is entered (onboarding walls, validators that reject empty keys, startup checks that disable AI until a key exists). Note each one — Step 5 bypasses them in local mode.

Step 2: Pick a model + backend profile

Choose one default profile based on the app's primary modality. Do not ship a buffet. Ship one good default and document how the user can override it.

App's primary needDefault modelRecipeWhy
General chat / assistantQwen3-4B-GGUFllamacppSmall, fast, good tool calling, fits 8GB systems
Coding assistantQwen2.5-Coder-7B-Instruct-GGUFllamacppStrong code, runs on iGPU
Vision / multimodal chatGemma-4-E2B-it-GGUFllamacppSmall multimodal default
NPU-first on Ryzen AILlama-3.2-3B-Instruct-Hybridryzenai-llmXDNA2 NPU on Windows
Speech-to-text (Windows)Whisper-Large-v3-TurbowhispercppOne model; probe picks NPU → iGPU/dGPU → CPU automatically
Speech-to-text (Linux NPU)whisper-v3-turbo-FLMflmLinux NPU path; falls back to whispercpp iGPU/CPU off-NPU
Text-to-speechkokoro-v1kokoroCPU-only, low latency
Image generationSDXL-Turbosd-cppSingle-step generation

For the LLM backend, default to llamacpp and let lemond pick rocm → vulkan → cpu automatically by leaving llamacpp_backend unset. Override only if the app has hard hardware requirements.

Scope: this skill selects a backend once at integration time on the developer's machine. Runtime fallback based on the end user's hardware is out of scope. Bundle vulkan as the universal fallback so the app works on any machine. If the dev machine has an NPU and the chosen recipe supports it, the skill will use the NPU backend — otherwise it falls back to vulkan.

Note: having an NPU does not mean every recipe supports NPU. Confirm the recipe/backend pair is installed or installable via GET /api/v1/system-info before committing to it. See reference.md for per-recipe decision rules.

For more options and tradeoffs, see reference.md.

Step 3: Place Embeddable Lemonade in the app's tree and install backends

Get the embeddable artifact from the latest Lemonade release:

https://github.com/lemonade-sdk/lemonade/releases/latest

Download the file matching your target OS:

  • Windows: lemonade-embeddable-{VERSION}-windows-x64.zip
  • Linux: lemonade-embeddable-{VERSION}-ubuntu-x64.tar.gz

Don't hand-build the download URL from the tag. The git tag carries a leading v (e.g. v10.8.0) but the asset filename strips it (lemonade-embeddable-10.8.0-...), so using the tag verbatim 404s. Ask the GitHub API for the asset by its stable name pattern and use the URL it returns, as below — this stays correct across version and naming changes.

First, create the target directory — it does not exist in a fresh repo:

powershell
# Windows
New-Item -ItemType Directory -Force vendor\lemonade
bash
# Linux
mkdir -p vendor/lemonade

Then download and unpack on Windows (PowerShell):

powershell
$rel = Invoke-RestMethod https://api.github.com/repos/lemonade-sdk/lemonade/releases/latest
$asset = $rel.assets | Where-Object { $_.name -like "lemonade-embeddable-*-windows-x64.zip" } | Select-Object -First 1
Invoke-WebRequest $asset.browser_download_url -OutFile lemond.zip
Expand-Archive lemond.zip -DestinationPath "$env:TEMP\lemond-unpack"
$folder = $asset.name -replace '\.zip$',''   # unpacked dir = asset name without .zip
Copy-Item -Recurse "$env:TEMP\lemond-unpack\$folder\*" vendor\lemonade\
# Sanity check: resources/ must be nested under vendor\lemonade\ (not flattened)
if (-not (Test-Path vendor\lemonade\resources\*.json)) { throw "resources/ missing — re-extract and copy again" }

On Linux (bash):

bash
URL=$(curl -s https://api.github.com/repos/lemonade-sdk/lemonade/releases/latest \
  | grep browser_download_url | grep ubuntu-x64.tar.gz | cut -d'"' -f4)
curl -L "$URL" | tar -xz --strip-components=1 -C vendor/lemonade

Copy the full package, not just the binary. The archive contains lemond[.exe], lemonade[.exe], LICENSE, and resources/. The resources/ directory is required — without it lemond starts and passes the health check but fails on every model and backend request. Copying only the binary produces a server that looks healthy but cannot function.

lemond vs lemonade CLI: lemond is the embedded server binary that ships with the app. The lemonade CLI is a separate packaging tool used only during development/build time to install backends. The same embeddable archive unpacked above already contains a matching lemonade[.exe] next to lemond[.exe], so its version aligns with the bundled lemond. Do not pip install lemonade-sdk to get it: the PyPI package is a separate, older release line whose ports, model names, and install API do not match the lemond bundled here, and mixing the two is a known source of silent version mismatches. Keep the lemonade CLI, lemond, and the backends all from the one release downloaded in this step so their versions stay aligned.

The expected layout after setup (first run + backend install). A freshly unzipped package contains only lemond[.exe], lemonade[.exe], LICENSE, and resources/ — the items below are created later, as their comments note:

vendor/lemonade/
  lemond[.exe]                     # the only binary the app ships
  LICENSE
  config.json                      # generated on first run; commit a seed copy
  resources/
    server_models.json             # do not edit; use GET /api/v1/models at runtime
    backend_versions.json
  bin/                             # backends bundled at packaging time
    llamacpp/vulkan/llama-server[.exe]
  models/                          # pre-bundled model weights (optional)
    models--unsloth--Qwen3-4B-GGUF/

server_models.json: Do not edit or rely on this file. It can be stale. The only authoritative model list is GET /api/v1/models on a running lemond instance with the backend already installed.

Bundle decisions: pick deliberately

  • Backends: Bundle llamacpp:vulkan at packaging time (works on every GPU). Install llamacpp:rocm at first run on supported AMD systems via POST /api/v1/install after probing GET /api/v1/system-info. Never ship every backend, or the artifact balloons.
  • Models: Either bundle the default model under models/ (offline install, larger installer) or pull on first run with POST /api/v1/pull (smaller installer, needs network). Pick one and document it.
  • models_dir: Set to ./models in config.json to keep weights private to the app. Leave as auto only if the user explicitly wants to share weights with other apps.

Backend install timing — two distinct paths:

Packaging time (developer machine, before bundling). Use the lemonade CLI that shipped inside vendor/lemonade/ so it matches the bundled lemond version (prefix with ./ or the full path):

vendor/lemonade/lemonade backends install llamacpp:vulkan
vendor/lemonade/lemonade backends install flm:npu    # Windows NPU path only

This bakes the backend binaries into vendor/lemonade/bin/ before the app ships. lemond does not need to be running. Use a modern lemonade CLI whose version matches the bundled lemond (the copy in the archive you unpacked works); do not pip install lemonade-sdk for it.

First-run / runtime (user's machine, after lemond is running):

http
POST /api/v1/install
{"recipe": "llamacpp", "backend": "rocm"}

Use this for hardware-specific backends (e.g. llamacpp:rocm) that cannot be bundled universally. lemond must already be running (Step 4 complete).

Step 4: Add a lemond launcher

Write the launcher as a new module named lemond_launcher.py (or lemond_launcher.<ext> for the app's language). It is a thin process supervisor. Its only jobs:

  1. Generate a fresh random API key: key = secrets.token_urlsafe(32)
  2. Pick a free localhost port: bind a socket to port 0, read back the assigned port, close it.
  3. Spawn lemond as a subprocess: subprocess.Popen([LEMOND_BIN, LEMOND_DIR, "--port", str(port)], env={**os.environ, "LEMONADE_API_KEY": key})
  4. Poll GET /api/v1/health with Authorization: Bearer {key} in a loop until HTTP 200 — this is the only correct readiness check.
  5. Expose the chosen port and key to the rest of the app.

Log one line per lifecycle stage. Build the logging in from the start — not as an afterthought when something breaks. Each silent transition needs a visible marker so a failure points at the exact stage. Aim for:

[lemond] Starting on port <port>
[lemond] Healthy on port <port>
[lemond] <recipe>:<backend> installed        (or: already installed / install failed)
[lemond] Pulling model <name>...             then: Model <name> ready  (or: pull returned <status>)
[local]  <modality> result: <value>          (first inference output — empty string here = unpulled model)

Logging the first inference result verbatim is what turns the silent-empty failure (Step 6) from a multi-hour mystery into a one-line diagnosis. Route these through the app's normal logging so they can be quieted for release.

Dev-mode file watchers: If the app runs with a file watcher (Tauri, Electron, Next.js, Vite, etc.) that watches the source tree, ensure vendor/lemonade/ is excluded from the watched paths. Lemond writes config and cache files at runtime; a watcher that picks these up will restart the app, kill the lemond subprocess, and spawn a new one on a new port — silently breaking any in-flight transcription. Add vendor/ (or the equivalent) to the watcher's ignore list before testing.

Use the reference implementation from reference.md § Reference launchers directly — copy it verbatim and adapt only the LEMOND_DIR path. Do not write a launcher from scratch. The reference Python launcher uses secrets (for the API key), socket (for the free-port probe), and subprocess (to spawn lemond); the Node.js launcher uses the equivalent stdlib modules. Both handle port-race retries and health polling correctly.

Readiness is always determined by polling the exact endpoint GET http://127.0.0.1:<port>/api/v1/health and checking for HTTP 200 — never by reading lemond's stdout or stderr. Any health-check helper you write must hit that /api/v1/health path.

Show full SKILL.md (1,304 more words)Show less

Step 5: Re-point the existing client at lemond

Make three changes to the app's existing client construction — all three are required, not optional:

  1. Set base_url to http://127.0.0.1:{port}/api/v1
  2. Set api_key to the launcher key
  3. Set the HTTP timeout to 120 seconds — this is mandatory, not optional

The 120-second timeout is not a tuning suggestion. The default on most HTTP clients is 30s, which is shorter than lemond's first-run model load time on real hardware. Without it the request silently times out and the UI shows nothing, which is indistinguishable from a broken integration.

Python (openai) — the exact change to make:

python
import httpx
from openai import OpenAI

proc, key, port = start_lemond()
client = OpenAI(
    base_url=f"http://127.0.0.1:{port}/api/v1",
    api_key=key,
    http_client=httpx.Client(timeout=120),  # required: 120s for first-run model load
)

For other clients:

Existing clientNew base_urlNew authTimeout
openai-pythonhttp://127.0.0.1:{port}/api/v1api_key=keyhttpx.Client(timeout=120)
openai-nodehttp://127.0.0.1:{port}/api/v1apiKey: keytimeout: 120000
@anthropic-ai/sdkhttp://127.0.0.1:{port}/api/v1apiKey: keytimeout: 120000
Raw fetch / requestssameAuthorization: Bearer {key}set per-request
Ollama-compatible codehttp://127.0.0.1:{port}/api/v0pass key anyway120s

The model identifier on requests stays a Lemonade model name (e.g. Qwen3-4B-GGUF), not the cloud name.

Local mode needs no cloud API key — at all. This is a defining property of local mode, not an edge case: there is no cloud service to authenticate to, so nothing should ever ask the user for a key. Any onboarding wall, validator, or startup check that demands one must not block local-mode users. Concretely:

  • Skip or auto-satisfy the key-entry screen in local mode.
  • Treat local mode as already-authorized in every validation path — an empty-key check must short-circuit to "valid" when the active mode is local, never throw "API key not configured".
  • Re-enable the gate only for cloud mode.

The lemond key from Step 4 is generated internally by the launcher and used only for the local loopback connection, so the user never sees or enters one; any UI placeholder (e.g. "local") is fine. Flipping into local mode should never strand the user on a key-entry wall.

Step 6: Health, backend, then pull the model — before first inference

GET /api/v1/health returning 200 means the server is up. It does not mean inference will work. Before the first real request succeeds, three more things must be true: the backend for your modality is installed, the model's weights are downloaded to disk, and (on the first call) the model is loaded into memory. Treating health=200 as "ready" is the single biggest cause of a broken-looking integration.

Do not call POST /api/v1/load at startup. Lemond lazy-loads the model into memory on the first inference request and handles that step on its own. Pre-loading is unreliable across lemond versions (the /load request body shape has changed between releases) and a malformed call can crash or destabilise the server before the user takes any action. Loading is the one step you let lemond do lazily — pulling is not.

Pull the model so it exists on disk

Lazy-load only loads weights that are already downloaded. If the model was never pulled, the first inference does not error — lemond returns an empty / blank result with HTTP 200. So after health passes and the backend is installed, proactively pull the model:

http
POST /api/v1/pull
{"model": "Whisper-Large-v3-Turbo"}

This is idempotent — a no-op if the weights are already present, a download if they are not. Run it once during setup (after backend install, before the first user-triggered inference) and log the result.

  • Default model (the one you chose in Step 2): pull it by name as above.
  • Custom / user-overridden model: do not assume it exists. Confirm it is a real Lemonade model first via GET /api/v1/models (the only trusted catalog — see reference.md), then pull it the same way. A model appearing in the catalog is not proof its weights are downloaded; a successful pull is.

Silent-empty is almost always an unpulled model. If inference returns an empty string / blank output with no HTTP error, the model was not downloaded. Check your pull step before debugging anything else — this is the failure mode that wastes the most time. Log the pull result and the first inference result (see Step 4) so this is diagnosable from the console, not by guesswork.

Surface the whole setup, not just model load

First-run cold start is more than a model load. The full sequence is:

server spawn  →  health 200  →  backend install  →  model download  →  model load  →  first result

On a fresh machine, backend install and model download can each take from tens of seconds to several minutes (multi-GB weights over the network). Model load alone is 10–30s. An app that shows nothing during this will look frozen.

Minimum: show a loading indicator or status message ("Setting up local AI…") from the moment setup begins until the first response arrives — covering the entire sequence above, not just the final load. The simplest implementation is a flag set when setup/first-request starts and cleared when the first response arrives. Once the model is pulled and loaded once, subsequent runs are fast; the long wait is first-run only.

Step 7: Lifecycle and recovery

These are the only failure modes worth handling. Do not over-engineer.

SymptomCauseRecovery
Inference returns empty / blank with HTTP 200, no errorModel never pulled: backend is installed but weights are absent, so lazy-load has nothing to loadPOST /api/v1/pull with {"model":"..."}, wait for success, retry. Log the pulled result and the first inference result. This is the most common silent failure — see Step 6
POST /api/v1/load returns 404 / model not foundModel not pulled yet (same root cause as the empty-result row above)POST /api/v1/pull with {"model": "..."} then retry /api/v1/load
POST /api/v1/load returns 500 with backend errorBackend not installed for this hardwareGET /api/v1/system-info, pick a supported backend, POST /api/v1/install with {"recipe": "...", "backend": "..."}, retry
Subprocess exits immediatelyPort race: another process grabbed the port between freePort() and lemond bindingThe reference launcher retries with a fresh port automatically (3 attempts)
/api/v1/health never returns 200First-run backend extraction is slow on cold diskExtend timeout to 90s on first launch, 30s after
HTTP 401 on every requestForgot the Authorization: Bearer headerAudit the client config because Lemonade rejects unauth'd calls when LEMONADE_API_KEY is set

Shutdown: On app exit, proc.terminate() (Unix) or proc.kill() (Windows). lemond flushes config and exits cleanly within a couple of seconds. Always wait on the process; never orphan it.

Do not parse lemond stdout to detect readiness; use the HTTP /api/v1/health probe. Stdout format is not a stable contract.


Verification checklist

The integration is done when all of these are true:

  • vendor/lemonade/ contains the full package: lemond[.exe], lemonade[.exe], LICENSE, and resources/ — not just the binary.
  • lemond starts as a subprocess with a fresh API key per launch.
  • GET /api/v1/health returns 200 within the timeout.
  • The default model is pulled (or bundled) before the first inference; a custom/overridden model is confirmed via GET /api/v1/models and then pulled. A blank result with no error means this step was skipped.
  • Each lifecycle stage logs a clear line (spawn, health, backend install, model pull, first result) so a failure is diagnosable from the console.
  • The existing client's chat / image / speech call returns a valid response with the base URL and key swapped, with no other code changed.
  • First-run latency is surfaced: the interface shows a loading state from the moment the first inference request is sent until the response arrives.
  • The HTTP client timeout is set to 120 seconds.
  • In local mode the app requires no cloud API key: no onboarding wall, validator, or startup check blocks the user, and no code path throws "API key not configured" when the active mode is local.
  • If the app uses a dev-mode file watcher, vendor/lemonade/ is excluded from the watched paths so runtime writes by lemond do not trigger restarts.
  • Killing the parent process leaves no lemond subprocess behind.
  • On a fresh machine without the optimal backend, the app still works via the Vulkan fallback bundled in bin/.

If any box is unchecked, do not declare the task complete.


Reference

For detailed model catalog, backend selection matrix, full endpoint reference, config keys, and per-model recipe_options.json tuning, see reference.md.

© amd, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files in skills/local-ai-app-integration of amd/skills.

  • SKILL.md
  • .federated.json
  • evals/evals.json
  • evals/files/apikey-guard/main.py
  • evals/files/openai-stub/main.py
  • reference.md
  • skill-card.md

Open the folder on GitHubat commit 6efb39c

Compare with similar skills

Local AI App Integration 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.

Local AI App Integration compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Local AI App Integration this skillamd/skills406—~6kAutomated safety check: PassMIT
Xsaimoeru-ai/airi50k1 repos~1.3kAutomated safety check: PassMIT
Azure AI Openai Dotnetmicrosoft/skills3.1k5 repos~3.4kAutomated safety check: PassMIT
Azure AImicrosoft/GitHub-Copilot-for-Azure2551 repos~852Automated safety check: PassMIT
AI SDK Developmenttrypostit/trypost6851 repos~3.5kAutomated safety check: PassMIT
Keiroutermydisha/keirouter147—~995Automated safety check: PassMIT

Similar skills

  • Xsai

    moeru-ai/airi

    A skill your agent uses when the user is building with xsai or any @xsai/ package, or is evaluating xsAI for a small OpenAI-compatible workflow with text generation, streaming, tool calling…

    50k GitHub starsUsed in 1 repo~1.3k tokens
    AI & LLM EngineeringAuto-check passed
  • Azure AI Openai Dotnet

    microsoft/skills

    Official

    Azure OpenAI SDK for .NET. An agent skill from microsoft/skills.

    3.1k GitHub starsUsed in 5 repos~3.4k tokens
    AI & LLM EngineeringAuto-check passed
  • Azure AI

    microsoft/GitHub-Copilot-for-Azure

    Official

    A skill your agent uses for Azure AI: Search, Speech, OpenAI, Document Intelligence.

    255 GitHub starsUsed in 1 repo~852 tokens
    Media & CreativeAuto-check passed
  • AI SDK Development

    trypostit/trypost

    TRIGGER when working with ai-sdk which is Laravel official first-party AI SDK.

    685 GitHub starsUsed in 1 repo~3.5k tokens
    AI & LLM EngineeringAuto-check passed
  • Keirouter

    mydisha/keirouter

    Entry point for KeiRouter — local/remote AI gateway with OpenAI-compatible REST for chat, image, TTS, embeddings, web search, web fetch.

    147 GitHub stars~995 tokensUpdated 28 days ago
    AI & LLM EngineeringAuto-check passed
  • Fastllm Gateway

    azrtydxb/Fastllm-proxy

    Send inference requests through the FastLLM OpenAI-compatible gateway — chat completions, completions, embeddings, rerank, score, responses, moderations, audio speech and transcription, image…

    108 GitHub stars~926 tokensUpdated 4 days ago
    AI & LLM EngineeringAuto-check passed

More from amd/skills

All 9 skills in this repo
  • Inspects and tunes the shared-vs-dedicated memory split on AMD Ryzen APUs with unified memory (UMA) so larger LLMs and image-gen models fit on the iGPU, or so reserved GPU memory is returned to the…

    406 GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Turns a natural-language description of routing intent into a valid Lemonade collection.router policy JSON.

    406 GitHub stars~4k tokensUpdated today
    Auto-check passed
  • Local AI Use

    amd/skills

    Makes this agent generate images, transcribe audio, and synthesize speech on the user's own machine through a local Lemonade Server instead of a paid cloud API.

    406 GitHub stars~5k tokensUpdated today
    Auto-check: notes
  • Serves AI models on AMD Instinct GPU hardware using vLLM. An agent skill from amd/skills.

    406 GitHub stars~4k tokensUpdated today
    Auto-check: notes
  • Serves an LLM on a supported AMD EPYC server CPU using vLLM with zentorch, in Docker, Podman, or conda.

    406 GitHub stars~5.7k tokensUpdated today
    Auto-check: notes
  • Autonomously optimizes end-to-end LLM inference throughput on AMD Instinct GPUs and reports a validated gain, using the Hyperloom multi-agent optimizer.

    406 GitHub stars~1.7k tokensUpdated today
    Auto-check: notes

Works with

Questions about Local AI App Integration

What does Local AI App Integration do?

Integrates local AI capabilities into applications using Embeddable Lemonade. Local AI App Integration is an agent skill from amd/skills. Integrates local AI capabilities into applications using Embeddable Lemonade.

When should I use Local AI App Integration?

Local AI App Integration fits situations like: the user wants to add local AI; image generation; text-to-speech to an existing app; supplement OpenAI.

How do I install Local AI App Integration in Claude Code?

Run `npx skills add amd/skills --skill local-ai-app-integration -a claude-code`. Or copy the skill folder (skills/local-ai-app-integration in amd/skills) into .claude/skills/local-ai-app-integration in your project. Claude Code loads it when a task matches its description.

How do I install Local AI App Integration in Codex?

Run `npx skills add amd/skills --skill local-ai-app-integration -a codex`. Or copy the skill folder (skills/local-ai-app-integration in amd/skills) into .agents/skills/local-ai-app-integration in your project. Codex loads it when a task matches its description.

Can I use Local AI App Integration in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add amd/skills --skill local-ai-app-integration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/local-ai-app-integration, .gemini/skills/local-ai-app-integration, .github/skills/local-ai-app-integration and .opencode/skills/local-ai-app-integration in your project.

What does Local AI App Integration need to run?

Going by SKILL.md and its folder, Local AI App Integration needs Python for the scripts in its folder, the command-line tools its instructions call (curl and pip) and credentials named LEMONADE_API_KEY, OPENAI_API_KEY and ANTHROPIC_API_KEY. Our summary lists: Python 3; A credential in OPENAI_API_KEY; A credential in ANTHROPIC_API_KEY.

Does Local AI App Integration access the network?

SKILL.md names 3 domains. In commands or code: api.github.com, lemonade-server.ai and github.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Local AI App Integration safe to install?

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.

What licence does Local AI App Integration use?

Local AI App Integration is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Local AI App Integration use?

About 6k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Local AI App Integration?

Skills that share tags, products or a category with Local AI App Integration: Xsai (moeru-ai/airi, 50k stars), Azure AI Openai Dotnet (microsoft/skills, 3.1k stars), Azure AI (microsoft/GitHub-Copilot-for-Azure, 255 stars) and AI SDK Development (trypostit/trypost, 685 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Local AI App Integration?

amd (a GitHub organization) maintains it in amd/skills, which has 406 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 9, 2026.

Source: amd/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.