Add official QQ platform support using botpy SDK with WebSocket connection.
Features:
- C2C (private message) support via QQ Open Platform
- WebSocket-based bot connection (no public IP required)
- Message deduplication with efficient deque-based LRU cache
- User whitelist support via allow_from configuration
- Clean async architecture using single event loop
Changes:
- Add QQChannel implementation in nanobot/channels/qq.py
- Add QQConfig schema with appId and secret fields
- Register QQ channel in ChannelManager
- Update README with QQ setup instructions
- Add qq-botpy dependency to pyproject.toml
- Add botpy.log to .gitignore
Setup:
1. Get AppID and Secret from q.qq.com
2. Configure in ~/.nanobot/config.json:
{
"channels": {
"qq": {
"enabled": true,
"appId": "YOUR_APP_ID",
"secret": "YOUR_APP_SECRET",
"allowFrom": []
}
}
}
3. Run: nanobot gateway
Note: Group chat support will be added in future updates.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
88 lines
1.8 KiB
TOML
88 lines
1.8 KiB
TOML
[project]
|
|
name = "nanobot-ai"
|
|
version = "0.1.3.post5"
|
|
description = "A lightweight personal AI assistant framework"
|
|
requires-python = ">=3.11"
|
|
license = {text = "MIT"}
|
|
authors = [
|
|
{name = "nanobot contributors"}
|
|
]
|
|
keywords = ["ai", "agent", "chatbot"]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Intended Audience :: Developers",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
]
|
|
|
|
dependencies = [
|
|
"typer>=0.9.0",
|
|
"litellm>=1.0.0",
|
|
"pydantic>=2.0.0",
|
|
"pydantic-settings>=2.0.0",
|
|
"websockets>=12.0",
|
|
"websocket-client>=1.6.0",
|
|
"httpx[socks]>=0.25.0",
|
|
"loguru>=0.7.0",
|
|
"readability-lxml>=0.8.0",
|
|
"rich>=13.0.0",
|
|
"croniter>=2.0.0",
|
|
"dingtalk-stream>=0.4.0",
|
|
"python-telegram-bot[socks]>=21.0",
|
|
"lark-oapi>=1.0.0",
|
|
"socksio>=1.0.0",
|
|
"qq-botpy>=1.0.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=7.0.0",
|
|
"pytest-asyncio>=0.21.0",
|
|
"ruff>=0.1.0",
|
|
]
|
|
|
|
[project.scripts]
|
|
nanobot = "nanobot.cli.commands:app"
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["nanobot"]
|
|
|
|
[tool.hatch.build.targets.wheel.sources]
|
|
"nanobot" = "nanobot"
|
|
|
|
# Include non-Python files in skills
|
|
[tool.hatch.build]
|
|
include = [
|
|
"nanobot/**/*.py",
|
|
"nanobot/skills/**/*.md",
|
|
"nanobot/skills/**/*.sh",
|
|
]
|
|
|
|
[tool.hatch.build.targets.sdist]
|
|
include = [
|
|
"nanobot/",
|
|
"bridge/",
|
|
"README.md",
|
|
"LICENSE",
|
|
]
|
|
|
|
[tool.hatch.build.targets.wheel.force-include]
|
|
"bridge" = "nanobot/bridge"
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py311"
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "N", "W"]
|
|
ignore = ["E501"]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
testpaths = ["tests"]
|