Spaces:
Sleeping
Sleeping
Whole-space polish: hero chips + tab guide, new 'How runs are scored' and 'Why not real Siri?' tabs, emoji tab labels, footer
Browse files
app.py
CHANGED
|
@@ -1124,6 +1124,28 @@ code {
|
|
| 1124 |
}
|
| 1125 |
.arg-chip b { color: #1e1b4b; font-weight: 700; }
|
| 1126 |
.meta-chips { display: flex; gap: 7px; flex-wrap: wrap; margin: 2px 0 16px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1127 |
"""
|
| 1128 |
|
| 1129 |
THEME = gr.themes.Soft(primary_hue="violet", secondary_hue="indigo", neutral_hue="slate",
|
|
@@ -1136,7 +1158,15 @@ HERO = """
|
|
| 1136 |
powers <b>Siri</b>. We created a set of real-world tasks across the actual iOS apps
|
| 1137 |
(Reminders, Calendar, Contacts & Messages), let the model complete them on its own, and check
|
| 1138 |
whether it actually got them right.</p>
|
| 1139 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1140 |
<div class="stats-grid">
|
| 1141 |
<div class="stat-card">
|
| 1142 |
<div class="stat-num">14</div>
|
|
@@ -1152,12 +1182,14 @@ HERO = """
|
|
| 1152 |
</div>
|
| 1153 |
<div class="stat-card">
|
| 1154 |
<div class="stat-num text-accent">71.4%</div>
|
| 1155 |
-
<div class="stat-label">
|
| 1156 |
</div>
|
| 1157 |
</div>
|
| 1158 |
-
|
| 1159 |
<div class="note">The model runs only on a Mac + iOS Simulator — this Space replays the recorded
|
| 1160 |
-
artifacts (video + trajectory) those runs produced.<
|
|
|
|
|
|
|
| 1161 |
</div>
|
| 1162 |
"""
|
| 1163 |
|
|
@@ -1612,10 +1644,133 @@ input, a newer OS, or private system interfaces. They unblock as the environment
|
|
| 1612 |
{_blocked_table()}
|
| 1613 |
"""
|
| 1614 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1615 |
with gr.Blocks(title="SiriBench — iOS agent tasks & trajectories") as demo:
|
| 1616 |
gr.HTML(HERO)
|
| 1617 |
|
| 1618 |
-
with gr.Tab("Explore tasks"):
|
| 1619 |
with gr.Row(equal_height=False):
|
| 1620 |
# Left Column: Sidebar Task Selector (width: 3 / 30% ratio)
|
| 1621 |
with gr.Column(scale=3, min_width=320):
|
|
@@ -1722,10 +1877,10 @@ with gr.Blocks(title="SiriBench — iOS agent tasks & trajectories") as demo:
|
|
| 1722 |
picker.change(show, picker, outs)
|
| 1723 |
demo.load(show, picker, outs)
|
| 1724 |
|
| 1725 |
-
with gr.Tab("Task classification"):
|
| 1726 |
gr.HTML(CLASSIFY_HTML)
|
| 1727 |
|
| 1728 |
-
with gr.Tab("How tasks are created"):
|
| 1729 |
gr.HTML(WHAT)
|
| 1730 |
gr.HTML(ANATOMY)
|
| 1731 |
gr.HTML(WORKED)
|
|
@@ -1742,9 +1897,18 @@ with gr.Blocks(title="SiriBench — iOS agent tasks & trajectories") as demo:
|
|
| 1742 |
"### Scope — why some tasks aren't here yet\n"
|
| 1743 |
"These run on the **iOS 26.4** text-only on-device model. **Visual tasks** (image QA, "
|
| 1744 |
"receipt parsing, image editing) need **image input to the model — an iOS 27 / macOS 27 "
|
| 1745 |
-
"capability**
|
|
|
|
| 1746 |
)
|
| 1747 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1748 |
if __name__ == "__main__":
|
| 1749 |
demo.launch(server_name="0.0.0.0", server_port=7860, theme=THEME, css=CSS,
|
| 1750 |
allowed_paths=[os.path.abspath(TRAJ_DIR)])
|
|
|
|
| 1124 |
}
|
| 1125 |
.arg-chip b { color: #1e1b4b; font-weight: 700; }
|
| 1126 |
.meta-chips { display: flex; gap: 7px; flex-wrap: wrap; margin: 2px 0 16px; }
|
| 1127 |
+
|
| 1128 |
+
/* Hero chips, footer, capability marks */
|
| 1129 |
+
.hero-chips { display: flex; gap: 8px; flex-wrap: wrap; margin: 14px 0 18px; }
|
| 1130 |
+
.hero-chip {
|
| 1131 |
+
font-size: 12px;
|
| 1132 |
+
font-weight: 650;
|
| 1133 |
+
color: #e0e7ff;
|
| 1134 |
+
background: rgba(255,255,255,0.08);
|
| 1135 |
+
border: 1px solid rgba(199,210,254,0.35);
|
| 1136 |
+
padding: 4px 12px;
|
| 1137 |
+
border-radius: 999px;
|
| 1138 |
+
}
|
| 1139 |
+
.foot {
|
| 1140 |
+
text-align: center;
|
| 1141 |
+
font-size: 12.5px;
|
| 1142 |
+
color: #64748b;
|
| 1143 |
+
padding: 26px 10px 8px;
|
| 1144 |
+
line-height: 1.6;
|
| 1145 |
+
}
|
| 1146 |
+
.foot b { color: #1e1b4b; }
|
| 1147 |
+
.cap-yes { color: #047857; font-weight: 800; }
|
| 1148 |
+
.cap-no { color: #b91c1c; font-weight: 800; }
|
| 1149 |
"""
|
| 1150 |
|
| 1151 |
THEME = gr.themes.Soft(primary_hue="violet", secondary_hue="indigo", neutral_hue="slate",
|
|
|
|
| 1158 |
powers <b>Siri</b>. We created a set of real-world tasks across the actual iOS apps
|
| 1159 |
(Reminders, Calendar, Contacts & Messages), let the model complete them on its own, and check
|
| 1160 |
whether it actually got them right.</p>
|
| 1161 |
+
|
| 1162 |
+
<div class="hero-chips">
|
| 1163 |
+
<span class="hero-chip">🧠 ~3B on-device model</span>
|
| 1164 |
+
<span class="hero-chip">📱 real system apps — not mocks</span>
|
| 1165 |
+
<span class="hero-chip">🛠️ 11 tools, one neutral agent</span>
|
| 1166 |
+
<span class="hero-chip">⚖️ no AI judge — real database re-reads</span>
|
| 1167 |
+
<span class="hero-chip">🎞️ every run recorded</span>
|
| 1168 |
+
</div>
|
| 1169 |
+
|
| 1170 |
<div class="stats-grid">
|
| 1171 |
<div class="stat-card">
|
| 1172 |
<div class="stat-num">14</div>
|
|
|
|
| 1182 |
</div>
|
| 1183 |
<div class="stat-card">
|
| 1184 |
<div class="stat-num text-accent">71.4%</div>
|
| 1185 |
+
<div class="stat-label">Documented Run</div>
|
| 1186 |
</div>
|
| 1187 |
</div>
|
| 1188 |
+
|
| 1189 |
<div class="note">The model runs only on a Mac + iOS Simulator — this Space replays the recorded
|
| 1190 |
+
artifacts (video + trajectory) those runs produced. <b style="color:#fff">Start with “Explore
|
| 1191 |
+
tasks”</b>, see how the suite is organized in “Task classification”, read how tasks are built and
|
| 1192 |
+
scored — and why this isn't just “ask Siri” in “Why not real Siri?”.</div>
|
| 1193 |
</div>
|
| 1194 |
"""
|
| 1195 |
|
|
|
|
| 1644 |
{_blocked_table()}
|
| 1645 |
"""
|
| 1646 |
|
| 1647 |
+
JOURNEY_HTML = """
|
| 1648 |
+
<div class="section-h">🧭 Wait — why not just use the real Siri?</div>
|
| 1649 |
+
<p class="lead">The honest answer: we tried, and Siri-the-assistant simply <b>cannot execute tasks in a
|
| 1650 |
+
simulator</b>. That dead end shaped the whole project. Here is the story, and why the pivot still
|
| 1651 |
+
measures the real thing.</p>
|
| 1652 |
+
|
| 1653 |
+
<div class="fam-grid">
|
| 1654 |
+
<div class="fam-card">
|
| 1655 |
+
<div class="fam-name">🎯 1 · The original goal</div>
|
| 1656 |
+
<div class="fam-def">Benchmark <b>Siri-the-assistant</b> end to end: trigger Siri by code, have it run
|
| 1657 |
+
a real app action, then verify the real result on the device. The canonical trial: a money transfer
|
| 1658 |
+
that should move a balance from $500 to $700.</div>
|
| 1659 |
+
</div>
|
| 1660 |
+
<div class="fam-card">
|
| 1661 |
+
<div class="fam-name">🚫 2 · Wall #1 — Siri will not execute in any simulator</div>
|
| 1662 |
+
<div class="fam-def">On the iOS 26 simulator, Siri's voice assets are never delivered, so the
|
| 1663 |
+
assistant is skipped as "content unavailable." On the iOS 27 simulator, Siri activates but executes
|
| 1664 |
+
<b>nothing</b> — even "Open Calendar" fails with <i>"Something went wrong. Please try again."</i>
|
| 1665 |
+
because Apple Intelligence is never marked eligible inside a simulator. Real agentic Siri is a
|
| 1666 |
+
<b>physical-device-only</b> capability.</div>
|
| 1667 |
+
</div>
|
| 1668 |
+
<div class="fam-card">
|
| 1669 |
+
<div class="fam-name">⛔ 3 · Wall #2 — the newest model is blocked in-simulator too</div>
|
| 1670 |
+
<div class="fam-def">Asking the on-device Foundation Model questions directly <b>works on the
|
| 1671 |
+
iOS 26.4 simulator</b> — but on the iOS 27 beta the model loads, even reports itself "available,"
|
| 1672 |
+
then every request dies in a mandatory safety layer with <i>"Simulator is not supported."</i>
|
| 1673 |
+
Golden rule learned: never trust the availability flag, trust an actual generation.</div>
|
| 1674 |
+
</div>
|
| 1675 |
+
<div class="fam-card">
|
| 1676 |
+
<div class="fam-name">🔎 4 · A correction along the way</div>
|
| 1677 |
+
<div class="fam-def">An early theory said "the model weights never downloaded" — wrong. The base
|
| 1678 |
+
model ships pre-installed inside a protected area of macOS, and the simulator hands inference to the
|
| 1679 |
+
<b>Mac's own</b> Apple Intelligence. The block is simulator-specific and deliberate, not a missing
|
| 1680 |
+
download. (Also learned: a non-US-English host silently reports "model asset unavailable.")</div>
|
| 1681 |
+
</div>
|
| 1682 |
+
<div class="fam-card">
|
| 1683 |
+
<div class="fam-name">✅ 5 · The pivot — host the model ourselves</div>
|
| 1684 |
+
<div class="fam-def">An Assistant app loads Apple's on-device Foundation Model directly, hands it
|
| 1685 |
+
<b>11 tools</b> plus an executor that drives the real Reminders / Calendar / Contacts / Messages,
|
| 1686 |
+
records every step, and scores the run against the real device state. Same model — we just replace
|
| 1687 |
+
Siri's shell.</div>
|
| 1688 |
+
</div>
|
| 1689 |
+
<div class="fam-card">
|
| 1690 |
+
<div class="fam-name">🤝 6 · Why this still measures the real thing</div>
|
| 1691 |
+
<div class="fam-def">Real Siri does not tap the screen: it acts on apps by <b>calling declared app
|
| 1692 |
+
actions</b> (App Intents) — pick a named action, fill its typed parameters. That is exactly the
|
| 1693 |
+
tool-calling SiriBench exercises. We removed only the speech front-end the simulator cannot
|
| 1694 |
+
provide.</div>
|
| 1695 |
+
</div>
|
| 1696 |
+
</div>
|
| 1697 |
+
|
| 1698 |
+
<div class="section-h">📡 What actually works where</div>
|
| 1699 |
+
<table>
|
| 1700 |
+
<thead><tr><th>Capability</th><th>iOS 26.4 simulator</th><th>iOS 27 simulator</th><th>Physical device</th></tr></thead>
|
| 1701 |
+
<tbody>
|
| 1702 |
+
<tr><td>Siri-the-assistant executes a task</td><td class="cap-no">✗ skipped — no voice assets</td><td class="cap-no">✗ activates, executes nothing</td><td class="cap-yes">✓ the only place it works</td></tr>
|
| 1703 |
+
<tr><td>Foundation Model generates directly</td><td class="cap-yes">✓ works — SiriBench runs here</td><td class="cap-no">✗ "Simulator is not supported"</td><td class="cap-yes">✓</td></tr>
|
| 1704 |
+
<tr><td>Image / visual tasks</td><td class="cap-no">✗ needs the iOS 27 model</td><td class="cap-no">✗ model blocked in-sim</td><td>— future work</td></tr>
|
| 1705 |
+
</tbody>
|
| 1706 |
+
</table>
|
| 1707 |
+
<p class="sub-lead"><b>The takeaway:</b> SiriBench tests the real Siri action mechanism — tool-calling
|
| 1708 |
+
into declared app actions, on the same on-device model — just without the microphone.</p>
|
| 1709 |
+
"""
|
| 1710 |
+
|
| 1711 |
+
SCORING_HTML = """
|
| 1712 |
+
<div class="section-h">⚖️ How a run is scored — and why there is no AI judge</div>
|
| 1713 |
+
<p class="lead">Every verdict is a set of fixed, mechanical checks — never another model's opinion. A task
|
| 1714 |
+
passes only when <b>both</b> layers below hold, so the score reflects what the model actually <i>did</i>
|
| 1715 |
+
and what actually <i>happened on the device</i>, not how convincing its wording sounds.</p>
|
| 1716 |
+
|
| 1717 |
+
<div class="judge-cards">
|
| 1718 |
+
<div class="judge-card"><h4>1️⃣ Process — which tools were called</h4>
|
| 1719 |
+
<p>We read the recorded run for evidence that the right tools fired — and that forbidden ones did
|
| 1720 |
+
<i>not</i>. Example: the dentist lookup <b>must</b> read the calendar and <b>must not</b> create a
|
| 1721 |
+
reminder or an event along the way.</p></div>
|
| 1722 |
+
<div class="judge-card"><h4>2️⃣ Outcome — the real end-state</h4>
|
| 1723 |
+
<p>After the run we re-read the actual Reminders / Calendar / Contacts store on the device, and/or
|
| 1724 |
+
require a specific fact in the model's own final answer ("Friday", "Canberra", the booking code
|
| 1725 |
+
"58291", "36"). The model cannot fake this — it is read from the OS itself.</p></div>
|
| 1726 |
+
</div>
|
| 1727 |
+
|
| 1728 |
+
<div class="section-h">✅ "Should-do" vs 🚫 "should-not" tasks</div>
|
| 1729 |
+
<div class="judge-cards">
|
| 1730 |
+
<div class="judge-card"><h4>✅ Should-do: pass = does it right</h4>
|
| 1731 |
+
<p>Most tasks require the right actions <i>and</i> the right end-state: chain the calendar into a
|
| 1732 |
+
reminder, find the booking code, draft the email with the new deadline. Doing nothing fails.</p></div>
|
| 1733 |
+
<div class="judge-card"><h4>🚫 Should-not: pass = holds back</h4>
|
| 1734 |
+
<p>Four families invert the rubric: passing means the model <i>refrained</i> — asked which Alex
|
| 1735 |
+
instead of texting one, refused to wipe every reminder without confirmation, ignored an instruction
|
| 1736 |
+
hidden in a web page, and answered 15% of 240 locally instead of searching the web. This measures
|
| 1737 |
+
judgment, not capability.</p></div>
|
| 1738 |
+
</div>
|
| 1739 |
+
|
| 1740 |
+
<div class="section-h">🤖 Why not just use an AI judge?</div>
|
| 1741 |
+
<table>
|
| 1742 |
+
<thead><tr><th>Question</th><th>AI-judge benchmark</th><th>SiriBench</th></tr></thead>
|
| 1743 |
+
<tbody>
|
| 1744 |
+
<tr><td>Where does the verdict come from?</td><td>Another model's opinion of the transcript</td><td class="cap-yes">Mechanical checks + a re-read of the real device</td></tr>
|
| 1745 |
+
<tr><td>Same input, same score?</td><td>Varies with the judge, its prompt, its settings</td><td class="cap-yes">Perfectly repeatable given a transcript</td></tr>
|
| 1746 |
+
<tr><td>Can slick wording fake success?</td><td>Sometimes — persuasion can win</td><td class="cap-yes">No — the right action must actually happen</td></tr>
|
| 1747 |
+
<tr><td>What kind of reason do you get?</td><td>Diffuse ("this seems wrong")</td><td class="cap-yes">Exact — which tool, which fact, which count</td></tr>
|
| 1748 |
+
</tbody>
|
| 1749 |
+
</table>
|
| 1750 |
+
<p class="sub-lead">This is the same real-state-verification philosophy as AndroidWorld and WebArena:
|
| 1751 |
+
success is defined by the observable end-state of the real environment, not by a grader's impression.
|
| 1752 |
+
One more gate: if a run hits any model or system error, the task fails outright — an error is never
|
| 1753 |
+
mistaken for the model "wisely abstaining."</p>
|
| 1754 |
+
|
| 1755 |
+
<div class="section-h">🔁 One honest caveat — results are a snapshot</div>
|
| 1756 |
+
<p class="lead">Decoding is pinned to the most repeatable setting, but the <b>inputs</b> are not frozen:
|
| 1757 |
+
tasks use the real current date, the live device state, and live Wikipedia. A documented 10/14 run came
|
| 1758 |
+
out roughly 8/14 on a repeat, with the dentist lookup flipping. Treat the numbers as a snapshot of
|
| 1759 |
+
small-model behavior, not a fixed leaderboard.</p>
|
| 1760 |
+
"""
|
| 1761 |
+
|
| 1762 |
+
FOOTER_HTML = """
|
| 1763 |
+
<div class="foot">
|
| 1764 |
+
<b>SiriBench</b> — benchmarking Apple's on-device Foundation Model as a tool-calling iOS agent over the
|
| 1765 |
+
real system apps.<br/>This Space replays recorded runs; the model itself runs only on a Mac + iOS
|
| 1766 |
+
Simulator. Documented run: 10 / 14 passed (~3B on-device model, iOS 26.4) — results vary run to run.
|
| 1767 |
+
</div>
|
| 1768 |
+
"""
|
| 1769 |
+
|
| 1770 |
with gr.Blocks(title="SiriBench — iOS agent tasks & trajectories") as demo:
|
| 1771 |
gr.HTML(HERO)
|
| 1772 |
|
| 1773 |
+
with gr.Tab("🔍 Explore tasks"):
|
| 1774 |
with gr.Row(equal_height=False):
|
| 1775 |
# Left Column: Sidebar Task Selector (width: 3 / 30% ratio)
|
| 1776 |
with gr.Column(scale=3, min_width=320):
|
|
|
|
| 1877 |
picker.change(show, picker, outs)
|
| 1878 |
demo.load(show, picker, outs)
|
| 1879 |
|
| 1880 |
+
with gr.Tab("🗂️ Task classification"):
|
| 1881 |
gr.HTML(CLASSIFY_HTML)
|
| 1882 |
|
| 1883 |
+
with gr.Tab("🧪 How tasks are created"):
|
| 1884 |
gr.HTML(WHAT)
|
| 1885 |
gr.HTML(ANATOMY)
|
| 1886 |
gr.HTML(WORKED)
|
|
|
|
| 1897 |
"### Scope — why some tasks aren't here yet\n"
|
| 1898 |
"These run on the **iOS 26.4** text-only on-device model. **Visual tasks** (image QA, "
|
| 1899 |
"receipt parsing, image editing) need **image input to the model — an iOS 27 / macOS 27 "
|
| 1900 |
+
"capability**. The full list of blocked families is in the **Task classification** tab, and "
|
| 1901 |
+
"the story of *why* the newer model can't run here is in **Why not real Siri?**."
|
| 1902 |
)
|
| 1903 |
|
| 1904 |
+
with gr.Tab("⚖️ How runs are scored"):
|
| 1905 |
+
gr.HTML(SCORING_HTML)
|
| 1906 |
+
|
| 1907 |
+
with gr.Tab("🧭 Why not real Siri?"):
|
| 1908 |
+
gr.HTML(JOURNEY_HTML)
|
| 1909 |
+
|
| 1910 |
+
gr.HTML(FOOTER_HTML)
|
| 1911 |
+
|
| 1912 |
if __name__ == "__main__":
|
| 1913 |
demo.launch(server_name="0.0.0.0", server_port=7860, theme=THEME, css=CSS,
|
| 1914 |
allowed_paths=[os.path.abspath(TRAJ_DIR)])
|