474 lines
13 KiB
Markdown
474 lines
13 KiB
Markdown
---
|
|
name: benchling-integration
|
|
description: "Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation."
|
|
---
|
|
|
|
# Benchling Integration
|
|
|
|
## Overview
|
|
|
|
Benchling is a cloud platform for life sciences R&D. Access registry entities (DNA, proteins), inventory, electronic lab notebooks, and workflows programmatically via Python SDK and REST API.
|
|
|
|
## When to Use This Skill
|
|
|
|
This skill should be used when:
|
|
- Working with Benchling's Python SDK or REST API
|
|
- Managing biological sequences (DNA, RNA, proteins) and registry entities
|
|
- Automating inventory operations (samples, containers, locations, transfers)
|
|
- Creating or querying electronic lab notebook entries
|
|
- Building workflow automations or Benchling Apps
|
|
- Syncing data between Benchling and external systems
|
|
- Querying the Benchling Data Warehouse for analytics
|
|
- Setting up event-driven integrations with AWS EventBridge
|
|
|
|
## Core Capabilities
|
|
|
|
### 1. Authentication & Setup
|
|
|
|
**Python SDK Installation:**
|
|
```python
|
|
# Stable release
|
|
uv pip install benchling-sdk
|
|
# or with Poetry
|
|
poetry add benchling-sdk
|
|
```
|
|
|
|
**Authentication Methods:**
|
|
|
|
API Key Authentication (recommended for scripts):
|
|
```python
|
|
from benchling_sdk.benchling import Benchling
|
|
from benchling_sdk.auth.api_key_auth import ApiKeyAuth
|
|
|
|
benchling = Benchling(
|
|
url="https://your-tenant.benchling.com",
|
|
auth_method=ApiKeyAuth("your_api_key")
|
|
)
|
|
```
|
|
|
|
OAuth Client Credentials (for apps):
|
|
```python
|
|
from benchling_sdk.auth.client_credentials_oauth2 import ClientCredentialsOAuth2
|
|
|
|
auth_method = ClientCredentialsOAuth2(
|
|
client_id="your_client_id",
|
|
client_secret="your_client_secret"
|
|
)
|
|
benchling = Benchling(
|
|
url="https://your-tenant.benchling.com",
|
|
auth_method=auth_method
|
|
)
|
|
```
|
|
|
|
**Key Points:**
|
|
- API keys are obtained from Profile Settings in Benchling
|
|
- Store credentials securely (use environment variables or password managers)
|
|
- All API requests require HTTPS
|
|
- Authentication permissions mirror user permissions in the UI
|
|
|
|
For detailed authentication information including OIDC and security best practices, refer to `references/authentication.md`.
|
|
|
|
### 2. Registry & Entity Management
|
|
|
|
Registry entities include DNA sequences, RNA sequences, AA sequences, custom entities, and mixtures. The SDK provides typed classes for creating and managing these entities.
|
|
|
|
**Creating DNA Sequences:**
|
|
```python
|
|
from benchling_sdk.models import DnaSequenceCreate
|
|
|
|
sequence = benchling.dna_sequences.create(
|
|
DnaSequenceCreate(
|
|
name="My Plasmid",
|
|
bases="ATCGATCG",
|
|
is_circular=True,
|
|
folder_id="fld_abc123",
|
|
schema_id="ts_abc123", # optional
|
|
fields=benchling.models.fields({"gene_name": "GFP"})
|
|
)
|
|
)
|
|
```
|
|
|
|
**Registry Registration:**
|
|
|
|
To register an entity directly upon creation:
|
|
```python
|
|
sequence = benchling.dna_sequences.create(
|
|
DnaSequenceCreate(
|
|
name="My Plasmid",
|
|
bases="ATCGATCG",
|
|
is_circular=True,
|
|
folder_id="fld_abc123",
|
|
entity_registry_id="src_abc123", # Registry to register in
|
|
naming_strategy="NEW_IDS" # or "IDS_FROM_NAMES"
|
|
)
|
|
)
|
|
```
|
|
|
|
**Important:** Use either `entity_registry_id` OR `naming_strategy`, never both.
|
|
|
|
**Updating Entities:**
|
|
```python
|
|
from benchling_sdk.models import DnaSequenceUpdate
|
|
|
|
updated = benchling.dna_sequences.update(
|
|
sequence_id="seq_abc123",
|
|
dna_sequence=DnaSequenceUpdate(
|
|
name="Updated Plasmid Name",
|
|
fields=benchling.models.fields({"gene_name": "mCherry"})
|
|
)
|
|
)
|
|
```
|
|
|
|
Unspecified fields remain unchanged, allowing partial updates.
|
|
|
|
**Listing and Pagination:**
|
|
```python
|
|
# List all DNA sequences (returns a generator)
|
|
sequences = benchling.dna_sequences.list()
|
|
for page in sequences:
|
|
for seq in page:
|
|
print(f"{seq.name} ({seq.id})")
|
|
|
|
# Check total count
|
|
total = sequences.estimated_count()
|
|
```
|
|
|
|
**Key Operations:**
|
|
- Create: `benchling.<entity_type>.create()`
|
|
- Read: `benchling.<entity_type>.get(id)` or `.list()`
|
|
- Update: `benchling.<entity_type>.update(id, update_object)`
|
|
- Archive: `benchling.<entity_type>.archive(id)`
|
|
|
|
Entity types: `dna_sequences`, `rna_sequences`, `aa_sequences`, `custom_entities`, `mixtures`
|
|
|
|
For comprehensive SDK reference and advanced patterns, refer to `references/sdk_reference.md`.
|
|
|
|
### 3. Inventory Management
|
|
|
|
Manage physical samples, containers, boxes, and locations within the Benchling inventory system.
|
|
|
|
**Creating Containers:**
|
|
```python
|
|
from benchling_sdk.models import ContainerCreate
|
|
|
|
container = benchling.containers.create(
|
|
ContainerCreate(
|
|
name="Sample Tube 001",
|
|
schema_id="cont_schema_abc123",
|
|
parent_storage_id="box_abc123", # optional
|
|
fields=benchling.models.fields({"concentration": "100 ng/μL"})
|
|
)
|
|
)
|
|
```
|
|
|
|
**Managing Boxes:**
|
|
```python
|
|
from benchling_sdk.models import BoxCreate
|
|
|
|
box = benchling.boxes.create(
|
|
BoxCreate(
|
|
name="Freezer Box A1",
|
|
schema_id="box_schema_abc123",
|
|
parent_storage_id="loc_abc123"
|
|
)
|
|
)
|
|
```
|
|
|
|
**Transferring Items:**
|
|
```python
|
|
# Transfer a container to a new location
|
|
transfer = benchling.containers.transfer(
|
|
container_id="cont_abc123",
|
|
destination_id="box_xyz789"
|
|
)
|
|
```
|
|
|
|
**Key Inventory Operations:**
|
|
- Create containers, boxes, locations, plates
|
|
- Update inventory item properties
|
|
- Transfer items between locations
|
|
- Check in/out items
|
|
- Batch operations for bulk transfers
|
|
|
|
### 4. Notebook & Documentation
|
|
|
|
Interact with electronic lab notebook (ELN) entries, protocols, and templates.
|
|
|
|
**Creating Notebook Entries:**
|
|
```python
|
|
from benchling_sdk.models import EntryCreate
|
|
|
|
entry = benchling.entries.create(
|
|
EntryCreate(
|
|
name="Experiment 2025-10-20",
|
|
folder_id="fld_abc123",
|
|
schema_id="entry_schema_abc123",
|
|
fields=benchling.models.fields({"objective": "Test gene expression"})
|
|
)
|
|
)
|
|
```
|
|
|
|
**Linking Entities to Entries:**
|
|
```python
|
|
# Add references to entities in an entry
|
|
entry_link = benchling.entry_links.create(
|
|
entry_id="entry_abc123",
|
|
entity_id="seq_xyz789"
|
|
)
|
|
```
|
|
|
|
**Key Notebook Operations:**
|
|
- Create and update lab notebook entries
|
|
- Manage entry templates
|
|
- Link entities and results to entries
|
|
- Export entries for documentation
|
|
|
|
### 5. Workflows & Automation
|
|
|
|
Automate laboratory processes using Benchling's workflow system.
|
|
|
|
**Creating Workflow Tasks:**
|
|
```python
|
|
from benchling_sdk.models import WorkflowTaskCreate
|
|
|
|
task = benchling.workflow_tasks.create(
|
|
WorkflowTaskCreate(
|
|
name="PCR Amplification",
|
|
workflow_id="wf_abc123",
|
|
assignee_id="user_abc123",
|
|
fields=benchling.models.fields({"template": "seq_abc123"})
|
|
)
|
|
)
|
|
```
|
|
|
|
**Updating Task Status:**
|
|
```python
|
|
from benchling_sdk.models import WorkflowTaskUpdate
|
|
|
|
updated_task = benchling.workflow_tasks.update(
|
|
task_id="task_abc123",
|
|
workflow_task=WorkflowTaskUpdate(
|
|
status_id="status_complete_abc123"
|
|
)
|
|
)
|
|
```
|
|
|
|
**Asynchronous Operations:**
|
|
|
|
Some operations are asynchronous and return tasks:
|
|
```python
|
|
# Wait for task completion
|
|
from benchling_sdk.helpers.tasks import wait_for_task
|
|
|
|
result = wait_for_task(
|
|
benchling,
|
|
task_id="task_abc123",
|
|
interval_wait_seconds=2,
|
|
max_wait_seconds=300
|
|
)
|
|
```
|
|
|
|
**Key Workflow Operations:**
|
|
- Create and manage workflow tasks
|
|
- Update task statuses and assignments
|
|
- Execute bulk operations asynchronously
|
|
- Monitor task progress
|
|
|
|
### 6. Events & Integration
|
|
|
|
Subscribe to Benchling events for real-time integrations using AWS EventBridge.
|
|
|
|
**Event Types:**
|
|
- Entity creation, update, archive
|
|
- Inventory transfers
|
|
- Workflow task status changes
|
|
- Entry creation and updates
|
|
- Results registration
|
|
|
|
**Integration Pattern:**
|
|
1. Configure event routing to AWS EventBridge in Benchling settings
|
|
2. Create EventBridge rules to filter events
|
|
3. Route events to Lambda functions or other targets
|
|
4. Process events and update external systems
|
|
|
|
**Use Cases:**
|
|
- Sync Benchling data to external databases
|
|
- Trigger downstream processes on workflow completion
|
|
- Send notifications on entity changes
|
|
- Audit trail logging
|
|
|
|
Refer to Benchling's event documentation for event schemas and configuration.
|
|
|
|
### 7. Data Warehouse & Analytics
|
|
|
|
Query historical Benchling data using SQL through the Data Warehouse.
|
|
|
|
**Access Method:**
|
|
The Benchling Data Warehouse provides SQL access to Benchling data for analytics and reporting. Connect using standard SQL clients with provided credentials.
|
|
|
|
**Common Queries:**
|
|
- Aggregate experimental results
|
|
- Analyze inventory trends
|
|
- Generate compliance reports
|
|
- Export data for external analysis
|
|
|
|
**Integration with Analysis Tools:**
|
|
- Jupyter notebooks for interactive analysis
|
|
- BI tools (Tableau, Looker, PowerBI)
|
|
- Custom dashboards
|
|
|
|
## Best Practices
|
|
|
|
### Error Handling
|
|
|
|
The SDK automatically retries failed requests:
|
|
```python
|
|
# Automatic retry for 429, 502, 503, 504 status codes
|
|
# Up to 5 retries with exponential backoff
|
|
# Customize retry behavior if needed
|
|
from benchling_sdk.retry import RetryStrategy
|
|
|
|
benchling = Benchling(
|
|
url="https://your-tenant.benchling.com",
|
|
auth_method=ApiKeyAuth("your_api_key"),
|
|
retry_strategy=RetryStrategy(max_retries=3)
|
|
)
|
|
```
|
|
|
|
### Pagination Efficiency
|
|
|
|
Use generators for memory-efficient pagination:
|
|
```python
|
|
# Generator-based iteration
|
|
for page in benchling.dna_sequences.list():
|
|
for sequence in page:
|
|
process(sequence)
|
|
|
|
# Check estimated count without loading all pages
|
|
total = benchling.dna_sequences.list().estimated_count()
|
|
```
|
|
|
|
### Schema Fields Helper
|
|
|
|
Use the `fields()` helper for custom schema fields:
|
|
```python
|
|
# Convert dict to Fields object
|
|
custom_fields = benchling.models.fields({
|
|
"concentration": "100 ng/μL",
|
|
"date_prepared": "2025-10-20",
|
|
"notes": "High quality prep"
|
|
})
|
|
```
|
|
|
|
### Forward Compatibility
|
|
|
|
The SDK handles unknown enum values and types gracefully:
|
|
- Unknown enum values are preserved
|
|
- Unrecognized polymorphic types return `UnknownType`
|
|
- Allows working with newer API versions
|
|
|
|
### Security Considerations
|
|
|
|
- Never commit API keys to version control
|
|
- Use environment variables for credentials
|
|
- Rotate keys if compromised
|
|
- Grant minimal necessary permissions for apps
|
|
- Use OAuth for multi-user scenarios
|
|
|
|
## Resources
|
|
|
|
### references/
|
|
|
|
Detailed reference documentation for in-depth information:
|
|
|
|
- **authentication.md** - Comprehensive authentication guide including OIDC, security best practices, and credential management
|
|
- **sdk_reference.md** - Detailed Python SDK reference with advanced patterns, examples, and all entity types
|
|
- **api_endpoints.md** - REST API endpoint reference for direct HTTP calls without the SDK
|
|
|
|
Load these references as needed for specific integration requirements.
|
|
|
|
### scripts/
|
|
|
|
This skill currently includes example scripts that can be removed or replaced with custom automation scripts for your specific Benchling workflows.
|
|
|
|
## Common Use Cases
|
|
|
|
**1. Bulk Entity Import:**
|
|
```python
|
|
# Import multiple sequences from FASTA file
|
|
from Bio import SeqIO
|
|
|
|
for record in SeqIO.parse("sequences.fasta", "fasta"):
|
|
benchling.dna_sequences.create(
|
|
DnaSequenceCreate(
|
|
name=record.id,
|
|
bases=str(record.seq),
|
|
is_circular=False,
|
|
folder_id="fld_abc123"
|
|
)
|
|
)
|
|
```
|
|
|
|
**2. Inventory Audit:**
|
|
```python
|
|
# List all containers in a specific location
|
|
containers = benchling.containers.list(
|
|
parent_storage_id="box_abc123"
|
|
)
|
|
|
|
for page in containers:
|
|
for container in page:
|
|
print(f"{container.name}: {container.barcode}")
|
|
```
|
|
|
|
**3. Workflow Automation:**
|
|
```python
|
|
# Update all pending tasks for a workflow
|
|
tasks = benchling.workflow_tasks.list(
|
|
workflow_id="wf_abc123",
|
|
status="pending"
|
|
)
|
|
|
|
for page in tasks:
|
|
for task in page:
|
|
# Perform automated checks
|
|
if auto_validate(task):
|
|
benchling.workflow_tasks.update(
|
|
task_id=task.id,
|
|
workflow_task=WorkflowTaskUpdate(
|
|
status_id="status_complete"
|
|
)
|
|
)
|
|
```
|
|
|
|
**4. Data Export:**
|
|
```python
|
|
# Export all sequences with specific properties
|
|
sequences = benchling.dna_sequences.list()
|
|
export_data = []
|
|
|
|
for page in sequences:
|
|
for seq in page:
|
|
if seq.schema_id == "target_schema_id":
|
|
export_data.append({
|
|
"id": seq.id,
|
|
"name": seq.name,
|
|
"bases": seq.bases,
|
|
"length": len(seq.bases)
|
|
})
|
|
|
|
# Save to CSV or database
|
|
import csv
|
|
with open("sequences.csv", "w") as f:
|
|
writer = csv.DictWriter(f, fieldnames=export_data[0].keys())
|
|
writer.writeheader()
|
|
writer.writerows(export_data)
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- **Official Documentation:** https://docs.benchling.com
|
|
- **Python SDK Reference:** https://benchling.com/sdk-docs/
|
|
- **API Reference:** https://benchling.com/api/reference
|
|
- **Support:** [email protected]
|