content: [project]
  name = "semantic-workbench-service"
  version = "0.1.0"
  description = "Library for facilitating the implementation of FastAPI-based Semantic Workbench essistants."
  authors = [{ name = "Semantic Workbench Team" }]
  readme = "README.md"
  requires-python = ">=3.11,<3.13"
  dependencies = [
      "aiosqlite~=0.20.0",
      "alembic~=1.13.1",
      "asgi-correlation-id>=4.3.1",
      "asyncpg~=0.29.0",
      "azure-cognitiveservices-speech>=1.41.1",
      "azure-core[aio]>=1.30.0",
      "azure-identity>=1.16.0",
      "azure-keyvault-secrets>=4.8.0",
      "cachetools>=5.3.3",
      "deepmerge>=2.0",
      "fastapi[standard]~=0.115.0",
      "greenlet~=3.0.3",
      "jsonschema>=4.20.0",
      "openai-client>=0.1.0",
      "pydantic-settings>=2.2.0",
      "python-dotenv>=1.0.0",
      "python-jose[cryptography]>=3.3.0",
      "python-json-logger>=2.0.7",
      "rich>=13.7.0",
      "semantic-workbench-api-model>=0.1.0",
      "sqlmodel~=0.0.14",
      "sse-starlette>=1.8.2",
  ]
  
  [dependency-groups]
  dev = [
      "asgi-lifespan>=2.1.0",
      "pyright>=1.1.389",
      "pytest>=7.4.3",
      "pytest-asyncio>=0.23.5.post1",
      "pytest-docker>=3.1.1",
      "pytest-httpx>=0.30.0",
      # semantic-workbench-assistant is used for integration tests
      "semantic-workbench-assistant>=0.1.0",
  ]
  
  [tool.uv.sources]
  openai-client = { path = "../libraries/python/openai-client", editable = true }
  semantic-workbench-api-model = { path = "../libraries/python/semantic-workbench-api-model", editable = true }
  semantic-workbench-assistant = { path = "../libraries/python/semantic-workbench-assistant", editable = true }
  
  [project.scripts]
  start-semantic-workbench-service = "semantic_workbench_service.start:main"
  start-service = "semantic_workbench_service.start:main"
  
  [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [tool.pytest.ini_options]
  addopts = "-vv"
  log_cli = true
  log_cli_level = "WARNING"
  log_cli_format = "%(asctime)s | %(levelname)-7s | %(name)s | %(message)s"
  testpaths = ["tests"]
  asyncio_mode = "auto"
  asyncio_default_fixture_loop_scope = "function"
  
  
  # fail tests on warnings that aren't explicitly ignored
  filterwarnings = [
      "error",
      # stream warnings are from bugs in starlette - hopefully they fix this
      "ignore: Unclosed .MemoryObject(Send|Receive)Stream.:ResourceWarning",
      # aiosqlite doesn't handle cancelations correctly
      "ignore: Exception in thread Thread:pytest.PytestUnhandledThreadExceptionWarning",
      # asyncpg sometimes fails to close sockets/transports/connections
      "ignore: unclosed <socket.socket:ResourceWarning",
      "ignore: unclosed transport:ResourceWarning",
      "ignore: unclosed connection <asyncpg.connection:ResourceWarning",
  ]
  