Implement
dynamodb-toolbox/dynamodb-toolbox
Implement a planned DynamoDB-Toolbox feature end-to-end and open a pull request.
Step-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel.
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-multimodal-storage --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/yaalalabs/agent-kernel.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ak-dev-new-multimodal-storage .claude/skills/ak-dev-new-multimodal-storage && 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 "ak-dev-new-multimodal-storage" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storage into .claude/skills/ak-dev-new-multimodal-storage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-multimodal-storage", 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/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storageType 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 yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-multimodal-storage --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/ak-dev-new-multimodal-storage .agents/skills/ak-dev-new-multimodal-storage && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ak-dev-new-multimodal-storage" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storage into .agents/skills/ak-dev-new-multimodal-storage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-multimodal-storage", 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 yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-multimodal-storage --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/ak-dev-new-multimodal-storage .cursor/skills/ak-dev-new-multimodal-storage && 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 "ak-dev-new-multimodal-storage" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storage into .cursor/skills/ak-dev-new-multimodal-storage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-multimodal-storage", 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/yaalalabs/agent-kernel.git --path .agents/skills/ak-dev-new-multimodal-storage--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 yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-multimodal-storage --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/ak-dev-new-multimodal-storage .gemini/skills/ak-dev-new-multimodal-storage && 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 "ak-dev-new-multimodal-storage" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storage into .gemini/skills/ak-dev-new-multimodal-storage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-multimodal-storage", 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 yaalalabs/agent-kernel ak-dev-new-multimodal-storageInstalls 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 yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/ak-dev-new-multimodal-storage .github/skills/ak-dev-new-multimodal-storage && 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 "ak-dev-new-multimodal-storage" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storage into .github/skills/ak-dev-new-multimodal-storage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-multimodal-storage", 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 yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-multimodal-storage --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/ak-dev-new-multimodal-storage .opencode/skills/ak-dev-new-multimodal-storage && 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 "ak-dev-new-multimodal-storage" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-multimodal-storage into .opencode/skills/ak-dev-new-multimodal-storage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-multimodal-storage", 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.
ak-dev-new-multimodal-storageStep-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel.
Ak Dev New Multimodal Storage is an agent skill from yaalalabs/agent-kernel. Step-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel. Use this skill when you need to integrate a new storage service (beyond in-memory, Redis, and DynamoDB) for persisting image and file attachments. Covers implementing the AttachmentStore interface, factory registration, configuration, and testing.
Its SKILL.md is about 4.3k 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 Databases, covering NoSQL databases. It works with Redis, Amazon DynamoDB and Amazon Web Services. The repository describes itself as: The Operating System for Scalable Enterprise AI Agents - Run, orchestrate, and deploy Compliant Enterprise AI Agents at scale across frameworks, without lock-in, rewrites or… The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 97fa8d9. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python, toml and yaml).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ak Dev New Multimodal Storage loads about 4.3k tokens when it runs. Until then it costs about 92 tokens; SKILL.md has 851 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 yaalalabs/agent-kernel at commit 97fa8d9, republished under its Apache-2.0 licence (© yaalalabs). 851 words, ~4,337 tokens.
.claude/skills/ak-dev-new-multimodal-storage/SKILL.md (or your agent's skills folder).This guide walks through adding a new attachment storage backend to Agent Kernel's multimodal subsystem. Use the existing Redis (ak-py/src/agentkernel/core/multimodal/storage/redis.py) and DynamoDB (ak-py/src/agentkernel/core/multimodal/storage/dynamodb.py) implementations as reference.
| Backend | Config value | Features | Extras |
|---|---|---|---|
| In-memory | in_memory | Ephemeral ClassVar dict, zero setup, single-process only | None |
| Redis | redis | Persistent, TTL, shared RedisDriver (lazy connect, retry, ping/reconnect), distributed | agentkernel[multimodal,redis] |
| DynamoDB | dynamodb | Serverless/AWS, TTL via expiry_time, fully managed | agentkernel[multimodal,aws] |
| Session cache | session_cache | Legacy — stores in session nv_cache (causes bloat, not recommended) | None |
To run multimodal end-to-end (hooks/tools), you typically need
agentkernel[multimodal]plus the backend-specific extra shown above (for example:agentkernel[multimodal,redis]oragentkernel[multimodal,aws]).
The multimodal storage system uses a simple pluggable pattern:
AttachmentStore (storage/base.py) — abstract base class with save(), get(), delete()AttachmentData (storage/base.py) — dataclass representing a stored attachment (id, type, data, name, mime_type, description, timestamp, url)AttachmentStorageManager (storage/storage_manager.py) — high-level API that reads configuration, instantiates the correct AttachmentStore via _build_driver(), and provides save_attachment() / get_attachment_data() methodsMultimodalPreHook saves attachments; AnalyzeAttachmentsTool retrieves themMultimodalPreHook / AnalyzeAttachmentsTool
→ AttachmentStorageManager(session_id)
→ _build_driver(session_id) # reads config.multimodal.storage_type
→ InMemoryAttachmentStore # or Redis, DynamoDB, etc.
→ save_attachment() / get_attachment_data()
→ AttachmentStore.save() / .get()Create ak-py/src/agentkernel/core/multimodal/storage/<backend>.py.
# ak-py/src/agentkernel/core/multimodal/storage/<backend>.py
import logging
from typing import Optional
from .base import AttachmentStore
logger = logging.getLogger("ak.core.multimodal.storage.<backend>")
class <Backend>AttachmentStore(AttachmentStore):
"""<Backend> storage backend for multimodal attachments."""
def __init__(self, session_id: str, **kwargs):
"""
Initialize the store for a specific session.
:param session_id: Session identifier for key namespacing.
:param kwargs: Backend-specific connection parameters from config.
"""
self._session_id = session_id
# Initialize your client/connection
# e.g., self._client = BackendClient(endpoint=kwargs.get("endpoint"))
logger.info(f"<Backend> attachment store initialized for session {session_id}")
def save(self, attachment: dict, max_attachments: int) -> str:
"""
Save an attachment dict and return its ID.
The attachment dict contains:
- id: str (UUID, already generated by AttachmentStorageManager)
- type: str ("image" or "file")
- data: str (base64 encoded binary; empty string when url is set)
- name: str (filename)
- mime_type: str
- description: str (LLM-generated)
- timestamp: float (epoch)
- url: str | None (a remote reference recorded without its bytes)
Persist the dict whole rather than mapping these keys one by one. The set grows — `url` was
added for remote attachments — and an implementation that enumerates them drops a new key
silently: the record still loads, carrying neither bytes nor an address.
:param attachment: Attachment data dictionary.
:param max_attachments: Maximum attachments per session (prune oldest if exceeded).
:return: The attachment ID.
"""
attachment_id = attachment["id"]
key = f"{self._session_id}:{attachment_id}"
# 1. Serialize and store the attachment
# e.g., self._client.put(key, json.dumps(attachment), ttl=self._ttl)
# 2. Enforce max_attachments: prune oldest entries if limit exceeded
# (track per-session count via an index or query)
logger.debug(f"Saved attachment {attachment_id} to <backend>")
return attachment_id
def get(self, attachment_id: str) -> Optional[dict]:
"""
Retrieve a full attachment dict by ID.
:param attachment_id: The attachment UUID.
:return: Attachment dict or None if not found.
"""
key = f"{self._session_id}:{attachment_id}"
# e.g., raw = self._client.get(key)
# return json.loads(raw) if raw else None
return None
def delete(self, attachment_id: str) -> None:
"""
Delete an attachment by ID.
:param attachment_id: The attachment UUID.
"""
key = f"{self._session_id}:{attachment_id}"
# e.g., self._client.delete(key)
# IMPORTANT: also remove the ID from the session index so the count
# stays accurate and pruning logic works correctly on future saves.
# e.g., fetch the index, remove attachment_id, and write it back
logger.debug(f"Deleted attachment {attachment_id} from <backend>"){session_id}:{attachment_id} for isolation between sessionssave() is called and the session exceeds max_attachments, delete the oldest entry. Track order via timestamps or a per-session indexdelete() is called, remove the attachment ID from the per-session index in addition to deleting the data entry. Skipping this step causes the index count to drift — the backend will think more attachments exist than actually do, breaking max_attachments enforcement on subsequent savesexpiry_time), use it for automatic cleanup. Read the TTL value from the backend-specific configagentkernel/core/util/driver/ (RedisDriver, DynamoDBDriver, etc.) — they provide lazy connect, 3-retry back-off, and (for Redis-like backends) ping/reconnect. The store may be instantiated per-request (inside AttachmentStorageManager.__init__), so keep the driver construction cheap (no eager connect)data field contains base64-encoded binary, so all values are strings, floats, or intsUpdate ak-py/src/agentkernel/core/config.py:
class _MultimodalStorage<Backend>Config(BaseModel):
"""Configuration for <backend> multimodal attachment storage."""
# Add backend-specific fields, e.g.:
endpoint: str = Field(default="...", description="<Backend> endpoint URL")
ttl: int = Field(default=604800, description="Attachment TTL in seconds")
# table_name, bucket, prefix, etc.
class _MultimodalConfig(BaseModel):
# ... existing fields ...
storage_type: str = Field(
default="in_memory",
description="Storage backend for multimodal attachments: a built-in short name "
"(session_cache, in_memory, redis, dynamodb, <backend>) or a dotted "
"path to an AttachmentStore subclass", # ADD <backend> to the short-name list
)
# ... existing backends ...
<backend>: Optional[_MultimodalStorage<Backend>Config] = None # ADD THISstorage_type is a free-form string (no regex pattern=) so that a dotted path resolves as
bring-your-own — do not add a pattern= constraint back.
Update AttachmentStorageManager._build_driver() in ak-py/src/agentkernel/core/multimodal/storage/storage_manager.py. It shares the house pluggable-backend shape from core/util/factory.py (resolve_dotted, require_extra, AKConfigError — the same pattern used by the guardrail, trace, session/thread store, and sandbox provider factories): matching is case-insensitive on storage_type.lower(), each built-in's lazy import for an optional-dependency backend is wrapped in require_extra, and anything left over is treated as a dotted path to an AttachmentStore subclass (bring-your-own):
_BUILTIN_ATTACHMENT_STORES = ["session_cache", "in_memory", "redis", "dynamodb", "<backend>"] # ADD <backend>
@staticmethod
def _build_driver(session_id: str) -> AttachmentStore:
config = AKConfig.get().multimodal
storage_type = config.storage_type
key = storage_type.lower()
# ... existing backends (session_cache, in_memory) ...
if key == "<backend>": # ADD THIS
with require_extra("<backend>", "multimodal.storage_type: <backend>"):
from .<backend> import <Backend>AttachmentStore
backend_config = config.<backend>
if backend_config is None:
raise ValueError(
"Multimodal storage_type is '<backend>' but no '<backend>' configuration "
"is provided under 'multimodal'. Please set AK_MULTIMODAL__<BACKEND>__ENDPOINT etc."
)
return <Backend>AttachmentStore(
session_id=session_id,
endpoint=backend_config.endpoint,
ttl=backend_config.ttl,
)
# ... existing backends (redis, dynamodb) ...
# Bring-your-own: a dotted path to an AttachmentStore subclass (session-scoped).
if "." not in storage_type:
raise AKConfigError(
f"unknown multimodal storage_type '{storage_type}'; expected one of {_BUILTIN_ATTACHMENT_STORES} or a dotted path to an AttachmentStore subclass"
)
return resolve_dotted(storage_type, base=AttachmentStore)(session_id)A dotted storage_type (e.g. myorg.storage.CustomAttachmentStore) resolves via resolve_dotted
without any factory edit at all — only add an if branch here for a first-party, in-repo backend
you want addressable by a short name. There is no else fallback to in_memory anymore: an
unrecognized non-dotted value now fails loudly via AKConfigError.
In ak-py/pyproject.toml:
[project.optional-dependencies]
<backend> = [
"backend-sdk>=x.y.z",
]Create ak-py/tests/test_multimodal_storage_<backend>.py:
import pytest
from agentkernel.core.multimodal.storage.<backend> import <Backend>AttachmentStore
class TestBasicOperations:
"""Test save/get/delete operations."""
def test_save_and_get(self):
store = <Backend>AttachmentStore(session_id="test-session", ...)
attachment = {
"id": "att-1",
"type": "image",
"data": "base64data...",
"name": "test.jpg",
"mime_type": "image/jpeg",
"description": "A test image",
"timestamp": 1234567890.0,
}
result_id = store.save(attachment, max_attachments=10)
assert result_id == "att-1"
retrieved = store.get("att-1")
assert retrieved is not None
assert retrieved["id"] == "att-1"
assert retrieved["data"] == "base64data..."
def test_get_nonexistent(self):
store = <Backend>AttachmentStore(session_id="test-session", ...)
assert store.get("nonexistent") is None
def test_delete(self):
store = <Backend>AttachmentStore(session_id="test-session", ...)
attachment = {
"id": "att-2", "type": "file", "data": "...",
"name": "doc.pdf", "mime_type": "application/pdf",
"description": "A PDF", "timestamp": 1234567890.0,
}
store.save(attachment, max_attachments=10)
store.delete("att-2")
assert store.get("att-2") is None
class TestMaxAttachments:
"""Test that oldest attachments are pruned when limit is exceeded."""
def test_prune_oldest(self):
store = <Backend>AttachmentStore(session_id="test-session", ...)
for i in range(5):
store.save(
{"id": f"att-{i}", "type": "image", "data": "...",
"name": f"img{i}.jpg", "mime_type": "image/jpeg",
"description": f"Image {i}", "timestamp": float(i)},
max_attachments=3,
)
# Oldest (att-0, att-1) should be pruned
assert store.get("att-0") is None
assert store.get("att-1") is None
assert store.get("att-4") is not None
class TestSessionIsolation:
"""Test that attachments from different sessions are isolated."""
def test_isolation(self):
store_a = <Backend>AttachmentStore(session_id="session-a", ...)
store_b = <Backend>AttachmentStore(session_id="session-b", ...)
store_a.save(
{"id": "att-1", "type": "image", "data": "a-data",
"name": "a.jpg", "mime_type": "image/jpeg",
"description": "", "timestamp": 1.0},
max_attachments=10,
)
assert store_a.get("att-1") is not None
assert store_b.get("att-1") is None # different sessionShow the config in config.yaml:
multimodal:
enabled: true
storage_type: <backend>
max_attachments: 20
description_model: gpt-4o
analysis_model: gpt-4o
<backend>:
endpoint: "https://..."
ttl: 604800Add or update docs/docs/advanced/multimodal.md with:
Then update the landing page inventories in docs/src/components/*/data.tsx: add the backend to the Attachment Storage card's tags under the Remember tab in FeatureExplorer/data.tsx; if the vendor is new to the site, add a tile to the Memory, knowledge & data row in IntegrationsMarquee/data.tsx (role Memory, every store it backs listed in title), and if it already has a tile for a session or thread store, append the attachment role to that tile's title instead. Logo sourcing and the build check are in ak-dev-sync-docs-from-branch, Docs-Site Landing and Features Pages.
Grep docs/src/pages/*.tsx for the existing backend names (for example "DynamoDB") in case a features page card enumerates storage backends; the Smart Memory Management card in docs/src/pages/features.tsx lists session backends and is the usual place such a roll call appears.
storage/redis.py){prefix}{session_id}:{attachment_id}_ensure_connection()client.set(key, json, ex=ttl)storage/dynamodb.py)session_id, sort key: attachment_idexpiry_time (Unix epoch)attachment_id = "_index") tracking ordered IDs for max attachment enforcement — same index-list pattern as Redis, read via get_item (no queries)storage/in_memory.py)ClassVar dict shared across all instances{session_id}:{attachment_id}_index list in insertion order (stored timestamps are not consulted)ak-py/src/agentkernel/core/multimodal/storage/<backend>.py implementing AttachmentStoreconfig.py (e.g., _MultimodalStorage<Backend>Config)storage_type description updated in _MultimodalConfig to list the new short name (no pattern= regex — the field stays free-form for bring-your-own)AttachmentStorageManager._build_driver() factorypyproject.tomldocs/docs/advanced/multimodal.mdFeatureExplorer/data.tsx), marquee tile or role (IntegrationsMarquee/data.tsx)© yaalalabs, Apache-2.0. 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 .agents/skills/ak-dev-new-multimodal-storage of yaalalabs/agent-kernel.
Open the folder on GitHubat commit 97fa8d9
Ak Dev New Multimodal Storage 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 |
|---|---|---|---|---|---|---|
| Ak Dev New Multimodal Storage this skillyaalalabs/agent-kernel | 192 | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| Implementdynamodb-toolbox/dynamodb-toolbox | 2k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Plandynamodb-toolbox/dynamodb-toolbox | 2k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Specdynamodb-toolbox/dynamodb-toolbox | 2k | — | ~1.2k | Automated safety check: Pass | MIT | |
| Dynamodbitsmostafa/aws-agent-skills | 1.2k | — | ~2.5k | Automated safety check: Pass | MIT | |
| AWS CLI Beastgiuseppe-trisciuoglio/developer-kit | 357 | — | ~1.7k | Automated safety check: Notes | MIT |
dynamodb-toolbox/dynamodb-toolbox
Implement a planned DynamoDB-Toolbox feature end-to-end and open a pull request.
dynamodb-toolbox/dynamodb-toolbox
Write the technical implementation strategy for a spec'd DynamoDB-Toolbox task.
dynamodb-toolbox/dynamodb-toolbox
Formalise a product spec for a DynamoDB-Toolbox task — interview, codebase analysis, and Notion write-back.
itsmostafa/aws-agent-skills
AWS DynamoDB NoSQL database for scalable data storage. An agent skill from itsmostafa/aws-agent-skills.
giuseppe-trisciuoglio/developer-kit
Provides advanced AWS CLI patterns for managing EC2, Lambda, S3, DynamoDB, RDS, VPC, IAM, and CloudWatch.
alinaqi/maggy
AWS DynamoDB single-table design, GSI patterns, SDK v3 TypeScript/Python
yaalalabs/agent-kernel
Code quality standards, formatting, Python style rules (classes over script-style functions, configuration-field rules), commit conventions, and PR workflow for Agent Kernel development.
yaalalabs/agent-kernel
Step-by-step guide for adding a new built-in test evaluator provider to Agent Kernel (beyond DeepEval, Opik and JEV).
yaalalabs/agent-kernel
Step-by-step guide for adding a new guardrail provider to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new knowledge base backend to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new messaging platform integration to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new queue transport to Agent Kernel's execution pipeline.
Works with
Categories
Step-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel. Ak Dev New Multimodal Storage is an agent skill from yaalalabs/agent-kernel. Step-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel.
Ak Dev New Multimodal Storage fits situations like: you need to integrate a new storage service (beyond in-memory; dynamoDB) for persisting image and file attachments.
Run `npx skills add yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a claude-code`. Or copy the skill folder (.agents/skills/ak-dev-new-multimodal-storage in yaalalabs/agent-kernel) into .claude/skills/ak-dev-new-multimodal-storage in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a codex`. Or copy the skill folder (.agents/skills/ak-dev-new-multimodal-storage in yaalalabs/agent-kernel) into .agents/skills/ak-dev-new-multimodal-storage 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 yaalalabs/agent-kernel --skill ak-dev-new-multimodal-storage -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ak-dev-new-multimodal-storage, .gemini/skills/ak-dev-new-multimodal-storage, .github/skills/ak-dev-new-multimodal-storage and .opencode/skills/ak-dev-new-multimodal-storage in your project.
SKILL.md names no scripts, command-line tools or credentials: Ak Dev New Multimodal Storage is instructions for the agent only. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Ak Dev New Multimodal Storage is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k 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 Ak Dev New Multimodal Storage: Implement (dynamodb-toolbox/dynamodb-toolbox, 2k stars), Plan (dynamodb-toolbox/dynamodb-toolbox, 2k stars), Spec (dynamodb-toolbox/dynamodb-toolbox, 2k stars) and Dynamodb (itsmostafa/aws-agent-skills, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yaalalabs (a GitHub organization) maintains it in yaalalabs/agent-kernel, which has 192 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 9, 2026.
Source: yaalalabs/agent-kernel on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.