[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RWWZAQZC9MPFM7G1P9AXQ":3,"skill-same:01M71RWWZAQZC9MPFM7G1P9AXQ":64},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":14,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M71RWWZAQZC9MPFM7G1P9AXQ","add-llm-provider",null,"Add support for a new LLM provider in core\u002Fllm. Use when the target provider is NOT OpenAI-compatible (if it is, just set OPENAI_BASE_URL — no code change). Mention triggers - new LLM provider, add Anthropic-style backend, model.LLM, GenerateContent, integrate provider X.","blouargant\u002Fomnis","blouargant","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5691896?v=4","01M71RWETBTYXSMT6FFC4Q7HPW","Bertrand Louargant","01M71RWEV3G47S696JYH8EA7W2",0,"MIT","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002F.agents\u002Fskills\u002Fadd-llm-provider\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"add llm provider","provider","add","triggers","code change","target","new","when","for","openai-compatible","URL","style","change","backend","use","just","model","SET","code","core","2026-11-10 13:02:02",false,"---\nname: add-llm-provider\ndescription: Add support for a new LLM provider in core\u002Fllm. Use when the target provider is NOT OpenAI-compatible (if it is, just set OPENAI_BASE_URL — no code change). Mention triggers - new LLM provider, add Anthropic-style backend, model.LLM, GenerateContent, integrate provider X.\n---\n\n# Add a new LLM provider\n\n## First, check the cheap path\n\nIf the provider exposes an OpenAI-compatible API (Ollama, Groq, Together,\nvLLM, Mistral, DeepInfra, Fireworks, Azure OpenAI, …), **do not write\ncode**. Just set:\n\n```bash\nexport OMNIS_PROVIDER=openai_compat\nexport OPENAI_BASE_URL=https:\u002F\u002Fapi.example.com\u002Fv1\nexport OPENAI_API_KEY=sk-…\nexport OMNIS_MODEL=their-model-id\n```\n\nDone. Test with `go run . console`.\n\nIf the API is genuinely different, continue.\n\n## Implement `model.LLM`\n\nAdd a new file under [`core\u002Fllm\u002F`](..\u002F..\u002Fcore\u002Fllm\u002F) modelled on\n[`anthropic.go`](..\u002F..\u002Fcore\u002Fllm\u002Fanthropic.go) or\n[`openai.go`](..\u002F..\u002Fcore\u002Fllm\u002Fopenai.go). Both are ~200 lines, no SDK.\n\nThe interface is:\n\n```go\ntype LLM interface {\n    Name() string\n    GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool)\n        iter.Seq2[*model.LLMResponse, error]\n}\n```\n\nTranslation primitives are already in\n[`core\u002Fllm\u002Fconvert.go`](..\u002F..\u002Fcore\u002Fllm\u002Fconvert.go) — reuse\n`systemTextFromReq`, content-part conversions, etc. Don't duplicate.\n\n## Register\n\nEdit [`core\u002Fllm\u002Fllm.go`](..\u002F..\u002Fcore\u002Fllm\u002Fllm.go):\n\n1. Add a default model id to the `defaultModel` map.\n2. Add a `case` in the `New()` switch.\n3. Document the auth env var(s) at the top of the file.\n\n## Test\n\n```bash\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go build .\u002F... && \\\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go vet .\u002F... && echo OK\n\nexport OMNIS_PROVIDER=newprov\nexport NEWPROV_API_KEY=…\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go run . console\n> hello, who are you?\n```\n\nThe model's `Name()` should appear in `.agent_events.log`'s\n`BeforeModel` entries.\n\n## Update the docs\n\nWhen the provider works:\n\n1. Add a row to the table in [`docs\u002Fproviders.md`](..\u002F..\u002Fdocs\u002Fproviders.md)\n   and the README.\n2. If env vars differ from the existing pattern, add a note in\n   [`.agents\u002Fbuild-and-test\u002FSKILL.md`](..\u002Fbuild-and-test\u002FSKILL.md).\n\n## Don'ts\n\n- ❌ Don't import a third-party SDK. Use `net\u002Fhttp` + SSE.\n- ❌ Don't change the `model.LLM` interface — it belongs to ADK.\n- ❌ Don't add provider-specific behaviour above the dispatcher; keep\n  the rest of the codebase provider-agnostic.\n- ❌ Don't drop streaming support; `GenerateContent` must honour the\n  `stream` flag.\n","# Add a new LLM provider\n\n## First, check the cheap path\n\nIf the provider exposes an OpenAI-compatible API (Ollama, Groq, Together,\nvLLM, Mistral, DeepInfra, Fireworks, Azure OpenAI, …), **do not write\ncode**. Just set:\n\n```bash\nexport OMNIS_PROVIDER=openai_compat\nexport OPENAI_BASE_URL=https:\u002F\u002Fapi.example.com\u002Fv1\nexport OPENAI_API_KEY=sk-…\nexport OMNIS_MODEL=their-model-id\n```\n\nDone. Test with `go run . console`.\n\nIf the API is genuinely different, continue.\n\n## Implement `model.LLM`\n\nAdd a new file under [`core\u002Fllm\u002F`](..\u002F..\u002Fcore\u002Fllm\u002F) modelled on\n[`anthropic.go`](..\u002F..\u002Fcore\u002Fllm\u002Fanthropic.go) or\n[`openai.go`](..\u002F..\u002Fcore\u002Fllm\u002Fopenai.go). Both are ~200 lines, no SDK.\n\nThe interface is:\n\n```go\ntype LLM interface {\n    Name() string\n    GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool)\n        iter.Seq2[*model.LLMResponse, error]\n}\n```\n\nTranslation primitives are already in\n[`core\u002Fllm\u002Fconvert.go`](..\u002F..\u002Fcore\u002Fllm\u002Fconvert.go) — reuse\n`systemTextFromReq`, content-part conversions, etc. Don't duplicate.\n\n## Register\n\nEdit [`core\u002Fllm\u002Fllm.go`](..\u002F..\u002Fcore\u002Fllm\u002Fllm.go):\n\n1. Add a default model id to the `defaultModel` map.\n2. Add a `case` in the `New()` switch.\n3. Document the auth env var(s) at the top of the file.\n\n## Test\n\n```bash\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go build .\u002F... && \\\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go vet .\u002F... && echo OK\n\nexport OMNIS_PROVIDER=newprov\nexport NEWPROV_API_KEY=…\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go run . console\n> hello, who are you?\n```\n\nThe model's `Name()` should appear in `.agent_events.log`'s\n`BeforeModel` entries.\n\n## Update the docs\n\nWhen the provider works:\n\n1. Add a row to the table in [`docs\u002Fproviders.md`](..\u002F..\u002Fdocs\u002Fproviders.md)\n   and the README.\n2. If env vars differ from the existing pattern, add a note in\n   [`.agents\u002Fbuild-and-test\u002FSKILL.md`](..\u002Fbuild-and-test\u002FSKILL.md).\n\n## Don'ts\n\n- ❌ Don't import a third-party SDK. Use `net\u002Fhttp` + SSE.\n- ❌ Don't change the `model.LLM` interface — it belongs to ADK.\n- ❌ Don't add provider-specific behaviour above the dispatcher; keep\n  the rest of the codebase provider-agnostic.\n- ❌ Don't drop streaming support; `GenerateContent` must honour the\n  `stream` flag.\n",{"name":5,"description":7},"develop","c9440489468f6bbafc65e9a10811428ac0ef2619",".agents\u002Fskills\u002Fadd-llm-provider","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis","https:\u002F\u002Fgithub.com\u002Fblouargant","2026-11-10 16:30:07",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add blouargant\u002Fomnis --skill add-llm-provider",{"tool":56,"command":57},"bunx","bunx skills add blouargant\u002Fomnis --skill add-llm-provider",{"tool":59,"command":60},"pnpm","pnpm dlx skills add blouargant\u002Fomnis --skill add-llm-provider","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002F.agents\u002Fskills\u002Fadd-llm-provider\u002FSKILL.md",true,[],[65,92,111,138,160,191],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":76,"publishedAt":39},"01M71RZKQ64WTDCV48Z4Y071FA","skill-creator","Create or update a skill playbook (SKILL.md) for the agent. Use when the user wants to create a new skill, add a skill, define a new agent capability, update an existing skill, edit a skill, refine a skill playbook, or specialise the agent for a new domain.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fskill-creator\u002FSKILL.md",[71],{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[77,78,79,80,27,25,81,33,82,26,83,84,85,86,87,88,89,21,90,91],"skill creator","creator","new agent","domain","define","Existing","create","update","refine","playbook","edit","a skill","new skill","user","existing skill",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":39},"01M71RZJ15NMV6FXBZD1AQF3K7","review","Review a body of work (source code, configuration, documents, infra manifests, …) for correctness, clarity, and obvious risks. Use this skill whenever the user asks for a review, audit or critique.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Freview\u002FSKILL.md",[],[94,99,100,101,102,27,103,33,104,105,106,107,108,109,37,110,90],"infra","work","critique","audit","clarity","body","source","manifests","documents","configuration","correctness","source code",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":120,"publishedAt":39},"01M71RZFP8KJEANYXAH6AX68G0","pdf","Fallback PDF text extractor using pdftotext (poppler). Use ONLY when the preferred `liteparse` skill is unavailable or for a quick plain-text dump of a simple text PDF — for the best PDF parsing (scanned, multi-column, layout-heavy, or non-PDF formats) prefer the `liteparse` skill.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fpdf\u002FSKILL.md",[117],{"categoryNo":118,"categoryName":119,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000002","文档处理",[121,122,123,124,125,126,127,128,27,129,130,131,132,133,33,134,26,135,136,137],"PDF","text","multi","quick","simple","parsing","pdf text extractor","layout","liteparse","plain-text","column","only","formats","pdftotext","plain","pdf parsing","file",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":146,"publishedAt":39},"01M71RZDAHNX7JC52P5HH5XPEG","pandoc","This skill should be used when converting documents between formats (Markdown, DOCX, PDF, HTML, LaTeX, etc.) using pandoc. Use for format conversion, document generation, and preparing markdown for Google Docs or other word processors.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fpandoc\u002FSKILL.md",[144,145],{"categoryNo":118,"categoryName":119,"taxonomyType":74,"taxonomyTypeDesc":75},{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},[140,147,121,148,27,149,33,150,107,26,151,152,153,154,155,156,133,157,158,159],"docx","Word","document generation","document","conversion","generation","markdown","format","google","google docs","docs","html","LaTeX",{"skillNo":161,"name":129,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":177,"publishedAt":39},"01M71RZ7PSG17ES4CQWA6860F5","Preferred local parser for extracting text from PDFs, images, and scanned\u002Flayout-heavy documents (OCR, screenshots, complex PDFs) — far better than pdftotext. Use this FIRST for any PDF, image, or OCR text-extraction or conversion task. NOTE for Office documents (DOCX, PPTX, XLSX, ODT) — for plain text extraction prefer the `pandoc` skill, which needs no LibreOffice; only use LiteParse for Office docs when you need its layout\u002FOCR\u002Fscreenshot output. The `pdf` skill (pdftotext) is only a fallback for when LiteParse cannot be installed.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fliteparse\u002FSKILL.md",[165,166,169,172],{"categoryNo":118,"categoryName":119,"taxonomyType":74,"taxonomyTypeDesc":75},{"categoryNo":167,"categoryName":168,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":170,"categoryName":171,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":173,"categoryName":174,"taxonomyType":175,"taxonomyTypeDesc":176},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[129,178,179,180,147,181,121,182,183,184,185,186,187,132,134,107,26,188,189,190],"images","app","ocr","which","pptx","extracting","xlsx","managed","local","pipx","image","you","needs",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":197,"publishedAt":39},"01M71RZ2Y9KY94NRBV4WMH73G5","linux-admin","Safely make a change to a Linux workstation — install\u002Fremove packages, manage systemd services and timers, edit and validate configuration files, manage users\u002Fpermissions and networking. Detect the distro and package manager, determine whether the target is package-managed or hand-maintained, preview or simulate every change, back up configs before editing, and prefer the package manager and drop-in overrides so the host stays consistent and secure. Use whenever a change to the local Linux host is required (install, remove, enable, disable, start, stop, edit a config, add a user, change permissions or networking).","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Flinux-admin\u002FSKILL.md",[],[198,199,200,201,202,203,204,205,206,185,186,207,208,209,210,211,212,213,214,31],"linux","linux admin","admin","back","workstation","package manager","pacman","remove","up","systemd services","files","host","drop","preview","hand","permissions","packages"]