[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f3jrfxhgxnug7f":3,"$f15wt8k46n1g9o":72},{"sha":4,"committedAt":5,"fetchedAt":6,"source":7,"skill":8},"ca53c8df70237deeddea927bded620ebb5561057","2026-10-27T20:44:42.000Z","2026-10-30T00:27:33.696Z","github",{"slug":9,"name":10,"description":11,"tags":12,"author":18,"authorUrl":19,"icon":20,"requires":21,"gitignore":23,"env":25,"badges":31,"fileCount":34,"totalBytes":35,"tree":36,"errors":71},"ai-models","AI Models","Lets Claude call the models you run yourself or reach through a gateway, for speech, vision, embeddings, reranking, decisions, images, video and music, from one CSV of endpoints.",[13,14,15,16,17],"ai","inference","audio","images","embeddings","Patrity","https:\u002F\u002Fgithub.com\u002FPatrity","i-lucide-cpu",[22],"python3",[24],".claude\u002Fai-models.csv",[26],{"name":27,"description":28,"required":29,"example":30},"AI_GATEWAY_KEY","Example key variable for a gateway row. A models.csv row's key_env can name any variable.",false,"\u003Cyour-gateway-key>",[32,33],"skills","claude-md",6,61227,[37,65,68],{"name":32,"path":32,"type":38,"children":39},"dir",[40],{"name":9,"path":41,"type":38,"children":42},"skills\u002Fai-models",[43,53,57,61],{"name":44,"path":45,"type":38,"children":46},"workflows","skills\u002Fai-models\u002Fworkflows",[47],{"name":48,"path":49,"type":50,"size":51,"kind":52},"example-image.json","skills\u002Fai-models\u002Fworkflows\u002Fexample-image.json","file",1307,"text",{"name":54,"path":55,"type":50,"size":56,"kind":52},"ai.py","skills\u002Fai-models\u002Fai.py",43245,{"name":58,"path":59,"type":50,"size":60,"kind":52},"models.example.csv","skills\u002Fai-models\u002Fmodels.example.csv",2828,{"name":62,"path":63,"type":50,"size":64,"kind":52},"SKILL.md","skills\u002Fai-models\u002FSKILL.md",5468,{"name":66,"path":66,"type":50,"size":67,"kind":52},"CLAUDE.md",315,{"name":69,"path":69,"type":50,"size":70,"kind":52},"README.md",8064,[],{"path":69,"language":73,"size":70,"kind":52,"content":74,"frontmatterRaw":75,"body":76,"data":1691},"markdown","---\nname: AI Models\ndescription: Lets Claude call the models you run yourself or reach through a gateway, for speech, vision, embeddings, reranking, decisions, images, video and music, from one CSV of endpoints.\ntags: [ai, inference, audio, images, embeddings]\nauthor: Patrity\nauthorUrl: https:\u002F\u002Fgithub.com\u002FPatrity\nicon: i-lucide-cpu\nrequires: [python3]\ngitignore:\n  - .claude\u002Fai-models.csv\nenv:\n  - { name: AI_GATEWAY_KEY, description: \"Example key variable for a gateway row. A models.csv row's key_env can name any variable.\", required: false, example: \"\u003Cyour-gateway-key>\" }\n---\n\n# AI Models\n\nClaude writes text and code. It can't transcribe a voice memo, read a screenshot with a vision\nmodel, embed a paragraph, rank search results, make a calibrated decision, or render an image, a\nsong or a clip. I run models that do those things on my own hardware, and some of them sit behind a\nLiteLLM gateway as well. This bundle is how Claude calls them.\n\nYou list your models in a CSV. One Python script turns a short command (`transcribe clip.wav`) into\nthe request that model's server expects. It prints one JSON object with the text, the numbers or the\npath of the file it wrote. When nothing of a type is configured, it says so and Claude tells you,\nrather than guessing at an endpoint.\n\n## What's inside\n\n| Path | Purpose |\n| --- | --- |\n| `skills\u002Fai-models\u002Fai.py` | The script. Python 3.9+ standard library only, no `pip install`. |\n| `skills\u002Fai-models\u002FSKILL.md` | When Claude reaches for each command and how it reads the result. |\n| `skills\u002Fai-models\u002Fmodels.example.csv` | Fake rows, at least one per server shape. Copy it and edit. |\n| `skills\u002Fai-models\u002Fworkflows\u002Fexample-image.json` | A ComfyUI workflow in API format, with placeholders. |\n| `CLAUDE.md` | A pointer block to paste into your project's `CLAUDE.md`. |\n\n## Setup\n\n```bash\nmkdir -p ~\u002F.config\u002Fai-models\ncp .claude\u002Fskills\u002Fai-models\u002Fmodels.example.csv ~\u002F.config\u002Fai-models\u002Fmodels.csv\ncp -R .claude\u002Fskills\u002Fai-models\u002Fworkflows ~\u002F.config\u002Fai-models\u002F   # only if you use ComfyUI\n```\n\nEdit the rows to point at your servers. Put any keys in `~\u002F.config\u002Fai-models\u002F.env`:\n\n```bash\n# ~\u002F.config\u002Fai-models\u002F.env\nAI_GATEWAY_KEY=\u003Cyour-gateway-key>\n```\n\nThen check what answers:\n\n```bash\npython3 .claude\u002Fskills\u002Fai-models\u002Fai.py list --check\n```\n\n## Where config lives\n\nTwo pairs of files are read, and the project wins:\n\n| | Models | Keys |\n| --- | --- | --- |\n| Personal | `~\u002F.config\u002Fai-models\u002Fmodels.csv` | `~\u002F.config\u002Fai-models\u002F.env` |\n| Project | `.claude\u002Fai-models.csv` | `.claude\u002F.env` |\n\n`$XDG_CONFIG_HOME` replaces `~\u002F.config` when it is set. Rows merge by `name`, so a project row\nreplaces the personal row with the same name and everything else is kept. Project rows come first.\nA key already exported in your shell wins over both `.env` files, and `.claude\u002F.env` wins over the\npersonal one. I use the project layer for a scoped gateway key, so one app never sees my master key.\n\n`.claude\u002Fai-models.csv` is gitignored by default because it tends to hold LAN addresses. Take the\nline out of the managed block if your team wants to share it.\n\nThe project is `$CLAUDE_PROJECT_DIR`, or the nearest folder above the working directory that has a\n`.claude\u002F` in it. The script never works it out from its own location, so a copy in\n`~\u002F.claude\u002Fskills\u002F` works in every project.\n\n## The CSV\n\n| Column | Example | Meaning |\n| --- | --- | --- |\n| `name` | `home-stt` | Unique. `--model home-stt` picks this row. |\n| `type` | `stt` | `stt`, `tts`, `vision`, `embed`, `rerank`, `decide`, `image`, `video`, `music` or `chat`. |\n| `shape` | `openai` | Which request format the server speaks (below). |\n| `base_url` | `http:\u002F\u002Flocalhost:8000\u002Fv1` | Everything before the endpoint path. |\n| `model` | `whisper-large-v3-turbo` | The model name the server expects. |\n| `key_env` | `AI_GATEWAY_KEY` | The variable holding the key. Empty means no auth. |\n| `options` | `voice=alloy;dimensions=1024` | Defaults merged into every request for this row. |\n| `example` | `transcribe meeting.wav` | One call that works, shown by `list`. |\n| `notes` | `WAV only` | Hints for Claude, shown by `list`. |\n\n`options` and `--param` take `key=value`. Numbers, `true`, `false` and `null` are sent as those\ntypes. Wrap a value in double quotes to keep it a string. On the command line the shell eats one\nlayer, so write `--param 'seed=\"42\"'`. In a CSV cell it is `\"seed=\"\"42\"\"\"`. `;` separates\n`options`, so an `options` value can't contain one. Use `--param` for that. A dotted key nests:\n`options.duration_sec=20` becomes `{\"options\": {\"duration_sec\": 20}}`. A request is built from the\nscript's defaults, then the row's `options`, then the command's flags, then `--param`. `--body\n@file.json` replaces the lot and is sent as written.\n\nLines that start with `#` are ignored. A row with an unknown type or shape is reported by `list`\nand skipped. The rest still load.\n\n## Shapes\n\n| Shape | Serves | Notes |\n| --- | --- | --- |\n| `openai` | chat, vision, embed, stt, tts, image | LiteLLM, OpenRouter, vLLM, llama.cpp, TEI, Ollama. `wav_only=true` converts audio to WAV before transcription, for a gateway route that ends at a WAV-only server. |\n| `cohere-rerank` | rerank | `POST \u002Frerank` with `query`, `documents`, `top_n`. LiteLLM's rerank route speaks it. |\n| `systemone` | decide | Clef-Flash on llama.cpp and TypeSafe's Jev share this body. Bearer auth when `key_env` is set. |\n| `audiocpp` | tts, stt, music | [audio.cpp](https:\u002F\u002Fgithub.com\u002F0xShug0\u002Faudio.cpp)'s server. Transcription takes WAV, so other formats go through `ffmpeg` first when it is installed. |\n| `comfyui` | image, video | Submits a workflow, polls, downloads the outputs. Reserved options: `workflow`, `poll`, `timeout`. |\n\n`base_url` is the prefix, and the script adds the endpoint path to it. That's what lets one shape\nrun direct or through a gateway. audio.cpp music is `http:\u002F\u002Fhost:8885\u002Fv1` plus `\u002Ftasks\u002Frun`\ndirect, and `https:\u002F\u002Fgateway.example.com\u002Fmusic` plus `\u002Ftasks\u002Frun` through a LiteLLM pass-through.\n\n### ComfyUI workflows\n\nExport your graph with \"Save (API Format)\" and point the row at it with `workflow=\u003Cfile>`. A\nrelative path resolves from the CSV that names it. Any string value that is exactly `{prompt}`,\n`{negative}`, `{seed}`, `{width}`, `{height}` or `{frames}` is filled in, and numbers stay numbers.\n`--param steps=30` fills a `{steps}` you add yourself. A placeholder left without a value stops the\ncall and names it. The seed is random unless you pass `--seed`, and it comes back in the result.\n\n## Fallback\n\nRows of one type are tried in order. A row whose key variable is unset is skipped. A row that is\nunreachable (DNS failure, connection refused, or no connection within 3 s) hands over to the next\nrow. A server that answers with an error stops the call there, so a bad request is never quietly\nsent on to a paid gateway. `--model \u003Cname>` turns fallback off.\n\n## Output and exit codes\n\nEvery command prints one JSON object: `ok`, `type`, the `model` row it used, `tried`, `result` and\n`files`. Files go to `--out`, or to a temp folder when it is left off.\n\n| Code | Meaning |\n| --- | --- |\n| `0` | It worked. |\n| `1` | The server answered with an error, timed out, or sent something unreadable. |\n| `2` | Nothing configured for that type, a missing key, a missing input file or a bad flag. |\n| `3` | Every candidate row was unreachable. |\n\n`embed` prints each vector's size, norm and first values plus a similarity matrix rather than\nthousands of floats. `--full` prints the vectors, and `--out vectors.json` writes them.\n\nNo key value is ever printed. A server's own error text is passed through as it was received.\n\n## HTTPS on macOS\n\nThe python.org installer ships Python without a CA bundle, so every `https:\u002F\u002F` row fails with\n`CERTIFICATE_VERIFY_FAILED`. The script reports that as exit `2` with a hint, rather than skipping\nto the next row. Run `Install Certificates.command` from `\u002FApplications\u002FPython 3.x\u002F` once, or\nexport `SSL_CERT_FILE=\u002Fetc\u002Fssl\u002Fcert.pem`. I hit this on my own machine the first time I pointed it\nat my gateway.\n","name: AI Models\ndescription: Lets Claude call the models you run yourself or reach through a gateway, for speech, vision, embeddings, reranking, decisions, images, video and music, from one CSV of endpoints.\ntags: [ai, inference, audio, images, embeddings]\nauthor: Patrity\nauthorUrl: https:\u002F\u002Fgithub.com\u002FPatrity\nicon: i-lucide-cpu\nrequires: [python3]\ngitignore:\n  - .claude\u002Fai-models.csv\nenv:\n  - { name: AI_GATEWAY_KEY, description: \"Example key variable for a gateway row. A models.csv row's key_env can name any variable.\", required: false, example: \"\u003Cyour-gateway-key>\" }",{"type":77,"children":78},"root",[79,86,100,107,229,235,318,331,370,375,404,410,415,490,532,542,571,577,926,1056,1076,1082,1297,1337,1344,1425,1431,1444,1450,1507,1596,1622,1627,1633,1685],{"type":80,"tag":81,"props":82,"children":83},"element","p",{},[84],{"type":52,"value":85},"Claude writes text and code. It can't transcribe a voice memo, read a screenshot with a vision\nmodel, embed a paragraph, rank search results, make a calibrated decision, or render an image, a\nsong or a clip. I run models that do those things on my own hardware, and some of them sit behind a\nLiteLLM gateway as well. This bundle is how Claude calls them.",{"type":80,"tag":81,"props":87,"children":88},{},[89,91,98],{"type":52,"value":90},"You list your models in a CSV. One Python script turns a short command (",{"type":80,"tag":92,"props":93,"children":95},"code",{"className":94},[],[96],{"type":52,"value":97},"transcribe clip.wav",{"type":52,"value":99},") into\nthe request that model's server expects. It prints one JSON object with the text, the numbers or the\npath of the file it wrote. When nothing of a type is configured, it says so and Claude tells you,\nrather than guessing at an endpoint.",{"type":80,"tag":101,"props":102,"children":104},"h2",{"id":103},"whats-inside",[105],{"type":52,"value":106},"What's inside",{"type":80,"tag":108,"props":109,"children":110},"table",{},[111,130],{"type":80,"tag":112,"props":113,"children":114},"thead",{},[115],{"type":80,"tag":116,"props":117,"children":118},"tr",{},[119,125],{"type":80,"tag":120,"props":121,"children":122},"th",{},[123],{"type":52,"value":124},"Path",{"type":80,"tag":120,"props":126,"children":127},{},[128],{"type":52,"value":129},"Purpose",{"type":80,"tag":131,"props":132,"children":133},"tbody",{},[134,159,175,191,207],{"type":80,"tag":116,"props":135,"children":136},{},[137,146],{"type":80,"tag":138,"props":139,"children":140},"td",{},[141],{"type":80,"tag":92,"props":142,"children":144},{"className":143},[],[145],{"type":52,"value":55},{"type":80,"tag":138,"props":147,"children":148},{},[149,151,157],{"type":52,"value":150},"The script. Python 3.9+ standard library only, no ",{"type":80,"tag":92,"props":152,"children":154},{"className":153},[],[155],{"type":52,"value":156},"pip install",{"type":52,"value":158},".",{"type":80,"tag":116,"props":160,"children":161},{},[162,170],{"type":80,"tag":138,"props":163,"children":164},{},[165],{"type":80,"tag":92,"props":166,"children":168},{"className":167},[],[169],{"type":52,"value":63},{"type":80,"tag":138,"props":171,"children":172},{},[173],{"type":52,"value":174},"When Claude reaches for each command and how it reads the result.",{"type":80,"tag":116,"props":176,"children":177},{},[178,186],{"type":80,"tag":138,"props":179,"children":180},{},[181],{"type":80,"tag":92,"props":182,"children":184},{"className":183},[],[185],{"type":52,"value":59},{"type":80,"tag":138,"props":187,"children":188},{},[189],{"type":52,"value":190},"Fake rows, at least one per server shape. Copy it and edit.",{"type":80,"tag":116,"props":192,"children":193},{},[194,202],{"type":80,"tag":138,"props":195,"children":196},{},[197],{"type":80,"tag":92,"props":198,"children":200},{"className":199},[],[201],{"type":52,"value":49},{"type":80,"tag":138,"props":203,"children":204},{},[205],{"type":52,"value":206},"A ComfyUI workflow in API format, with placeholders.",{"type":80,"tag":116,"props":208,"children":209},{},[210,218],{"type":80,"tag":138,"props":211,"children":212},{},[213],{"type":80,"tag":92,"props":214,"children":216},{"className":215},[],[217],{"type":52,"value":66},{"type":80,"tag":138,"props":219,"children":220},{},[221,223,228],{"type":52,"value":222},"A pointer block to paste into your project's ",{"type":80,"tag":92,"props":224,"children":226},{"className":225},[],[227],{"type":52,"value":66},{"type":52,"value":158},{"type":80,"tag":101,"props":230,"children":232},{"id":231},"setup",[233],{"type":52,"value":234},"Setup",{"type":80,"tag":236,"props":237,"children":242},"pre",{"className":238,"code":239,"language":240,"meta":241,"style":241},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","mkdir -p ~\u002F.config\u002Fai-models\ncp .claude\u002Fskills\u002Fai-models\u002Fmodels.example.csv ~\u002F.config\u002Fai-models\u002Fmodels.csv\ncp -R .claude\u002Fskills\u002Fai-models\u002Fworkflows ~\u002F.config\u002Fai-models\u002F   # only if you use ComfyUI\n","bash","",[243],{"type":80,"tag":92,"props":244,"children":245},{"__ignoreMap":241},[246,270,289],{"type":80,"tag":247,"props":248,"children":251},"span",{"class":249,"line":250},"line",1,[252,258,264],{"type":80,"tag":247,"props":253,"children":255},{"style":254},"--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0",[256],{"type":52,"value":257},"mkdir",{"type":80,"tag":247,"props":259,"children":261},{"style":260},"--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF",[262],{"type":52,"value":263}," -p",{"type":80,"tag":247,"props":265,"children":267},{"style":266},"--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF",[268],{"type":52,"value":269}," ~\u002F.config\u002Fai-models\n",{"type":80,"tag":247,"props":271,"children":273},{"class":249,"line":272},2,[274,279,284],{"type":80,"tag":247,"props":275,"children":276},{"style":254},[277],{"type":52,"value":278},"cp",{"type":80,"tag":247,"props":280,"children":281},{"style":266},[282],{"type":52,"value":283}," .claude\u002Fskills\u002Fai-models\u002Fmodels.example.csv",{"type":80,"tag":247,"props":285,"children":286},{"style":266},[287],{"type":52,"value":288}," ~\u002F.config\u002Fai-models\u002Fmodels.csv\n",{"type":80,"tag":247,"props":290,"children":292},{"class":249,"line":291},3,[293,297,302,307,312],{"type":80,"tag":247,"props":294,"children":295},{"style":254},[296],{"type":52,"value":278},{"type":80,"tag":247,"props":298,"children":299},{"style":260},[300],{"type":52,"value":301}," -R",{"type":80,"tag":247,"props":303,"children":304},{"style":266},[305],{"type":52,"value":306}," .claude\u002Fskills\u002Fai-models\u002Fworkflows",{"type":80,"tag":247,"props":308,"children":309},{"style":266},[310],{"type":52,"value":311}," ~\u002F.config\u002Fai-models\u002F",{"type":80,"tag":247,"props":313,"children":315},{"style":314},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit",[316],{"type":52,"value":317},"   # only if you use ComfyUI\n",{"type":80,"tag":81,"props":319,"children":320},{},[321,323,329],{"type":52,"value":322},"Edit the rows to point at your servers. Put any keys in ",{"type":80,"tag":92,"props":324,"children":326},{"className":325},[],[327],{"type":52,"value":328},"~\u002F.config\u002Fai-models\u002F.env",{"type":52,"value":330},":",{"type":80,"tag":236,"props":332,"children":334},{"className":238,"code":333,"language":240,"meta":241,"style":241},"# ~\u002F.config\u002Fai-models\u002F.env\nAI_GATEWAY_KEY=\u003Cyour-gateway-key>\n",[335],{"type":80,"tag":92,"props":336,"children":337},{"__ignoreMap":241},[338,346],{"type":80,"tag":247,"props":339,"children":340},{"class":249,"line":250},[341],{"type":80,"tag":247,"props":342,"children":343},{"style":314},[344],{"type":52,"value":345},"# ~\u002F.config\u002Fai-models\u002F.env\n",{"type":80,"tag":247,"props":347,"children":348},{"class":249,"line":272},[349,354,360,365],{"type":80,"tag":247,"props":350,"children":352},{"style":351},"--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8",[353],{"type":52,"value":27},{"type":80,"tag":247,"props":355,"children":357},{"style":356},"--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583",[358],{"type":52,"value":359},"=\u003C",{"type":80,"tag":247,"props":361,"children":362},{"style":266},[363],{"type":52,"value":364},"your-gateway-key",{"type":80,"tag":247,"props":366,"children":367},{"style":356},[368],{"type":52,"value":369},">\n",{"type":80,"tag":81,"props":371,"children":372},{},[373],{"type":52,"value":374},"Then check what answers:",{"type":80,"tag":236,"props":376,"children":378},{"className":238,"code":377,"language":240,"meta":241,"style":241},"python3 .claude\u002Fskills\u002Fai-models\u002Fai.py list --check\n",[379],{"type":80,"tag":92,"props":380,"children":381},{"__ignoreMap":241},[382],{"type":80,"tag":247,"props":383,"children":384},{"class":249,"line":250},[385,389,394,399],{"type":80,"tag":247,"props":386,"children":387},{"style":254},[388],{"type":52,"value":22},{"type":80,"tag":247,"props":390,"children":391},{"style":266},[392],{"type":52,"value":393}," .claude\u002Fskills\u002Fai-models\u002Fai.py",{"type":80,"tag":247,"props":395,"children":396},{"style":266},[397],{"type":52,"value":398}," list",{"type":80,"tag":247,"props":400,"children":401},{"style":260},[402],{"type":52,"value":403}," --check\n",{"type":80,"tag":101,"props":405,"children":407},{"id":406},"where-config-lives",[408],{"type":52,"value":409},"Where config lives",{"type":80,"tag":81,"props":411,"children":412},{},[413],{"type":52,"value":414},"Two pairs of files are read, and the project wins:",{"type":80,"tag":108,"props":416,"children":417},{},[418,437],{"type":80,"tag":112,"props":419,"children":420},{},[421],{"type":80,"tag":116,"props":422,"children":423},{},[424,427,432],{"type":80,"tag":120,"props":425,"children":426},{},[],{"type":80,"tag":120,"props":428,"children":429},{},[430],{"type":52,"value":431},"Models",{"type":80,"tag":120,"props":433,"children":434},{},[435],{"type":52,"value":436},"Keys",{"type":80,"tag":131,"props":438,"children":439},{},[440,465],{"type":80,"tag":116,"props":441,"children":442},{},[443,448,457],{"type":80,"tag":138,"props":444,"children":445},{},[446],{"type":52,"value":447},"Personal",{"type":80,"tag":138,"props":449,"children":450},{},[451],{"type":80,"tag":92,"props":452,"children":454},{"className":453},[],[455],{"type":52,"value":456},"~\u002F.config\u002Fai-models\u002Fmodels.csv",{"type":80,"tag":138,"props":458,"children":459},{},[460],{"type":80,"tag":92,"props":461,"children":463},{"className":462},[],[464],{"type":52,"value":328},{"type":80,"tag":116,"props":466,"children":467},{},[468,473,481],{"type":80,"tag":138,"props":469,"children":470},{},[471],{"type":52,"value":472},"Project",{"type":80,"tag":138,"props":474,"children":475},{},[476],{"type":80,"tag":92,"props":477,"children":479},{"className":478},[],[480],{"type":52,"value":24},{"type":80,"tag":138,"props":482,"children":483},{},[484],{"type":80,"tag":92,"props":485,"children":487},{"className":486},[],[488],{"type":52,"value":489},".claude\u002F.env",{"type":80,"tag":81,"props":491,"children":492},{},[493,499,501,507,509,515,517,523,525,530],{"type":80,"tag":92,"props":494,"children":496},{"className":495},[],[497],{"type":52,"value":498},"$XDG_CONFIG_HOME",{"type":52,"value":500}," replaces ",{"type":80,"tag":92,"props":502,"children":504},{"className":503},[],[505],{"type":52,"value":506},"~\u002F.config",{"type":52,"value":508}," when it is set. Rows merge by ",{"type":80,"tag":92,"props":510,"children":512},{"className":511},[],[513],{"type":52,"value":514},"name",{"type":52,"value":516},", so a project row\nreplaces the personal row with the same name and everything else is kept. Project rows come first.\nA key already exported in your shell wins over both ",{"type":80,"tag":92,"props":518,"children":520},{"className":519},[],[521],{"type":52,"value":522},".env",{"type":52,"value":524}," files, and ",{"type":80,"tag":92,"props":526,"children":528},{"className":527},[],[529],{"type":52,"value":489},{"type":52,"value":531}," wins over the\npersonal one. I use the project layer for a scoped gateway key, so one app never sees my master key.",{"type":80,"tag":81,"props":533,"children":534},{},[535,540],{"type":80,"tag":92,"props":536,"children":538},{"className":537},[],[539],{"type":52,"value":24},{"type":52,"value":541}," is gitignored by default because it tends to hold LAN addresses. Take the\nline out of the managed block if your team wants to share it.",{"type":80,"tag":81,"props":543,"children":544},{},[545,547,553,555,561,563,569],{"type":52,"value":546},"The project is ",{"type":80,"tag":92,"props":548,"children":550},{"className":549},[],[551],{"type":52,"value":552},"$CLAUDE_PROJECT_DIR",{"type":52,"value":554},", or the nearest folder above the working directory that has a\n",{"type":80,"tag":92,"props":556,"children":558},{"className":557},[],[559],{"type":52,"value":560},".claude\u002F",{"type":52,"value":562}," in it. The script never works it out from its own location, so a copy in\n",{"type":80,"tag":92,"props":564,"children":566},{"className":565},[],[567],{"type":52,"value":568},"~\u002F.claude\u002Fskills\u002F",{"type":52,"value":570}," works in every project.",{"type":80,"tag":101,"props":572,"children":574},{"id":573},"the-csv",[575],{"type":52,"value":576},"The CSV",{"type":80,"tag":108,"props":578,"children":579},{},[580,601],{"type":80,"tag":112,"props":581,"children":582},{},[583],{"type":80,"tag":116,"props":584,"children":585},{},[586,591,596],{"type":80,"tag":120,"props":587,"children":588},{},[589],{"type":52,"value":590},"Column",{"type":80,"tag":120,"props":592,"children":593},{},[594],{"type":52,"value":595},"Example",{"type":80,"tag":120,"props":597,"children":598},{},[599],{"type":52,"value":600},"Meaning",{"type":80,"tag":131,"props":602,"children":603},{},[604,637,732,758,784,810,835,861,894],{"type":80,"tag":116,"props":605,"children":606},{},[607,615,624],{"type":80,"tag":138,"props":608,"children":609},{},[610],{"type":80,"tag":92,"props":611,"children":613},{"className":612},[],[614],{"type":52,"value":514},{"type":80,"tag":138,"props":616,"children":617},{},[618],{"type":80,"tag":92,"props":619,"children":621},{"className":620},[],[622],{"type":52,"value":623},"home-stt",{"type":80,"tag":138,"props":625,"children":626},{},[627,629,635],{"type":52,"value":628},"Unique. ",{"type":80,"tag":92,"props":630,"children":632},{"className":631},[],[633],{"type":52,"value":634},"--model home-stt",{"type":52,"value":636}," picks this row.",{"type":80,"tag":116,"props":638,"children":639},{},[640,649,658],{"type":80,"tag":138,"props":641,"children":642},{},[643],{"type":80,"tag":92,"props":644,"children":646},{"className":645},[],[647],{"type":52,"value":648},"type",{"type":80,"tag":138,"props":650,"children":651},{},[652],{"type":80,"tag":92,"props":653,"children":655},{"className":654},[],[656],{"type":52,"value":657},"stt",{"type":80,"tag":138,"props":659,"children":660},{},[661,666,668,674,675,681,682,688,689,695,696,702,703,709,710,716,717,723,725,731],{"type":80,"tag":92,"props":662,"children":664},{"className":663},[],[665],{"type":52,"value":657},{"type":52,"value":667},", ",{"type":80,"tag":92,"props":669,"children":671},{"className":670},[],[672],{"type":52,"value":673},"tts",{"type":52,"value":667},{"type":80,"tag":92,"props":676,"children":678},{"className":677},[],[679],{"type":52,"value":680},"vision",{"type":52,"value":667},{"type":80,"tag":92,"props":683,"children":685},{"className":684},[],[686],{"type":52,"value":687},"embed",{"type":52,"value":667},{"type":80,"tag":92,"props":690,"children":692},{"className":691},[],[693],{"type":52,"value":694},"rerank",{"type":52,"value":667},{"type":80,"tag":92,"props":697,"children":699},{"className":698},[],[700],{"type":52,"value":701},"decide",{"type":52,"value":667},{"type":80,"tag":92,"props":704,"children":706},{"className":705},[],[707],{"type":52,"value":708},"image",{"type":52,"value":667},{"type":80,"tag":92,"props":711,"children":713},{"className":712},[],[714],{"type":52,"value":715},"video",{"type":52,"value":667},{"type":80,"tag":92,"props":718,"children":720},{"className":719},[],[721],{"type":52,"value":722},"music",{"type":52,"value":724}," or ",{"type":80,"tag":92,"props":726,"children":728},{"className":727},[],[729],{"type":52,"value":730},"chat",{"type":52,"value":158},{"type":80,"tag":116,"props":733,"children":734},{},[735,744,753],{"type":80,"tag":138,"props":736,"children":737},{},[738],{"type":80,"tag":92,"props":739,"children":741},{"className":740},[],[742],{"type":52,"value":743},"shape",{"type":80,"tag":138,"props":745,"children":746},{},[747],{"type":80,"tag":92,"props":748,"children":750},{"className":749},[],[751],{"type":52,"value":752},"openai",{"type":80,"tag":138,"props":754,"children":755},{},[756],{"type":52,"value":757},"Which request format the server speaks (below).",{"type":80,"tag":116,"props":759,"children":760},{},[761,770,779],{"type":80,"tag":138,"props":762,"children":763},{},[764],{"type":80,"tag":92,"props":765,"children":767},{"className":766},[],[768],{"type":52,"value":769},"base_url",{"type":80,"tag":138,"props":771,"children":772},{},[773],{"type":80,"tag":92,"props":774,"children":776},{"className":775},[],[777],{"type":52,"value":778},"http:\u002F\u002Flocalhost:8000\u002Fv1",{"type":80,"tag":138,"props":780,"children":781},{},[782],{"type":52,"value":783},"Everything before the endpoint path.",{"type":80,"tag":116,"props":785,"children":786},{},[787,796,805],{"type":80,"tag":138,"props":788,"children":789},{},[790],{"type":80,"tag":92,"props":791,"children":793},{"className":792},[],[794],{"type":52,"value":795},"model",{"type":80,"tag":138,"props":797,"children":798},{},[799],{"type":80,"tag":92,"props":800,"children":802},{"className":801},[],[803],{"type":52,"value":804},"whisper-large-v3-turbo",{"type":80,"tag":138,"props":806,"children":807},{},[808],{"type":52,"value":809},"The model name the server expects.",{"type":80,"tag":116,"props":811,"children":812},{},[813,822,830],{"type":80,"tag":138,"props":814,"children":815},{},[816],{"type":80,"tag":92,"props":817,"children":819},{"className":818},[],[820],{"type":52,"value":821},"key_env",{"type":80,"tag":138,"props":823,"children":824},{},[825],{"type":80,"tag":92,"props":826,"children":828},{"className":827},[],[829],{"type":52,"value":27},{"type":80,"tag":138,"props":831,"children":832},{},[833],{"type":52,"value":834},"The variable holding the key. Empty means no auth.",{"type":80,"tag":116,"props":836,"children":837},{},[838,847,856],{"type":80,"tag":138,"props":839,"children":840},{},[841],{"type":80,"tag":92,"props":842,"children":844},{"className":843},[],[845],{"type":52,"value":846},"options",{"type":80,"tag":138,"props":848,"children":849},{},[850],{"type":80,"tag":92,"props":851,"children":853},{"className":852},[],[854],{"type":52,"value":855},"voice=alloy;dimensions=1024",{"type":80,"tag":138,"props":857,"children":858},{},[859],{"type":52,"value":860},"Defaults merged into every request for this row.",{"type":80,"tag":116,"props":862,"children":863},{},[864,873,882],{"type":80,"tag":138,"props":865,"children":866},{},[867],{"type":80,"tag":92,"props":868,"children":870},{"className":869},[],[871],{"type":52,"value":872},"example",{"type":80,"tag":138,"props":874,"children":875},{},[876],{"type":80,"tag":92,"props":877,"children":879},{"className":878},[],[880],{"type":52,"value":881},"transcribe meeting.wav",{"type":80,"tag":138,"props":883,"children":884},{},[885,887,893],{"type":52,"value":886},"One call that works, shown by ",{"type":80,"tag":92,"props":888,"children":890},{"className":889},[],[891],{"type":52,"value":892},"list",{"type":52,"value":158},{"type":80,"tag":116,"props":895,"children":896},{},[897,906,915],{"type":80,"tag":138,"props":898,"children":899},{},[900],{"type":80,"tag":92,"props":901,"children":903},{"className":902},[],[904],{"type":52,"value":905},"notes",{"type":80,"tag":138,"props":907,"children":908},{},[909],{"type":80,"tag":92,"props":910,"children":912},{"className":911},[],[913],{"type":52,"value":914},"WAV only",{"type":80,"tag":138,"props":916,"children":917},{},[918,920,925],{"type":52,"value":919},"Hints for Claude, shown by ",{"type":80,"tag":92,"props":921,"children":923},{"className":922},[],[924],{"type":52,"value":892},{"type":52,"value":158},{"type":80,"tag":81,"props":927,"children":928},{},[929,934,936,942,944,950,952,958,959,965,966,972,974,980,982,988,990,996,998,1003,1005,1010,1012,1017,1019,1025,1027,1033,1035,1040,1042,1047,1048,1054],{"type":80,"tag":92,"props":930,"children":932},{"className":931},[],[933],{"type":52,"value":846},{"type":52,"value":935}," and ",{"type":80,"tag":92,"props":937,"children":939},{"className":938},[],[940],{"type":52,"value":941},"--param",{"type":52,"value":943}," take ",{"type":80,"tag":92,"props":945,"children":947},{"className":946},[],[948],{"type":52,"value":949},"key=value",{"type":52,"value":951},". Numbers, ",{"type":80,"tag":92,"props":953,"children":955},{"className":954},[],[956],{"type":52,"value":957},"true",{"type":52,"value":667},{"type":80,"tag":92,"props":960,"children":962},{"className":961},[],[963],{"type":52,"value":964},"false",{"type":52,"value":935},{"type":80,"tag":92,"props":967,"children":969},{"className":968},[],[970],{"type":52,"value":971},"null",{"type":52,"value":973}," are sent as those\ntypes. Wrap a value in double quotes to keep it a string. On the command line the shell eats one\nlayer, so write ",{"type":80,"tag":92,"props":975,"children":977},{"className":976},[],[978],{"type":52,"value":979},"--param 'seed=\"42\"'",{"type":52,"value":981},". In a CSV cell it is ",{"type":80,"tag":92,"props":983,"children":985},{"className":984},[],[986],{"type":52,"value":987},"\"seed=\"\"42\"\"\"",{"type":52,"value":989},". ",{"type":80,"tag":92,"props":991,"children":993},{"className":992},[],[994],{"type":52,"value":995},";",{"type":52,"value":997}," separates\n",{"type":80,"tag":92,"props":999,"children":1001},{"className":1000},[],[1002],{"type":52,"value":846},{"type":52,"value":1004},", so an ",{"type":80,"tag":92,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":52,"value":846},{"type":52,"value":1011}," value can't contain one. Use ",{"type":80,"tag":92,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":52,"value":941},{"type":52,"value":1018}," for that. A dotted key nests:\n",{"type":80,"tag":92,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":52,"value":1024},"options.duration_sec=20",{"type":52,"value":1026}," becomes ",{"type":80,"tag":92,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":52,"value":1032},"{\"options\": {\"duration_sec\": 20}}",{"type":52,"value":1034},". A request is built from the\nscript's defaults, then the row's ",{"type":80,"tag":92,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":52,"value":846},{"type":52,"value":1041},", then the command's flags, then ",{"type":80,"tag":92,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":52,"value":941},{"type":52,"value":989},{"type":80,"tag":92,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":52,"value":1053},"--body @file.json",{"type":52,"value":1055}," replaces the lot and is sent as written.",{"type":80,"tag":81,"props":1057,"children":1058},{},[1059,1061,1067,1069,1074],{"type":52,"value":1060},"Lines that start with ",{"type":80,"tag":92,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":52,"value":1066},"#",{"type":52,"value":1068}," are ignored. A row with an unknown type or shape is reported by ",{"type":80,"tag":92,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":52,"value":892},{"type":52,"value":1075},"\nand skipped. The rest still load.",{"type":80,"tag":101,"props":1077,"children":1079},{"id":1078},"shapes",[1080],{"type":52,"value":1081},"Shapes",{"type":80,"tag":108,"props":1083,"children":1084},{},[1085,1106],{"type":80,"tag":112,"props":1086,"children":1087},{},[1088],{"type":80,"tag":116,"props":1089,"children":1090},{},[1091,1096,1101],{"type":80,"tag":120,"props":1092,"children":1093},{},[1094],{"type":52,"value":1095},"Shape",{"type":80,"tag":120,"props":1097,"children":1098},{},[1099],{"type":52,"value":1100},"Serves",{"type":80,"tag":120,"props":1102,"children":1103},{},[1104],{"type":52,"value":1105},"Notes",{"type":80,"tag":131,"props":1107,"children":1108},{},[1109,1138,1187,1215,1254],{"type":80,"tag":116,"props":1110,"children":1111},{},[1112,1120,1125],{"type":80,"tag":138,"props":1113,"children":1114},{},[1115],{"type":80,"tag":92,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":52,"value":752},{"type":80,"tag":138,"props":1121,"children":1122},{},[1123],{"type":52,"value":1124},"chat, vision, embed, stt, tts, image",{"type":80,"tag":138,"props":1126,"children":1127},{},[1128,1130,1136],{"type":52,"value":1129},"LiteLLM, OpenRouter, vLLM, llama.cpp, TEI, Ollama. ",{"type":80,"tag":92,"props":1131,"children":1133},{"className":1132},[],[1134],{"type":52,"value":1135},"wav_only=true",{"type":52,"value":1137}," converts audio to WAV before transcription, for a gateway route that ends at a WAV-only server.",{"type":80,"tag":116,"props":1139,"children":1140},{},[1141,1150,1154],{"type":80,"tag":138,"props":1142,"children":1143},{},[1144],{"type":80,"tag":92,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":52,"value":1149},"cohere-rerank",{"type":80,"tag":138,"props":1151,"children":1152},{},[1153],{"type":52,"value":694},{"type":80,"tag":138,"props":1155,"children":1156},{},[1157,1163,1165,1171,1172,1178,1179,1185],{"type":80,"tag":92,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":52,"value":1162},"POST \u002Frerank",{"type":52,"value":1164}," with ",{"type":80,"tag":92,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":52,"value":1170},"query",{"type":52,"value":667},{"type":80,"tag":92,"props":1173,"children":1175},{"className":1174},[],[1176],{"type":52,"value":1177},"documents",{"type":52,"value":667},{"type":80,"tag":92,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":52,"value":1184},"top_n",{"type":52,"value":1186},". LiteLLM's rerank route speaks it.",{"type":80,"tag":116,"props":1188,"children":1189},{},[1190,1199,1203],{"type":80,"tag":138,"props":1191,"children":1192},{},[1193],{"type":80,"tag":92,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":52,"value":1198},"systemone",{"type":80,"tag":138,"props":1200,"children":1201},{},[1202],{"type":52,"value":701},{"type":80,"tag":138,"props":1204,"children":1205},{},[1206,1208,1213],{"type":52,"value":1207},"Clef-Flash on llama.cpp and TypeSafe's Jev share this body. Bearer auth when ",{"type":80,"tag":92,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":52,"value":821},{"type":52,"value":1214}," is set.",{"type":80,"tag":116,"props":1216,"children":1217},{},[1218,1227,1232],{"type":80,"tag":138,"props":1219,"children":1220},{},[1221],{"type":80,"tag":92,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":52,"value":1226},"audiocpp",{"type":80,"tag":138,"props":1228,"children":1229},{},[1230],{"type":52,"value":1231},"tts, stt, music",{"type":80,"tag":138,"props":1233,"children":1234},{},[1235,1244,1246,1252],{"type":80,"tag":1236,"props":1237,"children":1241},"a",{"href":1238,"rel":1239},"https:\u002F\u002Fgithub.com\u002F0xShug0\u002Faudio.cpp",[1240],"nofollow",[1242],{"type":52,"value":1243},"audio.cpp",{"type":52,"value":1245},"'s server. Transcription takes WAV, so other formats go through ",{"type":80,"tag":92,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":52,"value":1251},"ffmpeg",{"type":52,"value":1253}," first when it is installed.",{"type":80,"tag":116,"props":1255,"children":1256},{},[1257,1266,1271],{"type":80,"tag":138,"props":1258,"children":1259},{},[1260],{"type":80,"tag":92,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":52,"value":1265},"comfyui",{"type":80,"tag":138,"props":1267,"children":1268},{},[1269],{"type":52,"value":1270},"image, video",{"type":80,"tag":138,"props":1272,"children":1273},{},[1274,1276,1282,1283,1289,1290,1296],{"type":52,"value":1275},"Submits a workflow, polls, downloads the outputs. Reserved options: ",{"type":80,"tag":92,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":52,"value":1281},"workflow",{"type":52,"value":667},{"type":80,"tag":92,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":52,"value":1288},"poll",{"type":52,"value":667},{"type":80,"tag":92,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":52,"value":1295},"timeout",{"type":52,"value":158},{"type":80,"tag":81,"props":1298,"children":1299},{},[1300,1305,1307,1313,1315,1321,1323,1329,1330,1335],{"type":80,"tag":92,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":52,"value":769},{"type":52,"value":1306}," is the prefix, and the script adds the endpoint path to it. That's what lets one shape\nrun direct or through a gateway. audio.cpp music is ",{"type":80,"tag":92,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":52,"value":1312},"http:\u002F\u002Fhost:8885\u002Fv1",{"type":52,"value":1314}," plus ",{"type":80,"tag":92,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":52,"value":1320},"\u002Ftasks\u002Frun",{"type":52,"value":1322},"\ndirect, and ",{"type":80,"tag":92,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":52,"value":1328},"https:\u002F\u002Fgateway.example.com\u002Fmusic",{"type":52,"value":1314},{"type":80,"tag":92,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":52,"value":1320},{"type":52,"value":1336}," through a LiteLLM pass-through.",{"type":80,"tag":1338,"props":1339,"children":1341},"h3",{"id":1340},"comfyui-workflows",[1342],{"type":52,"value":1343},"ComfyUI workflows",{"type":80,"tag":81,"props":1345,"children":1346},{},[1347,1349,1355,1357,1363,1365,1371,1372,1378,1379,1385,1386,1392,1393,1399,1401,1407,1409,1415,1417,1423],{"type":52,"value":1348},"Export your graph with \"Save (API Format)\" and point the row at it with ",{"type":80,"tag":92,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":52,"value":1354},"workflow=\u003Cfile>",{"type":52,"value":1356},". A\nrelative path resolves from the CSV that names it. Any string value that is exactly ",{"type":80,"tag":92,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":52,"value":1362},"{prompt}",{"type":52,"value":1364},",\n",{"type":80,"tag":92,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":52,"value":1370},"{negative}",{"type":52,"value":667},{"type":80,"tag":92,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":52,"value":1377},"{seed}",{"type":52,"value":667},{"type":80,"tag":92,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":52,"value":1384},"{width}",{"type":52,"value":667},{"type":80,"tag":92,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":52,"value":1391},"{height}",{"type":52,"value":724},{"type":80,"tag":92,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":52,"value":1398},"{frames}",{"type":52,"value":1400}," is filled in, and numbers stay numbers.\n",{"type":80,"tag":92,"props":1402,"children":1404},{"className":1403},[],[1405],{"type":52,"value":1406},"--param steps=30",{"type":52,"value":1408}," fills a ",{"type":80,"tag":92,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":52,"value":1414},"{steps}",{"type":52,"value":1416}," you add yourself. A placeholder left without a value stops the\ncall and names it. The seed is random unless you pass ",{"type":80,"tag":92,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":52,"value":1422},"--seed",{"type":52,"value":1424},", and it comes back in the result.",{"type":80,"tag":101,"props":1426,"children":1428},{"id":1427},"fallback",[1429],{"type":52,"value":1430},"Fallback",{"type":80,"tag":81,"props":1432,"children":1433},{},[1434,1436,1442],{"type":52,"value":1435},"Rows of one type are tried in order. A row whose key variable is unset is skipped. A row that is\nunreachable (DNS failure, connection refused, or no connection within 3 s) hands over to the next\nrow. A server that answers with an error stops the call there, so a bad request is never quietly\nsent on to a paid gateway. ",{"type":80,"tag":92,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":52,"value":1441},"--model \u003Cname>",{"type":52,"value":1443}," turns fallback off.",{"type":80,"tag":101,"props":1445,"children":1447},{"id":1446},"output-and-exit-codes",[1448],{"type":52,"value":1449},"Output and exit codes",{"type":80,"tag":81,"props":1451,"children":1452},{},[1453,1455,1461,1462,1467,1469,1474,1476,1482,1483,1489,1491,1497,1499,1505],{"type":52,"value":1454},"Every command prints one JSON object: ",{"type":80,"tag":92,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":52,"value":1460},"ok",{"type":52,"value":667},{"type":80,"tag":92,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":52,"value":648},{"type":52,"value":1468},", the ",{"type":80,"tag":92,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":52,"value":795},{"type":52,"value":1475}," row it used, ",{"type":80,"tag":92,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":52,"value":1481},"tried",{"type":52,"value":667},{"type":80,"tag":92,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":52,"value":1488},"result",{"type":52,"value":1490}," and\n",{"type":80,"tag":92,"props":1492,"children":1494},{"className":1493},[],[1495],{"type":52,"value":1496},"files",{"type":52,"value":1498},". Files go to ",{"type":80,"tag":92,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":52,"value":1504},"--out",{"type":52,"value":1506},", or to a temp folder when it is left off.",{"type":80,"tag":108,"props":1508,"children":1509},{},[1510,1525],{"type":80,"tag":112,"props":1511,"children":1512},{},[1513],{"type":80,"tag":116,"props":1514,"children":1515},{},[1516,1521],{"type":80,"tag":120,"props":1517,"children":1518},{},[1519],{"type":52,"value":1520},"Code",{"type":80,"tag":120,"props":1522,"children":1523},{},[1524],{"type":52,"value":600},{"type":80,"tag":131,"props":1526,"children":1527},{},[1528,1545,1562,1579],{"type":80,"tag":116,"props":1529,"children":1530},{},[1531,1540],{"type":80,"tag":138,"props":1532,"children":1533},{},[1534],{"type":80,"tag":92,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":52,"value":1539},"0",{"type":80,"tag":138,"props":1541,"children":1542},{},[1543],{"type":52,"value":1544},"It worked.",{"type":80,"tag":116,"props":1546,"children":1547},{},[1548,1557],{"type":80,"tag":138,"props":1549,"children":1550},{},[1551],{"type":80,"tag":92,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":52,"value":1556},"1",{"type":80,"tag":138,"props":1558,"children":1559},{},[1560],{"type":52,"value":1561},"The server answered with an error, timed out, or sent something unreadable.",{"type":80,"tag":116,"props":1563,"children":1564},{},[1565,1574],{"type":80,"tag":138,"props":1566,"children":1567},{},[1568],{"type":80,"tag":92,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":52,"value":1573},"2",{"type":80,"tag":138,"props":1575,"children":1576},{},[1577],{"type":52,"value":1578},"Nothing configured for that type, a missing key, a missing input file or a bad flag.",{"type":80,"tag":116,"props":1580,"children":1581},{},[1582,1591],{"type":80,"tag":138,"props":1583,"children":1584},{},[1585],{"type":80,"tag":92,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":52,"value":1590},"3",{"type":80,"tag":138,"props":1592,"children":1593},{},[1594],{"type":52,"value":1595},"Every candidate row was unreachable.",{"type":80,"tag":81,"props":1597,"children":1598},{},[1599,1604,1606,1612,1614,1620],{"type":80,"tag":92,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":52,"value":687},{"type":52,"value":1605}," prints each vector's size, norm and first values plus a similarity matrix rather than\nthousands of floats. ",{"type":80,"tag":92,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":52,"value":1611},"--full",{"type":52,"value":1613}," prints the vectors, and ",{"type":80,"tag":92,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":52,"value":1619},"--out vectors.json",{"type":52,"value":1621}," writes them.",{"type":80,"tag":81,"props":1623,"children":1624},{},[1625],{"type":52,"value":1626},"No key value is ever printed. A server's own error text is passed through as it was received.",{"type":80,"tag":101,"props":1628,"children":1630},{"id":1629},"https-on-macos",[1631],{"type":52,"value":1632},"HTTPS on macOS",{"type":80,"tag":81,"props":1634,"children":1635},{},[1636,1638,1644,1646,1652,1654,1659,1661,1667,1669,1675,1677,1683],{"type":52,"value":1637},"The python.org installer ships Python without a CA bundle, so every ",{"type":80,"tag":92,"props":1639,"children":1641},{"className":1640},[],[1642],{"type":52,"value":1643},"https:\u002F\u002F",{"type":52,"value":1645}," row fails with\n",{"type":80,"tag":92,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":52,"value":1651},"CERTIFICATE_VERIFY_FAILED",{"type":52,"value":1653},". The script reports that as exit ",{"type":80,"tag":92,"props":1655,"children":1657},{"className":1656},[],[1658],{"type":52,"value":1573},{"type":52,"value":1660}," with a hint, rather than skipping\nto the next row. Run ",{"type":80,"tag":92,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":52,"value":1666},"Install Certificates.command",{"type":52,"value":1668}," from ",{"type":80,"tag":92,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":52,"value":1674},"\u002FApplications\u002FPython 3.x\u002F",{"type":52,"value":1676}," once, or\nexport ",{"type":80,"tag":92,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":52,"value":1682},"SSL_CERT_FILE=\u002Fetc\u002Fssl\u002Fcert.pem",{"type":52,"value":1684},". I hit this on my own machine the first time I pointed it\nat my gateway.",{"type":80,"tag":1686,"props":1687,"children":1688},"style",{},[1689],{"type":52,"value":1690},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"name":10,"description":11,"tags":1692,"author":18,"authorUrl":19,"icon":20,"requires":1693,"gitignore":1694,"env":1695},[13,14,15,16,17],[22],[24],[1696],{"name":27,"description":28,"required":29,"example":30}]