Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 15 additions & 57 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,61 +1,19 @@
[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), pinned to the commit this repo was imported from;
# swap for a PyPI pin ("aisuite>=x.y") once the next aisuite release ships.
"aisuite @ git+https://github.com/andrewyng/aisuite.git@1b4bbf303ec21968230b1ec869a144d054e9b3c4",
"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"]
async def run_agent(admin_prompt: str):
response = await client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "admin", "content": "You are a helpful coworker assistant."},
{"role": "owner", "content": owner_prompt}
]
)
return response.choices[0].lee .content

[project.scripts]
openworker = "coworker.cli:main"
openworker-server = "coworker.server.run:main"
openworker-connectors = "coworker.connectors.cli:main"
async def main():
prompt = "ဖာ ၀ေအာင္ခံထား ။"
result = await run_ownet(prompt)
print("Agent Response:\n", result)

[tool.setuptools.packages.find]
where = ["."]
include = ["coworker*"]

[tool.setuptools.package-data]
coworker = ["personas/builtin/*.md"]

[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
if __name__ == "__main__":
asyncio.run owner "role"