File size: 4,991 Bytes
fe69a86
 
 
 
 
 
81fbbe1
fe69a86
 
 
 
 
 
81fbbe1
 
 
 
 
 
 
 
 
 
 
fe69a86
 
a4df877
 
 
 
cf1f373
a4df877
fe69a86
a4df877
cf1f373
81fbbe1
 
 
a4df877
90b3858
 
fe69a86
 
 
 
 
 
 
 
25509ee
fe69a86
 
 
 
 
 
 
 
 
a4df877
 
 
 
fe69a86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cf1f373
 
 
 
 
4fbec9d
cf1f373
6106aed
 
 
b26fcdd
cf1f373
 
 
 
 
fe69a86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "Reachy_OpenWebUI"
version = "0.6.6.2"
authors = [{ name = "Jacid23" }]
description = "OpenWebUI-first Reachy Mini conversation app using OpenWebUI-managed STT, chat, workspace tools, and TTS."
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
    #Media
    # NOTE: gradio and fastrtc are required at runtime but deliberately NOT
    # declared. Verified with uv dry-runs against reachy-mini==1.9.0:
    #  - gradio==5.50.1.dev1 is the conflict (its pydantic<=2.12.3 cap vs
    #    reachy-mini's pydantic>=2.12.5) — declaring it makes the installer
    #    downgrade the SDK to 1.8.0, which breaks the app-side camera.
    #  - fastrtc==0.0.34 resolves, but declaring it makes uv swap gradio
    #    down to 5.23.1 (untested with fastrtc; 5.50.1.dev1 was pinned for
    #    fastrtc compatibility), so it stays venv-owned alongside gradio.
    # Both live in the shared apps venv. Fresh venv bootstrap:
    #   uv pip install gradio==5.50.1.dev1 fastrtc==0.0.34
    # Re-declare both when fastrtc ships gradio-6 support.
    "av",
    "aiortc>=1.13.0",
    "fastapi",
    "httpx",
    "numpy",
    "onnxruntime",
    "opencv-python>=4.12.0.88",
    "python-multipart",
    "pyyaml",
    "requests",
    "zxing-cpp>=2.3.0",
    # Exact pin: 0.10.14 is numpy-2-clean (verified via uv dry-run);
    # 0.10.15+ caps numpy<2 and conflicts with reachy-mini>=1.9.0.
    "mediapipe==0.10.14",
    "mcp",

    #Environment variables
    "python-dotenv",

    # Client library used for local Ollama/vLLM/OpenWebUI chat endpoints
    "openai>=2.30.0",

    #Reachy mini
    "reachy_mini_dances_library",
    "reachy_mini_toolbox",
    "reachy-mini>=1.9.0",
    "gradio_client>=1.13.3",

    #Required at import/runtime by camera_worker, local audio, and local pipeline
    "scipy",

    #OpenWebUI pipeline (VAD/audio upload/chat/TTS). Torch/Silero are optional at runtime
    # because Reachy's shared venv already owns torch, and fresh torch pulls can
    # drag in giant CUDA/triton wheels.
    "soundfile",
    "setuptools<82",
    "pydantic",
    "starlette",
]

[project.optional-dependencies]
local_vision = [
  "accelerate>=1.13.0; platform_machine != 'aarch64' and platform_machine != 'arm64'",
  "torch>=2.1; platform_machine != 'aarch64' and platform_machine != 'arm64'",
  "transformers==5.3.0; platform_machine != 'aarch64' and platform_machine != 'arm64'",
  "num2words",
]

[dependency-groups]
dev = [
  "pytest",
  "pytest-asyncio",
  "ruff==0.12.0",
  "mypy==1.18.2",
  "pre-commit",
  "types-requests",
  "python-semantic-release>=10.5.3",
]

[project.scripts]
reachy-mini-conversation-app-openwebui = "Reachy_OpenWebUI.main:main"

[tool.uv]
dependency-metadata = [
    # Upstream metadata currently marks `gstreamer-msvc-runtime` as unconditional.
    # It should only be required on Windows. Temp fix.
    { name = "gstreamer-libs", version = "1.28.1", requires-dist = ["gstreamer-msvc-runtime; sys_platform == 'win32'", "setuptools"] },
]

[project.entry-points."reachy_mini_apps"]
Reachy_OpenWebUI = "Reachy_OpenWebUI.main:ReachyMiniConversationOpenWebUIApp"

[tool.setuptools]
package-dir = { "" = "src" }
include-package-data = true

[tool.setuptools.packages.find]
where = ["src"]

[tool.setuptools.package-data]
Reachy_OpenWebUI = [
  "images/*",
  "static/*",
  "static/assets/*",
  "sub_apps/cookAIware/data/*.json",
  "sub_apps/cookAIware/profiles/**/*.txt",
  "profiles/**/*.yaml",
  "sub_apps/cookAIware/profiles/**/*.py",
  "sub_apps/marionette/marionette/static/*",
  "sub_apps/marionette/marionette/static/fonts/*",
  "sub_apps/marionette/marionette/assets/*",
  "sub_apps/reachy_mirror/static/*",
  ".env.example",
  "demos/**/*.txt",
  "profiles/**/*.txt",
  "profiles/**/*.py",
]
reachy_talk_data = [
  "profiles/**/*.txt",
  "profiles/**/*.py",
]

[tool.ruff]
line-length = 119
exclude = [".venv", "dist", "build", "**/__pycache__", "*.egg-info", ".mypy_cache", ".pytest_cache"]

[tool.ruff.lint]
select = [
  "E",   # pycodestyle errors
  "F",   # pyflakes
  "W",   # pycodestyle warnings
  "I",   # isort
  "C4",  # flake8-comprehensions
  "D",   # pydocstyle
]
ignore = [
  "E501",  # handled by formatter
  "D100",  # ignore missing module docstrings
  "D203",  # blank line before class docstring (conflicts with D211)
  "D213",  # summary on second line (conflicts with D212)
]

[tool.ruff.lint.isort]
length-sort = true
lines-after-imports = 2
no-lines-before = ["standard-library", "local-folder"]
known-local-folder = ["Reachy_OpenWebUI"]
known-first-party = ["reachy_mini", "reachy_mini_dances_library", "reachy_mini_toolbox"]
split-on-trailing-comma = true

[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"

[tool.mypy]
python_version = "3.12"
files = ["src/"]
ignore_missing_imports = true
strict = true
show_error_codes = true
warn_unused_ignores = true