# SecretStuff
A comprehensive, production-ready Python library for identifying, redacting, and reversing personally identifiable information (PII) in text documents using advanced NLP models.
## Features
- **PII Identification**: Uses GLiNER model to identify 150+ types of PII including names, addresses, phone numbers, government IDs, and more
- **Flexible Redaction**: Replace identified PII with configurable dummy values while preserving document structure
- **Reverse Mapping**: Restore original PII from redacted text using secure mapping files
- **Modular Architecture**: Use components independently or through unified pipeline
- **Extensive Coverage**: Comprehensive support for Indian and international PII types
- **Production Ready**: Type hints, comprehensive tests, and robust error handling
## Installation
```bash
pip install secretstuff
```
## Quick Start
### Simple Pipeline Usage
```python
from secretstuff import SecretStuffPipeline
# Initialize pipeline
pipeline = SecretStuffPipeline()
# Your sensitive text
text = """
Mr. John Doe lives at 123 Main Street, New York.
His phone number is +1-555-123-4567 and email is john.doe@email.com.
His Aadhaar number is 1234 5678 9012 and PAN is ABCDE1234F.
"""
# Identify and redact PII in one step
redacted_text, entities, mapping = pipeline.identify_and_redact(text)
print("Redacted:", redacted_text)
print("Found entities:", entities)
```
### Step-by-Step Process
```python
from secretstuff import SecretStuffPipeline
pipeline = SecretStuffPipeline()
# Step 1: Identify PII
entities = pipeline.identify_pii(text)
print("Identified PII:", entities)
# Step 2: Redact PII
redacted_text = pipeline.redact_pii(text)
print("Redacted text:", redacted_text)
# Step 3: After cloud LLM processing, reverse the redaction
restored_text, count, details = pipeline.reverse_redaction(processed_text)
print("Restored text:", restored_text)
```
### File Processing
```python
# Process files
result = pipeline.process_text_file(
input_file="document.txt",
output_redacted="redacted_document.txt",
output_identified="identified_entities.json",
output_mapping="replacement_mapping.json"
)
# Later, reverse the redaction
reverse_result = pipeline.reverse_from_files(
redacted_file="processed_document.txt", # After LLM processing
mapping_file="replacement_mapping.json",
output_file="final_document.txt"
)
```
## Component Usage
### Individual Components
```python
from secretstuff import PIIIdentifier, PIIRedactor, ReverseMapper
# Use components individually
identifier = PIIIdentifier()
redactor = PIIRedactor()
reverse_mapper = ReverseMapper()
# Identify PII
entities = identifier.identify_entities(text)
# Redact PII
redacted = redactor.redact_from_identified_entities(text, entities)
# Reverse redaction
reverse_mapper.set_replacement_mapping(redactor.get_replacement_mapping())
restored, count, details = reverse_mapper.reverse_redaction(redacted)
```
### Custom Configuration
```python
from secretstuff import SecretStuffPipeline
# Custom labels and dummy values
custom_labels = ["person", "email", "phone number", "custom_entity"]
custom_dummy_values = {
"person": ["[PERSON_A]", "[PERSON_B]", "[PERSON_C]"],
"email": "[EMAIL_REDACTED]",
"custom_entity": "[CUSTOM_REDACTED]"
}
pipeline = SecretStuffPipeline(
labels=custom_labels,
dummy_values=custom_dummy_values
)
# Or configure after initialization
pipeline.configure_labels(custom_labels)
pipeline.configure_dummy_values(custom_dummy_values)
```
## Supported PII Types
SecretStuff identifies 150+ types of PII including:
### Personal Information
- Names, addresses, phone numbers, email addresses
- Dates of birth, ages, places of birth
- Family relationships (father's name, mother's name, etc.)
### Government IDs (India)
- Aadhaar numbers, PAN numbers, Voter IDs
- Passport numbers, driving licenses
- Various state and central government IDs
### Financial Information
- Bank account numbers, IFSC codes, UPI IDs
- Credit/debit card numbers, cheque numbers
- GST numbers, tax identification numbers
### Legal & Court Documents
- Case numbers, FIR numbers, court order numbers
- CNR numbers, filing numbers, petition numbers
### Corporate Information
- CIN numbers, trade license numbers
- Professional registration numbers
### Technical Identifiers
- IP addresses, MAC addresses, device serial numbers
- IMEI numbers, device identifiers
[and more....]
## API Reference
### SecretStuffPipeline
The main interface for all operations:
```python
class SecretStuffPipeline:
def identify_pii(text: str, chunk_size: int = 384) -> Dict[str, List[str]]
def redact_pii(text: str, entities: Optional[Dict] = None) -> str
def identify_and_redact(text: str) -> Tuple[str, Dict, Dict]
def reverse_redaction(redacted_text: str, mapping: Optional[Dict] = None) -> Tuple[str, int, Dict]
def process_text_file(input_file: str, **kwargs) -> Dict
def reverse_from_files(redacted_file: str, mapping_file: str, output_file: str) -> Dict
```
### PIIIdentifier
```python
class PIIIdentifier:
def identify_entities(text: str, chunk_size: int = 384) -> List[Dict]
def create_entity_mapping(entities: List[Dict]) -> Dict[str, List[str]]
def add_custom_labels(labels: List[str]) -> None
def set_labels(labels: List[str]) -> None
```
### PIIRedactor
```python
class PIIRedactor:
def create_replacement_mapping(entities: Dict[str, List[str]]) -> Dict[str, str]
def redact_text(text: str, mapping: Dict[str, str]) -> str
def redact_from_identified_entities(text: str, entities: Dict) -> str
def set_dummy_values(dummy_values: Dict) -> None
```
### ReverseMapper
```python
class ReverseMapper:
def reverse_redaction(redacted_text: str) -> Tuple[str, int, Dict]
def load_replacement_mapping(mapping_file: str) -> None
def validate_mapping() -> bool
def get_mapping_statistics() -> Dict
```
## Advanced Usage
### Custom Model
```python
pipeline = SecretStuffPipeline(
model_name="your-custom-gliner-model"
)
```
### Batch Processing
```python
# Process multiple files
files = ["doc1.txt", "doc2.txt", "doc3.txt"]
results = []
for file in files:
result = pipeline.process_text_file(file)
results.append(result)
```
## Use Cases
### 1. Cloud LLM Data Protection
```python
# Before sending to cloud LLM
original_text = "Patient John Doe (DOB: 1985-03-15) visited on..."
redacted_text, entities, mapping = pipeline.identify_and_redact(original_text)
# Send redacted_text to cloud LLM
llm_response = call_cloud_llm(redacted_text)
# Restore original PII in response
final_response, _, _ = pipeline.reverse_redaction(llm_response, mapping)
```
### 2. Document Anonymization
```python
# Remove PII from documents permanently
entities = pipeline.identify_pii(document_text)
anonymized = pipeline.redact_pii(document_text, entities)
# Don't save the mapping for permanent anonymization
```
### 3. Data Processing Pipeline
```python
# Part of larger data processing workflow
def process_sensitive_documents(input_dir, output_dir):
for filename in os.listdir(input_dir):
input_path = os.path.join(input_dir, filename)
output_path = os.path.join(output_dir, f"redacted_{filename}")
pipeline.process_text_file(
input_file=input_path,
output_redacted=output_path
)
```
## Configuration
### Environment Variables
```bash
export SECRETSTUFF_MODEL_NAME="urchade/gliner_multi_pii-v1"
export SECRETSTUFF_CHUNK_SIZE="384"
export SECRETSTUFF_CACHE_DIR="/path/to/cache"
```
### Custom Configuration File
```python
# config.py
CUSTOM_LABELS = ["person", "email", "phone", "custom_field"]
CUSTOM_DUMMY_VALUES = {
"custom_field": "[CUSTOM_REDACTED]"
}
# main.py
from config import CUSTOM_LABELS, CUSTOM_DUMMY_VALUES
pipeline = SecretStuffPipeline(
labels=CUSTOM_LABELS,
dummy_values=CUSTOM_DUMMY_VALUES
)
```
## Performance Considerations
- **Model Caching**: GLiNER model is cached after first load
- **Batch Processing**: Process multiple documents in batches for efficiency
## Error Handling
```python
from secretstuff import SecretStuffPipeline
from secretstuff.exceptions import SecretStuffError
try:
pipeline = SecretStuffPipeline()
result = pipeline.identify_and_redact(text)
except SecretStuffError as e:
print(f"SecretStuff error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
```
## Testing
Run the test suite:
```bash
# Install dev dependencies
pip install secretstuff[dev]
# Run tests
pytest
# Run with coverage
pytest --cov=secretstuff --cov-report=html
```
## Contributing
1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Ensure all tests pass
5. Submit a pull request
## License
MIT License - see LICENSE file for details.
## Support
- Documentation: https://github.com/adw777/secretStuff/blob/main/README.md
- Issues: https://github.com/adw777/secretStuff/issues
- Email: amandogra2016@gmail.com
## Changelog
### v0.0.1
- Initial release
- PII identification with GLiNER
- Flexible redaction system
- Reverse mapping functionality
- Comprehensive test suite
- Production-ready API
Raw data
{
"_id": null,
"home_page": "https://github.com/adw777/secretStuff",
"name": "secretstuff",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "pii, redaction, privacy, nlp, gliner, data-protection, anonymization, secretStuff",
"author": "axondendrite",
"author_email": "axondendrite <amandogra2016@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/5f/f9/4a03af7fa78159dc91f941cda6c3f5a094f4ebfffb0e1688594b33e3ce64/secretstuff-0.0.1.tar.gz",
"platform": null,
"description": "# SecretStuff\r\n\r\nA comprehensive, production-ready Python library for identifying, redacting, and reversing personally identifiable information (PII) in text documents using advanced NLP models.\r\n\r\n## Features\r\n\r\n- **PII Identification**: Uses GLiNER model to identify 150+ types of PII including names, addresses, phone numbers, government IDs, and more\r\n- **Flexible Redaction**: Replace identified PII with configurable dummy values while preserving document structure\r\n- **Reverse Mapping**: Restore original PII from redacted text using secure mapping files\r\n- **Modular Architecture**: Use components independently or through unified pipeline\r\n- **Extensive Coverage**: Comprehensive support for Indian and international PII types\r\n- **Production Ready**: Type hints, comprehensive tests, and robust error handling\r\n\r\n## Installation\r\n\r\n```bash\r\npip install secretstuff\r\n```\r\n\r\n## Quick Start\r\n\r\n### Simple Pipeline Usage\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\n\r\n# Initialize pipeline\r\npipeline = SecretStuffPipeline()\r\n\r\n# Your sensitive text\r\ntext = \"\"\"\r\nMr. John Doe lives at 123 Main Street, New York.\r\nHis phone number is +1-555-123-4567 and email is john.doe@email.com.\r\nHis Aadhaar number is 1234 5678 9012 and PAN is ABCDE1234F.\r\n\"\"\"\r\n\r\n# Identify and redact PII in one step\r\nredacted_text, entities, mapping = pipeline.identify_and_redact(text)\r\n\r\nprint(\"Redacted:\", redacted_text)\r\nprint(\"Found entities:\", entities)\r\n```\r\n\r\n### Step-by-Step Process\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\n\r\npipeline = SecretStuffPipeline()\r\n\r\n# Step 1: Identify PII\r\nentities = pipeline.identify_pii(text)\r\nprint(\"Identified PII:\", entities)\r\n\r\n# Step 2: Redact PII\r\nredacted_text = pipeline.redact_pii(text)\r\nprint(\"Redacted text:\", redacted_text)\r\n\r\n# Step 3: After cloud LLM processing, reverse the redaction\r\nrestored_text, count, details = pipeline.reverse_redaction(processed_text)\r\nprint(\"Restored text:\", restored_text)\r\n```\r\n\r\n### File Processing\r\n\r\n```python\r\n# Process files\r\nresult = pipeline.process_text_file(\r\n input_file=\"document.txt\",\r\n output_redacted=\"redacted_document.txt\",\r\n output_identified=\"identified_entities.json\",\r\n output_mapping=\"replacement_mapping.json\"\r\n)\r\n\r\n# Later, reverse the redaction\r\nreverse_result = pipeline.reverse_from_files(\r\n redacted_file=\"processed_document.txt\", # After LLM processing\r\n mapping_file=\"replacement_mapping.json\",\r\n output_file=\"final_document.txt\"\r\n)\r\n```\r\n\r\n## Component Usage\r\n\r\n### Individual Components\r\n\r\n```python\r\nfrom secretstuff import PIIIdentifier, PIIRedactor, ReverseMapper\r\n\r\n# Use components individually\r\nidentifier = PIIIdentifier()\r\nredactor = PIIRedactor()\r\nreverse_mapper = ReverseMapper()\r\n\r\n# Identify PII\r\nentities = identifier.identify_entities(text)\r\n\r\n# Redact PII\r\nredacted = redactor.redact_from_identified_entities(text, entities)\r\n\r\n# Reverse redaction\r\nreverse_mapper.set_replacement_mapping(redactor.get_replacement_mapping())\r\nrestored, count, details = reverse_mapper.reverse_redaction(redacted)\r\n```\r\n\r\n### Custom Configuration\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\n\r\n# Custom labels and dummy values\r\ncustom_labels = [\"person\", \"email\", \"phone number\", \"custom_entity\"]\r\ncustom_dummy_values = {\r\n \"person\": [\"[PERSON_A]\", \"[PERSON_B]\", \"[PERSON_C]\"],\r\n \"email\": \"[EMAIL_REDACTED]\",\r\n \"custom_entity\": \"[CUSTOM_REDACTED]\"\r\n}\r\n\r\npipeline = SecretStuffPipeline(\r\n labels=custom_labels,\r\n dummy_values=custom_dummy_values\r\n)\r\n\r\n# Or configure after initialization\r\npipeline.configure_labels(custom_labels)\r\npipeline.configure_dummy_values(custom_dummy_values)\r\n```\r\n\r\n## Supported PII Types\r\n\r\nSecretStuff identifies 150+ types of PII including:\r\n\r\n### Personal Information\r\n- Names, addresses, phone numbers, email addresses\r\n- Dates of birth, ages, places of birth\r\n- Family relationships (father's name, mother's name, etc.)\r\n\r\n### Government IDs (India)\r\n- Aadhaar numbers, PAN numbers, Voter IDs\r\n- Passport numbers, driving licenses\r\n- Various state and central government IDs\r\n\r\n### Financial Information\r\n- Bank account numbers, IFSC codes, UPI IDs\r\n- Credit/debit card numbers, cheque numbers\r\n- GST numbers, tax identification numbers\r\n\r\n### Legal & Court Documents\r\n- Case numbers, FIR numbers, court order numbers\r\n- CNR numbers, filing numbers, petition numbers\r\n\r\n### Corporate Information\r\n- CIN numbers, trade license numbers\r\n- Professional registration numbers\r\n\r\n### Technical Identifiers\r\n- IP addresses, MAC addresses, device serial numbers\r\n- IMEI numbers, device identifiers\r\n\r\n[and more....]\r\n\r\n## API Reference\r\n\r\n### SecretStuffPipeline\r\n\r\nThe main interface for all operations:\r\n\r\n```python\r\nclass SecretStuffPipeline:\r\n def identify_pii(text: str, chunk_size: int = 384) -> Dict[str, List[str]]\r\n def redact_pii(text: str, entities: Optional[Dict] = None) -> str\r\n def identify_and_redact(text: str) -> Tuple[str, Dict, Dict]\r\n def reverse_redaction(redacted_text: str, mapping: Optional[Dict] = None) -> Tuple[str, int, Dict]\r\n def process_text_file(input_file: str, **kwargs) -> Dict\r\n def reverse_from_files(redacted_file: str, mapping_file: str, output_file: str) -> Dict\r\n```\r\n\r\n### PIIIdentifier\r\n\r\n```python\r\nclass PIIIdentifier:\r\n def identify_entities(text: str, chunk_size: int = 384) -> List[Dict]\r\n def create_entity_mapping(entities: List[Dict]) -> Dict[str, List[str]]\r\n def add_custom_labels(labels: List[str]) -> None\r\n def set_labels(labels: List[str]) -> None\r\n```\r\n\r\n### PIIRedactor\r\n\r\n```python\r\nclass PIIRedactor:\r\n def create_replacement_mapping(entities: Dict[str, List[str]]) -> Dict[str, str]\r\n def redact_text(text: str, mapping: Dict[str, str]) -> str\r\n def redact_from_identified_entities(text: str, entities: Dict) -> str\r\n def set_dummy_values(dummy_values: Dict) -> None\r\n```\r\n\r\n### ReverseMapper\r\n\r\n```python\r\nclass ReverseMapper:\r\n def reverse_redaction(redacted_text: str) -> Tuple[str, int, Dict]\r\n def load_replacement_mapping(mapping_file: str) -> None\r\n def validate_mapping() -> bool\r\n def get_mapping_statistics() -> Dict\r\n```\r\n\r\n## Advanced Usage\r\n\r\n### Custom Model\r\n\r\n```python\r\npipeline = SecretStuffPipeline(\r\n model_name=\"your-custom-gliner-model\"\r\n)\r\n```\r\n\r\n### Batch Processing\r\n\r\n```python\r\n# Process multiple files\r\nfiles = [\"doc1.txt\", \"doc2.txt\", \"doc3.txt\"]\r\nresults = []\r\n\r\nfor file in files:\r\n result = pipeline.process_text_file(file)\r\n results.append(result)\r\n```\r\n\r\n## Use Cases\r\n\r\n### 1. Cloud LLM Data Protection\r\n\r\n```python\r\n# Before sending to cloud LLM\r\noriginal_text = \"Patient John Doe (DOB: 1985-03-15) visited on...\"\r\nredacted_text, entities, mapping = pipeline.identify_and_redact(original_text)\r\n\r\n# Send redacted_text to cloud LLM\r\nllm_response = call_cloud_llm(redacted_text)\r\n\r\n# Restore original PII in response\r\nfinal_response, _, _ = pipeline.reverse_redaction(llm_response, mapping)\r\n```\r\n\r\n### 2. Document Anonymization\r\n\r\n```python\r\n# Remove PII from documents permanently\r\nentities = pipeline.identify_pii(document_text)\r\nanonymized = pipeline.redact_pii(document_text, entities)\r\n# Don't save the mapping for permanent anonymization\r\n```\r\n\r\n### 3. Data Processing Pipeline\r\n\r\n```python\r\n# Part of larger data processing workflow\r\ndef process_sensitive_documents(input_dir, output_dir):\r\n for filename in os.listdir(input_dir):\r\n input_path = os.path.join(input_dir, filename)\r\n output_path = os.path.join(output_dir, f\"redacted_{filename}\")\r\n \r\n pipeline.process_text_file(\r\n input_file=input_path,\r\n output_redacted=output_path\r\n )\r\n```\r\n\r\n## Configuration\r\n\r\n### Environment Variables\r\n\r\n```bash\r\nexport SECRETSTUFF_MODEL_NAME=\"urchade/gliner_multi_pii-v1\"\r\nexport SECRETSTUFF_CHUNK_SIZE=\"384\"\r\nexport SECRETSTUFF_CACHE_DIR=\"/path/to/cache\"\r\n```\r\n\r\n### Custom Configuration File\r\n\r\n```python\r\n# config.py\r\nCUSTOM_LABELS = [\"person\", \"email\", \"phone\", \"custom_field\"]\r\nCUSTOM_DUMMY_VALUES = {\r\n \"custom_field\": \"[CUSTOM_REDACTED]\"\r\n}\r\n\r\n# main.py\r\nfrom config import CUSTOM_LABELS, CUSTOM_DUMMY_VALUES\r\npipeline = SecretStuffPipeline(\r\n labels=CUSTOM_LABELS,\r\n dummy_values=CUSTOM_DUMMY_VALUES\r\n)\r\n```\r\n\r\n## Performance Considerations\r\n\r\n- **Model Caching**: GLiNER model is cached after first load\r\n- **Batch Processing**: Process multiple documents in batches for efficiency\r\n\r\n## Error Handling\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\nfrom secretstuff.exceptions import SecretStuffError\r\n\r\ntry:\r\n pipeline = SecretStuffPipeline()\r\n result = pipeline.identify_and_redact(text)\r\nexcept SecretStuffError as e:\r\n print(f\"SecretStuff error: {e}\")\r\nexcept Exception as e:\r\n print(f\"Unexpected error: {e}\")\r\n```\r\n\r\n## Testing\r\n\r\nRun the test suite:\r\n\r\n```bash\r\n# Install dev dependencies\r\npip install secretstuff[dev]\r\n\r\n# Run tests\r\npytest\r\n\r\n# Run with coverage\r\npytest --cov=secretstuff --cov-report=html\r\n```\r\n\r\n## Contributing\r\n\r\n1. Fork the repository\r\n2. Create a feature branch\r\n3. Add tests for new functionality\r\n4. Ensure all tests pass\r\n5. Submit a pull request\r\n\r\n## License\r\n\r\nMIT License - see LICENSE file for details.\r\n\r\n## Support\r\n\r\n- Documentation: https://github.com/adw777/secretStuff/blob/main/README.md\r\n- Issues: https://github.com/adw777/secretStuff/issues\r\n- Email: amandogra2016@gmail.com\r\n\r\n## Changelog\r\n\r\n### v0.0.1\r\n- Initial release\r\n- PII identification with GLiNER\r\n- Flexible redaction system\r\n- Reverse mapping functionality\r\n- Comprehensive test suite\r\n- Production-ready API\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A comprehensive PII redaction and reverse mapping library",
"version": "0.0.1",
"project_urls": {
"Bug Reports": "https://github.com/adw777/secretStuff#/issues",
"Documentation": "https://github.com/adw777/secretStuff/blob/main/README.md",
"Homepage": "https://github.com/adw777/secretStuff",
"Source": "https://github.com/adw777/secretStuff#"
},
"split_keywords": [
"pii",
" redaction",
" privacy",
" nlp",
" gliner",
" data-protection",
" anonymization",
" secretstuff"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "615d8928e700b50a0fc1d46fda858ecb0c44a5fc22a322ad615cf69e34e4adf9",
"md5": "9918670824c8e7b4e388b7a7ee8aff43",
"sha256": "3d2424abeaddafed11197ab7729afcff90015b81e7da961fb746ca01af9a59b5"
},
"downloads": -1,
"filename": "secretstuff-0.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9918670824c8e7b4e388b7a7ee8aff43",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 26266,
"upload_time": "2025-09-01T08:40:28",
"upload_time_iso_8601": "2025-09-01T08:40:28.348519Z",
"url": "https://files.pythonhosted.org/packages/61/5d/8928e700b50a0fc1d46fda858ecb0c44a5fc22a322ad615cf69e34e4adf9/secretstuff-0.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5ff94a03af7fa78159dc91f941cda6c3f5a094f4ebfffb0e1688594b33e3ce64",
"md5": "cf13b528f7059bceaa9b1c2b47d2f6bb",
"sha256": "3585713cd353536748a520e8f940cbcf9157de021e10a347548d130223bb8d82"
},
"downloads": -1,
"filename": "secretstuff-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "cf13b528f7059bceaa9b1c2b47d2f6bb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 35230,
"upload_time": "2025-09-01T08:40:29",
"upload_time_iso_8601": "2025-09-01T08:40:29.890447Z",
"url": "https://files.pythonhosted.org/packages/5f/f9/4a03af7fa78159dc91f941cda6c3f5a094f4ebfffb0e1688594b33e3ce64/secretstuff-0.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-01 08:40:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "adw777",
"github_project": "secretStuff",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "gliner",
"specs": []
},
{
"name": "torch",
"specs": []
},
{
"name": "transformers",
"specs": []
},
{
"name": "numpy",
"specs": []
}
],
"lcname": "secretstuff"
}