{"name":"napari-chat-assistant","display_name":"Local Chat Assistant","visibility":"public","icon":"","categories":["Utilities"],"schema_version":"0.2.1","on_activate":null,"on_deactivate":null,"contributions":{"commands":[{"id":"napari-chat-assistant.chat_panel","title":"Local Chat Assistant","python_name":"napari_chat_assistant.widgets.chat_widget:chat_widget","short_title":null,"category":null,"icon":null,"enablement":null}],"readers":null,"writers":null,"widgets":[{"command":"napari-chat-assistant.chat_panel","display_name":"Chat Assistant","autogenerate":false}],"sample_data":null,"themes":null,"menus":{},"submenus":null,"keybindings":null,"configuration":[]},"package_metadata":{"metadata_version":"2.4","name":"napari-chat-assistant","version":"1.4.5","dynamic":["license-file"],"platform":null,"supported_platform":null,"summary":"Local chat assistant scaffold for napari image-analysis workflows","description":"# napari-chat-assistant\n\n[![License MIT](https://img.shields.io/pypi/l/napari-chat-assistant.svg?color=green)](https://github.com/wulinteousa2-hash/napari-chat-assistant/raw/main/LICENSE)\n[![PyPI](https://img.shields.io/pypi/v/napari-chat-assistant.svg?color=green)](https://pypi.org/project/napari-chat-assistant)\n[![Python Version](https://img.shields.io/pypi/pyversions/napari-chat-assistant.svg?color=green)](https://python.org)\n[![napari hub](https://img.shields.io/endpoint?url=https://api.napari-hub.org/shields/napari-chat-assistant)](https://napari-hub.org/plugins/napari-chat-assistant)\n\nLocal, Ollama-powered chat and code assistant for napari image-analysis workflows.\n\n`napari-chat-assistant` adds a dock widget inside napari that understands the active viewer session, runs built-in image-analysis actions, and generates executable napari Python code when a request goes beyond the current toolset.\n\nThe goal is not to bolt a generic chatbot onto a viewer. The goal is to turn napari into a more practical analysis workspace for people who work with microscopy and other large multidimensional imaging datasets, especially users who want local AI help, reproducible workflows, and direct control over their data.\n\n## Who It Is For\n\nThis plugin is built for:\n- imaging core facility users\n- researchers, staff scientists, and students working with imaging data\n- teachers and educators running imaging demos or training sessions\n- users who already work in napari and want help with code, automation, ROI-driven analysis, and repeatable workflows\n\nIt is especially useful when you:\n- inspect large 2D or 3D image stacks in napari\n- move between interactive viewing and Python-based analysis\n- want a local open-weight model instead of a cloud service\n- need to save, reuse, and teach common imaging workflows\n\n## Why It Is Different\n\nThis plugin comes out of long practical imaging experience rather than a generic \"chat in a sidebar\" idea.\n\nIt is designed around how imaging work actually happens:\n- look at the data first\n- identify objects or regions of interest in the viewer\n- ask for the next analysis step in plain language\n- inspect the result\n- run or refine code when needed\n- save useful prompts and scripts for later reuse\n\nThe assistant is grounded in the live napari session. It can inspect loaded layers, use ROI context, run built-in analysis actions, and fall back to executable Python when the request is more specialized. In practice, this makes napari feel closer to a viewer plus notebook-style workbench, without forcing users to leave the image, open QtConsole, or start from a blank script.\n\n## What You Can Do\n\nCurrent workflows include:\n- inspect the selected layer or named layers with structured summaries\n- profile loaded layers with deterministic semantic and workflow-aware metadata\n- run built-in tools for enhancement, thresholding, mask cleanup, measurement, projection, and cropping\n- inspect ROI context and extract grayscale values from `Labels` and `Shapes` layers\n- generate napari Python code when no built-in tool is the right fit\n- paste and run your own viewer-bound Python from the prompt box with `Run My Code`\n- save, pin, tag, rename, and reuse prompts and code from the local Library\n- use built-in demo packs for repeatable teaching, testing, and workflow development\n\nExample requests:\n- `Inspect the selected layer`\n- `Preview threshold on em_2d_snr_mid`\n- `Apply gaussian denoise to em_2d_snr_low with sigma 1.2`\n- `Measure labels table for rgb_cells_2d_labels`\n- `Inspect the current ROI`\n- `Extract ROI values from em_2d_snr_mid using em_2d_mask`\n- `Write napari code to plot object area by condition`\n\n## Local-First By Design\n\nThe assistant runs on local open-weight models through Ollama:\n- no API key required\n- no cloud dependency\n- no internet requirement during normal use\n- no image data leaves your workstation\n\nThis makes it a better fit for research and facility environments where users want privacy, controllability, and local reproducibility.\n\n## What's New In 1.4.5\n\n- improved prompt routing for compound imaging workflows and added a local-first path for axon-interior extraction\n- strengthened napari code validation to block invented layer attributes such as `.type` and `._type`\n- preserved saved code formatting better in `Run My Code` and the local library\n- expanded experimental SAM2 live work with better session handling, progress feedback, and a simpler points workflow\n- kept experimental SAM2 under `Advanced` rather than the default toolbar\n- kept the clearer `Load`, `Unload`, `Test`, `Setup` model flow and improved status wording\n\nFor older release history, see [CHANGELOG.md](CHANGELOG.md).\n\n## Quick Start\n\n1. Install Ollama and pull a local model.\n2. `pip install napari-chat-assistant`\n3. Open `Plugins -> Chat Assistant` in napari and start with a concrete prompt such as `Inspect the selected layer`.\n\n## Requirements\n\n- Python 3.9+\n- napari\n- Ollama installed locally and running on the same machine\n- at least one local Ollama model such as `nemotron-cascade-2:30b`\n\nCore Python dependencies used by the plugin are installed with the package itself.\n\nOptional:\n- `napari-nd2-spectral-ome-zarr` for ND2 export, spectral viewer, and spectral analysis integration\n- external SAM2 project, weights, and config if you want the experimental SAM2 workflow\n\nNotes:\n- The plugin does not bundle the Ollama server or model weights.\n- Model memory requirements vary substantially by model tag.\n- Larger local models may require significant RAM or VRAM.\n\nTested during development on an NVIDIA DGX Spark workstation.\n\n## Installation\n\n### 1. Install Ollama\n\nmacOS and Linux:\n\n```bash\ncurl -fsSL https://ollama.com/install.sh | sh\nollama serve\n```\n\nWindows:\n- download from `https://ollama.com/download/windows`\n- install Ollama\n- start the Ollama service or application\n\nPull at least one model before using the plugin:\n\n```bash\nollama pull nemotron-cascade-2:30b\n```\n\nOptional alternatives:\n\n```bash\nollama pull gpt-oss:120b\nollama pull qwen3-coder-next:latest\nollama pull qwen3.5\nollama pull qwen2.5:7b\n```\n\n### 2. Install the plugin\n\nFor normal use:\n\n```bash\npip install napari-chat-assistant\n```\n\nFor development:\n\n```bash\ngit clone https://github.com/wulinteousa2-hash/napari-chat-assistant.git\ncd napari-chat-assistant\npip install -e .\n```\n\n## Usage\n\n1. Start napari.\n2. Open `Plugins -> Chat Assistant`.\n3. Leave `Base URL` as `http://127.0.0.1:11434` unless your Ollama server is elsewhere.\n4. Choose a model from the `Model` dropdown or type a model tag manually.\n5. Click `Test`.\n6. Start chatting, or use the Library for repeatable tasks and reusable code.\n\nIf you already have Python code you want to try, paste it into the Prompt box and click `Run My Code`. This runs viewer-bound code directly inside napari without opening QtConsole.\n\nThe assistant works best when prompts describe a concrete action. Natural language is fine.\n\nExamples:\n- `Inspect the selected layer`\n- `Preview threshold on em_2d_snr_mid`\n- `Apply gaussian denoise to em_2d_snr_low with sigma 1.2`\n- `Fill holes in mask_messy_2d`\n- `Remove small objects from mask_messy_2d with min_size 64`\n- `Keep only the largest connected component in mask_messy_2d`\n- `Measure labels table for rgb_cells_2d_labels`\n- `Create a max intensity projection from em_3d_snr_mid along axis 0`\n- `Crop em_2d_snr_high to the bounding box of em_2d_mask with padding 8`\n- `Inspect the current ROI`\n- `Extract ROI values from em_2d_snr_mid using em_2d_mask`\n\n## Typical Workflow\n\n1. Open your image or volume in napari.\n2. Ask the assistant to inspect the layer and suggest the next step.\n3. Run a built-in tool for denoising, thresholding, cleanup, or measurement.\n4. Select an ROI or object in the viewer if you want local analysis.\n5. Ask for code when you need a custom plot, statistics, or reusable script.\n6. Save useful prompts or code snippets into the Library for later reuse.\n\nThis is the core value of the plugin: users can stay in the viewer, interact with the data, ask questions, run analysis, and keep the resulting workflow close to the image session.\n\n## Demo Packs\n\nUse the Library `Code` tab to load built-in demo packs for repeatable testing.\n\nCurrent demo packs include:\n- EM 2D SNR sweep\n- EM 3D SNR sweep\n- RGB cells 2D SNR sweep\n- RGB cells 3D SNR sweep\n- messy masks 2D/3D\n\nThese create named layers so you can test built-in tools quickly without hunting for sample data. Labels layers from the demo packs can also be used as ROIs for ROI inspection and value extraction.\n\nExample pipeline:\n1. Run the `EM 2D SNR Sweep` demo pack.\n2. `Apply gaussian denoise to em_2d_snr_low with sigma 1.0`\n3. `Preview threshold on em_2d_snr_low_gaussian`\n4. `Apply threshold now on em_2d_snr_low_gaussian`\n5. `Fill holes in em_2d_snr_low_gaussian_labels`\n6. `Remove small objects from em_2d_snr_low_gaussian_labels_filled with min_size 64`\n7. `Keep only the largest connected component in em_2d_snr_low_gaussian_labels_filled_clean`\n8. `Measure mask on em_2d_snr_low_gaussian_labels_filled_clean_largest`\n\n## Current Features\n\n### Session-aware tools\n\nThe assistant currently supports built-in tools for:\n- listing all layers\n- inspecting the selected layer\n- inspecting a specific named layer\n- CLAHE contrast enhancement for grayscale 2D and 3D images\n- batch CLAHE across multiple image layers\n- Gaussian denoising for grayscale image layers\n- threshold preview\n- threshold apply\n- batch threshold preview and apply\n- mask measurement\n- batch mask measurement\n- mask cleanup operations such as hole filling, small-object removal, and largest-component selection\n- connected-component labeling for binary masks\n- per-object measurement table summaries for labels layers\n- max-intensity projection for 3D grayscale images\n- cropping one layer to the bounding box of another layer\n- ROI inspection and grayscale value extraction from labels or shapes regions\n- registry-backed tool execution as the foundation for future workflow and pipeline expansion\n\nLayer inspection is backed by a deterministic profile object that includes:\n- `semantic_type`\n- `confidence`\n- `axes_detected`\n- `source_kind`\n- metadata flags such as multiscale, lazy/chunked, channel metadata, and wavelength metadata\n- recommended and discouraged operation classes\n- evidence buckets for debugging and future adapter work\n\nSupported mask operations:\n- `dilate`\n- `erode`\n- `open`\n- `close`\n- `fill_holes`\n- `remove_small`\n- `keep_largest`\n\nAdditional built-in workflow tools currently exposed through chat include:\n- `gaussian_denoise`\n- `remove_small_objects`\n- `fill_mask_holes`\n- `keep_largest_component`\n- `label_connected_components`\n- `measure_labels_table`\n- `project_max_intensity`\n- `crop_to_layer_bbox`\n- `inspect_roi_context`\n- `extract_roi_values`\n\n### Code generation workflows\n\nWhen a request is not covered by a built-in tool, the assistant can return napari Python code instead of forcing the wrong tool.\n\nGenerated code can be:\n- copied to the clipboard\n- reviewed in chat\n- executed from the plugin\n\nYou can also paste your own Python directly into the Prompt box and run it from the plugin with `Run My Code`, without switching to QtConsole.\n\nUse assistant-generated code when you want a reusable script or need custom logic beyond the current built-in tools.\n\nUse `Run My Code` when you already have Python you want to test quickly inside the current napari session.\n\n### Selective session memory\n\nThe assistant includes bounded session memory with three states:\n- `provisional`\n- `approved`\n- `rejected`\n\nBehavior:\n- new assistant outcomes start as provisional\n- successful follow-up actions can promote them to approved\n- only approved items are sent back to the model as `session_memory`\n- current viewer context and current layer profiles always override memory\n- `Thumbs Down Last Answer` rejects the most recent memory candidate for the current session\n\nThis is intentionally not full transcript memory. The model is still grounded primarily in the current napari viewer state.\n\n### Library\n\nThe assistant includes a persistent Library for repeatable workflows and reusable code:\n- built-in starter prompts\n- built-in demo packs and reusable code examples in the `Code` tab\n- recent prompts captured automatically\n- saved prompts for reusable tasks\n- pinned prompts for high-frequency workflows\n- recent and saved code snippets in a separate `Code` tab\n\nInteraction:\n- single click loads a prompt or code snippet into the editor\n- double click sends a prompt directly or runs a code snippet\n- right click can rename or edit tags for saved and recent prompt/code items\n- multi-select supports Shift/Ctrl selection for batch actions\n- `Delete` can remove saved prompts, recent prompts, code snippets, or hide built-in prompts\n- `Clear` removes unpinned recent prompt/code items while keeping saved and pinned items\n\nLogic:\n- `saved` means a user-managed prompt you want to keep as your own reusable entry\n- `pinned` means keep this prompt surfaced at the top of the library\n- a prompt can be pinned without being saved\n- built-in prompts are shipped examples; deleting them hides them from the current local library view\n- built-in code entries include demo packs and starter `Run My Code` examples\n- built-in code entries remain visible even if the same snippet also appears in recent history\n- code snippets can be tagged and renamed so they are easier to reference later in workflows\n\nThis is designed for users who want repeatable automation without committing everything to full scripting.\n\n### Optional ND2 and spectral integration\n\nIf `napari-nd2-spectral-ome-zarr` is installed, the assistant can open:\n- the ND2-to-OME-Zarr export widget\n- the Spectral Viewer widget\n- the Spectral Analysis widget\n\nThis lets chat act as an entry point for Nikon ND2 conversion and spectral workflows without rebuilding those UIs inside this plugin.\n\nInstall links:\n- GitHub: `https://github.com/wulinteousa2-hash/napari-nd2-spectral-ome-zarr`\n- napari Hub: `https://napari-hub.org/plugins/napari-nd2-spectral-ome-zarr.html`\n\n### Experimental SAM2 integration\n\nVersion `1.4.5` includes an experimental SAM2 path for users who want box-prompt or point-prompt segmentation inside napari without making SAM2 part of the default assistant workflow.\n\nBehavior:\n- SAM2 is accessed from `Advanced`, not from the main toolbar\n- `SAM2 Setup` is always available from `Advanced`\n- `SAM2 Live` stays disabled until the backend is configured and passes readiness checks\n- the rest of the assistant remains usable even if SAM2 is not configured\n\nCurrent setup expects:\n- a working Python environment that already includes the dependencies required by your SAM2 wrapper\n- an external SAM2 project path\n- a wrapper module exposed as `sam2_wrapper.py` or `sam2_wrapper/__init__.py`\n- `segment_image_from_box(...)` for box workflows\n- `segment_image_from_points(...)` for point workflows if you want live point prompting\n- a valid checkpoint path\n- a valid config path\n\nTypical setup flow:\n1. Start napari from the environment that contains your SAM2 dependencies.\n2. Open `Plugins -> Chat Assistant`.\n3. Open `Advanced -> SAM2 Setup`.\n4. Enter the SAM2 project path, checkpoint path, config path, and device.\n5. Click `Test`.\n6. Save the settings.\n7. Open `Advanced -> SAM2 Live` when the backend reports ready.\n\n## UI Overview\n\n### Model connection\n\n- local Ollama base URL\n- model picker with discovered local models\n- `Test`\n- `Use`\n- `Setup` help with install, `ollama serve`, and model pull examples\n- `Unload`\n\n### Library\n\n- built-in prompts\n- built-in demo packs and starter code in the `Code` tab\n- recent prompts\n- saved prompts\n- recent and saved code snippets in the `Code` tab\n- pinned prompts\n- `saved` keeps your own reusable copy\n- `pinned` keeps a prompt at the top regardless of whether it is built-in, recent, or saved\n- single click to load\n- double click to send from `Prompts` or run from `Code`\n- right click to rename or edit tags for saved/recent prompt and code items\n- Shift/Ctrl multi-select for batch actions\n- `Delete` works on built-in, recent, saved, and code items\n- `Clear` keeps saved and pinned items and clears unpinned recent items\n- `A-` and `A+` adjust library font size in small steps\n\n### Chat\n\n- multi-line prompt box\n- Enter to send\n- Shift/Ctrl/Alt+Enter for newline\n- transcript showing user messages, assistant replies, tool results, and generated code\n\n### Code actions\n\n- `Reject`\n- `Run Code`\n- `Run My Code`\n- `Copy Code`\n- `Advanced`\n- `Help`\n\n`Run Code` is for assistant-generated code that has been staged in the chat.\n\n`Run My Code` is for your own pasted Python from the Prompt box when you want to test or iterate directly inside napari without opening QtConsole.\n\n`Advanced` contains optional integrations such as experimental SAM2 setup and live preview.\n\n### Current context\n\n- current layer summary from the active napari viewer\n- shortened layer names and a compact per-layer summary to avoid over-stretching the left column\n\n### Session\n\n- `Activity` tab shows local status updates, model connection messages, tool execution messages, and code execution/copy actions\n- `Telemetry` tab contains the optional telemetry controls\n- `Diagnostics` tab provides access to the app log and crash log\n- color-highlighted path entries for assistant log, crash log, telemetry log, prompt library, and session memory\n- `Enable Telemetry` switch for advanced users\n- `Summary`, `Log`, and `Reset` only when telemetry is enabled\n\n## How It Works\n\nThe assistant is designed to operate within constrained napari workflows rather than as a general-purpose chatbot.\n\nThe current strategy is:\n1. collect structured napari viewer context\n2. build deterministic per-layer profile objects from the current viewer state\n3. add bounded approved session memory when available\n4. send that context and the user request to a local Ollama model\n5. the model returns a structured JSON response that specifies either:\n   - a normal reply\n   - a built-in tool call\n   - generated Python code\n6. run the selected registry-backed tool or expose the generated code through the UI\n7. update session memory from explicit user feedback or successful follow-up behavior\n\nThis keeps the assistant more grounded than a plain chat interface and makes common operations more reliable.\n\n## Design Direction\n\nThe intended architecture is:\n\n1. natural language at the user surface\n2. registry-backed tools underneath\n3. explicit scope resolution for full-layer and ROI/subregion workflows\n\nThis means users should be able to ask for operations in normal language, while the plugin resolves those requests into deterministic tool calls with structured parameters.\n\n### Tool model\n\nRegistered tools are the common execution model for:\n- chat-triggered actions\n- reusable UI actions\n- future workflow and pipeline steps\n- future plugin-contributed extensions\n\nEach tool is moving toward a shared definition with:\n- stable name\n- parameter schema\n- supported layer types\n- prepare/execute/apply lifecycle\n- UI metadata\n- provenance metadata\n\n### Scope model\n\nFor imaging analysis, operations may target:\n- the full layer\n- a labels mask\n- a specific labels object\n- a shapes ROI\n- a bounding-box crop\n\nNatural language can express these requests, but the plugin still needs deterministic binding rules underneath.\n\nThe preferred resolution order is:\n1. explicit user binding such as `image_a using roi_shapes`\n2. current viewer selection when there is only one clear match\n3. a short clarification question when multiple bindings are plausible\n\nSession memory should remain secondary context. Current viewer state and explicit user clarification should remain the primary source of truth.\n\n## Recommended Models\n\nFor a broader list of models tested during development, see [docs/tested_models.md](docs/tested_models.md).\n\nGood starting choices:\n- `nemotron-cascade-2:30b`\n- `gpt-oss:120b`\n- `qwen3-coder-next:latest`\n- `qwen3.5`\n- `qwen2.5:7b`\n\nSelection guidance:\n- `nemotron-cascade-2:30b` is the current default and a strong general model for this workflow.\n- `gpt-oss:120b` is a large model that can still feel relatively fast in practice on high-memory systems; it is a good option when you want stronger reasoning without moving to a smaller lightweight tag.\n- `qwen3-coder-next:latest` is a better candidate for Python and napari code generation, but it is significantly heavier.\n- `qwen3.5` remains a useful alternative general model.\n- `qwen2.5:7b` is lighter and may fit smaller-memory systems more easily.\n\nMemory note:\n- Larger tags require more RAM or VRAM.\n- On the DGX Spark setup used during development, `qwen3-coder-next:latest` may need around 100 GB of available memory to run comfortably.\n\n## Current Limitations\n\n- the dataset profiler is still Phase 1 and remains strongest on already-loaded napari layers rather than reader- or file-format-specific workflows\n- TIFF vs OME-Zarr adapter behavior is not implemented yet\n- ND2 and Zeiss reader-aware adapters are not implemented in this plugin\n- the tool registry is in progress; some tools are now registry-backed, but the migration is not complete yet\n- session memory is selective and bounded; it is not full conversation memory\n- model output can still be inconsistent, especially when falling back to generated code\n- some requests still miss built-in tools and fall through to code generation when a stronger built-in workflow would be preferable\n- generated code can still fail if the model invents incorrect napari APIs or unsupported imports\n- multi-step workflow planning and replay are not implemented yet\n- no image attachment or multimodal input pipeline yet\n- performance optimization for very large 2D/3D datasets is still in progress\n- hard native crashes in Qt/C-extension code may not be captured cleanly by the plugin crash log even when normal plugin errors are logged\n\nMost reliable current workflow:\n- use built-in tools for common layer inspection and mask/image actions\n- trust current viewer context and current layer profiles over any remembered prior turn\n- use the Library for repeated prompts, demo packs, and reusable code\n- use generated code when you want explicit review and control\n- use `Run My Code` when you already have working Python and want to test it directly inside napari\n\nFor demo and education workflows:\n- ask for code that uses the current napari `viewer`\n- avoid prompts that create a second `napari.Viewer()` or call `napari.run()`\n- prefer docked widgets over unmanaged popup windows for histogram or SNR teaching tools\n\n## Troubleshooting\n\n### Ollama not running\n\nIf `Test` fails after restarting your computer, Ollama is usually not running yet.\n\nStart it in a terminal:\n\n```bash\nollama serve\n```\n\nThen return to the plugin and click `Test` again.\n\n### Pulling a model\n\nModel downloads are intentionally handled outside the plugin.\n\nTo try a different model:\n- browse tags at `https://ollama.com/search`\n- type the tag into the plugin `Model` field if needed\n- pull it in a terminal, for example:\n\n```bash\nollama pull nemotron-cascade-2:30b\n```\n\nThen use `Test` to refresh the plugin state.\n\n### Logs and crash logs\n\nThe plugin writes two local log files:\n- `~/.napari-chat-assistant/assistant.log`\n- `~/.napari-chat-assistant/crash.log`\n\nUse these together with the terminal traceback when diagnosing crashes or unclear UI failures.\n\n### Local model telemetry\n\nThe plugin also writes lightweight local telemetry to:\n- `~/.napari-chat-assistant/model_telemetry.jsonl`\n\nThis records real usage events such as:\n- request start and completion\n- selected model and prompt hash\n- total latency\n- response type (`reply`, `tool`, `code`, or `error`)\n- reject feedback from `Reject`\n- approved code execution success or failure\n\nTelemetry is opt-in from the `Session -> Telemetry` tab through `Enable Telemetry`.\n\nFor advanced users, the `Session -> Telemetry` tab includes:\n- `Summary` to generate a quick in-app summary of recent model speed and behavior\n- `Log` to inspect the latest raw JSONL records together with the summary\n- `Reset` to clear the local telemetry file and start fresh from the next request\n\nGenerated code is also preflight-validated before execution for common dtype mistakes, unsupported napari imports, and unavailable `viewer.*` APIs. When validation blocks execution, the code remains visible and copyable for review or regeneration.\n\n## Release\n\nThis package is published to PyPI so napari Hub can discover it.\n\nFor maintainer release instructions and PyPI publishing setup, see [RELEASING.md](RELEASING.md).\n\n## Development\n\nEditable install:\n\n```bash\npip install -e .\n```\n\nBuild a release artifact:\n\n```bash\npython -m build\n```\n\n## License\n\nMIT.\n","description_content_type":"text/markdown","keywords":null,"home_page":null,"download_url":null,"author":"Wulin Teo","author_email":null,"maintainer":null,"maintainer_email":null,"license":null,"classifier":["Development Status :: 3 - Alpha","Framework :: napari","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 3","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Topic :: Scientific/Engineering :: Image Processing"],"requires_dist":["napari","numpy","qtpy","scipy","scikit-image","pytest; extra == \"test\"","pytest-cov; extra == \"test\""],"requires_python":">=3.9","requires_external":null,"project_url":["Homepage, https://github.com/wulinteousa2-hash/napari-chat-assistant","Repository, https://github.com/wulinteousa2-hash/napari-chat-assistant","Issues, https://github.com/wulinteousa2-hash/napari-chat-assistant/issues"],"provides_extra":["test"],"provides_dist":null,"obsoletes_dist":null},"npe1_shim":false}