The token you shared (pypi-AgENdGVzdC5weXBpLm9yZw...) needs to be revoked immediately:
- Go to https://test.pypi.org/manage/account/token/
- Delete the exposed token
- Generate a new one
- Never share it again - not in chat, not in code, not anywhere public
pip install --upgrade build twineCreate or edit ~/.pypirc:
[distutils]
index-servers =
pypi
testpypi
[pypi]
username = __token__
password = pypi-YOUR_NEW_PRODUCTION_TOKEN_HERE
[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = pypi-YOUR_NEW_TEST_TOKEN_HEREThen secure it:
chmod 600 ~/.pypirc# Upload to test environment
./scripts/upload_to_pypi.sh test
# Verify packages uploaded
# Visit: https://test.pypi.org/project/nlweb-dataload/
# Visit: https://test.pypi.org/project/nlweb-core/
# Visit: https://test.pypi.org/project/nlweb-network/
# Test installation
pip install --index-url https://test.pypi.org/simple/ nlweb-dataload# Upload to production (use with caution!)
./scripts/upload_to_pypi.sh prodThese package names will be uploaded:
- β
nlweb-dataload- Standalone data loading - β
nlweb-core- Core framework - β
nlweb-network- Network interfaces (HTTP/MCP/A2A) - β
nlweb-azure-vectordb- Azure AI Search provider - β
nlweb-elastic-vectordb- Elasticsearch provider - β
nlweb-qdrant-vectordb- Qdrant provider - β
nlweb-snowflake-vectordb- Snowflake Cortex Search provider - β
nlweb-azure-models- Azure OpenAI provider - β
nlweb-retrieval- All retrieval providers bundle - β
nlweb-models- All model providers bundle
If you prefer to upload manually:
# Build a single package
cd packages/dataload
python -m build
# Upload to TestPyPI
twine upload --repository testpypi dist/*
# Upload to Production PyPI
twine upload dist/*Current version: 0.5.0 (in all pyproject.toml files)
To release new versions:
- Update version in all
pyproject.tomlfiles - Rebuild and upload
- You cannot re-upload the same version
β NEVER:
- Share API tokens in chat/email/code
- Commit tokens to git
- Use same token for test and production
β ALWAYS:
- Use separate tokens for TestPyPI and PyPI
- Enable 2FA on your PyPI account
- Revoke tokens if accidentally exposed
- Use scoped tokens (per-project) after first upload
- Store tokens in secure password manager
"Package already exists": You can't replace an existing version. Increment version number.
"Invalid credentials": Check your ~/.pypirc has correct token format (starts with pypi-)
"403 Forbidden": Token may be expired or revoked. Generate new one.
Missing dependencies: Make sure to upload in order (dataload β core β network β providers β bundles)