Metadata-Version: 2.4
Name: atom-ctx
Version: 0.2.17
Summary: An Agent-native context database
Author-email: ByteDance <noreply@bytedance.com>
License: Apache-2.0
Project-URL: Homepage, https://github.com/volcengine/atom-ctx
Project-URL: Documentation, https://atom-ctx.ai
Project-URL: Repository, https://github.com/volcengine/atom-ctx
Project-URL: Issues, https://github.com/volcengine/atom-ctx/issues
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pydantic>=2.0.0
Requires-Dist: typing-extensions>=4.5.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: httpx>=0.25.0
Requires-Dist: pdfplumber>=0.10.0
Requires-Dist: readabilipy>=0.2.0
Requires-Dist: markdownify>=0.11.0
Requires-Dist: openai>=1.0.0
Requires-Dist: requests>=2.31.0
Requires-Dist: python-docx>=1.0.0
Requires-Dist: olefile>=0.47
Requires-Dist: xlrd>=2.0.1
Requires-Dist: python-pptx>=1.0.0
Requires-Dist: openpyxl>=3.0.0
Requires-Dist: ebooklib>=0.18.0
Requires-Dist: json-repair>=0.25.0
Requires-Dist: apscheduler>=3.11.0
Requires-Dist: volcengine>=1.0.216
Requires-Dist: volcengine-python-sdk[ark]>=5.0.3
Requires-Dist: fastapi>=0.128.0
Requires-Dist: uvicorn>=0.39.0
Requires-Dist: xxhash>=3.0.0
Requires-Dist: jinja2>=3.1.6
Requires-Dist: tabulate>=0.9.0
Requires-Dist: urllib3>=2.6.3
Requires-Dist: protobuf>=6.33.5
Requires-Dist: pdfminer-six>=20251230
Requires-Dist: typer>=0.12.0
Requires-Dist: litellm<1.82.6,>=1.0.0
Requires-Dist: python-multipart>=0.0.22
Requires-Dist: tree-sitter>=0.23.0
Requires-Dist: tree-sitter-python>=0.23.0
Requires-Dist: tree-sitter-javascript>=0.23.0
Requires-Dist: tree-sitter-typescript>=0.23.0
Requires-Dist: tree-sitter-java>=0.23.0
Requires-Dist: tree-sitter-cpp>=0.23.0
Requires-Dist: tree-sitter-rust>=0.23.0
Requires-Dist: tree-sitter-go>=0.23.0
Requires-Dist: tree-sitter-c-sharp>=0.23.0
Requires-Dist: loguru>=0.7.3
Requires-Dist: cryptography>=42.0.0
Requires-Dist: argon2-cffi>=23.0.0
Provides-Extra: test
Requires-Dist: pytest>=7.0.0; extra == "test"
Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
Requires-Dist: boto3>=1.42.44; extra == "test"
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
Requires-Dist: ragas>=0.1.0; extra == "test"
Requires-Dist: datasets>=2.0.0; extra == "test"
Requires-Dist: pandas>=2.0.0; extra == "test"
Requires-Dist: diff-match-patch>=20200713; extra == "test"
Requires-Dist: hvac>=2.0.0; extra == "test"
Provides-Extra: dev
Requires-Dist: mypy>=1.0.0; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"
Provides-Extra: doc
Requires-Dist: sphinx>=7.0.0; extra == "doc"
Requires-Dist: sphinx-rtd-theme>=1.3.0; extra == "doc"
Requires-Dist: myst-parser>=2.0.0; extra == "doc"
Provides-Extra: eval
Requires-Dist: ragas>=0.1.0; extra == "eval"
Requires-Dist: datasets>=2.0.0; extra == "eval"
Requires-Dist: pandas>=2.0.0; extra == "eval"
Provides-Extra: gemini
Requires-Dist: google-genai>=1.0.0; extra == "gemini"
Provides-Extra: gemini-async
Requires-Dist: google-genai>=1.0.0; extra == "gemini-async"
Requires-Dist: anyio>=4.0.0; extra == "gemini-async"
Provides-Extra: ocr
Requires-Dist: pytesseract>=0.3.10; extra == "ocr"
Provides-Extra: build
Requires-Dist: setuptools>=61.0; extra == "build"
Requires-Dist: setuptools-scm>=8.0; extra == "build"
Requires-Dist: cmake>=3.15; extra == "build"
Requires-Dist: wheel>=0.45.1; extra == "build"
Requires-Dist: build; extra == "build"
Provides-Extra: bot
Requires-Dist: pydantic-settings>=2.0.0; extra == "bot"
Requires-Dist: websockets>=12.0; extra == "bot"
Requires-Dist: websocket-client>=1.6.0; extra == "bot"
Requires-Dist: httpx[socks]>=0.25.0; extra == "bot"
Requires-Dist: readability-lxml>=0.8.0; extra == "bot"
Requires-Dist: rich>=13.0.0; extra == "bot"
Requires-Dist: croniter>=2.0.0; extra == "bot"
Requires-Dist: socksio>=1.0.0; extra == "bot"
Requires-Dist: python-socketio>=5.11.0; extra == "bot"
Requires-Dist: msgpack>=1.0.8; extra == "bot"
Requires-Dist: python-socks[asyncio]>=2.4.0; extra == "bot"
Requires-Dist: prompt-toolkit>=3.0.0; extra == "bot"
Requires-Dist: pygments>=2.16.0; extra == "bot"
Requires-Dist: html2text>=2020.1.16; extra == "bot"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "bot"
Requires-Dist: ddgs>=9.0.0; extra == "bot"
Requires-Dist: tavily-python>=0.5.0; extra == "bot"
Requires-Dist: gradio>=6.6.0; extra == "bot"
Requires-Dist: py-machineid>=1.0.0; extra == "bot"
Provides-Extra: bot-langfuse
Requires-Dist: langfuse>=3.0.0; extra == "bot-langfuse"
Provides-Extra: bot-telegram
Requires-Dist: python-telegram-bot[socks]>=21.0; extra == "bot-telegram"
Provides-Extra: bot-feishu
Requires-Dist: lark-oapi>=1.0.0; extra == "bot-feishu"
Provides-Extra: bot-dingtalk
Requires-Dist: dingtalk-stream>=0.4.0; extra == "bot-dingtalk"
Provides-Extra: bot-slack
Requires-Dist: slack-sdk>=3.26.0; extra == "bot-slack"
Provides-Extra: bot-qq
Requires-Dist: qq-botpy>=1.0.0; extra == "bot-qq"
Provides-Extra: bot-sandbox
Requires-Dist: opensandbox>=0.1.0; extra == "bot-sandbox"
Requires-Dist: opensandbox-server>=0.1.0; extra == "bot-sandbox"
Requires-Dist: agent-sandbox>=0.0.23; extra == "bot-sandbox"
Provides-Extra: bot-fuse
Requires-Dist: fusepy>=3.0.1; extra == "bot-fuse"
Provides-Extra: bot-opencode
Requires-Dist: opencode-ai>=0.1.0a0; extra == "bot-opencode"
Provides-Extra: bot-full
Requires-Dist: atom-ctx[bot,bot-dingtalk,bot-feishu,bot-fuse,bot-langfuse,bot-opencode,bot-qq,bot-sandbox,bot-slack,bot-telegram]; extra == "bot-full"
Dynamic: license-file

从openviking tag: v0.2.14 切换分支进行重构

感谢openviking的工作，对于企业的agent context engineer的帮助是巨大的。

openviking在0.2.15版本迎来协议上的变更，从apache改为AGPL协议，对于以SaaS服务的企业来说具有一定的限制。

为了避免代码层面的误伤，所以进行了本次小范围重构，并非忽视协议的要求，而是希望企业项目过渡能更平滑。

## Wheel 打包

项目的 Python wheel 打包会在构建阶段同时编译 Python、Rust、Go 和 CMake 相关产物，统一入口如下：

```bash
bash scripts/ci/build-wheel.sh --python python3.12 --clean
```

也可以直接使用 Makefile：

```bash
make build-wheel PYTHON=python3.12
```

可选参数：

- `--version <value>`: 覆盖 wheel 版本，同时透传给 `CTX_VERSION` 与 `setuptools_scm`
- `--out-dir <path>`: 指定 wheel 输出目录
- `--skip-install-build-deps`: 跳过 Python 构建依赖安装
- `--use-build-isolation`: 使用 PEP 517 build isolation
- `--skip-repair-linux-wheel`: Linux 下跳过 `auditwheel repair`

在 Linux 上，脚本会默认对二进制 wheel 执行 `auditwheel repair`，把平台标签从裸 `linux_x86_64` 修正为 PyPI 可接受的 `manylinux_*`。本地需要额外安装 `patchelf`。

## GitHub Actions 手动触发

仓库已提供手动触发 workflow：`.github/workflows/build-wheel.yml`。

在 GitHub Actions 页面选择 `Build Python Wheel` 后，可配置：

- `python-version`: 构建使用的 Python 版本
- `version-override`: 可选版本覆盖
- `clean`: 是否先清理历史构建产物
- `upload-artifact`: 是否上传生成的 wheel 到 Actions artifact
- `publish`: 是否在构建完成后上传包
- `publish-target`: 上传目标，支持 `testpypi` 与 `pypi`

如果开启发布，需要在仓库 Secrets 中配置：

- `TEST_PYPI_API_TOKEN`: 发布到 TestPyPI 时使用
- `PYPI_API_TOKEN`: 发布到正式 PyPI 时使用

建议先用 `testpypi` 验证流程，确认包内容和安装行为无误后，再切换到 `pypi`。

## 本地上传到 PyPI

构建完成后，可以在本地复用同一套发布脚本：

```bash
export TWINE_USERNAME=__token__
export TWINE_PASSWORD=<your-pypi-token>
bash scripts/ci/publish-wheel.sh --python python3.12 --repository pypi
```

上传到 TestPyPI：

```bash
export TWINE_USERNAME=__token__
export TWINE_PASSWORD=<your-testpypi-token>
bash scripts/ci/publish-wheel.sh --python python3.12 --repository testpypi
```

也可以通过 Makefile 调用：

```bash
make publish-wheel PYTHON=python3.12
```

## 本地调试 Workflow

如果本地安装了 `act`，可以用下面的命令模拟 `workflow_dispatch`：

```bash
act workflow_dispatch \
  -W .github/workflows/build-wheel.yml \
  -e .github/act/build-wheel.event.json
```

如果要在 `act` 中测试发布步骤，还需要额外传入 token，例如：

```bash
act workflow_dispatch \
  -W .github/workflows/build-wheel.yml \
  -e .github/act/build-wheel.event.json \
  -s TEST_PYPI_API_TOKEN=<your-testpypi-token>
```

如果需要修改输入参数，直接编辑 `.github/act/build-wheel.event.json` 即可。
