Repository navigation
Expand file tree
/
Copy pathproject.yml
More file actions
180 lines (173 loc) · 7.19 KB
/
Copy pathproject.yml
File metadata and controls
180 lines (173 loc) · 7.19 KB
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
175
176
177
178
179
180
name: OpenVision
options:
bundleIdPrefix: com.openvision
# Bumped 16 → 18 for the on-device Gemma 4 (MLX) backend, which needs iOS 18 at runtime.
# Revert to 16 + gate GemmaLocalService behind `if #available(iOS 18)` to keep older support.
deploymentTarget:
iOS: "18.0"
xcodeVersion: "15.0"
generateEmptyDirectories: true
groupSortPosition: top
settings:
base:
MARKETING_VERSION: "2.14.0"
CURRENT_PROJECT_VERSION: "15"
SWIFT_VERSION: "5.9"
DEVELOPMENT_TEAM: ${DEVELOPMENT_TEAM}
CODE_SIGN_STYLE: Automatic
INFOPLIST_FILE: OpenVision/Resources/Info.plist
PRODUCT_BUNDLE_IDENTIFIER: ${PRODUCT_BUNDLE_IDENTIFIER}
META_APP_ID: ${META_APP_ID}
CLIENT_TOKEN: ${CLIENT_TOKEN}
APP_LINK_URL_SCHEME: ${APP_LINK_URL_SCHEME}
configs:
Debug:
settings:
DEBUG_INFORMATION_FORMAT: dwarf-with-dsym
Release:
settings:
DEBUG_INFORMATION_FORMAT: dwarf-with-dsym
configFiles:
Debug: Config.xcconfig
Release: Config.xcconfig
targets:
OpenVisionTests:
type: bundle.unit-test
platform: iOS
sources:
- path: OpenVisionTests
dependencies:
- target: OpenVision
settings:
base:
GENERATE_INFOPLIST_FILE: YES
OpenVision:
type: application
platform: iOS
sources:
- path: OpenVision
excludes:
- "**/*.example"
resources:
- path: OpenVision/Resources
excludes:
- "**/*.plist"
settings:
base:
INFOPLIST_FILE: OpenVision/Resources/Info.plist
PRODUCT_BUNDLE_IDENTIFIER: $(PRODUCT_BUNDLE_IDENTIFIER)
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
TARGETED_DEVICE_FAMILY: "1,2"
SUPPORTS_MACCATALYST: false
ENABLE_PREVIEWS: true
CODE_SIGN_ENTITLEMENTS: OpenVision/OpenVision.entitlements
SWIFT_OBJC_BRIDGING_HEADER: OpenVision/OpenVision-Bridging-Header.h
dependencies:
- package: meta-wearables-dat-ios
products:
- MWDATCore
- MWDATCamera
# Acoustic voice-activity detection for end-of-turn (see SpeechActivityDetector).
- package: FluidAudio
products:
- FluidAudio
# On-device Gemma 4 (Local backend). MLX/MLXNN resolve transitively via these products.
- package: mlx-swift-lm
products:
- MLXLLM # text LLMs (Qwen 2.5, Gemma 2) via LLMModelFactory
- MLXVLM # vision models (Gemma 4, SmolVLM2) via VLMModelFactory
- MLXLMCommon
- MLXHuggingFace # #hubDownloader() / #huggingFaceTokenizerLoader()
# The macros above expand to HuggingFace.HubClient + Tokenizers.AutoTokenizer; mlx-swift-lm
# deliberately doesn't depend on these, so the consumer supplies them (same as OpenGlasses).
- package: swift-huggingface
products:
- HuggingFace
- package: swift-transformers
products:
- Tokenizers
# On-device neural TTS (Kokoro).
- package: KokoroSwift
product: KokoroSwift
preBuildScripts:
- name: "Check Config Files"
script: |
if [ ! -f "${PROJECT_DIR}/Config.xcconfig" ]; then
echo "error: Config.xcconfig not found. Copy Config.xcconfig.example to Config.xcconfig"
exit 1
fi
basedOnDependencyAnalysis: false
packages:
meta-wearables-dat-ios:
url: https://github.com/facebook/meta-wearables-dat-ios
# Pinned EXACTLY — this SDK rewrites its API most releases, so never float (`from:`).
#
# 0.5.0 -> 0.9.0: device support gates on SDK version. "Blayzer Optics" glasses (issue #55)
# enumerate as 0 devices on 0.5.0, which predates that hardware; support for the newer
# frames landed in 0.6.0 (Ray-Ban Meta Optics) and 0.8.0 (Meta Glasses). 0.9.0 is the
# camera-consolidation API: DeviceSession.addCamera(config:) -> Camera -> camera.stream
# (StreamSession/addStream are gone). Requires iOS 17.2+.
# MUST be regression-tested on Gen 1/2 glasses (register + stream + HFP mic) before merge.
exactVersion: "0.9.0"
# PrismML fork of mlx-swift, adding 1-bit quantized Metal kernels (upstream PR pending).
# Needed to load Bonsai-8B (Qwen3-8B at 1-bit g128, 1.28 GB vs E2B's 3.6 GB). Declared at the
# ROOT so every consumer (mlx-swift-lm + the three vendored packages) resolves the same identity.
# Pinned to v0.31.6_prism, NOT the fork's default `prism` branch: `prism` is 10 commits behind and
# misses "gate NAX to gen-18+ (M5/gen-17 miscompute)" — a correctness fix for current Apple GPUs.
# Upstream base is 0.31.6 (we were on 0.31.4); Kokoro asks for >= 0.29.1, so it satisfies both.
mlx-swift:
url: https://github.com/PrismML-Eng/mlx-swift.git
branch: v0.31.6_prism
mlx-swift-lm:
url: https://github.com/ml-explore/mlx-swift-lm.git
# Pinned to a main commit PAST the 3.31.4 tag that fixes Gemma 4 E2B loading. 3.31.4's VLM backbone
# built k_proj/v_proj/k_norm for ALL layers (never passed kvSharedOnly), so E2B's shared-KV layers
# 15-34 demanded weights the checkpoint omits → keyNotFound. This commit ("Fix MLXVLM Gemma4 loader
# to honor num_kv_shared_layers") passes kvSharedOnly per layer + guards attention on isKVSharedLayer.
# The previous pin stopped just before #369, which needed a newer mlx-swift API
# (greatestFiniteMagnitudeArray) than the 0.31.4 we had then.
#
# Bumped to 14414441 ("Fix MLXFoundationModels compilation against the Xcode 27 beta 5 SDK", #544):
# the commit above was written against an earlier iOS 27 beta FoundationModels API, so on the
# Xcode 27 release SDK MLXFoundationModels fails with "extraneous argument label 'capabilities:'"
# and "'_' can only appear in a pattern". It descends from the commit above (keeps the Gemma 4
# kvSharedOnly fix) and includes #369, which now builds since mlx-swift moved to 0.31.6 (PrismML fork).
revision: "14414441fa44f45eee35a61e9fa0bab577cf9734"
# CoreML Silero VAD (Apache 2.0). Gives us ACOUSTIC end-of-speech detection: the endpoint
# countdown can start when the mic actually goes quiet instead of when SFSpeechRecognizer stops
# emitting partials (which it does in bursts with ~1s gaps mid-sentence, so transcript timing
# can't distinguish "still talking" from "done"). Runs on the Neural Engine — neither the GPU
# our MLX models use nor the CPU — so it doesn't contend with on-device inference.
FluidAudio:
url: https://github.com/FluidInference/FluidAudio.git
from: "0.15.5"
swift-huggingface:
url: https://github.com/huggingface/swift-huggingface.git
from: "0.1.0"
swift-transformers:
url: https://github.com/huggingface/swift-transformers.git
from: "1.0.0"
# On-device neural TTS (Kokoro-82M) via MLX Swift — VENDORED under Vendor/ for full visibility
# and reproducibility (source frozen in-repo, not pulled live). Shares mlx-swift with mlx-swift-lm.
KokoroSwift:
path: Vendor/kokoro-ios
schemes:
OpenVision:
build:
targets:
OpenVision: all
run:
config: Debug
commandLineArguments:
"-FIRDebugEnabled": false
test:
config: Debug
gatherCoverageData: true
targets:
- OpenVisionTests
profile:
config: Release
analyze:
config: Debug
archive:
config: Release