项目文件夹

文件
Rohit C Prasad a8b8732a7f Support PDF attachments end-to-end
PDFs attach as OpenAI file parts; Anthropic/Gemini convert to their
native blocks. Models without native PDF support get a local fallback
at send time — pypdf text extraction or pypdfium2 page images, chosen
in Settings -> Token savings. Attach-time page/size thresholds
(default 20 pages / 10 MB) reject oversized PDFs with a notice.
2026-07-17 13:38:38 -07:00

61 行
2.5 KiB
TOML

[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "coworker"
version = "0.0.0"
description = "Agent coworker platform — provider-agnostic agentic coworker runtime"
requires-python = ">=3.10"
dependencies = [
"openai>=1.0",
"anthropic>=0.40", # native Claude Messages API provider
"google-genai>=1.0", # native Gemini provider
"textual>=1.0",
"fastapi>=0.110",
"uvicorn[standard]>=0.27",
# aisuite (toolkits/tracing) is sourced from this worktree via a .pth in the venv,
# not PyPI; these are aisuite's light base deps the toolkits need.
"docstring_parser",
"pyyaml>=6", # persona manifest frontmatter (YAML)
"pydantic>=2",
"mcp>=1.1", # MCP client (stdio + streamable-http); we use our own async layer on it
"httpx>=0.27", # sync outbound senders for messaging connectors (send_message tool)
"websockets>=13", # managed Slack relay client transport (relay_client.py)
"ddgs>=9", # keyless default web-search provider (DuckDuckGo); Tavily/Brave use httpx
"croniter>=2", # cron next-fire math for the automation scheduler
# PDF attachments for models without native PDF support (pdf_support.py):
# pypdf = pure-python text extraction; pypdfium2 = page rasterization (BSD pdfium,
# ships its own libpdfium — NOT PyMuPDF, whose AGPL license can't ride in the DMG).
"pypdf>=5",
"pypdfium2>=4",
# IANA tz database for zoneinfo. Windows ships no system tz db, so without this every
# named schedule timezone (UTC, Asia/Kolkata, …) silently falls back to local time.
"tzdata; sys_platform == 'win32'",
]
[project.optional-dependencies]
dev = ["pytest>=8", "pytest-asyncio", "httpx"]
# Inbound messaging listeners (outbound send_message needs only httpx, already a core dep).
# aiohttp is slack-bolt's Socket Mode transport at runtime (and the FakeSlack test harness
# drives the real handler) — declare it so CI installs it, not just transitively.
messaging = ["python-telegram-bot>=21", "slack-bolt>=1.18", "aiohttp>=3.9"]
# Interactive Cowork browser automation.
browser = ["playwright>=1.44"]
[project.scripts]
coworker = "coworker.cli:main"
coworker-server = "coworker.server.run:main"
coworker-connectors = "coworker.connectors.cli:main"
[tool.setuptools.packages.find]
where = ["."]
include = ["coworker*"]
[tool.setuptools.package-data]
coworker = ["personas/builtin/*.md"]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"