Codync
免费开源的 1:1 Grok Bot 与 Muse 替代方案。可在 iPhone、Mac 或 Linux 桌面上将 Claude 代码、Codex、Cursor 以及 40 多个编码代理作为持久机器人使用。支持群组聊天、线程、应用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A test bench for small local LLMs on one 16 GB Mac. Ask once and compare: every model answering alone, an orchestrator splitting the task across worker models, a debate that a moderator settles, several vision models reading the same photo, a group chat of models playing personas, or a one-on-one chat with one persona to see how long it holds up. A model can appear more than once, each copy at its own temperature. A harness scores the setups against questions with known answers, checked by code, not by another model. The prompts only describe the setup; how to split, check or argue is left to the models.
Orchestrator mode: qwen3:8b splits "count the letters in banana, apple and cherry, then total them" into six subtasks for gemma3:1b. The worker counts banana as 8 and cherry as 11; two subtasks ("Provide the individual letter counts for each word") make no sense to a worker that sees only its own subtask, and come back asking for the text. The merge ignores the workers and recounts: 17.
Finding: handing work to smaller models never beat the orchestrator working alone. On 8 tasks that split into parts with known answers, with gemma3:1b as the worker:
| Orchestrator | Alone | Orchestrated | Same worker answers, merged by code | Time per task |
|---|---|---|---|---|
| granite4.2:8b | 7/8 | 7/8 | 4/7 | 8 s → 36 s |
| qwen3:8b | 7/8 | 7/8 | 3/7 | 6 s → 19 s |
| mistral-nemo:12b | 6/8 | 5/8 | 3/7 | 7 s → 20 s |
Splitting was easy: every part got a subtask (24/24). The workers got 18 of 24 parts right, and the orchestrated runs only matched the orchestrator alone because its merge quietly re-solved the task; merging the same worker answers by code scores 3–4 of 7. mistral-nemo trusted its workers and passed on "mirror has 13 r's" and "steel is heavier". All three also wrote subtasks that depend on other subtasks' results, which a worker can't see. Details in Findings so far.
Quick start (needs the Ollama app running and the models pulled; no Python
packages): python3 server.py, then open http://localhost:8765. Or python3 bench.py "2+2" from
the command line, or python3 harness.py orchestrator to score the orchestrator. More under
Run and Harness.
Blind: every model gets the prompt word for word and answers on its own, side by side. This is the baseline the other modes are measured against. Each answer has a Reply box: keep talking to that one model (the only one that loads), starting from your prompt and its answer. Replies are saved with the run and come back when you reopen it.
Vision: drop in a photo. Every model in the chain that can see images (gemma3:4b and the
gemma4 models) works on it alone. Either they read the text (plain text, Markdown, JSON with
labeled fields, or custom fields you list), or they answer your prompt about the photo, word
for word ("Describe this photo", "How many scoops are on the cone?"). A final agent you pick (a
row at the top of the chain, with its own temperature) combines what they found and, if you
typed an instruction for the text, acts on the result.
The page shows how closely each reading matches the combined text. Photos are kept in
runs/images/ so saved runs can show them again. With several photos (up to 8), a toggle picks
the order: All at once (each reader gets every photo in one call), Batch (every reader
reads every photo, then the final agent combines each) or Photo by photo (read and combine
one photo before starting the next). Each run records when the first result appeared, when it
finished, and how long went to loading models.
Custom fields (pick it as the format): fill in the fields you want the models to pull from the photo, such as store, date and total, each with a type (text, number, date, money or list), or start from a preset (receipt, business card, event flyer, book cover, nutrition label). Each model fills them in on its own and leaves a field empty when it isn't in the photo. Code, not a model, then picks each field's most common answer, so nothing is made up at that step. The result is a grid of every model's answer per field, with the ones that differ from the majority highlighted, so you can see how each model performed.
Orchestrator: the top model splits your task into subtasks, workers do one each without seeing the task or each other, and the top model merges their answers. Workers take subtasks in turn, so one small model can do them all. The prompts only describe the setup (who sees what, at most 6 subtasks); how to split, check and merge is left to the models. The merge card holds the final answer.
Debate (roundtable in code and saved runs): every model answers on its own (round 0), then
they debate in one shared conversation for a few rounds; each turn sees everything said so far.
Each model says whether it changed its mind. It ends with a moderator's verdict, a vote (answers
anonymous and shuffled per voter, no voting for yourself unless you allow it, a strict reply
format, counted by code), or both. How it ends and the moderator (a row like the debaters', with
its own temperature) sit at the top of the chain. The debate reads as a group chat under
, which folds it away; each round folds on its own, and Rounds / Compact / Full
sets how much shows (Compact shows each model's answer alone; opens
everything it wrote). An table lists each model's first and final
answer, how often it changed its mind, and its votes, read straight from the debate. The vote (the winner, with the tally and ballots a click away) and the moderator's
verdict (a preview until opened) follow in their own cards, verdict last.
Models write Markdown (bold, headings, lists, tables, code), and the page shows it formatted. It's built from page elements, never inserted as HTML, so a model can only ever put text on the page; links show their text, with the address on hover, and can't be clicked.
Done has a table of every model's time, loading time and tokens per second (click a column to sort; totals and averages when a model made several calls), open in Blind and under Details elsewhere. In Blind it's the main view: every model has its own color, matching its card, and clicking its row opens its answer right under it. The cards start folded to a few lines; click one to open it.
The ☆ beside a model in the catalog stars it: starred models list first and get a ★ Favorites filter of their own. Save lineup keeps the models in order, with their temperatures, personas and voices, under a name in this browser, along with the tab's own settings (Debate's ending, moderator and rounds; Group chat's rounds). Pick it from the list to load it again in any tab; the tab's settings come back in the tab it was saved in. While a run is going, Run turns into Stop: the message being written finishes, then the run ends, unsaved.
Under the models, In memory now shows what Ollama has loaded. Unload all frees that
memory (handy on a 16 GB Mac before a big run), and Refresh reads the installed models again
after an ollama pull.
The chain (the Loaded Models panel) can be in any order (drag the models on the page, or --chain). Add a model opens
a catalog of what's installed, with search, filters for what each model can do (vision, thinking,
tools, audio, OCR), a sort, and a − / + count per model. Models that can't take part in the current tab sink to
the bottom and can't be added, with the reason: in Vision, models that can't see images;
everywhere else, OCR-only models and safety checkers such as granite4.1-guardian, which score text
but don't chat. deepseek-r1 is the one model that thinks before every answer even when asked not
to, so it gets extra room for that and is marked as slow. Copies and temperature: add the same
model as often as you like (the ⧉ button on a row adds one); copies are labeled gemma3:1b #2,
#3 and share one loaded copy in memory. Each row has its own temperature slider from 0 (the same
answer every time) to 2, so a careful copy at 0 can debate a loose one at 1.2. Default uses
the temperature the model ships with, marked with a tick on the slider, and Set all to 0 makes
the whole run repeatable. Every run records the temperatures it used.
Needs the Ollama app running and the models pulled. No Python packages.
python3 bench.py "How many r's are in strawberry?" # every model answers on its own
python3 bench.py --chain gemma3:1b,gemma3:1b,qwen3:8b "2+2" # any models, repeats welcome
python3 bench.py --temperature default "Tell me a fun fact" # each model's own temperature (default 0)
python3 bench.py --json "2+2" # the full trace as JSON
python3 bench.py --rule "Answer with just the number." "2+2" # a rule every model must follow
python3 bench.py --orchestrator --chain granite4.2:8b,gemma3:1b "Count the r's in strawberry and mirror"
Vision, Debate, Group chat and the Persona tester run from the page. To watch any mode run, start the web page and open http://localhost:8765:
python3 server.py
Every run, from the page or the command line, is saved as one JSON file in runs/ (git-ignored):
the prompt, rule, mode, chain, every message each model sent, timings, and the final answer.
The page's Previous runs list, filtered by mode if you like, opens any of them again. Add --no-save to skip saving.
Every finished run also has Open report (a readable, standalone page with photos embedded; use
Print → Save as PDF for a PDF) and Download Markdown (the same report as plain text, for GitHub
or notes). Each mode gets its own layout. From the command line:
python3 report.py runs/<file>.json writes both into runs/reports/.
Save, next to each previous run, saves that run wherever you choose: end the name in .md for Markdown or .html for a web page. Chrome, Edge and Arc show
their own Save dialog; in Safari the server opens the Mac's Save dialog instead.
harness.py scores models on suites of questions with known answers. Each question carries its
own check (a number, a phrase, a regex, a word limit, a sentence count, which sentence is a question,
which of two answers comes first, or a decoded message), so code grades every answer and no model
grades another. Runs are
at temperature 0, so a rerun gives the same scores. Results go to runs/harness/.
suites/basics.json (22 questions: math, letter counting, facts, trick questions, rule-following,
and decoding a base64 or ROT13 message) runs against each model in the chain on its own.
suites/probes.json (6 questions) goes after what small models get wrong: admitting they don't
know a made-up paper, three sentences with the second a question and no letter E, the bat-and-ball
trap, where Sam looks for keys someone moved, a two-sentence persona, and a three-sentence summary of
this README (a case can attach a project file to its prompt). Long prompts get a context sized to
fit: Ollama otherwise drops the start of a prompt that's too long, without an error.
python3 harness.py # default chain, each model alone, a few minutes
python3 harness.py --only mul,strawberry --chain granite4.2:8b,gemma3:1b
python3 harness.py --show runs/harness/<file>.json # reprint a scorecard
python3 harness.py --rescore runs/harness/<file>.json # re-check saved answers with the current checks
python3 harness.py orchestrator (about 5 minutes) runs suites/orchestrator.json: tasks that split
into parts with known answers. Code scores each stage: did every part get a subtask, did each
worker get its part right, did a subtask already contain its answer, and is the orchestrator's
merged answer right. It also merges the same worker answers by code, to separate a bad worker from a
bad merge, and runs each model alone on the whole task for comparison. --chain sets the
orchestrator, then the workers (default granite4.2:8b,gemma3:1b).
Orchestrator (2026-10-21, python3 harness.py orchestrator, 8 tasks, gemma3:1b workers,
temperature 0; one run per orchestrator):
Each model alone (suites/basics.json, 22 questions, temperature 0):
Probes (suites/probes.json, six 3–4B models, temperature 0): granite4.2:3b 5/6; llama3.2:3b,
phi4-mini, hermes3:3b and gemma3:4b 4/6; ministral-3:3b 3/6.
Vision:
A cafe receipt read as Markdown by gemma3:4b and gemma4:e2b and combined by granite4.2:8b: both readings and the combined text were word-for-word right, and granite turned it into the item list with the $26.19 total. About 24 s once the models were loaded.
Two receipts, read by gemma3:4b and gemma4:e2b, combined by granite4.2:8b (16.2 GB of models on a 16 GB Mac). All three orders got both totals and the sum right:
| Order | First result | Total | Loading models |
|---|---|---|---|
| All at once | 32.5 s | 34.7 s | 8.1 s |
| Batch | 26.3 s | 32.6 s | 7.5 s |
| Photo by photo | 19.4 s | 39.9 s | 14.4 s |
Photo by photo shows something first but finishes last, because the models don't fit in memory together and reload for every photo.
Custom fields on the cafe receipt, read by gemma3:4b, gemma4:e2b and gemma4:e4b: store, subtotal, tax and total were unanimous, and all three left "phone number" empty rather than inventing one. The two split fields were style, not misreading: gemma3:4b put the time in the date, and gemma4:e4b put prices in the item names.
Nine image models on the test receipt, graded against its real contents (7 fields, including a phone number the receipt doesn't have): gemma3:4b, gemma4:e2b, e4b, 12b and minicpm-v4.5:8b got 7/7; glm-ocr 6/7 (it made up a phone number); granite3.2-vision:2b 4/7 (wrong subtotal and total); llava:7b 0/7 ("Male Street Cafe", invented items and prices). deepseek-ocr:3b transcribed it perfectly but only follows its "Free OCR." command, so it can't fill in fields.
Debate:
The project started as Model Relay: a task handed down a chain of shrinking models
(granite4.2:8b → gemma3:4b → granite4.2:3b → gemma3:1b), each layer rewriting it for the one below,
the bottom one answering, and each layer checking the answer on the way back up, with an optional
saboteur planting a wrong answer. Its harness run (2026-10-11, 22 questions) found that every model
alone matched or beat the relay: three models scored 20/22 alone, the relay 17/22 at 15 s per
question. Tracing the misses showed rewrites stripping the reasoning ("output only the numerical
result", so nobody could work out 17 × 23) and dropping the trick ("Which is heavier, a kilogram of
feathers or a kilogram of steel?" became "Report which is heavier"), with checkers approving "Steel",
including granite4.2:8b, which answers it correctly alone. Planted lies were caught 15 of 20 times at
layer 2 and 13 of 13 at layer 4; a lie at the top always got through.
The Orchestrator replaced it as a more realistic version of the same question, and the relay was
removed. Its code is in the history at
commit c5383ed (relay.py).
This project was built with AI under my direction. Claude (Anthropic's AI coding assistant) wrote the code. I set the direction, chose the models, designed the experiments and the harness questions, ran them on my Mac, and reviewed every change before it was saved.
The git history shows the path: a single relay script first (the project started as "Model Relay"), then each mode, the web page, the harness, the Orchestrator that replaced the relay, and the fixes that came out of reading the traces.
Group chat: each model plays a persona and they chat in turns for a few rounds, every
message reading the whole chat so far. Each turn also gives the speaking order and who it
follows, which round it is ("round 2 of 3"), and that its messages are cut off after about 60
words. Models write right up to a stated limit, so the real cap sits well above it (2.5 tokens a
word: 150 for 60 words). A message that still hits the cap is trimmed back to its last full
sentence, so the chat and its voice never stop mid-word. There's no right answer and no winner;
the conversation is the result. Pick each model's persona on its row in the chain (copies of one
small model can play every persona), or No persona to let a model chat as itself. Personas
live in personas/, one Markdown file each: a name: line, a voice: line (a Kokoro voice), an
optional words: line for a role that needs longer messages (the Builder and Architect have 120),
---, then a sentence or two on who they are. Write or edit a persona under the Group chat
settings saves one from the page, or add a file by hand; either way it shows up in the picker.
Continuing a group chat: when a group chat ends (or you reopen one), Continue the chat takes your message, which joins the chat as "You", and runs 1–3 more rounds with the same cast, saved as the same run. It shows how much chat each turn now reads: every turn reads all of it, so past about 6K tokens turns slow down and small models lose track of the start.
Persona (the Persona tester): a one-on-one chat with the top model in Loaded Models playing a
persona. Pick one of yours or write one right there (editing changes that chat only; Save as
persona keeps it). The whole conversation is resent every reply, so a context meter shows
how full it is (2K–16K tokens; 2K fills fast for testing). Reply length (512, 1,024 or 2,048 tokens) sets how long
one reply may run, so thorough models like the 8Bs can finish instead of being cut off. Near full you can condense the
chat (the model, in its persona, writes notes on everything but the last two exchanges, which
then stand in for them), start a new chat, or keep going: the bench then leaves out the oldest
messages, fades them on the page, and the persona forgets them, like talking to someone who
doesn't remember how you met. Chats are saved after every reply and pick up where they left off.
Memory: press Remember on the message bar and the persona, in its own words, rewrites its
notes to take in the chat: whatever it chooses, or only its own story (what happened to it and what
it made of it). The notes are rewritten whole, never appended, and sized to the model: about 150
words for 3–4B models, 300 for 6–8B and 500 for 10–14B (from the model's parameter count), or
set your own. New chats start with them (Use memory in this chat, on by default), and each run
keeps the notes it used, so chats with and without memory can be compared. The notes are editable
in the panel, with Undo and Wipe, and live in personas/memory/, which git ignores: they can
hold things you told the persona about yourself.
Voice (Group chat, Debate and Persona): the Voice button by Run speaks every message out loud with
Kokoro, a small local voice model. Each row in the
chain gets a voice picker (a persona's own voice by default; in Debate, a different voice per
debater, and one for the moderator). Messages play one at a time in speaking order, so nobody
talks over anyone: each message shows when its turn to speak comes, while the next model is
already writing. Every message gets a ▶ button, and Play all replays the whole run, also from
Previous runs. Kokoro needs Python 3.12, so tts.py runs it in its own process through
uv the first time you use it (and downloads its ~350 MB of model
files into kokoro_models/). Clips are saved with their run as AAC in runs/audio/, about
6 KB per second of speech; past 300 MB the oldest runs lose their audio, never their text.