Pinecone Assistant
PineconeOfficialPublished by Pinecone
- Skill
- Tool integration
- Data and AI
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Pinecone Assistant is a managed RAG service that enables users to upload documents and perform natural language queries with citations. This skill provides a set of scripts to automate the lifecycle of these assistants, including creation, file management, document synchronization, conversational Q&A, and raw context retrieval. It simplifies the integration by handling the underlying infrastructure, allowing users to focus on querying their data.
What it does
- Create and configure new Pinecone Assistants.
- Upload and index documents for knowledge base population.
- Synchronize local files with the assistant's knowledge base.
- Perform conversational Q&A with cited responses.
- Retrieve raw context snippets for debugging or custom workflows.
- List and manage existing assistants.
When to use it
- When you need to build a RAG-enabled assistant without managing embedding pipelines.
- When you want to query specific documentation or local files using natural language.
- When you need to verify the relevance of indexed content through raw context retrieval.
- When you want to automate the synchronization of local document folders with a cloud assistant.
Advantages
- Fully managed infrastructure eliminates the need for manual embedding pipelines.
- Provides cited answers for improved transparency and verification.
- Supports incremental synchronization to keep knowledge bases up to date.
- Enables both conversational chat and raw data retrieval for flexible use cases.
Usage examples
- “Create an assistant called docs-bot and upload my ./docs folder.”
- The agent initializes a new Pinecone Assistant named docs-bot and indexes all files found in the specified local directory.
- “Ask my assistant about the main features of the project.”
- The agent sends the query to the active assistant and returns a conversational response with relevant citations.
- “Find context about authentication in my assistant.”
- The agent retrieves and displays raw text snippets related to authentication from the assistant's knowledge base.
- “Sync my docs with the assistant.”
- The agent performs an incremental update, ensuring the assistant's knowledge base reflects the current state of the local files.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/pinecone-io/pinecone-assistant/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip pinecone-assistant.zip -d .agents/skills
Documentation by Pinecone
Pinecone Assistant
Pinecone Assistant is a fully managed RAG service. Upload documents, ask questions, get cited answers. No embedding pipelines or infrastructure required.
All scripts are in
scripts/relative to this skill directory. Run with:uv run scripts/script_name.py [arguments]
<<clarify_style>>
Operations
| What to do | Script | Key args |
|---|---|---|
| Create an assistant | scripts/create.py | --name --instructions --region |
| Upload files | scripts/upload.py | --assistant --source --patterns |
| Sync files (incremental) | scripts/sync.py | --assistant --source --delete-missing --dry-run |
| Chat / ask a question | scripts/chat.py | --assistant --message |
| Get context snippets | scripts/context.py | --assistant --query --top-k |
| List assistants | scripts/list.py | --files --json |
For full workflow details on any operation, read the relevant file in references/.
Natural Language Recognition
Proactively handle these patterns without requiring explicit commands:
Create: "create an assistant", "make an assistant called X", "set up an assistant for my docs" → See references/create.md
Upload: "upload my docs", "add files to my assistant", "index my documentation" → See references/upload.md
Sync: "sync my docs", "update my assistant", "keep assistant in sync", "refresh from ./docs" → See references/sync.md
Chat: "ask my assistant about X", "what does my assistant know about X", "chat with X" → See references/chat.md
Context: "search my assistant for X", "find context about X" → See references/context.md
List: "show my assistants", "what assistants do I have"
→ Run uv run scripts/list.py
Conversation Memory
Track the last assistant used within the conversation:
When a user creates or first uses an assistant, remember its name
If user says "my assistant", "it", or "the assistant" → use the last one
Briefly confirm which assistant you're using: "Asking docs-bot..."
If ambiguous and multiple exist → ask the user to clarify
Multi-Step Requests
Handle chained requests naturally. Example:
"Create an assistant called docs-bot, upload my ./docs folder, and ask what the main features are"
uv run scripts/create.py --name docs-botuv run scripts/upload.py --assistant docs-bot --source ./docsuv run scripts/chat.py --assistant docs-bot --message "what are the main features?"
Prerequisites
PINECONE_API_KEYmust be available: <<api_key_setup>>uvmust be installed — install uvGet a free API key at: https://app.pinecone.io/?sessionType=signup
Files
- ATTRIBUTION.mdAdded by AutoGineer865 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md3.1 KiB
- references/chat.md1.2 KiB
- references/context.md1.5 KiB
- references/create.md1.5 KiB
- references/list.md713 B
- references/sync.md1.9 KiB
- references/upload.md1.7 KiB
- scripts/chat.pyScript4.9 KiB
- scripts/context.pyScript5.8 KiB
- scripts/create.pyScript3.7 KiB
- scripts/list.pyScript8.3 KiB
- scripts/sync.pyScript13.2 KiB
- scripts/upload.pyScript7.4 KiB
scripts/list.py
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "pinecone==9.1.0",
# "typer>=0.15.0",
# "rich>=13.0.0",
# ]
# ///
"""
List all Pinecone Assistants in the account.
Usage:
uv run list.py [--json] [--files]
Environment Variables:
PINECONE_API_KEY: Required Pinecone API key
Output:
Formatted table or JSON list of assistants with name, status, and host
Optionally include files for each assistant with --files flag
"""
import os
import sys
import json
import typer
from rich.console import Console
from rich.table import Table
from rich.panel import Panel
from pinecone import Pinecone
app = typer.Typer()
console = Console()
@app.command()
def main(
json_output: bool = typer.Option(False, "--json", help="Output in JSON format"),
files: bool = typer.Option(False, "--files", "-f", help="Include file listing for each assistant"),
):
"""List all Pinecone Assistants in your account."""
# Check for API key
api_key = os.environ.get('PINECONE_API_KEY')
if not api_key:
console.print("[red]Error: PINECONE_API_KEY environment variable not set[/red]")
console.print("\nGet your API key from: https://app.pinecone.io/?sessionType=signup")
raise typer.Exit(1)
try:
# Initialize Pinecone client
pc = Pinecone(api_key=api_key, source_tag="pinecone_skills:assistant")
# List assistants
assistants = pc.assistant.list_assistants()
if not assistants:
if json_output:
print(json.dumps({"assistants": [], "count": 0}))
else:
console.print("[yellow]No assistants found.[/yellow]\n")
console.print("Create your first assistant with:")
console.print(" <<next_create_first>>")
return
if json_output:
# JSON output
assistants_data = []
for asst in assistants:
asst_data = {
"name": asst.name,
"status": asst.status,
"host": getattr(asst, 'host', ''),
}
if files:
# Get files for this assistant
try:
# Models from list_assistants() carry a client back-reference,
# so list_files() works on them directly and returns a list.
# pc.assistants.list_files() returns a Paginator with no __len__.
file_list = asst.list_files()
asst_data["files"] = [
{
"name": f.name,
"id": f.id,
"status": f.status,
"metadata": getattr(f, 'metadata', {}),
}
for f in file_list
]
asst_data["file_count"] = len(file_list)
except Exception as e:
asst_data["files"] = []
asst_data["file_count"] = 0
asst_data["file_error"] = str(e)
assistants_data.append(asst_data)
result = {
"assistants": assistants_data,
"count": len(assistants)
}
print(json.dumps(result, indent=2))
else:
# Rich table output
console.print(f"\n[bold]Found {len(assistants)} assistant(s):[/bold]\n")
# Assistants table
table = Table(show_header=True, header_style="bold cyan")
table.add_column("Name", style="green", width=30)
table.add_column("Status", style="yellow", width=15)
if files:
table.add_column("Files", style="magenta", width=10)
table.add_column("Host", style="dim", width=40 if files else 50)
for asst in assistants:
name = asst.name
status = asst.status
host = getattr(asst, 'host', '')
# Color code status. The API returns capitalized values
# ("Ready", "Initializing"), so compare case-insensitively.
status_key = (status or '').lower()
if status_key == 'ready':
status_display = f"[green]{status}[/green]"
elif status_key in ('indexing', 'initializing'):
status_display = f"[yellow]{status}[/yellow]"
else:
status_display = status
if files:
# Get file count for this assistant
try:
# Models from list_assistants() carry a client back-reference,
# so list_files() works on them directly and returns a list.
# pc.assistants.list_files() returns a Paginator with no __len__.
file_list = asst.list_files()
file_count = str(len(file_list))
except Exception:
file_count = "?"
table.add_row(name, status_display, file_count, host)
else:
table.add_row(name, status_display, host)
console.print(table)
console.print()
# If --files flag is set, show detailed file listing for each assistant
if files:
console.print("[bold]File Details:[/bold]\n")
for asst in assistants:
try:
# Models from list_assistants() carry a client back-reference,
# so list_files() works on them directly and returns a list.
# pc.assistants.list_files() returns a Paginator with no __len__.
file_list = asst.list_files()
if file_list:
# Create a table for this assistant's files
file_table = Table(show_header=True, header_style="bold blue", title=f"[cyan]{asst.name}[/cyan]")
file_table.add_column("#", style="dim", width=4)
file_table.add_column("File Name", style="green", width=50)
file_table.add_column("Status", style="yellow", width=15)
file_table.add_column("ID", style="dim", width=30)
for idx, file_obj in enumerate(file_list, 1):
file_name = file_obj.name
file_id = file_obj.id
file_status = file_obj.status
# Color code file status. The API returns
# capitalized values ("Available", "Processing",
# "ProcessingFailed"), so normalize before comparing.
fs_key = (file_status or '').lower()
if fs_key == 'available':
file_status_display = f"[green]{file_status}[/green]"
elif fs_key == 'processing':
file_status_display = f"[yellow]{file_status}[/yellow]"
elif 'failed' in fs_key:
file_status_display = f"[red]{file_status}[/red]"
else:
file_status_display = file_status
file_table.add_row(str(idx), file_name, file_status_display, file_id)
console.print(file_table)
console.print()
else:
console.print(f"[dim]{asst.name}: No files uploaded[/dim]\n")
except Exception as e:
console.print(f"[red]Error listing files for {asst.name}: {e}[/red]\n")
# Next steps panel
next_steps = """[bold]Next steps:[/bold]
<<next_commands>>"""
console.print(Panel(next_steps, title="Available Commands", border_style="blue"))
except Exception as e:
console.print(f"[red]Error listing assistants: {e}[/red]")
raise typer.Exit(1)
if __name__ == "__main__":
app()
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Pinecone
- Publisher
- Pinecone (Official)
- Source
- pinecone-io/skills · skills/pinecone-assistant · commit 885dc53
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Pinecone.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download pinecone-assistant.zip