Skip to content

Commit 9c9beba

Browse files
abossardCopilot
andcommitted
Replace display(HTML()) with native print/display in all notebooks
No more inline HTML in code cells. Use print() with emoji formatting, pandas DataFrames, and display(Markdown()) for the finale only. 15 cells rewritten across 7 notebooks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2de56ef commit 9c9beba

7 files changed

Lines changed: 117 additions & 312 deletions

notebooks/00_introduction.ipynb

Lines changed: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -58,57 +58,45 @@
5858
"text/html": [
5959
"\n",
6060
" <div style=\"margin:16px 0\">\n",
61-
" <div style=\"font-weight:bold; font-size:1.1em; margin-bottom:8px; color:#323130\">Dein Lernpfad</div>\n",
61+
" <div style=\"font-weight:bold; font-size:1.1em; margin-bottom:8px; color:#323130\">Dein Lernpfad (+ 2 optionale Appendix-Notebooks)</div>\n",
6262
" <div style=\"display:flex; flex-direction:row; align-items:center;\n",
6363
" flex-wrap:wrap; gap:4px; padding:12px; background:#fafafa;\n",
6464
" border-radius:12px; border:1px solid #edebe9\">\n",
6565
" \n",
6666
" <div style=\"background:#0078d418; border:2px solid #0078d4; border-radius:8px;\n",
6767
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
6868
" <div style=\"font-size:1.3em\">🚀</div>\n",
69-
" <div style=\"font-weight:bold; color:#323130\">Einführung</div>\n",
69+
" <div style=\"font-weight:bold; color:#323130\">00 Einführung</div>\n",
7070
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Setup + erster Aufruf</div>\n",
7171
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
7272
" <div style=\"background:#0078d418; border:2px solid #0078d4; border-radius:8px;\n",
7373
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
74-
" <div style=\"font-size:1.3em\">📊</div>\n",
75-
" <div style=\"font-weight:bold; color:#323130\">Trennung</div>\n",
76-
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Data / Calc / Actions</div>\n",
77-
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
78-
" <div style=\"background:#0078d418; border:2px solid #0078d4; border-radius:8px;\n",
79-
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
80-
" <div style=\"font-size:1.3em\">🏛️</div>\n",
81-
" <div style=\"font-weight:bold; color:#323130\">Modultiefe</div>\n",
82-
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Predict → CoT → ReAct</div>\n",
83-
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
84-
" <div style=\"background:#ca501018; border:2px solid #ca5010; border-radius:8px;\n",
85-
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
8674
" <div style=\"font-size:1.3em\">📐</div>\n",
87-
" <div style=\"font-weight:bold; color:#323130\">Evaluation</div>\n",
88-
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Metriken = Software</div>\n",
75+
" <div style=\"font-weight:bold; color:#323130\">01 Evaluation</div>\n",
76+
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Metriken + Accuracy</div>\n",
8977
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
9078
" <div style=\"background:#ca501018; border:2px solid #ca5010; border-radius:8px;\n",
9179
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
9280
" <div style=\"font-size:1.3em\">⚙️</div>\n",
93-
" <div style=\"font-weight:bold; color:#323130\">Optimierung</div>\n",
94-
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Prompts kompilieren</div>\n",
81+
" <div style=\"font-weight:bold; color:#323130\">02 Optimierung</div>\n",
82+
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Manuell vs. automatisch</div>\n",
9583
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
96-
" <div style=\"background:#107c1018; border:2px solid #107c10; border-radius:8px;\n",
84+
" <div style=\"background:#ca501018; border:2px solid #ca5010; border-radius:8px;\n",
9785
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
9886
" <div style=\"font-size:1.3em\">🏰</div>\n",
99-
" <div style=\"font-weight:bold; color:#323130\">Domain-Daten</div>\n",
87+
" <div style=\"font-weight:bold; color:#323130\">03 Domain-Daten</div>\n",
10088
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Dein Burggraben</div>\n",
10189
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
10290
" <div style=\"background:#107c1018; border:2px solid #107c10; border-radius:8px;\n",
10391
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
10492
" <div style=\"font-size:1.3em\">🤖</div>\n",
105-
" <div style=\"font-weight:bold; color:#323130\">Agenten</div>\n",
93+
" <div style=\"font-weight:bold; color:#323130\">04 Agenten</div>\n",
10694
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Tool-Nutzung</div>\n",
10795
" </div><div style=\"font-size:1.5em; color:#8a8886; padding:0 8px; align-self:center\">→</div>\n",
10896
" <div style=\"background:#107c1018; border:2px solid #107c10; border-radius:8px;\n",
10997
" padding:12px 16px; min-width:120px; text-align:center; flex-shrink:0\">\n",
11098
" <div style=\"font-size:1.3em\">🎯</div>\n",
111-
" <div style=\"font-weight:bold; color:#323130\">Gesamtbild</div>\n",
99+
" <div style=\"font-weight:bold; color:#323130\">05 Gesamtbild</div>\n",
112100
" <div style=\"font-size:0.8em;color:#605e5c;margin-top:2px\">Showdown + Quiz</div>\n",
113101
" </div>\n",
114102
" </div>\n",
@@ -146,13 +134,13 @@
146134
},
147135
{
148136
"cell_type": "code",
149-
"execution_count": 3,
137+
"execution_count": 4,
150138
"metadata": {},
151139
"outputs": [
152140
{
153141
"data": {
154142
"application/vnd.jupyter.widget-view+json": {
155-
"model_id": "77e2160fc4c447a3b930b1f4db075a09",
143+
"model_id": "98077833eaa643ff8aa80df562c72aea",
156144
"version_major": 2,
157145
"version_minor": 0
158146
},
@@ -187,17 +175,9 @@
187175
},
188176
{
189177
"cell_type": "code",
190-
"execution_count": 7,
178+
"execution_count": null,
191179
"metadata": {},
192-
"outputs": [
193-
{
194-
"name": "stdout",
195-
"output_type": "stream",
196-
"text": [
197-
"Sentiment: positive\n"
198-
]
199-
}
200-
],
180+
"outputs": [],
201181
"source": [
202182
"from dspy_tasks.data import ClassifySentiment\n",
203183
"from dspy_tasks.config import configure_dspy\n",
@@ -210,8 +190,7 @@
210190
"\n",
211191
"# Try it\n",
212192
"result = classifier(review=\"This laptop is absolutely fantastic! Best purchase I've made all year.\")\n",
213-
"from IPython.display import display, HTML\n",
214-
"display(HTML(f'<div style=\"font-size:1.2em; padding:12px; background:#f3f2f1; border-radius:8px; margin:8px 0\">' f'<b>Sentiment:</b> <span style=\"color:#0078d4; font-weight:bold\">{result.sentiment}</span></div>'))"
193+
"print(f\"🎯 Sentiment: {result.sentiment}\")"
215194
]
216195
},
217196
{
@@ -530,4 +509,4 @@
530509
},
531510
"nbformat": 4,
532511
"nbformat_minor": 4
533-
}
512+
}

notebooks/01_evaluation.ipynb

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -77,37 +77,27 @@
7777
"outputs": [],
7878
"source": [
7979
"# Metriken werden immer raffinierter\n",
80-
"from IPython.display import display, HTML\n",
8180
"from dspy_tasks.calculations import token_f1\n",
8281
"\n",
8382
"f1_val = token_f1([\"apple\", \"banana\"], [\"apple\", \"cherry\"])\n",
8483
"\n",
85-
"display(HTML(f\"\"\"\n",
86-
"<div style=\"margin:8px 0\">\n",
87-
"<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #107c10\">\n",
88-
"<b style=\"font-size:1.05em\">Level 1: Exact Match</b>\n",
89-
"<div style=\"margin-top:6px; font-family:monospace; font-size:0.95em\">\n",
90-
" &lsquo;positive&rsquo; == &lsquo;positive&rsquo; &rarr; <span style='color:#107c10; font-weight:bold'>1.0</span><br>\n",
91-
" &lsquo;positive&rsquo; == &lsquo;POSITIVE&rsquo; &rarr; <span style='color:#107c10; font-weight:bold'>1.0</span> <span style='color:#605e5c'>(normalized)</span><br>\n",
92-
" &lsquo;positive&rsquo; == &lsquo;negative&rsquo; &rarr; <span style='color:#d13438; font-weight:bold'>0.0</span>\n",
93-
"</div></div>\n",
94-
"<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #0078d4\">\n",
95-
"<b style=\"font-size:1.05em\">Level 2: Token F1</b>\n",
96-
"<div style=\"margin-top:6px; font-family:monospace; font-size:0.95em\">\n",
97-
" gold=[&lsquo;apple&rsquo;, &lsquo;banana&rsquo;], pred=[&lsquo;apple&rsquo;, &lsquo;cherry&rsquo;] &rarr; <span style='color:#0078d4; font-weight:bold'>{f1_val:.3f}</span>\n",
98-
"</div></div>\n",
99-
"<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; border-left:4px solid #8764b8\">\n",
100-
"<b style=\"font-size:1.05em\">Level 3: Composite (Ticket Routing)</b>\n",
101-
"<div style=\"margin-top:6px; font-size:0.95em\">\n",
102-
" Priority korrekt (<b>40%</b>) + Kategorie korrekt (<b>35%</b>) + Team korrekt (<b>25%</b>)<br>\n",
103-
" = Gewichtete Spezifikation von &ldquo;was am wichtigsten ist&rdquo;\n",
104-
"</div></div></div>\n",
105-
"\"\"\"))\n",
84+
"print(\"\" * 50)\n",
85+
"print(\"📏 Level 1: Exact Match\")\n",
86+
"print(f\" 'positive' == 'positive' → 1.0 ✅\")\n",
87+
"print(f\" 'positive' == 'POSITIVE' → 1.0 ✅ (normalized)\")\n",
88+
"print(f\" 'positive' == 'negative' → 0.0 ❌\")\n",
89+
"print()\n",
90+
"print(\"📏 Level 2: Token F1 (Partial Credit)\")\n",
91+
"print(f\" gold=['apple','banana'], pred=['apple','cherry'] → {f1_val:.3f}\")\n",
92+
"print()\n",
93+
"print(\"📏 Level 3: Composite (Ticket Routing)\")\n",
94+
"print(\" Priority korrekt (40%) + Kategorie korrekt (35%) + Team korrekt (25%)\")\n",
95+
"print(\" = Gewichtete Spezifikation von 'was am wichtigsten ist'\")\n",
10696
"\n",
10797
"display_insight(\"Der Kern-Insight\",\n",
10898
" \"Deine Metrik-Funktion IST deine Produkt-Spezifikation. \"\n",
10999
" \"Wenn du die Gewichte änderst, änderst du, wofür das System optimiert. \"\n",
110-
" \"Deshalb ist Evaluation die Software der Zukunft.\")\n"
100+
" \"Deshalb ist Evaluation die Software der Zukunft.\")"
111101
]
112102
},
113103
{
@@ -117,16 +107,12 @@
117107
"outputs": [],
118108
"source": [
119109
"from dspy_tasks.config import configure_dspy\n",
120-
"from IPython.display import display, HTML\n",
110+
"\n",
121111
"# Code Generation task — different metric than simple matching\n",
122112
"task = get_task(\"code_generation\")\n",
123-
"display(HTML(\n",
124-
" f'<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin:8px 0\">'\n",
125-
" f'<div style=\"font-size:1.1em\"><b>Task:</b> {task.name}</div>'\n",
126-
" f'<div style=\"margin-top:4px\"><b>Metric:</b> <code>code_execution_proxy</code> '\n",
127-
" f'<span style=\"color:#605e5c\">(checks structure, keywords, overlap)</span></div>'\n",
128-
" f'<div style=\"margin-top:4px\"><b>Teaching point:</b> {task.teaching_point}</div></div>'\n",
129-
"))\n",
113+
"print(f\"📋 Task: {task.name}\")\n",
114+
"print(f\" Metric: code_execution_proxy (checks structure, keywords, overlap)\")\n",
115+
"print(f\" Teaching point: {task.teaching_point}\")\n",
130116
"\n",
131117
"btn = run_button(\"Evaluate Code Generation\")\n",
132118
"out = widgets.Output()\n",
@@ -319,4 +305,4 @@
319305
},
320306
"nbformat": 4,
321307
"nbformat_minor": 4
322-
}
308+
}

notebooks/03_domain_tuning.ipynb

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,14 @@
2626
"source": [
2727
"import sys; sys.path.insert(0, \".\")\n",
2828
"import dspy, pandas as pd, ipywidgets as widgets\n",
29-
"from IPython.display import display, HTML\n",
3029
"from dspy_tasks.tasks import get_task\n",
3130
"from dspy_tasks.actions import run_baseline, run_optimization, compare_models\n",
3231
"from dspy_tasks.visualize import *\n",
3332
"\n",
3433
"# Show the real ticket data\n",
3534
"df = pd.read_csv(\"../csv/data.csv\", encoding=\"latin-1\")\n",
36-
"display(HTML(\n",
37-
" f'<div style=\"font-size:1.1em; padding:12px; background:#f3f2f1; border-radius:8px; margin:8px 0\">'\n",
38-
" f'<b>📊 Real ticket data:</b> <span style=\"color:#0078d4; font-weight:bold\">{len(df)}</span> tickets<br>'\n",
39-
" f'<span style=\"color:#605e5c; font-size:0.9em\">Columns: {\", \".join(df.columns[:10])}...</span></div>'\n",
40-
"))\n",
41-
"df[[\"Summary*\", \"Priority*\", \"Status*\", \"Assigned Group*+\"]].head(5)"
35+
"print(f\"📊 Echte Ticket-Daten: {len(df)} Tickets\")\n",
36+
"display(df[[\"Summary*\", \"Priority*\", \"Status*\", \"Assigned Group*+\"]].head(5))"
4237
]
4338
},
4439
{
@@ -49,22 +44,12 @@
4944
"source": [
5045
"task = get_task(\"ticket_routing\")\n",
5146
"examples = task.load_examples()\n",
52-
"from IPython.display import display, HTML\n",
5347
"\n",
54-
"rows = \"\"\n",
48+
"print(f\"Trainingsdaten: {len(examples)} Ticket-Beispiele\\n\")\n",
5549
"for ex in examples[:3]:\n",
56-
" rows += (\n",
57-
" f'<div style=\"padding:8px 0; border-bottom:1px solid #edebe9\">'\n",
58-
" f'<div style=\"color:#605e5c; font-size:0.9em\">{str(ex.summary)[:80]}...</div>'\n",
59-
" f'<div style=\"margin-top:4px\">→ <b>Category:</b> {ex.category} | '\n",
60-
" f'<b>Priority:</b> {ex.priority} | <b>Team:</b> {ex.assigned_group}</div></div>'\n",
61-
" )\n",
62-
"display(HTML(\n",
63-
" f'<div style=\"margin:8px 0\">'\n",
64-
" f'<div style=\"font-size:1.1em; padding-bottom:8px\"><b>Training data:</b> '\n",
65-
" f'<span style=\"color:#0078d4; font-weight:bold\">{len(examples)}</span> ticket examples</div>'\n",
66-
" f'{rows}</div>'\n",
67-
"))"
50+
" print(f\" 📋 {str(ex.summary)[:80]}...\")\n",
51+
" print(f\" → Kategorie: {ex.category} | Priorität: {ex.priority} | Team: {ex.assigned_group}\")\n",
52+
" print()"
6853
]
6954
},
7055
{
@@ -220,4 +205,4 @@
220205
},
221206
"nbformat": 4,
222207
"nbformat_minor": 4
223-
}
208+
}

notebooks/04_agents.ipynb

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,15 @@
2121
"source": [
2222
"import sys; sys.path.insert(0, \".\")\n",
2323
"import dspy, ipywidgets as widgets\n",
24-
"from IPython.display import display, HTML\n",
2524
"from dspy_tasks.tasks import get_task, list_by_tier\n",
2625
"from dspy_tasks.tools import TOOL_REGISTRY, calculate, search_tickets, get_ticket_stats\n",
2726
"from dspy_tasks.actions import run_baseline, run_optimization\n",
2827
"from dspy_tasks.visualize import diagram, diagram_compare, display_score, display_results_table, display_improvement, display_prompt_diff, display_insight, model_picker, run_button, optimizer_picker\n",
2928
"\n",
30-
"rows = \"\"\n",
29+
"print(\"🔧 Verfügbare Tools:\\n\")\n",
3130
"for name, fn in TOOL_REGISTRY.items():\n",
32-
" doc = fn.__doc__.strip().split(chr(10))[0] if fn.__doc__ else \"\"\n",
33-
" rows += f'<tr><td style=\"padding:6px 12px; border-bottom:1px solid #edebe9; font-family:monospace; color:#0078d4; font-weight:bold\">{name}</td>' f'<td style=\"padding:6px 12px; border-bottom:1px solid #edebe9; color:#323130\">{doc}</td></tr>'\n",
34-
"display(HTML(\n",
35-
" f'<div style=\"margin:8px 0\"><div style=\"font-size:1.15em; font-weight:bold; padding-bottom:8px\">🔧 Available Tools:</div>'\n",
36-
" f'<table style=\"border-collapse:collapse; width:100%\">{rows}</table></div>'\n",
37-
"))"
31+
" doc = fn.__doc__.strip().split('\\n')[0] if fn.__doc__ else \"No description\"\n",
32+
" print(f\" • {name}: {doc}\")"
3833
]
3934
},
4035
{
@@ -67,24 +62,18 @@
6762
"outputs": [],
6863
"source": [
6964
"# Tools are just Python functions — try them!\n",
70-
"from IPython.display import display, HTML\n",
71-
"\n",
7265
"calc_result = calculate(\"(45 * 3) + 17\")\n",
7366
"search_result = search_tickets(\"network\")\n",
7467
"stats_result = get_ticket_stats(\"priority\")\n",
7568
"\n",
76-
"display(HTML(\n",
77-
" '<div style=\"margin:8px 0\">'\n",
78-
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #0078d4\">'\n",
79-
" f'<div style=\"font-weight:bold; font-family:monospace\">calculate('(45 * 3) + 17')</div>'\n",
80-
" f'<div style=\"margin-top:4px; color:#323130\">{calc_result}</div></div>'\n",
81-
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #107c10\">'\n",
82-
" f'<div style=\"font-weight:bold; font-family:monospace\">search_tickets('network')</div>'\n",
83-
" f'<pre style=\"margin-top:4px; color:#323130; white-space:pre-wrap; font-size:0.85em\">{search_result}</pre></div>'\n",
84-
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; border-left:4px solid #8764b8\">'\n",
85-
" f'<div style=\"font-weight:bold; font-family:monospace\">get_ticket_stats('priority')</div>'\n",
86-
" f'<pre style=\"margin-top:4px; color:#323130; white-space:pre-wrap; font-size:0.85em\">{stats_result}</pre></div></div>'\n",
87-
"))"
69+
"print(\"🧮 calculate('(45 * 3) + 17'):\")\n",
70+
"print(f\" → {calc_result}\")\n",
71+
"print()\n",
72+
"print(\"🔍 search_tickets('network'):\")\n",
73+
"print(f\" → {search_result}\")\n",
74+
"print()\n",
75+
"print(\"📊 get_ticket_stats('priority'):\")\n",
76+
"print(f\" → {stats_result}\")"
8877
]
8978
},
9079
{
@@ -236,4 +225,4 @@
236225
},
237226
"nbformat": 4,
238227
"nbformat_minor": 4
239-
}
228+
}

notebooks/05_full_picture.ipynb

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"source": [
2424
"import sys; sys.path.insert(0, \".\")\n",
2525
"import dspy, ipywidgets as widgets\n",
26-
"from IPython.display import display, HTML\n",
2726
"from dspy_tasks.tasks import get_task, list_tasks, list_by_tier, TASK_REGISTRY\n",
2827
"from dspy_tasks.actions import run_baseline, run_optimization, compare_models\n",
2928
"from dspy_tasks.visualize import *\n",
@@ -197,24 +196,22 @@
197196
"metadata": {},
198197
"outputs": [],
199198
"source": [
200-
"display(HTML('''\n",
201-
"<div style=\"background: linear-gradient(135deg, #0078d4, #005a9e); \n",
202-
" color: white; padding: 32px; border-radius: 12px; margin: 20px 0; text-align: center\">\n",
203-
" <h1 style=\"color: white; margin-bottom: 16px\">🎯 Die Pointe</h1>\n",
204-
" <p style=\"font-size: 1.3em; margin: 8px 0\">\n",
205-
" <b>Evaluation</b> ist die Spezifikation.\n",
206-
" </p>\n",
207-
" <p style=\"font-size: 1.3em; margin: 8px 0\">\n",
208-
" <b>Optimierung</b> ist der Compiler.\n",
209-
" </p>\n",
210-
" <p style=\"font-size: 1.3em; margin: 8px 0\">\n",
211-
" <b>Daten</b> sind der Quellcode.\n",
212-
" </p>\n",
213-
" <p style=\"font-size: 1.1em; margin-top: 20px; opacity: 0.9\">\n",
214-
" Willkommen bei Software 3.0.\n",
215-
" </p>\n",
216-
"</div>\n",
217-
"'''))"
199+
"from IPython.display import display, Markdown\n",
200+
"\n",
201+
"display(Markdown(\"\"\"\n",
202+
"---\n",
203+
"## 🎯 Die Pointe\n",
204+
"\n",
205+
"> **Evaluation** ist die Spezifikation.\n",
206+
">\n",
207+
"> **Optimierung** ist der Compiler.\n",
208+
">\n",
209+
"> **Daten** sind der Quellcode.\n",
210+
"\n",
211+
"*Willkommen bei Software 3.0.*\n",
212+
"\n",
213+
"---\n",
214+
"\"\"\"))"
218215
]
219216
},
220217
{
@@ -358,4 +355,4 @@
358355
},
359356
"nbformat": 4,
360357
"nbformat_minor": 4
361-
}
358+
}

0 commit comments

Comments
 (0)