[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6AEFF33SYC5ZGW66P12VWYV":3,"skill-same:01M6AEFF33SYC5ZGW66P12VWYV":100},{"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":31,"publishedAt":53,"linkOnly":54,"markdownContent":55,"markdownBody":56,"frontMatter":57,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":63,"ownerHtmlUrl":64,"ownerBlogUrl":65,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M6AEFF33SYC5ZGW66P12VWYV","cocoindex",null,"Comprehensive toolkit for developing with the CocoIndex library. Use when users need to create data transformation pipelines (flows), write custom functions, or operate flows via CLI or API. Covers building ETL workflows for AI data processing, including embedding documents into vector databases, building knowledge graphs, creating search indexes, or processing data streams with incremental updates.","davila7\u002Fclaude-code-templates","davila7","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6216945?v=4","01M6ADEWWFPS191NFM0Y1EX1JH","Daniel Avila","01M6ADJHGM78PHQRD3XZTFDVKK",33481,"MIT","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"api","when","updates","operate","streams","flows","embedding","processing","databases","write","knowledge","cli","data","library","vector","search","etl","create","toolkit","documents","workflows","2026-11-10 10:12:30",false,"---\nname: cocoindex\ndescription: Comprehensive toolkit for developing with the CocoIndex library. Use when users need to create data transformation pipelines (flows), write custom functions, or operate flows via CLI or API. Covers building ETL workflows for AI data processing, including embedding documents into vector databases, building knowledge graphs, creating search indexes, or processing data streams with incremental updates.\n---\n\n# CocoIndex\n\n## Overview\n\nCocoIndex is an ultra-performant real-time data transformation framework for AI with incremental processing. This skill enables building **indexing flows** that extract data from sources, apply transformations (chunking, embedding, LLM extraction), and export to targets (vector databases, graph databases, relational databases).\n\n**Core capabilities:**\n\n1. **Write indexing flows** - Define ETL pipelines using Python\n2. **Create custom functions** - Build reusable transformation logic\n3. **Operate flows** - Run and manage flows using CLI or Python API\n\n**Key features:**\n\n- Incremental processing (only processes changed data)\n- Live updates (continuously sync source changes to targets)\n- Built-in functions (text chunking, embeddings, LLM extraction)\n- Multiple data sources (local files, S3, Azure Blob, Google Drive, Postgres)\n- Multiple targets (Postgres+pgvector, Qdrant, LanceDB, Neo4j, Kuzu)\n\n**For detailed documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002F>\n**Search documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fsearch?q=url%20encoded%20keyword>\n\n## When to Use This Skill\n\nUse when users request:\n\n- \"Build a vector search index for my documents\"\n- \"Create an embedding pipeline for code\u002FPDFs\u002Fimages\"\n- \"Extract structured information using LLMs\"\n- \"Build a knowledge graph from documents\"\n- \"Set up live document indexing\"\n- \"Create custom transformation functions\"\n- \"Run\u002Fupdate my CocoIndex flow\"\n\n## Flow Writing Workflow\n\n### Step 1: Understand Requirements\n\nAsk clarifying questions to understand:\n\n**Data source:**\n\n- Where is the data? (local files, S3, database, etc.)\n- What file types? (text, PDF, JSON, images, code, etc.)\n- How often does it change? (one-time, periodic, continuous)\n\n**Transformations:**\n\n- What processing is needed? (chunking, embedding, extraction, etc.)\n- Which embedding model? (SentenceTransformer, OpenAI, custom)\n- Any custom logic? (filtering, parsing, enrichment)\n\n**Target:**\n\n- Where should results go? (Postgres, Qdrant, Neo4j, etc.)\n- What schema? (fields, primary keys, indexes)\n- Vector search needed? (specify similarity metric)\n\n### Step 2: Set Up Dependencies\n\nGuide user to add CocoIndex with appropriate extras to their project based on their needs:\n\n**Required dependency:**\n\n- `cocoindex` - Core functionality, CLI, and most built-in functions\n\n**Optional extras (add as needed):**\n\n- `cocoindex[embeddings]` - For SentenceTransformer embeddings (when using `SentenceTransformerEmbed`)\n- `cocoindex[colpali]` - For ColPali image\u002Fdocument embeddings (when using `ColPaliEmbedImage` or `ColPaliEmbedQuery`)\n- `cocoindex[lancedb]` - For LanceDB target (when exporting to LanceDB)\n- `cocoindex[embeddings,lancedb]` - Multiple extras can be combined\n\n**What's included:**\n\n- Base package: Core functionality, CLI, most built-in functions, Postgres\u002FQdrant\u002FNeo4j\u002FKuzu targets\n- `embeddings` extra: SentenceTransformers library for local embedding models\n- `colpali` extra: ColPali engine for multimodal document\u002Fimage embeddings\n- `lancedb` extra: LanceDB client library for LanceDB vector database support\n\nUsers can install using their preferred package manager (pip, uv, poetry, etc.) or add to `pyproject.toml`.\n\n**For installation details:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fgetting_started\u002Finstallation>\n\n### Step 3: Set Up Environment\n\n**Check existing environment first:**\n\n1. Check if `COCOINDEX_DATABASE_URL` exists in environment variables\n   - If not found, use default: `postgres:\u002F\u002Fcocoindex:cocoindex@localhost\u002Fcocoindex`\n\n2. **For flows requiring LLM APIs** (embeddings, extraction):\n   - Ask user which LLM provider they want to use:\n     - **OpenAI** - Both generation and embeddings\n     - **Anthropic** - Generation only\n     - **Gemini** - Both generation and embeddings\n     - **Voyage** - Embeddings only\n     - **Ollama** - Local models (generation and embeddings)\n   - Check if the corresponding API key exists in environment variables\n   - If not found, **ask user to provide the API key value**\n   - **Never create simplified examples without LLM** - always get the proper API key and use the real LLM functions\n\n**Guide user to create `.env` file:**\n\n```bash\n# Database connection (required - internal storage)\nCOCOINDEX_DATABASE_URL=postgres:\u002F\u002Fcocoindex:cocoindex@localhost\u002Fcocoindex\n\n# LLM API keys (add the ones you need)\nOPENAI_API_KEY=sk-...          # For OpenAI (generation + embeddings)\nANTHROPIC_API_KEY=sk-ant-...   # For Anthropic (generation only)\nGOOGLE_API_KEY=...             # For Gemini (generation + embeddings)\nVOYAGE_API_KEY=pa-...          # For Voyage (embeddings only)\n# Ollama requires no API key (local)\n```\n\n**For more LLM options:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fai\u002Fllm>\n\nCreate basic project structure:\n\n```python\n# main.py\nfrom dotenv import load_dotenv\nimport cocoindex\n\n@cocoindex.flow_def(name=\"FlowName\")\ndef my_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):\n    # Flow definition here\n    pass\n\nif __name__ == \"__main__\":\n    load_dotenv()\n    cocoindex.init()\n    my_flow.update()\n```\n\n### Step 4: Write the Flow\n\nFollow this structure:\n\n```python\n@cocoindex.flow_def(name=\"DescriptiveName\")\ndef flow_name(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):\n    # 1. Import source data\n    data_scope[\"source_name\"] = flow_builder.add_source(\n        cocoindex.sources.SourceType(...)\n    )\n\n    # 2. Create collector(s) for outputs\n    collector = data_scope.add_collector()\n\n    # 3. Transform data (iterate through rows)\n    with data_scope[\"source_name\"].row() as item:\n        # Apply transformations\n        item[\"new_field\"] = item[\"existing_field\"].transform(\n            cocoindex.functions.FunctionName(...)\n        )\n\n        ...\n\n        # Nested iteration (e.g., chunks within documents)\n        with item[\"nested_table\"].row() as nested_item:\n            # More transformations\n            nested_item[\"embedding\"] = nested_item[\"text\"].transform(...)\n\n            # Collect data for export\n            collector.collect(\n                field1=nested_item[\"field1\"],\n                field2=item[\"field2\"],\n                generated_id=cocoindex.GeneratedField.UUID\n            )\n\n    # 4. Export to target\n    collector.export(\n        \"target_name\",\n        cocoindex.targets.TargetType(...),\n        primary_key_fields=[\"field1\"],\n        vector_indexes=[...]  # If needed\n    )\n```\n\n**Key principles:**\n\n- Each source creates a field in the top-level data scope\n- Use `.row()` to iterate through table data\n- **CRITICAL: Always assign transformed data to row fields** - Use `item[\"new_field\"] = item[\"existing_field\"].transform(...)`, NOT local variables like `new_field = item[\"existing_field\"].transform(...)`\n- Transformations create new fields without mutating existing data\n- Collectors gather data from any scope level\n- Export must happen at top level (not within row iterations)\n\n**Common mistakes to avoid:**\n\n❌ **Wrong:** Using local variables for transformations\n\n```python\nwith data_scope[\"files\"].row() as file:\n    summary = file[\"content\"].transform(...)  # ❌ Local variable\n    summaries_collector.collect(filename=file[\"filename\"], summary=summary)\n```\n\n✅ **Correct:** Assigning to row fields\n\n```python\nwith data_scope[\"files\"].row() as file:\n    file[\"summary\"] = file[\"content\"].transform(...)  # ✅ Field assignment\n    summaries_collector.collect(filename=file[\"filename\"], summary=file[\"summary\"])\n```\n\n❌ **Wrong:** Creating unnecessary dataclasses to mirror flow fields\n\n```python\nfrom dataclasses import dataclass\n\n@dataclass\nclass FileSummary:  # ❌ Unnecessary - CocoIndex manages fields automatically\n    filename: str\n    summary: str\n    embedding: list[float]\n\n# This dataclass is never used in the flow!\n```\n\n### Step 5: Design the Flow Solution\n\n**IMPORTANT:** The patterns listed below are common starting points, but **you cannot exhaustively enumerate all possible scenarios**. When user requirements don't match existing patterns:\n\n1. **Combine elements from multiple patterns** - Mix and match sources, transformations, and targets creatively\n2. **Review additional examples** - See \u003Chttps:\u002F\u002Fgithub.com\u002Fcocoindex-io\u002Fcocoindex?tab=readme-ov-file#-examples-and-demo> for diverse real-world use cases (face recognition, multimodal search, product recommendations, patient form extraction, etc.)\n3. **Think from first principles** - Use the core APIs (sources, transforms, collectors, exports) and apply common sense to solve novel problems\n4. **Be creative** - CocoIndex is flexible; unique combinations of components can solve unique problems\n\n**Common starting patterns (use references for detailed examples):**\n\n**For text embedding:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 1: Simple Text Embedding\"\n\n**For code embedding:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 2: Code Embedding with Language Detection\"\n\n**For LLM extraction + knowledge graph:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 3: LLM-based Extraction to Knowledge Graph\"\n\n**For live updates:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 4: Live Updates with Refresh Interval\"\n\n**For custom functions:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 5: Custom Transform Function\"\n\n**For reusable query logic:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 6: Transform Flow for Reusable Logic\"\n\n**For concurrency control:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 7: Concurrency Control\"\n\n**Example of pattern composition:**\n\nIf a user asks to \"index images from S3, generate captions with a vision API, and store in Qdrant\", combine:\n\n- AmazonS3 source (from S3 examples)\n- Custom function for vision API calls (from custom functions pattern)\n- EmbedText to embed the captions (from embedding patterns)\n- Qdrant target (from target examples)\n\nNo single pattern covers this exact scenario, but the building blocks are composable.\n\n### Step 6: Test and Run\n\nGuide user through testing:\n\n```bash\n# 1. Run with setup\ncocoindex update --setup -f main   # -f force setup without confirmation prompts\n\n\n# 2. Start a server and redirect users to CocoInsight\ncocoindex server -ci main\n# Then open CocoInsight at https:\u002F\u002Fcocoindex.io\u002Fcocoinsight\n\n```\n\n## Data Types\n\nCocoIndex has a type system independent of programming languages. All data types are determined at flow definition time, making schemas clear and predictable.\n\n**IMPORTANT: When to define types:**\n\n- **Custom functions**: Type annotations are **required** for return values (these are the source of truth for type inference)\n- **Flow fields**: Type annotations are **NOT needed** - CocoIndex automatically infers types from sources, functions, and transformations\n- **Dataclasses\u002FPydantic models**: Only create them when they're **actually used** (as function parameters\u002Freturns or ExtractByLlm output_type), NOT to mirror flow field schemas\n\n**Type annotation requirements:**\n\n- **Return values of custom functions**: Must use **specific type annotations** - these are the source of truth for type inference\n- **Arguments of custom functions**: Relaxed - can use `Any`, `dict[str, Any]`, or omit annotations; engine already knows the types\n- **Flow definitions**: No explicit type annotations needed - CocoIndex automatically infers types from sources and functions\n\n**Why specific return types matter:** Custom function return types let CocoIndex infer field types throughout the flow without processing real data. This enables creating proper target schemas (e.g., vector indexes with fixed dimensions).\n\n**Common type categories:**\n\n1. **Primitive types**: `str`, `int`, `float`, `bool`, `bytes`, `datetime.date`, `datetime.datetime`, `uuid.UUID`\n\n2. **Vector types** (embeddings): Specify dimension in return type if you plan to export as vectors to targets, as most targets require a fixed vector dimension\n   - `cocoindex.Vector[cocoindex.Float32, typing.Literal[768]]` - 768-dim float32 vector (recommended)\n   - `list[float]` without dimension also works\n\n3. **Struct types**: Dataclass, NamedTuple, or Pydantic model\n   - Return type: Must use specific class (e.g., `Person`)\n   - Argument: Can use `dict[str, Any]` or `Any`\n\n4. **Table types**:\n   - **KTable** (keyed): `dict[K, V]` where K = key type (primitive or frozen struct), V = Struct type\n   - **LTable** (ordered): `list[R]` where R = Struct type\n   - Arguments: Can use `dict[Any, Any]` or `list[Any]`\n\n5. **Json type**: `cocoindex.Json` for unstructured\u002Fdynamic data\n\n6. **Optional types**: `T | None` for nullable values\n\n**Examples:**\n\n```python\nfrom dataclasses import dataclass\nfrom typing import Literal\nimport cocoindex\n\n@dataclass\nclass Person:\n    name: str\n    age: int\n\n# ✅ Vector with dimension (recommended for vector search)\n@cocoindex.op.function(behavior_version=1)\ndef embed_text(text: str) -> cocoindex.Vector[cocoindex.Float32, Literal[768]]:\n    \"\"\"Generate 768-dim embedding - dimension needed for vector index.\"\"\"\n    # ... embedding logic ...\n    return embedding  # numpy array or list of 768 floats\n\n# ✅ Struct return type, relaxed argument\n@cocoindex.op.function(behavior_version=1)\ndef process_person(person: dict[str, Any]) -> Person:\n    \"\"\"Argument can be dict[str, Any], return must be specific Struct.\"\"\"\n    return Person(name=person[\"name\"], age=person[\"age\"])\n\n# ✅ LTable return type\n@cocoindex.op.function(behavior_version=1)\ndef filter_people(people: list[Any]) -> list[Person]:\n    \"\"\"Return type specifies list of specific Struct.\"\"\"\n    return [p for p in people if p.age >= 18]\n\n# ❌ Wrong: dict[str, str] is not a valid specific CocoIndex type\n# @cocoindex.op.function(...)\n# def bad_example(person: Person) -> dict[str, str]:\n#     return {\"name\": person.name}\n```\n\n**For comprehensive data types documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcore\u002Fdata_types>\n\n## Custom Functions\n\nWhen users need custom transformation logic, create custom functions.\n\n### Decision: Standalone vs Spec+Executor\n\n**Use standalone function when:**\n\n- Simple transformation\n- No configuration needed\n- No setup\u002Finitialization required\n\n**Use spec+executor when:**\n\n- Needs configuration (model names, API endpoints, parameters)\n- Requires setup (loading models, establishing connections)\n- Complex multi-step processing\n\n### Creating Standalone Functions\n\n```python\n@cocoindex.op.function(behavior_version=1)\ndef my_function(input_arg: str, optional_arg: int | None = None) -> dict:\n    \"\"\"\n    Function description.\n\n    Args:\n        input_arg: Description\n        optional_arg: Optional description\n    \"\"\"\n    # Transformation logic\n    return {\"result\": f\"processed-{input_arg}\"}\n```\n\n**Requirements:**\n\n- Decorator: `@cocoindex.op.function()`\n- Type annotations on all arguments and return value\n- Optional parameters: `cache=True` for expensive ops, `behavior_version` (required with cache)\n\n### Creating Spec+Executor Functions\n\n```python\n# 1. Define configuration spec\nclass MyFunction(cocoindex.op.FunctionSpec):\n    \"\"\"Configuration for MyFunction.\"\"\"\n    model_name: str\n    threshold: float = 0.5\n\n# 2. Define executor\n@cocoindex.op.executor_class(cache=True, behavior_version=1)\nclass MyFunctionExecutor:\n    spec: MyFunction  # Required: link to spec\n    model = None      # Instance variables for state\n\n    def prepare(self) -> None:\n        \"\"\"Optional: run once before execution.\"\"\"\n        # Load model, setup connections, etc.\n        self.model = load_model(self.spec.model_name)\n\n    def __call__(self, text: str) -> dict:\n        \"\"\"Required: execute for each data row.\"\"\"\n        # Use self.spec for configuration\n        # Use self.model for loaded resources\n        result = self.model.process(text)\n        return {\"result\": result}\n```\n\n**When to enable cache:**\n\n- LLM API calls\n- Model inference\n- External API calls\n- Computationally expensive operations\n\n**Important:** Increment `behavior_version` when function logic changes to invalidate cache.\n\nFor detailed examples and patterns, load `references\u002Fcustom_functions.md`.\n\n**For more on custom functions:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcustom_ops\u002Fcustom_functions>\n\n## Operating Flows\n\n### CLI Operations\n\n**Setup flow (create resources):**\n\n```bash\ncocoindex setup main\n```\n\n**One-time update:**\n\n```bash\ncocoindex update main\n\n# With auto-setup\ncocoindex update --setup main\n\n# Force reset everything before setup and update\ncocoindex update --reset main\n```\n\n**Live update (continuous monitoring):**\n\n```bash\ncocoindex update main.py -L\n\n# Requires refresh_interval on source or source-specific change capture\n```\n\n**Drop flow (remove all resources):**\n\n```bash\ncocoindex drop main.py\n```\n\n**Inspect flow:**\n\n```bash\ncocoindex show main.py:FlowName\n```\n\n**Test without side effects:**\n\n```bash\ncocoindex evaluate main.py:FlowName --output-dir .\u002Ftest_output\n```\n\nFor complete CLI reference, load `references\u002Fcli_operations.md`.\n\n**For CLI documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcore\u002Fcli>\n\n### API Operations\n\n**Basic setup:**\n\n```python\nfrom dotenv import load_dotenv\nimport cocoindex\n\nload_dotenv()\ncocoindex.init()\n\n@cocoindex.flow_def(name=\"MyFlow\")\ndef my_flow(flow_builder, data_scope):\n    # ... flow definition ...\n    pass\n```\n\n**One-time update:**\n\n```python\nstats = my_flow.update()\nprint(f\"Processed {stats.total_rows} rows\")\n\n# Async\nstats = await my_flow.update_async()\n```\n\n**Live update:**\n\n```python\n# As context manager\nwith cocoindex.FlowLiveUpdater(my_flow) as updater:\n    # Updater runs in background\n    # Your application logic here\n    pass\n\n# Manual control\nupdater = cocoindex.FlowLiveUpdater(\n    my_flow,\n    cocoindex.FlowLiveUpdaterOptions(\n        live_mode=True,\n        print_stats=True\n    )\n)\nupdater.start()\n# ... application logic ...\nupdater.wait()\n```\n\n**Setup\u002Fdrop:**\n\n```python\nmy_flow.setup(report_to_stdout=True)\nmy_flow.drop(report_to_stdout=True)\ncocoindex.setup_all_flows()\ncocoindex.drop_all_flows()\n```\n\n**Query with transform flows:**\n\n```python\n@cocoindex.transform_flow()\ndef text_to_embedding(text: cocoindex.DataSlice[str]) -> cocoindex.DataSlice[list[float]]:\n    return text.transform(\n        cocoindex.functions.SentenceTransformerEmbed(model=\"...\")\n    )\n\n# Use in flow for indexing\ndoc[\"embedding\"] = text_to_embedding(doc[\"content\"])\n\n# Use for querying\nquery_embedding = text_to_embedding.eval(\"search query\")\n```\n\nFor complete API reference and patterns, load `references\u002Fapi_operations.md`.\n\n**For API documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcore\u002Fflow_methods>\n\n## Built-in Functions\n\n### Text Processing\n\n**SplitRecursively** - Chunk text intelligently\n\n```python\ndoc[\"chunks\"] = doc[\"content\"].transform(\n    cocoindex.functions.SplitRecursively(),\n    language=\"markdown\",  # or \"python\", \"javascript\", etc.\n    chunk_size=2000,\n    chunk_overlap=500\n)\n```\n\n**ParseJson** - Parse JSON strings\n\n```python\ndata = json_string.transform(cocoindex.functions.ParseJson())\n```\n\n**DetectProgrammingLanguage** - Detect language from filename\n\n```python\nfile[\"language\"] = file[\"filename\"].transform(\n    cocoindex.functions.DetectProgrammingLanguage()\n)\n```\n\n### Embeddings\n\n**SentenceTransformerEmbed** - Local embedding model\n\n```python\n# Requires: cocoindex[embeddings]\nchunk[\"embedding\"] = chunk[\"text\"].transform(\n    cocoindex.functions.SentenceTransformerEmbed(\n        model=\"sentence-transformers\u002Fall-MiniLM-L6-v2\"\n    )\n)\n```\n\n**EmbedText** - LLM API embeddings\n\nThis is the **recommended way** to generate embeddings using LLM APIs (OpenAI, Voyage, etc.).\n\n```python\nchunk[\"embedding\"] = chunk[\"text\"].transform(\n    cocoindex.functions.EmbedText(\n        api_type=cocoindex.LlmApiType.OPENAI,\n        model=\"text-embedding-3-small\",\n    )\n)\n```\n\n**ColPaliEmbedImage** - Multimodal image embeddings\n\n```python\n# Requires: cocoindex[colpali]\nimage[\"embedding\"] = image[\"img_bytes\"].transform(\n    cocoindex.functions.ColPaliEmbedImage(model=\"vidore\u002Fcolpali-v1.2\")\n)\n```\n\n### LLM Extraction\n\n**ExtractByLlm** - Extract structured data with LLM\n\nThis is the **recommended way** to use LLMs for extraction and summarization tasks. It supports both structured outputs (dataclasses, Pydantic models) and simple text outputs (str).\n\n```python\nimport dataclasses\n\n# For structured extraction\n@dataclasses.dataclass\nclass ProductInfo:\n    name: str\n    price: float\n    category: str\n\nitem[\"product_info\"] = item[\"text\"].transform(\n    cocoindex.functions.ExtractByLlm(\n        llm_spec=cocoindex.LlmSpec(\n            api_type=cocoindex.LlmApiType.OPENAI,\n            model=\"gpt-4o-mini\"\n        ),\n        output_type=ProductInfo,\n        instruction=\"Extract product information\"\n    )\n)\n\n# For text summarization\u002Fgeneration\nfile[\"summary\"] = file[\"content\"].transform(\n    cocoindex.functions.ExtractByLlm(\n        llm_spec=cocoindex.LlmSpec(\n            api_type=cocoindex.LlmApiType.OPENAI,\n            model=\"gpt-4o-mini\"\n        ),\n        output_type=str,\n        instruction=\"Summarize this document in one paragraph\"\n    )\n)\n```\n\n## Common Sources and Targets\n\n**Browse all sources:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fsources\u002F>\n**Browse all targets:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Ftargets\u002F>\n\n### Sources\n\n**LocalFile:**\n\n```python\ncocoindex.sources.LocalFile(\n    path=\"documents\",\n    included_patterns=[\"*.md\", \"*.txt\"],\n    excluded_patterns=[\"**\u002F.*\", \"node_modules\"]\n)\n```\n\n**AmazonS3:**\n\n```python\ncocoindex.sources.AmazonS3(\n    bucket=\"my-bucket\",\n    prefix=\"documents\u002F\",\n    aws_access_key_id=cocoindex.add_transient_auth_entry(\"...\"),\n    aws_secret_access_key=cocoindex.add_transient_auth_entry(\"...\")\n)\n```\n\n**Postgres:**\n\n```python\ncocoindex.sources.Postgres(\n    connection=cocoindex.add_auth_entry(\"conn\", cocoindex.sources.PostgresConnection(...)),\n    query=\"SELECT id, content FROM documents\"\n)\n```\n\n### Targets\n\n**Postgres (with vector support):**\n\n```python\ncollector.export(\n    \"target_name\",\n    cocoindex.targets.Postgres(),\n    primary_key_fields=[\"id\"],\n    vector_indexes=[\n        cocoindex.VectorIndexDef(\n            field_name=\"embedding\",\n            metric=cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY\n        )\n    ]\n)\n```\n\n**Qdrant:**\n\n```python\ncollector.export(\n    \"target_name\",\n    cocoindex.targets.Qdrant(collection_name=\"my_collection\"),\n    primary_key_fields=[\"id\"]\n)\n```\n\n**LanceDB:**\n\n```python\n# Requires: cocoindex[lancedb]\ncollector.export(\n    \"target_name\",\n    cocoindex.targets.LanceDB(uri=\"lancedb_data\", table_name=\"my_table\"),\n    primary_key_fields=[\"id\"]\n)\n```\n\n**Neo4j (nodes):**\n\n```python\ncollector.export(\n    \"nodes\",\n    cocoindex.targets.Neo4j(\n        connection=neo4j_conn,\n        mapping=cocoindex.targets.Nodes(label=\"Entity\")\n    ),\n    primary_key_fields=[\"id\"]\n)\n```\n\n**Neo4j (relationships):**\n\n```python\ncollector.export(\n    \"relationships\",\n    cocoindex.targets.Neo4j(\n        connection=neo4j_conn,\n        mapping=cocoindex.targets.Relationships(\n            rel_type=\"RELATES_TO\",\n            source=cocoindex.targets.NodeFromFields(\n                label=\"Entity\",\n                fields=[cocoindex.targets.TargetFieldMapping(source=\"source_id\", target=\"id\")]\n            ),\n            target=cocoindex.targets.NodeFromFields(\n                label=\"Entity\",\n                fields=[cocoindex.targets.TargetFieldMapping(source=\"target_id\", target=\"id\")]\n            )\n        )\n    ),\n    primary_key_fields=[\"id\"]\n)\n```\n\n## Common Issues and Solutions\n\n### \"Flow not found\"\n\n- Check APP_TARGET format: `cocoindex show main.py`\n- Use `--app-dir` if not in project root\n- Verify flow name matches decorator\n\n### \"Database connection failed\"\n\n- Check `.env` has `COCOINDEX_DATABASE_URL`\n- Test connection: `psql $COCOINDEX_DATABASE_URL`\n- Use `--env-file` to specify custom location\n\n### \"Schema mismatch\"\n\n- Re-run setup: `cocoindex setup main.py`\n- Drop and recreate: `cocoindex drop main.py && cocoindex setup main.py`\n\n### \"Live update exits immediately\"\n\n- Add `refresh_interval` to source\n- Or use source-specific change capture (Postgres notifications, S3 events)\n\n### \"Out of memory\"\n\n- Add concurrency limits on sources: `max_inflight_rows`, `max_inflight_bytes`\n- Set global limits in `.env`: `COCOINDEX_SOURCE_MAX_INFLIGHT_ROWS`\n\n## Reference Documentation\n\nThis skill includes comprehensive reference documentation for common patterns and operations:\n\n- **references\u002Fflow_patterns.md** - Complete examples of common flow patterns (text embedding, code embedding, knowledge graphs, live updates, concurrency control, etc.)\n- **references\u002Fcustom_functions.md** - Detailed guide for creating custom functions with examples (standalone functions, spec+executor pattern, LLM calls, external APIs, caching)\n- **references\u002Fcli_operations.md** - Complete CLI reference with all commands, options, and workflows\n- **references\u002Fapi_operations.md** - Python API reference with examples for programmatic flow control, live updates, queries, and application integration patterns\n\nLoad these references when users need:\n\n- Detailed examples of specific patterns\n- Complete API documentation\n- Advanced usage scenarios\n- Troubleshooting guidance\n\n**For comprehensive documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002F>\n**Search specific topics:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fsearch?q=url%20encoded%20keyword>\n","# CocoIndex\n\n## Overview\n\nCocoIndex is an ultra-performant real-time data transformation framework for AI with incremental processing. This skill enables building **indexing flows** that extract data from sources, apply transformations (chunking, embedding, LLM extraction), and export to targets (vector databases, graph databases, relational databases).\n\n**Core capabilities:**\n\n1. **Write indexing flows** - Define ETL pipelines using Python\n2. **Create custom functions** - Build reusable transformation logic\n3. **Operate flows** - Run and manage flows using CLI or Python API\n\n**Key features:**\n\n- Incremental processing (only processes changed data)\n- Live updates (continuously sync source changes to targets)\n- Built-in functions (text chunking, embeddings, LLM extraction)\n- Multiple data sources (local files, S3, Azure Blob, Google Drive, Postgres)\n- Multiple targets (Postgres+pgvector, Qdrant, LanceDB, Neo4j, Kuzu)\n\n**For detailed documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002F>\n**Search documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fsearch?q=url%20encoded%20keyword>\n\n## When to Use This Skill\n\nUse when users request:\n\n- \"Build a vector search index for my documents\"\n- \"Create an embedding pipeline for code\u002FPDFs\u002Fimages\"\n- \"Extract structured information using LLMs\"\n- \"Build a knowledge graph from documents\"\n- \"Set up live document indexing\"\n- \"Create custom transformation functions\"\n- \"Run\u002Fupdate my CocoIndex flow\"\n\n## Flow Writing Workflow\n\n### Step 1: Understand Requirements\n\nAsk clarifying questions to understand:\n\n**Data source:**\n\n- Where is the data? (local files, S3, database, etc.)\n- What file types? (text, PDF, JSON, images, code, etc.)\n- How often does it change? (one-time, periodic, continuous)\n\n**Transformations:**\n\n- What processing is needed? (chunking, embedding, extraction, etc.)\n- Which embedding model? (SentenceTransformer, OpenAI, custom)\n- Any custom logic? (filtering, parsing, enrichment)\n\n**Target:**\n\n- Where should results go? (Postgres, Qdrant, Neo4j, etc.)\n- What schema? (fields, primary keys, indexes)\n- Vector search needed? (specify similarity metric)\n\n### Step 2: Set Up Dependencies\n\nGuide user to add CocoIndex with appropriate extras to their project based on their needs:\n\n**Required dependency:**\n\n- `cocoindex` - Core functionality, CLI, and most built-in functions\n\n**Optional extras (add as needed):**\n\n- `cocoindex[embeddings]` - For SentenceTransformer embeddings (when using `SentenceTransformerEmbed`)\n- `cocoindex[colpali]` - For ColPali image\u002Fdocument embeddings (when using `ColPaliEmbedImage` or `ColPaliEmbedQuery`)\n- `cocoindex[lancedb]` - For LanceDB target (when exporting to LanceDB)\n- `cocoindex[embeddings,lancedb]` - Multiple extras can be combined\n\n**What's included:**\n\n- Base package: Core functionality, CLI, most built-in functions, Postgres\u002FQdrant\u002FNeo4j\u002FKuzu targets\n- `embeddings` extra: SentenceTransformers library for local embedding models\n- `colpali` extra: ColPali engine for multimodal document\u002Fimage embeddings\n- `lancedb` extra: LanceDB client library for LanceDB vector database support\n\nUsers can install using their preferred package manager (pip, uv, poetry, etc.) or add to `pyproject.toml`.\n\n**For installation details:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fgetting_started\u002Finstallation>\n\n### Step 3: Set Up Environment\n\n**Check existing environment first:**\n\n1. Check if `COCOINDEX_DATABASE_URL` exists in environment variables\n   - If not found, use default: `postgres:\u002F\u002Fcocoindex:cocoindex@localhost\u002Fcocoindex`\n\n2. **For flows requiring LLM APIs** (embeddings, extraction):\n   - Ask user which LLM provider they want to use:\n     - **OpenAI** - Both generation and embeddings\n     - **Anthropic** - Generation only\n     - **Gemini** - Both generation and embeddings\n     - **Voyage** - Embeddings only\n     - **Ollama** - Local models (generation and embeddings)\n   - Check if the corresponding API key exists in environment variables\n   - If not found, **ask user to provide the API key value**\n   - **Never create simplified examples without LLM** - always get the proper API key and use the real LLM functions\n\n**Guide user to create `.env` file:**\n\n```bash\n# Database connection (required - internal storage)\nCOCOINDEX_DATABASE_URL=postgres:\u002F\u002Fcocoindex:cocoindex@localhost\u002Fcocoindex\n\n# LLM API keys (add the ones you need)\nOPENAI_API_KEY=sk-...          # For OpenAI (generation + embeddings)\nANTHROPIC_API_KEY=sk-ant-...   # For Anthropic (generation only)\nGOOGLE_API_KEY=...             # For Gemini (generation + embeddings)\nVOYAGE_API_KEY=pa-...          # For Voyage (embeddings only)\n# Ollama requires no API key (local)\n```\n\n**For more LLM options:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fai\u002Fllm>\n\nCreate basic project structure:\n\n```python\n# main.py\nfrom dotenv import load_dotenv\nimport cocoindex\n\n@cocoindex.flow_def(name=\"FlowName\")\ndef my_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):\n    # Flow definition here\n    pass\n\nif __name__ == \"__main__\":\n    load_dotenv()\n    cocoindex.init()\n    my_flow.update()\n```\n\n### Step 4: Write the Flow\n\nFollow this structure:\n\n```python\n@cocoindex.flow_def(name=\"DescriptiveName\")\ndef flow_name(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):\n    # 1. Import source data\n    data_scope[\"source_name\"] = flow_builder.add_source(\n        cocoindex.sources.SourceType(...)\n    )\n\n    # 2. Create collector(s) for outputs\n    collector = data_scope.add_collector()\n\n    # 3. Transform data (iterate through rows)\n    with data_scope[\"source_name\"].row() as item:\n        # Apply transformations\n        item[\"new_field\"] = item[\"existing_field\"].transform(\n            cocoindex.functions.FunctionName(...)\n        )\n\n        ...\n\n        # Nested iteration (e.g., chunks within documents)\n        with item[\"nested_table\"].row() as nested_item:\n            # More transformations\n            nested_item[\"embedding\"] = nested_item[\"text\"].transform(...)\n\n            # Collect data for export\n            collector.collect(\n                field1=nested_item[\"field1\"],\n                field2=item[\"field2\"],\n                generated_id=cocoindex.GeneratedField.UUID\n            )\n\n    # 4. Export to target\n    collector.export(\n        \"target_name\",\n        cocoindex.targets.TargetType(...),\n        primary_key_fields=[\"field1\"],\n        vector_indexes=[...]  # If needed\n    )\n```\n\n**Key principles:**\n\n- Each source creates a field in the top-level data scope\n- Use `.row()` to iterate through table data\n- **CRITICAL: Always assign transformed data to row fields** - Use `item[\"new_field\"] = item[\"existing_field\"].transform(...)`, NOT local variables like `new_field = item[\"existing_field\"].transform(...)`\n- Transformations create new fields without mutating existing data\n- Collectors gather data from any scope level\n- Export must happen at top level (not within row iterations)\n\n**Common mistakes to avoid:**\n\n❌ **Wrong:** Using local variables for transformations\n\n```python\nwith data_scope[\"files\"].row() as file:\n    summary = file[\"content\"].transform(...)  # ❌ Local variable\n    summaries_collector.collect(filename=file[\"filename\"], summary=summary)\n```\n\n✅ **Correct:** Assigning to row fields\n\n```python\nwith data_scope[\"files\"].row() as file:\n    file[\"summary\"] = file[\"content\"].transform(...)  # ✅ Field assignment\n    summaries_collector.collect(filename=file[\"filename\"], summary=file[\"summary\"])\n```\n\n❌ **Wrong:** Creating unnecessary dataclasses to mirror flow fields\n\n```python\nfrom dataclasses import dataclass\n\n@dataclass\nclass FileSummary:  # ❌ Unnecessary - CocoIndex manages fields automatically\n    filename: str\n    summary: str\n    embedding: list[float]\n\n# This dataclass is never used in the flow!\n```\n\n### Step 5: Design the Flow Solution\n\n**IMPORTANT:** The patterns listed below are common starting points, but **you cannot exhaustively enumerate all possible scenarios**. When user requirements don't match existing patterns:\n\n1. **Combine elements from multiple patterns** - Mix and match sources, transformations, and targets creatively\n2. **Review additional examples** - See \u003Chttps:\u002F\u002Fgithub.com\u002Fcocoindex-io\u002Fcocoindex?tab=readme-ov-file#-examples-and-demo> for diverse real-world use cases (face recognition, multimodal search, product recommendations, patient form extraction, etc.)\n3. **Think from first principles** - Use the core APIs (sources, transforms, collectors, exports) and apply common sense to solve novel problems\n4. **Be creative** - CocoIndex is flexible; unique combinations of components can solve unique problems\n\n**Common starting patterns (use references for detailed examples):**\n\n**For text embedding:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 1: Simple Text Embedding\"\n\n**For code embedding:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 2: Code Embedding with Language Detection\"\n\n**For LLM extraction + knowledge graph:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 3: LLM-based Extraction to Knowledge Graph\"\n\n**For live updates:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 4: Live Updates with Refresh Interval\"\n\n**For custom functions:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 5: Custom Transform Function\"\n\n**For reusable query logic:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 6: Transform Flow for Reusable Logic\"\n\n**For concurrency control:** Load `references\u002Fflow_patterns.md` and refer to \"Pattern 7: Concurrency Control\"\n\n**Example of pattern composition:**\n\nIf a user asks to \"index images from S3, generate captions with a vision API, and store in Qdrant\", combine:\n\n- AmazonS3 source (from S3 examples)\n- Custom function for vision API calls (from custom functions pattern)\n- EmbedText to embed the captions (from embedding patterns)\n- Qdrant target (from target examples)\n\nNo single pattern covers this exact scenario, but the building blocks are composable.\n\n### Step 6: Test and Run\n\nGuide user through testing:\n\n```bash\n# 1. Run with setup\ncocoindex update --setup -f main   # -f force setup without confirmation prompts\n\n\n# 2. Start a server and redirect users to CocoInsight\ncocoindex server -ci main\n# Then open CocoInsight at https:\u002F\u002Fcocoindex.io\u002Fcocoinsight\n\n```\n\n## Data Types\n\nCocoIndex has a type system independent of programming languages. All data types are determined at flow definition time, making schemas clear and predictable.\n\n**IMPORTANT: When to define types:**\n\n- **Custom functions**: Type annotations are **required** for return values (these are the source of truth for type inference)\n- **Flow fields**: Type annotations are **NOT needed** - CocoIndex automatically infers types from sources, functions, and transformations\n- **Dataclasses\u002FPydantic models**: Only create them when they're **actually used** (as function parameters\u002Freturns or ExtractByLlm output_type), NOT to mirror flow field schemas\n\n**Type annotation requirements:**\n\n- **Return values of custom functions**: Must use **specific type annotations** - these are the source of truth for type inference\n- **Arguments of custom functions**: Relaxed - can use `Any`, `dict[str, Any]`, or omit annotations; engine already knows the types\n- **Flow definitions**: No explicit type annotations needed - CocoIndex automatically infers types from sources and functions\n\n**Why specific return types matter:** Custom function return types let CocoIndex infer field types throughout the flow without processing real data. This enables creating proper target schemas (e.g., vector indexes with fixed dimensions).\n\n**Common type categories:**\n\n1. **Primitive types**: `str`, `int`, `float`, `bool`, `bytes`, `datetime.date`, `datetime.datetime`, `uuid.UUID`\n\n2. **Vector types** (embeddings): Specify dimension in return type if you plan to export as vectors to targets, as most targets require a fixed vector dimension\n   - `cocoindex.Vector[cocoindex.Float32, typing.Literal[768]]` - 768-dim float32 vector (recommended)\n   - `list[float]` without dimension also works\n\n3. **Struct types**: Dataclass, NamedTuple, or Pydantic model\n   - Return type: Must use specific class (e.g., `Person`)\n   - Argument: Can use `dict[str, Any]` or `Any`\n\n4. **Table types**:\n   - **KTable** (keyed): `dict[K, V]` where K = key type (primitive or frozen struct), V = Struct type\n   - **LTable** (ordered): `list[R]` where R = Struct type\n   - Arguments: Can use `dict[Any, Any]` or `list[Any]`\n\n5. **Json type**: `cocoindex.Json` for unstructured\u002Fdynamic data\n\n6. **Optional types**: `T | None` for nullable values\n\n**Examples:**\n\n```python\nfrom dataclasses import dataclass\nfrom typing import Literal\nimport cocoindex\n\n@dataclass\nclass Person:\n    name: str\n    age: int\n\n# ✅ Vector with dimension (recommended for vector search)\n@cocoindex.op.function(behavior_version=1)\ndef embed_text(text: str) -> cocoindex.Vector[cocoindex.Float32, Literal[768]]:\n    \"\"\"Generate 768-dim embedding - dimension needed for vector index.\"\"\"\n    # ... embedding logic ...\n    return embedding  # numpy array or list of 768 floats\n\n# ✅ Struct return type, relaxed argument\n@cocoindex.op.function(behavior_version=1)\ndef process_person(person: dict[str, Any]) -> Person:\n    \"\"\"Argument can be dict[str, Any], return must be specific Struct.\"\"\"\n    return Person(name=person[\"name\"], age=person[\"age\"])\n\n# ✅ LTable return type\n@cocoindex.op.function(behavior_version=1)\ndef filter_people(people: list[Any]) -> list[Person]:\n    \"\"\"Return type specifies list of specific Struct.\"\"\"\n    return [p for p in people if p.age >= 18]\n\n# ❌ Wrong: dict[str, str] is not a valid specific CocoIndex type\n# @cocoindex.op.function(...)\n# def bad_example(person: Person) -> dict[str, str]:\n#     return {\"name\": person.name}\n```\n\n**For comprehensive data types documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcore\u002Fdata_types>\n\n## Custom Functions\n\nWhen users need custom transformation logic, create custom functions.\n\n### Decision: Standalone vs Spec+Executor\n\n**Use standalone function when:**\n\n- Simple transformation\n- No configuration needed\n- No setup\u002Finitialization required\n\n**Use spec+executor when:**\n\n- Needs configuration (model names, API endpoints, parameters)\n- Requires setup (loading models, establishing connections)\n- Complex multi-step processing\n\n### Creating Standalone Functions\n\n```python\n@cocoindex.op.function(behavior_version=1)\ndef my_function(input_arg: str, optional_arg: int | None = None) -> dict:\n    \"\"\"\n    Function description.\n\n    Args:\n        input_arg: Description\n        optional_arg: Optional description\n    \"\"\"\n    # Transformation logic\n    return {\"result\": f\"processed-{input_arg}\"}\n```\n\n**Requirements:**\n\n- Decorator: `@cocoindex.op.function()`\n- Type annotations on all arguments and return value\n- Optional parameters: `cache=True` for expensive ops, `behavior_version` (required with cache)\n\n### Creating Spec+Executor Functions\n\n```python\n# 1. Define configuration spec\nclass MyFunction(cocoindex.op.FunctionSpec):\n    \"\"\"Configuration for MyFunction.\"\"\"\n    model_name: str\n    threshold: float = 0.5\n\n# 2. Define executor\n@cocoindex.op.executor_class(cache=True, behavior_version=1)\nclass MyFunctionExecutor:\n    spec: MyFunction  # Required: link to spec\n    model = None      # Instance variables for state\n\n    def prepare(self) -> None:\n        \"\"\"Optional: run once before execution.\"\"\"\n        # Load model, setup connections, etc.\n        self.model = load_model(self.spec.model_name)\n\n    def __call__(self, text: str) -> dict:\n        \"\"\"Required: execute for each data row.\"\"\"\n        # Use self.spec for configuration\n        # Use self.model for loaded resources\n        result = self.model.process(text)\n        return {\"result\": result}\n```\n\n**When to enable cache:**\n\n- LLM API calls\n- Model inference\n- External API calls\n- Computationally expensive operations\n\n**Important:** Increment `behavior_version` when function logic changes to invalidate cache.\n\nFor detailed examples and patterns, load `references\u002Fcustom_functions.md`.\n\n**For more on custom functions:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcustom_ops\u002Fcustom_functions>\n\n## Operating Flows\n\n### CLI Operations\n\n**Setup flow (create resources):**\n\n```bash\ncocoindex setup main\n```\n\n**One-time update:**\n\n```bash\ncocoindex update main\n\n# With auto-setup\ncocoindex update --setup main\n\n# Force reset everything before setup and update\ncocoindex update --reset main\n```\n\n**Live update (continuous monitoring):**\n\n```bash\ncocoindex update main.py -L\n\n# Requires refresh_interval on source or source-specific change capture\n```\n\n**Drop flow (remove all resources):**\n\n```bash\ncocoindex drop main.py\n```\n\n**Inspect flow:**\n\n```bash\ncocoindex show main.py:FlowName\n```\n\n**Test without side effects:**\n\n```bash\ncocoindex evaluate main.py:FlowName --output-dir .\u002Ftest_output\n```\n\nFor complete CLI reference, load `references\u002Fcli_operations.md`.\n\n**For CLI documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcore\u002Fcli>\n\n### API Operations\n\n**Basic setup:**\n\n```python\nfrom dotenv import load_dotenv\nimport cocoindex\n\nload_dotenv()\ncocoindex.init()\n\n@cocoindex.flow_def(name=\"MyFlow\")\ndef my_flow(flow_builder, data_scope):\n    # ... flow definition ...\n    pass\n```\n\n**One-time update:**\n\n```python\nstats = my_flow.update()\nprint(f\"Processed {stats.total_rows} rows\")\n\n# Async\nstats = await my_flow.update_async()\n```\n\n**Live update:**\n\n```python\n# As context manager\nwith cocoindex.FlowLiveUpdater(my_flow) as updater:\n    # Updater runs in background\n    # Your application logic here\n    pass\n\n# Manual control\nupdater = cocoindex.FlowLiveUpdater(\n    my_flow,\n    cocoindex.FlowLiveUpdaterOptions(\n        live_mode=True,\n        print_stats=True\n    )\n)\nupdater.start()\n# ... application logic ...\nupdater.wait()\n```\n\n**Setup\u002Fdrop:**\n\n```python\nmy_flow.setup(report_to_stdout=True)\nmy_flow.drop(report_to_stdout=True)\ncocoindex.setup_all_flows()\ncocoindex.drop_all_flows()\n```\n\n**Query with transform flows:**\n\n```python\n@cocoindex.transform_flow()\ndef text_to_embedding(text: cocoindex.DataSlice[str]) -> cocoindex.DataSlice[list[float]]:\n    return text.transform(\n        cocoindex.functions.SentenceTransformerEmbed(model=\"...\")\n    )\n\n# Use in flow for indexing\ndoc[\"embedding\"] = text_to_embedding(doc[\"content\"])\n\n# Use for querying\nquery_embedding = text_to_embedding.eval(\"search query\")\n```\n\nFor complete API reference and patterns, load `references\u002Fapi_operations.md`.\n\n**For API documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fcore\u002Fflow_methods>\n\n## Built-in Functions\n\n### Text Processing\n\n**SplitRecursively** - Chunk text intelligently\n\n```python\ndoc[\"chunks\"] = doc[\"content\"].transform(\n    cocoindex.functions.SplitRecursively(),\n    language=\"markdown\",  # or \"python\", \"javascript\", etc.\n    chunk_size=2000,\n    chunk_overlap=500\n)\n```\n\n**ParseJson** - Parse JSON strings\n\n```python\ndata = json_string.transform(cocoindex.functions.ParseJson())\n```\n\n**DetectProgrammingLanguage** - Detect language from filename\n\n```python\nfile[\"language\"] = file[\"filename\"].transform(\n    cocoindex.functions.DetectProgrammingLanguage()\n)\n```\n\n### Embeddings\n\n**SentenceTransformerEmbed** - Local embedding model\n\n```python\n# Requires: cocoindex[embeddings]\nchunk[\"embedding\"] = chunk[\"text\"].transform(\n    cocoindex.functions.SentenceTransformerEmbed(\n        model=\"sentence-transformers\u002Fall-MiniLM-L6-v2\"\n    )\n)\n```\n\n**EmbedText** - LLM API embeddings\n\nThis is the **recommended way** to generate embeddings using LLM APIs (OpenAI, Voyage, etc.).\n\n```python\nchunk[\"embedding\"] = chunk[\"text\"].transform(\n    cocoindex.functions.EmbedText(\n        api_type=cocoindex.LlmApiType.OPENAI,\n        model=\"text-embedding-3-small\",\n    )\n)\n```\n\n**ColPaliEmbedImage** - Multimodal image embeddings\n\n```python\n# Requires: cocoindex[colpali]\nimage[\"embedding\"] = image[\"img_bytes\"].transform(\n    cocoindex.functions.ColPaliEmbedImage(model=\"vidore\u002Fcolpali-v1.2\")\n)\n```\n\n### LLM Extraction\n\n**ExtractByLlm** - Extract structured data with LLM\n\nThis is the **recommended way** to use LLMs for extraction and summarization tasks. It supports both structured outputs (dataclasses, Pydantic models) and simple text outputs (str).\n\n```python\nimport dataclasses\n\n# For structured extraction\n@dataclasses.dataclass\nclass ProductInfo:\n    name: str\n    price: float\n    category: str\n\nitem[\"product_info\"] = item[\"text\"].transform(\n    cocoindex.functions.ExtractByLlm(\n        llm_spec=cocoindex.LlmSpec(\n            api_type=cocoindex.LlmApiType.OPENAI,\n            model=\"gpt-4o-mini\"\n        ),\n        output_type=ProductInfo,\n        instruction=\"Extract product information\"\n    )\n)\n\n# For text summarization\u002Fgeneration\nfile[\"summary\"] = file[\"content\"].transform(\n    cocoindex.functions.ExtractByLlm(\n        llm_spec=cocoindex.LlmSpec(\n            api_type=cocoindex.LlmApiType.OPENAI,\n            model=\"gpt-4o-mini\"\n        ),\n        output_type=str,\n        instruction=\"Summarize this document in one paragraph\"\n    )\n)\n```\n\n## Common Sources and Targets\n\n**Browse all sources:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fsources\u002F>\n**Browse all targets:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Ftargets\u002F>\n\n### Sources\n\n**LocalFile:**\n\n```python\ncocoindex.sources.LocalFile(\n    path=\"documents\",\n    included_patterns=[\"*.md\", \"*.txt\"],\n    excluded_patterns=[\"**\u002F.*\", \"node_modules\"]\n)\n```\n\n**AmazonS3:**\n\n```python\ncocoindex.sources.AmazonS3(\n    bucket=\"my-bucket\",\n    prefix=\"documents\u002F\",\n    aws_access_key_id=cocoindex.add_transient_auth_entry(\"...\"),\n    aws_secret_access_key=cocoindex.add_transient_auth_entry(\"...\")\n)\n```\n\n**Postgres:**\n\n```python\ncocoindex.sources.Postgres(\n    connection=cocoindex.add_auth_entry(\"conn\", cocoindex.sources.PostgresConnection(...)),\n    query=\"SELECT id, content FROM documents\"\n)\n```\n\n### Targets\n\n**Postgres (with vector support):**\n\n```python\ncollector.export(\n    \"target_name\",\n    cocoindex.targets.Postgres(),\n    primary_key_fields=[\"id\"],\n    vector_indexes=[\n        cocoindex.VectorIndexDef(\n            field_name=\"embedding\",\n            metric=cocoindex.VectorSimilarityMetric.COSINE_SIMILARITY\n        )\n    ]\n)\n```\n\n**Qdrant:**\n\n```python\ncollector.export(\n    \"target_name\",\n    cocoindex.targets.Qdrant(collection_name=\"my_collection\"),\n    primary_key_fields=[\"id\"]\n)\n```\n\n**LanceDB:**\n\n```python\n# Requires: cocoindex[lancedb]\ncollector.export(\n    \"target_name\",\n    cocoindex.targets.LanceDB(uri=\"lancedb_data\", table_name=\"my_table\"),\n    primary_key_fields=[\"id\"]\n)\n```\n\n**Neo4j (nodes):**\n\n```python\ncollector.export(\n    \"nodes\",\n    cocoindex.targets.Neo4j(\n        connection=neo4j_conn,\n        mapping=cocoindex.targets.Nodes(label=\"Entity\")\n    ),\n    primary_key_fields=[\"id\"]\n)\n```\n\n**Neo4j (relationships):**\n\n```python\ncollector.export(\n    \"relationships\",\n    cocoindex.targets.Neo4j(\n        connection=neo4j_conn,\n        mapping=cocoindex.targets.Relationships(\n            rel_type=\"RELATES_TO\",\n            source=cocoindex.targets.NodeFromFields(\n                label=\"Entity\",\n                fields=[cocoindex.targets.TargetFieldMapping(source=\"source_id\", target=\"id\")]\n            ),\n            target=cocoindex.targets.NodeFromFields(\n                label=\"Entity\",\n                fields=[cocoindex.targets.TargetFieldMapping(source=\"target_id\", target=\"id\")]\n            )\n        )\n    ),\n    primary_key_fields=[\"id\"]\n)\n```\n\n## Common Issues and Solutions\n\n### \"Flow not found\"\n\n- Check APP_TARGET format: `cocoindex show main.py`\n- Use `--app-dir` if not in project root\n- Verify flow name matches decorator\n\n### \"Database connection failed\"\n\n- Check `.env` has `COCOINDEX_DATABASE_URL`\n- Test connection: `psql $COCOINDEX_DATABASE_URL`\n- Use `--env-file` to specify custom location\n\n### \"Schema mismatch\"\n\n- Re-run setup: `cocoindex setup main.py`\n- Drop and recreate: `cocoindex drop main.py && cocoindex setup main.py`\n\n### \"Live update exits immediately\"\n\n- Add `refresh_interval` to source\n- Or use source-specific change capture (Postgres notifications, S3 events)\n\n### \"Out of memory\"\n\n- Add concurrency limits on sources: `max_inflight_rows`, `max_inflight_bytes`\n- Set global limits in `.env`: `COCOINDEX_SOURCE_MAX_INFLIGHT_ROWS`\n\n## Reference Documentation\n\nThis skill includes comprehensive reference documentation for common patterns and operations:\n\n- **references\u002Fflow_patterns.md** - Complete examples of common flow patterns (text embedding, code embedding, knowledge graphs, live updates, concurrency control, etc.)\n- **references\u002Fcustom_functions.md** - Detailed guide for creating custom functions with examples (standalone functions, spec+executor pattern, LLM calls, external APIs, caching)\n- **references\u002Fcli_operations.md** - Complete CLI reference with all commands, options, and workflows\n- **references\u002Fapi_operations.md** - Python API reference with examples for programmatic flow control, live updates, queries, and application integration patterns\n\nLoad these references when users need:\n\n- Detailed examples of specific patterns\n- Complete API documentation\n- Advanced usage scenarios\n- Troubleshooting guidance\n\n**For comprehensive documentation:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002F>\n**Search specific topics:** \u003Chttps:\u002F\u002Fcocoindex.io\u002Fdocs\u002Fsearch?q=url%20encoded%20keyword>\n",{"name":5,"description":7},"main","2b749c82b5d11fac39d9a6e021ce3f5b8a541bd1","cli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex",3931,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates","https:\u002F\u002Faitmpl.com","https:\u002F\u002Fgithub.com\u002Fdavila7","https:\u002F\u002Fdanielavila.me","Building AI dev tools with LLMs","2026-11-14 06:14:46",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add davila7\u002Fclaude-code-templates --skill cocoindex",{"tool":74,"command":75},"bunx","bunx skills add davila7\u002Fclaude-code-templates --skill cocoindex",{"tool":77,"command":78},"pnpm","pnpm dlx skills add davila7\u002Fclaude-code-templates --skill cocoindex","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex\u002FSKILL.md",true,[82,88,92,96],{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fapi_operations.md","REFERENCE","参考文档",13488,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex\u002Freferences\u002Fapi_operations.md",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fcli_operations.md",8897,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex\u002Freferences\u002Fcli_operations.md",{"path":93,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fcustom_functions.md",13690,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex\u002Freferences\u002Fcustom_functions.md",{"path":97,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fflow_patterns.md",13857,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Fcocoindex\u002Freferences\u002Fflow_patterns.md",[101,128,155,184,219,242],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":108,"publishedAt":53},"01M70NHBTQ8BV0A2SCAZXEPHCX","wealthville-pool-scoring","Score DeFi liquidity pools before providing liquidity. Returns a 0-100 pool score and an Enter\u002FHold\u002FExit\u002FReduce\u002FAvoid verdict with calibrated confidence for ~68,800 Solana pools and 575 EVM pools, plus a public miss-inclusive track record. Use when asked whether a pool is worth LPing into, which pools look best right now, or how accurate the scores have actually been.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fweb-data\u002Fwealthville-pool-scoring\u002FSKILL.md",[107],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[109,110,111,112,113,114,115,116,117,33,118,119,120,121,122,123,124,125,126,127],"scoring","pool","wealthville pool scoring","liquidity","which","for","exit","now","use","reduce","with","record","track","verdict","evm","solana","how","public","look",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":135,"publishedAt":53},"01M70MB6VR8ERJ4EM8D5KHBMEV","technical-debt-auditor","Scans a codebase and produces a quantified technical debt report with a prioritized remediation plan. Analyzes dead code, TODO\u002FFIXME\u002FHACK markers, dependency staleness, complexity hotspots, code duplication signals, test coverage gaps, unused exports, and outdated patterns. Use this skill when the user asks to audit their codebase for tech debt, wants a health check of their code quality, says things like \"where should I focus refactoring\", \"find code smells\", \"audit my codebase\", \"what technical debt do we have\", \"prioritize cleanup work\", or asks about code quality metrics. Also trigger when the user mentions \"code rot\", \"legacy cleanup\", \"refactoring priorities\", or wants to understand the overall health of a project before a major effort. Trigger even if the user doesn't say \"technical debt\" explicitly — any request to systematically assess code quality and identify improvement priorities belongs here.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Ftechnical-debt-auditor\u002FSKILL.md",[134],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[136,137,138,139,140,141,142,143,144,145,146,33,147,148,149,150,151,152,153,154],"technical debt","debt","technical","technical debt auditor","auditor","coverage","complexity","markers","project","cleanup","unused","code","todo","work","plan","focus","signals","audit","dependency",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":166,"publishedAt":53},"01M70KPYH9QNHCNME5GJQGE22K","readonly-sql-guard","Make an agent's database access provably read-only. Use when an agent runs caller-supplied SQL against a production\u002FERP\u002Fanalytics database (a \"query\" MCP tool, text-to-SQL, an admin console), or when reviewing DB-access code for write\u002FDDL\u002Fside-effect\u002Ftransaction-escape risks. Checks what a statement CALLS, not just its shape.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdatabase\u002Freadonly-sql-guard\u002FSKILL.md",[161,162,163],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":164,"categoryName":165,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师",[167,168,169,170,171,172,173,114,174,175,176,177,178,179,180,117,181,182,33,183],"readonly","guard","sql guard","sql","readonly sql guard","erp","effect","read-only","db","just","tool","calls","only","MCP","access","database","query",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":188,"licenseFileUrl":189,"sourceHtmlUrl":190,"categories":191,"keywords":195,"publishedAt":53},"01M6AFY6F7CC2BBZP1QD6VTNVC","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[192],{"categoryNo":193,"categoryName":194,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,114,218],"artifacts builder","web","web artifacts builder","artifacts","builder","state","routing","state management","component","css","frontend","ui","Tools","file","components","shadcn","react","Tailwind","suite","jsx","html","single-file","ui components",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":188,"licenseFileUrl":223,"sourceHtmlUrl":224,"categories":225,"keywords":230,"publishedAt":53},"01M6AFWF33SFV9Z3SF4PEEE4BF","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[226,229],{"categoryNo":227,"categoryName":228,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":193,"categoryName":194,"taxonomyType":21,"taxonomyTypeDesc":22},[231,232,233,234,235,197,236,206,207,237,50,238,239,114,240,119,241],"webapp testing","testing","webapp","browser","playwright","applications","debugging","logs","screenshots","local","behavior",{"skillNo":243,"name":244,"nameZh":6,"description":245,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":188,"licenseFileUrl":246,"sourceHtmlUrl":247,"categories":248,"keywords":256,"publishedAt":53},"01M6AF67Q67JJJ5V51JR2P52KA","discernment-nudge","After you give a substantive answer or draft that the user may act on — advice or recommendations, drafted artifacts such as goals, plans, pitches, proposals, or emails, estimates or projections, analysis or interpretation of data, factual claims they may rely on, or a multi-step argument — invoke this skill BEFORE finalizing your reply and then, if it applies, append 2-3 short follow-up questions, each tied to something specific in what you just produced, that help the user check key facts, probe the reasoning or assumptions, and notice missing context. Do this at most once per conversation. Skip it when the user asked a trivial how-to or simple lookup, wants a purely educational explanation, asked you only to format, convert, or assemble a file from content they provided, is writing code they will run, is doing creative writing or casual chat, or already asked you to double-check, cite, or review — the skill file explains these boundaries and the exact output format.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fdiscernment-nudge\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fdiscernment-nudge\u002FSKILL.md",[249,252,253],{"categoryNo":250,"categoryName":251,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":254,"categoryName":255,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000036","内容创作者",[257,258,259,260,261,262,44,263,199,264,209,147,265,266,267,268,269,179,270,33,271,272,273,274,275,125,276],"discernment nudge","nudge","interpretation","help","run","reasoning","writing","lookup","content","review","conversation","short","up","invoke","you","analysis","claims","argument","assemble","recommendations"]