naman-cen commited on
Commit
4331eec
·
verified ·
1 Parent(s): 3b0367f

Whole-space polish: hero chips + tab guide, new 'How runs are scored' and 'Why not real Siri?' tabs, emoji tab labels, footer

Browse files
Files changed (1) hide show
  1. app.py +172 -8
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">Accuracy Rate</div>
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.</div>
 
 
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** and unblock once the host Mac is on macOS 27."
 
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)])