Jules commited on
Commit
37e02cb
·
1 Parent(s): afe1607

Final integration of Artificial Societies features and multi-tab UI

Browse files
Files changed (2) hide show
  1. app.py +163 -20
  2. local_app_2.log +227 -0
app.py CHANGED
@@ -2,8 +2,12 @@ import sys
2
  import os
3
  import gradio as gr
4
  import json
 
5
  from tinytroupe.factory import TinyPersonFactory
6
- from api.main import app
 
 
 
7
  import uvicorn
8
 
9
  # --- CHANGE 1: The function now accepts an optional API key. ---
@@ -40,28 +44,167 @@ def generate_personas(business_description, customer_profile, num_personas, blab
40
  else:
41
  os.environ["BLABLADOR_API_KEY"] = original_key
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
  with gr.Blocks() as demo:
45
- gr.Markdown("<h1>Tiny Persona Generator</h1>")
46
- with gr.Row():
47
- with gr.Column():
48
- business_description_input = gr.Textbox(label="What is your business about?", lines=5)
49
- customer_profile_input = gr.Textbox(label="Information about your customer profile", lines=5)
50
- num_personas_input = gr.Number(label="Number of personas to generate", value=1, minimum=1, step=1)
51
- blablador_api_key_input = gr.Textbox(
52
- label="Blablador API Key (for API client use)",
53
- visible=False
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  )
55
- generate_button = gr.Button("Generate Personas")
56
- with gr.Column():
57
- output_json = gr.JSON(label="Generated Personas")
58
-
59
- generate_button.click(
60
- fn=generate_personas,
61
- inputs=[business_description_input, customer_profile_input, num_personas_input, blablador_api_key_input],
62
- outputs=output_json,
63
- api_name="generate_personas"
64
- )
65
 
66
  # Mount Gradio app to FastAPI app imported from api.main
67
  app = gr.mount_gradio_app(app, demo, path="/")
 
2
  import os
3
  import gradio as gr
4
  import json
5
+ import random
6
  from tinytroupe.factory import TinyPersonFactory
7
+ from tinytroupe.simulation_manager import SimulationConfig
8
+ from tinytroupe.content_generation import ContentVariantGenerator
9
+ from tinytroupe.agent_types import Content
10
+ from api.main import app, simulation_manager
11
  import uvicorn
12
 
13
  # --- CHANGE 1: The function now accepts an optional API key. ---
 
44
  else:
45
  os.environ["BLABLADOR_API_KEY"] = original_key
46
 
47
+ def create_simulation_ui(name, persona_count, network_type):
48
+ try:
49
+ config = SimulationConfig(name=name, persona_count=int(persona_count), network_type=network_type)
50
+ sim = simulation_manager.create_simulation(config)
51
+ return {"status": "Simulation created", "id": sim.id, "persona_count": len(sim.personas)}
52
+ except Exception as e:
53
+ return {"error": str(e)}
54
+
55
+ def run_simulation_ui(simulation_id, content_text):
56
+ try:
57
+ if simulation_id not in simulation_manager.simulations:
58
+ return {"error": "Simulation not found"}
59
+ result = simulation_manager.run_simulation(simulation_id, content_text)
60
+ return {
61
+ "simulation_id": simulation_id,
62
+ "total_reach": result.total_reach,
63
+ "engagements": result.engagements
64
+ }
65
+ except Exception as e:
66
+ return {"error": str(e)}
67
+
68
+ def predict_engagement_ui(persona_name, content_text, simulation_id):
69
+ try:
70
+ if simulation_id not in simulation_manager.simulations:
71
+ return {"error": "Simulation not found"}
72
+ sim = simulation_manager.simulations[simulation_id]
73
+ persona = next((p for p in sim.personas if p.name == persona_name), None)
74
+ if not persona:
75
+ return {"error": "Persona not found"}
76
+
77
+ content_obj = Content(text=content_text, content_type="post", topics=[], length=len(content_text), tone="")
78
+ prob = sim.world._simulate_engagement_decision(persona, content_obj, 0)
79
+ return {
80
+ "persona": persona_name,
81
+ "will_engage": prob.engaged,
82
+ "probability": prob.probability,
83
+ "comment": prob.comment
84
+ }
85
+ except Exception as e:
86
+ return {"error": str(e)}
87
+
88
+ def generate_variants_ui(original_content, num_variants):
89
+ try:
90
+ variants = simulation_manager.variant_generator.generate_variants(original_content, int(num_variants))
91
+ return [v.__dict__ for v in variants]
92
+ except Exception as e:
93
+ return {"error": str(e)}
94
+
95
+ def get_metrics_ui(simulation_id):
96
+ try:
97
+ if simulation_id not in simulation_manager.simulations:
98
+ return {"error": "Simulation not found"}
99
+ sim = simulation_manager.simulations[simulation_id]
100
+ from tinytroupe.network_analysis import NetworkAnalyzer
101
+ metrics = NetworkAnalyzer.calculate_centrality_metrics(sim.network)
102
+ influencers = NetworkAnalyzer.identify_key_influencers(sim.network)
103
+ return {
104
+ "density": NetworkAnalyzer.calculate_density(sim.network),
105
+ "key_influencers": influencers,
106
+ "centrality_metrics": metrics
107
+ }
108
+ except Exception as e:
109
+ return {"error": str(e)}
110
+
111
 
112
  with gr.Blocks() as demo:
113
+ gr.Markdown("<h1>Tiny Factory & Artificial Societies</h1>")
114
+
115
+ with gr.Tabs():
116
+ with gr.Tab("Persona Generation"):
117
+ with gr.Row():
118
+ with gr.Column():
119
+ business_description_input = gr.Textbox(label="What is your business about?", lines=5)
120
+ customer_profile_input = gr.Textbox(label="Information about your customer profile", lines=5)
121
+ num_personas_gen_input = gr.Number(label="Number of personas to generate", value=1, minimum=1, step=1)
122
+ blablador_api_key_input = gr.Textbox(label="Blablador API Key (for API client use)", visible=False)
123
+ generate_personas_button = gr.Button("Generate Personas")
124
+ with gr.Column():
125
+ gen_personas_output = gr.JSON(label="Generated Personas")
126
+
127
+ generate_personas_button.click(
128
+ fn=generate_personas,
129
+ inputs=[business_description_input, customer_profile_input, num_personas_gen_input, blablador_api_key_input],
130
+ outputs=gen_personas_output,
131
+ api_name="generate_personas"
132
+ )
133
+
134
+ with gr.Tab("Social Simulation"):
135
+ with gr.Row():
136
+ with gr.Column():
137
+ sim_name_input = gr.Textbox(label="Simulation Name", value="My Social Simulation")
138
+ sim_persona_count = gr.Number(label="Number of Personas", value=10, minimum=1, step=1)
139
+ sim_network_type = gr.Dropdown(label="Network Type", choices=["scale_free", "professional"], value="scale_free")
140
+ create_sim_button = gr.Button("Create Simulation")
141
+
142
+ sim_content_input = gr.Textbox(label="Content to Test", lines=3)
143
+ sim_id_run_input = gr.Textbox(label="Simulation ID (to run)")
144
+ run_sim_button = gr.Button("Run Content Spread Simulation")
145
+ with gr.Column():
146
+ sim_output = gr.JSON(label="Simulation Status/Results")
147
+
148
+ create_sim_button.click(
149
+ fn=create_simulation_ui,
150
+ inputs=[sim_name_input, sim_persona_count, sim_network_type],
151
+ outputs=sim_output,
152
+ api_name="create_simulation"
153
+ )
154
+ run_sim_button.click(
155
+ fn=run_simulation_ui,
156
+ inputs=[sim_id_run_input, sim_content_input],
157
+ outputs=sim_output,
158
+ api_name="run_simulation"
159
+ )
160
+
161
+ with gr.Tab("Engagement Prediction"):
162
+ with gr.Row():
163
+ with gr.Column():
164
+ pred_persona_name = gr.Textbox(label="Persona Name")
165
+ pred_content = gr.Textbox(label="Content Text", lines=3)
166
+ pred_sim_id = gr.Textbox(label="Simulation ID")
167
+ predict_button = gr.Button("Predict Engagement")
168
+ with gr.Column():
169
+ pred_output = gr.JSON(label="Prediction Result")
170
+
171
+ predict_button.click(
172
+ fn=predict_engagement_ui,
173
+ inputs=[pred_persona_name, pred_content, pred_sim_id],
174
+ outputs=pred_output,
175
+ api_name="predict_engagement"
176
+ )
177
+
178
+ with gr.Tab("Content Engine"):
179
+ with gr.Row():
180
+ with gr.Column():
181
+ cont_original = gr.Textbox(label="Original Content", lines=5)
182
+ cont_num_variants = gr.Number(label="Number of Variants", value=5, minimum=1)
183
+ generate_variants_button = gr.Button("Generate Variants")
184
+ with gr.Column():
185
+ cont_output = gr.JSON(label="Content Variants")
186
+
187
+ generate_variants_button.click(
188
+ fn=generate_variants_ui,
189
+ inputs=[cont_original, cont_num_variants],
190
+ outputs=cont_output,
191
+ api_name="generate_content_variants"
192
+ )
193
+
194
+ with gr.Tab("Network Analytics"):
195
+ with gr.Row():
196
+ with gr.Column():
197
+ metrics_sim_id = gr.Textbox(label="Simulation ID")
198
+ get_metrics_button = gr.Button("Get Network Metrics")
199
+ with gr.Column():
200
+ metrics_output = gr.JSON(label="Network Analytics")
201
+
202
+ get_metrics_button.click(
203
+ fn=get_metrics_ui,
204
+ inputs=[metrics_sim_id],
205
+ outputs=metrics_output,
206
+ api_name="get_network_metrics"
207
  )
 
 
 
 
 
 
 
 
 
 
208
 
209
  # Mount Gradio app to FastAPI app imported from api.main
210
  app = gr.mount_gradio_app(app, demo, path="/")
local_app_2.log ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ INFO: Started server process [94828]
2
+ INFO: Waiting for application startup.
3
+ INFO: Application startup complete.
4
+ INFO: Uvicorn running on http://0.0.0.0:7860 (Press CTRL+C to quit)
5
+
6
+ !!!!
7
+ DISCLAIMER: TinyTroupe relies on Artificial Intelligence (AI) models to generate content.
8
+ The AI models are not perfect and may produce inappropriate or inacurate results.
9
+ For any serious or consequential use, please review the generated content before using it.
10
+ !!!!
11
+
12
+ Looking for default config on: /app/tinytroupe/utils/../config.ini
13
+ Found custom config on: /app/config.ini
14
+ TinyTroupe version: unknown
15
+ Current date and time (local): 2026-02-15 14:18:59
16
+ Current date and time (UTC): 2026-02-15 14:18:59
17
+
18
+ =================================
19
+ Current TinyTroupe configuration
20
+ =================================
21
+ [OpenAI]
22
+ api_type = helmholtz-blablador
23
+ azure_api_version = 2023-05-15
24
+ model = alias-large
25
+ reasoning_model = alias-large
26
+ embedding_model = text-embedding-3-small
27
+ max_tokens = 32000
28
+ temperature = 1.5
29
+ freq_penalty = 0.1
30
+ presence_penalty = 0.1
31
+ timeout = 480
32
+ max_attempts = 5
33
+ waiting_time = 20
34
+ exponential_backoff_factor = 5
35
+ reasoning_effort = high
36
+ cache_api_calls = False
37
+ cache_file_name = openai_api_cache.pickle
38
+ max_content_display_length = 4000
39
+ top_p = 1.0
40
+
41
+ [Simulation]
42
+ parallel_agent_generation = True
43
+ parallel_agent_actions = True
44
+ rai_harmful_content_prevention = True
45
+ rai_copyright_infringement_prevention = True
46
+
47
+ [Cognition]
48
+ enable_memory_consolidation = True
49
+ min_episode_length = 15
50
+ max_episode_length = 50
51
+ episodic_memory_fixed_prefix_length = 10
52
+ episodic_memory_lookback_length = 20
53
+
54
+ [ActionGenerator]
55
+ max_attempts = 2
56
+ enable_quality_checks = False
57
+ enable_regeneration = True
58
+ enable_direct_correction = False
59
+ enable_quality_check_for_persona_adherence = True
60
+ enable_quality_check_for_selfconsistency = False
61
+ enable_quality_check_for_fluency = False
62
+ enable_quality_check_for_suitability = False
63
+ enable_quality_check_for_similarity = False
64
+ continue_on_failure = True
65
+ quality_threshold = 5
66
+
67
+ [Logging]
68
+ loglevel = ERROR
69
+
70
+ INFO: 127.0.0.1:53896 - "GET /health HTTP/1.1" 200 OK
71
+ INFO: 127.0.0.1:34934 - "GET / HTTP/1.1" 200 OK
72
+ INFO: 127.0.0.1:34934 - "GET /assets/index-BQPjLIsY.js HTTP/1.1" 200 OK
73
+ INFO: 127.0.0.1:34936 - "GET /assets/index-BOW2xVAS.css HTTP/1.1" 200 OK
74
+ INFO: 127.0.0.1:34934 - "GET /assets/svelte/svelte.js HTTP/1.1" 200 OK
75
+ INFO: 127.0.0.1:34936 - "GET /assets/Index-BEyjvDG_.css HTTP/1.1" 200 OK
76
+ INFO: 127.0.0.1:34934 - "GET /assets/Index-DB1XLvMK.js HTTP/1.1" 200 OK
77
+ INFO: 127.0.0.1:34934 - "GET /assets/index-BOW2xVAS.css HTTP/1.1" 200 OK
78
+ INFO: 127.0.0.1:34934 - "GET /theme.css?v=aa3cf5a76ff4ff3d05b407358c4a85aa7a55a3f5751b53d49cba0b8d49a6c148 HTTP/1.1" 200 OK
79
+ INFO: 127.0.0.1:34936 - "GET /assets/Blocks-CyfcXtBq.js HTTP/1.1" 200 OK
80
+ INFO: 127.0.0.1:34952 - "GET /assets/Blocks-yLdzXwzS.css HTTP/1.1" 200 OK
81
+ INFO: 127.0.0.1:34948 - "GET /assets/Button-CTZL5Nos.css HTTP/1.1" 200 OK
82
+ INFO: 127.0.0.1:34958 - "GET /assets/Button-BIUaXfcG.js HTTP/1.1" 200 OK
83
+ INFO: 127.0.0.1:34936 - "GET /assets/Index-BK-zC9ir.js HTTP/1.1" 200 OK
84
+ INFO: 127.0.0.1:34948 - "GET /assets/Check-CZUQOzJl.js HTTP/1.1" 200 OK
85
+ INFO: 127.0.0.1:34958 - "GET /assets/Index.svelte_svelte_type_style_lang-OwOFPfLe.js HTTP/1.1" 200 OK
86
+ INFO: 127.0.0.1:34952 - "GET /assets/Copy-B6RcHnoK.js HTTP/1.1" 200 OK
87
+ INFO: 127.0.0.1:34934 - "GET /assets/Example.svelte_svelte_type_style_lang-DXGdiQV3.js HTTP/1.1" 200 OK
88
+ INFO: 127.0.0.1:34964 - "GET /assets/Example-FbnSQP03.css HTTP/1.1" 200 OK
89
+ INFO: 127.0.0.1:34948 - "GET /assets/Index-Xv8ZQETB.css HTTP/1.1" 200 OK
90
+ INFO: 127.0.0.1:34952 - "GET /assets/Index-thdqX2vf.css HTTP/1.1" 200 OK
91
+ INFO: 127.0.0.1:34958 - "GET /assets/Index-CptIZeFZ.css HTTP/1.1" 200 OK
92
+ INFO: 127.0.0.1:34936 - "GET /assets/Tabs-DX5TEub2.css HTTP/1.1" 200 OK
93
+ INFO: 127.0.0.1:34964 - "GET /assets/Index-C43SQM_O.css HTTP/1.1" 200 OK
94
+ INFO: 127.0.0.1:34934 - "GET /assets/Textbox-D8IAzrZj.css HTTP/1.1" 200 OK
95
+ INFO: 127.0.0.1:34952 - "GET /assets/Example-Cj3ii62O.css HTTP/1.1" 200 OK
96
+ INFO: 127.0.0.1:34948 - "GET /assets/Index-BUublr_b.css HTTP/1.1" 200 OK
97
+ INFO: 127.0.0.1:34958 - "GET /assets/Index-CkUqDkVC.css HTTP/1.1" 200 OK
98
+ INFO: 127.0.0.1:34934 - "GET /assets/Example-D7K5RtQ2.css HTTP/1.1" 200 OK
99
+ INFO: 127.0.0.1:34964 - "GET /assets/Index-BAQumg2K.css HTTP/1.1" 200 OK
100
+ INFO: 127.0.0.1:34936 - "GET /assets/Index-B0JJ6p9c.css HTTP/1.1" 200 OK
101
+ INFO: 127.0.0.1:34952 - "GET /assets/prism-python-BTLCWl-V.js HTTP/1.1" 200 OK
102
+ INFO: 127.0.0.1:34952 - "GET /assets/Index-Tmzj9QOr.js HTTP/1.1" 200 OK
103
+ INFO: 127.0.0.1:34934 - "GET /assets/Index-CuoXAbPt.js HTTP/1.1" 200 OK
104
+ INFO: 127.0.0.1:34964 - "GET /assets/Index-BA3fpEJb.js HTTP/1.1" 200 OK
105
+ INFO: 127.0.0.1:34948 - "GET /assets/Example-CSVraJnq.js HTTP/1.1" 200 OK
106
+ INFO: 127.0.0.1:34936 - "GET /assets/Tabs-C0yBUI0Z.js HTTP/1.1" 200 OK
107
+ INFO: 127.0.0.1:34958 - "GET /assets/Index-BfLZDIPR.js HTTP/1.1" 200 OK
108
+ INFO: 127.0.0.1:34952 - "GET /assets/Textbox-BxQ_qaNA.js HTTP/1.1" 200 OK
109
+ INFO: 127.0.0.1:34948 - "GET /assets/Example-C7XUkkid.js HTTP/1.1" 200 OK
110
+ INFO: 127.0.0.1:34934 - "GET /assets/Index-CSD8SlVL.js HTTP/1.1" 200 OK
111
+ INFO: 127.0.0.1:34936 - "GET /assets/BlockTitle-CXNngU7y.js HTTP/1.1" 200 OK
112
+ INFO: 127.0.0.1:34958 - "GET /assets/Index--WpWguRY.js HTTP/1.1" 200 OK
113
+ INFO: 127.0.0.1:34964 - "GET /assets/Info-CrBVEpWV.js HTTP/1.1" 200 OK
114
+ INFO: 127.0.0.1:34958 - "GET /assets/Index-DRonTktv.js HTTP/1.1" 200 OK
115
+ INFO: 127.0.0.1:34936 - "GET /assets/Index-DDCF2BFd.js HTTP/1.1" 200 OK
116
+ INFO: 127.0.0.1:34934 - "GET /assets/Index-j4wxG1wD.js HTTP/1.1" 200 OK
117
+ INFO: 127.0.0.1:34936 - "GET /assets/Example-CUwox43B.js HTTP/1.1" 200 OK
118
+ INFO: 127.0.0.1:34958 - "GET /assets/DropdownArrow-B_jYsAai.js HTTP/1.1" 200 OK
119
+ INFO: 127.0.0.1:34948 - "GET /assets/Index-Vm7MXWuW.js HTTP/1.1" 200 OK
120
+ INFO: 127.0.0.1:34952 - "GET /assets/Empty-BgF7sXBn.js HTTP/1.1" 200 OK
121
+ INFO: 127.0.0.1:34964 - "GET /assets/BlockLabel-BlSr62f_.js HTTP/1.1" 200 OK
122
+ INFO: 127.0.0.1:60780 - "GET / HTTP/1.1" 200 OK
123
+ INFO: 127.0.0.1:60780 - "GET /assets/index-BQPjLIsY.js HTTP/1.1" 200 OK
124
+ INFO: 127.0.0.1:60786 - "GET /assets/index-BOW2xVAS.css HTTP/1.1" 200 OK
125
+ INFO: 127.0.0.1:60786 - "GET /assets/svelte/svelte.js HTTP/1.1" 200 OK
126
+ INFO: 127.0.0.1:60786 - "GET /assets/Index-DB1XLvMK.js HTTP/1.1" 200 OK
127
+ INFO: 127.0.0.1:60780 - "GET /assets/Index-BEyjvDG_.css HTTP/1.1" 200 OK
128
+ INFO: 127.0.0.1:60780 - "GET /assets/index-BOW2xVAS.css HTTP/1.1" 200 OK
129
+ INFO: 127.0.0.1:60780 - "GET /theme.css?v=aa3cf5a76ff4ff3d05b407358c4a85aa7a55a3f5751b53d49cba0b8d49a6c148 HTTP/1.1" 200 OK
130
+ INFO: 127.0.0.1:60786 - "GET /assets/Blocks-CyfcXtBq.js HTTP/1.1" 200 OK
131
+ INFO: 127.0.0.1:60814 - "GET /assets/Button-BIUaXfcG.js HTTP/1.1" 200 OK
132
+ INFO: 127.0.0.1:60806 - "GET /assets/Blocks-yLdzXwzS.css HTTP/1.1" 200 OK
133
+ INFO: 127.0.0.1:60796 - "GET /assets/Button-CTZL5Nos.css HTTP/1.1" 200 OK
134
+ INFO: 127.0.0.1:60806 - "GET /assets/Index-BK-zC9ir.js HTTP/1.1" 200 OK
135
+ INFO: 127.0.0.1:60796 - "GET /assets/Index.svelte_svelte_type_style_lang-OwOFPfLe.js HTTP/1.1" 200 OK
136
+ INFO: 127.0.0.1:60786 - "GET /assets/Copy-B6RcHnoK.js HTTP/1.1" 200 OK
137
+ INFO: 127.0.0.1:60814 - "GET /assets/Check-CZUQOzJl.js HTTP/1.1" 200 OK
138
+ INFO: 127.0.0.1:60780 - "GET /assets/Example.svelte_svelte_type_style_lang-DXGdiQV3.js HTTP/1.1" 200 OK
139
+ INFO: 127.0.0.1:60816 - "GET /assets/Example-FbnSQP03.css HTTP/1.1" 200 OK
140
+ INFO: 127.0.0.1:60806 - "GET /assets/Index-Xv8ZQETB.css HTTP/1.1" 200 OK
141
+ INFO: 127.0.0.1:60796 - "GET /assets/Tabs-DX5TEub2.css HTTP/1.1" 200 OK
142
+ INFO: 127.0.0.1:60786 - "GET /assets/Index-CptIZeFZ.css HTTP/1.1" 200 OK
143
+ INFO: 127.0.0.1:60814 - "GET /assets/Index-thdqX2vf.css HTTP/1.1" 200 OK
144
+ INFO: 127.0.0.1:60816 - "GET /assets/Index-C43SQM_O.css HTTP/1.1" 200 OK
145
+ INFO: 127.0.0.1:60786 - "GET /assets/Index-BUublr_b.css HTTP/1.1" 200 OK
146
+ INFO: 127.0.0.1:60796 - "GET /assets/Textbox-D8IAzrZj.css HTTP/1.1" 200 OK
147
+ INFO: 127.0.0.1:60806 - "GET /assets/Example-Cj3ii62O.css HTTP/1.1" 200 OK
148
+ INFO: 127.0.0.1:60814 - "GET /assets/Index-B0JJ6p9c.css HTTP/1.1" 200 OK
149
+ INFO: 127.0.0.1:60780 - "GET /assets/Index-CkUqDkVC.css HTTP/1.1" 200 OK
150
+ INFO: 127.0.0.1:60786 - "GET /assets/Index-BAQumg2K.css HTTP/1.1" 200 OK
151
+ INFO: 127.0.0.1:60806 - "GET /assets/prism-python-BTLCWl-V.js HTTP/1.1" 200 OK
152
+ INFO: 127.0.0.1:60780 - "GET /assets/Tabs-C0yBUI0Z.js HTTP/1.1" 200 OK
153
+ INFO: 127.0.0.1:60796 - "GET /assets/Example-D7K5RtQ2.css HTTP/1.1" 200 OK
154
+ INFO: 127.0.0.1:60816 - "GET /assets/Example-CSVraJnq.js HTTP/1.1" 200 OK
155
+ INFO: 127.0.0.1:60814 - "GET /assets/Index-BfLZDIPR.js HTTP/1.1" 200 OK
156
+ INFO: 127.0.0.1:60806 - "GET /assets/Index-BA3fpEJb.js HTTP/1.1" 200 OK
157
+ INFO: 127.0.0.1:60786 - "GET /assets/Index-CuoXAbPt.js HTTP/1.1" 200 OK
158
+ INFO: 127.0.0.1:60780 - "GET /assets/Index-Tmzj9QOr.js HTTP/1.1" 200 OK
159
+ INFO: 127.0.0.1:60816 - "GET /assets/Textbox-BxQ_qaNA.js HTTP/1.1" 200 OK
160
+ INFO: 127.0.0.1:60796 - "GET /assets/BlockTitle-CXNngU7y.js HTTP/1.1" 200 OK
161
+ INFO: 127.0.0.1:60814 - "GET /assets/Index-CSD8SlVL.js HTTP/1.1" 200 OK
162
+ INFO: 127.0.0.1:60806 - "GET /assets/Info-CrBVEpWV.js HTTP/1.1" 200 OK
163
+ INFO: 127.0.0.1:60816 - "GET /assets/Index-DRonTktv.js HTTP/1.1" 200 OK
164
+ INFO: 127.0.0.1:60780 - "GET /assets/Index--WpWguRY.js HTTP/1.1" 200 OK
165
+ INFO: 127.0.0.1:60796 - "GET /assets/Index-DDCF2BFd.js HTTP/1.1" 200 OK
166
+ INFO: 127.0.0.1:60814 - "GET /assets/Index-j4wxG1wD.js HTTP/1.1" 200 OK
167
+ INFO: 127.0.0.1:60786 - "GET /assets/Example-C7XUkkid.js HTTP/1.1" 200 OK
168
+ INFO: 127.0.0.1:60806 - "GET /assets/Empty-BgF7sXBn.js HTTP/1.1" 200 OK
169
+ INFO: 127.0.0.1:60796 - "GET /assets/Index-Vm7MXWuW.js HTTP/1.1" 200 OK
170
+ INFO: 127.0.0.1:60814 - "GET /assets/BlockLabel-BlSr62f_.js HTTP/1.1" 200 OK
171
+ INFO: 127.0.0.1:60816 - "GET /assets/DropdownArrow-B_jYsAai.js HTTP/1.1" 200 OK
172
+ INFO: 127.0.0.1:60780 - "GET /assets/Example-CUwox43B.js HTTP/1.1" 200 OK
173
+ INFO: 127.0.0.1:56100 - "GET / HTTP/1.1" 200 OK
174
+ INFO: 127.0.0.1:56100 - "GET /assets/index-BQPjLIsY.js HTTP/1.1" 200 OK
175
+ INFO: 127.0.0.1:56104 - "GET /assets/index-BOW2xVAS.css HTTP/1.1" 200 OK
176
+ INFO: 127.0.0.1:56100 - "GET /assets/svelte/svelte.js HTTP/1.1" 200 OK
177
+ INFO: 127.0.0.1:56104 - "GET /assets/Index-BEyjvDG_.css HTTP/1.1" 200 OK
178
+ INFO: 127.0.0.1:56100 - "GET /assets/Index-DB1XLvMK.js HTTP/1.1" 200 OK
179
+ INFO: 127.0.0.1:56100 - "GET /assets/index-BOW2xVAS.css HTTP/1.1" 200 OK
180
+ INFO: 127.0.0.1:56100 - "GET /theme.css?v=aa3cf5a76ff4ff3d05b407358c4a85aa7a55a3f5751b53d49cba0b8d49a6c148 HTTP/1.1" 200 OK
181
+ INFO: 127.0.0.1:56104 - "GET /assets/Blocks-CyfcXtBq.js HTTP/1.1" 200 OK
182
+ INFO: 127.0.0.1:56110 - "GET /assets/Button-CTZL5Nos.css HTTP/1.1" 200 OK
183
+ INFO: 127.0.0.1:56128 - "GET /assets/Button-BIUaXfcG.js HTTP/1.1" 200 OK
184
+ INFO: 127.0.0.1:56118 - "GET /assets/Blocks-yLdzXwzS.css HTTP/1.1" 200 OK
185
+ INFO: 127.0.0.1:56104 - "GET /assets/Index.svelte_svelte_type_style_lang-OwOFPfLe.js HTTP/1.1" 200 OK
186
+ INFO: 127.0.0.1:56140 - "GET /assets/Example-FbnSQP03.css HTTP/1.1" 200 OK
187
+ INFO: 127.0.0.1:56110 - "GET /assets/Check-CZUQOzJl.js HTTP/1.1" 200 OK
188
+ INFO: 127.0.0.1:56100 - "GET /assets/Example.svelte_svelte_type_style_lang-DXGdiQV3.js HTTP/1.1" 200 OK
189
+ INFO: 127.0.0.1:56118 - "GET /assets/Index-BK-zC9ir.js HTTP/1.1" 200 OK
190
+ INFO: 127.0.0.1:56128 - "GET /assets/Copy-B6RcHnoK.js HTTP/1.1" 200 OK
191
+ INFO: 127.0.0.1:56140 - "GET /assets/Tabs-DX5TEub2.css HTTP/1.1" 200 OK
192
+ INFO: 127.0.0.1:56118 - "GET /assets/Index-thdqX2vf.css HTTP/1.1" 200 OK
193
+ INFO: 127.0.0.1:56104 - "GET /assets/Index-Xv8ZQETB.css HTTP/1.1" 200 OK
194
+ INFO: 127.0.0.1:56128 - "GET /assets/Index-C43SQM_O.css HTTP/1.1" 200 OK
195
+ INFO: 127.0.0.1:56110 - "GET /assets/Index-CptIZeFZ.css HTTP/1.1" 200 OK
196
+ INFO: 127.0.0.1:56100 - "GET /assets/Textbox-D8IAzrZj.css HTTP/1.1" 200 OK
197
+ INFO: 127.0.0.1:56100 - "GET /assets/Index-BAQumg2K.css HTTP/1.1" 200 OK
198
+ INFO: 127.0.0.1:56110 - "GET /assets/Example-D7K5RtQ2.css HTTP/1.1" 200 OK
199
+ INFO: 127.0.0.1:56118 - "GET /assets/Index-B0JJ6p9c.css HTTP/1.1" 200 OK
200
+ INFO: 127.0.0.1:56104 - "GET /assets/Example-Cj3ii62O.css HTTP/1.1" 200 OK
201
+ INFO: 127.0.0.1:56128 - "GET /assets/Index-CkUqDkVC.css HTTP/1.1" 200 OK
202
+ INFO: 127.0.0.1:56140 - "GET /assets/Index-BUublr_b.css HTTP/1.1" 200 OK
203
+ INFO: 127.0.0.1:56100 - "GET /assets/prism-python-BTLCWl-V.js HTTP/1.1" 200 OK
204
+ INFO: 127.0.0.1:56104 - "GET /assets/Tabs-C0yBUI0Z.js HTTP/1.1" 200 OK
205
+ INFO: 127.0.0.1:56118 - "GET /assets/Index-BfLZDIPR.js HTTP/1.1" 200 OK
206
+ INFO: 127.0.0.1:56110 - "GET /assets/Example-CSVraJnq.js HTTP/1.1" 200 OK
207
+ INFO: 127.0.0.1:56128 - "GET /assets/Index-BA3fpEJb.js HTTP/1.1" 200 OK
208
+ INFO: 127.0.0.1:56140 - "GET /assets/Index-CuoXAbPt.js HTTP/1.1" 200 OK
209
+ INFO: 127.0.0.1:56104 - "GET /assets/Textbox-BxQ_qaNA.js HTTP/1.1" 200 OK
210
+ INFO: 127.0.0.1:56110 - "GET /assets/BlockTitle-CXNngU7y.js HTTP/1.1" 200 OK
211
+ INFO: 127.0.0.1:56100 - "GET /assets/Index-Tmzj9QOr.js HTTP/1.1" 200 OK
212
+ INFO: 127.0.0.1:56140 - "GET /assets/Example-C7XUkkid.js HTTP/1.1" 200 OK
213
+ INFO: 127.0.0.1:56128 - "GET /assets/Info-CrBVEpWV.js HTTP/1.1" 200 OK
214
+ INFO: 127.0.0.1:56118 - "GET /assets/Index-CSD8SlVL.js HTTP/1.1" 200 OK
215
+ INFO: 127.0.0.1:56104 - "GET /assets/Index--WpWguRY.js HTTP/1.1" 200 OK
216
+ INFO: 127.0.0.1:56100 - "GET /assets/Index-DDCF2BFd.js HTTP/1.1" 200 OK
217
+ INFO: 127.0.0.1:56140 - "GET /assets/Index-j4wxG1wD.js HTTP/1.1" 200 OK
218
+ INFO: 127.0.0.1:56110 - "GET /assets/Index-DRonTktv.js HTTP/1.1" 200 OK
219
+ INFO: 127.0.0.1:56128 - "GET /assets/Empty-BgF7sXBn.js HTTP/1.1" 200 OK
220
+ INFO: 127.0.0.1:56118 - "GET /assets/BlockLabel-BlSr62f_.js HTTP/1.1" 200 OK
221
+ INFO: 127.0.0.1:56140 - "GET /assets/DropdownArrow-B_jYsAai.js HTTP/1.1" 200 OK
222
+ INFO: 127.0.0.1:56110 - "GET /assets/Example-CUwox43B.js HTTP/1.1" 200 OK
223
+ INFO: 127.0.0.1:56100 - "GET /assets/Index-Vm7MXWuW.js HTTP/1.1" 200 OK
224
+ INFO: Shutting down
225
+ INFO: Waiting for application shutdown.
226
+ INFO: Application shutdown complete.
227
+ INFO: Finished server process [94828]