qinghonglin/openrouter-embeddings
Generate text embeddings via OpenRouter using Qwen3-Embedding-8B.
npx skills add https://github.com/QinghongLin/data2story-skill --skill openrouter-embeddings
Text → embedding vector via OpenRouter. Default model: qwen/qwen3-embedding-8b.
Resolve TOOL_DIR = the directory containing this SKILL.md. Commands below use TOOL_DIR as a symbolic placeholder; replace it with the resolved, quoted path before running Bash.
export OPENROUTER_API_KEY=sk-or-v1-...
python3 TOOL_DIR/scripts/embed.py \
--text "The quick brown fox jumps over the lazy dog" \
--output vec.json
Input records.jsonl (one JSON per line):
{"id": "row_0", "text": "Every place name in the United States."}
{"id": "row_1", "text": "Nearby stars and potential exoplanets."}
Run:
python3 TOOL_DIR/scripts/embed.py \
--jsonl records.jsonl \
--output records_with_embeddings.jsonl \
--batch-size 32
Output is the same JSONL with an added embedding field per line.
| Flag | Default | Description |
|---|---|---|
| --text | — | Embed one string (mutually exclusive with --jsonl) |
| --jsonl | — | Embed many; each line must have a text field |
| --output | required | Output path |
| --model | qwen/qwen3-embedding-8b | Any embedding model on OpenRouter |
| --batch-size | 32 | Records per API call (jsonl mode) |
| --dimensions | — | Optional: truncate to N dims if supported |
POST /api/v1/embeddings — OpenAI-compatible schema.
Request:
{ "model": "qwen/qwen3-embedding-8b", "input": ["text1", "text2", ...] }
Response:
{ "data": [ { "embedding": [0.01, -0.02, ...], "index": 0 }, ... ], "model": "...", "usage": {...} }
qwen3-embedding-8b outputs high-dimensional dense vectors suitable for semantic similarity, clustering, RAG.qwen/qwen3-embedding-4b or other listed embedding models (GET /api/v1/embeddings/models).Take qinghonglin/openrouter-embeddings from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.