- Origin:
https://github.com/Techopolis/AnyLanguageModel.git - Upstream:
https://github.com/mattt/AnyLanguageModel.git - Consumer: Perspective Intelligence app (
/Packages/PerspectiveLLM/references this via local path)
These files exist only in our fork and should never conflict with upstream:
Sources/AnyLanguageModel/DownloadableLanguageModel.swift—DownloadableLanguageModelprotocol +MLXModelDownloadManagerSources/AnyLanguageModel/Models/MLXLanguageModel.swift— contains the download manager extension at the end of file (after upstream'sJSONValue.toSendable())scripts/validate-merge.sh— post-merge validationscripts/check-upstream.sh— upstream divergence tracking
- Check divergence:
./scripts/check-upstream.sh - Prefer rebase over merge when possible:
git rebase upstream/main- Rebase resolves conflicts per-commit (smaller, easier to reason about)
- Use merge only when rebase would rewrite published/shared history
- Validate after sync:
./scripts/validate-merge.sh - Rebuild Perspective Intelligence to verify consumer compatibility
After merging upstream, watch for these residual fork artifacts:
- Duplicate type declarations — Our fork previously defined
GPUMemoryConfiguration,GPUMemoryManager, andSessionCacheEntryat the module level. Upstream defines them insideMLXLanguageModel. After merging, only the nested (upstream) versions should exist. - Old cache API — Our fork used
hashTokenPrefix,prefillTokenHash,resolveCache(for:...). Upstream usesprefixTokens,cacheConfigSignature,resolveCache(session:...). The fork versions are dead code after merge. - Scope-less GPU calls — Our fork's
markActive()/markIdle()take no args. Upstream's takeGPUMemoryConfiguration/scope: UUID. If you see parameterless calls, they're from the old fork.
The validate-merge.sh script checks for all of these automatically.
swift build # SPM build (macOS)
swift build --traits MLX # with MLX trait