AUXteam commited on
Commit
7a0719c
·
verified ·
1 Parent(s): fdcdf6c

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .coverage +0 -0
  2. Agent.md +36 -24
  3. Dockerfile +16 -6
  4. app.py +12 -2
  5. coverage.xml +0 -0
  6. htmlcov/.gitignore +2 -0
  7. htmlcov/class_index.html +1441 -0
  8. htmlcov/coverage_html_cb_dd2e7eb5.js +735 -0
  9. htmlcov/favicon_32_cb_c827f16f.png +0 -0
  10. htmlcov/function_index.html +0 -0
  11. htmlcov/index.html +657 -0
  12. htmlcov/keybd_closed_cb_900cfef5.png +0 -0
  13. htmlcov/status.json +1 -0
  14. htmlcov/style_cb_9ff733b0.css +389 -0
  15. htmlcov/z_1008c76b8ac6114d___init___py.html +121 -0
  16. htmlcov/z_1008c76b8ac6114d_artifact_exporter_py.html +257 -0
  17. htmlcov/z_1008c76b8ac6114d_normalizer_py.html +212 -0
  18. htmlcov/z_1008c76b8ac6114d_results_extractor_py.html +365 -0
  19. htmlcov/z_1008c76b8ac6114d_results_reducer_py.html +152 -0
  20. htmlcov/z_1008c76b8ac6114d_results_reporter_py.html +0 -0
  21. htmlcov/z_13b615ba9b634dc5___init___py.html +107 -0
  22. htmlcov/z_13b615ba9b634dc5_intervention_py.html +364 -0
  23. htmlcov/z_13b615ba9b634dc5_tiny_story_py.html +235 -0
  24. htmlcov/z_1dd26f6f54202fea___init___py.html +120 -0
  25. htmlcov/z_1dd26f6f54202fea_jupyter_widgets_py.html +0 -0
  26. htmlcov/z_357ee38f49d3e320___init___py.html +163 -0
  27. htmlcov/z_357ee38f49d3e320_action_generator_py.html +0 -0
  28. htmlcov/z_357ee38f49d3e320_browser_faculty_py.html +182 -0
  29. htmlcov/z_357ee38f49d3e320_grounding_py.html +0 -0
  30. htmlcov/z_357ee38f49d3e320_memory_py.html +0 -0
  31. htmlcov/z_357ee38f49d3e320_mental_faculty_py.html +0 -0
  32. htmlcov/z_357ee38f49d3e320_tiny_person_py.html +0 -0
  33. htmlcov/z_37eec20419a3fd46___init___py.html +108 -0
  34. htmlcov/z_37eec20419a3fd46_tiny_enricher_py.html +138 -0
  35. htmlcov/z_37eec20419a3fd46_tiny_styler_py.html +182 -0
  36. htmlcov/z_4b3d0d3b603de221___init___py.html +116 -0
  37. htmlcov/z_4b3d0d3b603de221_behavior_py.html +140 -0
  38. htmlcov/z_4b3d0d3b603de221_config_py.html +205 -0
  39. htmlcov/z_4b3d0d3b603de221_json_py.html +0 -0
  40. htmlcov/z_4b3d0d3b603de221_llm_py.html +0 -0
  41. htmlcov/z_4b3d0d3b603de221_logger_py.html +134 -0
  42. htmlcov/z_4b3d0d3b603de221_misc_py.html +179 -0
  43. htmlcov/z_4b3d0d3b603de221_parallel_py.html +206 -0
  44. htmlcov/z_4b3d0d3b603de221_rendering_py.html +209 -0
  45. htmlcov/z_4b3d0d3b603de221_semantics_py.html +364 -0
  46. htmlcov/z_4b3d0d3b603de221_validation_py.html +164 -0
  47. htmlcov/z_6bd7109c20672ac0___init___py.html +108 -0
  48. htmlcov/z_6bd7109c20672ac0_agents_py.html +413 -0
  49. htmlcov/z_6bd7109c20672ac0_loaders_py.html +141 -0
  50. htmlcov/z_8e144f0c9fd03088___init___py.html +361 -0
.coverage ADDED
Binary file (53.2 kB). View file
 
Agent.md CHANGED
@@ -21,12 +21,12 @@ Choose the correct SDK based on the app type based on the codebase language:
21
  - All monitoring and log‑streaming commands rely on `$HF_TOKEN`.
22
 
23
  ### Required Files
24
- - `Dockerfile` (or `app.py` for Gradio/Streamlit SDKs)
25
  - `README.md` with Hugging Face YAML frontmatter:
26
  ```yaml
27
  ---
28
- title: <APP NAME>
29
- sdk: docker | gradio | streamlit
30
  app_port: 7860
31
  ---
32
  ```
@@ -50,29 +50,39 @@ Every deployment **must** expose:
50
  `https://HF_PROFILE-tiny_factory.hf.space/api-docs`
51
 
52
  ### Functional Endpoints
53
- Document each endpoint here. For every endpoint, include:
54
 
55
- - **Method:** GET/POST/PUT/DELETE
56
- - **Path:** `/predict`, `/generate`, `/upload`, etc.
57
- - **Purpose:** What the endpoint does
58
- - **Request Example:** JSON or query parameters
59
- - **Response Example:** JSON schema or example payload
60
-
61
- Example format:
62
-
63
- ```
64
- ### /predict
65
  - Method: POST
66
- - Purpose: Run model inference
67
  - Request:
 
68
  {
69
- "text": "hello world"
 
 
70
  }
 
71
  - Response:
72
- {
73
- "prediction": "…"
74
- }
75
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
  All endpoints listed here **must** appear in `/api-docs`.
78
 
@@ -158,15 +168,17 @@ For each endpoint documented above, define:
158
  Example:
159
 
160
  ```
161
- POST https://HF_PROFILE-tiny_factory.hf.space/predict
162
  Payload:
163
  {
164
- "text": "test"
 
 
165
  }
166
  Expected:
167
  - HTTP 200
168
- - JSON with key "prediction"
169
- - No error fields
170
  ```
171
 
172
  ### 4. End-to-End Behaviour
 
21
  - All monitoring and log‑streaming commands rely on `$HF_TOKEN`.
22
 
23
  ### Required Files
24
+ - `Dockerfile`
25
  - `README.md` with Hugging Face YAML frontmatter:
26
  ```yaml
27
  ---
28
+ title: Tiny Factory
29
+ sdk: docker
30
  app_port: 7860
31
  ---
32
  ```
 
50
  `https://HF_PROFILE-tiny_factory.hf.space/api-docs`
51
 
52
  ### Functional Endpoints
53
+ Documented endpoints:
54
 
55
+ ### /api/v1/generate_personas
 
 
 
 
 
 
 
 
 
56
  - Method: POST
57
+ - Purpose: Generates a list of personas using a double sequential generation pipeline (extracting parameters via an LLM and generating using a remote model).
58
  - Request:
59
+ ```json
60
  {
61
+ "business_description": "Tech startup",
62
+ "customer_profile": "Young professionals",
63
+ "num_personas": 1
64
  }
65
+ ```
66
  - Response:
67
+ ```json
68
+ [
69
+ {
70
+ "parameters_used": {
71
+ "age": 30,
72
+ "gender": "Non-binary",
73
+ "occupation": "Professional",
74
+ "city": "Metropolis",
75
+ "country": "Country",
76
+ "custom_values": "Innovation, Community",
77
+ "custom_life_attitude": "Optimistic",
78
+ "life_story": "A standard professional background with a passion for their field.",
79
+ "interests_hobbies": "Technology, Reading",
80
+ "attribute_count": 200
81
+ },
82
+ "persona_profile": "Profile text generated by external API"
83
+ }
84
+ ]
85
+ ```
86
 
87
  All endpoints listed here **must** appear in `/api-docs`.
88
 
 
168
  Example:
169
 
170
  ```
171
+ POST https://HF_PROFILE-tiny_factory.hf.space/api/v1/generate_personas
172
  Payload:
173
  {
174
+ "business_description": "test",
175
+ "customer_profile": "test",
176
+ "num_personas": 1
177
  }
178
  Expected:
179
  - HTTP 200
180
+ - JSON Array of generated profiles
181
+ - Each element containing "parameters_used" and "persona_profile"
182
  ```
183
 
184
  ### 4. End-to-End Behaviour
Dockerfile CHANGED
@@ -1,13 +1,23 @@
1
  FROM python:3.11-slim
2
 
3
- WORKDIR /app
 
4
 
5
- # Install dependencies
6
- COPY requirements.txt .
7
- RUN pip install --no-cache-dir -r requirements.txt
8
 
9
- # Copy the app files
10
- COPY . .
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  # Expose the standard port
13
  EXPOSE 7860
 
1
  FROM python:3.11-slim
2
 
3
+ # Configure a non-root user specifically for HF Spaces
4
+ RUN useradd -m -u 1000 user
5
 
6
+ USER user
 
 
7
 
8
+ # Set home to the user's home directory
9
+ ENV HOME=/home/user \
10
+ PATH=/home/user/.local/bin:$PATH
11
+
12
+ # Change working directory
13
+ WORKDIR $HOME/app
14
+
15
+ # Install dependencies using the user
16
+ COPY --chown=user requirements.txt .
17
+ RUN pip install --no-cache-dir --user -r requirements.txt
18
+
19
+ # Copy the app files into the home directory, setting proper ownership
20
+ COPY --chown=user . $HOME/app
21
 
22
  # Expose the standard port
23
  EXPOSE 7860
app.py CHANGED
@@ -12,10 +12,20 @@ app = FastAPI()
12
  def health():
13
  return {"status": "ok"}
14
 
 
 
15
  @app.get("/api-docs")
16
  def api_docs():
17
- # In fastapi /docs is the swagger ui, but let's provide a JSON response as well for this specific endpoint.
18
- return {"message": "API documentation is available at /docs"}
 
 
 
 
 
 
 
 
19
 
20
  def extract_persona_parameters(business_description: str, customer_profile: str) -> dict:
21
  from tinytroupe.openai_utils import client
 
12
  def health():
13
  return {"status": "ok"}
14
 
15
+ from fastapi.responses import RedirectResponse
16
+
17
  @app.get("/api-docs")
18
  def api_docs():
19
+ return RedirectResponse(url="/docs")
20
+
21
+ class PersonaRequest(BaseModel):
22
+ business_description: str
23
+ customer_profile: str
24
+ num_personas: int = 1
25
+
26
+ @app.post("/api/v1/generate_personas")
27
+ def generate_personas_api(req: PersonaRequest):
28
+ return generate_personas(req.business_description, req.customer_profile, req.num_personas)
29
 
30
  def extract_persona_parameters(business_description: str, customer_profile: str) -> dict:
31
  from tinytroupe.openai_utils import client
coverage.xml ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Created by coverage.py
2
+ *
htmlcov/class_index.html ADDED
@@ -0,0 +1,1441 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage report</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="indexfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>Coverage report:
14
+ <span class="pc_cov">7%</span>
15
+ </h1>
16
+ <aside id="help_panel_wrapper">
17
+ <input id="help_panel_state" type="checkbox">
18
+ <label for="help_panel_state">
19
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
20
+ </label>
21
+ <div id="help_panel">
22
+ <p class="legend">Shortcuts on this page</p>
23
+ <div class="keyhelp">
24
+ <p>
25
+ <kbd>f</kbd>
26
+ <kbd>n</kbd>
27
+ <kbd>s</kbd>
28
+ <kbd>m</kbd>
29
+ <kbd>x</kbd>
30
+ <kbd>c</kbd>
31
+ &nbsp; change column sorting
32
+ </p>
33
+ <p>
34
+ <kbd>[</kbd>
35
+ <kbd>]</kbd>
36
+ &nbsp; prev/next file
37
+ </p>
38
+ <p>
39
+ <kbd>?</kbd> &nbsp; show/hide this help
40
+ </p>
41
+ </div>
42
+ </div>
43
+ </aside>
44
+ <form id="filter_container">
45
+ <input id="filter" type="text" value="" placeholder="filter...">
46
+ <div>
47
+ <input id="hide100" type="checkbox" >
48
+ <label for="hide100">hide covered</label>
49
+ </div>
50
+ </form>
51
+ <h2>
52
+ <a class="button" href="index.html">Files</a>
53
+ <a class="button" href="function_index.html">Functions</a>
54
+ <a class="button current">Classes</a>
55
+ </h2>
56
+ <p class="text">
57
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
58
+ created at 2026-02-28 17:48 +0000
59
+ </p>
60
+ </div>
61
+ </header>
62
+ <main id="index">
63
+ <table class="index" data-sortable>
64
+ <thead>
65
+ <tr class="tablehead" title="Click to sort">
66
+ <th id="file" class="name" aria-sort="none" data-shortcut="f">File<span class="arrows"></span></th>
67
+ <th id="region" class="name" aria-sort="none" data-default-sort-order="ascending" data-shortcut="n">class<span class="arrows"></span></th>
68
+ <th class="spacer">&nbsp;</th>
69
+ <th id="statements" aria-sort="none" data-default-sort-order="descending" data-shortcut="s">statements<span class="arrows"></span></th>
70
+ <th id="missing" aria-sort="none" data-default-sort-order="descending" data-shortcut="m">missing<span class="arrows"></span></th>
71
+ <th id="excluded" aria-sort="none" data-default-sort-order="descending" data-shortcut="x">excluded<span class="arrows"></span></th>
72
+ <th class="spacer">&nbsp;</th>
73
+ <th id="coverage" aria-sort="none" data-shortcut="c">coverage<span class="arrows"></span></th>
74
+ </tr>
75
+ </thead>
76
+ <tbody>
77
+ <tr class="region">
78
+ <td class="name"><a href="z_8e144f0c9fd03088___init___py.html#t26">tinytroupe&#8201;/&#8201;__init__.py</a></td>
79
+ <td class="name"><a href="z_8e144f0c9fd03088___init___py.html#t26"><data value='ConfigManager'>ConfigManager</data></a></td>
80
+ <td class="spacer">&nbsp;</td>
81
+ <td>69</td>
82
+ <td>22</td>
83
+ <td>0</td>
84
+ <td class="spacer">&nbsp;</td>
85
+ <td data-ratio="47 69">68%</td>
86
+ </tr>
87
+ <tr class="region">
88
+ <td class="name"><a href="z_8e144f0c9fd03088___init___py.html">tinytroupe&#8201;/&#8201;__init__.py</a></td>
89
+ <td class="name"><a href="z_8e144f0c9fd03088___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
90
+ <td class="spacer">&nbsp;</td>
91
+ <td>40</td>
92
+ <td>5</td>
93
+ <td>0</td>
94
+ <td class="spacer">&nbsp;</td>
95
+ <td data-ratio="35 40">88%</td>
96
+ </tr>
97
+ <tr class="region">
98
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t35">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</a></td>
99
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t35"><data value='Action'>Action</data></a></td>
100
+ <td class="spacer">&nbsp;</td>
101
+ <td>0</td>
102
+ <td>0</td>
103
+ <td>0</td>
104
+ <td class="spacer">&nbsp;</td>
105
+ <td data-ratio="0 0">100%</td>
106
+ </tr>
107
+ <tr class="region">
108
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t40">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</a></td>
109
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t40"><data value='CognitiveState'>CognitiveState</data></a></td>
110
+ <td class="spacer">&nbsp;</td>
111
+ <td>0</td>
112
+ <td>0</td>
113
+ <td>0</td>
114
+ <td class="spacer">&nbsp;</td>
115
+ <td data-ratio="0 0">100%</td>
116
+ </tr>
117
+ <tr class="region">
118
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t46">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</a></td>
119
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t46"><data value='CognitiveActionModel'>CognitiveActionModel</data></a></td>
120
+ <td class="spacer">&nbsp;</td>
121
+ <td>0</td>
122
+ <td>0</td>
123
+ <td>0</td>
124
+ <td class="spacer">&nbsp;</td>
125
+ <td data-ratio="0 0">100%</td>
126
+ </tr>
127
+ <tr class="region">
128
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t50">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</a></td>
129
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html#t50"><data value='CognitiveActionModelWithReasoning'>CognitiveActionModelWithReasoning</data></a></td>
130
+ <td class="spacer">&nbsp;</td>
131
+ <td>0</td>
132
+ <td>0</td>
133
+ <td>0</td>
134
+ <td class="spacer">&nbsp;</td>
135
+ <td data-ratio="0 0">100%</td>
136
+ </tr>
137
+ <tr class="region">
138
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</a></td>
139
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
140
+ <td class="spacer">&nbsp;</td>
141
+ <td>28</td>
142
+ <td>28</td>
143
+ <td>0</td>
144
+ <td class="spacer">&nbsp;</td>
145
+ <td data-ratio="0 28">0%</td>
146
+ </tr>
147
+ <tr class="region">
148
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html#t12">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;action_generator.py</a></td>
149
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html#t12"><data value='ActionGenerator'>ActionGenerator</data></a></td>
150
+ <td class="spacer">&nbsp;</td>
151
+ <td>166</td>
152
+ <td>166</td>
153
+ <td>0</td>
154
+ <td class="spacer">&nbsp;</td>
155
+ <td data-ratio="0 166">0%</td>
156
+ </tr>
157
+ <tr class="region">
158
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html#t529">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;action_generator.py</a></td>
159
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html#t529"><data value='PoorQualityActionException'>PoorQualityActionException</data></a></td>
160
+ <td class="spacer">&nbsp;</td>
161
+ <td>2</td>
162
+ <td>2</td>
163
+ <td>0</td>
164
+ <td class="spacer">&nbsp;</td>
165
+ <td data-ratio="0 2">0%</td>
166
+ </tr>
167
+ <tr class="region">
168
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;action_generator.py</a></td>
169
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
170
+ <td class="spacer">&nbsp;</td>
171
+ <td>19</td>
172
+ <td>19</td>
173
+ <td>0</td>
174
+ <td class="spacer">&nbsp;</td>
175
+ <td data-ratio="0 19">0%</td>
176
+ </tr>
177
+ <tr class="region">
178
+ <td class="name"><a href="z_357ee38f49d3e320_browser_faculty_py.html#t5">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;browser_faculty.py</a></td>
179
+ <td class="name"><a href="z_357ee38f49d3e320_browser_faculty_py.html#t5"><data value='BrowserFaculty'>BrowserFaculty</data></a></td>
180
+ <td class="spacer">&nbsp;</td>
181
+ <td>45</td>
182
+ <td>45</td>
183
+ <td>0</td>
184
+ <td class="spacer">&nbsp;</td>
185
+ <td data-ratio="0 45">0%</td>
186
+ </tr>
187
+ <tr class="region">
188
+ <td class="name"><a href="z_357ee38f49d3e320_browser_faculty_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;browser_faculty.py</a></td>
189
+ <td class="name"><a href="z_357ee38f49d3e320_browser_faculty_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
190
+ <td class="spacer">&nbsp;</td>
191
+ <td>8</td>
192
+ <td>8</td>
193
+ <td>0</td>
194
+ <td class="spacer">&nbsp;</td>
195
+ <td data-ratio="0 8">0%</td>
196
+ </tr>
197
+ <tr class="region">
198
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t18">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;grounding.py</a></td>
199
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t18"><data value='GroundingConnector'>GroundingConnector</data></a></td>
200
+ <td class="spacer">&nbsp;</td>
201
+ <td>4</td>
202
+ <td>4</td>
203
+ <td>0</td>
204
+ <td class="spacer">&nbsp;</td>
205
+ <td data-ratio="0 4">0%</td>
206
+ </tr>
207
+ <tr class="region">
208
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t40">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;grounding.py</a></td>
209
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t40"><data value='BaseSemanticGroundingConnector'>BaseSemanticGroundingConnector</data></a></td>
210
+ <td class="spacer">&nbsp;</td>
211
+ <td>99</td>
212
+ <td>99</td>
213
+ <td>0</td>
214
+ <td class="spacer">&nbsp;</td>
215
+ <td data-ratio="0 99">0%</td>
216
+ </tr>
217
+ <tr class="region">
218
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t277">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;grounding.py</a></td>
219
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t277"><data value='LocalFilesGroundingConnector'>LocalFilesGroundingConnector</data></a></td>
220
+ <td class="spacer">&nbsp;</td>
221
+ <td>28</td>
222
+ <td>28</td>
223
+ <td>0</td>
224
+ <td class="spacer">&nbsp;</td>
225
+ <td data-ratio="0 28">0%</td>
226
+ </tr>
227
+ <tr class="region">
228
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t351">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;grounding.py</a></td>
229
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html#t351"><data value='WebPagesGroundingConnector'>WebPagesGroundingConnector</data></a></td>
230
+ <td class="spacer">&nbsp;</td>
231
+ <td>18</td>
232
+ <td>18</td>
233
+ <td>0</td>
234
+ <td class="spacer">&nbsp;</td>
235
+ <td data-ratio="0 18">0%</td>
236
+ </tr>
237
+ <tr class="region">
238
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;grounding.py</a></td>
239
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
240
+ <td class="spacer">&nbsp;</td>
241
+ <td>51</td>
242
+ <td>51</td>
243
+ <td>0</td>
244
+ <td class="spacer">&nbsp;</td>
245
+ <td data-ratio="0 51">0%</td>
246
+ </tr>
247
+ <tr class="region">
248
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t18">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
249
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t18"><data value='TinyMemory'>TinyMemory</data></a></td>
250
+ <td class="spacer">&nbsp;</td>
251
+ <td>29</td>
252
+ <td>29</td>
253
+ <td>0</td>
254
+ <td class="spacer">&nbsp;</td>
255
+ <td data-ratio="0 29">0%</td>
256
+ </tr>
257
+ <tr class="region">
258
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t215">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
259
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t215"><data value='EpisodicMemory'>EpisodicMemory</data></a></td>
260
+ <td class="spacer">&nbsp;</td>
261
+ <td>44</td>
262
+ <td>44</td>
263
+ <td>0</td>
264
+ <td class="spacer">&nbsp;</td>
265
+ <td data-ratio="0 44">0%</td>
266
+ </tr>
267
+ <tr class="region">
268
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t416">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
269
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t416"><data value='SemanticMemory'>SemanticMemory</data></a></td>
270
+ <td class="spacer">&nbsp;</td>
271
+ <td>50</td>
272
+ <td>50</td>
273
+ <td>0</td>
274
+ <td class="spacer">&nbsp;</td>
275
+ <td data-ratio="0 50">0%</td>
276
+ </tr>
277
+ <tr class="region">
278
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t566">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
279
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t566"><data value='MemoryProcessor'>MemoryProcessor</data></a></td>
280
+ <td class="spacer">&nbsp;</td>
281
+ <td>1</td>
282
+ <td>1</td>
283
+ <td>0</td>
284
+ <td class="spacer">&nbsp;</td>
285
+ <td data-ratio="0 1">0%</td>
286
+ </tr>
287
+ <tr class="region">
288
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t592">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
289
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t592"><data value='EpisodicConsolidator'>EpisodicConsolidator</data></a></td>
290
+ <td class="spacer">&nbsp;</td>
291
+ <td>5</td>
292
+ <td>5</td>
293
+ <td>1</td>
294
+ <td class="spacer">&nbsp;</td>
295
+ <td data-ratio="0 5">0%</td>
296
+ </tr>
297
+ <tr class="region">
298
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t715">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
299
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html#t715"><data value='ReflectionConsolidator'>ReflectionConsolidator</data></a></td>
300
+ <td class="spacer">&nbsp;</td>
301
+ <td>3</td>
302
+ <td>3</td>
303
+ <td>0</td>
304
+ <td class="spacer">&nbsp;</td>
305
+ <td data-ratio="0 3">0%</td>
306
+ </tr>
307
+ <tr class="region">
308
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
309
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
310
+ <td class="spacer">&nbsp;</td>
311
+ <td>57</td>
312
+ <td>57</td>
313
+ <td>0</td>
314
+ <td class="spacer">&nbsp;</td>
315
+ <td data-ratio="0 57">0%</td>
316
+ </tr>
317
+ <tr class="region">
318
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t15">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
319
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t15"><data value='TinyMentalFaculty'>TinyMentalFaculty</data></a></td>
320
+ <td class="spacer">&nbsp;</td>
321
+ <td>11</td>
322
+ <td>11</td>
323
+ <td>0</td>
324
+ <td class="spacer">&nbsp;</td>
325
+ <td data-ratio="0 11">0%</td>
326
+ </tr>
327
+ <tr class="region">
328
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t68">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
329
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t68"><data value='CustomMentalFaculty'>CustomMentalFaculty</data></a></td>
330
+ <td class="spacer">&nbsp;</td>
331
+ <td>30</td>
332
+ <td>30</td>
333
+ <td>0</td>
334
+ <td class="spacer">&nbsp;</td>
335
+ <td data-ratio="0 30">0%</td>
336
+ </tr>
337
+ <tr class="region">
338
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t151">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
339
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t151"><data value='RecallFaculty'>RecallFaculty</data></a></td>
340
+ <td class="spacer">&nbsp;</td>
341
+ <td>24</td>
342
+ <td>24</td>
343
+ <td>0</td>
344
+ <td class="spacer">&nbsp;</td>
345
+ <td data-ratio="0 24">0%</td>
346
+ </tr>
347
+ <tr class="region">
348
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t275">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
349
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t275"><data value='FilesAndWebGroundingFaculty'>FilesAndWebGroundingFaculty</data></a></td>
350
+ <td class="spacer">&nbsp;</td>
351
+ <td>25</td>
352
+ <td>25</td>
353
+ <td>0</td>
354
+ <td class="spacer">&nbsp;</td>
355
+ <td data-ratio="0 25">0%</td>
356
+ </tr>
357
+ <tr class="region">
358
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t367">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
359
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t367"><data value='TinyToolUse'>TinyToolUse</data></a></td>
360
+ <td class="spacer">&nbsp;</td>
361
+ <td>14</td>
362
+ <td>14</td>
363
+ <td>0</td>
364
+ <td class="spacer">&nbsp;</td>
365
+ <td data-ratio="0 14">0%</td>
366
+ </tr>
367
+ <tr class="region">
368
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t402">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
369
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html#t402"><data value='SequentialThinkingFaculty'>SequentialThinkingFaculty</data></a></td>
370
+ <td class="spacer">&nbsp;</td>
371
+ <td>6</td>
372
+ <td>6</td>
373
+ <td>0</td>
374
+ <td class="spacer">&nbsp;</td>
375
+ <td data-ratio="0 6">0%</td>
376
+ </tr>
377
+ <tr class="region">
378
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
379
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
380
+ <td class="spacer">&nbsp;</td>
381
+ <td>43</td>
382
+ <td>43</td>
383
+ <td>0</td>
384
+ <td class="spacer">&nbsp;</td>
385
+ <td data-ratio="0 43">0%</td>
386
+ </tr>
387
+ <tr class="region">
388
+ <td class="name"><a href="z_357ee38f49d3e320_tiny_person_py.html#t29">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;tiny_person.py</a></td>
389
+ <td class="name"><a href="z_357ee38f49d3e320_tiny_person_py.html#t29"><data value='TinyPerson'>TinyPerson</data></a></td>
390
+ <td class="spacer">&nbsp;</td>
391
+ <td>471</td>
392
+ <td>471</td>
393
+ <td>0</td>
394
+ <td class="spacer">&nbsp;</td>
395
+ <td data-ratio="0 471">0%</td>
396
+ </tr>
397
+ <tr class="region">
398
+ <td class="name"><a href="z_357ee38f49d3e320_tiny_person_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;tiny_person.py</a></td>
399
+ <td class="name"><a href="z_357ee38f49d3e320_tiny_person_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
400
+ <td class="spacer">&nbsp;</td>
401
+ <td>147</td>
402
+ <td>147</td>
403
+ <td>0</td>
404
+ <td class="spacer">&nbsp;</td>
405
+ <td data-ratio="0 147">0%</td>
406
+ </tr>
407
+ <tr class="region">
408
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t22">tinytroupe&#8201;/&#8201;control.py</a></td>
409
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t22"><data value='Simulation'>Simulation</data></a></td>
410
+ <td class="spacer">&nbsp;</td>
411
+ <td>179</td>
412
+ <td>179</td>
413
+ <td>0</td>
414
+ <td class="spacer">&nbsp;</td>
415
+ <td data-ratio="0 179">0%</td>
416
+ </tr>
417
+ <tr class="region">
418
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t501">tinytroupe&#8201;/&#8201;control.py</a></td>
419
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t501"><data value='Transaction'>Transaction</data></a></td>
420
+ <td class="spacer">&nbsp;</td>
421
+ <td>115</td>
422
+ <td>115</td>
423
+ <td>0</td>
424
+ <td class="spacer">&nbsp;</td>
425
+ <td data-ratio="0 115">0%</td>
426
+ </tr>
427
+ <tr class="region">
428
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t755">tinytroupe&#8201;/&#8201;control.py</a></td>
429
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t755"><data value='SkipTransaction'>SkipTransaction</data></a></td>
430
+ <td class="spacer">&nbsp;</td>
431
+ <td>0</td>
432
+ <td>0</td>
433
+ <td>0</td>
434
+ <td class="spacer">&nbsp;</td>
435
+ <td data-ratio="0 0">100%</td>
436
+ </tr>
437
+ <tr class="region">
438
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t758">tinytroupe&#8201;/&#8201;control.py</a></td>
439
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t758"><data value='CacheOutOfSync'>CacheOutOfSync</data></a></td>
440
+ <td class="spacer">&nbsp;</td>
441
+ <td>0</td>
442
+ <td>0</td>
443
+ <td>0</td>
444
+ <td class="spacer">&nbsp;</td>
445
+ <td data-ratio="0 0">100%</td>
446
+ </tr>
447
+ <tr class="region">
448
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t764">tinytroupe&#8201;/&#8201;control.py</a></td>
449
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html#t764"><data value='ExecutionCached'>ExecutionCached</data></a></td>
450
+ <td class="spacer">&nbsp;</td>
451
+ <td>0</td>
452
+ <td>0</td>
453
+ <td>0</td>
454
+ <td class="spacer">&nbsp;</td>
455
+ <td data-ratio="0 0">100%</td>
456
+ </tr>
457
+ <tr class="region">
458
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html">tinytroupe&#8201;/&#8201;control.py</a></td>
459
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
460
+ <td class="spacer">&nbsp;</td>
461
+ <td>91</td>
462
+ <td>27</td>
463
+ <td>0</td>
464
+ <td class="spacer">&nbsp;</td>
465
+ <td data-ratio="64 91">70%</td>
466
+ </tr>
467
+ <tr class="region">
468
+ <td class="name"><a href="z_37eec20419a3fd46___init___py.html">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;__init__.py</a></td>
469
+ <td class="name"><a href="z_37eec20419a3fd46___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
470
+ <td class="spacer">&nbsp;</td>
471
+ <td>5</td>
472
+ <td>5</td>
473
+ <td>0</td>
474
+ <td class="spacer">&nbsp;</td>
475
+ <td data-ratio="0 5">0%</td>
476
+ </tr>
477
+ <tr class="region">
478
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_enricher_py.html#t8">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_enricher.py</a></td>
479
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_enricher_py.html#t8"><data value='TinyEnricher'>TinyEnricher</data></a></td>
480
+ <td class="spacer">&nbsp;</td>
481
+ <td>13</td>
482
+ <td>13</td>
483
+ <td>0</td>
484
+ <td class="spacer">&nbsp;</td>
485
+ <td data-ratio="0 13">0%</td>
486
+ </tr>
487
+ <tr class="region">
488
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_enricher_py.html">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_enricher.py</a></td>
489
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_enricher_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
490
+ <td class="spacer">&nbsp;</td>
491
+ <td>7</td>
492
+ <td>7</td>
493
+ <td>0</td>
494
+ <td class="spacer">&nbsp;</td>
495
+ <td data-ratio="0 7">0%</td>
496
+ </tr>
497
+ <tr class="region">
498
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_styler_py.html#t7">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_styler.py</a></td>
499
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_styler_py.html#t7"><data value='TinyStyler'>TinyStyler</data></a></td>
500
+ <td class="spacer">&nbsp;</td>
501
+ <td>19</td>
502
+ <td>19</td>
503
+ <td>0</td>
504
+ <td class="spacer">&nbsp;</td>
505
+ <td data-ratio="0 19">0%</td>
506
+ </tr>
507
+ <tr class="region">
508
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_styler_py.html">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_styler.py</a></td>
509
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_styler_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
510
+ <td class="spacer">&nbsp;</td>
511
+ <td>7</td>
512
+ <td>7</td>
513
+ <td>0</td>
514
+ <td class="spacer">&nbsp;</td>
515
+ <td data-ratio="0 7">0%</td>
516
+ </tr>
517
+ <tr class="region">
518
+ <td class="name"><a href="z_93fcbcbc09a08040___init___py.html">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;__init__.py</a></td>
519
+ <td class="name"><a href="z_93fcbcbc09a08040___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
520
+ <td class="spacer">&nbsp;</td>
521
+ <td>6</td>
522
+ <td>6</td>
523
+ <td>0</td>
524
+ <td class="spacer">&nbsp;</td>
525
+ <td data-ratio="0 6">0%</td>
526
+ </tr>
527
+ <tr class="region">
528
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_social_network_py.html#t16">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;tiny_social_network.py</a></td>
529
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_social_network_py.html#t16"><data value='TinySocialNetwork'>TinySocialNetwork</data></a></td>
530
+ <td class="spacer">&nbsp;</td>
531
+ <td>31</td>
532
+ <td>31</td>
533
+ <td>0</td>
534
+ <td class="spacer">&nbsp;</td>
535
+ <td data-ratio="0 31">0%</td>
536
+ </tr>
537
+ <tr class="region">
538
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_social_network_py.html">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;tiny_social_network.py</a></td>
539
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_social_network_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
540
+ <td class="spacer">&nbsp;</td>
541
+ <td>20</td>
542
+ <td>20</td>
543
+ <td>0</td>
544
+ <td class="spacer">&nbsp;</td>
545
+ <td data-ratio="0 20">0%</td>
546
+ </tr>
547
+ <tr class="region">
548
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_world_py.html#t21">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;tiny_world.py</a></td>
549
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_world_py.html#t21"><data value='TinyWorld'>TinyWorld</data></a></td>
550
+ <td class="spacer">&nbsp;</td>
551
+ <td>253</td>
552
+ <td>253</td>
553
+ <td>0</td>
554
+ <td class="spacer">&nbsp;</td>
555
+ <td data-ratio="0 253">0%</td>
556
+ </tr>
557
+ <tr class="region">
558
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_world_py.html">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;tiny_world.py</a></td>
559
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_world_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
560
+ <td class="spacer">&nbsp;</td>
561
+ <td>89</td>
562
+ <td>89</td>
563
+ <td>0</td>
564
+ <td class="spacer">&nbsp;</td>
565
+ <td data-ratio="0 89">0%</td>
566
+ </tr>
567
+ <tr class="region">
568
+ <td class="name"><a href="z_6bd7109c20672ac0___init___py.html">tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;__init__.py</a></td>
569
+ <td class="name"><a href="z_6bd7109c20672ac0___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
570
+ <td class="spacer">&nbsp;</td>
571
+ <td>5</td>
572
+ <td>5</td>
573
+ <td>0</td>
574
+ <td class="spacer">&nbsp;</td>
575
+ <td data-ratio="0 5">0%</td>
576
+ </tr>
577
+ <tr class="region">
578
+ <td class="name"><a href="z_6bd7109c20672ac0_agents_py.html">tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;agents.py</a></td>
579
+ <td class="name"><a href="z_6bd7109c20672ac0_agents_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
580
+ <td class="spacer">&nbsp;</td>
581
+ <td>55</td>
582
+ <td>55</td>
583
+ <td>0</td>
584
+ <td class="spacer">&nbsp;</td>
585
+ <td data-ratio="0 55">0%</td>
586
+ </tr>
587
+ <tr class="region">
588
+ <td class="name"><a href="z_6bd7109c20672ac0_loaders_py.html">tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;loaders.py</a></td>
589
+ <td class="name"><a href="z_6bd7109c20672ac0_loaders_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
590
+ <td class="spacer">&nbsp;</td>
591
+ <td>10</td>
592
+ <td>10</td>
593
+ <td>0</td>
594
+ <td class="spacer">&nbsp;</td>
595
+ <td data-ratio="0 10">0%</td>
596
+ </tr>
597
+ <tr class="region">
598
+ <td class="name"><a href="z_bc1132832c822a8b___init___py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;__init__.py</a></td>
599
+ <td class="name"><a href="z_bc1132832c822a8b___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
600
+ <td class="spacer">&nbsp;</td>
601
+ <td>6</td>
602
+ <td>6</td>
603
+ <td>0</td>
604
+ <td class="spacer">&nbsp;</td>
605
+ <td data-ratio="0 6">0%</td>
606
+ </tr>
607
+ <tr class="region">
608
+ <td class="name"><a href="z_bc1132832c822a8b_in_place_experiment_runner_py.html#t8">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;in_place_experiment_runner.py</a></td>
609
+ <td class="name"><a href="z_bc1132832c822a8b_in_place_experiment_runner_py.html#t8"><data value='InPlaceExperimentRunner'>InPlaceExperimentRunner</data></a></td>
610
+ <td class="spacer">&nbsp;</td>
611
+ <td>105</td>
612
+ <td>105</td>
613
+ <td>0</td>
614
+ <td class="spacer">&nbsp;</td>
615
+ <td data-ratio="0 105">0%</td>
616
+ </tr>
617
+ <tr class="region">
618
+ <td class="name"><a href="z_bc1132832c822a8b_in_place_experiment_runner_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;in_place_experiment_runner.py</a></td>
619
+ <td class="name"><a href="z_bc1132832c822a8b_in_place_experiment_runner_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
620
+ <td class="spacer">&nbsp;</td>
621
+ <td>21</td>
622
+ <td>21</td>
623
+ <td>0</td>
624
+ <td class="spacer">&nbsp;</td>
625
+ <td data-ratio="0 21">0%</td>
626
+ </tr>
627
+ <tr class="region">
628
+ <td class="name"><a href="z_bc1132832c822a8b_proposition_py.html#t12">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;proposition.py</a></td>
629
+ <td class="name"><a href="z_bc1132832c822a8b_proposition_py.html#t12"><data value='Proposition'>Proposition</data></a></td>
630
+ <td class="spacer">&nbsp;</td>
631
+ <td>108</td>
632
+ <td>108</td>
633
+ <td>0</td>
634
+ <td class="spacer">&nbsp;</td>
635
+ <td data-ratio="0 108">0%</td>
636
+ </tr>
637
+ <tr class="region">
638
+ <td class="name"><a href="z_bc1132832c822a8b_proposition_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;proposition.py</a></td>
639
+ <td class="name"><a href="z_bc1132832c822a8b_proposition_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
640
+ <td class="spacer">&nbsp;</td>
641
+ <td>28</td>
642
+ <td>28</td>
643
+ <td>0</td>
644
+ <td class="spacer">&nbsp;</td>
645
+ <td data-ratio="0 28">0%</td>
646
+ </tr>
647
+ <tr class="region">
648
+ <td class="name"><a href="z_bc1132832c822a8b_randomization_py.html#t5">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;randomization.py</a></td>
649
+ <td class="name"><a href="z_bc1132832c822a8b_randomization_py.html#t5"><data value='ABRandomizer'>ABRandomizer</data></a></td>
650
+ <td class="spacer">&nbsp;</td>
651
+ <td>34</td>
652
+ <td>34</td>
653
+ <td>0</td>
654
+ <td class="spacer">&nbsp;</td>
655
+ <td data-ratio="0 34">0%</td>
656
+ </tr>
657
+ <tr class="region">
658
+ <td class="name"><a href="z_bc1132832c822a8b_randomization_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;randomization.py</a></td>
659
+ <td class="name"><a href="z_bc1132832c822a8b_randomization_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
660
+ <td class="spacer">&nbsp;</td>
661
+ <td>8</td>
662
+ <td>8</td>
663
+ <td>0</td>
664
+ <td class="spacer">&nbsp;</td>
665
+ <td data-ratio="0 8">0%</td>
666
+ </tr>
667
+ <tr class="region">
668
+ <td class="name"><a href="z_bc1132832c822a8b_statistical_tests_py.html#t8">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;statistical_tests.py</a></td>
669
+ <td class="name"><a href="z_bc1132832c822a8b_statistical_tests_py.html#t8"><data value='StatisticalTester'>StatisticalTester</data></a></td>
670
+ <td class="spacer">&nbsp;</td>
671
+ <td>196</td>
672
+ <td>196</td>
673
+ <td>0</td>
674
+ <td class="spacer">&nbsp;</td>
675
+ <td data-ratio="0 196">0%</td>
676
+ </tr>
677
+ <tr class="region">
678
+ <td class="name"><a href="z_bc1132832c822a8b_statistical_tests_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;statistical_tests.py</a></td>
679
+ <td class="name"><a href="z_bc1132832c822a8b_statistical_tests_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
680
+ <td class="spacer">&nbsp;</td>
681
+ <td>40</td>
682
+ <td>40</td>
683
+ <td>0</td>
684
+ <td class="spacer">&nbsp;</td>
685
+ <td data-ratio="0 40">0%</td>
686
+ </tr>
687
+ <tr class="region">
688
+ <td class="name"><a href="z_1008c76b8ac6114d___init___py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;__init__.py</a></td>
689
+ <td class="name"><a href="z_1008c76b8ac6114d___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
690
+ <td class="spacer">&nbsp;</td>
691
+ <td>8</td>
692
+ <td>8</td>
693
+ <td>0</td>
694
+ <td class="spacer">&nbsp;</td>
695
+ <td data-ratio="0 8">0%</td>
696
+ </tr>
697
+ <tr class="region">
698
+ <td class="name"><a href="z_1008c76b8ac6114d_artifact_exporter_py.html#t13">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;artifact_exporter.py</a></td>
699
+ <td class="name"><a href="z_1008c76b8ac6114d_artifact_exporter_py.html#t13"><data value='ArtifactExporter'>ArtifactExporter</data></a></td>
700
+ <td class="spacer">&nbsp;</td>
701
+ <td>47</td>
702
+ <td>47</td>
703
+ <td>0</td>
704
+ <td class="spacer">&nbsp;</td>
705
+ <td data-ratio="0 47">0%</td>
706
+ </tr>
707
+ <tr class="region">
708
+ <td class="name"><a href="z_1008c76b8ac6114d_artifact_exporter_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;artifact_exporter.py</a></td>
709
+ <td class="name"><a href="z_1008c76b8ac6114d_artifact_exporter_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
710
+ <td class="spacer">&nbsp;</td>
711
+ <td>16</td>
712
+ <td>16</td>
713
+ <td>0</td>
714
+ <td class="spacer">&nbsp;</td>
715
+ <td data-ratio="0 16">0%</td>
716
+ </tr>
717
+ <tr class="region">
718
+ <td class="name"><a href="z_1008c76b8ac6114d_normalizer_py.html#t8">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;normalizer.py</a></td>
719
+ <td class="name"><a href="z_1008c76b8ac6114d_normalizer_py.html#t8"><data value='Normalizer'>Normalizer</data></a></td>
720
+ <td class="spacer">&nbsp;</td>
721
+ <td>44</td>
722
+ <td>44</td>
723
+ <td>0</td>
724
+ <td class="spacer">&nbsp;</td>
725
+ <td data-ratio="0 44">0%</td>
726
+ </tr>
727
+ <tr class="region">
728
+ <td class="name"><a href="z_1008c76b8ac6114d_normalizer_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;normalizer.py</a></td>
729
+ <td class="name"><a href="z_1008c76b8ac6114d_normalizer_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
730
+ <td class="spacer">&nbsp;</td>
731
+ <td>8</td>
732
+ <td>8</td>
733
+ <td>0</td>
734
+ <td class="spacer">&nbsp;</td>
735
+ <td data-ratio="0 8">0%</td>
736
+ </tr>
737
+ <tr class="region">
738
+ <td class="name"><a href="z_1008c76b8ac6114d_results_extractor_py.html#t15">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_extractor.py</a></td>
739
+ <td class="name"><a href="z_1008c76b8ac6114d_results_extractor_py.html#t15"><data value='ResultsExtractor'>ResultsExtractor</data></a></td>
740
+ <td class="spacer">&nbsp;</td>
741
+ <td>70</td>
742
+ <td>70</td>
743
+ <td>0</td>
744
+ <td class="spacer">&nbsp;</td>
745
+ <td data-ratio="0 70">0%</td>
746
+ </tr>
747
+ <tr class="region">
748
+ <td class="name"><a href="z_1008c76b8ac6114d_results_extractor_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_extractor.py</a></td>
749
+ <td class="name"><a href="z_1008c76b8ac6114d_results_extractor_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
750
+ <td class="spacer">&nbsp;</td>
751
+ <td>17</td>
752
+ <td>17</td>
753
+ <td>0</td>
754
+ <td class="spacer">&nbsp;</td>
755
+ <td data-ratio="0 17">0%</td>
756
+ </tr>
757
+ <tr class="region">
758
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reducer_py.html#t7">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reducer.py</a></td>
759
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reducer_py.html#t7"><data value='ResultsReducer'>ResultsReducer</data></a></td>
760
+ <td class="spacer">&nbsp;</td>
761
+ <td>31</td>
762
+ <td>31</td>
763
+ <td>0</td>
764
+ <td class="spacer">&nbsp;</td>
765
+ <td data-ratio="0 31">0%</td>
766
+ </tr>
767
+ <tr class="region">
768
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reducer_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reducer.py</a></td>
769
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reducer_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
770
+ <td class="spacer">&nbsp;</td>
771
+ <td>8</td>
772
+ <td>8</td>
773
+ <td>0</td>
774
+ <td class="spacer">&nbsp;</td>
775
+ <td data-ratio="0 8">0%</td>
776
+ </tr>
777
+ <tr class="region">
778
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reporter_py.html#t14">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reporter.py</a></td>
779
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reporter_py.html#t14"><data value='ResultsReporter'>ResultsReporter</data></a></td>
780
+ <td class="spacer">&nbsp;</td>
781
+ <td>99</td>
782
+ <td>99</td>
783
+ <td>0</td>
784
+ <td class="spacer">&nbsp;</td>
785
+ <td data-ratio="0 99">0%</td>
786
+ </tr>
787
+ <tr class="region">
788
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reporter_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reporter.py</a></td>
789
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reporter_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
790
+ <td class="spacer">&nbsp;</td>
791
+ <td>24</td>
792
+ <td>24</td>
793
+ <td>0</td>
794
+ <td class="spacer">&nbsp;</td>
795
+ <td data-ratio="0 24">0%</td>
796
+ </tr>
797
+ <tr class="region">
798
+ <td class="name"><a href="z_e17597f0ca69c4c3___init___py.html">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;__init__.py</a></td>
799
+ <td class="name"><a href="z_e17597f0ca69c4c3___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
800
+ <td class="spacer">&nbsp;</td>
801
+ <td>6</td>
802
+ <td>6</td>
803
+ <td>0</td>
804
+ <td class="spacer">&nbsp;</td>
805
+ <td data-ratio="0 6">0%</td>
806
+ </tr>
807
+ <tr class="region">
808
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_factory_py.html#t7">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;tiny_factory.py</a></td>
809
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_factory_py.html#t7"><data value='TinyFactory'>TinyFactory</data></a></td>
810
+ <td class="spacer">&nbsp;</td>
811
+ <td>18</td>
812
+ <td>18</td>
813
+ <td>0</td>
814
+ <td class="spacer">&nbsp;</td>
815
+ <td data-ratio="0 18">0%</td>
816
+ </tr>
817
+ <tr class="region">
818
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_factory_py.html">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;tiny_factory.py</a></td>
819
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_factory_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
820
+ <td class="spacer">&nbsp;</td>
821
+ <td>19</td>
822
+ <td>19</td>
823
+ <td>0</td>
824
+ <td class="spacer">&nbsp;</td>
825
+ <td data-ratio="0 19">0%</td>
826
+ </tr>
827
+ <tr class="region">
828
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_person_factory_py.html#t25">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;tiny_person_factory.py</a></td>
829
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_person_factory_py.html#t25"><data value='TinyPersonFactory'>TinyPersonFactory</data></a></td>
830
+ <td class="spacer">&nbsp;</td>
831
+ <td>207</td>
832
+ <td>207</td>
833
+ <td>4</td>
834
+ <td class="spacer">&nbsp;</td>
835
+ <td data-ratio="0 207">0%</td>
836
+ </tr>
837
+ <tr class="region">
838
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_person_factory_py.html">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;tiny_person_factory.py</a></td>
839
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_person_factory_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
840
+ <td class="spacer">&nbsp;</td>
841
+ <td>61</td>
842
+ <td>61</td>
843
+ <td>0</td>
844
+ <td class="spacer">&nbsp;</td>
845
+ <td data-ratio="0 61">0%</td>
846
+ </tr>
847
+ <tr class="region">
848
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t26">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
849
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t26"><data value='OpenAIClient'>OpenAIClient</data></a></td>
850
+ <td class="spacer">&nbsp;</td>
851
+ <td>124</td>
852
+ <td>119</td>
853
+ <td>0</td>
854
+ <td class="spacer">&nbsp;</td>
855
+ <td data-ratio="5 124">4%</td>
856
+ </tr>
857
+ <tr class="region">
858
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t387">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
859
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t387"><data value='AzureClient'>AzureClient</data></a></td>
860
+ <td class="spacer">&nbsp;</td>
861
+ <td>10</td>
862
+ <td>8</td>
863
+ <td>0</td>
864
+ <td class="spacer">&nbsp;</td>
865
+ <td data-ratio="2 10">20%</td>
866
+ </tr>
867
+ <tr class="region">
868
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t417">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
869
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t417"><data value='HelmholtzBlabladorClient'>HelmholtzBlabladorClient</data></a></td>
870
+ <td class="spacer">&nbsp;</td>
871
+ <td>3</td>
872
+ <td>1</td>
873
+ <td>0</td>
874
+ <td class="spacer">&nbsp;</td>
875
+ <td data-ratio="2 3">67%</td>
876
+ </tr>
877
+ <tr class="region">
878
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t435">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
879
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t435"><data value='InvalidRequestError'>InvalidRequestError</data></a></td>
880
+ <td class="spacer">&nbsp;</td>
881
+ <td>0</td>
882
+ <td>0</td>
883
+ <td>0</td>
884
+ <td class="spacer">&nbsp;</td>
885
+ <td data-ratio="0 0">100%</td>
886
+ </tr>
887
+ <tr class="region">
888
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t441">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
889
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html#t441"><data value='NonTerminalError'>NonTerminalError</data></a></td>
890
+ <td class="spacer">&nbsp;</td>
891
+ <td>0</td>
892
+ <td>0</td>
893
+ <td>0</td>
894
+ <td class="spacer">&nbsp;</td>
895
+ <td data-ratio="0 0">100%</td>
896
+ </tr>
897
+ <tr class="region">
898
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
899
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
900
+ <td class="spacer">&nbsp;</td>
901
+ <td>61</td>
902
+ <td>10</td>
903
+ <td>0</td>
904
+ <td class="spacer">&nbsp;</td>
905
+ <td data-ratio="51 61">84%</td>
906
+ </tr>
907
+ <tr class="region">
908
+ <td class="name"><a href="z_8e144f0c9fd03088_profiling_py.html#t24">tinytroupe&#8201;/&#8201;profiling.py</a></td>
909
+ <td class="name"><a href="z_8e144f0c9fd03088_profiling_py.html#t24"><data value='Profiler'>Profiler</data></a></td>
910
+ <td class="spacer">&nbsp;</td>
911
+ <td>346</td>
912
+ <td>346</td>
913
+ <td>0</td>
914
+ <td class="spacer">&nbsp;</td>
915
+ <td data-ratio="0 346">0%</td>
916
+ </tr>
917
+ <tr class="region">
918
+ <td class="name"><a href="z_8e144f0c9fd03088_profiling_py.html">tinytroupe&#8201;/&#8201;profiling.py</a></td>
919
+ <td class="name"><a href="z_8e144f0c9fd03088_profiling_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
920
+ <td class="spacer">&nbsp;</td>
921
+ <td>40</td>
922
+ <td>40</td>
923
+ <td>0</td>
924
+ <td class="spacer">&nbsp;</td>
925
+ <td data-ratio="0 40">0%</td>
926
+ </tr>
927
+ <tr class="region">
928
+ <td class="name"><a href="z_13b615ba9b634dc5___init___py.html">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;__init__.py</a></td>
929
+ <td class="name"><a href="z_13b615ba9b634dc5___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
930
+ <td class="spacer">&nbsp;</td>
931
+ <td>5</td>
932
+ <td>5</td>
933
+ <td>0</td>
934
+ <td class="spacer">&nbsp;</td>
935
+ <td data-ratio="0 5">0%</td>
936
+ </tr>
937
+ <tr class="region">
938
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html#t12">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;intervention.py</a></td>
939
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html#t12"><data value='InterventionBatch'>InterventionBatch</data></a></td>
940
+ <td class="spacer">&nbsp;</td>
941
+ <td>15</td>
942
+ <td>15</td>
943
+ <td>0</td>
944
+ <td class="spacer">&nbsp;</td>
945
+ <td data-ratio="0 15">0%</td>
946
+ </tr>
947
+ <tr class="region">
948
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html#t49">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;intervention.py</a></td>
949
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html#t49"><data value='Intervention'>Intervention</data></a></td>
950
+ <td class="spacer">&nbsp;</td>
951
+ <td>65</td>
952
+ <td>65</td>
953
+ <td>0</td>
954
+ <td class="spacer">&nbsp;</td>
955
+ <td data-ratio="0 65">0%</td>
956
+ </tr>
957
+ <tr class="region">
958
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;intervention.py</a></td>
959
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
960
+ <td class="spacer">&nbsp;</td>
961
+ <td>30</td>
962
+ <td>30</td>
963
+ <td>0</td>
964
+ <td class="spacer">&nbsp;</td>
965
+ <td data-ratio="0 30">0%</td>
966
+ </tr>
967
+ <tr class="region">
968
+ <td class="name"><a href="z_13b615ba9b634dc5_tiny_story_py.html#t9">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;tiny_story.py</a></td>
969
+ <td class="name"><a href="z_13b615ba9b634dc5_tiny_story_py.html#t9"><data value='TinyStory'>TinyStory</data></a></td>
970
+ <td class="spacer">&nbsp;</td>
971
+ <td>31</td>
972
+ <td>31</td>
973
+ <td>0</td>
974
+ <td class="spacer">&nbsp;</td>
975
+ <td data-ratio="0 31">0%</td>
976
+ </tr>
977
+ <tr class="region">
978
+ <td class="name"><a href="z_13b615ba9b634dc5_tiny_story_py.html">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;tiny_story.py</a></td>
979
+ <td class="name"><a href="z_13b615ba9b634dc5_tiny_story_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
980
+ <td class="spacer">&nbsp;</td>
981
+ <td>11</td>
982
+ <td>11</td>
983
+ <td>0</td>
984
+ <td class="spacer">&nbsp;</td>
985
+ <td data-ratio="0 11">0%</td>
986
+ </tr>
987
+ <tr class="region">
988
+ <td class="name"><a href="z_8ff660fc2daa80e3___init___py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;__init__.py</a></td>
989
+ <td class="name"><a href="z_8ff660fc2daa80e3___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
990
+ <td class="spacer">&nbsp;</td>
991
+ <td>6</td>
992
+ <td>6</td>
993
+ <td>0</td>
994
+ <td class="spacer">&nbsp;</td>
995
+ <td data-ratio="0 6">0%</td>
996
+ </tr>
997
+ <tr class="region">
998
+ <td class="name"><a href="z_8ff660fc2daa80e3_browser_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;browser.py</a></td>
999
+ <td class="name"><a href="z_8ff660fc2daa80e3_browser_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1000
+ <td class="spacer">&nbsp;</td>
1001
+ <td>20</td>
1002
+ <td>20</td>
1003
+ <td>0</td>
1004
+ <td class="spacer">&nbsp;</td>
1005
+ <td data-ratio="0 20">0%</td>
1006
+ </tr>
1007
+ <tr class="region">
1008
+ <td class="name"><a href="z_8ff660fc2daa80e3_sequential_thinking_py.html#t6">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;sequential_thinking.py</a></td>
1009
+ <td class="name"><a href="z_8ff660fc2daa80e3_sequential_thinking_py.html#t6"><data value='SequentialThinkingTool'>SequentialThinkingTool</data></a></td>
1010
+ <td class="spacer">&nbsp;</td>
1011
+ <td>32</td>
1012
+ <td>32</td>
1013
+ <td>0</td>
1014
+ <td class="spacer">&nbsp;</td>
1015
+ <td data-ratio="0 32">0%</td>
1016
+ </tr>
1017
+ <tr class="region">
1018
+ <td class="name"><a href="z_8ff660fc2daa80e3_sequential_thinking_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;sequential_thinking.py</a></td>
1019
+ <td class="name"><a href="z_8ff660fc2daa80e3_sequential_thinking_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1020
+ <td class="spacer">&nbsp;</td>
1021
+ <td>10</td>
1022
+ <td>10</td>
1023
+ <td>0</td>
1024
+ <td class="spacer">&nbsp;</td>
1025
+ <td data-ratio="0 10">0%</td>
1026
+ </tr>
1027
+ <tr class="region">
1028
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_calendar_py.html#t10">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_calendar.py</a></td>
1029
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_calendar_py.html#t10"><data value='TinyCalendar'>TinyCalendar</data></a></td>
1030
+ <td class="spacer">&nbsp;</td>
1031
+ <td>17</td>
1032
+ <td>17</td>
1033
+ <td>0</td>
1034
+ <td class="spacer">&nbsp;</td>
1035
+ <td data-ratio="0 17">0%</td>
1036
+ </tr>
1037
+ <tr class="region">
1038
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_calendar_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_calendar.py</a></td>
1039
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_calendar_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1040
+ <td class="spacer">&nbsp;</td>
1041
+ <td>11</td>
1042
+ <td>11</td>
1043
+ <td>0</td>
1044
+ <td class="spacer">&nbsp;</td>
1045
+ <td data-ratio="0 11">0%</td>
1046
+ </tr>
1047
+ <tr class="region">
1048
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_tool_py.html#t5">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_tool.py</a></td>
1049
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_tool_py.html#t5"><data value='TinyTool'>TinyTool</data></a></td>
1050
+ <td class="spacer">&nbsp;</td>
1051
+ <td>17</td>
1052
+ <td>17</td>
1053
+ <td>0</td>
1054
+ <td class="spacer">&nbsp;</td>
1055
+ <td data-ratio="0 17">0%</td>
1056
+ </tr>
1057
+ <tr class="region">
1058
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_tool_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_tool.py</a></td>
1059
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_tool_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1060
+ <td class="spacer">&nbsp;</td>
1061
+ <td>12</td>
1062
+ <td>12</td>
1063
+ <td>0</td>
1064
+ <td class="spacer">&nbsp;</td>
1065
+ <td data-ratio="0 12">0%</td>
1066
+ </tr>
1067
+ <tr class="region">
1068
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_word_processor_py.html#t9">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_word_processor.py</a></td>
1069
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_word_processor_py.html#t9"><data value='TinyWordProcessor'>TinyWordProcessor</data></a></td>
1070
+ <td class="spacer">&nbsp;</td>
1071
+ <td>33</td>
1072
+ <td>33</td>
1073
+ <td>0</td>
1074
+ <td class="spacer">&nbsp;</td>
1075
+ <td data-ratio="0 33">0%</td>
1076
+ </tr>
1077
+ <tr class="region">
1078
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_word_processor_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_word_processor.py</a></td>
1079
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_word_processor_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1080
+ <td class="spacer">&nbsp;</td>
1081
+ <td>9</td>
1082
+ <td>9</td>
1083
+ <td>0</td>
1084
+ <td class="spacer">&nbsp;</td>
1085
+ <td data-ratio="0 9">0%</td>
1086
+ </tr>
1087
+ <tr class="region">
1088
+ <td class="name"><a href="z_1dd26f6f54202fea___init___py.html">tinytroupe&#8201;/&#8201;ui&#8201;/&#8201;__init__.py</a></td>
1089
+ <td class="name"><a href="z_1dd26f6f54202fea___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1090
+ <td class="spacer">&nbsp;</td>
1091
+ <td>2</td>
1092
+ <td>2</td>
1093
+ <td>0</td>
1094
+ <td class="spacer">&nbsp;</td>
1095
+ <td data-ratio="0 2">0%</td>
1096
+ </tr>
1097
+ <tr class="region">
1098
+ <td class="name"><a href="z_1dd26f6f54202fea_jupyter_widgets_py.html#t40">tinytroupe&#8201;/&#8201;ui&#8201;/&#8201;jupyter_widgets.py</a></td>
1099
+ <td class="name"><a href="z_1dd26f6f54202fea_jupyter_widgets_py.html#t40"><data value='AgentChatJupyterWidget'>AgentChatJupyterWidget</data></a></td>
1100
+ <td class="spacer">&nbsp;</td>
1101
+ <td>104</td>
1102
+ <td>104</td>
1103
+ <td>0</td>
1104
+ <td class="spacer">&nbsp;</td>
1105
+ <td data-ratio="0 104">0%</td>
1106
+ </tr>
1107
+ <tr class="region">
1108
+ <td class="name"><a href="z_1dd26f6f54202fea_jupyter_widgets_py.html">tinytroupe&#8201;/&#8201;ui&#8201;/&#8201;jupyter_widgets.py</a></td>
1109
+ <td class="name"><a href="z_1dd26f6f54202fea_jupyter_widgets_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1110
+ <td class="spacer">&nbsp;</td>
1111
+ <td>17</td>
1112
+ <td>17</td>
1113
+ <td>0</td>
1114
+ <td class="spacer">&nbsp;</td>
1115
+ <td data-ratio="0 17">0%</td>
1116
+ </tr>
1117
+ <tr class="region">
1118
+ <td class="name"><a href="z_4b3d0d3b603de221___init___py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;__init__.py</a></td>
1119
+ <td class="name"><a href="z_4b3d0d3b603de221___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1120
+ <td class="spacer">&nbsp;</td>
1121
+ <td>11</td>
1122
+ <td>0</td>
1123
+ <td>0</td>
1124
+ <td class="spacer">&nbsp;</td>
1125
+ <td data-ratio="11 11">100%</td>
1126
+ </tr>
1127
+ <tr class="region">
1128
+ <td class="name"><a href="z_4b3d0d3b603de221_behavior_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;behavior.py</a></td>
1129
+ <td class="name"><a href="z_4b3d0d3b603de221_behavior_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1130
+ <td class="spacer">&nbsp;</td>
1131
+ <td>11</td>
1132
+ <td>9</td>
1133
+ <td>0</td>
1134
+ <td class="spacer">&nbsp;</td>
1135
+ <td data-ratio="2 11">18%</td>
1136
+ </tr>
1137
+ <tr class="region">
1138
+ <td class="name"><a href="z_4b3d0d3b603de221_config_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;config.py</a></td>
1139
+ <td class="name"><a href="z_4b3d0d3b603de221_config_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1140
+ <td class="spacer">&nbsp;</td>
1141
+ <td>65</td>
1142
+ <td>10</td>
1143
+ <td>0</td>
1144
+ <td class="spacer">&nbsp;</td>
1145
+ <td data-ratio="55 65">85%</td>
1146
+ </tr>
1147
+ <tr class="region">
1148
+ <td class="name"><a href="z_4b3d0d3b603de221_json_py.html#t7">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;json.py</a></td>
1149
+ <td class="name"><a href="z_4b3d0d3b603de221_json_py.html#t7"><data value='JsonSerializableRegistry'>JsonSerializableRegistry</data></a></td>
1150
+ <td class="spacer">&nbsp;</td>
1151
+ <td>111</td>
1152
+ <td>111</td>
1153
+ <td>0</td>
1154
+ <td class="spacer">&nbsp;</td>
1155
+ <td data-ratio="0 111">0%</td>
1156
+ </tr>
1157
+ <tr class="region">
1158
+ <td class="name"><a href="z_4b3d0d3b603de221_json_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;json.py</a></td>
1159
+ <td class="name"><a href="z_4b3d0d3b603de221_json_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1160
+ <td class="spacer">&nbsp;</td>
1161
+ <td>56</td>
1162
+ <td>38</td>
1163
+ <td>0</td>
1164
+ <td class="spacer">&nbsp;</td>
1165
+ <td data-ratio="18 56">32%</td>
1166
+ </tr>
1167
+ <tr class="region">
1168
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html#t62">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;llm.py</a></td>
1169
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html#t62"><data value='LLMScalarWithJustificationResponse'>LLMScalarWithJustificationResponse</data></a></td>
1170
+ <td class="spacer">&nbsp;</td>
1171
+ <td>0</td>
1172
+ <td>0</td>
1173
+ <td>0</td>
1174
+ <td class="spacer">&nbsp;</td>
1175
+ <td data-ratio="0 0">100%</td>
1176
+ </tr>
1177
+ <tr class="region">
1178
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html#t74">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;llm.py</a></td>
1179
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html#t74"><data value='LLMScalarWithJustificationAndReasoningResponse'>LLMScalarWithJustificationAndReasoningResponse</data></a></td>
1180
+ <td class="spacer">&nbsp;</td>
1181
+ <td>0</td>
1182
+ <td>0</td>
1183
+ <td>0</td>
1184
+ <td class="spacer">&nbsp;</td>
1185
+ <td data-ratio="0 0">100%</td>
1186
+ </tr>
1187
+ <tr class="region">
1188
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html#t97">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;llm.py</a></td>
1189
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html#t97"><data value='LLMChat'>LLMChat</data></a></td>
1190
+ <td class="spacer">&nbsp;</td>
1191
+ <td>237</td>
1192
+ <td>237</td>
1193
+ <td>0</td>
1194
+ <td class="spacer">&nbsp;</td>
1195
+ <td data-ratio="0 237">0%</td>
1196
+ </tr>
1197
+ <tr class="region">
1198
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;llm.py</a></td>
1199
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1200
+ <td class="spacer">&nbsp;</td>
1201
+ <td>178</td>
1202
+ <td>103</td>
1203
+ <td>0</td>
1204
+ <td class="spacer">&nbsp;</td>
1205
+ <td data-ratio="75 178">42%</td>
1206
+ </tr>
1207
+ <tr class="region">
1208
+ <td class="name"><a href="z_4b3d0d3b603de221_logger_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;logger.py</a></td>
1209
+ <td class="name"><a href="z_4b3d0d3b603de221_logger_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1210
+ <td class="spacer">&nbsp;</td>
1211
+ <td>26</td>
1212
+ <td>26</td>
1213
+ <td>0</td>
1214
+ <td class="spacer">&nbsp;</td>
1215
+ <td data-ratio="0 26">0%</td>
1216
+ </tr>
1217
+ <tr class="region">
1218
+ <td class="name"><a href="z_4b3d0d3b603de221_misc_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;misc.py</a></td>
1219
+ <td class="name"><a href="z_4b3d0d3b603de221_misc_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1220
+ <td class="spacer">&nbsp;</td>
1221
+ <td>27</td>
1222
+ <td>16</td>
1223
+ <td>0</td>
1224
+ <td class="spacer">&nbsp;</td>
1225
+ <td data-ratio="11 27">41%</td>
1226
+ </tr>
1227
+ <tr class="region">
1228
+ <td class="name"><a href="z_4b3d0d3b603de221_parallel_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;parallel.py</a></td>
1229
+ <td class="name"><a href="z_4b3d0d3b603de221_parallel_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1230
+ <td class="spacer">&nbsp;</td>
1231
+ <td>22</td>
1232
+ <td>13</td>
1233
+ <td>0</td>
1234
+ <td class="spacer">&nbsp;</td>
1235
+ <td data-ratio="9 22">41%</td>
1236
+ </tr>
1237
+ <tr class="region">
1238
+ <td class="name"><a href="z_4b3d0d3b603de221_rendering_py.html#t75">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;rendering.py</a></td>
1239
+ <td class="name"><a href="z_4b3d0d3b603de221_rendering_py.html#t75"><data value='RichTextStyle'>RichTextStyle</data></a></td>
1240
+ <td class="spacer">&nbsp;</td>
1241
+ <td>16</td>
1242
+ <td>16</td>
1243
+ <td>0</td>
1244
+ <td class="spacer">&nbsp;</td>
1245
+ <td data-ratio="0 16">0%</td>
1246
+ </tr>
1247
+ <tr class="region">
1248
+ <td class="name"><a href="z_4b3d0d3b603de221_rendering_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;rendering.py</a></td>
1249
+ <td class="name"><a href="z_4b3d0d3b603de221_rendering_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1250
+ <td class="spacer">&nbsp;</td>
1251
+ <td>41</td>
1252
+ <td>17</td>
1253
+ <td>0</td>
1254
+ <td class="spacer">&nbsp;</td>
1255
+ <td data-ratio="24 41">59%</td>
1256
+ </tr>
1257
+ <tr class="region">
1258
+ <td class="name"><a href="z_4b3d0d3b603de221_semantics_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;semantics.py</a></td>
1259
+ <td class="name"><a href="z_4b3d0d3b603de221_semantics_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1260
+ <td class="spacer">&nbsp;</td>
1261
+ <td>17</td>
1262
+ <td>0</td>
1263
+ <td>0</td>
1264
+ <td class="spacer">&nbsp;</td>
1265
+ <td data-ratio="17 17">100%</td>
1266
+ </tr>
1267
+ <tr class="region">
1268
+ <td class="name"><a href="z_4b3d0d3b603de221_validation_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;validation.py</a></td>
1269
+ <td class="name"><a href="z_4b3d0d3b603de221_validation_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1270
+ <td class="spacer">&nbsp;</td>
1271
+ <td>27</td>
1272
+ <td>18</td>
1273
+ <td>0</td>
1274
+ <td class="spacer">&nbsp;</td>
1275
+ <td data-ratio="9 27">33%</td>
1276
+ </tr>
1277
+ <tr class="region">
1278
+ <td class="name"><a href="z_96a307234d1981d5___init___py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;__init__.py</a></td>
1279
+ <td class="name"><a href="z_96a307234d1981d5___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1280
+ <td class="spacer">&nbsp;</td>
1281
+ <td>6</td>
1282
+ <td>6</td>
1283
+ <td>0</td>
1284
+ <td class="spacer">&nbsp;</td>
1285
+ <td data-ratio="0 6">0%</td>
1286
+ </tr>
1287
+ <tr class="region">
1288
+ <td class="name"><a href="z_96a307234d1981d5_propositions_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;propositions.py</a></td>
1289
+ <td class="name"><a href="z_96a307234d1981d5_propositions_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1290
+ <td class="spacer">&nbsp;</td>
1291
+ <td>25</td>
1292
+ <td>25</td>
1293
+ <td>0</td>
1294
+ <td class="spacer">&nbsp;</td>
1295
+ <td data-ratio="0 25">0%</td>
1296
+ </tr>
1297
+ <tr class="region">
1298
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t24">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
1299
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t24"><data value='SimulationExperimentDataset'>SimulationExperimentDataset</data></a></td>
1300
+ <td class="spacer">&nbsp;</td>
1301
+ <td>326</td>
1302
+ <td>326</td>
1303
+ <td>0</td>
1304
+ <td class="spacer">&nbsp;</td>
1305
+ <td data-ratio="0 326">0%</td>
1306
+ </tr>
1307
+ <tr class="region">
1308
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t68">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
1309
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t68"><data value='Config'>SimulationExperimentDataset.Config</data></a></td>
1310
+ <td class="spacer">&nbsp;</td>
1311
+ <td>0</td>
1312
+ <td>0</td>
1313
+ <td>0</td>
1314
+ <td class="spacer">&nbsp;</td>
1315
+ <td data-ratio="0 0">100%</td>
1316
+ </tr>
1317
+ <tr class="region">
1318
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t709">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
1319
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t709"><data value='SimulationExperimentEmpiricalValidationResult'>SimulationExperimentEmpiricalValidationResult</data></a></td>
1320
+ <td class="spacer">&nbsp;</td>
1321
+ <td>0</td>
1322
+ <td>0</td>
1323
+ <td>0</td>
1324
+ <td class="spacer">&nbsp;</td>
1325
+ <td data-ratio="0 0">100%</td>
1326
+ </tr>
1327
+ <tr class="region">
1328
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t735">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
1329
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t735"><data value='Config'>SimulationExperimentEmpiricalValidationResult.Config</data></a></td>
1330
+ <td class="spacer">&nbsp;</td>
1331
+ <td>0</td>
1332
+ <td>0</td>
1333
+ <td>0</td>
1334
+ <td class="spacer">&nbsp;</td>
1335
+ <td data-ratio="0 0">100%</td>
1336
+ </tr>
1337
+ <tr class="region">
1338
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t741">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
1339
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html#t741"><data value='SimulationExperimentEmpiricalValidator'>SimulationExperimentEmpiricalValidator</data></a></td>
1340
+ <td class="spacer">&nbsp;</td>
1341
+ <td>555</td>
1342
+ <td>555</td>
1343
+ <td>0</td>
1344
+ <td class="spacer">&nbsp;</td>
1345
+ <td data-ratio="0 555">0%</td>
1346
+ </tr>
1347
+ <tr class="region">
1348
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
1349
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1350
+ <td class="spacer">&nbsp;</td>
1351
+ <td>105</td>
1352
+ <td>105</td>
1353
+ <td>0</td>
1354
+ <td class="spacer">&nbsp;</td>
1355
+ <td data-ratio="0 105">0%</td>
1356
+ </tr>
1357
+ <tr class="region">
1358
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html#t17">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;tiny_person_validator.py</a></td>
1359
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html#t17"><data value='ValidationResponse'>ValidationResponse</data></a></td>
1360
+ <td class="spacer">&nbsp;</td>
1361
+ <td>0</td>
1362
+ <td>0</td>
1363
+ <td>0</td>
1364
+ <td class="spacer">&nbsp;</td>
1365
+ <td data-ratio="0 0">100%</td>
1366
+ </tr>
1367
+ <tr class="region">
1368
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html#t26">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;tiny_person_validator.py</a></td>
1369
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html#t26"><data value='TinyPersonValidator'>TinyPersonValidator</data></a></td>
1370
+ <td class="spacer">&nbsp;</td>
1371
+ <td>37</td>
1372
+ <td>37</td>
1373
+ <td>0</td>
1374
+ <td class="spacer">&nbsp;</td>
1375
+ <td data-ratio="0 37">0%</td>
1376
+ </tr>
1377
+ <tr class="region">
1378
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;tiny_person_validator.py</a></td>
1379
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1380
+ <td class="spacer">&nbsp;</td>
1381
+ <td>20</td>
1382
+ <td>20</td>
1383
+ <td>0</td>
1384
+ <td class="spacer">&nbsp;</td>
1385
+ <td data-ratio="0 20">0%</td>
1386
+ </tr>
1387
+ <tr class="region">
1388
+ <td class="name"><a href="z_96a307234d1981d5_validation_chamber_py.html#t4">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;validation_chamber.py</a></td>
1389
+ <td class="name"><a href="z_96a307234d1981d5_validation_chamber_py.html#t4"><data value='ValidationChamber'>ValidationChamber</data></a></td>
1390
+ <td class="spacer">&nbsp;</td>
1391
+ <td>0</td>
1392
+ <td>0</td>
1393
+ <td>0</td>
1394
+ <td class="spacer">&nbsp;</td>
1395
+ <td data-ratio="0 0">100%</td>
1396
+ </tr>
1397
+ <tr class="region">
1398
+ <td class="name"><a href="z_96a307234d1981d5_validation_chamber_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;validation_chamber.py</a></td>
1399
+ <td class="name"><a href="z_96a307234d1981d5_validation_chamber_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
1400
+ <td class="spacer">&nbsp;</td>
1401
+ <td>2</td>
1402
+ <td>2</td>
1403
+ <td>0</td>
1404
+ <td class="spacer">&nbsp;</td>
1405
+ <td data-ratio="0 2">0%</td>
1406
+ </tr>
1407
+ </tbody>
1408
+ <tfoot>
1409
+ <tr class="total">
1410
+ <td class="name">Total</td>
1411
+ <td class="name">&nbsp;</td>
1412
+ <td class="spacer">&nbsp;</td>
1413
+ <td>6623</td>
1414
+ <td>6186</td>
1415
+ <td>5</td>
1416
+ <td class="spacer">&nbsp;</td>
1417
+ <td data-ratio="437 6623">7%</td>
1418
+ </tr>
1419
+ </tfoot>
1420
+ </table>
1421
+ <p id="no_rows">
1422
+ No items found using the specified filter.
1423
+ </p>
1424
+ </main>
1425
+ <footer>
1426
+ <div class="content">
1427
+ <p>
1428
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
1429
+ created at 2026-02-28 17:48 +0000
1430
+ </p>
1431
+ </div>
1432
+ <aside class="hidden">
1433
+ <a id="prevFileLink" class="nav" href=""></a>
1434
+ <a id="nextFileLink" class="nav" href=""></a>
1435
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
1436
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
1437
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
1438
+ </aside>
1439
+ </footer>
1440
+ </body>
1441
+ </html>
htmlcov/coverage_html_cb_dd2e7eb5.js ADDED
@@ -0,0 +1,735 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
2
+ // For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt
3
+
4
+ // Coverage.py HTML report browser code.
5
+ /*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
6
+ /*global coverage: true, document, window, $ */
7
+
8
+ coverage = {};
9
+
10
+ // General helpers
11
+ function debounce(callback, wait) {
12
+ let timeoutId = null;
13
+ return function(...args) {
14
+ clearTimeout(timeoutId);
15
+ timeoutId = setTimeout(() => {
16
+ callback.apply(this, args);
17
+ }, wait);
18
+ };
19
+ };
20
+
21
+ function checkVisible(element) {
22
+ const rect = element.getBoundingClientRect();
23
+ const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight);
24
+ const viewTop = 30;
25
+ return !(rect.bottom < viewTop || rect.top >= viewBottom);
26
+ }
27
+
28
+ function on_click(sel, fn) {
29
+ const elt = document.querySelector(sel);
30
+ if (elt) {
31
+ elt.addEventListener("click", fn);
32
+ }
33
+ }
34
+
35
+ // Helpers for table sorting
36
+ function getCellValue(row, column = 0) {
37
+ const cell = row.cells[column] // nosemgrep: eslint.detect-object-injection
38
+ if (cell.childElementCount == 1) {
39
+ var child = cell.firstElementChild;
40
+ if (child.tagName === "A") {
41
+ child = child.firstElementChild;
42
+ }
43
+ if (child instanceof HTMLDataElement && child.value) {
44
+ return child.value;
45
+ }
46
+ }
47
+ return cell.innerText || cell.textContent;
48
+ }
49
+
50
+ function rowComparator(rowA, rowB, column = 0) {
51
+ let valueA = getCellValue(rowA, column);
52
+ let valueB = getCellValue(rowB, column);
53
+ if (!isNaN(valueA) && !isNaN(valueB)) {
54
+ return valueA - valueB;
55
+ }
56
+ return valueA.localeCompare(valueB, undefined, {numeric: true});
57
+ }
58
+
59
+ function sortColumn(th) {
60
+ // Get the current sorting direction of the selected header,
61
+ // clear state on other headers and then set the new sorting direction.
62
+ const currentSortOrder = th.getAttribute("aria-sort");
63
+ [...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none"));
64
+ var direction;
65
+ if (currentSortOrder === "none") {
66
+ direction = th.dataset.defaultSortOrder || "ascending";
67
+ }
68
+ else if (currentSortOrder === "ascending") {
69
+ direction = "descending";
70
+ }
71
+ else {
72
+ direction = "ascending";
73
+ }
74
+ th.setAttribute("aria-sort", direction);
75
+
76
+ const column = [...th.parentElement.cells].indexOf(th)
77
+
78
+ // Sort all rows and afterwards append them in order to move them in the DOM.
79
+ Array.from(th.closest("table").querySelectorAll("tbody tr"))
80
+ .sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (direction === "ascending" ? 1 : -1))
81
+ .forEach(tr => tr.parentElement.appendChild(tr));
82
+
83
+ // Save the sort order for next time.
84
+ if (th.id !== "region") {
85
+ let th_id = "file"; // Sort by file if we don't have a column id
86
+ let current_direction = direction;
87
+ const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE);
88
+ if (stored_list) {
89
+ ({th_id, direction} = JSON.parse(stored_list))
90
+ }
91
+ localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({
92
+ "th_id": th.id,
93
+ "direction": current_direction
94
+ }));
95
+ if (th.id !== th_id || document.getElementById("region")) {
96
+ // Sort column has changed, unset sorting by function or class.
97
+ localStorage.setItem(coverage.SORTED_BY_REGION, JSON.stringify({
98
+ "by_region": false,
99
+ "region_direction": current_direction
100
+ }));
101
+ }
102
+ }
103
+ else {
104
+ // Sort column has changed to by function or class, remember that.
105
+ localStorage.setItem(coverage.SORTED_BY_REGION, JSON.stringify({
106
+ "by_region": true,
107
+ "region_direction": direction
108
+ }));
109
+ }
110
+ }
111
+
112
+ // Find all the elements with data-shortcut attribute, and use them to assign a shortcut key.
113
+ coverage.assign_shortkeys = function () {
114
+ document.querySelectorAll("[data-shortcut]").forEach(element => {
115
+ document.addEventListener("keypress", event => {
116
+ if (event.target.tagName.toLowerCase() === "input") {
117
+ return; // ignore keypress from search filter
118
+ }
119
+ if (event.key === element.dataset.shortcut) {
120
+ element.click();
121
+ }
122
+ });
123
+ });
124
+ };
125
+
126
+ // Create the events for the filter box.
127
+ coverage.wire_up_filter = function () {
128
+ // Populate the filter and hide100 inputs if there are saved values for them.
129
+ const saved_filter_value = localStorage.getItem(coverage.FILTER_STORAGE);
130
+ if (saved_filter_value) {
131
+ document.getElementById("filter").value = saved_filter_value;
132
+ }
133
+ const saved_hide100_value = localStorage.getItem(coverage.HIDE100_STORAGE);
134
+ if (saved_hide100_value) {
135
+ document.getElementById("hide100").checked = JSON.parse(saved_hide100_value);
136
+ }
137
+
138
+ // Cache elements.
139
+ const table = document.querySelector("table.index");
140
+ const table_body_rows = table.querySelectorAll("tbody tr");
141
+ const no_rows = document.getElementById("no_rows");
142
+
143
+ const footer = table.tFoot.rows[0];
144
+ const ratio_columns = Array.from(footer.cells).map(cell => Boolean(cell.dataset.ratio));
145
+
146
+ // Observe filter keyevents.
147
+ const filter_handler = (event => {
148
+ // Keep running total of each metric, first index contains number of shown rows
149
+ const totals = ratio_columns.map(
150
+ is_ratio => is_ratio ? {"numer": 0, "denom": 0} : 0
151
+ );
152
+
153
+ var text = document.getElementById("filter").value;
154
+ // Store filter value
155
+ localStorage.setItem(coverage.FILTER_STORAGE, text);
156
+ const casefold = (text === text.toLowerCase());
157
+ const hide100 = document.getElementById("hide100").checked;
158
+ // Store hide value.
159
+ localStorage.setItem(coverage.HIDE100_STORAGE, JSON.stringify(hide100));
160
+
161
+ // Hide / show elements.
162
+ table_body_rows.forEach(row => {
163
+ var show = false;
164
+ // Check the text filter.
165
+ for (let column = 0; column < totals.length; column++) {
166
+ cell = row.cells[column];
167
+ if (cell.classList.contains("name")) {
168
+ var celltext = cell.textContent;
169
+ if (casefold) {
170
+ celltext = celltext.toLowerCase();
171
+ }
172
+ if (celltext.includes(text)) {
173
+ show = true;
174
+ }
175
+ }
176
+ }
177
+
178
+ // Check the "hide covered" filter.
179
+ if (show && hide100) {
180
+ const [numer, denom] = row.cells[row.cells.length - 1].dataset.ratio.split(" ");
181
+ show = (numer !== denom);
182
+ }
183
+
184
+ if (!show) {
185
+ // hide
186
+ row.classList.add("hidden");
187
+ return;
188
+ }
189
+
190
+ // show
191
+ row.classList.remove("hidden");
192
+ totals[0]++;
193
+
194
+ for (let column = 0; column < totals.length; column++) {
195
+ // Accumulate dynamic totals
196
+ cell = row.cells[column] // nosemgrep: eslint.detect-object-injection
197
+ if (cell.matches(".name, .spacer")) {
198
+ continue;
199
+ }
200
+ if (ratio_columns[column] && cell.dataset.ratio) {
201
+ // Column stores a ratio
202
+ const [numer, denom] = cell.dataset.ratio.split(" ");
203
+ totals[column]["numer"] += parseInt(numer, 10); // nosemgrep: eslint.detect-object-injection
204
+ totals[column]["denom"] += parseInt(denom, 10); // nosemgrep: eslint.detect-object-injection
205
+ }
206
+ else {
207
+ totals[column] += parseInt(cell.textContent, 10); // nosemgrep: eslint.detect-object-injection
208
+ }
209
+ }
210
+ });
211
+
212
+ // Show placeholder if no rows will be displayed.
213
+ if (!totals[0]) {
214
+ // Show placeholder, hide table.
215
+ no_rows.style.display = "block";
216
+ table.style.display = "none";
217
+ return;
218
+ }
219
+
220
+ // Hide placeholder, show table.
221
+ no_rows.style.display = null;
222
+ table.style.display = null;
223
+
224
+ // Calculate new dynamic sum values based on visible rows.
225
+ for (let column = 0; column < totals.length; column++) {
226
+ // Get footer cell element.
227
+ const cell = footer.cells[column]; // nosemgrep: eslint.detect-object-injection
228
+ if (cell.matches(".name, .spacer")) {
229
+ continue;
230
+ }
231
+
232
+ // Set value into dynamic footer cell element.
233
+ if (ratio_columns[column]) {
234
+ // Percentage column uses the numerator and denominator,
235
+ // and adapts to the number of decimal places.
236
+ const match = /\.([0-9]+)/.exec(cell.textContent);
237
+ const places = match ? match[1].length : 0;
238
+ const { numer, denom } = totals[column]; // nosemgrep: eslint.detect-object-injection
239
+ cell.dataset.ratio = `${numer} ${denom}`;
240
+ // Check denom to prevent NaN if filtered files contain no statements
241
+ cell.textContent = denom
242
+ ? `${(numer * 100 / denom).toFixed(places)}%`
243
+ : `${(100).toFixed(places)}%`;
244
+ }
245
+ else {
246
+ cell.textContent = totals[column]; // nosemgrep: eslint.detect-object-injection
247
+ }
248
+ }
249
+ });
250
+
251
+ document.getElementById("filter").addEventListener("input", debounce(filter_handler));
252
+ document.getElementById("hide100").addEventListener("input", debounce(filter_handler));
253
+
254
+ // Trigger change event on setup, to force filter on page refresh
255
+ // (filter value may still be present).
256
+ document.getElementById("filter").dispatchEvent(new Event("input"));
257
+ document.getElementById("hide100").dispatchEvent(new Event("input"));
258
+ };
259
+ coverage.FILTER_STORAGE = "COVERAGE_FILTER_VALUE";
260
+ coverage.HIDE100_STORAGE = "COVERAGE_HIDE100_VALUE";
261
+
262
+ // Set up the click-to-sort columns.
263
+ coverage.wire_up_sorting = function () {
264
+ document.querySelectorAll("[data-sortable] th[aria-sort]").forEach(
265
+ th => th.addEventListener("click", e => sortColumn(e.target))
266
+ );
267
+
268
+ // Look for a localStorage item containing previous sort settings:
269
+ let th_id = "file", direction = "ascending";
270
+ const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE);
271
+ if (stored_list) {
272
+ ({th_id, direction} = JSON.parse(stored_list));
273
+ }
274
+ let by_region = false, region_direction = "ascending";
275
+ const sorted_by_region = localStorage.getItem(coverage.SORTED_BY_REGION);
276
+ if (sorted_by_region) {
277
+ ({
278
+ by_region,
279
+ region_direction
280
+ } = JSON.parse(sorted_by_region));
281
+ }
282
+
283
+ const region_id = "region";
284
+ if (by_region && document.getElementById(region_id)) {
285
+ direction = region_direction;
286
+ }
287
+ // If we are in a page that has a column with id of "region", sort on
288
+ // it if the last sort was by function or class.
289
+ let th;
290
+ if (document.getElementById(region_id)) {
291
+ th = document.getElementById(by_region ? region_id : th_id);
292
+ }
293
+ else {
294
+ th = document.getElementById(th_id);
295
+ }
296
+ th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending");
297
+ th.click()
298
+ };
299
+
300
+ coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2";
301
+ coverage.SORTED_BY_REGION = "COVERAGE_SORT_REGION";
302
+
303
+ // Loaded on index.html
304
+ coverage.index_ready = function () {
305
+ coverage.assign_shortkeys();
306
+ coverage.wire_up_filter();
307
+ coverage.wire_up_sorting();
308
+
309
+ on_click(".button_prev_file", coverage.to_prev_file);
310
+ on_click(".button_next_file", coverage.to_next_file);
311
+
312
+ on_click(".button_show_hide_help", coverage.show_hide_help);
313
+ };
314
+
315
+ // -- pyfile stuff --
316
+
317
+ coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS";
318
+
319
+ coverage.pyfile_ready = function () {
320
+ // If we're directed to a particular line number, highlight the line.
321
+ var frag = location.hash;
322
+ if (frag.length > 2 && frag[1] === "t") {
323
+ document.querySelector(frag).closest(".n").classList.add("highlight");
324
+ coverage.set_sel(parseInt(frag.substr(2), 10));
325
+ }
326
+ else {
327
+ coverage.set_sel(0);
328
+ }
329
+
330
+ on_click(".button_toggle_run", coverage.toggle_lines);
331
+ on_click(".button_toggle_mis", coverage.toggle_lines);
332
+ on_click(".button_toggle_exc", coverage.toggle_lines);
333
+ on_click(".button_toggle_par", coverage.toggle_lines);
334
+
335
+ on_click(".button_next_chunk", coverage.to_next_chunk_nicely);
336
+ on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely);
337
+ on_click(".button_top_of_page", coverage.to_top);
338
+ on_click(".button_first_chunk", coverage.to_first_chunk);
339
+
340
+ on_click(".button_prev_file", coverage.to_prev_file);
341
+ on_click(".button_next_file", coverage.to_next_file);
342
+ on_click(".button_to_index", coverage.to_index);
343
+
344
+ on_click(".button_show_hide_help", coverage.show_hide_help);
345
+
346
+ coverage.filters = undefined;
347
+ try {
348
+ coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE);
349
+ } catch(err) {}
350
+
351
+ if (coverage.filters) {
352
+ coverage.filters = JSON.parse(coverage.filters);
353
+ }
354
+ else {
355
+ coverage.filters = {run: false, exc: true, mis: true, par: true};
356
+ }
357
+
358
+ for (cls in coverage.filters) {
359
+ coverage.set_line_visibilty(cls, coverage.filters[cls]); // nosemgrep: eslint.detect-object-injection
360
+ }
361
+
362
+ coverage.assign_shortkeys();
363
+ coverage.init_scroll_markers();
364
+ coverage.wire_up_sticky_header();
365
+
366
+ document.querySelectorAll("[id^=ctxs]").forEach(
367
+ cbox => cbox.addEventListener("click", coverage.expand_contexts)
368
+ );
369
+
370
+ // Rebuild scroll markers when the window height changes.
371
+ window.addEventListener("resize", coverage.build_scroll_markers);
372
+ };
373
+
374
+ coverage.toggle_lines = function (event) {
375
+ const btn = event.target.closest("button");
376
+ const category = btn.value
377
+ const show = !btn.classList.contains("show_" + category);
378
+ coverage.set_line_visibilty(category, show);
379
+ coverage.build_scroll_markers();
380
+ coverage.filters[category] = show;
381
+ try {
382
+ localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters));
383
+ } catch(err) {}
384
+ };
385
+
386
+ coverage.set_line_visibilty = function (category, should_show) {
387
+ const cls = "show_" + category;
388
+ const btn = document.querySelector(".button_toggle_" + category);
389
+ if (btn) {
390
+ if (should_show) {
391
+ document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls));
392
+ btn.classList.add(cls);
393
+ }
394
+ else {
395
+ document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls));
396
+ btn.classList.remove(cls);
397
+ }
398
+ }
399
+ };
400
+
401
+ // Return the nth line div.
402
+ coverage.line_elt = function (n) {
403
+ return document.getElementById("t" + n)?.closest("p");
404
+ };
405
+
406
+ // Set the selection. b and e are line numbers.
407
+ coverage.set_sel = function (b, e) {
408
+ // The first line selected.
409
+ coverage.sel_begin = b;
410
+ // The next line not selected.
411
+ coverage.sel_end = (e === undefined) ? b+1 : e;
412
+ };
413
+
414
+ coverage.to_top = function () {
415
+ coverage.set_sel(0, 1);
416
+ coverage.scroll_window(0);
417
+ };
418
+
419
+ coverage.to_first_chunk = function () {
420
+ coverage.set_sel(0, 1);
421
+ coverage.to_next_chunk();
422
+ };
423
+
424
+ coverage.to_prev_file = function () {
425
+ window.location = document.getElementById("prevFileLink").href;
426
+ }
427
+
428
+ coverage.to_next_file = function () {
429
+ window.location = document.getElementById("nextFileLink").href;
430
+ }
431
+
432
+ coverage.to_index = function () {
433
+ location.href = document.getElementById("indexLink").href;
434
+ }
435
+
436
+ coverage.show_hide_help = function () {
437
+ const helpCheck = document.getElementById("help_panel_state")
438
+ helpCheck.checked = !helpCheck.checked;
439
+ }
440
+
441
+ // Return a string indicating what kind of chunk this line belongs to,
442
+ // or null if not a chunk.
443
+ coverage.chunk_indicator = function (line_elt) {
444
+ const classes = line_elt?.className;
445
+ if (!classes) {
446
+ return null;
447
+ }
448
+ const match = classes.match(/\bshow_\w+\b/);
449
+ if (!match) {
450
+ return null;
451
+ }
452
+ return match[0];
453
+ };
454
+
455
+ coverage.to_next_chunk = function () {
456
+ const c = coverage;
457
+
458
+ // Find the start of the next colored chunk.
459
+ var probe = c.sel_end;
460
+ var chunk_indicator, probe_line;
461
+ while (true) {
462
+ probe_line = c.line_elt(probe);
463
+ if (!probe_line) {
464
+ return;
465
+ }
466
+ chunk_indicator = c.chunk_indicator(probe_line);
467
+ if (chunk_indicator) {
468
+ break;
469
+ }
470
+ probe++;
471
+ }
472
+
473
+ // There's a next chunk, `probe` points to it.
474
+ var begin = probe;
475
+
476
+ // Find the end of this chunk.
477
+ var next_indicator = chunk_indicator;
478
+ while (next_indicator === chunk_indicator) {
479
+ probe++;
480
+ probe_line = c.line_elt(probe);
481
+ next_indicator = c.chunk_indicator(probe_line);
482
+ }
483
+ c.set_sel(begin, probe);
484
+ c.show_selection();
485
+ };
486
+
487
+ coverage.to_prev_chunk = function () {
488
+ const c = coverage;
489
+
490
+ // Find the end of the prev colored chunk.
491
+ var probe = c.sel_begin-1;
492
+ var probe_line = c.line_elt(probe);
493
+ if (!probe_line) {
494
+ return;
495
+ }
496
+ var chunk_indicator = c.chunk_indicator(probe_line);
497
+ while (probe > 1 && !chunk_indicator) {
498
+ probe--;
499
+ probe_line = c.line_elt(probe);
500
+ if (!probe_line) {
501
+ return;
502
+ }
503
+ chunk_indicator = c.chunk_indicator(probe_line);
504
+ }
505
+
506
+ // There's a prev chunk, `probe` points to its last line.
507
+ var end = probe+1;
508
+
509
+ // Find the beginning of this chunk.
510
+ var prev_indicator = chunk_indicator;
511
+ while (prev_indicator === chunk_indicator) {
512
+ probe--;
513
+ if (probe <= 0) {
514
+ return;
515
+ }
516
+ probe_line = c.line_elt(probe);
517
+ prev_indicator = c.chunk_indicator(probe_line);
518
+ }
519
+ c.set_sel(probe+1, end);
520
+ c.show_selection();
521
+ };
522
+
523
+ // Returns 0, 1, or 2: how many of the two ends of the selection are on
524
+ // the screen right now?
525
+ coverage.selection_ends_on_screen = function () {
526
+ if (coverage.sel_begin === 0) {
527
+ return 0;
528
+ }
529
+
530
+ const begin = coverage.line_elt(coverage.sel_begin);
531
+ const end = coverage.line_elt(coverage.sel_end-1);
532
+
533
+ return (
534
+ (checkVisible(begin) ? 1 : 0)
535
+ + (checkVisible(end) ? 1 : 0)
536
+ );
537
+ };
538
+
539
+ coverage.to_next_chunk_nicely = function () {
540
+ if (coverage.selection_ends_on_screen() === 0) {
541
+ // The selection is entirely off the screen:
542
+ // Set the top line on the screen as selection.
543
+
544
+ // This will select the top-left of the viewport
545
+ // As this is most likely the span with the line number we take the parent
546
+ const line = document.elementFromPoint(0, 0).parentElement;
547
+ if (line.parentElement !== document.getElementById("source")) {
548
+ // The element is not a source line but the header or similar
549
+ coverage.select_line_or_chunk(1);
550
+ }
551
+ else {
552
+ // We extract the line number from the id
553
+ coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10));
554
+ }
555
+ }
556
+ coverage.to_next_chunk();
557
+ };
558
+
559
+ coverage.to_prev_chunk_nicely = function () {
560
+ if (coverage.selection_ends_on_screen() === 0) {
561
+ // The selection is entirely off the screen:
562
+ // Set the lowest line on the screen as selection.
563
+
564
+ // This will select the bottom-left of the viewport
565
+ // As this is most likely the span with the line number we take the parent
566
+ const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement;
567
+ if (line.parentElement !== document.getElementById("source")) {
568
+ // The element is not a source line but the header or similar
569
+ coverage.select_line_or_chunk(coverage.lines_len);
570
+ }
571
+ else {
572
+ // We extract the line number from the id
573
+ coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10));
574
+ }
575
+ }
576
+ coverage.to_prev_chunk();
577
+ };
578
+
579
+ // Select line number lineno, or if it is in a colored chunk, select the
580
+ // entire chunk
581
+ coverage.select_line_or_chunk = function (lineno) {
582
+ var c = coverage;
583
+ var probe_line = c.line_elt(lineno);
584
+ if (!probe_line) {
585
+ return;
586
+ }
587
+ var the_indicator = c.chunk_indicator(probe_line);
588
+ if (the_indicator) {
589
+ // The line is in a highlighted chunk.
590
+ // Search backward for the first line.
591
+ var probe = lineno;
592
+ var indicator = the_indicator;
593
+ while (probe > 0 && indicator === the_indicator) {
594
+ probe--;
595
+ probe_line = c.line_elt(probe);
596
+ if (!probe_line) {
597
+ break;
598
+ }
599
+ indicator = c.chunk_indicator(probe_line);
600
+ }
601
+ var begin = probe + 1;
602
+
603
+ // Search forward for the last line.
604
+ probe = lineno;
605
+ indicator = the_indicator;
606
+ while (indicator === the_indicator) {
607
+ probe++;
608
+ probe_line = c.line_elt(probe);
609
+ indicator = c.chunk_indicator(probe_line);
610
+ }
611
+
612
+ coverage.set_sel(begin, probe);
613
+ }
614
+ else {
615
+ coverage.set_sel(lineno);
616
+ }
617
+ };
618
+
619
+ coverage.show_selection = function () {
620
+ // Highlight the lines in the chunk
621
+ document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight"));
622
+ for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) {
623
+ coverage.line_elt(probe).querySelector(".n").classList.add("highlight");
624
+ }
625
+
626
+ coverage.scroll_to_selection();
627
+ };
628
+
629
+ coverage.scroll_to_selection = function () {
630
+ // Scroll the page if the chunk isn't fully visible.
631
+ if (coverage.selection_ends_on_screen() < 2) {
632
+ const element = coverage.line_elt(coverage.sel_begin);
633
+ coverage.scroll_window(element.offsetTop - 60);
634
+ }
635
+ };
636
+
637
+ coverage.scroll_window = function (to_pos) {
638
+ window.scroll({top: to_pos, behavior: "smooth"});
639
+ };
640
+
641
+ coverage.init_scroll_markers = function () {
642
+ // Init some variables
643
+ coverage.lines_len = document.querySelectorAll("#source > p").length;
644
+
645
+ // Build html
646
+ coverage.build_scroll_markers();
647
+ };
648
+
649
+ coverage.build_scroll_markers = function () {
650
+ const temp_scroll_marker = document.getElementById("scroll_marker")
651
+ if (temp_scroll_marker) temp_scroll_marker.remove();
652
+ // Don't build markers if the window has no scroll bar.
653
+ if (document.body.scrollHeight <= window.innerHeight) {
654
+ return;
655
+ }
656
+
657
+ const marker_scale = window.innerHeight / document.body.scrollHeight;
658
+ const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10);
659
+
660
+ let previous_line = -99, last_mark, last_top;
661
+
662
+ const scroll_marker = document.createElement("div");
663
+ scroll_marker.id = "scroll_marker";
664
+ document.getElementById("source").querySelectorAll(
665
+ "p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par"
666
+ ).forEach(element => {
667
+ const line_top = Math.floor(element.offsetTop * marker_scale);
668
+ const line_number = parseInt(element.querySelector(".n a").id.substr(1));
669
+
670
+ if (line_number === previous_line + 1) {
671
+ // If this solid missed block just make previous mark higher.
672
+ last_mark.style.height = `${line_top + line_height - last_top}px`;
673
+ }
674
+ else {
675
+ // Add colored line in scroll_marker block.
676
+ last_mark = document.createElement("div");
677
+ last_mark.id = `m${line_number}`;
678
+ last_mark.classList.add("marker");
679
+ last_mark.style.height = `${line_height}px`;
680
+ last_mark.style.top = `${line_top}px`;
681
+ scroll_marker.append(last_mark);
682
+ last_top = line_top;
683
+ }
684
+
685
+ previous_line = line_number;
686
+ });
687
+
688
+ // Append last to prevent layout calculation
689
+ document.body.append(scroll_marker);
690
+ };
691
+
692
+ coverage.wire_up_sticky_header = function () {
693
+ const header = document.querySelector("header");
694
+ const header_bottom = (
695
+ header.querySelector(".content h2").getBoundingClientRect().top -
696
+ header.getBoundingClientRect().top
697
+ );
698
+
699
+ function updateHeader() {
700
+ if (window.scrollY > header_bottom) {
701
+ header.classList.add("sticky");
702
+ }
703
+ else {
704
+ header.classList.remove("sticky");
705
+ }
706
+ }
707
+
708
+ window.addEventListener("scroll", updateHeader);
709
+ updateHeader();
710
+ };
711
+
712
+ coverage.expand_contexts = function (e) {
713
+ var ctxs = e.target.parentNode.querySelector(".ctxs");
714
+
715
+ if (!ctxs.classList.contains("expanded")) {
716
+ var ctxs_text = ctxs.textContent;
717
+ var width = Number(ctxs_text[0]);
718
+ ctxs.textContent = "";
719
+ for (var i = 1; i < ctxs_text.length; i += width) {
720
+ key = ctxs_text.substring(i, i + width).trim();
721
+ ctxs.appendChild(document.createTextNode(contexts[key]));
722
+ ctxs.appendChild(document.createElement("br"));
723
+ }
724
+ ctxs.classList.add("expanded");
725
+ }
726
+ };
727
+
728
+ document.addEventListener("DOMContentLoaded", () => {
729
+ if (document.body.classList.contains("indexfile")) {
730
+ coverage.index_ready();
731
+ }
732
+ else {
733
+ coverage.pyfile_ready();
734
+ }
735
+ });
htmlcov/favicon_32_cb_c827f16f.png ADDED
htmlcov/function_index.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/index.html ADDED
@@ -0,0 +1,657 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage report</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="indexfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>Coverage report:
14
+ <span class="pc_cov">7%</span>
15
+ </h1>
16
+ <aside id="help_panel_wrapper">
17
+ <input id="help_panel_state" type="checkbox">
18
+ <label for="help_panel_state">
19
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
20
+ </label>
21
+ <div id="help_panel">
22
+ <p class="legend">Shortcuts on this page</p>
23
+ <div class="keyhelp">
24
+ <p>
25
+ <kbd>f</kbd>
26
+ <kbd>s</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ <kbd>c</kbd>
30
+ &nbsp; change column sorting
31
+ </p>
32
+ <p>
33
+ <kbd>[</kbd>
34
+ <kbd>]</kbd>
35
+ &nbsp; prev/next file
36
+ </p>
37
+ <p>
38
+ <kbd>?</kbd> &nbsp; show/hide this help
39
+ </p>
40
+ </div>
41
+ </div>
42
+ </aside>
43
+ <form id="filter_container">
44
+ <input id="filter" type="text" value="" placeholder="filter...">
45
+ <div>
46
+ <input id="hide100" type="checkbox" >
47
+ <label for="hide100">hide covered</label>
48
+ </div>
49
+ </form>
50
+ <h2>
51
+ <a class="button current">Files</a>
52
+ <a class="button" href="function_index.html">Functions</a>
53
+ <a class="button" href="class_index.html">Classes</a>
54
+ </h2>
55
+ <p class="text">
56
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
57
+ created at 2026-02-28 17:48 +0000
58
+ </p>
59
+ </div>
60
+ </header>
61
+ <main id="index">
62
+ <table class="index" data-sortable>
63
+ <thead>
64
+ <tr class="tablehead" title="Click to sort">
65
+ <th id="file" class="name" aria-sort="none" data-shortcut="f">File<span class="arrows"></span></th>
66
+ <th class="spacer">&nbsp;</th>
67
+ <th id="statements" aria-sort="none" data-default-sort-order="descending" data-shortcut="s">statements<span class="arrows"></span></th>
68
+ <th id="missing" aria-sort="none" data-default-sort-order="descending" data-shortcut="m">missing<span class="arrows"></span></th>
69
+ <th id="excluded" aria-sort="none" data-default-sort-order="descending" data-shortcut="x">excluded<span class="arrows"></span></th>
70
+ <th class="spacer">&nbsp;</th>
71
+ <th id="coverage" aria-sort="none" data-shortcut="c">coverage<span class="arrows"></span></th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <tr class="region">
76
+ <td class="name"><a href="z_8e144f0c9fd03088___init___py.html">tinytroupe&#8201;/&#8201;__init__.py</a></td>
77
+ <td class="spacer">&nbsp;</td>
78
+ <td>109</td>
79
+ <td>27</td>
80
+ <td>0</td>
81
+ <td class="spacer">&nbsp;</td>
82
+ <td data-ratio="82 109">75%</td>
83
+ </tr>
84
+ <tr class="region">
85
+ <td class="name"><a href="z_357ee38f49d3e320___init___py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</a></td>
86
+ <td class="spacer">&nbsp;</td>
87
+ <td>28</td>
88
+ <td>28</td>
89
+ <td>0</td>
90
+ <td class="spacer">&nbsp;</td>
91
+ <td data-ratio="0 28">0%</td>
92
+ </tr>
93
+ <tr class="region">
94
+ <td class="name"><a href="z_357ee38f49d3e320_action_generator_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;action_generator.py</a></td>
95
+ <td class="spacer">&nbsp;</td>
96
+ <td>187</td>
97
+ <td>187</td>
98
+ <td>0</td>
99
+ <td class="spacer">&nbsp;</td>
100
+ <td data-ratio="0 187">0%</td>
101
+ </tr>
102
+ <tr class="region">
103
+ <td class="name"><a href="z_357ee38f49d3e320_browser_faculty_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;browser_faculty.py</a></td>
104
+ <td class="spacer">&nbsp;</td>
105
+ <td>53</td>
106
+ <td>53</td>
107
+ <td>0</td>
108
+ <td class="spacer">&nbsp;</td>
109
+ <td data-ratio="0 53">0%</td>
110
+ </tr>
111
+ <tr class="region">
112
+ <td class="name"><a href="z_357ee38f49d3e320_grounding_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;grounding.py</a></td>
113
+ <td class="spacer">&nbsp;</td>
114
+ <td>200</td>
115
+ <td>200</td>
116
+ <td>0</td>
117
+ <td class="spacer">&nbsp;</td>
118
+ <td data-ratio="0 200">0%</td>
119
+ </tr>
120
+ <tr class="region">
121
+ <td class="name"><a href="z_357ee38f49d3e320_memory_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;memory.py</a></td>
122
+ <td class="spacer">&nbsp;</td>
123
+ <td>189</td>
124
+ <td>189</td>
125
+ <td>1</td>
126
+ <td class="spacer">&nbsp;</td>
127
+ <td data-ratio="0 189">0%</td>
128
+ </tr>
129
+ <tr class="region">
130
+ <td class="name"><a href="z_357ee38f49d3e320_mental_faculty_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;mental_faculty.py</a></td>
131
+ <td class="spacer">&nbsp;</td>
132
+ <td>153</td>
133
+ <td>153</td>
134
+ <td>0</td>
135
+ <td class="spacer">&nbsp;</td>
136
+ <td data-ratio="0 153">0%</td>
137
+ </tr>
138
+ <tr class="region">
139
+ <td class="name"><a href="z_357ee38f49d3e320_tiny_person_py.html">tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;tiny_person.py</a></td>
140
+ <td class="spacer">&nbsp;</td>
141
+ <td>618</td>
142
+ <td>618</td>
143
+ <td>0</td>
144
+ <td class="spacer">&nbsp;</td>
145
+ <td data-ratio="0 618">0%</td>
146
+ </tr>
147
+ <tr class="region">
148
+ <td class="name"><a href="z_8e144f0c9fd03088_control_py.html">tinytroupe&#8201;/&#8201;control.py</a></td>
149
+ <td class="spacer">&nbsp;</td>
150
+ <td>385</td>
151
+ <td>321</td>
152
+ <td>0</td>
153
+ <td class="spacer">&nbsp;</td>
154
+ <td data-ratio="64 385">17%</td>
155
+ </tr>
156
+ <tr class="region">
157
+ <td class="name"><a href="z_37eec20419a3fd46___init___py.html">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;__init__.py</a></td>
158
+ <td class="spacer">&nbsp;</td>
159
+ <td>5</td>
160
+ <td>5</td>
161
+ <td>0</td>
162
+ <td class="spacer">&nbsp;</td>
163
+ <td data-ratio="0 5">0%</td>
164
+ </tr>
165
+ <tr class="region">
166
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_enricher_py.html">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_enricher.py</a></td>
167
+ <td class="spacer">&nbsp;</td>
168
+ <td>20</td>
169
+ <td>20</td>
170
+ <td>0</td>
171
+ <td class="spacer">&nbsp;</td>
172
+ <td data-ratio="0 20">0%</td>
173
+ </tr>
174
+ <tr class="region">
175
+ <td class="name"><a href="z_37eec20419a3fd46_tiny_styler_py.html">tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_styler.py</a></td>
176
+ <td class="spacer">&nbsp;</td>
177
+ <td>26</td>
178
+ <td>26</td>
179
+ <td>0</td>
180
+ <td class="spacer">&nbsp;</td>
181
+ <td data-ratio="0 26">0%</td>
182
+ </tr>
183
+ <tr class="region">
184
+ <td class="name"><a href="z_93fcbcbc09a08040___init___py.html">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;__init__.py</a></td>
185
+ <td class="spacer">&nbsp;</td>
186
+ <td>6</td>
187
+ <td>6</td>
188
+ <td>0</td>
189
+ <td class="spacer">&nbsp;</td>
190
+ <td data-ratio="0 6">0%</td>
191
+ </tr>
192
+ <tr class="region">
193
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_social_network_py.html">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;tiny_social_network.py</a></td>
194
+ <td class="spacer">&nbsp;</td>
195
+ <td>51</td>
196
+ <td>51</td>
197
+ <td>0</td>
198
+ <td class="spacer">&nbsp;</td>
199
+ <td data-ratio="0 51">0%</td>
200
+ </tr>
201
+ <tr class="region">
202
+ <td class="name"><a href="z_93fcbcbc09a08040_tiny_world_py.html">tinytroupe&#8201;/&#8201;environment&#8201;/&#8201;tiny_world.py</a></td>
203
+ <td class="spacer">&nbsp;</td>
204
+ <td>342</td>
205
+ <td>342</td>
206
+ <td>0</td>
207
+ <td class="spacer">&nbsp;</td>
208
+ <td data-ratio="0 342">0%</td>
209
+ </tr>
210
+ <tr class="region">
211
+ <td class="name"><a href="z_6bd7109c20672ac0___init___py.html">tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;__init__.py</a></td>
212
+ <td class="spacer">&nbsp;</td>
213
+ <td>5</td>
214
+ <td>5</td>
215
+ <td>0</td>
216
+ <td class="spacer">&nbsp;</td>
217
+ <td data-ratio="0 5">0%</td>
218
+ </tr>
219
+ <tr class="region">
220
+ <td class="name"><a href="z_6bd7109c20672ac0_agents_py.html">tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;agents.py</a></td>
221
+ <td class="spacer">&nbsp;</td>
222
+ <td>55</td>
223
+ <td>55</td>
224
+ <td>0</td>
225
+ <td class="spacer">&nbsp;</td>
226
+ <td data-ratio="0 55">0%</td>
227
+ </tr>
228
+ <tr class="region">
229
+ <td class="name"><a href="z_6bd7109c20672ac0_loaders_py.html">tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;loaders.py</a></td>
230
+ <td class="spacer">&nbsp;</td>
231
+ <td>10</td>
232
+ <td>10</td>
233
+ <td>0</td>
234
+ <td class="spacer">&nbsp;</td>
235
+ <td data-ratio="0 10">0%</td>
236
+ </tr>
237
+ <tr class="region">
238
+ <td class="name"><a href="z_bc1132832c822a8b___init___py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;__init__.py</a></td>
239
+ <td class="spacer">&nbsp;</td>
240
+ <td>6</td>
241
+ <td>6</td>
242
+ <td>0</td>
243
+ <td class="spacer">&nbsp;</td>
244
+ <td data-ratio="0 6">0%</td>
245
+ </tr>
246
+ <tr class="region">
247
+ <td class="name"><a href="z_bc1132832c822a8b_in_place_experiment_runner_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;in_place_experiment_runner.py</a></td>
248
+ <td class="spacer">&nbsp;</td>
249
+ <td>126</td>
250
+ <td>126</td>
251
+ <td>0</td>
252
+ <td class="spacer">&nbsp;</td>
253
+ <td data-ratio="0 126">0%</td>
254
+ </tr>
255
+ <tr class="region">
256
+ <td class="name"><a href="z_bc1132832c822a8b_proposition_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;proposition.py</a></td>
257
+ <td class="spacer">&nbsp;</td>
258
+ <td>136</td>
259
+ <td>136</td>
260
+ <td>0</td>
261
+ <td class="spacer">&nbsp;</td>
262
+ <td data-ratio="0 136">0%</td>
263
+ </tr>
264
+ <tr class="region">
265
+ <td class="name"><a href="z_bc1132832c822a8b_randomization_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;randomization.py</a></td>
266
+ <td class="spacer">&nbsp;</td>
267
+ <td>42</td>
268
+ <td>42</td>
269
+ <td>0</td>
270
+ <td class="spacer">&nbsp;</td>
271
+ <td data-ratio="0 42">0%</td>
272
+ </tr>
273
+ <tr class="region">
274
+ <td class="name"><a href="z_bc1132832c822a8b_statistical_tests_py.html">tinytroupe&#8201;/&#8201;experimentation&#8201;/&#8201;statistical_tests.py</a></td>
275
+ <td class="spacer">&nbsp;</td>
276
+ <td>236</td>
277
+ <td>236</td>
278
+ <td>0</td>
279
+ <td class="spacer">&nbsp;</td>
280
+ <td data-ratio="0 236">0%</td>
281
+ </tr>
282
+ <tr class="region">
283
+ <td class="name"><a href="z_1008c76b8ac6114d___init___py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;__init__.py</a></td>
284
+ <td class="spacer">&nbsp;</td>
285
+ <td>8</td>
286
+ <td>8</td>
287
+ <td>0</td>
288
+ <td class="spacer">&nbsp;</td>
289
+ <td data-ratio="0 8">0%</td>
290
+ </tr>
291
+ <tr class="region">
292
+ <td class="name"><a href="z_1008c76b8ac6114d_artifact_exporter_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;artifact_exporter.py</a></td>
293
+ <td class="spacer">&nbsp;</td>
294
+ <td>63</td>
295
+ <td>63</td>
296
+ <td>0</td>
297
+ <td class="spacer">&nbsp;</td>
298
+ <td data-ratio="0 63">0%</td>
299
+ </tr>
300
+ <tr class="region">
301
+ <td class="name"><a href="z_1008c76b8ac6114d_normalizer_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;normalizer.py</a></td>
302
+ <td class="spacer">&nbsp;</td>
303
+ <td>52</td>
304
+ <td>52</td>
305
+ <td>0</td>
306
+ <td class="spacer">&nbsp;</td>
307
+ <td data-ratio="0 52">0%</td>
308
+ </tr>
309
+ <tr class="region">
310
+ <td class="name"><a href="z_1008c76b8ac6114d_results_extractor_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_extractor.py</a></td>
311
+ <td class="spacer">&nbsp;</td>
312
+ <td>87</td>
313
+ <td>87</td>
314
+ <td>0</td>
315
+ <td class="spacer">&nbsp;</td>
316
+ <td data-ratio="0 87">0%</td>
317
+ </tr>
318
+ <tr class="region">
319
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reducer_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reducer.py</a></td>
320
+ <td class="spacer">&nbsp;</td>
321
+ <td>39</td>
322
+ <td>39</td>
323
+ <td>0</td>
324
+ <td class="spacer">&nbsp;</td>
325
+ <td data-ratio="0 39">0%</td>
326
+ </tr>
327
+ <tr class="region">
328
+ <td class="name"><a href="z_1008c76b8ac6114d_results_reporter_py.html">tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reporter.py</a></td>
329
+ <td class="spacer">&nbsp;</td>
330
+ <td>123</td>
331
+ <td>123</td>
332
+ <td>0</td>
333
+ <td class="spacer">&nbsp;</td>
334
+ <td data-ratio="0 123">0%</td>
335
+ </tr>
336
+ <tr class="region">
337
+ <td class="name"><a href="z_e17597f0ca69c4c3___init___py.html">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;__init__.py</a></td>
338
+ <td class="spacer">&nbsp;</td>
339
+ <td>6</td>
340
+ <td>6</td>
341
+ <td>0</td>
342
+ <td class="spacer">&nbsp;</td>
343
+ <td data-ratio="0 6">0%</td>
344
+ </tr>
345
+ <tr class="region">
346
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_factory_py.html">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;tiny_factory.py</a></td>
347
+ <td class="spacer">&nbsp;</td>
348
+ <td>37</td>
349
+ <td>37</td>
350
+ <td>0</td>
351
+ <td class="spacer">&nbsp;</td>
352
+ <td data-ratio="0 37">0%</td>
353
+ </tr>
354
+ <tr class="region">
355
+ <td class="name"><a href="z_e17597f0ca69c4c3_tiny_person_factory_py.html">tinytroupe&#8201;/&#8201;factory&#8201;/&#8201;tiny_person_factory.py</a></td>
356
+ <td class="spacer">&nbsp;</td>
357
+ <td>268</td>
358
+ <td>268</td>
359
+ <td>4</td>
360
+ <td class="spacer">&nbsp;</td>
361
+ <td data-ratio="0 268">0%</td>
362
+ </tr>
363
+ <tr class="region">
364
+ <td class="name"><a href="z_8e144f0c9fd03088_openai_utils_py.html">tinytroupe&#8201;/&#8201;openai_utils.py</a></td>
365
+ <td class="spacer">&nbsp;</td>
366
+ <td>198</td>
367
+ <td>138</td>
368
+ <td>0</td>
369
+ <td class="spacer">&nbsp;</td>
370
+ <td data-ratio="60 198">30%</td>
371
+ </tr>
372
+ <tr class="region">
373
+ <td class="name"><a href="z_8e144f0c9fd03088_profiling_py.html">tinytroupe&#8201;/&#8201;profiling.py</a></td>
374
+ <td class="spacer">&nbsp;</td>
375
+ <td>386</td>
376
+ <td>386</td>
377
+ <td>0</td>
378
+ <td class="spacer">&nbsp;</td>
379
+ <td data-ratio="0 386">0%</td>
380
+ </tr>
381
+ <tr class="region">
382
+ <td class="name"><a href="z_13b615ba9b634dc5___init___py.html">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;__init__.py</a></td>
383
+ <td class="spacer">&nbsp;</td>
384
+ <td>5</td>
385
+ <td>5</td>
386
+ <td>0</td>
387
+ <td class="spacer">&nbsp;</td>
388
+ <td data-ratio="0 5">0%</td>
389
+ </tr>
390
+ <tr class="region">
391
+ <td class="name"><a href="z_13b615ba9b634dc5_intervention_py.html">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;intervention.py</a></td>
392
+ <td class="spacer">&nbsp;</td>
393
+ <td>110</td>
394
+ <td>110</td>
395
+ <td>0</td>
396
+ <td class="spacer">&nbsp;</td>
397
+ <td data-ratio="0 110">0%</td>
398
+ </tr>
399
+ <tr class="region">
400
+ <td class="name"><a href="z_13b615ba9b634dc5_tiny_story_py.html">tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;tiny_story.py</a></td>
401
+ <td class="spacer">&nbsp;</td>
402
+ <td>42</td>
403
+ <td>42</td>
404
+ <td>0</td>
405
+ <td class="spacer">&nbsp;</td>
406
+ <td data-ratio="0 42">0%</td>
407
+ </tr>
408
+ <tr class="region">
409
+ <td class="name"><a href="z_8ff660fc2daa80e3___init___py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;__init__.py</a></td>
410
+ <td class="spacer">&nbsp;</td>
411
+ <td>6</td>
412
+ <td>6</td>
413
+ <td>0</td>
414
+ <td class="spacer">&nbsp;</td>
415
+ <td data-ratio="0 6">0%</td>
416
+ </tr>
417
+ <tr class="region">
418
+ <td class="name"><a href="z_8ff660fc2daa80e3_browser_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;browser.py</a></td>
419
+ <td class="spacer">&nbsp;</td>
420
+ <td>20</td>
421
+ <td>20</td>
422
+ <td>0</td>
423
+ <td class="spacer">&nbsp;</td>
424
+ <td data-ratio="0 20">0%</td>
425
+ </tr>
426
+ <tr class="region">
427
+ <td class="name"><a href="z_8ff660fc2daa80e3_sequential_thinking_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;sequential_thinking.py</a></td>
428
+ <td class="spacer">&nbsp;</td>
429
+ <td>42</td>
430
+ <td>42</td>
431
+ <td>0</td>
432
+ <td class="spacer">&nbsp;</td>
433
+ <td data-ratio="0 42">0%</td>
434
+ </tr>
435
+ <tr class="region">
436
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_calendar_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_calendar.py</a></td>
437
+ <td class="spacer">&nbsp;</td>
438
+ <td>28</td>
439
+ <td>28</td>
440
+ <td>0</td>
441
+ <td class="spacer">&nbsp;</td>
442
+ <td data-ratio="0 28">0%</td>
443
+ </tr>
444
+ <tr class="region">
445
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_tool_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_tool.py</a></td>
446
+ <td class="spacer">&nbsp;</td>
447
+ <td>29</td>
448
+ <td>29</td>
449
+ <td>0</td>
450
+ <td class="spacer">&nbsp;</td>
451
+ <td data-ratio="0 29">0%</td>
452
+ </tr>
453
+ <tr class="region">
454
+ <td class="name"><a href="z_8ff660fc2daa80e3_tiny_word_processor_py.html">tinytroupe&#8201;/&#8201;tools&#8201;/&#8201;tiny_word_processor.py</a></td>
455
+ <td class="spacer">&nbsp;</td>
456
+ <td>42</td>
457
+ <td>42</td>
458
+ <td>0</td>
459
+ <td class="spacer">&nbsp;</td>
460
+ <td data-ratio="0 42">0%</td>
461
+ </tr>
462
+ <tr class="region">
463
+ <td class="name"><a href="z_1dd26f6f54202fea___init___py.html">tinytroupe&#8201;/&#8201;ui&#8201;/&#8201;__init__.py</a></td>
464
+ <td class="spacer">&nbsp;</td>
465
+ <td>2</td>
466
+ <td>2</td>
467
+ <td>0</td>
468
+ <td class="spacer">&nbsp;</td>
469
+ <td data-ratio="0 2">0%</td>
470
+ </tr>
471
+ <tr class="region">
472
+ <td class="name"><a href="z_1dd26f6f54202fea_jupyter_widgets_py.html">tinytroupe&#8201;/&#8201;ui&#8201;/&#8201;jupyter_widgets.py</a></td>
473
+ <td class="spacer">&nbsp;</td>
474
+ <td>121</td>
475
+ <td>121</td>
476
+ <td>0</td>
477
+ <td class="spacer">&nbsp;</td>
478
+ <td data-ratio="0 121">0%</td>
479
+ </tr>
480
+ <tr class="region">
481
+ <td class="name"><a href="z_4b3d0d3b603de221___init___py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;__init__.py</a></td>
482
+ <td class="spacer">&nbsp;</td>
483
+ <td>11</td>
484
+ <td>0</td>
485
+ <td>0</td>
486
+ <td class="spacer">&nbsp;</td>
487
+ <td data-ratio="11 11">100%</td>
488
+ </tr>
489
+ <tr class="region">
490
+ <td class="name"><a href="z_4b3d0d3b603de221_behavior_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;behavior.py</a></td>
491
+ <td class="spacer">&nbsp;</td>
492
+ <td>11</td>
493
+ <td>9</td>
494
+ <td>0</td>
495
+ <td class="spacer">&nbsp;</td>
496
+ <td data-ratio="2 11">18%</td>
497
+ </tr>
498
+ <tr class="region">
499
+ <td class="name"><a href="z_4b3d0d3b603de221_config_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;config.py</a></td>
500
+ <td class="spacer">&nbsp;</td>
501
+ <td>65</td>
502
+ <td>10</td>
503
+ <td>0</td>
504
+ <td class="spacer">&nbsp;</td>
505
+ <td data-ratio="55 65">85%</td>
506
+ </tr>
507
+ <tr class="region">
508
+ <td class="name"><a href="z_4b3d0d3b603de221_json_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;json.py</a></td>
509
+ <td class="spacer">&nbsp;</td>
510
+ <td>167</td>
511
+ <td>149</td>
512
+ <td>0</td>
513
+ <td class="spacer">&nbsp;</td>
514
+ <td data-ratio="18 167">11%</td>
515
+ </tr>
516
+ <tr class="region">
517
+ <td class="name"><a href="z_4b3d0d3b603de221_llm_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;llm.py</a></td>
518
+ <td class="spacer">&nbsp;</td>
519
+ <td>415</td>
520
+ <td>340</td>
521
+ <td>0</td>
522
+ <td class="spacer">&nbsp;</td>
523
+ <td data-ratio="75 415">18%</td>
524
+ </tr>
525
+ <tr class="region">
526
+ <td class="name"><a href="z_4b3d0d3b603de221_logger_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;logger.py</a></td>
527
+ <td class="spacer">&nbsp;</td>
528
+ <td>26</td>
529
+ <td>26</td>
530
+ <td>0</td>
531
+ <td class="spacer">&nbsp;</td>
532
+ <td data-ratio="0 26">0%</td>
533
+ </tr>
534
+ <tr class="region">
535
+ <td class="name"><a href="z_4b3d0d3b603de221_misc_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;misc.py</a></td>
536
+ <td class="spacer">&nbsp;</td>
537
+ <td>27</td>
538
+ <td>16</td>
539
+ <td>0</td>
540
+ <td class="spacer">&nbsp;</td>
541
+ <td data-ratio="11 27">41%</td>
542
+ </tr>
543
+ <tr class="region">
544
+ <td class="name"><a href="z_4b3d0d3b603de221_parallel_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;parallel.py</a></td>
545
+ <td class="spacer">&nbsp;</td>
546
+ <td>22</td>
547
+ <td>13</td>
548
+ <td>0</td>
549
+ <td class="spacer">&nbsp;</td>
550
+ <td data-ratio="9 22">41%</td>
551
+ </tr>
552
+ <tr class="region">
553
+ <td class="name"><a href="z_4b3d0d3b603de221_rendering_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;rendering.py</a></td>
554
+ <td class="spacer">&nbsp;</td>
555
+ <td>57</td>
556
+ <td>33</td>
557
+ <td>0</td>
558
+ <td class="spacer">&nbsp;</td>
559
+ <td data-ratio="24 57">42%</td>
560
+ </tr>
561
+ <tr class="region">
562
+ <td class="name"><a href="z_4b3d0d3b603de221_semantics_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;semantics.py</a></td>
563
+ <td class="spacer">&nbsp;</td>
564
+ <td>17</td>
565
+ <td>0</td>
566
+ <td>0</td>
567
+ <td class="spacer">&nbsp;</td>
568
+ <td data-ratio="17 17">100%</td>
569
+ </tr>
570
+ <tr class="region">
571
+ <td class="name"><a href="z_4b3d0d3b603de221_validation_py.html">tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;validation.py</a></td>
572
+ <td class="spacer">&nbsp;</td>
573
+ <td>27</td>
574
+ <td>18</td>
575
+ <td>0</td>
576
+ <td class="spacer">&nbsp;</td>
577
+ <td data-ratio="9 27">33%</td>
578
+ </tr>
579
+ <tr class="region">
580
+ <td class="name"><a href="z_96a307234d1981d5___init___py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;__init__.py</a></td>
581
+ <td class="spacer">&nbsp;</td>
582
+ <td>6</td>
583
+ <td>6</td>
584
+ <td>0</td>
585
+ <td class="spacer">&nbsp;</td>
586
+ <td data-ratio="0 6">0%</td>
587
+ </tr>
588
+ <tr class="region">
589
+ <td class="name"><a href="z_96a307234d1981d5_propositions_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;propositions.py</a></td>
590
+ <td class="spacer">&nbsp;</td>
591
+ <td>25</td>
592
+ <td>25</td>
593
+ <td>0</td>
594
+ <td class="spacer">&nbsp;</td>
595
+ <td data-ratio="0 25">0%</td>
596
+ </tr>
597
+ <tr class="region">
598
+ <td class="name"><a href="z_96a307234d1981d5_simulation_validator_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;simulation_validator.py</a></td>
599
+ <td class="spacer">&nbsp;</td>
600
+ <td>986</td>
601
+ <td>986</td>
602
+ <td>0</td>
603
+ <td class="spacer">&nbsp;</td>
604
+ <td data-ratio="0 986">0%</td>
605
+ </tr>
606
+ <tr class="region">
607
+ <td class="name"><a href="z_96a307234d1981d5_tiny_person_validator_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;tiny_person_validator.py</a></td>
608
+ <td class="spacer">&nbsp;</td>
609
+ <td>57</td>
610
+ <td>57</td>
611
+ <td>0</td>
612
+ <td class="spacer">&nbsp;</td>
613
+ <td data-ratio="0 57">0%</td>
614
+ </tr>
615
+ <tr class="region">
616
+ <td class="name"><a href="z_96a307234d1981d5_validation_chamber_py.html">tinytroupe&#8201;/&#8201;validation&#8201;/&#8201;validation_chamber.py</a></td>
617
+ <td class="spacer">&nbsp;</td>
618
+ <td>2</td>
619
+ <td>2</td>
620
+ <td>0</td>
621
+ <td class="spacer">&nbsp;</td>
622
+ <td data-ratio="0 2">0%</td>
623
+ </tr>
624
+ </tbody>
625
+ <tfoot>
626
+ <tr class="total">
627
+ <td class="name">Total</td>
628
+ <td class="spacer">&nbsp;</td>
629
+ <td>6623</td>
630
+ <td>6186</td>
631
+ <td>5</td>
632
+ <td class="spacer">&nbsp;</td>
633
+ <td data-ratio="437 6623">7%</td>
634
+ </tr>
635
+ </tfoot>
636
+ </table>
637
+ <p id="no_rows">
638
+ No items found using the specified filter.
639
+ </p>
640
+ </main>
641
+ <footer>
642
+ <div class="content">
643
+ <p>
644
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
645
+ created at 2026-02-28 17:48 +0000
646
+ </p>
647
+ </div>
648
+ <aside class="hidden">
649
+ <a id="prevFileLink" class="nav" href="z_96a307234d1981d5_validation_chamber_py.html"></a>
650
+ <a id="nextFileLink" class="nav" href="z_8e144f0c9fd03088___init___py.html"></a>
651
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
652
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
653
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
654
+ </aside>
655
+ </footer>
656
+ </body>
657
+ </html>
htmlcov/keybd_closed_cb_900cfef5.png ADDED
htmlcov/status.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.13.4","globals":"df91380724183fcdcc357473d50856b4","files":{"z_8e144f0c9fd03088___init___py":{"hash":"adb21efdbcdb82e2906b4ad6c54a4a56","index":{"url":"z_8e144f0c9fd03088___init___py.html","file":"tinytroupe/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":109,"n_excluded":0,"n_missing":27,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320___init___py":{"hash":"73c458f48254d74384fc91d22c3ea75e","index":{"url":"z_357ee38f49d3e320___init___py.html","file":"tinytroupe/agent/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":28,"n_excluded":0,"n_missing":28,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320_action_generator_py":{"hash":"50c816de0713a4f0175ec8d7087de2d8","index":{"url":"z_357ee38f49d3e320_action_generator_py.html","file":"tinytroupe/agent/action_generator.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":187,"n_excluded":0,"n_missing":187,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320_browser_faculty_py":{"hash":"90a4605912653ca9725f4188cc1e4558","index":{"url":"z_357ee38f49d3e320_browser_faculty_py.html","file":"tinytroupe/agent/browser_faculty.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":53,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320_grounding_py":{"hash":"f3d06a5021b2346651438ca1c7f37e00","index":{"url":"z_357ee38f49d3e320_grounding_py.html","file":"tinytroupe/agent/grounding.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":200,"n_excluded":0,"n_missing":200,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320_memory_py":{"hash":"2a8b401ba9f3391792dcd61753de7412","index":{"url":"z_357ee38f49d3e320_memory_py.html","file":"tinytroupe/agent/memory.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":189,"n_excluded":1,"n_missing":189,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320_mental_faculty_py":{"hash":"293446b7e9363a4b1fb05201fed4bdc2","index":{"url":"z_357ee38f49d3e320_mental_faculty_py.html","file":"tinytroupe/agent/mental_faculty.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":153,"n_excluded":0,"n_missing":153,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_357ee38f49d3e320_tiny_person_py":{"hash":"6db5dec80b824bdd5e6a4851167b5862","index":{"url":"z_357ee38f49d3e320_tiny_person_py.html","file":"tinytroupe/agent/tiny_person.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":618,"n_excluded":0,"n_missing":618,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8e144f0c9fd03088_control_py":{"hash":"d57cf7bc1e96d1d3a4409684e655639f","index":{"url":"z_8e144f0c9fd03088_control_py.html","file":"tinytroupe/control.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":385,"n_excluded":0,"n_missing":321,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_37eec20419a3fd46___init___py":{"hash":"ac1955011aa388e02a52d81669fe9b5b","index":{"url":"z_37eec20419a3fd46___init___py.html","file":"tinytroupe/enrichment/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":5,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_37eec20419a3fd46_tiny_enricher_py":{"hash":"a55e6fe6ca061fa96a6ac79989df8aa3","index":{"url":"z_37eec20419a3fd46_tiny_enricher_py.html","file":"tinytroupe/enrichment/tiny_enricher.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":20,"n_excluded":0,"n_missing":20,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_37eec20419a3fd46_tiny_styler_py":{"hash":"25be08d23a2a8211eec824dfb14b561b","index":{"url":"z_37eec20419a3fd46_tiny_styler_py.html","file":"tinytroupe/enrichment/tiny_styler.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":26,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_93fcbcbc09a08040___init___py":{"hash":"42d0488107c12e95de3a2bccf5689ac3","index":{"url":"z_93fcbcbc09a08040___init___py.html","file":"tinytroupe/environment/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_93fcbcbc09a08040_tiny_social_network_py":{"hash":"462de34bf4b3c4a7a57b30b00dbe5daa","index":{"url":"z_93fcbcbc09a08040_tiny_social_network_py.html","file":"tinytroupe/environment/tiny_social_network.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":51,"n_excluded":0,"n_missing":51,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_93fcbcbc09a08040_tiny_world_py":{"hash":"ca765c8630ed1f9df8a6827d9fa7712a","index":{"url":"z_93fcbcbc09a08040_tiny_world_py.html","file":"tinytroupe/environment/tiny_world.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":342,"n_excluded":0,"n_missing":342,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_6bd7109c20672ac0___init___py":{"hash":"44b4eeba84026b9478ec2e392d6c9a75","index":{"url":"z_6bd7109c20672ac0___init___py.html","file":"tinytroupe/examples/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":5,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_6bd7109c20672ac0_agents_py":{"hash":"27e2f273a2183859b1a659d4620b88e6","index":{"url":"z_6bd7109c20672ac0_agents_py.html","file":"tinytroupe/examples/agents.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":55,"n_excluded":0,"n_missing":55,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_6bd7109c20672ac0_loaders_py":{"hash":"41e2e474fe3db46202423fb51edfa983","index":{"url":"z_6bd7109c20672ac0_loaders_py.html","file":"tinytroupe/examples/loaders.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":10,"n_excluded":0,"n_missing":10,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_bc1132832c822a8b___init___py":{"hash":"135ff08d2f0a4073412528879856c94e","index":{"url":"z_bc1132832c822a8b___init___py.html","file":"tinytroupe/experimentation/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_bc1132832c822a8b_in_place_experiment_runner_py":{"hash":"92238d085dcc51380c9f42d37085b14f","index":{"url":"z_bc1132832c822a8b_in_place_experiment_runner_py.html","file":"tinytroupe/experimentation/in_place_experiment_runner.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":126,"n_excluded":0,"n_missing":126,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_bc1132832c822a8b_proposition_py":{"hash":"90f54831a5bd6383da67a3a723b5cf48","index":{"url":"z_bc1132832c822a8b_proposition_py.html","file":"tinytroupe/experimentation/proposition.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":136,"n_excluded":0,"n_missing":136,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_bc1132832c822a8b_randomization_py":{"hash":"939781d79d3eddacea805ba345ccc7fb","index":{"url":"z_bc1132832c822a8b_randomization_py.html","file":"tinytroupe/experimentation/randomization.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":42,"n_excluded":0,"n_missing":42,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_bc1132832c822a8b_statistical_tests_py":{"hash":"747348ff128c826198693d5435ee381d","index":{"url":"z_bc1132832c822a8b_statistical_tests_py.html","file":"tinytroupe/experimentation/statistical_tests.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":236,"n_excluded":0,"n_missing":236,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1008c76b8ac6114d___init___py":{"hash":"081d4e375fb8ccb4004628d9fe66fc2b","index":{"url":"z_1008c76b8ac6114d___init___py.html","file":"tinytroupe/extraction/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":8,"n_excluded":0,"n_missing":8,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1008c76b8ac6114d_artifact_exporter_py":{"hash":"6f69648307ea0e49dfcf48525d49b246","index":{"url":"z_1008c76b8ac6114d_artifact_exporter_py.html","file":"tinytroupe/extraction/artifact_exporter.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":63,"n_excluded":0,"n_missing":63,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1008c76b8ac6114d_normalizer_py":{"hash":"54c8cc343ca333656d5521f39de21b8a","index":{"url":"z_1008c76b8ac6114d_normalizer_py.html","file":"tinytroupe/extraction/normalizer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":52,"n_excluded":0,"n_missing":52,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1008c76b8ac6114d_results_extractor_py":{"hash":"723bca65ea8f2b637db26fe734b85f15","index":{"url":"z_1008c76b8ac6114d_results_extractor_py.html","file":"tinytroupe/extraction/results_extractor.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":87,"n_excluded":0,"n_missing":87,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1008c76b8ac6114d_results_reducer_py":{"hash":"2a74d627205027b5210a6b3a36e9f751","index":{"url":"z_1008c76b8ac6114d_results_reducer_py.html","file":"tinytroupe/extraction/results_reducer.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":39,"n_excluded":0,"n_missing":39,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1008c76b8ac6114d_results_reporter_py":{"hash":"8079759070f55c34439aa314ded5cc09","index":{"url":"z_1008c76b8ac6114d_results_reporter_py.html","file":"tinytroupe/extraction/results_reporter.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":123,"n_excluded":0,"n_missing":123,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e17597f0ca69c4c3___init___py":{"hash":"2e0d70d8dd7624351547a4d5a63f2050","index":{"url":"z_e17597f0ca69c4c3___init___py.html","file":"tinytroupe/factory/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e17597f0ca69c4c3_tiny_factory_py":{"hash":"e05f603aee6db2d9f0b71abef97d2116","index":{"url":"z_e17597f0ca69c4c3_tiny_factory_py.html","file":"tinytroupe/factory/tiny_factory.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":37,"n_excluded":0,"n_missing":37,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_e17597f0ca69c4c3_tiny_person_factory_py":{"hash":"2582fa9044d8e42fc92fbeba19e411f3","index":{"url":"z_e17597f0ca69c4c3_tiny_person_factory_py.html","file":"tinytroupe/factory/tiny_person_factory.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":268,"n_excluded":4,"n_missing":268,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8e144f0c9fd03088_openai_utils_py":{"hash":"47f0e00c9ee18d947307ed3b04bbb8e9","index":{"url":"z_8e144f0c9fd03088_openai_utils_py.html","file":"tinytroupe/openai_utils.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":198,"n_excluded":0,"n_missing":138,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8e144f0c9fd03088_profiling_py":{"hash":"b6501271bf1f46c73d4670425b57c01f","index":{"url":"z_8e144f0c9fd03088_profiling_py.html","file":"tinytroupe/profiling.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":386,"n_excluded":0,"n_missing":386,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_13b615ba9b634dc5___init___py":{"hash":"6ebb76169421b967144055fe6a56504e","index":{"url":"z_13b615ba9b634dc5___init___py.html","file":"tinytroupe/steering/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":5,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_13b615ba9b634dc5_intervention_py":{"hash":"4f2afe64866e9dd383a58ea46afd6308","index":{"url":"z_13b615ba9b634dc5_intervention_py.html","file":"tinytroupe/steering/intervention.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":110,"n_excluded":0,"n_missing":110,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_13b615ba9b634dc5_tiny_story_py":{"hash":"ff7dc75832e2a642ed55e8873aafdfac","index":{"url":"z_13b615ba9b634dc5_tiny_story_py.html","file":"tinytroupe/steering/tiny_story.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":42,"n_excluded":0,"n_missing":42,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8ff660fc2daa80e3___init___py":{"hash":"642f28b1ecf9cca220c1cb35fccf386f","index":{"url":"z_8ff660fc2daa80e3___init___py.html","file":"tinytroupe/tools/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8ff660fc2daa80e3_browser_py":{"hash":"953436f5707a7cf0a3df3857f3dfc9b8","index":{"url":"z_8ff660fc2daa80e3_browser_py.html","file":"tinytroupe/tools/browser.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":20,"n_excluded":0,"n_missing":20,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8ff660fc2daa80e3_sequential_thinking_py":{"hash":"75044ff414fdd9b5170c12794fd17dd1","index":{"url":"z_8ff660fc2daa80e3_sequential_thinking_py.html","file":"tinytroupe/tools/sequential_thinking.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":42,"n_excluded":0,"n_missing":42,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8ff660fc2daa80e3_tiny_calendar_py":{"hash":"b19a143daa028980e1db5fea76026255","index":{"url":"z_8ff660fc2daa80e3_tiny_calendar_py.html","file":"tinytroupe/tools/tiny_calendar.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":28,"n_excluded":0,"n_missing":28,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8ff660fc2daa80e3_tiny_tool_py":{"hash":"493d69a0f10107c10e17d9e172ad8302","index":{"url":"z_8ff660fc2daa80e3_tiny_tool_py.html","file":"tinytroupe/tools/tiny_tool.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":29,"n_excluded":0,"n_missing":29,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_8ff660fc2daa80e3_tiny_word_processor_py":{"hash":"5e0c3a8f19f30634b339396008f2a36b","index":{"url":"z_8ff660fc2daa80e3_tiny_word_processor_py.html","file":"tinytroupe/tools/tiny_word_processor.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":42,"n_excluded":0,"n_missing":42,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1dd26f6f54202fea___init___py":{"hash":"3409017fdd4445ac502a8c033b5d4242","index":{"url":"z_1dd26f6f54202fea___init___py.html","file":"tinytroupe/ui/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":2,"n_excluded":0,"n_missing":2,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_1dd26f6f54202fea_jupyter_widgets_py":{"hash":"240851ede68a8e7568b6f256163a7d5d","index":{"url":"z_1dd26f6f54202fea_jupyter_widgets_py.html","file":"tinytroupe/ui/jupyter_widgets.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":121,"n_excluded":0,"n_missing":121,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221___init___py":{"hash":"d55137c4eb1929bac5f044d2cd672a42","index":{"url":"z_4b3d0d3b603de221___init___py.html","file":"tinytroupe/utils/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":11,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_behavior_py":{"hash":"9e8f03894891a1408a7ffa273b1f9950","index":{"url":"z_4b3d0d3b603de221_behavior_py.html","file":"tinytroupe/utils/behavior.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":11,"n_excluded":0,"n_missing":9,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_config_py":{"hash":"74063baeb8e7cc1742d7466743adb005","index":{"url":"z_4b3d0d3b603de221_config_py.html","file":"tinytroupe/utils/config.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":65,"n_excluded":0,"n_missing":10,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_json_py":{"hash":"0a309b6b2406c6f58ef002a204a72b92","index":{"url":"z_4b3d0d3b603de221_json_py.html","file":"tinytroupe/utils/json.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":167,"n_excluded":0,"n_missing":149,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_llm_py":{"hash":"3b9d853d23ee07be267c3f41504a4999","index":{"url":"z_4b3d0d3b603de221_llm_py.html","file":"tinytroupe/utils/llm.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":415,"n_excluded":0,"n_missing":340,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_logger_py":{"hash":"08a70148067271d8f07a1825fdc06130","index":{"url":"z_4b3d0d3b603de221_logger_py.html","file":"tinytroupe/utils/logger.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":26,"n_excluded":0,"n_missing":26,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_misc_py":{"hash":"a024d6cd6ab680551da09d6f280e6957","index":{"url":"z_4b3d0d3b603de221_misc_py.html","file":"tinytroupe/utils/misc.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":27,"n_excluded":0,"n_missing":16,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_parallel_py":{"hash":"8da8cc5c2206641458eec780edf5bc47","index":{"url":"z_4b3d0d3b603de221_parallel_py.html","file":"tinytroupe/utils/parallel.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":22,"n_excluded":0,"n_missing":13,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_rendering_py":{"hash":"e45566e1446820ffa97b8a7a18e23d41","index":{"url":"z_4b3d0d3b603de221_rendering_py.html","file":"tinytroupe/utils/rendering.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":33,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_semantics_py":{"hash":"4fd1dad89c0ae4651ecdb73db409dadc","index":{"url":"z_4b3d0d3b603de221_semantics_py.html","file":"tinytroupe/utils/semantics.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":17,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_4b3d0d3b603de221_validation_py":{"hash":"6eb17db79624a9c78066b34ccffe082a","index":{"url":"z_4b3d0d3b603de221_validation_py.html","file":"tinytroupe/utils/validation.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":27,"n_excluded":0,"n_missing":18,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_96a307234d1981d5___init___py":{"hash":"02e140513018e1f2f94f3b521244a58c","index":{"url":"z_96a307234d1981d5___init___py.html","file":"tinytroupe/validation/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":6,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_96a307234d1981d5_propositions_py":{"hash":"48f1e4f97c26dc9ddd42ddd1ab0afe0c","index":{"url":"z_96a307234d1981d5_propositions_py.html","file":"tinytroupe/validation/propositions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":25,"n_excluded":0,"n_missing":25,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_96a307234d1981d5_simulation_validator_py":{"hash":"3919a9e3f0873be070664b6ef446c6a4","index":{"url":"z_96a307234d1981d5_simulation_validator_py.html","file":"tinytroupe/validation/simulation_validator.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":986,"n_excluded":0,"n_missing":986,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_96a307234d1981d5_tiny_person_validator_py":{"hash":"ccd6d42aba17872c2333e7b93bd1b182","index":{"url":"z_96a307234d1981d5_tiny_person_validator_py.html","file":"tinytroupe/validation/tiny_person_validator.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":57,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_96a307234d1981d5_validation_chamber_py":{"hash":"3cfd12f4998e87216150ee017fc6af0e","index":{"url":"z_96a307234d1981d5_validation_chamber_py.html","file":"tinytroupe/validation/validation_chamber.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":2,"n_excluded":0,"n_missing":2,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}
htmlcov/style_cb_9ff733b0.css ADDED
@@ -0,0 +1,389 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+ /* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
3
+ /* For details: https://github.com/coveragepy/coveragepy/blob/main/NOTICE.txt */
4
+ /* Don't edit this .css file. Edit the .scss file instead! */
5
+ html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; }
6
+
7
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 1em; background: #fff; color: #000; }
8
+
9
+ @media (prefers-color-scheme: dark) { body { background: #1e1e1e; } }
10
+
11
+ @media (prefers-color-scheme: dark) { body { color: #eee; } }
12
+
13
+ html > body { font-size: 16px; }
14
+
15
+ a:active, a:focus { outline: 2px dashed #007acc; }
16
+
17
+ p { font-size: .875em; line-height: 1.4em; }
18
+
19
+ table { border-collapse: collapse; }
20
+
21
+ td { vertical-align: top; }
22
+
23
+ table tr.hidden { display: none !important; }
24
+
25
+ p#no_rows { display: none; font-size: 1.15em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; }
26
+
27
+ a.nav { text-decoration: none; color: inherit; }
28
+
29
+ a.nav:hover { text-decoration: underline; color: inherit; }
30
+
31
+ .hidden { display: none; }
32
+
33
+ header { background: #f8f8f8; width: 100%; z-index: 2; border-bottom: 1px solid #ccc; }
34
+
35
+ @media (prefers-color-scheme: dark) { header { background: black; } }
36
+
37
+ @media (prefers-color-scheme: dark) { header { border-color: #333; } }
38
+
39
+ header .content { padding: 1rem 3.5rem; }
40
+
41
+ header h2 { margin-top: .5em; font-size: 1em; }
42
+
43
+ header h2 a.button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; background: #eee; color: inherit; text-decoration: none; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; }
44
+
45
+ @media (prefers-color-scheme: dark) { header h2 a.button { background: #333; } }
46
+
47
+ @media (prefers-color-scheme: dark) { header h2 a.button { border-color: #444; } }
48
+
49
+ header h2 a.button.current { border: 2px solid; background: #fff; border-color: #999; cursor: default; }
50
+
51
+ @media (prefers-color-scheme: dark) { header h2 a.button.current { background: #1e1e1e; } }
52
+
53
+ @media (prefers-color-scheme: dark) { header h2 a.button.current { border-color: #777; } }
54
+
55
+ header p.text { margin: .5em 0 -.5em; color: #666; font-style: italic; }
56
+
57
+ @media (prefers-color-scheme: dark) { header p.text { color: #aaa; } }
58
+
59
+ header.sticky { position: fixed; left: 0; right: 0; height: 2.5em; }
60
+
61
+ header.sticky .text { display: none; }
62
+
63
+ header.sticky h1, header.sticky h2 { font-size: 1em; margin-top: 0; display: inline-block; }
64
+
65
+ header.sticky .content { padding: 0.5rem 3.5rem; }
66
+
67
+ header.sticky .content p { font-size: 1em; }
68
+
69
+ header.sticky ~ #source { padding-top: 6.5em; }
70
+
71
+ main { position: relative; z-index: 1; }
72
+
73
+ footer { margin: 1rem 3.5rem; }
74
+
75
+ footer .content { padding: 0; color: #666; font-style: italic; }
76
+
77
+ @media (prefers-color-scheme: dark) { footer .content { color: #aaa; } }
78
+
79
+ #index { margin: 1rem 0 0 3.5rem; }
80
+
81
+ h1 { font-size: 1.25em; display: inline-block; }
82
+
83
+ #filter_container { float: right; margin: 0 2em 0 0; line-height: 1.66em; }
84
+
85
+ #filter_container #filter { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; }
86
+
87
+ @media (prefers-color-scheme: dark) { #filter_container #filter { border-color: #444; } }
88
+
89
+ @media (prefers-color-scheme: dark) { #filter_container #filter { background: #1e1e1e; } }
90
+
91
+ @media (prefers-color-scheme: dark) { #filter_container #filter { color: #eee; } }
92
+
93
+ #filter_container #filter:focus { border-color: #007acc; }
94
+
95
+ #filter_container :disabled ~ label { color: #ccc; }
96
+
97
+ @media (prefers-color-scheme: dark) { #filter_container :disabled ~ label { color: #444; } }
98
+
99
+ #filter_container label { font-size: .875em; color: #666; }
100
+
101
+ @media (prefers-color-scheme: dark) { #filter_container label { color: #aaa; } }
102
+
103
+ header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; background: #eee; color: inherit; text-decoration: none; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; }
104
+
105
+ @media (prefers-color-scheme: dark) { header button { background: #333; } }
106
+
107
+ @media (prefers-color-scheme: dark) { header button { border-color: #444; } }
108
+
109
+ header button:active, header button:focus { outline: 2px dashed #007acc; }
110
+
111
+ header button.run { background: #eeffee; }
112
+
113
+ @media (prefers-color-scheme: dark) { header button.run { background: #373d29; } }
114
+
115
+ header button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; }
116
+
117
+ @media (prefers-color-scheme: dark) { header button.run.show_run { background: #373d29; } }
118
+
119
+ header button.mis { background: #ffeeee; }
120
+
121
+ @media (prefers-color-scheme: dark) { header button.mis { background: #4b1818; } }
122
+
123
+ header button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; }
124
+
125
+ @media (prefers-color-scheme: dark) { header button.mis.show_mis { background: #4b1818; } }
126
+
127
+ header button.exc { background: #f7f7f7; }
128
+
129
+ @media (prefers-color-scheme: dark) { header button.exc { background: #333; } }
130
+
131
+ header button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; }
132
+
133
+ @media (prefers-color-scheme: dark) { header button.exc.show_exc { background: #333; } }
134
+
135
+ header button.par { background: #ffffd5; }
136
+
137
+ @media (prefers-color-scheme: dark) { header button.par { background: #650; } }
138
+
139
+ header button.par.show_par { background: #ffa; border: 2px solid #bbbb00; margin: 0 .1em; }
140
+
141
+ @media (prefers-color-scheme: dark) { header button.par.show_par { background: #650; } }
142
+
143
+ #help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; }
144
+
145
+ #source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; }
146
+
147
+ #help_panel_wrapper { float: right; position: relative; }
148
+
149
+ #keyboard_icon { margin: 5px; }
150
+
151
+ #help_panel_state { display: none; }
152
+
153
+ #help_panel { top: 25px; right: 0; padding: .75em; border: 1px solid #883; color: #333; }
154
+
155
+ #help_panel .keyhelp p { margin-top: .75em; }
156
+
157
+ #help_panel .legend { font-style: italic; margin-bottom: 1em; }
158
+
159
+ .indexfile #help_panel { width: 25em; }
160
+
161
+ .pyfile #help_panel { width: 18em; }
162
+
163
+ #help_panel_state:checked ~ #help_panel { display: block; }
164
+
165
+ kbd { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; border-radius: 3px; }
166
+
167
+ #source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
168
+
169
+ #source p { position: relative; white-space: pre; }
170
+
171
+ #source p * { box-sizing: border-box; }
172
+
173
+ #source p .n { float: left; text-align: right; width: 3.5rem; box-sizing: border-box; margin-left: -3.5rem; padding-right: 1em; color: #999; user-select: none; }
174
+
175
+ @media (prefers-color-scheme: dark) { #source p .n { color: #777; } }
176
+
177
+ #source p .n.highlight { background: #ffdd00; }
178
+
179
+ #source p .n a { scroll-margin-top: 6em; text-decoration: none; color: #999; }
180
+
181
+ @media (prefers-color-scheme: dark) { #source p .n a { color: #777; } }
182
+
183
+ #source p .n a:hover { text-decoration: underline; color: #999; }
184
+
185
+ @media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } }
186
+
187
+ #source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; }
188
+
189
+ @media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } }
190
+
191
+ #source p .t:hover { background: #f2f2f2; }
192
+
193
+ @media (prefers-color-scheme: dark) { #source p .t:hover { background: #282828; } }
194
+
195
+ #source p .t:hover ~ .r .annotate.long { display: block; }
196
+
197
+ #source p .t .com { color: #008000; font-style: italic; line-height: 1px; }
198
+
199
+ @media (prefers-color-scheme: dark) { #source p .t .com { color: #6a9955; } }
200
+
201
+ #source p .t .key { font-weight: bold; line-height: 1px; }
202
+
203
+ #source p .t .str, #source p .t .fst { color: #0451a5; }
204
+
205
+ @media (prefers-color-scheme: dark) { #source p .t .str, #source p .t .fst { color: #9cdcfe; } }
206
+
207
+ #source p.mis .t { border-left: 0.2em solid #ff0000; }
208
+
209
+ #source p.mis.show_mis .t { background: #fdd; }
210
+
211
+ @media (prefers-color-scheme: dark) { #source p.mis.show_mis .t { background: #4b1818; } }
212
+
213
+ #source p.mis.show_mis .t:hover { background: #f2d2d2; }
214
+
215
+ @media (prefers-color-scheme: dark) { #source p.mis.show_mis .t:hover { background: #532323; } }
216
+
217
+ #source p.mis.mis2 .t { border-left: 0.2em dotted #ff0000; }
218
+
219
+ #source p.mis.mis2.show_mis .t { background: #ffeeee; }
220
+
221
+ @media (prefers-color-scheme: dark) { #source p.mis.mis2.show_mis .t { background: #351b1b; } }
222
+
223
+ #source p.mis.mis2.show_mis .t:hover { background: #f2d2d2; }
224
+
225
+ @media (prefers-color-scheme: dark) { #source p.mis.mis2.show_mis .t:hover { background: #532323; } }
226
+
227
+ #source p.run .t { border-left: 0.2em solid #00dd00; }
228
+
229
+ #source p.run.show_run .t { background: #dfd; }
230
+
231
+ @media (prefers-color-scheme: dark) { #source p.run.show_run .t { background: #373d29; } }
232
+
233
+ #source p.run.show_run .t:hover { background: #d2f2d2; }
234
+
235
+ @media (prefers-color-scheme: dark) { #source p.run.show_run .t:hover { background: #404633; } }
236
+
237
+ #source p.run.run2 .t { border-left: 0.2em dotted #00dd00; }
238
+
239
+ #source p.run.run2.show_run .t { background: #eeffee; }
240
+
241
+ @media (prefers-color-scheme: dark) { #source p.run.run2.show_run .t { background: #2b2e24; } }
242
+
243
+ #source p.run.run2.show_run .t:hover { background: #d2f2d2; }
244
+
245
+ @media (prefers-color-scheme: dark) { #source p.run.run2.show_run .t:hover { background: #404633; } }
246
+
247
+ #source p.exc .t { border-left: 0.2em solid #808080; }
248
+
249
+ #source p.exc.show_exc .t { background: #eee; }
250
+
251
+ @media (prefers-color-scheme: dark) { #source p.exc.show_exc .t { background: #333; } }
252
+
253
+ #source p.exc.show_exc .t:hover { background: #e2e2e2; }
254
+
255
+ @media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } }
256
+
257
+ #source p.exc.exc2 .t { border-left: 0.2em dotted #808080; }
258
+
259
+ #source p.exc.exc2.show_exc .t { background: #f7f7f7; }
260
+
261
+ @media (prefers-color-scheme: dark) { #source p.exc.exc2.show_exc .t { background: #292929; } }
262
+
263
+ #source p.exc.exc2.show_exc .t:hover { background: #e2e2e2; }
264
+
265
+ @media (prefers-color-scheme: dark) { #source p.exc.exc2.show_exc .t:hover { background: #3c3c3c; } }
266
+
267
+ #source p.par .t { border-left: 0.2em solid #bbbb00; }
268
+
269
+ #source p.par.show_par .t { background: #ffa; }
270
+
271
+ @media (prefers-color-scheme: dark) { #source p.par.show_par .t { background: #650; } }
272
+
273
+ #source p.par.show_par .t:hover { background: #f2f2a2; }
274
+
275
+ @media (prefers-color-scheme: dark) { #source p.par.show_par .t:hover { background: #6d5d0c; } }
276
+
277
+ #source p.par.par2 .t { border-left: 0.2em dotted #bbbb00; }
278
+
279
+ #source p.par.par2.show_par .t { background: #ffffd5; }
280
+
281
+ @media (prefers-color-scheme: dark) { #source p.par.par2.show_par .t { background: #423a0f; } }
282
+
283
+ #source p.par.par2.show_par .t:hover { background: #f2f2a2; }
284
+
285
+ @media (prefers-color-scheme: dark) { #source p.par.par2.show_par .t:hover { background: #6d5d0c; } }
286
+
287
+ #source p .r { position: absolute; top: 0; right: 2.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; }
288
+
289
+ #source p .annotate { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #666; padding-right: .5em; }
290
+
291
+ @media (prefers-color-scheme: dark) { #source p .annotate { color: #ddd; } }
292
+
293
+ #source p .annotate.short:hover ~ .long { display: block; }
294
+
295
+ #source p .annotate.long { width: 30em; right: 2.5em; }
296
+
297
+ #source p input { display: none; }
298
+
299
+ #source p input ~ .r label.ctx { cursor: pointer; border-radius: .25em; }
300
+
301
+ #source p input ~ .r label.ctx::before { content: "▶ "; }
302
+
303
+ #source p input ~ .r label.ctx:hover { background: #e8f4ff; color: #666; }
304
+
305
+ @media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } }
306
+
307
+ @media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } }
308
+
309
+ #source p input:checked ~ .r label.ctx { background: #d0e8ff; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; }
310
+
311
+ @media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } }
312
+
313
+ @media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { color: #aaa; } }
314
+
315
+ #source p input:checked ~ .r label.ctx::before { content: "▼ "; }
316
+
317
+ #source p input:checked ~ .ctxs { padding: .25em .5em; overflow-y: scroll; max-height: 10.5em; }
318
+
319
+ #source p label.ctx { color: #999; display: inline-block; padding: 0 .5em; font-size: .8333em; }
320
+
321
+ @media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } }
322
+
323
+ #source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #d0e8ff; border-radius: .25em; margin-right: 1.75em; text-align: right; }
324
+
325
+ @media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } }
326
+
327
+ #index { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.875em; }
328
+
329
+ #index table.index { margin-left: -.5em; }
330
+
331
+ #index td, #index th { text-align: right; vertical-align: baseline; padding: .25em .5em; border-bottom: 1px solid #eee; }
332
+
333
+ @media (prefers-color-scheme: dark) { #index td, #index th { border-color: #333; } }
334
+
335
+ #index td.name, #index th.name { text-align: left; width: auto; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; min-width: 15em; }
336
+
337
+ #index td.left, #index th.left { text-align: left; }
338
+
339
+ #index td.spacer, #index th.spacer { border: none; padding: 0; }
340
+
341
+ #index td.spacer:hover, #index th.spacer:hover { background: inherit; }
342
+
343
+ #index th { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-style: italic; color: #333; border-color: #ccc; cursor: pointer; }
344
+
345
+ @media (prefers-color-scheme: dark) { #index th { color: #ddd; } }
346
+
347
+ @media (prefers-color-scheme: dark) { #index th { border-color: #444; } }
348
+
349
+ #index th:hover { background: #eee; }
350
+
351
+ @media (prefers-color-scheme: dark) { #index th:hover { background: #333; } }
352
+
353
+ #index th .arrows { color: #666; font-size: 85%; font-family: sans-serif; font-style: normal; pointer-events: none; }
354
+
355
+ #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { white-space: nowrap; background: #eee; padding-left: .5em; }
356
+
357
+ @media (prefers-color-scheme: dark) { #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { background: #333; } }
358
+
359
+ #index th[aria-sort="ascending"] .arrows::after { content: " ▲"; }
360
+
361
+ #index th[aria-sort="descending"] .arrows::after { content: " ▼"; }
362
+
363
+ #index tr.grouphead th { cursor: default; font-style: normal; border-color: #999; }
364
+
365
+ @media (prefers-color-scheme: dark) { #index tr.grouphead th { border-color: #777; } }
366
+
367
+ #index td.name { font-size: 1.15em; }
368
+
369
+ #index td.name a { text-decoration: none; color: inherit; }
370
+
371
+ #index td.name .no-noun { font-style: italic; }
372
+
373
+ #index tr.total td, #index tr.total_dynamic td { font-weight: bold; border-bottom: none; }
374
+
375
+ #index tr.region:hover { background: #eee; }
376
+
377
+ @media (prefers-color-scheme: dark) { #index tr.region:hover { background: #333; } }
378
+
379
+ #index tr.region:hover td.name { text-decoration: underline; color: inherit; }
380
+
381
+ #scroll_marker { position: fixed; z-index: 3; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; }
382
+
383
+ @media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } }
384
+
385
+ @media (prefers-color-scheme: dark) { #scroll_marker { border-color: #333; } }
386
+
387
+ #scroll_marker .marker { background: #ccc; position: absolute; min-height: 3px; width: 100%; }
388
+
389
+ @media (prefers-color-scheme: dark) { #scroll_marker .marker { background: #444; } }
htmlcov/z_1008c76b8ac6114d___init___py.html ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/extraction/__init__.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">8 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">8<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_bc1132832c822a8b_statistical_tests_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_1008c76b8ac6114d_artifact_exporter_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">Simulations produce a lot of data, and it is often useful to extract these data in a structured way. For instance, you might wish to:</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="str"> - Extract the main points from an agent's interactions history, so that you can consult them later in a concise form.</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="str"> - Generate synthetic data from a simulation, so that you can use it for training machine learning models or testing software.</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="str"> - Simply turn some of the data into a more machine-readable format, such as JSON or CSV, so that you can analyze it more easily.</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="str">This module provides various utilities to help you extract data from TinyTroupe elements, such as agents and worlds. It also provides a </span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="str">mechanism to reduce the extracted data to a more concise form, and to export artifacts from TinyTroupe elements. Incidentaly, it showcases </span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="str">one of the many ways in which agent simulations differ from AI assistants, as the latter are not designed to be introspected in this way.</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
94
+ <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="com"># Exposed API</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span><span class="op">.</span><span class="nam">artifact_exporter</span> <span class="key">import</span> <span class="nam">ArtifactExporter</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span><span class="op">.</span><span class="nam">normalizer</span> <span class="key">import</span> <span class="nam">Normalizer</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span><span class="op">.</span><span class="nam">results_extractor</span> <span class="key">import</span> <span class="nam">ResultsExtractor</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span><span class="op">.</span><span class="nam">results_reducer</span> <span class="key">import</span> <span class="nam">ResultsReducer</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span><span class="op">.</span><span class="nam">results_reporter</span> <span class="key">import</span> <span class="nam">ResultsReporter</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="nam">__all__</span> <span class="op">=</span> <span class="op">[</span><span class="str">"ArtifactExporter"</span><span class="op">,</span> <span class="str">"Normalizer"</span><span class="op">,</span> <span class="str">"ResultsExtractor"</span><span class="op">,</span> <span class="str">"ResultsReducer"</span><span class="op">,</span> <span class="str">"ResultsReporter"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
107
+ </main>
108
+ <footer>
109
+ <div class="content">
110
+ <p>
111
+ <a class="nav" href="z_bc1132832c822a8b_statistical_tests_py.html">&#xab; prev</a> &nbsp; &nbsp;
112
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
113
+ <a class="nav" href="z_1008c76b8ac6114d_artifact_exporter_py.html">&#xbb; next</a>
114
+ &nbsp; &nbsp; &nbsp;
115
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
116
+ created at 2026-02-28 17:48 +0000
117
+ </p>
118
+ </div>
119
+ </footer>
120
+ </body>
121
+ </html>
htmlcov/z_1008c76b8ac6114d_artifact_exporter_py.html ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/extraction/artifact_exporter.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;artifact_exporter.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">63 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">63<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_1008c76b8ac6114d___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_1008c76b8ac6114d_normalizer_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">pandas</span> <span class="key">as</span> <span class="nam">pd</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">pypandoc</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">markdown</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span><span class="op">,</span> <span class="nam">List</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">JsonSerializableRegistry</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">class</span> <span class="nam">ArtifactExporter</span><span class="op">(</span><span class="nam">JsonSerializableRegistry</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> An artifact exporter is responsible for exporting artifacts from TinyTroupe elements, for example </span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str"> in order to create synthetic data files from simulations. </span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">base_output_folder</span><span class="op">:</span><span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">base_output_folder</span> <span class="op">=</span> <span class="nam">base_output_folder</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">def</span> <span class="nam">export</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">artifact_name</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">:</span><span class="nam">Union</span><span class="op">[</span><span class="nam">dict</span><span class="op">,</span> <span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">content_format</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">target_format</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="str">"txt"</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> Exports the specified artifact data to a file.</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> artifact_name (str): The name of the artifact.</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="str"> artifact_data (Union[dict, str]): The data to export. If a dict is given, it will be saved as JSON. </span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> If a string is given, it will be saved as is.</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> content_type (str): The type of the content within the artifact.</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="str"> content_format (str, optional): The format of the content within the artifact (e.g., md, csv, etc). Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> target_format (str): The format to export the artifact to (e.g., json, txt, docx, etc).</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="com"># dedent inputs, just in case</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">artifact_data</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">elif</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">dict</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">artifact_data</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="str">"The artifact data must be either a string or a dictionary."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="com"># clean the artifact name of invalid characters</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">invalid_chars</span> <span class="op">=</span> <span class="op">[</span><span class="str">'/'</span><span class="op">,</span> <span class="str">'\\'</span><span class="op">,</span> <span class="str">':'</span><span class="op">,</span> <span class="str">'*'</span><span class="op">,</span> <span class="str">'?'</span><span class="op">,</span> <span class="str">'"'</span><span class="op">,</span> <span class="str">'&lt;'</span><span class="op">,</span> <span class="str">'>'</span><span class="op">,</span> <span class="str">'|'</span><span class="op">,</span> <span class="str">'\n'</span><span class="op">,</span> <span class="str">'\t'</span><span class="op">,</span> <span class="str">'\r'</span><span class="op">,</span> <span class="str">';'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">for</span> <span class="nam">char</span> <span class="key">in</span> <span class="nam">invalid_chars</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="com"># check if the character is in the artifact name</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">if</span> <span class="nam">char</span> <span class="key">in</span> <span class="nam">artifact_name</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="com"># replace the character with an underscore</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">artifact_name</span> <span class="op">=</span> <span class="nam">artifact_name</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="nam">char</span><span class="op">,</span> <span class="str">"-"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Replaced invalid character </span><span class="op">{</span><span class="nam">char</span><span class="op">}</span><span class="fst"> with hyphen in artifact name '</span><span class="op">{</span><span class="nam">artifact_name</span><span class="op">}</span><span class="fst">'.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">artifact_file_path</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_compose_filepath</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">artifact_name</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">,</span> <span class="nam">target_format</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
138
+ <p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">if</span> <span class="nam">target_format</span> <span class="op">==</span> <span class="str">"json"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_export_as_json</span><span class="op">(</span><span class="nam">artifact_file_path</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">elif</span> <span class="nam">target_format</span> <span class="op">==</span> <span class="str">"txt"</span> <span class="key">or</span> <span class="nam">target_format</span> <span class="op">==</span> <span class="str">"text"</span> <span class="key">or</span> <span class="nam">target_format</span> <span class="op">==</span> <span class="str">"md"</span> <span class="key">or</span> <span class="nam">target_format</span> <span class="op">==</span> <span class="str">"markdown"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_export_as_txt</span><span class="op">(</span><span class="nam">artifact_file_path</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="key">elif</span> <span class="nam">target_format</span> <span class="op">==</span> <span class="str">"docx"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_export_as_docx</span><span class="op">(</span><span class="nam">artifact_file_path</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">content_format</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Unsupported target format: </span><span class="op">{</span><span class="nam">target_format</span><span class="op">}</span><span class="fst">.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
148
+ <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">def</span> <span class="nam">_export_as_txt</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">artifact_file_path</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">:</span><span class="nam">Union</span><span class="op">[</span><span class="nam">dict</span><span class="op">,</span> <span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="str"> Exports the specified artifact data to a text file.</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="key">with</span> <span class="nam">open</span><span class="op">(</span><span class="nam">artifact_file_path</span><span class="op">,</span> <span class="str">'w'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">"utf-8"</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">"replace"</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">dict</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">content</span> <span class="op">=</span> <span class="nam">artifact_data</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">content</span> <span class="op">=</span> <span class="nam">artifact_data</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">f</span><span class="op">.</span><span class="nam">write</span><span class="op">(</span><span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">def</span> <span class="nam">_export_as_json</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">artifact_file_path</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">:</span><span class="nam">Union</span><span class="op">[</span><span class="nam">dict</span><span class="op">,</span> <span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="str"> Exports the specified artifact data to a JSON file.</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
166
+ <p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">with</span> <span class="nam">open</span><span class="op">(</span><span class="nam">artifact_file_path</span><span class="op">,</span> <span class="str">'w'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">"utf-8"</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">"replace"</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">dict</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">json</span><span class="op">.</span><span class="nam">dump</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">f</span><span class="op">,</span> <span class="nam">indent</span><span class="op">=</span><span class="num">4</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
170
+ <p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="str">"The artifact data must be a dictionary to export to JSON."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
172
+ <p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">def</span> <span class="nam">_export_as_docx</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">artifact_file_path</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">:</span><span class="nam">Union</span><span class="op">[</span><span class="nam">dict</span><span class="op">,</span> <span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">content_original_format</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"><span class="str"> Exports the specified artifact data to a DOCX file.</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="com"># original format must be 'text' or 'markdown'</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">if</span> <span class="nam">content_original_format</span> <span class="key">not</span> <span class="key">in</span> <span class="op">[</span><span class="str">'text'</span><span class="op">,</span> <span class="str">'txt'</span><span class="op">,</span> <span class="str">'markdown'</span><span class="op">,</span> <span class="str">'md'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="fst">f"</span><span class="fst">The original format cannot be </span><span class="op">{</span><span class="nam">content_original_format</span><span class="op">}</span><span class="fst"> to export to DOCX.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="com"># normalize content value</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">content_original_format</span> <span class="op">=</span> <span class="str">'markdown'</span> <span class="key">if</span> <span class="nam">content_original_format</span> <span class="op">==</span> <span class="str">'md'</span> <span class="key">else</span> <span class="nam">content_original_format</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="com"># first, get the content to export. If `artifact_date` is a dict, the contant should be under the key `content`.</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="com"># If it is a string, the content is the string itself.</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="com"># using pypandoc</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">dict</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="nam">content</span> <span class="op">=</span> <span class="nam">artifact_data</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">content</span> <span class="op">=</span> <span class="nam">artifact_data</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
192
+ <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="com"># first, convert to HTML. This is necessary because pypandoc does not support a GOOD direct conversion from markdown to DOCX.</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">html_content</span> <span class="op">=</span> <span class="nam">markdown</span><span class="op">.</span><span class="nam">markdown</span><span class="op">(</span><span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
195
+ <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="com">## write this intermediary HTML to file</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="com">#html_file_path = artifact_file_path.replace(".docx", ".html")</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="com">#with open(html_file_path, 'w', encoding="utf-8", errors="replace") as f:</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="com"># f.write(html_content)</span>&nbsp;</span><span class="r"></span></p>
199
+ <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
200
+ <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="com"># then, convert to DOCX</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="nam">pypandoc</span><span class="op">.</span><span class="nam">convert_text</span><span class="op">(</span><span class="nam">html_content</span><span class="op">,</span> <span class="str">'docx'</span><span class="op">,</span> <span class="nam">format</span><span class="op">=</span><span class="str">'html'</span><span class="op">,</span> <span class="nam">outputfile</span><span class="op">=</span><span class="nam">artifact_file_path</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
203
+ <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="com">###########################################################</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="com"># IO</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="com">###########################################################</span>&nbsp;</span><span class="r"></span></p>
206
+ <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
207
+ <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="key">def</span> <span class="nam">_compose_filepath</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">artifact_data</span><span class="op">:</span><span class="nam">Union</span><span class="op">[</span><span class="nam">dict</span><span class="op">,</span> <span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">artifact_name</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">target_format</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"><span class="str"> Composes the file path for the artifact to export.</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
211
+ <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="str"> artifact_data (Union[dict, str]): The data to export.</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"><span class="str"> artifact_name (str): The name of the artifact.</span>&nbsp;</span><span class="r"></span></p>
214
+ <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"><span class="str"> content_type (str): The type of the content within the artifact.</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"><span class="str"> content_format (str, optional): The format of the content within the artifact (e.g., md, csv, etc). Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="com"># Extension definition: </span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="com"># - If the content format is specified, we use it as the part of the extension.</span>&nbsp;</span><span class="r"></span></p>
222
+ <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="com"># - If artificat_data is a dict, we add .json to the extension. Note that if content format was specified, we'd get &lt;content_format>.json.</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="com"># - If artifact_data is a string and no content format is specified, we add .txt to the extension.</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="mis show_mis"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="nam">extension</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
225
+ <p class="mis show_mis"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="key">if</span> <span class="nam">target_format</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">extension</span> <span class="op">=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">target_format</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="key">elif</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">artifact_data</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span> <span class="key">and</span> <span class="nam">target_format</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">extension</span> <span class="op">=</span> <span class="str">"txt"</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
230
+ <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="com"># content type definition</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="mis show_mis"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="key">if</span> <span class="nam">content_type</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">subfolder</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="nam">subfolder</span> <span class="op">=</span> <span class="nam">content_type</span>&nbsp;</span><span class="r"></span></p>
235
+ <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
236
+ <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="com"># save to the specified file name or path, considering the base output folder.</span>&nbsp;</span><span class="r"></span></p>
237
+ <p class="mis show_mis"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="nam">artifact_file_path</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">base_output_folder</span><span class="op">,</span> <span class="nam">subfolder</span><span class="op">,</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">artifact_name</span><span class="op">}</span><span class="fst">.</span><span class="op">{</span><span class="nam">extension</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
239
+ <p class="pln"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="com"># create intermediate directories if necessary</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="mis show_mis"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">makedirs</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">artifact_file_path</span><span class="op">)</span><span class="op">,</span> <span class="nam">exist_ok</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
242
+ <p class="mis show_mis"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="key">return</span> <span class="nam">artifact_file_path</span>&nbsp;</span><span class="r"></span></p>
243
+ </main>
244
+ <footer>
245
+ <div class="content">
246
+ <p>
247
+ <a class="nav" href="z_1008c76b8ac6114d___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
248
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
249
+ <a class="nav" href="z_1008c76b8ac6114d_normalizer_py.html">&#xbb; next</a>
250
+ &nbsp; &nbsp; &nbsp;
251
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
252
+ created at 2026-02-28 17:48 +0000
253
+ </p>
254
+ </div>
255
+ </footer>
256
+ </body>
257
+ </html>
htmlcov/z_1008c76b8ac6114d_normalizer_py.html ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/extraction/normalizer.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;normalizer.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">52 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">52<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_1008c76b8ac6114d_artifact_exporter_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_1008c76b8ac6114d_results_extractor_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">pandas</span> <span class="key">as</span> <span class="nam">pd</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span><span class="op">,</span> <span class="nam">List</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
88
+ <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">openai_utils</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">class</span> <span class="nam">Normalizer</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="str"> A mechanism to normalize passages, concepts and other textual elements.</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">elements</span><span class="op">:</span><span class="nam">List</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span> <span class="nam">n</span><span class="op">:</span><span class="nam">int</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> Normalizes the specified elements.</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> elements (list): The elements to normalize.</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> n (int): The number of normalized elements to output.</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="com"># ensure elements are unique</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">elements</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">set</span><span class="op">(</span><span class="nam">elements</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">n</span> <span class="op">=</span> <span class="nam">n</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">verbose</span> <span class="op">=</span> <span class="nam">verbose</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="com"># a JSON-based structure, where each output element is a key to a list of input elements that were merged into it</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">normalized_elements</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="com"># a dict that maps each input element to its normalized output. This will be used as cache later.</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">normalizing_map</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span><span class="str">"n"</span><span class="op">:</span> <span class="nam">n</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis mis2 show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="str">"elements"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">elements</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">compose_initial_LLM_messages_with_templates</span><span class="op">(</span><span class="str">"normalizer.system.mustache"</span><span class="op">,</span> <span class="str">"normalizer.user.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis mis2 show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">base_module_folder</span><span class="op">=</span><span class="str">"extraction"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis mis2 show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">=</span><span class="nam">rendering_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">temperature</span><span class="op">=</span><span class="num">0.1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">debug_msg</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Normalization result message: </span><span class="op">{</span><span class="nam">next_message</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">extract_json</span><span class="op">(</span><span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">normalized_elements</span> <span class="op">=</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
137
+ <p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">def</span> <span class="nam">normalize</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">element_or_elements</span><span class="op">:</span><span class="nam">Union</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">List</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">]</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Union</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">List</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> Normalizes the specified element or elements.</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="str"> This method uses a caching mechanism to improve performance. If an element has been normalized before, </span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"><span class="str"> its normalized form is stored in a cache (self.normalizing_map). When the same element needs to be </span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> normalized again, the method will first check the cache and use the stored normalized form if available, </span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="str"> instead of normalizing the element again.</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="str"> The order of elements in the output will be the same as in the input. This is ensured by processing </span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"><span class="str"> the elements in the order they appear in the input and appending the normalized elements to the output </span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"><span class="str"> list in the same order.</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"><span class="str"> element_or_elements (Union[str, List[str]]): The element or elements to normalize.</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"><span class="str"> str: The normalized element if the input was a string.</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"><span class="str"> list: The normalized elements if the input was a list, preserving the order of elements in the input.</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">element_or_elements</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="nam">denormalized_elements</span> <span class="op">=</span> <span class="op">[</span><span class="nam">element_or_elements</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="key">elif</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">element_or_elements</span><span class="op">,</span> <span class="nam">list</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">denormalized_elements</span> <span class="op">=</span> <span class="nam">element_or_elements</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="str">"The element_or_elements must be either a string or a list."</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
164
+ <p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">normalized_elements</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">elements_to_normalize</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">for</span> <span class="nam">element</span> <span class="key">in</span> <span class="nam">denormalized_elements</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="key">if</span> <span class="nam">element</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">normalizing_map</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">elements_to_normalize</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">element</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="key">if</span> <span class="nam">elements_to_normalize</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span><span class="str">"categories"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">normalized_elements</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="mis mis2 show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="str">"elements"</span><span class="op">:</span> <span class="nam">elements_to_normalize</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
174
+ <p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">compose_initial_LLM_messages_with_templates</span><span class="op">(</span><span class="str">"normalizer.applier.system.mustache"</span><span class="op">,</span> <span class="str">"normalizer.applier.user.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="mis mis2 show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="nam">base_module_folder</span><span class="op">=</span><span class="str">"extraction"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="mis mis2 show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">=</span><span class="nam">rendering_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">temperature</span><span class="op">=</span><span class="num">0.1</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
180
+ <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">debug_msg</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Normalization result message: </span><span class="op">{</span><span class="nam">next_message</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">normalized_elements_from_llm</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">extract_json</span><span class="op">(</span><span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">assert</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">normalized_elements_from_llm</span><span class="op">,</span> <span class="nam">list</span><span class="op">)</span><span class="op">,</span> <span class="str">"The normalized element must be a list."</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">assert</span> <span class="nam">len</span><span class="op">(</span><span class="nam">normalized_elements_from_llm</span><span class="op">)</span> <span class="op">==</span> <span class="nam">len</span><span class="op">(</span><span class="nam">elements_to_normalize</span><span class="op">)</span><span class="op">,</span> <span class="str">"The number of normalized elements must be equal to the number of elements to normalize."</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">element</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">elements_to_normalize</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">normalized_element</span> <span class="op">=</span> <span class="nam">normalized_elements_from_llm</span><span class="op">[</span><span class="nam">i</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">normalizing_map</span><span class="op">[</span><span class="nam">element</span><span class="op">]</span> <span class="op">=</span> <span class="nam">normalized_element</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">for</span> <span class="nam">element</span> <span class="key">in</span> <span class="nam">denormalized_elements</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">normalized_elements</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">normalizing_map</span><span class="op">[</span><span class="nam">element</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
196
+ <p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="key">return</span> <span class="nam">normalized_elements</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
198
+ </main>
199
+ <footer>
200
+ <div class="content">
201
+ <p>
202
+ <a class="nav" href="z_1008c76b8ac6114d_artifact_exporter_py.html">&#xab; prev</a> &nbsp; &nbsp;
203
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
204
+ <a class="nav" href="z_1008c76b8ac6114d_results_extractor_py.html">&#xbb; next</a>
205
+ &nbsp; &nbsp; &nbsp;
206
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
207
+ created at 2026-02-28 17:48 +0000
208
+ </p>
209
+ </div>
210
+ </footer>
211
+ </body>
212
+ </html>
htmlcov/z_1008c76b8ac6114d_results_extractor_py.html ADDED
@@ -0,0 +1,365 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/extraction/results_extractor.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_extractor.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">87 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">87<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_1008c76b8ac6114d_normalizer_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_1008c76b8ac6114d_results_reducer_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">chevron</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">pandas</span> <span class="key">as</span> <span class="nam">pd</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span><span class="op">,</span> <span class="nam">List</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">agent</span> <span class="key">import</span> <span class="nam">TinyPerson</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">environment</span> <span class="key">import</span> <span class="nam">TinyWorld</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">openai_utils</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
97
+ <p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="key">class</span> <span class="nam">ResultsExtractor</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis mis2 show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">extraction_prompt_template_path</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">__file__</span><span class="op">)</span><span class="op">,</span> <span class="str">'./prompts/interaction_results_extractor.mustache'</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis mis2 show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span> <span class="str">"The main points present in the agents' interactions history."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis mis2 show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">situation</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span> <span class="str">""</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis mis2 show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">fields</span><span class="op">:</span><span class="nam">List</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis mis2 show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="nam">fields_hints</span><span class="op">:</span><span class="nam">dict</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis mis2 show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span> <span class="op">=</span> <span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> Initializes the ResultsExtractor with default parameters.</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="str"> extraction_prompt_template_path (str): The path to the extraction prompt template.</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> extraction_objective (str): The default extraction objective.</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> situation (str): The default situation to consider.</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="str"> fields (List[str], optional): The default fields to extract. Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> fields_hints (dict, optional): The default hints for the fields to extract. Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages by default. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_extraction_prompt_template_path</span> <span class="op">=</span> <span class="nam">extraction_prompt_template_path</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="com"># Default parameters</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">default_extraction_objective</span> <span class="op">=</span> <span class="nam">extraction_objective</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">default_situation</span> <span class="op">=</span> <span class="nam">situation</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">default_fields</span> <span class="op">=</span> <span class="nam">fields</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">default_fields_hints</span> <span class="op">=</span> <span class="nam">fields_hints</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">default_verbose</span> <span class="op">=</span> <span class="nam">verbose</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="com"># Cache for the last extraction results</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">agent_extraction</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">world_extraction</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">def</span> <span class="nam">extract_results_from_agents</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis mis2 show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">agents</span><span class="op">:</span><span class="nam">List</span><span class="op">[</span><span class="nam">TinyPerson</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis mis2 show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis mis2 show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">situation</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis mis2 show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">fields</span><span class="op">:</span><span class="nam">list</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis mis2 show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">fields_hints</span><span class="op">:</span><span class="nam">dict</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="mis mis2 show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> Extracts results from a list of TinyPerson instances.</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="str"> agents (List[TinyPerson]): The list of TinyPerson instances to extract results from.</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"><span class="str"> extraction_objective (str): The extraction objective.</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> situation (str): The situation to consider.</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="str"> fields (list, optional): The fields to extract. If None, the extractor will decide what names to use. </span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"><span class="str"> Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="str"> fields_hints (dict, optional): Hints for the fields to extract. Maps field names to strings with the hints. Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">results</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">for</span> <span class="nam">agent</span> <span class="key">in</span> <span class="nam">agents</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">extract_results_from_agent</span><span class="op">(</span><span class="nam">agent</span><span class="op">,</span> <span class="nam">extraction_objective</span><span class="op">,</span> <span class="nam">situation</span><span class="op">,</span> <span class="nam">fields</span><span class="op">,</span> <span class="nam">fields_hints</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">results</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
156
+ <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="nam">results</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="key">def</span> <span class="nam">extract_results_from_agent</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis mis2 show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">tinyperson</span><span class="op">:</span><span class="nam">TinyPerson</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="mis mis2 show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="str">"The main points present in the agent's interactions history."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis mis2 show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">situation</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span> <span class="str">""</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="mis mis2 show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">fields</span><span class="op">:</span><span class="nam">list</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="mis mis2 show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="nam">fields_hints</span><span class="op">:</span><span class="nam">dict</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="mis mis2 show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> Extracts results from a TinyPerson instance.</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
168
+ <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"><span class="str"> tinyperson (TinyPerson): The TinyPerson instance to extract results from.</span>&nbsp;</span><span class="r"></span></p>
170
+ <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="str"> extraction_objective (str): The extraction objective.</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"><span class="str"> situation (str): The situation to consider.</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"><span class="str"> fields (list, optional): The fields to extract. If None, the extractor will decide what names to use. </span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"><span class="str"> Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"><span class="str"> fields_hints (dict, optional): Hints for the fields to extract. Maps field names to strings with the hints. Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">,</span> <span class="nam">situation</span><span class="op">,</span> <span class="nam">fields</span><span class="op">,</span> <span class="nam">fields_hints</span><span class="op">,</span> <span class="nam">verbose</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_get_default_values_if_necessary</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="mis mis2 show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">,</span> <span class="nam">situation</span><span class="op">,</span> <span class="nam">fields</span><span class="op">,</span> <span class="nam">fields_hints</span><span class="op">,</span> <span class="nam">verbose</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="mis mis2 show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
184
+ <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">if</span> <span class="nam">fields</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">[</span><span class="str">"fields"</span><span class="op">]</span> <span class="op">=</span> <span class="str">", "</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">fields</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
188
+ <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">if</span> <span class="nam">fields_hints</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">[</span><span class="str">"fields_hints"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">fields_hints</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">messages</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">{</span><span class="str">"role"</span><span class="op">:</span> <span class="str">"system"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="mis mis2 show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="str">"content"</span><span class="op">:</span> <span class="nam">chevron</span><span class="op">.</span><span class="nam">render</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis mis2 show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">open</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">_extraction_prompt_template_path</span><span class="op">,</span> <span class="str">'r'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">'utf-8'</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">'replace'</span><span class="op">)</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="mis mis2 show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">)</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
197
+ <p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">interaction_history</span> <span class="op">=</span> <span class="nam">tinyperson</span><span class="op">.</span><span class="nam">pretty_current_interactions</span><span class="op">(</span><span class="nam">max_content_length</span><span class="op">=</span><span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
199
+ <p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="nam">extraction_request_prompt</span> <span class="op">=</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="mis mis2 show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"><span class="fst">f"""</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="mis mis2 show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"><span class="fst">## Extraction objective</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="mis mis2 show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
203
+ <p class="mis mis2 show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"><span class="op">{</span><span class="nam">extraction_objective</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="mis mis2 show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
205
+ <p class="mis mis2 show_mis"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="fst">## Situation</span>&nbsp;</span><span class="r"></span></p>
206
+ <p class="mis mis2 show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"><span class="fst">You are considering a single agent, named </span><span class="op">{</span><span class="nam">tinyperson</span><span class="op">.</span><span class="nam">name</span><span class="op">}</span><span class="fst">. Your objective thus refers to this agent specifically.</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="mis mis2 show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"><span class="op">{</span><span class="nam">situation</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="mis mis2 show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
209
+ <p class="mis mis2 show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"><span class="fst">## Agent Interactions History</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="mis mis2 show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
211
+ <p class="mis mis2 show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"><span class="fst">You will consider an agent's history of interactions, which include stimuli it received as well as actions it </span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="mis mis2 show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="fst">performed.</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="mis mis2 show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
214
+ <p class="mis mis2 show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"><span class="op">{</span><span class="nam">interaction_history</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="mis mis2 show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"><span class="fst">"""</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="mis show_mis"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="nam">messages</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">{</span><span class="str">"role"</span><span class="op">:</span> <span class="str">"user"</span><span class="op">,</span> <span class="str">"content"</span><span class="op">:</span> <span class="nam">extraction_request_prompt</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
218
+ <p class="mis show_mis"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">temperature</span><span class="op">=</span><span class="num">0.0</span><span class="op">,</span> <span class="nam">frequency_penalty</span><span class="op">=</span><span class="num">0.0</span><span class="op">,</span> <span class="nam">presence_penalty</span><span class="op">=</span><span class="num">0.0</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
220
+ <p class="mis show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="nam">debug_msg</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Extraction raw result message: </span><span class="op">{</span><span class="nam">next_message</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="mis show_mis"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
222
+ <p class="mis show_mis"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
225
+ <p class="mis show_mis"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="key">if</span> <span class="nam">next_message</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">extract_json</span><span class="op">(</span><span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
230
+ <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="com"># cache the result</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="mis show_mis"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">agent_extraction</span><span class="op">[</span><span class="nam">tinyperson</span><span class="op">.</span><span class="nam">name</span><span class="op">]</span> <span class="op">=</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
233
+ <p class="mis show_mis"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="key">return</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
235
+ <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
236
+ <p class="mis show_mis"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="key">def</span> <span class="nam">extract_results_from_world</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
237
+ <p class="mis mis2 show_mis"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="nam">tinyworld</span><span class="op">:</span><span class="nam">TinyWorld</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="mis mis2 show_mis"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="str">"The main points that can be derived from the agents conversations and actions."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
239
+ <p class="mis mis2 show_mis"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="nam">situation</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="str">""</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="mis mis2 show_mis"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="nam">fields</span><span class="op">:</span><span class="nam">list</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="mis mis2 show_mis"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="nam">fields_hints</span><span class="op">:</span><span class="nam">dict</span><span class="op">=</span><span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="mis mis2 show_mis"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
243
+ <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
244
+ <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"><span class="str"> Extracts results from a TinyWorld instance.</span>&nbsp;</span><span class="r"></span></p>
245
+ <p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
246
+ <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
247
+ <p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"><span class="str"> tinyworld (TinyWorld): The TinyWorld instance to extract results from.</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"><span class="str"> extraction_objective (str): The extraction objective.</span>&nbsp;</span><span class="r"></span></p>
249
+ <p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"><span class="str"> situation (str): The situation to consider.</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"><span class="str"> fields (list, optional): The fields to extract. If None, the extractor will decide what names to use. </span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"><span class="str"> Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
252
+ <p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
255
+ <p class="mis show_mis"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">,</span> <span class="nam">situation</span><span class="op">,</span> <span class="nam">fields</span><span class="op">,</span> <span class="nam">fields_hints</span><span class="op">,</span> <span class="nam">verbose</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_get_default_values_if_necessary</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
256
+ <p class="mis mis2 show_mis"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">,</span> <span class="nam">situation</span><span class="op">,</span> <span class="nam">fields</span><span class="op">,</span> <span class="nam">fields_hints</span><span class="op">,</span> <span class="nam">verbose</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="mis mis2 show_mis"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
258
+ <p class="pln"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
259
+ <p class="mis show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="pln"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
261
+ <p class="mis show_mis"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
262
+ <p class="mis show_mis"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="key">if</span> <span class="nam">fields</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
263
+ <p class="mis show_mis"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">[</span><span class="str">"fields"</span><span class="op">]</span> <span class="op">=</span> <span class="str">", "</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">fields</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
264
+ <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
265
+ <p class="mis show_mis"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="key">if</span> <span class="nam">fields_hints</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="mis show_mis"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">[</span><span class="str">"fields_hints"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">fields_hints</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
267
+ <p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
268
+ <p class="mis show_mis"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"> <span class="nam">messages</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">{</span><span class="str">"role"</span><span class="op">:</span> <span class="str">"system"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
269
+ <p class="mis mis2 show_mis"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="str">"content"</span><span class="op">:</span> <span class="nam">chevron</span><span class="op">.</span><span class="nam">render</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
270
+ <p class="mis mis2 show_mis"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="nam">open</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">_extraction_prompt_template_path</span><span class="op">,</span> <span class="str">'r'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">'utf-8'</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">'replace'</span><span class="op">)</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
271
+ <p class="mis mis2 show_mis"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">)</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
273
+ <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"> <span class="com"># TODO: either summarize first or break up into multiple tasks</span>&nbsp;</span><span class="r"></span></p>
274
+ <p class="mis show_mis"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="nam">interaction_history</span> <span class="op">=</span> <span class="nam">tinyworld</span><span class="op">.</span><span class="nam">pretty_current_interactions</span><span class="op">(</span><span class="nam">max_content_length</span><span class="op">=</span><span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
275
+ <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
276
+ <p class="mis show_mis"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"> <span class="nam">extraction_request_prompt</span> <span class="op">=</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
277
+ <p class="mis mis2 show_mis"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"><span class="fst">f"""</span>&nbsp;</span><span class="r"></span></p>
278
+ <p class="mis mis2 show_mis"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"><span class="fst">## Extraction objective</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="mis mis2 show_mis"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
280
+ <p class="mis mis2 show_mis"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"><span class="op">{</span><span class="nam">extraction_objective</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="mis mis2 show_mis"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
282
+ <p class="mis mis2 show_mis"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"><span class="fst">## Situation</span>&nbsp;</span><span class="r"></span></p>
283
+ <p class="mis mis2 show_mis"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"><span class="fst">You are considering various agents.</span>&nbsp;</span><span class="r"></span></p>
284
+ <p class="mis mis2 show_mis"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"><span class="op">{</span><span class="nam">situation</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
285
+ <p class="mis mis2 show_mis"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
286
+ <p class="mis mis2 show_mis"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"><span class="fst">## Agents Interactions History</span>&nbsp;</span><span class="r"></span></p>
287
+ <p class="mis mis2 show_mis"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
288
+ <p class="mis mis2 show_mis"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"><span class="fst">You will consider the history of interactions from various agents that exist in an environment called </span><span class="op">{</span><span class="nam">tinyworld</span><span class="op">.</span><span class="nam">name</span><span class="op">}</span><span class="fst">. </span>&nbsp;</span><span class="r"></span></p>
289
+ <p class="mis mis2 show_mis"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"><span class="fst">Each interaction history includes stimuli the corresponding agent received as well as actions it performed.</span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="mis mis2 show_mis"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
291
+ <p class="mis mis2 show_mis"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"><span class="op">{</span><span class="nam">interaction_history</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
292
+ <p class="mis mis2 show_mis"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"><span class="fst">"""</span>&nbsp;</span><span class="r"></span></p>
293
+ <p class="mis show_mis"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="nam">messages</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">{</span><span class="str">"role"</span><span class="op">:</span> <span class="str">"user"</span><span class="op">,</span> <span class="str">"content"</span><span class="op">:</span> <span class="nam">extraction_request_prompt</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
295
+ <p class="mis show_mis"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">temperature</span><span class="op">=</span><span class="num">0.0</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
297
+ <p class="mis show_mis"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="nam">debug_msg</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Extraction raw result message: </span><span class="op">{</span><span class="nam">next_message</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="mis show_mis"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
299
+ <p class="mis show_mis"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
300
+ <p class="mis show_mis"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
301
+ <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
302
+ <p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"> <span class="key">if</span> <span class="nam">next_message</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="mis show_mis"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">extract_json</span><span class="op">(</span><span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
304
+ <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
305
+ <p class="mis show_mis"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
306
+ <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
307
+ <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="com"># cache the result</span>&nbsp;</span><span class="r"></span></p>
308
+ <p class="mis show_mis"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">world_extraction</span><span class="op">[</span><span class="nam">tinyworld</span><span class="op">.</span><span class="nam">name</span><span class="op">]</span> <span class="op">=</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
309
+ <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
310
+ <p class="mis show_mis"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"> <span class="key">return</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
311
+ <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
312
+ <p class="mis show_mis"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"> <span class="key">def</span> <span class="nam">save_as_json</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">filename</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
313
+ <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
314
+ <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="str"> Saves the last extraction results as JSON.</span>&nbsp;</span><span class="r"></span></p>
315
+ <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
316
+ <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
317
+ <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"><span class="str"> filename (str): The filename to save the JSON to.</span>&nbsp;</span><span class="r"></span></p>
318
+ <p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug messages. Defaults to False.</span>&nbsp;</span><span class="r"></span></p>
319
+ <p class="pln"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
320
+ <p class="mis show_mis"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"> <span class="key">with</span> <span class="nam">open</span><span class="op">(</span><span class="nam">filename</span><span class="op">,</span> <span class="str">'w'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">"utf-8"</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">"replace"</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
321
+ <p class="mis show_mis"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"> <span class="nam">json</span><span class="op">.</span><span class="nam">dump</span><span class="op">(</span><span class="op">{</span><span class="str">"agent_extractions"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">agent_extraction</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
322
+ <p class="mis mis2 show_mis"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"> <span class="str">"world_extraction"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">world_extraction</span><span class="op">}</span><span class="op">,</span> <span class="nam">f</span><span class="op">,</span> <span class="nam">indent</span><span class="op">=</span><span class="num">4</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
323
+ <p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
324
+ <p class="mis show_mis"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
325
+ <p class="mis show_mis"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Saved extraction results to </span><span class="op">{</span><span class="nam">filename</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
326
+ <p class="pln"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
327
+ <p class="mis show_mis"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="key">def</span> <span class="nam">_get_default_values_if_necessary</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
328
+ <p class="mis mis2 show_mis"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="nam">extraction_objective</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
329
+ <p class="mis mis2 show_mis"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="nam">situation</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
330
+ <p class="mis mis2 show_mis"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="nam">fields</span><span class="op">:</span><span class="nam">List</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
331
+ <p class="mis mis2 show_mis"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="nam">fields_hints</span><span class="op">:</span><span class="nam">dict</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
332
+ <p class="mis mis2 show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
333
+ <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
334
+ <p class="mis show_mis"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="key">if</span> <span class="nam">extraction_objective</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
335
+ <p class="mis show_mis"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"> <span class="nam">extraction_objective</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">default_extraction_objective</span>&nbsp;</span><span class="r"></span></p>
336
+ <p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
337
+ <p class="mis show_mis"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"> <span class="key">if</span> <span class="nam">situation</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
338
+ <p class="mis show_mis"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"> <span class="nam">situation</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">default_situation</span>&nbsp;</span><span class="r"></span></p>
339
+ <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
340
+ <p class="mis show_mis"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"> <span class="key">if</span> <span class="nam">fields</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
341
+ <p class="mis show_mis"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="nam">fields</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">default_fields</span>&nbsp;</span><span class="r"></span></p>
342
+ <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
343
+ <p class="mis show_mis"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> <span class="key">if</span> <span class="nam">fields_hints</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
344
+ <p class="mis show_mis"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="nam">fields_hints</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">default_fields_hints</span>&nbsp;</span><span class="r"></span></p>
345
+ <p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
346
+ <p class="mis show_mis"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
347
+ <p class="mis show_mis"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"> <span class="nam">verbose</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">default_verbose</span>&nbsp;</span><span class="r"></span></p>
348
+ <p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
349
+ <p class="mis show_mis"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"> <span class="key">return</span> <span class="nam">extraction_objective</span><span class="op">,</span> <span class="nam">situation</span><span class="op">,</span> <span class="nam">fields</span><span class="op">,</span> <span class="nam">fields_hints</span><span class="op">,</span> <span class="nam">verbose</span>&nbsp;</span><span class="r"></span></p>
350
+ <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
351
+ </main>
352
+ <footer>
353
+ <div class="content">
354
+ <p>
355
+ <a class="nav" href="z_1008c76b8ac6114d_normalizer_py.html">&#xab; prev</a> &nbsp; &nbsp;
356
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
357
+ <a class="nav" href="z_1008c76b8ac6114d_results_reducer_py.html">&#xbb; next</a>
358
+ &nbsp; &nbsp; &nbsp;
359
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
360
+ created at 2026-02-28 17:48 +0000
361
+ </p>
362
+ </div>
363
+ </footer>
364
+ </body>
365
+ </html>
htmlcov/z_1008c76b8ac6114d_results_reducer_py.html ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/extraction/results_reducer.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;extraction&#8201;/&#8201;results_reducer.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">39 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">39<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_1008c76b8ac6114d_results_extractor_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_1008c76b8ac6114d_results_reporter_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">pandas</span> <span class="key">as</span> <span class="nam">pd</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">agent</span> <span class="key">import</span> <span class="nam">TinyPerson</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">class</span> <span class="nam">ResultsReducer</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">results</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
94
+ <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
96
+ <p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">def</span> <span class="nam">add_reduction_rule</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">trigger</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">func</span><span class="op">:</span> <span class="nam">callable</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">if</span> <span class="nam">trigger</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Rule for </span><span class="op">{</span><span class="nam">trigger</span><span class="op">}</span><span class="fst"> already exists.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span><span class="op">[</span><span class="nam">trigger</span><span class="op">]</span> <span class="op">=</span> <span class="nam">func</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">reduce_agent</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">agent</span><span class="op">:</span> <span class="nam">TinyPerson</span><span class="op">)</span> <span class="op">-></span> <span class="nam">list</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">reduction</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">for</span> <span class="nam">message</span> <span class="key">in</span> <span class="nam">agent</span><span class="op">.</span><span class="nam">episodic_memory</span><span class="op">.</span><span class="nam">retrieve_all</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">if</span> <span class="nam">message</span><span class="op">[</span><span class="str">'role'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'system'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">continue</span> <span class="com"># doing nothing for `system` role yet at least</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="key">elif</span> <span class="nam">message</span><span class="op">[</span><span class="str">'role'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'user'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="com"># User role is related to stimuli only</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="nam">stimulus_type</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">[</span><span class="str">'stimuli'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'type'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">stimulus_content</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">[</span><span class="str">'stimuli'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'content'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">stimulus_source</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">[</span><span class="str">'stimuli'</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'source'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">stimulus_timestamp</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'simulation_timestamp'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">if</span> <span class="nam">stimulus_type</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">extracted</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span><span class="op">[</span><span class="nam">stimulus_type</span><span class="op">]</span><span class="op">(</span><span class="nam">focus_agent</span><span class="op">=</span><span class="nam">agent</span><span class="op">,</span> <span class="nam">source_agent</span><span class="op">=</span><span class="nam">TinyPerson</span><span class="op">.</span><span class="nam">get_agent_by_name</span><span class="op">(</span><span class="nam">stimulus_source</span><span class="op">)</span><span class="op">,</span> <span class="nam">target_agent</span><span class="op">=</span><span class="nam">agent</span><span class="op">,</span> <span class="nam">kind</span><span class="op">=</span><span class="str">'stimulus'</span><span class="op">,</span> <span class="nam">event</span><span class="op">=</span><span class="nam">stimulus_type</span><span class="op">,</span> <span class="nam">content</span><span class="op">=</span><span class="nam">stimulus_content</span><span class="op">,</span> <span class="nam">timestamp</span><span class="op">=</span><span class="nam">stimulus_timestamp</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">if</span> <span class="nam">extracted</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">reduction</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">extracted</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">elif</span> <span class="nam">message</span><span class="op">[</span><span class="str">'role'</span><span class="op">]</span> <span class="op">==</span> <span class="str">'assistant'</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="com"># Assistant role is related to actions only</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">if</span> <span class="str">'action'</span> <span class="key">in</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">action_type</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">[</span><span class="str">'action'</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'type'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">action_content</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">[</span><span class="str">'action'</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'content'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">action_target</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">[</span><span class="str">'action'</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'target'</span><span class="op">,</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">action_timestamp</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="str">'simulation_timestamp'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">if</span> <span class="nam">action_type</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">extracted</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">rules</span><span class="op">[</span><span class="nam">action_type</span><span class="op">]</span><span class="op">(</span><span class="nam">focus_agent</span><span class="op">=</span><span class="nam">agent</span><span class="op">,</span> <span class="nam">source_agent</span><span class="op">=</span><span class="nam">agent</span><span class="op">,</span> <span class="nam">target_agent</span><span class="op">=</span><span class="nam">TinyPerson</span><span class="op">.</span><span class="nam">get_agent_by_name</span><span class="op">(</span><span class="nam">action_target</span><span class="op">)</span><span class="op">,</span> <span class="nam">kind</span><span class="op">=</span><span class="str">'action'</span><span class="op">,</span> <span class="nam">event</span><span class="op">=</span><span class="nam">action_type</span><span class="op">,</span> <span class="nam">content</span><span class="op">=</span><span class="nam">action_content</span><span class="op">,</span> <span class="nam">timestamp</span><span class="op">=</span><span class="nam">action_timestamp</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">if</span> <span class="nam">extracted</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">reduction</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">extracted</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">return</span> <span class="nam">reduction</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">def</span> <span class="nam">reduce_agent_to_dataframe</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">agent</span><span class="op">:</span> <span class="nam">TinyPerson</span><span class="op">,</span> <span class="nam">column_names</span><span class="op">:</span> <span class="nam">list</span><span class="op">=</span><span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="nam">pd</span><span class="op">.</span><span class="nam">DataFrame</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">reduction</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">reduce_agent</span><span class="op">(</span><span class="nam">agent</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">return</span> <span class="nam">pd</span><span class="op">.</span><span class="nam">DataFrame</span><span class="op">(</span><span class="nam">reduction</span><span class="op">,</span> <span class="nam">columns</span><span class="op">=</span><span class="nam">column_names</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
138
+ </main>
139
+ <footer>
140
+ <div class="content">
141
+ <p>
142
+ <a class="nav" href="z_1008c76b8ac6114d_results_extractor_py.html">&#xab; prev</a> &nbsp; &nbsp;
143
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
144
+ <a class="nav" href="z_1008c76b8ac6114d_results_reporter_py.html">&#xbb; next</a>
145
+ &nbsp; &nbsp; &nbsp;
146
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
147
+ created at 2026-02-28 17:48 +0000
148
+ </p>
149
+ </div>
150
+ </footer>
151
+ </body>
152
+ </html>
htmlcov/z_1008c76b8ac6114d_results_reporter_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_13b615ba9b634dc5___init___py.html ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/steering/__init__.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">5 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">5<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_8e144f0c9fd03088_profiling_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_13b615ba9b634dc5_intervention_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="com"># Exposed API</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">steering</span><span class="op">.</span><span class="nam">tiny_story</span> <span class="key">import</span> <span class="nam">TinyStory</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">steering</span><span class="op">.</span><span class="nam">intervention</span> <span class="key">import</span> <span class="nam">Intervention</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="nam">__all__</span> <span class="op">=</span> <span class="op">[</span><span class="str">"TinyStory"</span><span class="op">,</span> <span class="str">"Intervention"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
93
+ </main>
94
+ <footer>
95
+ <div class="content">
96
+ <p>
97
+ <a class="nav" href="z_8e144f0c9fd03088_profiling_py.html">&#xab; prev</a> &nbsp; &nbsp;
98
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
99
+ <a class="nav" href="z_13b615ba9b634dc5_intervention_py.html">&#xbb; next</a>
100
+ &nbsp; &nbsp; &nbsp;
101
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
102
+ created at 2026-02-28 17:48 +0000
103
+ </p>
104
+ </div>
105
+ </footer>
106
+ </body>
107
+ </html>
htmlcov/z_13b615ba9b634dc5_intervention_py.html ADDED
@@ -0,0 +1,364 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/steering/intervention.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;intervention.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">110 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">110<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_13b615ba9b634dc5___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_13b615ba9b634dc5_tiny_story_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span><span class="op">,</span> <span class="nam">List</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">JsonSerializableRegistry</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">experimentation</span> <span class="key">import</span> <span class="nam">Proposition</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">environment</span> <span class="key">import</span> <span class="nam">TinyWorld</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">agent</span> <span class="key">import</span> <span class="nam">TinyPerson</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="nam">DEFAULT_FIRST_N</span> <span class="op">=</span> <span class="num">10</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="nam">DEFAULT_LAST_N</span> <span class="op">=</span> <span class="num">100</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
94
+ <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">class</span> <span class="nam">InterventionBatch</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str"> A wrapper around multiple Intervention instances that allows chaining set_* methods.</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">interventions</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span> <span class="op">=</span> <span class="nam">interventions</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">def</span> <span class="nam">__iter__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="str">"""Makes the batch iterable and compatible with list()"""</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">return</span> <span class="nam">iter</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_textual_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">text</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">for</span> <span class="nam">intervention</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">intervention</span><span class="op">.</span><span class="nam">set_textual_precondition</span><span class="op">(</span><span class="nam">text</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_functional_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">func</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="key">for</span> <span class="nam">intervention</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">intervention</span><span class="op">.</span><span class="nam">set_functional_precondition</span><span class="op">(</span><span class="nam">func</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_effect</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">effect_func</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">for</span> <span class="nam">intervention</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">intervention</span><span class="op">.</span><span class="nam">set_effect</span><span class="op">(</span><span class="nam">effect_func</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_propositional_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">proposition</span><span class="op">,</span> <span class="nam">threshold</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">for</span> <span class="nam">intervention</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">intervention</span><span class="op">.</span><span class="nam">set_propositional_precondition</span><span class="op">(</span><span class="nam">proposition</span><span class="op">,</span> <span class="nam">threshold</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">def</span> <span class="nam">as_list</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="str">"""Return the list of individual interventions."""</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">interventions</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
130
+ <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"><span class="key">class</span> <span class="nam">Intervention</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">targets</span><span class="op">:</span> <span class="nam">Union</span><span class="op">[</span><span class="nam">TinyPerson</span><span class="op">,</span> <span class="nam">TinyWorld</span><span class="op">,</span> <span class="nam">List</span><span class="op">[</span><span class="nam">TinyPerson</span><span class="op">]</span><span class="op">,</span> <span class="nam">List</span><span class="op">[</span><span class="nam">TinyWorld</span><span class="op">]</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis mis2 show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">first_n</span><span class="op">:</span><span class="nam">int</span><span class="op">=</span><span class="nam">DEFAULT_FIRST_N</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">:</span><span class="nam">int</span><span class="op">=</span><span class="nam">DEFAULT_LAST_N</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis mis2 show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">name</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> Initialize the intervention.</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="str"> target (Union[TinyPerson, TinyWorld, List[TinyPerson], List[TinyWorld]]): the target to intervene on</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="str"> first_n (int): the number of first interactions to consider in the context</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"><span class="str"> last_n (int): the number of last interactions (most recent) to consider in the context</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> name (str): the name of the intervention</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">targets</span> <span class="op">=</span> <span class="nam">targets</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="com"># initialize the possible preconditions</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">text_precondition</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">precondition_func</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="com"># effects</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">effect_func</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="com"># which events to pay attention to?</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">first_n</span> <span class="op">=</span> <span class="nam">first_n</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="mis show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">last_n</span> <span class="op">=</span> <span class="nam">last_n</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="com"># name</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="mis show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="key">if</span> <span class="nam">name</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Intervention </span><span class="op">{</span><span class="nam">utils</span><span class="op">.</span><span class="nam">fresh_id</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">__class__</span><span class="op">.</span><span class="nam">__name__</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">name</span> <span class="op">=</span> <span class="nam">name</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="com"># the most recent precondition proposition used to check the precondition</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="mis show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_text_precondition_proposition</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_functional_precondition_check</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="com"># propositional precondition (optional)</span>&nbsp;</span><span class="r"></span></p>
170
+ <p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition_threshold</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_propositional_precondition_check</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
174
+ <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="com">################################################################################################</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="com"># Intervention flow</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="com">################################################################################################ </span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="op">@</span><span class="nam">classmethod</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">def</span> <span class="nam">create_for_each</span><span class="op">(</span><span class="nam">cls</span><span class="op">,</span> <span class="nam">targets</span><span class="op">,</span> <span class="nam">first_n</span><span class="op">=</span><span class="nam">DEFAULT_FIRST_N</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">=</span><span class="nam">DEFAULT_LAST_N</span><span class="op">,</span> <span class="nam">name</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"><span class="str"> Create separate interventions for each target in the list.</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> targets (list): List of targets (TinyPerson or TinyWorld instances)</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> first_n (int): the number of first interactions to consider in the context</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"><span class="str"> last_n (int): the number of last interactions (most recent) to consider in the context</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"><span class="str"> name (str): the name of the intervention</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"><span class="str"> InterventionBatch: A wrapper that allows chaining set_* methods that will apply to all interventions</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">targets</span><span class="op">,</span> <span class="nam">list</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="nam">targets</span> <span class="op">=</span> <span class="op">[</span><span class="nam">targets</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
194
+ <p class="mis show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="nam">interventions</span> <span class="op">=</span> <span class="op">[</span><span class="nam">cls</span><span class="op">(</span><span class="nam">target</span><span class="op">,</span> <span class="nam">first_n</span><span class="op">=</span><span class="nam">first_n</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">=</span><span class="nam">last_n</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="mis mis2 show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">name</span><span class="op">=</span><span class="fst">f"</span><span class="op">{</span><span class="nam">name</span><span class="op">}</span><span class="fst">_</span><span class="op">{</span><span class="nam">i</span><span class="op">}</span><span class="fst">"</span> <span class="key">if</span> <span class="nam">name</span> <span class="key">else</span> <span class="key">None</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="mis mis2 show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="key">for</span> <span class="nam">i</span><span class="op">,</span> <span class="nam">target</span> <span class="key">in</span> <span class="nam">enumerate</span><span class="op">(</span><span class="nam">targets</span><span class="op">)</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="key">return</span> <span class="nam">InterventionBatch</span><span class="op">(</span><span class="nam">interventions</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
199
+ <p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="key">def</span> <span class="nam">__call__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"><span class="str"> Execute the intervention.</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
203
+ <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"><span class="str"> bool: whether the intervention effect was applied.</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
206
+ <p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">execute</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
208
+ <p class="mis show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="key">def</span> <span class="nam">execute</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"><span class="str"> Execute the intervention. It first checks the precondition, and if it is met, applies the effect.</span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"><span class="str"> This is the simplest method to run the intervention.</span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
213
+ <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
214
+ <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"><span class="str"> bool: whether the intervention effect was applied.</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="mis show_mis"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Executing intervention: </span><span class="op">{</span><span class="nam">self</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="mis show_mis"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">check_precondition</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="mis show_mis"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">apply_effect</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
219
+ <p class="mis show_mis"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Precondition was true, intervention effect was applied.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="mis show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
222
+ <p class="mis show_mis"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Precondition was false, intervention effect was not applied.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="mis show_mis"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
225
+ <p class="mis show_mis"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"> <span class="key">def</span> <span class="nam">check_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"><span class="str"> Check if the precondition for the intervention is met.</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
230
+ <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="com"># Textual precondition</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">text_precondition</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="mis show_mis"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_text_precondition_proposition</span> <span class="op">=</span> <span class="nam">Proposition</span><span class="op">(</span><span class="nam">claim</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">text_precondition</span><span class="op">,</span> <span class="nam">target</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">targets</span><span class="op">,</span> <span class="nam">first_n</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">first_n</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">last_n</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="mis show_mis"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="nam">llm_precondition_check</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_text_precondition_proposition</span><span class="op">.</span><span class="nam">check</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
235
+ <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
236
+ <p class="mis show_mis"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="nam">llm_precondition_check</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
237
+ <p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
238
+ <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
239
+ <p class="pln"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="com"># Functional precondition</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="mis show_mis"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">precondition_func</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="mis show_mis"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_functional_precondition_check</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">precondition_func</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">targets</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
243
+ <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
244
+ <p class="mis show_mis"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_functional_precondition_check</span> <span class="op">=</span> <span class="key">True</span> <span class="com"># default to True if no functional precondition is set</span>&nbsp;</span><span class="r"></span></p>
245
+ <p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
246
+ <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
247
+ <p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"> <span class="com"># Propositional precondition</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"> <span class="com">#</span>&nbsp;</span><span class="r"></span></p>
249
+ <p class="mis show_mis"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_propositional_precondition_check</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="mis show_mis"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="mis show_mis"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition_threshold</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
252
+ <p class="mis show_mis"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="nam">score</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition</span><span class="op">.</span><span class="nam">score</span><span class="op">(</span><span class="nam">target</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">targets</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="mis show_mis"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"> <span class="key">if</span> <span class="nam">score</span> <span class="op">>=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition_threshold</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="mis show_mis"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_propositional_precondition_check</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
255
+ <p class="pln"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
256
+ <p class="mis show_mis"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition</span><span class="op">.</span><span class="nam">check</span><span class="op">(</span><span class="nam">target</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">targets</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="mis show_mis"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_propositional_precondition_check</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
258
+ <p class="pln"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
259
+ <p class="mis show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="key">return</span> <span class="nam">llm_precondition_check</span> <span class="key">and</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_functional_precondition_check</span> <span class="key">and</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_propositional_precondition_check</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="pln"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
261
+ <p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
262
+ <p class="mis show_mis"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="key">def</span> <span class="nam">apply_effect</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
263
+ <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
264
+ <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"><span class="str"> Apply the intervention's effects. This won't check the precondition, </span>&nbsp;</span><span class="r"></span></p>
265
+ <p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"><span class="str"> so it should be called after check_precondition.</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
267
+ <p class="mis show_mis"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">effect_func</span><span class="op">(</span><span class="nam">self</span><span class="op">.</span><span class="nam">targets</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
268
+ <p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
269
+ <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
270
+ <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="com">################################################################################################</span>&nbsp;</span><span class="r"></span></p>
271
+ <p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="com"># Pre and post conditions</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"> <span class="com">################################################################################################</span>&nbsp;</span><span class="r"></span></p>
273
+ <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
274
+ <p class="mis show_mis"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_textual_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">text</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
275
+ <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
276
+ <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"><span class="str"> Set a precondition as text, to be interpreted by a language model.</span>&nbsp;</span><span class="r"></span></p>
277
+ <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
278
+ <p class="pln"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="pln"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"><span class="str"> text (str): the text of the precondition</span>&nbsp;</span><span class="r"></span></p>
280
+ <p class="pln"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="mis show_mis"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">text_precondition</span> <span class="op">=</span> <span class="nam">text</span>&nbsp;</span><span class="r"></span></p>
282
+ <p class="mis show_mis"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span> <span class="com"># for chaining</span>&nbsp;</span><span class="r"></span></p>
283
+ <p class="pln"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
284
+ <p class="mis show_mis"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_functional_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">func</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
285
+ <p class="pln"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
286
+ <p class="pln"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"><span class="str"> Set a precondition as a function, to be evaluated by the code.</span>&nbsp;</span><span class="r"></span></p>
287
+ <p class="pln"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
288
+ <p class="pln"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
289
+ <p class="pln"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"><span class="str"> func (function): the function of the precondition. </span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="pln"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"><span class="str"> Must have the a single argument, targets (either a TinyWorld or TinyPerson, or a list). Must return a boolean.</span>&nbsp;</span><span class="r"></span></p>
291
+ <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
292
+ <p class="mis show_mis"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">precondition_func</span> <span class="op">=</span> <span class="nam">func</span>&nbsp;</span><span class="r"></span></p>
293
+ <p class="mis show_mis"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span> <span class="com"># for chaining</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
295
+ <p class="mis show_mis"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_effect</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">effect_func</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
297
+ <p class="pln"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"><span class="str"> Set the effect of the intervention.</span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="pln"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
299
+ <p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
300
+ <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"><span class="str"> effect (str): the effect function of the intervention</span>&nbsp;</span><span class="r"></span></p>
301
+ <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
302
+ <p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">effect_func</span> <span class="op">=</span> <span class="nam">effect_func</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="mis show_mis"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span> <span class="com"># for chaining</span>&nbsp;</span><span class="r"></span></p>
304
+ <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
305
+ <p class="mis show_mis"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="key">def</span> <span class="nam">set_propositional_precondition</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">proposition</span><span class="op">:</span><span class="nam">Proposition</span><span class="op">,</span> <span class="nam">threshold</span><span class="op">:</span><span class="nam">int</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
306
+ <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
307
+ <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"><span class="str"> Set a propositional precondition using the Proposition class,</span>&nbsp;</span><span class="r"></span></p>
308
+ <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"><span class="str"> optionally with a score threshold.</span>&nbsp;</span><span class="r"></span></p>
309
+ <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
310
+ <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
311
+ <p class="mis show_mis"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition</span> <span class="op">=</span> <span class="nam">proposition</span>&nbsp;</span><span class="r"></span></p>
312
+ <p class="mis show_mis"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition_threshold</span> <span class="op">=</span> <span class="nam">threshold</span>&nbsp;</span><span class="r"></span></p>
313
+ <p class="mis show_mis"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span>&nbsp;</span><span class="r"></span></p>
314
+ <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
315
+ <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"> <span class="com">################################################################################################</span>&nbsp;</span><span class="r"></span></p>
316
+ <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"> <span class="com"># Inspection</span>&nbsp;</span><span class="r"></span></p>
317
+ <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"> <span class="com">################################################################################################</span>&nbsp;</span><span class="r"></span></p>
318
+ <p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
319
+ <p class="mis show_mis"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"> <span class="key">def</span> <span class="nam">precondition_justification</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
320
+ <p class="pln"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
321
+ <p class="pln"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"><span class="str"> Get the justification for the precondition.</span>&nbsp;</span><span class="r"></span></p>
322
+ <p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
323
+ <p class="mis show_mis"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t"> <span class="nam">justification</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
324
+ <p class="pln"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
325
+ <p class="pln"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="com"># text precondition justification</span>&nbsp;</span><span class="r"></span></p>
326
+ <p class="mis show_mis"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_text_precondition_proposition</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
327
+ <p class="mis show_mis"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="nam">justification</span> <span class="op">+=</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">self</span><span class="op">.</span><span class="nam">_last_text_precondition_proposition</span><span class="op">.</span><span class="nam">justification</span><span class="op">}</span><span class="fst"> (confidence = </span><span class="op">{</span><span class="nam">self</span><span class="op">.</span><span class="nam">_last_text_precondition_proposition</span><span class="op">.</span><span class="nam">confidence</span><span class="op">}</span><span class="fst">)\n\n</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
328
+ <p class="pln"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
329
+ <p class="pln"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="com"># functional precondition justification</span>&nbsp;</span><span class="r"></span></p>
330
+ <p class="mis show_mis"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">precondition_func</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
331
+ <p class="mis show_mis"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_functional_precondition_check</span> <span class="op">==</span> <span class="key">True</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
332
+ <p class="mis show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="nam">justification</span> <span class="op">+=</span> <span class="fst">f"</span><span class="fst">Functional precondition was met.\n\n</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
333
+ <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
334
+ <p class="pln"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
335
+ <p class="mis show_mis"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"> <span class="nam">justification</span> <span class="op">+=</span> <span class="str">"Preconditions do not appear to be met.\n\n"</span>&nbsp;</span><span class="r"></span></p>
336
+ <p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
337
+ <p class="pln"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"> <span class="com"># propositional precondition justification</span>&nbsp;</span><span class="r"></span></p>
338
+ <p class="mis show_mis"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">propositional_precondition</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
339
+ <p class="mis show_mis"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_last_propositional_precondition_check</span> <span class="op">==</span> <span class="key">True</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
340
+ <p class="mis show_mis"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"> <span class="nam">justification</span> <span class="op">+=</span> <span class="fst">f"</span><span class="fst">Propositional precondition was met.\n\n</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
341
+ <p class="pln"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
342
+ <p class="mis show_mis"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"> <span class="nam">justification</span> <span class="op">+=</span> <span class="str">"Propositional precondition was not met.\n\n"</span>&nbsp;</span><span class="r"></span></p>
343
+ <p class="pln"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
344
+ <p class="mis show_mis"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="key">return</span> <span class="nam">justification</span>&nbsp;</span><span class="r"></span></p>
345
+ <p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
346
+ <p class="mis show_mis"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="key">return</span> <span class="nam">justification</span>&nbsp;</span><span class="r"></span></p>
347
+ <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
348
+ <p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
349
+ <p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
350
+ </main>
351
+ <footer>
352
+ <div class="content">
353
+ <p>
354
+ <a class="nav" href="z_13b615ba9b634dc5___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
355
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
356
+ <a class="nav" href="z_13b615ba9b634dc5_tiny_story_py.html">&#xbb; next</a>
357
+ &nbsp; &nbsp; &nbsp;
358
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
359
+ created at 2026-02-28 17:48 +0000
360
+ </p>
361
+ </div>
362
+ </footer>
363
+ </body>
364
+ </html>
htmlcov/z_13b615ba9b634dc5_tiny_story_py.html ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/steering/tiny_story.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;steering&#8201;/&#8201;tiny_story.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">42 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">42<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_13b615ba9b634dc5_intervention_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_8ff660fc2daa80e3___init___py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">List</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">extraction</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">agent</span> <span class="key">import</span> <span class="nam">TinyPerson</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">environment</span> <span class="key">import</span> <span class="nam">TinyWorld</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">openai_utils</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">class</span> <span class="nam">TinyStory</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> Every simulation tells a story. This class provides helper mechanisms to help with crafting appropriate stories in TinyTroupe.</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
97
+ <p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">environment</span><span class="op">:</span><span class="nam">TinyWorld</span><span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">agent</span><span class="op">:</span><span class="nam">TinyPerson</span><span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">purpose</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="str">"Be a realistic simulation."</span><span class="op">,</span> <span class="nam">context</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="str">""</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis mis2 show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="nam">first_n</span><span class="op">=</span><span class="num">10</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">=</span><span class="num">20</span><span class="op">,</span> <span class="nam">include_omission_info</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">True</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> Initialize the story. The story can be about an environment or an agent. It also has a purpose, which</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> is used to guide the story generation. Stories are aware that they are related to simulations, so one can</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> specify simulation-related purposes.</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="str"> environment (TinyWorld, optional): The environment in which the story takes place. Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> agent (TinyPerson, optional): The agent in the story. Defaults to None.</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> purpose (str, optional): The purpose of the story. Defaults to "Be a realistic simulation.".</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="str"> context (str, optional): The current story context. Defaults to "". The actual story will be appended to this context.</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> first_n (int, optional): The number of first interactions to include in the story. Defaults to 10.</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="str"> last_n (int, optional): The number of last interactions to include in the story. Defaults to 20.</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> include_omission_info (bool, optional): Whether to include information about omitted interactions. Defaults to True.</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="com"># exactly one of these must be provided</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">if</span> <span class="nam">environment</span> <span class="key">and</span> <span class="nam">agent</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">"Either 'environment' or 'agent' should be provided, not both"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="op">(</span><span class="nam">environment</span> <span class="key">or</span> <span class="nam">agent</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">raise</span> <span class="nam">Exception</span><span class="op">(</span><span class="str">"At least one of the parameters should be provided"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">environment</span> <span class="op">=</span> <span class="nam">environment</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">agent</span> <span class="op">=</span> <span class="nam">agent</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose</span> <span class="op">=</span> <span class="nam">purpose</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">current_story</span> <span class="op">=</span> <span class="nam">context</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">first_n</span> <span class="op">=</span> <span class="nam">first_n</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">last_n</span> <span class="op">=</span> <span class="nam">last_n</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">include_omission_info</span> <span class="op">=</span> <span class="nam">include_omission_info</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="key">def</span> <span class="nam">start_story</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">requirements</span><span class="op">=</span><span class="str">"Start some interesting story about the agents."</span><span class="op">,</span> <span class="nam">number_of_words</span><span class="op">:</span><span class="nam">int</span><span class="op">=</span><span class="num">100</span><span class="op">,</span> <span class="nam">include_plot_twist</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"><span class="str"> Start a new story.</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
+ <p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="mis mis2 show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="str">"purpose"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="mis mis2 show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="str">"requirements"</span><span class="op">:</span> <span class="nam">requirements</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="mis mis2 show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="str">"current_simulation_trace"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_current_story</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="mis mis2 show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="str">"number_of_words"</span><span class="op">:</span> <span class="nam">number_of_words</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="mis mis2 show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="str">"include_plot_twist"</span><span class="op">:</span> <span class="nam">include_plot_twist</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="mis mis2 show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
144
+ <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">compose_initial_LLM_messages_with_templates</span><span class="op">(</span><span class="str">"story.start.system.mustache"</span><span class="op">,</span> <span class="str">"story.start.user.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis mis2 show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">base_module_folder</span><span class="op">=</span><span class="str">"steering"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis mis2 show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">=</span><span class="nam">rendering_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">temperature</span><span class="op">=</span><span class="num">1.5</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
149
+ <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">start</span> <span class="op">=</span> <span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
151
+ <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">current_story</span> <span class="op">+=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="mis mis2 show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="fst">f"""</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis mis2 show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis mis2 show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"><span class="fst"> ## The story begins</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="mis mis2 show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
156
+ <p class="mis mis2 show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"><span class="fst"> </span><span class="op">{</span><span class="nam">start</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="mis mis2 show_mis"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="mis mis2 show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"><span class="fst"> </span><span class="fst">"""</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis mis2 show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="key">return</span> <span class="nam">start</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
163
+ <p class="mis show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="key">def</span> <span class="nam">continue_story</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">requirements</span><span class="op">=</span><span class="str">"Continue the story in an interesting way."</span><span class="op">,</span> <span class="nam">number_of_words</span><span class="op">:</span><span class="nam">int</span><span class="op">=</span><span class="num">100</span><span class="op">,</span> <span class="nam">include_plot_twist</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"><span class="str"> Propose a continuation of the story.</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
168
+ <p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="mis mis2 show_mis"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="str">"purpose"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">purpose</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
170
+ <p class="mis mis2 show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="str">"requirements"</span><span class="op">:</span> <span class="nam">requirements</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="mis mis2 show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="str">"current_simulation_trace"</span><span class="op">:</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_current_story</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="mis mis2 show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="str">"number_of_words"</span><span class="op">:</span> <span class="nam">number_of_words</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="mis mis2 show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="str">"include_plot_twist"</span><span class="op">:</span> <span class="nam">include_plot_twist</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="mis mis2 show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
176
+ <p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">compose_initial_LLM_messages_with_templates</span><span class="op">(</span><span class="str">"story.continuation.system.mustache"</span><span class="op">,</span> <span class="str">"story.continuation.user.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="mis mis2 show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">base_module_folder</span><span class="op">=</span><span class="str">"steering"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis mis2 show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">=</span><span class="nam">rendering_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="mis show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">)</span><span class="com">#, temperature=1.5)</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
181
+ <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="nam">continuation</span> <span class="op">=</span> <span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
183
+ <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">current_story</span> <span class="op">+=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="mis mis2 show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="fst">f"""</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis mis2 show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis mis2 show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"><span class="fst"> ## The story continues</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="mis mis2 show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
188
+ <p class="mis mis2 show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"><span class="fst"> </span><span class="op">{</span><span class="nam">continuation</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis mis2 show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis mis2 show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"><span class="fst"> </span><span class="fst">"""</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis mis2 show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">return</span> <span class="nam">continuation</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
195
+ <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="key">def</span> <span class="nam">_current_story</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"><span class="str"> Get the current story.</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
199
+ <p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="nam">interaction_history</span> <span class="op">=</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
201
+ <p class="mis show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">agent</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="mis show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">interaction_history</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">agent</span><span class="op">.</span><span class="nam">pretty_current_interactions</span><span class="op">(</span><span class="nam">first_n</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">first_n</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">last_n</span><span class="op">,</span> <span class="nam">include_omission_info</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">include_omission_info</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
203
+ <p class="mis show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="key">elif</span> <span class="nam">self</span><span class="op">.</span><span class="nam">environment</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="mis show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="nam">interaction_history</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">environment</span><span class="op">.</span><span class="nam">pretty_current_interactions</span><span class="op">(</span><span class="nam">first_n</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">first_n</span><span class="op">,</span> <span class="nam">last_n</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">last_n</span><span class="op">,</span> <span class="nam">include_omission_info</span><span class="op">=</span><span class="nam">self</span><span class="op">.</span><span class="nam">include_omission_info</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
206
+ <p class="mis show_mis"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="nam">tmp_current_story</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">current_story</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">tmp_current_story</span> <span class="op">+=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="mis mis2 show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="fst">f"""</span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="mis mis2 show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
210
+ <p class="mis mis2 show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"><span class="fst"> ## New simulation interactions to consider</span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="mis mis2 show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
212
+ <p class="mis mis2 show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="fst"> </span><span class="op">{</span><span class="nam">interaction_history</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="mis mis2 show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
214
+ <p class="mis mis2 show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"><span class="fst"> </span><span class="fst">"""</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="mis mis2 show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
217
+ <p class="mis show_mis"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="key">return</span> <span class="nam">tmp_current_story</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
220
+ <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
221
+ </main>
222
+ <footer>
223
+ <div class="content">
224
+ <p>
225
+ <a class="nav" href="z_13b615ba9b634dc5_intervention_py.html">&#xab; prev</a> &nbsp; &nbsp;
226
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
227
+ <a class="nav" href="z_8ff660fc2daa80e3___init___py.html">&#xbb; next</a>
228
+ &nbsp; &nbsp; &nbsp;
229
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
230
+ created at 2026-02-28 17:48 +0000
231
+ </p>
232
+ </div>
233
+ </footer>
234
+ </body>
235
+ </html>
htmlcov/z_1dd26f6f54202fea___init___py.html ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/ui/__init__.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;ui&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">2 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">2<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_8ff660fc2daa80e3_tiny_word_processor_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_1dd26f6f54202fea_jupyter_widgets_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">TinyTroupe UI Module</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="str">This module provides user interface components and widgets for TinyTroupe,</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="str">enabling interactive experiences with TinyTroupe agents and environments.</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="str">The module is organized into different sub-modules based on the UI framework:</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="str">- jupyter_widgets: Interactive widgets for Jupyter notebooks</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="str">- web: Web-based interfaces (future)</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str">- cli: Command-line interfaces (future)</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str">Example usage:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str"> from tinytroupe.ui.jupyter_widgets import AgentChatJupyterWidget</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str"> # Create a chat interface with your agents</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> chat = AgentChatJupyterWidget(agents)</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> chat.display()</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">jupyter_widgets</span> <span class="key">import</span> <span class="nam">AgentChatJupyterWidget</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="nam">__all__</span> <span class="op">=</span> <span class="op">[</span><span class="str">'AgentChatJupyterWidget'</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
106
+ </main>
107
+ <footer>
108
+ <div class="content">
109
+ <p>
110
+ <a class="nav" href="z_8ff660fc2daa80e3_tiny_word_processor_py.html">&#xab; prev</a> &nbsp; &nbsp;
111
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
112
+ <a class="nav" href="z_1dd26f6f54202fea_jupyter_widgets_py.html">&#xbb; next</a>
113
+ &nbsp; &nbsp; &nbsp;
114
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
115
+ created at 2026-02-28 17:48 +0000
116
+ </p>
117
+ </div>
118
+ </footer>
119
+ </body>
120
+ </html>
htmlcov/z_1dd26f6f54202fea_jupyter_widgets_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_357ee38f49d3e320___init___py.html ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/agent/__init__.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">28 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">28<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_8e144f0c9fd03088___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_357ee38f49d3e320_action_generator_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">This module provides the main classes and functions for TinyTroupe's agents.</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="str">Agents are the key abstraction used in TinyTroupe. An agent is a simulated person or entity that can interact with other agents and the environment, by</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="str">receiving stimuli and producing actions. Agents have cognitive states, which are updated as they interact with the environment and other agents. </span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="str">Agents can also store and retrieve information from memory, and can perform actions in the environment. Different from agents whose objective is to</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="str">provide support for AI-based assistants or other such productivity tools, **TinyTroupe agents aim at representing human-like behavior**, which includes</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="str">idiossincracies, emotions, and other human-like traits, that one would not expect from a productivity tool.</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="str">The overall underlying design is inspired mainly by Cognitive Psychology, which is why agents have various internal cognitive states, such as attention, emotions, and goals.</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str">It is also why agent memory, differently from other LLM-based agent platforms, has subtle internal divisions, notably between episodic and semantic memory. </span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="str">Some behaviorist concepts are also present, such as the explicit and decoupled concepts of "stimulus" and "response" in the `listen` and `act` methods, which are key abstractions</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str">to understand how agents interact with the environment and other agents.</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">from</span> <span class="nam">pydantic</span> <span class="key">import</span> <span class="nam">BaseModel</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">default</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="com"># Types and constants</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">TypeVar</span><span class="op">,</span> <span class="nam">Union</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="nam">Self</span> <span class="op">=</span> <span class="nam">TypeVar</span><span class="op">(</span><span class="str">"Self"</span><span class="op">,</span> <span class="nam">bound</span><span class="op">=</span><span class="str">"TinyPerson"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="nam">AgentOrWorld</span> <span class="op">=</span> <span class="nam">Union</span><span class="op">[</span><span class="nam">Self</span><span class="op">,</span> <span class="str">"TinyWorld"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="com"># Data structures to enforce output format during LLM API call.</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"><span class="key">class</span> <span class="nam">Action</span><span class="op">(</span><span class="nam">BaseModel</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">type</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">content</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">target</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="key">class</span> <span class="nam">CognitiveState</span><span class="op">(</span><span class="nam">BaseModel</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">goals</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">context</span><span class="op">:</span> <span class="nam">list</span><span class="op">[</span><span class="nam">str</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">attention</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">emotions</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="key">class</span> <span class="nam">CognitiveActionModel</span><span class="op">(</span><span class="nam">BaseModel</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">action</span><span class="op">:</span> <span class="nam">Action</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">cognitive_state</span><span class="op">:</span> <span class="nam">CognitiveState</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"><span class="key">class</span> <span class="nam">CognitiveActionModelWithReasoning</span><span class="op">(</span><span class="nam">BaseModel</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">reasoning</span><span class="op">:</span> <span class="nam">str</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">action</span><span class="op">:</span> <span class="nam">Action</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">cognitive_state</span><span class="op">:</span> <span class="nam">CognitiveState</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="com"># Exposed API</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="com"># from. grounding ... ---> not exposing this, clients should not need to know about detailed grounding mechanisms</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">memory</span> <span class="key">import</span> <span class="nam">SemanticMemory</span><span class="op">,</span> <span class="nam">EpisodicMemory</span><span class="op">,</span> <span class="nam">EpisodicConsolidator</span><span class="op">,</span> <span class="nam">ReflectionConsolidator</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">mental_faculty</span> <span class="key">import</span> <span class="nam">CustomMentalFaculty</span><span class="op">,</span> <span class="nam">RecallFaculty</span><span class="op">,</span> <span class="nam">FilesAndWebGroundingFaculty</span><span class="op">,</span> <span class="nam">TinyToolUse</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">tiny_person</span> <span class="key">import</span> <span class="nam">TinyPerson</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="nam">__all__</span> <span class="op">=</span> <span class="op">[</span><span class="str">"SemanticMemory"</span><span class="op">,</span> <span class="str">"EpisodicMemory"</span><span class="op">,</span> <span class="str">"EpisodicConsolidator"</span><span class="op">,</span> <span class="str">"ReflectionConsolidator"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis mis2 show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="str">"CustomMentalFaculty"</span><span class="op">,</span> <span class="str">"RecallFaculty"</span><span class="op">,</span> <span class="str">"FilesAndWebGroundingFaculty"</span><span class="op">,</span> <span class="str">"TinyToolUse"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="mis mis2 show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="str">"TinyPerson"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
149
+ </main>
150
+ <footer>
151
+ <div class="content">
152
+ <p>
153
+ <a class="nav" href="z_8e144f0c9fd03088___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
154
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
155
+ <a class="nav" href="z_357ee38f49d3e320_action_generator_py.html">&#xbb; next</a>
156
+ &nbsp; &nbsp; &nbsp;
157
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
158
+ created at 2026-02-28 17:48 +0000
159
+ </p>
160
+ </div>
161
+ </footer>
162
+ </body>
163
+ </html>
htmlcov/z_357ee38f49d3e320_action_generator_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_357ee38f49d3e320_browser_faculty_py.html ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/agent/browser_faculty.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;agent&#8201;/&#8201;browser_faculty.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">53 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">53<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_357ee38f49d3e320_action_generator_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_357ee38f49d3e320_grounding_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">agent</span><span class="op">.</span><span class="nam">mental_faculty</span> <span class="key">import</span> <span class="nam">TinyMentalFaculty</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">tools</span> <span class="key">import</span> <span class="nam">browser</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">textwrap</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">class</span> <span class="nam">BrowserFaculty</span><span class="op">(</span><span class="nam">TinyMentalFaculty</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="str"> A mental faculty that allows an agent to interact with a web browser.</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="nam">super</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">__init__</span><span class="op">(</span><span class="str">"Browser Navigation"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="key">def</span> <span class="nam">process_action</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">agent</span><span class="op">,</span> <span class="nam">action</span><span class="op">:</span> <span class="nam">dict</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> Processes a browser-related action.</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">action_type</span> <span class="op">=</span> <span class="nam">action</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"type"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">content</span> <span class="op">=</span> <span class="nam">action</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"content"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="nam">target</span> <span class="op">=</span> <span class="nam">action</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"target"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="key">if</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"See"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="nam">screenshot_path</span> <span class="op">=</span> <span class="nam">browser</span><span class="op">.</span><span class="nam">screenshot</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Took a screenshot and saved it to </span><span class="op">{</span><span class="nam">screenshot_path</span><span class="op">}</span><span class="fst">. I will now analyze the screenshot.</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Click"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">click</span><span class="op">(</span><span class="nam">target</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Clicked on element with selector: </span><span class="op">{</span><span class="nam">target</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Write"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">fill</span><span class="op">(</span><span class="nam">target</span><span class="op">,</span> <span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Typed '</span><span class="op">{</span><span class="nam">content</span><span class="op">}</span><span class="fst">' into element with selector: </span><span class="op">{</span><span class="nam">target</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Submit"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">submit_form</span><span class="op">(</span><span class="nam">target</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Submitted form with element: </span><span class="op">{</span><span class="nam">target</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Wait"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">wait_for_element</span><span class="op">(</span><span class="nam">target</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Waited for element: </span><span class="op">{</span><span class="nam">target</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Scroll"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">scroll_page</span><span class="op">(</span><span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Scrolled page </span><span class="op">{</span><span class="nam">content</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Hover"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">hover_element</span><span class="op">(</span><span class="nam">target</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Hovered over element: </span><span class="op">{</span><span class="nam">target</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"Keyboard_Key"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">browser</span><span class="op">.</span><span class="nam">press_key</span><span class="op">(</span><span class="nam">content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Pressed key: </span><span class="op">{</span><span class="nam">content</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="key">elif</span> <span class="nam">action_type</span> <span class="op">==</span> <span class="str">"ScanPage"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">page_info</span> <span class="op">=</span> <span class="nam">browser</span><span class="op">.</span><span class="nam">get_page_info</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">agent</span><span class="op">.</span><span class="nam">see</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Scanned page and found the following information: </span><span class="op">{</span><span class="nam">page_info</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
141
+ <p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">def</span> <span class="nam">actions_definitions_prompt</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> Returns the prompt for defining browser-related actions.</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">prompt</span> <span class="op">=</span> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis mis2 show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="str"> - See: Take a screenshot of the current page. The `content` will be a placeholder for vision.</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis mis2 show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"><span class="str"> - Click: Click on an element on the page. The `target` should be a CSS selector for the element.</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="mis mis2 show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"><span class="str"> - Write: Type text into an element on the page. The `target` should be a CSS selector for the element, and `content` should be the text to type.</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="mis mis2 show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"><span class="str"> - Submit: Submit a form on the page. The `target` should be a CSS selector for a form or an element within a form.</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="mis mis2 show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="str"> - Wait: Wait for an element to appear on the page. The `target` should be a CSS selector for the element.</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="mis mis2 show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"><span class="str"> - Scroll: Scroll the page. The `content` should be 'up' or 'down'.</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="mis mis2 show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"><span class="str"> - Hover: Hover over an element on the page. The `target` should be a CSS selector for the element.</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis mis2 show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"><span class="str"> - Keyboard_Key: Press a key on the keyboard. The `content` should be the key to press (e.g., 'Enter', 'ArrowDown').</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis mis2 show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"><span class="str"> - ScanPage: Get information about the current page, such as links and form elements.</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="mis mis2 show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="nam">textwrap</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="nam">prompt</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="key">def</span> <span class="nam">actions_constraints_prompt</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"><span class="str"> Returns the prompt for defining constraints on browser-related actions.</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">prompt</span> <span class="op">=</span> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="mis mis2 show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="str"> - Use See to get a visual representation of the page to help you decide on the next action.</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="mis mis2 show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="str"> - Use ScanPage to get a list of interactive elements to help you decide on the next action.</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="mis mis2 show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"><span class="str"> - Use Click, Write, and other actions to interact with elements on the page to accomplish the task.</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="mis mis2 show_mis"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="key">return</span> <span class="nam">textwrap</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="nam">prompt</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
168
+ </main>
169
+ <footer>
170
+ <div class="content">
171
+ <p>
172
+ <a class="nav" href="z_357ee38f49d3e320_action_generator_py.html">&#xab; prev</a> &nbsp; &nbsp;
173
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
174
+ <a class="nav" href="z_357ee38f49d3e320_grounding_py.html">&#xbb; next</a>
175
+ &nbsp; &nbsp; &nbsp;
176
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
177
+ created at 2026-02-28 17:48 +0000
178
+ </p>
179
+ </div>
180
+ </footer>
181
+ </body>
182
+ </html>
htmlcov/z_357ee38f49d3e320_grounding_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_357ee38f49d3e320_memory_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_357ee38f49d3e320_mental_faculty_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_357ee38f49d3e320_tiny_person_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_37eec20419a3fd46___init___py.html ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/enrichment/__init__.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">5 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">5<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_8e144f0c9fd03088_control_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_37eec20419a3fd46_tiny_enricher_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">default</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="com"># Exposed API</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">enrichment</span><span class="op">.</span><span class="nam">tiny_enricher</span> <span class="key">import</span> <span class="nam">TinyEnricher</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="nam">__all__</span> <span class="op">=</span> <span class="op">[</span><span class="str">"TinyEnricher"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
94
+ </main>
95
+ <footer>
96
+ <div class="content">
97
+ <p>
98
+ <a class="nav" href="z_8e144f0c9fd03088_control_py.html">&#xab; prev</a> &nbsp; &nbsp;
99
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
100
+ <a class="nav" href="z_37eec20419a3fd46_tiny_enricher_py.html">&#xbb; next</a>
101
+ &nbsp; &nbsp; &nbsp;
102
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
103
+ created at 2026-02-28 17:48 +0000
104
+ </p>
105
+ </div>
106
+ </footer>
107
+ </body>
108
+ </html>
htmlcov/z_37eec20419a3fd46_tiny_enricher_py.html ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/enrichment/tiny_enricher.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_enricher.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">20 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">20<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_37eec20419a3fd46___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_37eec20419a3fd46_tiny_styler_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">enrichment</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">JsonSerializableRegistry</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">openai_utils</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">class</span> <span class="nam">TinyEnricher</span><span class="op">(</span><span class="nam">JsonSerializableRegistry</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">use_past_results_in_context</span><span class="op">=</span><span class="key">False</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">use_past_results_in_context</span> <span class="op">=</span> <span class="nam">use_past_results_in_context</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">context_cache</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
97
+ <p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">def</span> <span class="nam">enrich_content</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">requirements</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">content</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">context_info</span><span class="op">:</span><span class="nam">str</span> <span class="op">=</span><span class="str">""</span><span class="op">,</span> <span class="nam">context_cache</span><span class="op">:</span><span class="nam">list</span><span class="op">=</span><span class="key">None</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span><span class="nam">bool</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span><span class="str">"requirements"</span><span class="op">:</span> <span class="nam">requirements</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis mis2 show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="str">"content"</span><span class="op">:</span> <span class="nam">content</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis mis2 show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="str">"content_type"</span><span class="op">:</span> <span class="nam">content_type</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis mis2 show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="str">"context_info"</span><span class="op">:</span> <span class="nam">context_info</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis mis2 show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="str">"context_cache"</span><span class="op">:</span> <span class="nam">context_cache</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">messages</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">compose_initial_LLM_messages_with_templates</span><span class="op">(</span><span class="str">"enricher.system.mustache"</span><span class="op">,</span> <span class="str">"enricher.user.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis mis2 show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">base_module_folder</span> <span class="op">=</span> <span class="str">"enrichment"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis mis2 show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">rendering_configs</span><span class="op">=</span><span class="nam">rendering_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
109
+ <p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="nam">next_message</span> <span class="op">=</span> <span class="nam">openai_utils</span><span class="op">.</span><span class="nam">client</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">send_message</span><span class="op">(</span><span class="nam">messages</span><span class="op">,</span> <span class="nam">temperature</span><span class="op">=</span><span class="num">1.0</span><span class="op">,</span> <span class="nam">frequency_penalty</span><span class="op">=</span><span class="num">0.0</span><span class="op">,</span> <span class="nam">presence_penalty</span><span class="op">=</span><span class="num">0.0</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">debug_msg</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Enrichment result message: </span><span class="op">{</span><span class="nam">next_message</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="mis show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">if</span> <span class="nam">next_message</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">extract_code_block</span><span class="op">(</span><span class="nam">next_message</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="key">return</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
124
+ </main>
125
+ <footer>
126
+ <div class="content">
127
+ <p>
128
+ <a class="nav" href="z_37eec20419a3fd46___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
129
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
130
+ <a class="nav" href="z_37eec20419a3fd46_tiny_styler_py.html">&#xbb; next</a>
131
+ &nbsp; &nbsp; &nbsp;
132
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
133
+ created at 2026-02-28 17:48 +0000
134
+ </p>
135
+ </div>
136
+ </footer>
137
+ </body>
138
+ </html>
htmlcov/z_37eec20419a3fd46_tiny_styler_py.html ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/enrichment/tiny_styler.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;enrichment&#8201;/&#8201;tiny_styler.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">26 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">26<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_37eec20419a3fd46_tiny_enricher_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_93fcbcbc09a08040___init___py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">enrichment</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">JsonSerializableRegistry</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">llm</span> <span class="key">import</span> <span class="nam">LLMChat</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">as</span> <span class="nam">utils</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">class</span> <span class="nam">TinyStyler</span><span class="op">(</span><span class="nam">JsonSerializableRegistry</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="str"> A class for applying a specified writing or speaking style to content while preserving</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="str"> the original information.</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">use_past_results_in_context</span><span class="op">=</span><span class="key">False</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> Initialize the TinyStyler.</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> use_past_results_in_context (bool): Whether to use past styling results in the context.</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">use_past_results_in_context</span> <span class="op">=</span> <span class="nam">use_past_results_in_context</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">context_cache</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">def</span> <span class="nam">apply_style</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">content</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">style</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">content_type</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis mis2 show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">context_info</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="str">""</span><span class="op">,</span> <span class="nam">context_cache</span><span class="op">:</span> <span class="nam">list</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis mis2 show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">temperature</span><span class="op">:</span> <span class="nam">float</span> <span class="op">=</span> <span class="num">0.7</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> Apply a specified style to the content while preserving all the original information.</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> content (str): The content to style.</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="str"> style (str): The style to apply (e.g., "professional", "casual", "technical", etc.).</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> content_type (str, optional): The type of content (e.g., "email", "report", "conversation").</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> context_info (str, optional): Additional context information.</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> context_cache (list, optional): Previous styling results to use as context.</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"><span class="str"> verbose (bool, optional): Whether to print debug information.</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="str"> temperature (float, optional): The temperature to use for the LLM generation.</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> str: The styled content.</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">if</span> <span class="nam">context_cache</span> <span class="key">is</span> <span class="key">None</span> <span class="key">and</span> <span class="nam">self</span><span class="op">.</span><span class="nam">use_past_results_in_context</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">context_cache</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">context_cache</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">rendering_configs</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis mis2 show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="str">"content"</span><span class="op">:</span> <span class="nam">content</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis mis2 show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="str">"style"</span><span class="op">:</span> <span class="nam">style</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis mis2 show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="str">"content_type"</span><span class="op">:</span> <span class="nam">content_type</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis mis2 show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="str">"context_info"</span><span class="op">:</span> <span class="nam">context_info</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis mis2 show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="str">"context_cache"</span><span class="op">:</span> <span class="nam">context_cache</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis mis2 show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="com"># Initialize the LLMChat with appropriate templates</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">chat</span> <span class="op">=</span> <span class="nam">LLMChat</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="mis mis2 show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">system_template_name</span><span class="op">=</span><span class="str">"styler.system.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="mis mis2 show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">user_template_name</span><span class="op">=</span><span class="str">"styler.user.mustache"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="mis mis2 show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">base_module_folder</span><span class="op">=</span><span class="str">"enrichment"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="mis mis2 show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">temperature</span><span class="op">=</span><span class="nam">temperature</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="mis mis2 show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="com"># Call the model and get the response</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">result</span> <span class="op">=</span> <span class="nam">chat</span><span class="op">.</span><span class="nam">call</span><span class="op">(</span><span class="op">**</span><span class="nam">rendering_configs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">debug_msg</span> <span class="op">=</span> <span class="fst">f"</span><span class="fst">Styling result: </span><span class="op">{</span><span class="nam">result</span><span class="op">}</span><span class="fst">"</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">debug</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="nam">debug_msg</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="com"># Extract the styled content from code blocks if present</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="key">if</span> <span class="nam">result</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">styled_content</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">extract_code_block</span><span class="op">(</span><span class="nam">result</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="com"># If no code block was found, use the raw result</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">styled_content</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">styled_content</span> <span class="op">=</span> <span class="nam">result</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="com"># Add to context cache if enabled</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="mis show_mis"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="key">if</span> <span class="nam">self</span><span class="op">.</span><span class="nam">use_past_results_in_context</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">context_cache</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="op">{</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="mis mis2 show_mis"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="str">"original"</span><span class="op">:</span> <span class="nam">content</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis mis2 show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="str">"style"</span><span class="op">:</span> <span class="nam">style</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="mis mis2 show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="str">"styled"</span><span class="op">:</span> <span class="nam">styled_content</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="mis mis2 show_mis"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
165
+ <p class="mis show_mis"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="key">return</span> <span class="nam">styled_content</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="mis show_mis"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
168
+ </main>
169
+ <footer>
170
+ <div class="content">
171
+ <p>
172
+ <a class="nav" href="z_37eec20419a3fd46_tiny_enricher_py.html">&#xab; prev</a> &nbsp; &nbsp;
173
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
174
+ <a class="nav" href="z_93fcbcbc09a08040___init___py.html">&#xbb; next</a>
175
+ &nbsp; &nbsp; &nbsp;
176
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
177
+ created at 2026-02-28 17:48 +0000
178
+ </p>
179
+ </div>
180
+ </footer>
181
+ </body>
182
+ </html>
htmlcov/z_4b3d0d3b603de221___init___py.html ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/__init__.py: 100%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">100%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">11 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">11<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">0<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_1dd26f6f54202fea_jupyter_widgets_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_behavior_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">General utilities and convenience functions.</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="com"># Exposed API</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">config</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">json</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">llm</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">misc</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="run"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">rendering</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="run"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">validation</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">semantics</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="run"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">behavior</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span><span class="op">.</span><span class="nam">parallel</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
102
+ </main>
103
+ <footer>
104
+ <div class="content">
105
+ <p>
106
+ <a class="nav" href="z_1dd26f6f54202fea_jupyter_widgets_py.html">&#xab; prev</a> &nbsp; &nbsp;
107
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
108
+ <a class="nav" href="z_4b3d0d3b603de221_behavior_py.html">&#xbb; next</a>
109
+ &nbsp; &nbsp; &nbsp;
110
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
111
+ created at 2026-02-28 17:48 +0000
112
+ </p>
113
+ </div>
114
+ </footer>
115
+ </body>
116
+ </html>
htmlcov/z_4b3d0d3b603de221_behavior_py.html ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/behavior.py: 18%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;behavior.py</b>:
15
+ <span class="pc_cov">18%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">11 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">2<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">9<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_config_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">Various utility functions for behavior analysis and action similarity computation.</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">textdistance</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">def</span> <span class="nam">next_action_jaccard_similarity</span><span class="op">(</span><span class="nam">agent</span><span class="op">,</span> <span class="nam">proposed_next_action</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> Computes the Jaccard similarity between the agent's current action and a proposed next action,</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="str"> modulo target and type (i.e., similarity will be computed using only the content, provided that the action </span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str"> type and target are the same). If the action type or target is different, the similarity will be 0.</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> Jaccard similarity is a measure of similarity between two sets, defined as the size of the intersection </span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str"> divided by the size of the union of the sets.</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> agent (TinyPerson): The agent whose current action is to be compared.</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> proposed_next_action (dict): The proposed next action to be compared against the agent's current action.</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="str"> float: The Jaccard similarity score between the agent's current action and the proposed next action.</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="com"># Get the agent's current action</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="nam">current_action</span> <span class="op">=</span> <span class="nam">agent</span><span class="op">.</span><span class="nam">last_remembered_action</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="key">if</span> <span class="nam">current_action</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="key">return</span> <span class="num">0.0</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="com"># Check if the action type and target are the same</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">if</span> <span class="op">(</span><span class="str">"type"</span> <span class="key">in</span> <span class="nam">current_action</span><span class="op">)</span> <span class="key">and</span> <span class="op">(</span><span class="str">"type"</span> <span class="key">in</span> <span class="nam">proposed_next_action</span><span class="op">)</span> <span class="key">and</span> <span class="op">(</span><span class="str">"target"</span> <span class="key">in</span> <span class="nam">current_action</span><span class="op">)</span> <span class="key">and</span> <span class="op">(</span><span class="str">"target"</span> <span class="key">in</span> <span class="nam">proposed_next_action</span><span class="op">)</span> <span class="key">and</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis mis2 show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="op">(</span><span class="nam">current_action</span><span class="op">[</span><span class="str">"type"</span><span class="op">]</span> <span class="op">!=</span> <span class="nam">proposed_next_action</span><span class="op">[</span><span class="str">"type"</span><span class="op">]</span> <span class="key">or</span> <span class="nam">current_action</span><span class="op">[</span><span class="str">"target"</span><span class="op">]</span> <span class="op">!=</span> <span class="nam">proposed_next_action</span><span class="op">[</span><span class="str">"target"</span><span class="op">]</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">return</span> <span class="num">0.0</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="com"># Compute the Jaccard similarity between the content of the two actions</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">current_action_content</span> <span class="op">=</span> <span class="nam">current_action</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">proposed_next_action_content</span> <span class="op">=</span> <span class="nam">proposed_next_action</span><span class="op">[</span><span class="str">"content"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="com"># using textdistance to compute the Jaccard similarity</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="nam">jaccard_similarity</span> <span class="op">=</span> <span class="nam">textdistance</span><span class="op">.</span><span class="nam">jaccard</span><span class="op">(</span><span class="nam">current_action_content</span><span class="op">,</span> <span class="nam">proposed_next_action_content</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">return</span> <span class="nam">jaccard_similarity</span>&nbsp;</span><span class="r"></span></p>
126
+ </main>
127
+ <footer>
128
+ <div class="content">
129
+ <p>
130
+ <a class="nav" href="z_4b3d0d3b603de221___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
131
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
132
+ <a class="nav" href="z_4b3d0d3b603de221_config_py.html">&#xbb; next</a>
133
+ &nbsp; &nbsp; &nbsp;
134
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
135
+ created at 2026-02-28 17:48 +0000
136
+ </p>
137
+ </div>
138
+ </footer>
139
+ </body>
140
+ </html>
htmlcov/z_4b3d0d3b603de221_config_py.html ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/config.py: 85%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;config.py</b>:
15
+ <span class="pc_cov">85%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">65 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">55<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">10<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_behavior_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_json_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">pathlib</span> <span class="key">import</span> <span class="nam">Path</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">configparser</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="com"># Config and startup utilities</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="nam">_config</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">def</span> <span class="nam">read_config_file</span><span class="op">(</span><span class="nam">use_cache</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">verbose</span><span class="op">=</span><span class="key">True</span><span class="op">)</span> <span class="op">-></span> <span class="nam">configparser</span><span class="op">.</span><span class="nam">ConfigParser</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="key">global</span> <span class="nam">_config</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="key">if</span> <span class="nam">use_cache</span> <span class="key">and</span> <span class="nam">_config</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="com"># if we have a cached config and accept that, return it</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="run"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">return</span> <span class="nam">_config</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="run"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="nam">config</span> <span class="op">=</span> <span class="nam">configparser</span><span class="op">.</span><span class="nam">ConfigParser</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="com"># Read the default values in the module directory.</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="run"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">config_file_path</span> <span class="op">=</span> <span class="nam">Path</span><span class="op">(</span><span class="nam">__file__</span><span class="op">)</span><span class="op">.</span><span class="nam">parent</span><span class="op">.</span><span class="nam">absolute</span><span class="op">(</span><span class="op">)</span> <span class="op">/</span> <span class="str">'../config.ini'</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Looking for default config on: </span><span class="op">{</span><span class="nam">config_file_path</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> <span class="key">if</span> <span class="nam">verbose</span> <span class="key">else</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="run"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">if</span> <span class="nam">config_file_path</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">config</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">config_file_path</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="run"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">_config</span> <span class="op">=</span> <span class="nam">config</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Failed to find default config on: </span><span class="op">{</span><span class="nam">config_file_path</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="com"># Now, let's override any specific default value, if there's a custom .ini config. </span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="com"># Try the directory of the current main program</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="run"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="nam">config_file_path</span> <span class="op">=</span> <span class="nam">Path</span><span class="op">.</span><span class="nam">cwd</span><span class="op">(</span><span class="op">)</span> <span class="op">/</span> <span class="str">"config.ini"</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="run"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">if</span> <span class="nam">config_file_path</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="run"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Found custom config on: </span><span class="op">{</span><span class="nam">config_file_path</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> <span class="key">if</span> <span class="nam">verbose</span> <span class="key">else</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="run"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">config</span><span class="op">.</span><span class="nam">read</span><span class="op">(</span><span class="nam">config_file_path</span><span class="op">)</span> <span class="com"># this only overrides the values that are present in the custom config</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="run"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">_config</span> <span class="op">=</span> <span class="nam">config</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="run"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">return</span> <span class="nam">config</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">if</span> <span class="nam">verbose</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Failed to find custom config on: </span><span class="op">{</span><span class="nam">config_file_path</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span> <span class="key">if</span> <span class="nam">verbose</span> <span class="key">else</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"Will use only default values. IF THINGS FAIL, TRY CUSTOMIZING MODEL, API TYPE, etc."</span><span class="op">)</span> <span class="key">if</span> <span class="nam">verbose</span> <span class="key">else</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="key">return</span> <span class="nam">config</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
125
+ <p class="run"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="key">def</span> <span class="nam">pretty_print_config</span><span class="op">(</span><span class="nam">config</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="run"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"================================="</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"Current TinyTroupe configuration "</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="run"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="str">"================================="</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="key">for</span> <span class="nam">section</span> <span class="key">in</span> <span class="nam">config</span><span class="op">.</span><span class="nam">sections</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="run"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">[</span><span class="op">{</span><span class="nam">section</span><span class="op">}</span><span class="fst">]</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="run"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">config</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="nam">section</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="run"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="op">{</span><span class="nam">key</span><span class="op">}</span><span class="fst"> = </span><span class="op">{</span><span class="nam">value</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="run"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
+ <p class="run"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"><span class="key">def</span> <span class="nam">pretty_print_datetime</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="run"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="run"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">timezone</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="run"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="nam">now</span> <span class="op">=</span> <span class="nam">datetime</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">now_utc</span> <span class="op">=</span> <span class="nam">now</span><span class="op">.</span><span class="nam">astimezone</span><span class="op">(</span><span class="nam">timezone</span><span class="op">.</span><span class="nam">utc</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="run"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Current date and time (local): </span><span class="op">{</span><span class="nam">now</span><span class="op">.</span><span class="nam">strftime</span><span class="op">(</span><span class="str">'%Y-%m-%d %H:%M:%S'</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="run"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Current date and time (UTC): </span><span class="op">{</span><span class="nam">now_utc</span><span class="op">.</span><span class="nam">strftime</span><span class="op">(</span><span class="str">'%Y-%m-%d %H:%M:%S'</span><span class="op">)</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
144
+ <p class="run"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="key">def</span> <span class="nam">pretty_print_tinytroupe_version</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="run"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="run"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="key">import</span> <span class="nam">importlib</span><span class="op">.</span><span class="nam">metadata</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="run"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">version</span> <span class="op">=</span> <span class="nam">importlib</span><span class="op">.</span><span class="nam">metadata</span><span class="op">.</span><span class="nam">version</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="run"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="run"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">version</span> <span class="op">=</span> <span class="str">"unknown"</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="run"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">print</span><span class="op">(</span><span class="fst">f"</span><span class="fst">TinyTroupe version: </span><span class="op">{</span><span class="nam">version</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
152
+ <p class="run"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"><span class="key">def</span> <span class="nam">start_logger</span><span class="op">(</span><span class="nam">config</span><span class="op">:</span> <span class="nam">configparser</span><span class="op">.</span><span class="nam">ConfigParser</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="com"># create logger</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="run"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="run"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">log_level</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">'Logging'</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">'LOGLEVEL'</span><span class="op">,</span> <span class="str">'INFO'</span><span class="op">)</span><span class="op">.</span><span class="nam">upper</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="run"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">level</span><span class="op">=</span><span class="nam">log_level</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"> <span class="com"># Clear any existing handlers to prevent duplicates</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="com"># This is especially important in Jupyter notebooks where modules get reloaded</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="run"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="key">for</span> <span class="nam">handler</span> <span class="key">in</span> <span class="nam">logger</span><span class="op">.</span><span class="nam">handlers</span><span class="op">[</span><span class="op">:</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">removeHandler</span><span class="op">(</span><span class="nam">handler</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="com"># Prevent propagation to avoid duplicate messages from parent loggers</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">propagate</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="com"># create console handler and set level to debug</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="run"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">ch</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">StreamHandler</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="run"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">ch</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="com"># create formatter</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="run"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">formatter</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">Formatter</span><span class="op">(</span><span class="str">'%(asctime)s - %(name)s - %(levelname)s - %(message)s'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="com"># add formatter to ch</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="run"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">ch</span><span class="op">.</span><span class="nam">setFormatter</span><span class="op">(</span><span class="nam">formatter</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="com"># add ch to logger</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="run"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">addHandler</span><span class="op">(</span><span class="nam">ch</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
179
+ <p class="run"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="key">def</span> <span class="nam">set_loglevel</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> Sets the log level for the TinyTroupe logger.</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> log_level (str): The log level to set (e.g., 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">level</span><span class="op">=</span><span class="nam">log_level</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="com"># Also update all handlers to the new log level</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">for</span> <span class="nam">handler</span> <span class="key">in</span> <span class="nam">logger</span><span class="op">.</span><span class="nam">handlers</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="nam">handler</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">log_level</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
191
+ </main>
192
+ <footer>
193
+ <div class="content">
194
+ <p>
195
+ <a class="nav" href="z_4b3d0d3b603de221_behavior_py.html">&#xab; prev</a> &nbsp; &nbsp;
196
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
197
+ <a class="nav" href="z_4b3d0d3b603de221_json_py.html">&#xbb; next</a>
198
+ &nbsp; &nbsp; &nbsp;
199
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
200
+ created at 2026-02-28 17:48 +0000
201
+ </p>
202
+ </div>
203
+ </footer>
204
+ </body>
205
+ </html>
htmlcov/z_4b3d0d3b603de221_json_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_4b3d0d3b603de221_llm_py.html ADDED
The diff for this file is too large to render. See raw diff
 
htmlcov/z_4b3d0d3b603de221_logger_py.html ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/logger.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;logger.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">26 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">26<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_llm_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_misc_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="nam">loggers</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">def</span> <span class="nam">get_logger</span><span class="op">(</span><span class="nam">agent_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"> <span class="key">if</span> <span class="nam">agent_name</span> <span class="key">in</span> <span class="nam">loggers</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"> <span class="key">return</span> <span class="nam">loggers</span><span class="op">[</span><span class="nam">agent_name</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"> <span class="nam">today</span> <span class="op">=</span> <span class="nam">datetime</span><span class="op">.</span><span class="nam">now</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">strftime</span><span class="op">(</span><span class="str">"%Y-%m-%d"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="nam">log_dir</span> <span class="op">=</span> <span class="str">"logs"</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="nam">os</span><span class="op">.</span><span class="nam">makedirs</span><span class="op">(</span><span class="nam">log_dir</span><span class="op">,</span> <span class="nam">exist_ok</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="com"># Find the next available integer for the log file</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="nam">i</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">while</span> <span class="key">True</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="mis show_mis"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"> <span class="nam">log_file_name</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">log_dir</span><span class="op">,</span> <span class="fst">f"</span><span class="op">{</span><span class="nam">agent_name</span><span class="op">}</span><span class="fst">_</span><span class="op">{</span><span class="nam">today</span><span class="op">}</span><span class="fst">_</span><span class="op">{</span><span class="nam">i</span><span class="op">}</span><span class="fst">.log</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="mis show_mis"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="nam">log_file_name</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="key">break</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="nam">i</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="com"># Set up the logger</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="nam">agent_name</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">setLevel</span><span class="op">(</span><span class="nam">logging</span><span class="op">.</span><span class="nam">INFO</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="com"># Prevent duplicate handlers if this function is called multiple times for the same agent</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="key">if</span> <span class="nam">logger</span><span class="op">.</span><span class="nam">hasHandlers</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">handlers</span><span class="op">.</span><span class="nam">clear</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">handler</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">FileHandler</span><span class="op">(</span><span class="nam">log_file_name</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">'utf-8'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="nam">formatter</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">Formatter</span><span class="op">(</span><span class="str">'%(asctime)s - %(message)s'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="nam">handler</span><span class="op">.</span><span class="nam">setFormatter</span><span class="op">(</span><span class="nam">formatter</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">addHandler</span><span class="op">(</span><span class="nam">handler</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">loggers</span><span class="op">[</span><span class="nam">agent_name</span><span class="op">]</span> <span class="op">=</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="key">return</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
120
+ </main>
121
+ <footer>
122
+ <div class="content">
123
+ <p>
124
+ <a class="nav" href="z_4b3d0d3b603de221_llm_py.html">&#xab; prev</a> &nbsp; &nbsp;
125
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
126
+ <a class="nav" href="z_4b3d0d3b603de221_misc_py.html">&#xbb; next</a>
127
+ &nbsp; &nbsp; &nbsp;
128
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
129
+ created at 2026-02-28 17:48 +0000
130
+ </p>
131
+ </div>
132
+ </footer>
133
+ </body>
134
+ </html>
htmlcov/z_4b3d0d3b603de221_misc_py.html ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/misc.py: 41%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;misc.py</b>:
15
+ <span class="pc_cov">41%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">27 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">11<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">16<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_logger_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_parallel_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">hashlib</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">sys</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="com"># Other</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="nam">AgentOrWorld</span> <span class="op">=</span> <span class="nam">Union</span><span class="op">[</span><span class="str">"TinyPerson"</span><span class="op">,</span> <span class="str">"TinyWorld"</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
94
+ <p class="run"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">def</span> <span class="nam">first_non_none</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str"> Returns the first non-None argument from the provided arguments.</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> *args: Variable length argument list.</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> The first non-None argument, or None if all are None.</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="key">for</span> <span class="nam">arg</span> <span class="key">in</span> <span class="nam">args</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="key">if</span> <span class="nam">arg</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="key">return</span> <span class="nam">arg</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
109
+ <p class="run"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="key">def</span> <span class="nam">name_or_empty</span><span class="op">(</span><span class="nam">named_entity</span><span class="op">:</span> <span class="nam">AgentOrWorld</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> Returns the name of the specified agent or environment, or an empty string if the agent is None.</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">if</span> <span class="nam">named_entity</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">return</span> <span class="str">""</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">return</span> <span class="nam">named_entity</span><span class="op">.</span><span class="nam">name</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="run"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="key">def</span> <span class="nam">custom_hash</span><span class="op">(</span><span class="nam">obj</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="str"> Returns a hash for the specified object. The object is first converted</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> to a string, to make it hashable. This method is deterministic,</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="str"> contrary to the built-in hash() function.</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="key">return</span> <span class="nam">hashlib</span><span class="op">.</span><span class="nam">sha256</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">obj</span><span class="op">)</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">.</span><span class="nam">hexdigest</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="com"># Replace the global counter with a dictionary of counters per scope</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="nam">_fresh_id_counters</span> <span class="op">=</span> <span class="op">{</span><span class="str">"default"</span><span class="op">:</span> <span class="num">0</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
130
+ <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"><span class="key">def</span> <span class="nam">fresh_id</span><span class="op">(</span><span class="nam">scope</span><span class="op">=</span><span class="str">"default"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"><span class="str"> Returns a fresh ID for a new object within the specified scope.</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"><span class="str"> Different scopes have independent ID sequences.</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"><span class="str"> scope (str): The scope to generate the ID in. Defaults to "default".</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> int: A unique ID within the specified scope.</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">global</span> <span class="nam">_fresh_id_counters</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="com"># Initialize the counter for this scope if it doesn't exist</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">if</span> <span class="nam">scope</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">_fresh_id_counters</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">_fresh_id_counters</span><span class="op">[</span><span class="nam">scope</span><span class="op">]</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="nam">_fresh_id_counters</span><span class="op">[</span><span class="nam">scope</span><span class="op">]</span> <span class="op">+=</span> <span class="num">1</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">return</span> <span class="nam">_fresh_id_counters</span><span class="op">[</span><span class="nam">scope</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
150
+ <p class="run"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="key">def</span> <span class="nam">reset_fresh_id</span><span class="op">(</span><span class="nam">scope</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"><span class="str"> Resets the fresh ID counter for the specified scope or for all scopes.</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"><span class="str"> scope (str, optional): The scope to reset. If None, resets all scopes.</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="key">global</span> <span class="nam">_fresh_id_counters</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="key">if</span> <span class="nam">scope</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="com"># Reset all counters</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">_fresh_id_counters</span> <span class="op">=</span> <span class="op">{</span><span class="str">"default"</span><span class="op">:</span> <span class="num">0</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">elif</span> <span class="nam">scope</span> <span class="key">in</span> <span class="nam">_fresh_id_counters</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="com"># Reset only the specified scope</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">_fresh_id_counters</span><span class="op">[</span><span class="nam">scope</span><span class="op">]</span> <span class="op">=</span> <span class="num">0</span>&nbsp;</span><span class="r"></span></p>
165
+ </main>
166
+ <footer>
167
+ <div class="content">
168
+ <p>
169
+ <a class="nav" href="z_4b3d0d3b603de221_logger_py.html">&#xab; prev</a> &nbsp; &nbsp;
170
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
171
+ <a class="nav" href="z_4b3d0d3b603de221_parallel_py.html">&#xbb; next</a>
172
+ &nbsp; &nbsp; &nbsp;
173
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
174
+ created at 2026-02-28 17:48 +0000
175
+ </p>
176
+ </div>
177
+ </footer>
178
+ </body>
179
+ </html>
htmlcov/z_4b3d0d3b603de221_parallel_py.html ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/parallel.py: 41%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;parallel.py</b>:
15
+ <span class="pc_cov">41%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">22 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">9<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">13<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_misc_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_rendering_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">from</span> <span class="nam">concurrent</span><span class="op">.</span><span class="nam">futures</span> <span class="key">import</span> <span class="nam">ThreadPoolExecutor</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">List</span><span class="op">,</span> <span class="nam">Any</span><span class="op">,</span> <span class="nam">Callable</span><span class="op">,</span> <span class="nam">Optional</span><span class="op">,</span> <span class="nam">Dict</span><span class="op">,</span> <span class="nam">Tuple</span><span class="op">,</span> <span class="nam">TypeVar</span><span class="op">,</span> <span class="nam">Iterator</span><span class="op">,</span> <span class="nam">Iterable</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">itertools</span> <span class="key">import</span> <span class="nam">product</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">def</span> <span class="nam">parallel_map</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="run run2"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"> <span class="nam">objects</span><span class="op">:</span> <span class="nam">List</span><span class="op">[</span><span class="nam">Any</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="run run2"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"> <span class="nam">operation</span><span class="op">:</span> <span class="nam">Callable</span><span class="op">[</span><span class="op">[</span><span class="nam">Any</span><span class="op">]</span><span class="op">,</span> <span class="nam">Any</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="run run2"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"> <span class="nam">max_workers</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">int</span><span class="op">]</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="run run2"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">List</span><span class="op">[</span><span class="nam">Any</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> Execute operations on multiple objects in parallel and return the results.</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str"> objects: List of objects to process</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> operation: A callable (typically a lambda) that takes each object and returns a result</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str"> max_workers: Maximum number of threads to use for parallel execution</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> (None means use the default, which is min(32, os.cpu_count() + 4))</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> List of results in the same order as the input objects</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="str"> # For propositions p1, p2, p3</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> results = parallel_map([p1, p2, p3], lambda p: p.check())</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="str"> # With arguments</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> results = parallel_map(</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="str"> [p1, p2, p3], </span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> lambda p: p.check(additional_context="Some context", return_full_response=True)</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> # Works with any operation</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> scores = parallel_map([p1, p2, p3], lambda p: p.score())</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">with</span> <span class="nam">ThreadPoolExecutor</span><span class="op">(</span><span class="nam">max_workers</span><span class="op">=</span><span class="nam">max_workers</span><span class="op">)</span> <span class="key">as</span> <span class="nam">executor</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="nam">results</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">executor</span><span class="op">.</span><span class="nam">map</span><span class="op">(</span><span class="nam">operation</span><span class="op">,</span> <span class="nam">objects</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">return</span> <span class="nam">results</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
+ <p class="run"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"><span class="nam">K</span> <span class="op">=</span> <span class="nam">TypeVar</span><span class="op">(</span><span class="str">'K'</span><span class="op">)</span> <span class="com"># Key type</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="run"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="nam">V</span> <span class="op">=</span> <span class="nam">TypeVar</span><span class="op">(</span><span class="str">'V'</span><span class="op">)</span> <span class="com"># Value type</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="run"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="nam">R</span> <span class="op">=</span> <span class="nam">TypeVar</span><span class="op">(</span><span class="str">'R'</span><span class="op">)</span> <span class="com"># Result type</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
127
+ <p class="run"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="key">def</span> <span class="nam">parallel_map_dict</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="run run2"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="nam">dictionary</span><span class="op">:</span> <span class="nam">Dict</span><span class="op">[</span><span class="nam">K</span><span class="op">,</span> <span class="nam">V</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="run run2"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">operation</span><span class="op">:</span> <span class="nam">Callable</span><span class="op">[</span><span class="op">[</span><span class="nam">Tuple</span><span class="op">[</span><span class="nam">K</span><span class="op">,</span> <span class="nam">V</span><span class="op">]</span><span class="op">]</span><span class="op">,</span> <span class="nam">R</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="run run2"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">max_workers</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">int</span><span class="op">]</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="run run2"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">Dict</span><span class="op">[</span><span class="nam">K</span><span class="op">,</span> <span class="nam">R</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"><span class="str"> Execute operations on dictionary items in parallel and return results as a dictionary.</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"><span class="str"> dictionary: Dictionary whose items will be processed</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> operation: A callable that takes a (key, value) tuple and returns a result</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> max_workers: Maximum number of threads to use</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="str"> Dictionary mapping original keys to operation results</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="str"> # For environment propositions</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"><span class="str"> results = parallel_map_dict(</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="str"> environment_propositions,</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"><span class="str"> lambda item: item[1].score(world, return_full_response=True)</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="mis show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="key">with</span> <span class="nam">ThreadPoolExecutor</span><span class="op">(</span><span class="nam">max_workers</span><span class="op">=</span><span class="nam">max_workers</span><span class="op">)</span> <span class="key">as</span> <span class="nam">executor</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="com"># Create a list of (key, result) tuples</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="nam">items</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">dictionary</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">results</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">executor</span><span class="op">.</span><span class="nam">map</span><span class="op">(</span><span class="nam">operation</span><span class="op">,</span> <span class="nam">items</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="com"># Combine original keys with results</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="op">{</span><span class="nam">item</span><span class="op">[</span><span class="num">0</span><span class="op">]</span><span class="op">:</span> <span class="nam">result</span> <span class="key">for</span> <span class="nam">item</span><span class="op">,</span> <span class="nam">result</span> <span class="key">in</span> <span class="nam">zip</span><span class="op">(</span><span class="nam">items</span><span class="op">,</span> <span class="nam">results</span><span class="op">)</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="run"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"><span class="key">def</span> <span class="nam">parallel_map_cross</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="run run2"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">iterables</span><span class="op">:</span> <span class="nam">List</span><span class="op">[</span><span class="nam">Iterable</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="run run2"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">operation</span><span class="op">:</span> <span class="nam">Callable</span><span class="op">[</span><span class="op">...</span><span class="op">,</span> <span class="nam">R</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="run run2"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">max_workers</span><span class="op">:</span> <span class="nam">Optional</span><span class="op">[</span><span class="nam">int</span><span class="op">]</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="run run2"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="nam">List</span><span class="op">[</span><span class="nam">R</span><span class="op">]</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"><span class="str"> Apply operation to each combination of elements from the iterables in parallel.</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> This is similar to using nested loops.</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"><span class="str"> iterables: List of iterables to generate combinations from</span>&nbsp;</span><span class="r"></span></p>
170
+ <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="str"> operation: A callable that takes elements from each iterable and returns a result</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"><span class="str"> max_workers: Maximum number of threads to use</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"><span class="str"> List of results from applying operation to each combination</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"><span class="str"> # For every agent and proposition</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"><span class="str"> results = parallel_map_cross(</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="str"> [agents, agent_propositions.items()],</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"><span class="str"> lambda agent, prop_item: (prop_item[0], prop_item[1].score(agent))</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> )</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="nam">combinations</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">product</span><span class="op">(</span><span class="op">*</span><span class="nam">iterables</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">def</span> <span class="nam">apply_to_combination</span><span class="op">(</span><span class="nam">combo</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">return</span> <span class="nam">operation</span><span class="op">(</span><span class="op">*</span><span class="nam">combo</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
188
+ <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">with</span> <span class="nam">ThreadPoolExecutor</span><span class="op">(</span><span class="nam">max_workers</span><span class="op">=</span><span class="nam">max_workers</span><span class="op">)</span> <span class="key">as</span> <span class="nam">executor</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">results</span> <span class="op">=</span> <span class="nam">list</span><span class="op">(</span><span class="nam">executor</span><span class="op">.</span><span class="nam">map</span><span class="op">(</span><span class="nam">apply_to_combination</span><span class="op">,</span> <span class="nam">combinations</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="key">return</span> <span class="nam">results</span>&nbsp;</span><span class="r"></span></p>
192
+ </main>
193
+ <footer>
194
+ <div class="content">
195
+ <p>
196
+ <a class="nav" href="z_4b3d0d3b603de221_misc_py.html">&#xab; prev</a> &nbsp; &nbsp;
197
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
198
+ <a class="nav" href="z_4b3d0d3b603de221_rendering_py.html">&#xbb; next</a>
199
+ &nbsp; &nbsp; &nbsp;
200
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
201
+ created at 2026-02-28 17:48 +0000
202
+ </p>
203
+ </div>
204
+ </footer>
205
+ </body>
206
+ </html>
htmlcov/z_4b3d0d3b603de221_rendering_py.html ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/rendering.py: 42%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;rendering.py</b>:
15
+ <span class="pc_cov">42%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">57 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">24<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">33<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_parallel_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_semantics_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">textwrap</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">datetime</span> <span class="key">import</span> <span class="nam">datetime</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Union</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">inspect</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="com"># Rendering and markup </span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">def</span> <span class="nam">inject_html_css_style_prefix</span><span class="op">(</span><span class="nam">html</span><span class="op">,</span> <span class="nam">style_prefix_attributes</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> Injects a style prefix to all style attributes in the given HTML string.</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> For example, if you want to add a style prefix to all style attributes in the HTML string</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> ``&lt;div style="color: red;">Hello&lt;/div>``, you can use this function as follows:</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> inject_html_css_style_prefix('&lt;div style="color: red;">Hello&lt;/div>', 'font-size: 20px;')</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="run"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"> <span class="key">return</span> <span class="nam">html</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'style="'</span><span class="op">,</span> <span class="fst">f'</span><span class="fst">style="</span><span class="op">{</span><span class="nam">style_prefix_attributes</span><span class="op">}</span><span class="fst">;</span><span class="fst">'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="run"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="key">def</span> <span class="nam">break_text_at_length</span><span class="op">(</span><span class="nam">text</span><span class="op">:</span> <span class="nam">Union</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">dict</span><span class="op">]</span><span class="op">,</span> <span class="nam">max_length</span><span class="op">:</span> <span class="nam">int</span><span class="op">=</span><span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> Breaks the text (or JSON) at the specified length, inserting a "(...)" string at the break point.</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="str"> If the maximum length is `None`, the content is returned as is.</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">text</span><span class="op">,</span> <span class="nam">dict</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">text</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">dumps</span><span class="op">(</span><span class="nam">text</span><span class="op">,</span> <span class="nam">indent</span><span class="op">=</span><span class="num">4</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="key">if</span> <span class="nam">max_length</span> <span class="key">is</span> <span class="key">None</span> <span class="key">or</span> <span class="nam">len</span><span class="op">(</span><span class="nam">text</span><span class="op">)</span> <span class="op">&lt;=</span> <span class="nam">max_length</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="key">return</span> <span class="nam">text</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="key">return</span> <span class="nam">text</span><span class="op">[</span><span class="op">:</span><span class="nam">max_length</span><span class="op">]</span> <span class="op">+</span> <span class="str">" (...)"</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="run"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="key">def</span> <span class="nam">pretty_datetime</span><span class="op">(</span><span class="nam">dt</span><span class="op">:</span> <span class="nam">datetime</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="str"> Returns a pretty string representation of the specified datetime object.</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">return</span> <span class="nam">dt</span><span class="op">.</span><span class="nam">strftime</span><span class="op">(</span><span class="str">"%Y-%m-%d %H:%M"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
124
+ <p class="run"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="key">def</span> <span class="nam">dedent</span><span class="op">(</span><span class="nam">text</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"><span class="str"> Dedents the specified text, removing any leading whitespace and identation.</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">return</span> <span class="nam">textwrap</span><span class="op">.</span><span class="nam">dedent</span><span class="op">(</span><span class="nam">text</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
130
+ <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"><span class="key">def</span> <span class="nam">wrap_text</span><span class="op">(</span><span class="nam">text</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">width</span><span class="op">:</span> <span class="nam">int</span><span class="op">=</span><span class="num">100</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"><span class="str"> Wraps the text at the specified width.</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="key">return</span> <span class="nam">textwrap</span><span class="op">.</span><span class="nam">fill</span><span class="op">(</span><span class="nam">text</span><span class="op">,</span> <span class="nam">width</span><span class="op">=</span><span class="nam">width</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
137
+ <p class="run"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="key">def</span> <span class="nam">indent_at_current_level</span><span class="op">(</span><span class="nam">text</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> Indents the specified text at the current indentation level, determined dynamically.</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">frame</span> <span class="op">=</span> <span class="nam">inspect</span><span class="op">.</span><span class="nam">currentframe</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">f_back</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">line</span> <span class="op">=</span> <span class="nam">frame</span><span class="op">.</span><span class="nam">f_lineno</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">filename</span> <span class="op">=</span> <span class="nam">frame</span><span class="op">.</span><span class="nam">f_code</span><span class="op">.</span><span class="nam">co_filename</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">with</span> <span class="nam">open</span><span class="op">(</span><span class="nam">filename</span><span class="op">,</span> <span class="str">'r'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">'utf-8'</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">'replace'</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">lines</span> <span class="op">=</span> <span class="nam">f</span><span class="op">.</span><span class="nam">readlines</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">current_line</span> <span class="op">=</span> <span class="nam">lines</span><span class="op">[</span><span class="nam">line</span> <span class="op">-</span> <span class="num">1</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
148
+ <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">indent</span><span class="op">=</span> <span class="nam">len</span><span class="op">(</span><span class="nam">current_line</span><span class="op">)</span> <span class="op">-</span> <span class="nam">len</span><span class="op">(</span><span class="nam">current_line</span><span class="op">.</span><span class="nam">lstrip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="com"># first dedent the text to remove any leading whitespace</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">text</span> <span class="op">=</span> <span class="nam">dedent</span><span class="op">(</span><span class="nam">text</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="com"># then indent it to the specified level</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">return</span> <span class="nam">textwrap</span><span class="op">.</span><span class="nam">indent</span><span class="op">(</span><span class="nam">text</span><span class="op">,</span> <span class="str">' '</span> <span class="op">*</span> <span class="nam">indent</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
157
+ <p class="run"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"><span class="key">class</span> <span class="nam">RichTextStyle</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="com"># Consult color options here: https://rich.readthedocs.io/en/stable/appendix/colors.html</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
161
+ <p class="run"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">STIMULUS_CONVERSATION_STYLE</span> <span class="op">=</span> <span class="str">"bold italic cyan1"</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">STIMULUS_THOUGHT_STYLE</span> <span class="op">=</span> <span class="str">"dim italic cyan1"</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="run"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"> <span class="nam">STIMULUS_DEFAULT_STYLE</span> <span class="op">=</span> <span class="str">"italic"</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
165
+ <p class="run"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">ACTION_DONE_STYLE</span> <span class="op">=</span> <span class="str">"grey82"</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="run"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="nam">ACTION_TALK_STYLE</span> <span class="op">=</span> <span class="str">"bold green3"</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="run"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">ACTION_THINK_STYLE</span> <span class="op">=</span> <span class="str">"green"</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="run"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">ACTION_DEFAULT_STYLE</span> <span class="op">=</span> <span class="str">"purple"</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="run"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">INTERVENTION_DEFAULT_STYLE</span> <span class="op">=</span> <span class="str">"bright_magenta"</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
172
+ <p class="run"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="op">@</span><span class="nam">classmethod</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="run"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="key">def</span> <span class="nam">get_style_for</span><span class="op">(</span><span class="nam">cls</span><span class="op">,</span> <span class="nam">kind</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">event_type</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="mis show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="key">if</span> <span class="nam">kind</span> <span class="op">==</span> <span class="str">"stimulus"</span> <span class="key">or</span> <span class="nam">kind</span><span class="op">==</span><span class="str">"stimuli"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="key">if</span> <span class="nam">event_type</span> <span class="op">==</span> <span class="str">"CONVERSATION"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">STIMULUS_CONVERSATION_STYLE</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="key">elif</span> <span class="nam">event_type</span> <span class="op">==</span> <span class="str">"THOUGHT"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">STIMULUS_THOUGHT_STYLE</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">STIMULUS_DEFAULT_STYLE</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="key">elif</span> <span class="nam">kind</span> <span class="op">==</span> <span class="str">"action"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="key">if</span> <span class="nam">event_type</span> <span class="op">==</span> <span class="str">"DONE"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">ACTION_DONE_STYLE</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="key">elif</span> <span class="nam">event_type</span> <span class="op">==</span> <span class="str">"TALK"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">ACTION_TALK_STYLE</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="key">elif</span> <span class="nam">event_type</span> <span class="op">==</span> <span class="str">"THINK"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="mis show_mis"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">ACTION_THINK_STYLE</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">ACTION_DEFAULT_STYLE</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
192
+ <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">elif</span> <span class="nam">kind</span> <span class="op">==</span> <span class="str">"intervention"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="key">return</span> <span class="nam">cls</span><span class="op">.</span><span class="nam">INTERVENTION_DEFAULT_STYLE</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
195
+ </main>
196
+ <footer>
197
+ <div class="content">
198
+ <p>
199
+ <a class="nav" href="z_4b3d0d3b603de221_parallel_py.html">&#xab; prev</a> &nbsp; &nbsp;
200
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
201
+ <a class="nav" href="z_4b3d0d3b603de221_semantics_py.html">&#xbb; next</a>
202
+ &nbsp; &nbsp; &nbsp;
203
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
204
+ created at 2026-02-28 17:48 +0000
205
+ </p>
206
+ </div>
207
+ </footer>
208
+ </body>
209
+ </html>
htmlcov/z_4b3d0d3b603de221_semantics_py.html ADDED
@@ -0,0 +1,364 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/semantics.py: 100%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;semantics.py</b>:
15
+ <span class="pc_cov">100%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">17 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">17<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">0<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_rendering_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_4b3d0d3b603de221_validation_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">Semantic-related mechanisms.</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">llm</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
88
+ <p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="run"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">def</span> <span class="nam">correct_according_to_rule</span><span class="op">(</span><span class="nam">observation</span><span class="op">,</span> <span class="nam">rules</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="str"> Given an observation and a one or more rules, this function rephrases or completely changes the observation in accordance with what the rules</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="str"> specify. Some guidelines:</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> - Rules might require changes either to style or to content.</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="str"> - The rephrased observation should be coherent and consistent with the original observation, unless the rules require otherwise.</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str"> - If the rules require, the corrected observation can contradict the original observation.</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str"> - Enforce the rules very strictly, even if the original observation seems correct or acceptable.</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str"> - Rules might contain additional information or suggestions that you may use to improve your output.</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="pln"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str"> ## Examples</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> Observation: "You know, I am so sad these days."</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> Rule: "I am always happy and depression is unknown to me"</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="str"> Modified observation: "You know, I am so happy these days."</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> observation: The observation that should be rephrased or changed. Something that is said or done, or a description of events or facts.</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> rules: The rules that specifies what the modidfied observation should comply with. </span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="str"> str: The rephrased or corrected observation.</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
114
+ <p class="run"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="run"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="key">def</span> <span class="nam">restructure_as_observed_vs_expected</span><span class="op">(</span><span class="nam">description</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"><span class="str"> Given the description of something (either a real event or abstract concept), but that violates an expectation, this function </span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="str"> extracts the following elements from it:</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="str"> - OBSERVED: The observed event or statement.</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> - BROKEN EXPECTATION: The expectation that was broken by the observed event.</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="str"> - REASONING: The reasoning behind the expectation that was broken.</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="str"> If in reality the description does not mention any expectation violation, then the function should instead extract</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="str"> the following elements:</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
127
+ <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"><span class="str"> - OBSERVED: The observed event.</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"><span class="str"> - MET EXPECTATION: The expectation that was met by the observed event.</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"><span class="str"> - REASONING: The reasoning behind the expectation that was met.</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"><span class="str"> This way of restructuring the description can be useful for downstream processing, making it easier to analyze or</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="pln"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"><span class="str"> modify system outputs, for example.</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
134
+ <p class="pln"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"><span class="str"> ## Examples</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"><span class="str"> Input: "Ana mentions she loved the proposed new food, a spicier flavor of gazpacho. However, this goes agains her known dislike</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> of spicy food."</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> Output: </span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"><span class="str"> "OBSERVED: Ana mentions she loved the proposed new food, a spicier flavor of gazpacho.</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"><span class="str"> BROKEN EXPECTATION: Ana should have mentioned that she disliked the proposed spicier gazpacho.</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"><span class="str"> REASONING: Ana has a known dislike of spicy food."</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
143
+ <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="str"> Input: "Carlos traveled to Firenzi and was amazed by the beauty of the city. This was in line with his love for art and architecture."</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"><span class="str"> Output: </span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="pln"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"><span class="str"> "OBSERVED: Carlos traveled to Firenzi and was amazed by the beauty of the city.</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"><span class="str"> MET EXPECTATION: Carlos should have been amazed by the beauty of the city.</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"><span class="str"> REASONING: Carlos loves art and architecture."</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
150
+ <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="pln"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"><span class="str"> description (str): A description of an event or concept that either violates or meets an expectation.</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="pln"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="pln"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"><span class="str"> str: The restructured description.</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="pln"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="run"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="run"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"><span class="key">def</span> <span class="nam">extract_observed_vs_expected_rules</span><span class="op">(</span><span class="nam">description</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"><span class="str"> Given the description of something (either a real event or abstract concept), extract:</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"><span class="str"> - The object or person about whom something is said.</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="str"> - A list where each element contains:</span>&nbsp;</span><span class="r"></span></p>
164
+ <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="str"> * The name of a behavior or property that is expected to be observed.</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"><span class="str"> * The typical or expected observation.</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> * The actual observation. If this does not match the expected observation, this should be made very clear.</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"><span class="str"> * A proposed correction to the observation, if possible.</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
170
+ <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"><span class="str"> # Example:</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="pln"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"><span class="str"> **Description:**</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"><span class="str"> Quality feedback</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"><span class="str"> This is the action that was generated by the agent:</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="pln"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"><span class="str"> {'type': 'TALK', 'content': "I might consider buying bottled gazpacho, although I prefer making it fresh at home, and I find that most pre-packaged products don't meet my expectations in terms of quality. ", 'target': 'Michael Thompson'}</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
178
+ <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"><span class="str"> Unfortunately, the action failed to pass the quality checks. The following problems were detected.</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"><span class="str"> Problem: The action does not adhere to the persona specification.</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> Score = 5 (out of 9). Justification = The next action of Emily Carter, which involves expressing her opinion on bottled gazpacho, aligns with her persona specification of being critical and having high standards for products. She articulates her preferences and concerns about quality, which is consistent with her persona traits of being overly critical and rarely satisfied. However, she seems too ready to consider it, going against her strong rejection of new products and services. Therefore, it deviates substantially from her persona, leading to a score of 5.</span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> Problem: The action is not suitable to the situation or task.</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> Score = 5 (out of 9). Justification = The next action, where Emily expresses her consideration about buying bottled gazpacho, aligns with the task of discussing her opinion on the product. However, it fails to give a clear "yes" or "no" answer, that was requested by her interviewer.</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"><span class="str"> **Output:**</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="pln"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"><span class="str"> {</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"><span class="str"> "object": "Emily Carter",</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"><span class="str"> "behavior": [</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="pln"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"><span class="str"> {</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"><span class="str"> "name:": "Persona Adherence",</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"><span class="str"> "expected": "She is very critical and have high standards for products. Would never adopt a new product unless it meets her expectations.",</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="pln"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"><span class="str"> "actual": "She seems more inclined than expected to try the product.",</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"><span class="str"> "correction": "She should say she won't consider buying bottled gazpacho, and give reasons for that."</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"><span class="str"> },</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
199
+ <p class="pln"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"><span class="str"> {</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"><span class="str"> "name:": "Task Suitability",</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"><span class="str"> "expected": "She should give a clear 'yes' or 'no' answer to the question.",</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"><span class="str"> "actual": "She doesn't give a clear 'yes' or 'no' answer to the question, but instead providing more nuanced feedback.",</span>&nbsp;</span><span class="r"></span></p>
203
+ <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"><span class="str"> "correction": "She should give a clear 'yes' or 'no' answer to the question, and optionally provide additional nuanced feedback."</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"><span class="str"> }</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="str"> ]</span>&nbsp;</span><span class="r"></span></p>
206
+ <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"><span class="str"> }</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"><span class="str"> ```</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
212
+ <p class="run"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="run"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"><span class="key">def</span> <span class="nam">formulate_corrective_rule</span><span class="op">(</span><span class="nam">feedback</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
214
+ <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"><span class="str"> Given the feedback about something (either a real event or abstract concept) that violated an expectation, </span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"><span class="str"> this function transforms it into a general rule that must be followed in the future to avoid breaking the expectation again.</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"><span class="str"> The feedback always refers to some actual behavior, fact or event, and some broken expectation. The abstracted rule should</span>&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"><span class="str"> specify that this expectation should not be violated in the future, and the behavior, fact or event not repeated. The idea is</span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"><span class="str"> to learn from past mistakes, so that the rule is a way to avoid them in the future.</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
222
+ <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"><span class="str"> The rule is meant to CHANGE the actual behavior, facts or events, so that it CONFORMS to the expectation, regardless of whether the</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"><span class="str"> expectation is a good or bad one. This is critical, because the rule will be refered in the future as a guideline</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"><span class="str"> about what must happen or be done.</span>&nbsp;</span><span class="r"></span></p>
225
+ <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
226
+ <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"><span class="str"> For instance, if the feedback is of the form (modulo grammatical adjustments): </span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"><span class="str"> OBSERVED BEHAVIOR, but EXPECTED BEHAVIOR, because REASONING.</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="pln"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"><span class="str"> then the rule would be of the form:</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"><span class="str"> "I should have EXPECTED BEHAVIOR, because REASONING, and never OBSERVED BEHAVIOR."</span>&nbsp;</span><span class="r"></span></p>
230
+ <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
231
+ <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"><span class="str"> DO NOT make moral judgements about the expectation or the behavior, fact or event. Even if the expectation is bad, </span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"><span class="str"> the correct rule remains important, since there are legitimate cases where this is necessary (e.g., a simulation of </span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"><span class="str"> a person with a negative behavior, in the context of psychological research; or an evil character in a movie script).</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
235
+ <p class="pln"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"><span class="str"> ## Examples</span>&nbsp;</span><span class="r"></span></p>
236
+ <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
237
+ <p class="pln"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"><span class="str"> Feedback: "Ana mentions she loved the proposed new food, a spicier flavor of gazpacho. However, this goes agains her known dislike</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"><span class="str"> of spicy food."</span>&nbsp;</span><span class="r"></span></p>
239
+ <p class="pln"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"><span class="str"> Rule: "Whenever I'm proposed spicy foods, I should reject the proposal, because I don't like spicy foods."</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
243
+ <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
244
+ <p class="run"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="nam">enable_json_output_format</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
245
+ <p class="run"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t"><span class="key">def</span> <span class="nam">combine_texts</span><span class="op">(</span><span class="op">*</span><span class="nam">texts</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
246
+ <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
247
+ <p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"><span class="str"> Given a list of input texts, this function combines them into a single text, ensuring that the</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"><span class="str"> output is coherent, consistent, and logically structured. In particular, the resulting combination</span>&nbsp;</span><span class="r"></span></p>
249
+ <p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"><span class="str"> must follow these rules:</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"><span class="str"> - The combination consolidates the information from the inputs. It **does not** just concatenate them.</span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"><span class="str"> - Information that was repeated across the inputs is not repeated in the output, but rather unified and consolidated there.</span>&nbsp;</span><span class="r"></span></p>
252
+ <p class="pln"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"><span class="str"> - The combination preserves all the essential information from the inputs, but it is not a simple copy of them.</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"><span class="str"> - If information from some inputs can be combined in a more concise formulation, this new formulation should be used in the output.</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"><span class="str"> This allows to reduce redundancy and improve clarity.</span>&nbsp;</span><span class="r"></span></p>
255
+ <p class="pln"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"><span class="str"> - The combination might be larger than the sum of the inputs, since it preserves the information from the inputs.</span>&nbsp;</span><span class="r"></span></p>
256
+ <p class="pln"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"><span class="str"> - If the various inputs seem to follow some common format or style, the output must follow that format or style too.</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="pln"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"><span class="str"> - The combination can contain inconsistencies or contradictions, in case the inputs do.</span>&nbsp;</span><span class="r"></span></p>
258
+ <p class="pln"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
259
+ <p class="pln"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="pln"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"><span class="str"> *texts: A list of input texts to be combined.</span>&nbsp;</span><span class="r"></span></p>
261
+ <p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
262
+ <p class="pln"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
263
+ <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"><span class="str"> str: The combined text.</span>&nbsp;</span><span class="r"></span></p>
264
+ <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
265
+ <p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
267
+ <p class="run"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="nam">enable_json_output_format</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
268
+ <p class="run"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"><span class="key">def</span> <span class="nam">extract_information_from_text</span><span class="op">(</span><span class="nam">query</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">text</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">context</span><span class="op">:</span><span class="nam">str</span><span class="op">=</span><span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
269
+ <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
270
+ <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"><span class="str"> Given a text and a query, this function extracts the information from the text that either answers the query directly or</span>&nbsp;</span><span class="r"></span></p>
271
+ <p class="pln"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"><span class="str"> provides relevant information related to it. The query can be a question, a request for specific information, or a general</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"><span class="str"> request for details about the text. If the desired information is not present in the text, the function should return an empty string.</span>&nbsp;</span><span class="r"></span></p>
273
+ <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"><span class="str"> If a context is provided, it is used to help in understanding the query or the text, and to provide additional background</span>&nbsp;</span><span class="r"></span></p>
274
+ <p class="pln"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"><span class="str"> information or expectations about the input/output. Any requests in the context are respected and enforced in the output.</span>&nbsp;</span><span class="r"></span></p>
275
+ <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
276
+ <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
277
+ <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"><span class="str"> query (str): The query that specifies what information to extract.</span>&nbsp;</span><span class="r"></span></p>
278
+ <p class="pln"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"><span class="str"> text (str): The text from which to extract information.</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="pln"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"><span class="str"> context (str, optional): Additional context that might help in extracting the information. This can be used to provide </span>&nbsp;</span><span class="r"></span></p>
280
+ <p class="pln"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"><span class="str"> background information or specify expectations about the input/output.</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="pln"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
282
+ <p class="pln"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
283
+ <p class="pln"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"><span class="str"> str: The extracted information that answers the query. If no information is found, an empty string is returned.</span>&nbsp;</span><span class="r"></span></p>
284
+ <p class="pln"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
285
+ <p class="pln"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
286
+ <p class="pln"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
287
+ <p class="run"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="nam">enable_json_output_format</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
288
+ <p class="run"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"><span class="key">def</span> <span class="nam">accumulate_based_on_query</span><span class="op">(</span><span class="nam">query</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">new_entry</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">current_accumulation</span><span class="op">:</span><span class="nam">str</span><span class="op">,</span> <span class="nam">context</span><span class="op">=</span><span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
289
+ <p class="pln"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="pln"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"><span class="str"> This function accumulates information that is relevant to a given query. It takes a new entry and updates the current accumulation of information</span>&nbsp;</span><span class="r"></span></p>
291
+ <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"><span class="str"> such that the final accumulation preserves its original information and in addition integrates the new entry in a way that addresses the query or provides related information. </span>&nbsp;</span><span class="r"></span></p>
292
+ <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"><span class="str"> Details are **never** suppressed, but rather expanded upon, while mantaining the coherence and structure of the overall accumulation.</span>&nbsp;</span><span class="r"></span></p>
293
+ <p class="pln"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"><span class="str"> In other words, it is a monotonic accumulation process that builds on the current accumulation, **minimally** adjusts it to maintain coherence,</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"><span class="str"> while ensuring that the new entry is integrated in a way that is relevant to the query.</span>&nbsp;</span><span class="r"></span></p>
295
+ <p class="pln"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"><span class="str"> The query itself specifies the problem that the accumulation is trying to address, and the new entry is a piece of information that might be relevant to that problem.</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
297
+ <p class="pln"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"><span class="str"> The function should ensure that the accumulation is coherent, well-written, and that it does not contain redundant information. More precisely:</span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="pln"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"><span class="str"> - INTEGRATES NEW ENTRIES: The accumulation process is not a simple concatenation of the new entry and the current accumulation. Rather, it should intelligently integrate </span>&nbsp;</span><span class="r"></span></p>
299
+ <p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"><span class="str"> the new entry into the current accumulation, even if this requires rephrasing, restructuring or rewriting the resulting accumulation.</span>&nbsp;</span><span class="r"></span></p>
300
+ <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"><span class="str"> - EXPAND ON DETAILS: When integrating the new entry, always try to expand the level of detail rather than reduce it.</span>&nbsp;</span><span class="r"></span></p>
301
+ <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"><span class="str"> - AVOID OBVIOUS REDUNDANCY: The integration of the new entry should be done in a way to avoid obvious redundancy and ensure that the resulting accumulation is coherent and well-structured. However,</span>&nbsp;</span><span class="r"></span></p>
302
+ <p class="pln"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="str"> it **must** preserve nuances that might be somewhat redundant.</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"><span class="str"> - ALWAYS PRESERVE INFORMATION: Previous information should **never** be lost. Previous emphasis or details are **never** lost. Rather, the accumulation is suitably expanded to include the new entry, </span>&nbsp;</span><span class="r"></span></p>
304
+ <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"><span class="str"> while preserving the previous information and maintaining the coherence of the overall accumulation.</span>&nbsp;</span><span class="r"></span></p>
305
+ <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"><span class="str"> - INTEGRATE ONLY IF RELEVANT: The new entry should be integrated into the current accumulation only if it is relevant to the query. Otherwise, the accumulation should remain unchanged.</span>&nbsp;</span><span class="r"></span></p>
306
+ <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"><span class="str"> - TOLERATE CONTRADICTIONS: If the new entry contradicts the current accumulation, it should be integrated in a way that mentions the fact that there are </span>&nbsp;</span><span class="r"></span></p>
307
+ <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"><span class="str"> divergent pieces of information, and that the accumulation reflects this divergence. That is to say, the contradiction is not discarded, but rather acknowledged and preserved.</span>&nbsp;</span><span class="r"></span></p>
308
+ <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"><span class="str"> - MAINTAIN COHERENCE: The resulting accumulation should be coherent and well-structured, with a clear flow of information.</span>&nbsp;</span><span class="r"></span></p>
309
+ <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="str"> - CONSIDER CONTEXT: If a context is provided, it should be used to help in understanding the query or the new entry, and to provide additional background </span>&nbsp;</span><span class="r"></span></p>
310
+ <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"><span class="str"> information or expectations about the input/output. Make sure any requests in the context are respected and enforced in the output.</span>&nbsp;</span><span class="r"></span></p>
311
+ <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
312
+ <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
313
+ <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="str"> query (str): The query that specifies the problem that the accumulation is trying to address.</span>&nbsp;</span><span class="r"></span></p>
314
+ <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="str"> new_entry (str): The new entry of information to be considered for accumulation.</span>&nbsp;</span><span class="r"></span></p>
315
+ <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="str"> current_accumulation (str): The current accumulation of information.</span>&nbsp;</span><span class="r"></span></p>
316
+ <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"><span class="str"> context (str, optional): Additional context that might help in understanding the query or the new entry. This can be used to provide </span>&nbsp;</span><span class="r"></span></p>
317
+ <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"><span class="str"> background information or specify expectations about the input/output.</span>&nbsp;</span><span class="r"></span></p>
318
+ <p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
319
+ <p class="pln"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
320
+ <p class="pln"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"><span class="str"> str: The updated accumulation of information that includes the new entry if it is relevant to the query.</span>&nbsp;</span><span class="r"></span></p>
321
+ <p class="pln"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
322
+ <p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
323
+ <p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
324
+ <p class="run"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"><span class="op">@</span><span class="nam">llm</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
325
+ <p class="run"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"><span class="key">def</span> <span class="nam">compute_semantic_proximity</span><span class="op">(</span><span class="nam">text1</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">text2</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">context</span><span class="op">:</span> <span class="nam">str</span> <span class="op">=</span> <span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="nam">float</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
326
+ <p class="pln"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
327
+ <p class="pln"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"><span class="str"> Computes the semantic proximity between two texts and returns a proximity score.</span>&nbsp;</span><span class="r"></span></p>
328
+ <p class="pln"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"><span class="str"> This function is particularly useful for comparing agent justifications, explanations, or reasoning</span>&nbsp;</span><span class="r"></span></p>
329
+ <p class="pln"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"><span class="str"> to assess how similar they are in meaning and content.</span>&nbsp;</span><span class="r"></span></p>
330
+ <p class="pln"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
331
+ <p class="pln"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
332
+ <p class="pln"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"><span class="str"> text1 (str): The first text to compare.</span>&nbsp;</span><span class="r"></span></p>
333
+ <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"><span class="str"> text2 (str): The second text to compare.</span>&nbsp;</span><span class="r"></span></p>
334
+ <p class="pln"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"><span class="str"> context (str, optional): Additional context that might help in understanding the comparison.</span>&nbsp;</span><span class="r"></span></p>
335
+ <p class="pln"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"><span class="str"> This can provide background information about what the texts represent</span>&nbsp;</span><span class="r"></span></p>
336
+ <p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t"><span class="str"> or the purpose of the comparison.</span>&nbsp;</span><span class="r"></span></p>
337
+ <p class="pln"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
338
+ <p class="pln"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
339
+ <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"><span class="str"> float</span>&nbsp;</span><span class="r"></span></p>
340
+ <p class="pln"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
341
+ <p class="pln"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
342
+ <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"><span class="str"> >>> result = compute_semantic_proximity(</span>&nbsp;</span><span class="r"></span></p>
343
+ <p class="pln"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"><span class="str"> ... "I prefer luxury travel because I enjoy comfort and high-quality service",</span>&nbsp;</span><span class="r"></span></p>
344
+ <p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"><span class="str"> ... "I like premium vacations since I value convenience and excellent amenities"</span>&nbsp;</span><span class="r"></span></p>
345
+ <p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"><span class="str"> ... )</span>&nbsp;</span><span class="r"></span></p>
346
+ <p class="pln"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"><span class="str"> >>> print(result) # Expected: ~0.85</span>&nbsp;</span><span class="r"></span></p>
347
+ <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
348
+ <p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"> <span class="com"># llm decorator will handle the body of this function</span>&nbsp;</span><span class="r"></span></p>
349
+ <p class="pln"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
350
+ </main>
351
+ <footer>
352
+ <div class="content">
353
+ <p>
354
+ <a class="nav" href="z_4b3d0d3b603de221_rendering_py.html">&#xab; prev</a> &nbsp; &nbsp;
355
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
356
+ <a class="nav" href="z_4b3d0d3b603de221_validation_py.html">&#xbb; next</a>
357
+ &nbsp; &nbsp; &nbsp;
358
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
359
+ created at 2026-02-28 17:48 +0000
360
+ </p>
361
+ </div>
362
+ </footer>
363
+ </body>
364
+ </html>
htmlcov/z_4b3d0d3b603de221_validation_py.html ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/utils/validation.py: 33%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;utils&#8201;/&#8201;validation.py</b>:
15
+ <span class="pc_cov">33%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">27 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">9<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">18<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_4b3d0d3b603de221_semantics_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_96a307234d1981d5___init___py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">sys</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">unicodedata</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">pydantic</span> <span class="key">import</span> <span class="nam">ValidationError</span><span class="op">,</span> <span class="nam">BaseModel</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="run"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">utils</span> <span class="key">import</span> <span class="nam">logger</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="com"># Validation</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="com">################################################################################</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="run"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">def</span> <span class="nam">check_valid_fields</span><span class="op">(</span><span class="nam">obj</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> <span class="nam">valid_fields</span><span class="op">:</span> <span class="nam">list</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str"> Checks whether the fields in the specified dict are valid, according to the list of valid fields. If not, raises a ValueError.</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="pln"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="mis show_mis"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"> <span class="key">for</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">obj</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"> <span class="key">if</span> <span class="nam">key</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">valid_fields</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="mis show_mis"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Invalid key </span><span class="op">{</span><span class="nam">key</span><span class="op">}</span><span class="fst"> in dictionary. Valid keys are: </span><span class="op">{</span><span class="nam">valid_fields</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
101
+ <p class="run"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="key">def</span> <span class="nam">sanitize_raw_string</span><span class="op">(</span><span class="nam">value</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="str"> Sanitizes the specified string by: </span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="str"> - removing any invalid characters.</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="str"> - ensuring it is not longer than the maximum Python string length.</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> This is for an abundance of caution with security, to avoid any potential issues with the string.</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="pln"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="com"># remove any invalid characters by making sure it is a valid UTF-8 string</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="nam">value</span> <span class="op">=</span> <span class="nam">value</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">,</span> <span class="str">"ignore"</span><span class="op">)</span><span class="op">.</span><span class="nam">decode</span><span class="op">(</span><span class="str">"utf-8"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"> <span class="nam">value</span> <span class="op">=</span> <span class="nam">unicodedata</span><span class="op">.</span><span class="nam">normalize</span><span class="op">(</span><span class="str">"NFC"</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="com"># ensure it is not longer than the maximum Python string length</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">return</span> <span class="nam">value</span><span class="op">[</span><span class="op">:</span><span class="nam">sys</span><span class="op">.</span><span class="nam">maxsize</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
119
+ <p class="run"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"><span class="key">def</span> <span class="nam">sanitize_dict</span><span class="op">(</span><span class="nam">value</span><span class="op">:</span> <span class="nam">dict</span><span class="op">)</span> <span class="op">-></span> <span class="nam">dict</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> Sanitizes the specified dictionary by:</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"><span class="str"> - removing any invalid characters.</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"><span class="str"> - ensuring that the dictionary is not too deeply nested.</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
126
+ <p class="pln"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="com"># sanitize the string representation of the dictionary</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="key">for</span> <span class="nam">k</span><span class="op">,</span> <span class="nam">v</span> <span class="key">in</span> <span class="nam">value</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">v</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">value</span><span class="op">[</span><span class="nam">k</span><span class="op">]</span> <span class="op">=</span> <span class="nam">sanitize_raw_string</span><span class="op">(</span><span class="nam">v</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="com"># ensure that the dictionary is not too deeply nested</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="key">return</span> <span class="nam">value</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
134
+ <p class="run"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"><span class="key">def</span> <span class="nam">to_pydantic_or_sanitized_dict</span><span class="op">(</span><span class="nam">value</span><span class="op">:</span> <span class="nam">dict</span><span class="op">,</span> <span class="nam">model</span><span class="op">:</span> <span class="nam">BaseModel</span><span class="op">=</span><span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="nam">dict</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="pln"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"><span class="str"> Converts the specified model response dictionary to a Pydantic model instance, or sanitizes it if the model is not valid.</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="pln"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"><span class="str"> It is assumed that the dict contains the `content` key.</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="pln"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
140
+ <p class="mis show_mis"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="key">if</span> <span class="nam">model</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> <span class="key">and</span> <span class="op">(</span><span class="nam">isinstance</span><span class="op">(</span><span class="nam">model</span><span class="op">,</span> <span class="nam">type</span><span class="op">)</span> <span class="key">and</span> <span class="nam">issubclass</span><span class="op">(</span><span class="nam">model</span><span class="op">,</span> <span class="nam">BaseModel</span><span class="op">)</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="com"># If a model is provided, try to validate the value against the model</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="mis show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">res</span> <span class="op">=</span> <span class="nam">model</span><span class="op">.</span><span class="nam">model_validate</span><span class="op">(</span><span class="nam">sanitize_dict</span><span class="op">(</span><span class="nam">json</span><span class="op">.</span><span class="nam">loads</span><span class="op">(</span><span class="nam">value</span><span class="op">[</span><span class="str">'content'</span><span class="op">]</span><span class="op">)</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="key">return</span> <span class="nam">res</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="key">except</span> <span class="nam">ValidationError</span> <span class="key">as</span> <span class="nam">e</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">logger</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Validation error: </span><span class="op">{</span><span class="nam">e</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="key">return</span> <span class="nam">sanitize_dict</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">return</span> <span class="nam">sanitize_dict</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span> <span class="com"># If no model, just sanitize the dict</span>&nbsp;</span><span class="r"></span></p>
150
+ </main>
151
+ <footer>
152
+ <div class="content">
153
+ <p>
154
+ <a class="nav" href="z_4b3d0d3b603de221_semantics_py.html">&#xab; prev</a> &nbsp; &nbsp;
155
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
156
+ <a class="nav" href="z_96a307234d1981d5___init___py.html">&#xbb; next</a>
157
+ &nbsp; &nbsp; &nbsp;
158
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
159
+ created at 2026-02-28 17:48 +0000
160
+ </p>
161
+ </div>
162
+ </footer>
163
+ </body>
164
+ </html>
htmlcov/z_6bd7109c20672ac0___init___py.html ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/examples/__init__.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">5 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">5<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_93fcbcbc09a08040_tiny_world_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_6bd7109c20672ac0_agents_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="nam">logger</span> <span class="op">=</span> <span class="nam">logging</span><span class="op">.</span><span class="nam">getLogger</span><span class="op">(</span><span class="str">"tinytroupe"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">default</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="com"># Exposed API</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="mis show_mis"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">agents</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">loaders</span> <span class="key">import</span> <span class="op">*</span>&nbsp;</span><span class="r"></span></p>
94
+ </main>
95
+ <footer>
96
+ <div class="content">
97
+ <p>
98
+ <a class="nav" href="z_93fcbcbc09a08040_tiny_world_py.html">&#xab; prev</a> &nbsp; &nbsp;
99
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
100
+ <a class="nav" href="z_6bd7109c20672ac0_agents_py.html">&#xbb; next</a>
101
+ &nbsp; &nbsp; &nbsp;
102
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
103
+ created at 2026-02-28 17:48 +0000
104
+ </p>
105
+ </div>
106
+ </footer>
107
+ </body>
108
+ </html>
htmlcov/z_6bd7109c20672ac0_agents_py.html ADDED
@@ -0,0 +1,413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/examples/agents.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;agents.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">55 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">55<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_6bd7109c20672ac0___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_6bd7109c20672ac0_loaders_py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="str">Some examples of how to use the tinytroupe library. These can be used directly or slightly modified to create your own '</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="str">agents.</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="pln"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span><span class="op">.</span><span class="nam">agent</span> <span class="key">import</span> <span class="nam">TinyPerson</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">from</span> <span class="op">.</span><span class="nam">loaders</span> <span class="key">import</span> <span class="nam">load_example_agent_specification</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="com">###################################</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="com"># Example 1: Oscar, the architect</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="com">###################################</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
95
+ <p class="mis show_mis"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="key">def</span> <span class="nam">create_oscar_the_architect</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">return</span> <span class="nam">TinyPerson</span><span class="op">.</span><span class="nam">load_specification</span><span class="op">(</span><span class="nam">load_example_agent_specification</span><span class="op">(</span><span class="str">"Oscar"</span><span class="op">)</span><span class="op">,</span> <span class="nam">new_agent_name</span><span class="op">=</span><span class="str">"Oscar"</span><span class="op">,</span> <span class="nam">auto_rename_agent</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">def</span> <span class="nam">create_oscar_the_architect_2</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> A purely programmatic way to create Oscar, the architect. Has less information than the one loaded from a file, just for demonstration purposes.</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="mis show_mis"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"> <span class="nam">oscar</span> <span class="op">=</span> <span class="nam">TinyPerson</span><span class="op">(</span><span class="str">"Oscar"</span><span class="op">,</span> <span class="nam">enable_browser</span><span class="op">=</span><span class="nam">enable_browser</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
104
+ <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"age"</span><span class="op">,</span> <span class="num">30</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
105
+ <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"nationality"</span><span class="op">,</span> <span class="str">"German"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="mis show_mis"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"behaviors"</span><span class="op">,</span> <span class="op">{</span><span class="str">"routines"</span><span class="op">:</span> <span class="op">[</span><span class="str">"Every morning, you wake up, feed your dog, and go to work."</span><span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="mis show_mis"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"occupation"</span><span class="op">,</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis mis2 show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="str">"title"</span><span class="op">:</span> <span class="str">"Architect"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="mis mis2 show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="str">"organization"</span><span class="op">:</span> <span class="str">"Awesome Inc."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis mis2 show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="mis mis2 show_mis"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="mis mis2 show_mis"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> You are an architect. You work at a company called "Awesome Inc.". Though you are qualified to do any </span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="mis mis2 show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="str"> architecture task, currently you are responsible for establishing standard elements for the new appartment </span>&nbsp;</span><span class="r"></span></p>
114
+ <p class="mis mis2 show_mis"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> buildings built by Awesome, so that customers can select a pre-defined configuration for their appartment </span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="mis mis2 show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> without having to go through the hassle of designing it themselves. You care a lot about making sure your </span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="mis mis2 show_mis"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> standard designs are functional, aesthetically pleasing and cost-effective. Your main difficulties typically </span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis mis2 show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"><span class="str"> involve making trade-offs between price and quality - you tend to favor quality, but your boss is always </span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="mis mis2 show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="str"> pushing you to reduce costs. You are also responsible for making sure the designs are compliant with </span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis mis2 show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"><span class="str"> local building regulations.</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="mis mis2 show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"><span class="str"> """</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
122
+ <p class="mis show_mis"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"personality"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="mis mis2 show_mis"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="op">{</span><span class="str">"traits"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="mis mis2 show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="str">"You are fast paced and like to get things done quickly."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="mis mis2 show_mis"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="str">"You are very detail oriented and like to make sure everything is perfect."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis mis2 show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="str">"You have a witty sense of humor and like to make jokes."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="mis mis2 show_mis"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="str">"You don't get angry easily, and always try to stay calm. However, in the few occasions you do get angry, you get very very mad."</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="mis mis2 show_mis"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="pln"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
130
+ <p class="mis show_mis"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"preferences"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="mis mis2 show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="op">{</span><span class="str">"interests"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
132
+ <p class="mis mis2 show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="str">"Modernist architecture and design."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="mis mis2 show_mis"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="str">"New technologies for architecture."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="mis mis2 show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="str">"Sustainable architecture and practices."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="mis mis2 show_mis"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
+ <p class="mis mis2 show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="str">"Traveling to exotic places."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="mis mis2 show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="str">"Playing the guitar."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="mis mis2 show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="str">"Reading books, particularly science fiction."</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="mis mis2 show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
140
+ <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
141
+ <p class="pln"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
142
+ <p class="mis show_mis"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"skills"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="mis mis2 show_mis"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="mis mis2 show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"> <span class="str">"You are very familiar with AutoCAD, and use it for most of your work."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
145
+ <p class="mis mis2 show_mis"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="str">"You are able to easily search for information on the internet."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="mis mis2 show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="str">"You are familiar with Word and PowerPoint, but struggle with Excel."</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="mis mis2 show_mis"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
148
+ <p class="pln"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
149
+ <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="nam">oscar</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"relationships"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
150
+ <p class="mis mis2 show_mis"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="mis mis2 show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Richard"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="mis mis2 show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your colleague, handles similar projects, but for a different market."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
153
+ <p class="mis mis2 show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"John"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your boss, he is always pushing you to reduce costs."</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="mis mis2 show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="pln"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
156
+ <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="nam">oscar</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t"><span class="com">#######################################</span>&nbsp;</span><span class="r"></span></p>
159
+ <p class="pln"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"><span class="com"># Example 2: Lisa, the Data Scientist</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"><span class="com">#######################################</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="mis show_mis"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"><span class="key">def</span> <span class="nam">create_lisa_the_data_scientist</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="mis show_mis"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="key">return</span> <span class="nam">TinyPerson</span><span class="op">.</span><span class="nam">load_specification</span><span class="op">(</span><span class="nam">load_example_agent_specification</span><span class="op">(</span><span class="str">"Lisa"</span><span class="op">)</span><span class="op">,</span> <span class="nam">new_agent_name</span><span class="op">=</span><span class="str">"Lisa"</span><span class="op">,</span> <span class="nam">auto_rename_agent</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
164
+ <p class="mis show_mis"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="key">def</span> <span class="nam">create_lisa_the_data_scientist_2</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="str">""" </span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> A purely programmatic way to create Lisa, the data scientist. Has less information than the one loaded from a file, just for demonstration purposes</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="mis show_mis"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">lisa</span> <span class="op">=</span> <span class="nam">TinyPerson</span><span class="op">(</span><span class="str">"Lisa"</span><span class="op">,</span> <span class="nam">enable_browser</span><span class="op">=</span><span class="nam">enable_browser</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="mis show_mis"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"age"</span><span class="op">,</span> <span class="num">28</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"nationality"</span><span class="op">,</span> <span class="str">"Canadian"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"occupation"</span><span class="op">,</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
173
+ <p class="mis mis2 show_mis"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="str">"title"</span><span class="op">:</span> <span class="str">"Data Scientist"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="mis mis2 show_mis"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="str">"organization"</span><span class="op">:</span> <span class="str">"Microsoft"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="mis mis2 show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
176
+ <p class="mis mis2 show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="mis mis2 show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"><span class="str"> You are a data scientist. You work at Microsoft, in the M365 Search team. Your main role is to analyze </span>&nbsp;</span><span class="r"></span></p>
178
+ <p class="mis mis2 show_mis"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"><span class="str"> user behavior and feedback data, and use it to improve the relevance and quality of the search results. </span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="mis mis2 show_mis"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"><span class="str"> You also build and test machine learning models for various search scenarios, such as natural language </span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="mis mis2 show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"><span class="str"> understanding, query expansion, and ranking. You care a lot about making sure your data analysis and </span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="mis mis2 show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> models are accurate, reliable and scalable. Your main difficulties typically involve dealing with noisy, </span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="mis mis2 show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> incomplete or biased data, and finding the best ways to communicate your findings and recommendations to </span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="mis mis2 show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> other teams. You are also responsible for making sure your data and models are compliant with privacy and </span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="mis mis2 show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> security policies.</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="mis mis2 show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"><span class="str"> """</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
187
+ <p class="mis show_mis"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"behaviors"</span><span class="op">,</span> <span class="op">{</span><span class="str">"routines"</span><span class="op">:</span> <span class="op">[</span><span class="str">"Every morning, you wake up, do some yoga, and check your emails."</span><span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"personality"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="mis mis2 show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="op">{</span><span class="str">"traits"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
191
+ <p class="mis mis2 show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="str">"You are curious and love to learn new things."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="mis mis2 show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="str">"You are analytical and like to solve problems."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis mis2 show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="str">"You are friendly and enjoy working with others."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="mis mis2 show_mis"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="str">"You don't give up easily, and always try to find a solution. However, sometimes you can get frustrated when things don't work as expected."</span>&nbsp;</span><span class="r"></span></p>
195
+ <p class="mis mis2 show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="pln"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
197
+ <p class="mis show_mis"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"preferences"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
198
+ <p class="mis mis2 show_mis"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="op">{</span><span class="str">"interests"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
199
+ <p class="mis mis2 show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="str">"Artificial intelligence and machine learning."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="mis mis2 show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="str">"Natural language processing and conversational agents."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="mis mis2 show_mis"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="str">"Search engine optimization and user experience."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="mis mis2 show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="str">"Cooking and trying new recipes."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
203
+ <p class="mis mis2 show_mis"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"> <span class="str">"Playing the piano."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
204
+ <p class="mis mis2 show_mis"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="str">"Watching movies, especially comedies and thrillers."</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="mis mis2 show_mis"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
206
+ <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
207
+ <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"skills"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="mis mis2 show_mis"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="mis mis2 show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="str">"You are proficient in Python, and use it for most of your work."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="mis mis2 show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="str">"You are able to use various data analysis and machine learning tools, such as pandas, scikit-learn, TensorFlow, and Azure ML."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="mis mis2 show_mis"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"> <span class="str">"You are familiar with SQL and Power BI, but struggle with R."</span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="mis mis2 show_mis"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
214
+ <p class="mis show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="nam">lisa</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"relationships"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="mis mis2 show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="mis mis2 show_mis"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Alex"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
217
+ <p class="mis mis2 show_mis"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your colleague, works on the same team, and helps you with data collection and processing."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="mis mis2 show_mis"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Sara"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your manager, she is supportive and gives you feedback and guidance."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
219
+ <p class="mis mis2 show_mis"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"BizChat"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"an AI chatbot, developed by your team, that helps enterprise customers with their search queries and tasks. You often interact with it to test its performance and functionality."</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="mis mis2 show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
222
+ <p class="mis show_mis"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"> <span class="key">return</span> <span class="nam">lisa</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"><span class="com">####################################</span>&nbsp;</span><span class="r"></span></p>
225
+ <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"><span class="com"># Example 3: Marcos, the physician</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"><span class="com">#################################### </span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"><span class="key">def</span> <span class="nam">create_marcos_the_physician</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="key">return</span> <span class="nam">TinyPerson</span><span class="op">.</span><span class="nam">load_specification</span><span class="op">(</span><span class="nam">load_example_agent_specification</span><span class="op">(</span><span class="str">"Marcos"</span><span class="op">)</span><span class="op">,</span> <span class="nam">new_agent_name</span><span class="op">=</span><span class="str">"Marcos"</span><span class="op">,</span> <span class="nam">auto_rename_agent</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
230
+ <p class="mis show_mis"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"><span class="key">def</span> <span class="nam">create_marcos_the_physician_2</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"><span class="str"> A purely programmatic way to create Marcos, the physician. Has less information than the one loaded from a file, just for demonstration purposes.</span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="pln"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
235
+ <p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="nam">marcos</span> <span class="op">=</span> <span class="nam">TinyPerson</span><span class="op">(</span><span class="str">"Marcos"</span><span class="op">,</span> <span class="nam">enable_browser</span><span class="op">=</span><span class="nam">enable_browser</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
236
+ <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
237
+ <p class="mis show_mis"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"age"</span><span class="op">,</span> <span class="num">35</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="mis show_mis"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"nationality"</span><span class="op">,</span> <span class="str">"Brazilian"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
239
+ <p class="mis show_mis"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"occupation"</span><span class="op">,</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="mis mis2 show_mis"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="str">"title"</span><span class="op">:</span> <span class="str">"Physician"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="mis mis2 show_mis"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="str">"organization"</span><span class="op">:</span> <span class="str">"Two clinics in S&#227;o Paulo"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="mis mis2 show_mis"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
243
+ <p class="mis mis2 show_mis"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
244
+ <p class="mis mis2 show_mis"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"><span class="str"> You are a physician. You specialize in neurology, and work in two clinics in S&#227;o Paulo region. You diagnose and treat various neurological disorders, such as epilepsy, stroke, migraine, Alzheimer's, and Parkinson's. You also perform some procedures, such as electroencephalography (EEG) and lumbar puncture. You enjoy helping people and learning new things about the brain. Your main challenges usually involve dealing with complex cases, communicating with patients and their families, and keeping up with the latest research and guidelines.</span>&nbsp;</span><span class="r"></span></p>
245
+ <p class="mis mis2 show_mis"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t"><span class="str"> """</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
246
+ <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
247
+ <p class="mis show_mis"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"behaviors"</span><span class="op">,</span> <span class="op">{</span><span class="str">"routines"</span><span class="op">:</span> <span class="op">[</span><span class="str">"Every morning, you wake up, have breakfast with your wife, and go to one of the clinics where you work. You alternate between two clinics in different regions of S&#227;o Paulo. You usually see patients from 9 am to 5 pm, with a lunch break in between. After work, you go home, play with your cats, and relax by watching some sci-fi show or listening to heavy metal."</span><span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
249
+ <p class="mis show_mis"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"personality"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="mis mis2 show_mis"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"> <span class="op">{</span><span class="str">"traits"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="mis mis2 show_mis"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"> <span class="str">"You are very nice and friendly. You always try to make others feel comfortable and appreciated."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
252
+ <p class="mis mis2 show_mis"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="str">"You are very curious and eager to learn. You always want to know more about the world and how things work."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="mis mis2 show_mis"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"> <span class="str">"You are very organized and responsible. You always plan ahead and follow through with your tasks."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="mis mis2 show_mis"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"> <span class="str">"You are very creative and imaginative. You like to come up with new ideas and solutions."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
255
+ <p class="mis mis2 show_mis"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="str">"You are very adventurous and open-minded. You like to try new things and explore new places."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
256
+ <p class="mis mis2 show_mis"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="str">"You are very passionate and enthusiastic. You always put your heart and soul into what you do."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="mis mis2 show_mis"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="str">"You are very loyal and trustworthy. You always keep your promises and support your friends."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
258
+ <p class="mis mis2 show_mis"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="str">"You are very optimistic and cheerful. You always see the bright side of things and make the best of any situation."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
259
+ <p class="mis mis2 show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="str">"You are very calm and relaxed. You don't let stress get to you and you always keep your cool."</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="mis mis2 show_mis"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
261
+ <p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
262
+ <p class="mis show_mis"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"preferences"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
263
+ <p class="mis mis2 show_mis"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="op">{</span><span class="str">"interests"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
264
+ <p class="mis mis2 show_mis"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"> <span class="str">"Neuroscience and neurology."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
265
+ <p class="mis mis2 show_mis"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="str">"Neuroimaging and neurotechnology."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="mis mis2 show_mis"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="str">"Neurodegeneration and neuroprotection."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
267
+ <p class="mis mis2 show_mis"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"> <span class="str">"Neuropsychology and cognitive neuroscience."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
268
+ <p class="mis mis2 show_mis"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"> <span class="str">"Neuropharmacology and neurotherapeutics."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
269
+ <p class="mis mis2 show_mis"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="str">"Neuroethics and neuroeducation."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
270
+ <p class="mis mis2 show_mis"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="str">"Neurology education and research."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
271
+ <p class="mis mis2 show_mis"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="str">"Neurology associations and conferences."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="mis mis2 show_mis"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"> <span class="str">"Pets and animals. You have two cats, Luna and Sol, and you love them very much."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
273
+ <p class="mis mis2 show_mis"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"> <span class="str">"Nature and environment. You like to go hiking, camping, and birdwatching."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
274
+ <p class="mis mis2 show_mis"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="str">"Sci-fi and fantasy. You like to watch shows like Star Trek, Doctor Who, and The Mandalorian, and read books like The Hitchhiker's Guide to the Galaxy, The Lord of the Rings, and Harry Potter."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
275
+ <p class="mis mis2 show_mis"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"> <span class="str">"Heavy metal and rock. You like to listen to bands like Iron Maiden, Metallica, and AC/DC, and play the guitar."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
276
+ <p class="mis mis2 show_mis"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"> <span class="str">"History and culture. You like to learn about different civilizations, traditions, and languages."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
277
+ <p class="mis mis2 show_mis"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"> <span class="str">"Sports and fitness. You like to play soccer, tennis, and volleyball, and go to the gym."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
278
+ <p class="mis mis2 show_mis"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"> <span class="str">"Art and photography. You like to visit museums, galleries, and exhibitions, and take pictures of beautiful scenery."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="mis mis2 show_mis"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"> <span class="str">"Food and cooking. You like to try different cuisines, and experiment with new recipes."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
280
+ <p class="mis mis2 show_mis"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"> <span class="str">"Travel and adventure. You like to visit new countries, and experience new things."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="mis mis2 show_mis"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"> <span class="str">"Games and puzzles. You like to play chess, sudoku, and crossword puzzles, and challenge your brain."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
282
+ <p class="mis mis2 show_mis"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"> <span class="str">"Comedy and humor. You like to watch stand-up shows, sitcoms, and cartoons, and laugh a lot."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
283
+ <p class="mis mis2 show_mis"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"> <span class="str">"Music and dance. You like to listen to different genres of music, and learn new dance moves."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
284
+ <p class="mis mis2 show_mis"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t"> <span class="str">"Science and technology. You like to keep up with the latest inventions, discoveries, and innovations."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
285
+ <p class="mis mis2 show_mis"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="str">"Philosophy and psychology. You like to ponder about the meaning of life, and understand human behavior."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
286
+ <p class="mis mis2 show_mis"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"> <span class="str">"Volunteering and charity. You like to help others, and contribute to social causes."</span>&nbsp;</span><span class="r"></span></p>
287
+ <p class="mis mis2 show_mis"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
288
+ <p class="pln"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
289
+ <p class="mis show_mis"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"skills"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="mis mis2 show_mis"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
291
+ <p class="mis mis2 show_mis"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="str">"You are very skilled in diagnosing and treating neurological disorders. You have a lot of experience and knowledge in this field."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
292
+ <p class="mis mis2 show_mis"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="str">"You are very skilled in performing neurological procedures. You are proficient in using EEG, lumbar puncture, and other techniques."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
293
+ <p class="mis mis2 show_mis"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="str">"You are very skilled in communicating with patients and their families. You are empathetic, respectful, and clear in your explanations."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="mis mis2 show_mis"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="str">"You are very skilled in researching and learning new things. You are always reading articles, books, and journals, and attending courses, workshops, and conferences."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
295
+ <p class="mis mis2 show_mis"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="str">"You are very skilled in working in a team. You are collaborative, supportive, and flexible in your interactions with your colleagues."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="mis mis2 show_mis"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"> <span class="str">"You are very skilled in managing your time and resources. You are efficient, organized, and prioritized in your work."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
297
+ <p class="mis mis2 show_mis"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="str">"You are very skilled in solving problems and making decisions. You are analytical, creative, and logical in your thinking."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="mis mis2 show_mis"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="str">"You are very skilled in speaking English and Spanish. You are fluent, confident, and accurate in both languages."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
299
+ <p class="mis mis2 show_mis"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"> <span class="str">"You are very skilled in playing the guitar. You are talented, expressive, and versatile in your music."</span>&nbsp;</span><span class="r"></span></p>
300
+ <p class="mis mis2 show_mis"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
301
+ <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
302
+ <p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"> <span class="nam">marcos</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"relationships"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="mis mis2 show_mis"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
304
+ <p class="mis mis2 show_mis"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Julia"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
305
+ <p class="mis mis2 show_mis"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your wife, she is an educator, and works at a school for children with special needs."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
306
+ <p class="mis mis2 show_mis"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Luna and Sol"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your cats, they are very cute and playful."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
307
+ <p class="mis mis2 show_mis"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Ana"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your colleague, she is a neurologist, and works with you at both clinics."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
308
+ <p class="mis mis2 show_mis"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Pedro"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your friend, he is a physicist, and shares your passion for sci-fi and heavy metal."</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
309
+ <p class="mis mis2 show_mis"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
310
+ <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
311
+ <p class="mis show_mis"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"> <span class="key">return</span> <span class="nam">marcos</span>&nbsp;</span><span class="r"></span></p>
312
+ <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
313
+ <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="com">#################################</span>&nbsp;</span><span class="r"></span></p>
314
+ <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"><span class="com"># Example 4: Lila, the Linguist</span>&nbsp;</span><span class="r"></span></p>
315
+ <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="com">#################################</span>&nbsp;</span><span class="r"></span></p>
316
+ <p class="mis show_mis"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"><span class="key">def</span> <span class="nam">create_lila_the_linguist</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
317
+ <p class="mis show_mis"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"> <span class="key">return</span> <span class="nam">TinyPerson</span><span class="op">.</span><span class="nam">load_specification</span><span class="op">(</span><span class="nam">load_example_agent_specification</span><span class="op">(</span><span class="str">"Lila"</span><span class="op">)</span><span class="op">,</span> <span class="nam">new_agent_name</span><span class="op">=</span><span class="str">"Lila"</span><span class="op">,</span> <span class="nam">auto_rename_agent</span><span class="op">=</span><span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
318
+ <p class="pln"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
319
+ <p class="mis show_mis"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"><span class="key">def</span> <span class="nam">create_lila_the_linguist_2</span><span class="op">(</span><span class="nam">enable_browser</span><span class="op">=</span><span class="key">False</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
320
+ <p class="pln"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
321
+ <p class="pln"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"><span class="str"> A purely programmatic way to create Lila, the linguist. Has less information than the one loaded from a file, just for demonstration purposes.</span>&nbsp;</span><span class="r"></span></p>
322
+ <p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
323
+ <p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
324
+ <p class="mis show_mis"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> <span class="nam">lila</span> <span class="op">=</span> <span class="nam">TinyPerson</span><span class="op">(</span><span class="str">"Lila"</span><span class="op">,</span> <span class="nam">enable_browser</span><span class="op">=</span><span class="nam">enable_browser</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
325
+ <p class="pln"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
326
+ <p class="mis show_mis"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"age"</span><span class="op">,</span> <span class="num">28</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
327
+ <p class="mis show_mis"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"nationality"</span><span class="op">,</span> <span class="str">"French"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
328
+ <p class="mis show_mis"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"behaviors"</span><span class="op">,</span> <span class="op">{</span><span class="str">"routines"</span><span class="op">:</span> <span class="op">[</span><span class="str">"Every morning, you wake up, make yourself a cup of coffee, and check your email."</span><span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
329
+ <p class="mis show_mis"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"occupation"</span><span class="op">,</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
330
+ <p class="mis mis2 show_mis"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="str">"title"</span><span class="op">:</span> <span class="str">"Linguist"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
331
+ <p class="mis mis2 show_mis"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="str">"organization"</span><span class="op">:</span> <span class="str">"Freelancer"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
332
+ <p class="mis mis2 show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
333
+ <p class="mis mis2 show_mis"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
334
+ <p class="mis mis2 show_mis"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"><span class="str"> You are a linguist who specializes in natural language processing. You work as a freelancer for various </span>&nbsp;</span><span class="r"></span></p>
335
+ <p class="mis mis2 show_mis"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"><span class="str"> clients who need your expertise in judging search engine results or chatbot performance, generating as well as </span>&nbsp;</span><span class="r"></span></p>
336
+ <p class="mis mis2 show_mis"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t"><span class="str"> evaluating the quality of synthetic data, and so on. You have a deep understanding of human nature and </span>&nbsp;</span><span class="r"></span></p>
337
+ <p class="mis mis2 show_mis"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"><span class="str"> preferences, and are highly capable of anticipating behavior. You enjoy working on diverse and challenging </span>&nbsp;</span><span class="r"></span></p>
338
+ <p class="mis mis2 show_mis"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"><span class="str"> projects that require you to apply your linguistic knowledge and creativity. Your main difficulties typically </span>&nbsp;</span><span class="r"></span></p>
339
+ <p class="mis mis2 show_mis"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"><span class="str"> involve dealing with ambiguous or incomplete data, or meeting tight deadlines. You are also responsible for </span>&nbsp;</span><span class="r"></span></p>
340
+ <p class="mis mis2 show_mis"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"><span class="str"> keeping up with the latest developments and trends in the field of natural language processing.</span>&nbsp;</span><span class="r"></span></p>
341
+ <p class="mis mis2 show_mis"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"><span class="str"> """</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
342
+ <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
343
+ <p class="mis show_mis"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"personality"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
344
+ <p class="mis mis2 show_mis"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="op">{</span><span class="str">"traits"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
345
+ <p class="mis mis2 show_mis"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"> <span class="str">"You are curious and eager to learn new things."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
346
+ <p class="mis mis2 show_mis"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="str">"You are very organized and like to plan ahead."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
347
+ <p class="mis mis2 show_mis"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t"> <span class="str">"You are friendly and sociable, and enjoy meeting new people."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
348
+ <p class="mis mis2 show_mis"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"> <span class="str">"You are adaptable and flexible, and can adjust to different situations."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
349
+ <p class="mis mis2 show_mis"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"> <span class="str">"You are confident and assertive, and not afraid to express your opinions."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
350
+ <p class="mis mis2 show_mis"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t"> <span class="str">"You are analytical and logical, and like to solve problems."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
351
+ <p class="mis mis2 show_mis"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t"> <span class="str">"You are creative and imaginative, and like to experiment with new ideas."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
352
+ <p class="mis mis2 show_mis"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t"> <span class="str">"You are compassionate and empathetic, and care about others."</span>&nbsp;</span><span class="r"></span></p>
353
+ <p class="mis mis2 show_mis"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
354
+ <p class="pln"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
355
+ <p class="mis show_mis"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"preferences"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
356
+ <p class="mis mis2 show_mis"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t"> <span class="op">{</span><span class="str">"interests"</span><span class="op">:</span> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
357
+ <p class="mis mis2 show_mis"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"> <span class="str">"Computational linguistics and artificial intelligence."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
358
+ <p class="mis mis2 show_mis"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t"> <span class="str">"Multilingualism and language diversity."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
359
+ <p class="mis mis2 show_mis"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"> <span class="str">"Language evolution and change."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
360
+ <p class="mis mis2 show_mis"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t"> <span class="str">"Language and cognition."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
361
+ <p class="mis mis2 show_mis"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"> <span class="str">"Language and culture."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
362
+ <p class="mis mis2 show_mis"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t"> <span class="str">"Language and communication."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
363
+ <p class="mis mis2 show_mis"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"> <span class="str">"Language and education."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
364
+ <p class="mis mis2 show_mis"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"> <span class="str">"Language and society."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
365
+ <p class="mis mis2 show_mis"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"> <span class="str">"Cooking and baking."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
366
+ <p class="mis mis2 show_mis"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"> <span class="str">"Yoga and meditation."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
367
+ <p class="mis mis2 show_mis"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t"> <span class="str">"Watching movies and series, especially comedies and thrillers."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
368
+ <p class="mis mis2 show_mis"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t"> <span class="str">"Listening to music, especially pop and rock."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
369
+ <p class="mis mis2 show_mis"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t"> <span class="str">"Playing video games, especially puzzles and adventure games."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
370
+ <p class="mis mis2 show_mis"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t"> <span class="str">"Writing stories and poems."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
371
+ <p class="mis mis2 show_mis"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t"> <span class="str">"Drawing and painting."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
372
+ <p class="mis mis2 show_mis"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t"> <span class="str">"Volunteering for animal shelters."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
373
+ <p class="mis mis2 show_mis"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t"> <span class="str">"Hiking and camping."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
374
+ <p class="mis mis2 show_mis"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"> <span class="str">"Learning new languages."</span>&nbsp;</span><span class="r"></span></p>
375
+ <p class="mis mis2 show_mis"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t"> <span class="op">]</span><span class="op">}</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
376
+ <p class="pln"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
377
+ <p class="mis show_mis"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"skills"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
378
+ <p class="mis mis2 show_mis"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
379
+ <p class="mis mis2 show_mis"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t"> <span class="str">"You are fluent in French, English, and Spanish, and have a basic knowledge of German and Mandarin."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
380
+ <p class="mis mis2 show_mis"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t"> <span class="str">"You are proficient in Python, and use it for most of your natural language processing tasks."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
381
+ <p class="mis mis2 show_mis"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t"> <span class="str">"You are familiar with various natural language processing tools and frameworks, such as NLTK, spaCy, Gensim, TensorFlow, etc."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
382
+ <p class="mis mis2 show_mis"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t"> <span class="str">"You are able to design and conduct experiments and evaluations for natural language processing systems."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
383
+ <p class="mis mis2 show_mis"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t"> <span class="str">"You are able to write clear and concise reports and documentation for your projects."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
384
+ <p class="mis mis2 show_mis"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t"> <span class="str">"You are able to communicate effectively with clients and stakeholders, and understand their needs and expectations."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
385
+ <p class="mis mis2 show_mis"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t"> <span class="str">"You are able to work independently and manage your own time and resources."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
386
+ <p class="mis mis2 show_mis"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t"> <span class="str">"You are able to work collaboratively and coordinate with other linguists and developers."</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
387
+ <p class="mis mis2 show_mis"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t"> <span class="str">"You are able to learn quickly and adapt to new technologies and domains."</span>&nbsp;</span><span class="r"></span></p>
388
+ <p class="mis mis2 show_mis"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
389
+ <p class="pln"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
390
+ <p class="mis show_mis"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"> <span class="nam">lila</span><span class="op">.</span><span class="nam">define</span><span class="op">(</span><span class="str">"relationships"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
391
+ <p class="mis mis2 show_mis"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"> <span class="op">[</span>&nbsp;</span><span class="r"></span></p>
392
+ <p class="mis mis2 show_mis"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Emma"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
393
+ <p class="mis mis2 show_mis"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t"> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your best friend, also a linguist, but works for a university."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
394
+ <p class="mis mis2 show_mis"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Lucas"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your boyfriend, he is a graphic designer."</span><span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
395
+ <p class="mis mis2 show_mis"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t"> <span class="op">{</span><span class="str">"name"</span><span class="op">:</span> <span class="str">"Mia"</span><span class="op">,</span> <span class="str">"description"</span><span class="op">:</span> <span class="str">"your cat, she is very cuddly and playful."</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
396
+ <p class="mis mis2 show_mis"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t"> <span class="op">]</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
397
+ <p class="pln"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
398
+ <p class="mis show_mis"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t"> <span class="key">return</span> <span class="nam">lila</span>&nbsp;</span><span class="r"></span></p>
399
+ </main>
400
+ <footer>
401
+ <div class="content">
402
+ <p>
403
+ <a class="nav" href="z_6bd7109c20672ac0___init___py.html">&#xab; prev</a> &nbsp; &nbsp;
404
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
405
+ <a class="nav" href="z_6bd7109c20672ac0_loaders_py.html">&#xbb; next</a>
406
+ &nbsp; &nbsp; &nbsp;
407
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
408
+ created at 2026-02-28 17:48 +0000
409
+ </p>
410
+ </div>
411
+ </footer>
412
+ </body>
413
+ </html>
htmlcov/z_6bd7109c20672ac0_loaders_py.html ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/examples/loaders.py: 0%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;examples&#8201;/&#8201;loaders.py</b>:
15
+ <span class="pc_cov">0%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">10 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">10<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="z_6bd7109c20672ac0_agents_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_bc1132832c822a8b___init___py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="mis show_mis"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="mis show_mis"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="pln"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
86
+ <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">def</span> <span class="nam">load_example_agent_specification</span><span class="op">(</span><span class="nam">name</span><span class="op">:</span><span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="pln"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="str"> Load an example agent specification.</span>&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
90
+ <p class="pln"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="pln"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="str"> name (str): The name of the agent.</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="str"> dict: The agent specification.</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"> <span class="key">return</span> <span class="nam">json</span><span class="op">.</span><span class="nam">load</span><span class="op">(</span><span class="nam">open</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">__file__</span><span class="op">)</span><span class="op">,</span> <span class="fst">f'</span><span class="fst">./agents/</span><span class="op">{</span><span class="nam">name</span><span class="op">}</span><span class="fst">.agent.json</span><span class="fst">'</span><span class="op">)</span><span class="op">,</span> <span class="str">'r'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">'utf-8'</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">'replace'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
98
+ <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="key">def</span> <span class="nam">load_example_fragment_specification</span><span class="op">(</span><span class="nam">name</span><span class="op">:</span><span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str"> Load an example fragment specification.</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
102
+ <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="str"> name (str): The name of the fragment.</span>&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="str"> dict: The fragment specification.</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"> <span class="key">return</span> <span class="nam">json</span><span class="op">.</span><span class="nam">load</span><span class="op">(</span><span class="nam">open</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">__file__</span><span class="op">)</span><span class="op">,</span> <span class="fst">f'</span><span class="fst">./fragments/</span><span class="op">{</span><span class="nam">name</span><span class="op">}</span><span class="fst">.fragment.json</span><span class="fst">'</span><span class="op">)</span><span class="op">,</span> <span class="str">'r'</span><span class="op">,</span> <span class="nam">encoding</span><span class="op">=</span><span class="str">'utf-8'</span><span class="op">,</span> <span class="nam">errors</span><span class="op">=</span><span class="str">'replace'</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
110
+ <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="key">def</span> <span class="nam">list_example_agents</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> List the available example agents.</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"><span class="str"> list: A list of the available example agents.</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="mis show_mis"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t"> <span class="key">return</span> <span class="op">[</span><span class="nam">f</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'.agent.json'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">os</span><span class="op">.</span><span class="nam">listdir</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">__file__</span><span class="op">)</span><span class="op">,</span> <span class="str">'./agents'</span><span class="op">)</span><span class="op">)</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
118
+ <p class="pln"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
119
+ <p class="mis show_mis"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"><span class="key">def</span> <span class="nam">list_example_fragments</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="pln"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"><span class="str"> List the available example fragments.</span>&nbsp;</span><span class="r"></span></p>
122
+ <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="pln"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="str"> list: A list of the available example fragments.</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
126
+ <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">return</span> <span class="op">[</span><span class="nam">f</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'.fragment.json'</span><span class="op">,</span> <span class="str">''</span><span class="op">)</span> <span class="key">for</span> <span class="nam">f</span> <span class="key">in</span> <span class="nam">os</span><span class="op">.</span><span class="nam">listdir</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">os</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">dirname</span><span class="op">(</span><span class="nam">__file__</span><span class="op">)</span><span class="op">,</span> <span class="str">'./fragments'</span><span class="op">)</span><span class="op">)</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
127
+ </main>
128
+ <footer>
129
+ <div class="content">
130
+ <p>
131
+ <a class="nav" href="z_6bd7109c20672ac0_agents_py.html">&#xab; prev</a> &nbsp; &nbsp;
132
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
133
+ <a class="nav" href="z_bc1132832c822a8b___init___py.html">&#xbb; next</a>
134
+ &nbsp; &nbsp; &nbsp;
135
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
136
+ created at 2026-02-28 17:48 +0000
137
+ </p>
138
+ </div>
139
+ </footer>
140
+ </body>
141
+ </html>
htmlcov/z_8e144f0c9fd03088___init___py.html ADDED
@@ -0,0 +1,361 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>Coverage for tinytroupe/__init__.py: 75%</title>
6
+ <link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
7
+ <link rel="stylesheet" href="style_cb_9ff733b0.css" type="text/css">
8
+ <script src="coverage_html_cb_dd2e7eb5.js" defer></script>
9
+ </head>
10
+ <body class="pyfile">
11
+ <header>
12
+ <div class="content">
13
+ <h1>
14
+ <span class="text">Coverage for </span><b>tinytroupe&#8201;/&#8201;__init__.py</b>:
15
+ <span class="pc_cov">75%</span>
16
+ </h1>
17
+ <aside id="help_panel_wrapper">
18
+ <input id="help_panel_state" type="checkbox">
19
+ <label for="help_panel_state">
20
+ <img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
21
+ </label>
22
+ <div id="help_panel">
23
+ <p class="legend">Shortcuts on this page</p>
24
+ <div class="keyhelp">
25
+ <p>
26
+ <kbd>r</kbd>
27
+ <kbd>m</kbd>
28
+ <kbd>x</kbd>
29
+ &nbsp; toggle line displays
30
+ </p>
31
+ <p>
32
+ <kbd>j</kbd>
33
+ <kbd>k</kbd>
34
+ &nbsp; next/prev highlighted chunk
35
+ </p>
36
+ <p>
37
+ <kbd>0</kbd> &nbsp; (zero) top of page
38
+ </p>
39
+ <p>
40
+ <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
+ </p>
42
+ <p>
43
+ <kbd>[</kbd>
44
+ <kbd>]</kbd>
45
+ &nbsp; prev/next file
46
+ </p>
47
+ <p>
48
+ <kbd>u</kbd> &nbsp; up to the index
49
+ </p>
50
+ <p>
51
+ <kbd>?</kbd> &nbsp; show/hide this help
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ <h2>
57
+ <span class="text">109 statements &nbsp;</span>
58
+ <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">82<span class="text"> run</span></button>
59
+ <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">27<span class="text"> missing</span></button>
60
+ <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
+ </h2>
62
+ <p class="text">
63
+ <a id="prevFileLink" class="nav" href="index.html">&#xab; prev</a> &nbsp; &nbsp;
64
+ <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
+ <a id="nextFileLink" class="nav" href="z_357ee38f49d3e320___init___py.html">&#xbb; next</a>
66
+ &nbsp; &nbsp; &nbsp;
67
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
68
+ created at 2026-02-28 17:48 +0000
69
+ </p>
70
+ <aside class="hidden">
71
+ <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
+ <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
+ <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
+ <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
+ <button type="button" class="button_prev_file" data-shortcut="["></button>
76
+ <button type="button" class="button_next_file" data-shortcut="]"></button>
77
+ <button type="button" class="button_to_index" data-shortcut="u"></button>
78
+ <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
+ </aside>
80
+ </div>
81
+ </header>
82
+ <main id="source">
83
+ <p class="run"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
84
+ <p class="run"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t"><span class="key">import</span> <span class="nam">logging</span>&nbsp;</span><span class="r"></span></p>
85
+ <p class="run"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">configparser</span>&nbsp;</span><span class="r"></span></p>
86
+ <p class="run"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">rich</span> <span class="com"># for rich console output</span>&nbsp;</span><span class="r"></span></p>
87
+ <p class="run"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">rich</span><span class="op">.</span><span class="nam">jupyter</span>&nbsp;</span><span class="r"></span></p>
88
+ <p class="pln"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
89
+ <p class="pln"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="com"># add current path to sys.path</span>&nbsp;</span><span class="r"></span></p>
90
+ <p class="run"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">import</span> <span class="nam">sys</span>&nbsp;</span><span class="r"></span></p>
91
+ <p class="run"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="nam">sys</span><span class="op">.</span><span class="nam">path</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="str">'.'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
92
+ <p class="run"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t"><span class="key">from</span> <span class="nam">tinytroupe</span> <span class="key">import</span> <span class="nam">utils</span> <span class="com"># now we can import our utils</span>&nbsp;</span><span class="r"></span></p>
93
+ <p class="pln"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
94
+ <p class="pln"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="com"># AI disclaimers</span>&nbsp;</span><span class="r"></span></p>
95
+ <p class="run"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t"><span class="nam">print</span><span class="op">(</span><span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
96
+ <p class="run run2"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
97
+ <p class="run run2"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t"><span class="str">!!!!</span>&nbsp;</span><span class="r"></span></p>
98
+ <p class="run run2"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="str">DISCLAIMER: TinyTroupe relies on Artificial Intelligence (AI) models to generate content. </span>&nbsp;</span><span class="r"></span></p>
99
+ <p class="run run2"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t"><span class="str">The AI models are not perfect and may produce inappropriate or inacurate results. </span>&nbsp;</span><span class="r"></span></p>
100
+ <p class="run run2"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="str">For any serious or consequential use, please review the generated content before using it.</span>&nbsp;</span><span class="r"></span></p>
101
+ <p class="run run2"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="str">!!!!</span>&nbsp;</span><span class="r"></span></p>
102
+ <p class="run run2"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="str">"""</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
103
+ <p class="pln"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
104
+ <p class="pln"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
105
+ <p class="pln"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
106
+ <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t"><span class="com"># Configuration Management System</span>&nbsp;</span><span class="r"></span></p>
107
+ <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
108
+ <p class="run"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="key">class</span> <span class="nam">ConfigManager</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
109
+ <p class="pln"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
110
+ <p class="pln"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="str"> Manages configuration values with the ability to override defaults.</span>&nbsp;</span><span class="r"></span></p>
111
+ <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t"><span class="str"> Provides dynamic access to the latest config values.</span>&nbsp;</span><span class="r"></span></p>
112
+ <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
113
+ <p class="pln"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
114
+ <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="com"># this is used in more than one place below, so we define it here</span>&nbsp;</span><span class="r"></span></p>
115
+ <p class="pln"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="com"># to avoid errors in later changes</span>&nbsp;</span><span class="r"></span></p>
116
+ <p class="run"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t"> <span class="nam">LOGLEVEL_KEY</span> <span class="op">=</span> <span class="str">"loglevel"</span>&nbsp;</span><span class="r"></span></p>
117
+ <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
+ <p class="run"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"> <span class="key">def</span> <span class="nam">__init__</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
119
+ <p class="run"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span> <span class="op">=</span> <span class="op">{</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
120
+ <p class="run"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_initialize_from_config</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
121
+ <p class="pln"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
122
+ <p class="run"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t"> <span class="key">def</span> <span class="nam">_initialize_from_config</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
123
+ <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t"> <span class="str">"""Initialize default values from config file"""</span>&nbsp;</span><span class="r"></span></p>
124
+ <p class="run"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"> <span class="nam">config</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">read_config_file</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
125
+ <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
126
+ <p class="run"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"model"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"MODEL"</span><span class="op">,</span> <span class="str">"gpt-4o"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
127
+ <p class="run"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"embedding_model"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"EMBEDDING_MODEL"</span><span class="op">,</span> <span class="str">"text-embedding-3-small"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
128
+ <p class="run"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t"> <span class="key">if</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"API_TYPE"</span><span class="op">)</span> <span class="op">==</span> <span class="str">"azure"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
129
+ <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"azure_embedding_model_api_version"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"AZURE_EMBEDDING_MODEL_API_VERSION"</span><span class="op">,</span> <span class="str">"2023-05-15"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
130
+ <p class="run"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"reasoning_model"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"REASONING_MODEL"</span><span class="op">,</span> <span class="str">"o3-mini"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
131
+ <p class="pln"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
132
+ <p class="run"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"max_tokens"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">int</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"MAX_TOKENS"</span><span class="op">,</span> <span class="str">"1024"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
133
+ <p class="run"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"temperature"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"TEMPERATURE"</span><span class="op">,</span> <span class="str">"1.0"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
134
+ <p class="run"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"top_p"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"TOP_P"</span><span class="op">,</span> <span class="str">"0.0"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
135
+ <p class="run"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"frequency_penalty"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"FREQ_PENALTY"</span><span class="op">,</span> <span class="str">"0.0"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
136
+ <p class="run"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"presence_penalty"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
137
+ <p class="run run2"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"PRESENCE_PENALTY"</span><span class="op">,</span> <span class="str">"0.0"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
138
+ <p class="run"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"reasoning_effort"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"REASONING_EFFORT"</span><span class="op">,</span> <span class="str">"high"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
139
+ <p class="pln"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
140
+ <p class="run"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"timeout"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"TIMEOUT"</span><span class="op">,</span> <span class="str">"30.0"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
141
+ <p class="run"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"max_attempts"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"MAX_ATTEMPTS"</span><span class="op">,</span> <span class="str">"0.0"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
142
+ <p class="run"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"waiting_time"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"WAITING_TIME"</span><span class="op">,</span> <span class="str">"1"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
143
+ <p class="run"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"exponential_backoff_factor"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">float</span><span class="op">(</span><span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"EXPONENTIAL_BACKOFF_FACTOR"</span><span class="op">,</span> <span class="str">"5"</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
144
+ <p class="pln"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
145
+ <p class="run"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"cache_api_calls"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"CACHE_API_CALLS"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
146
+ <p class="run"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"cache_file_name"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"CACHE_FILE_NAME"</span><span class="op">,</span> <span class="str">"openai_api_cache.pickle"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
147
+ <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
148
+ <p class="run"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"max_content_display_length"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"MAX_CONTENT_DISPLAY_LENGTH"</span><span class="op">,</span> <span class="num">1024</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
149
+ <p class="pln"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
150
+ <p class="run"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"parallel_agent_actions"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Simulation"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"PARALLEL_AGENT_ACTIONS"</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
151
+ <p class="run"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"parallel_agent_generation"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Simulation"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"PARALLEL_AGENT_GENERATION"</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
152
+ <p class="pln"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
153
+ <p class="run"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"enable_memory_consolidation"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Cognition"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"ENABLE_MEMORY_CONSOLIDATION"</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
154
+ <p class="run"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"min_episode_length"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Cognition"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"MIN_EPISODE_LENGTH"</span><span class="op">,</span> <span class="num">30</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
+ <p class="run"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"max_episode_length"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Cognition"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"MAX_EPISODE_LENGTH"</span><span class="op">,</span> <span class="num">100</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
156
+ <p class="run"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"episodic_memory_fixed_prefix_length"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Cognition"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"EPISODIC_MEMORY_FIXED_PREFIX_LENGTH"</span><span class="op">,</span> <span class="num">20</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
157
+ <p class="run"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"episodic_memory_lookback_length"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Cognition"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"EPISODIC_MEMORY_LOOKBACK_LENGTH"</span><span class="op">,</span> <span class="num">20</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
158
+ <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
+ <p class="run"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_max_attempts"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"MAX_ATTEMPTS"</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
160
+ <p class="run"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_quality_checks"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_QUALITY_CHECKS"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
161
+ <p class="run"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_regeneration"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_REGENERATION"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
162
+ <p class="run"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_direct_correction"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_DIRECT_CORRECTION"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
163
+ <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
164
+ <p class="run"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_quality_check_for_persona_adherence"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_QUALITY_CHECK_FOR_PERSONA_ADHERENCE"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
165
+ <p class="run"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_quality_check_for_selfconsistency"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_QUALITY_CHECK_FOR_SELFCONSISTENCY"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
166
+ <p class="run"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_quality_check_for_fluency"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_QUALITY_CHECK_FOR_FLUENCY"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
167
+ <p class="run"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_quality_check_for_suitability"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_QUALITY_CHECK_FOR_SUITABILITY"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
168
+ <p class="run"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_enable_quality_check_for_similarity"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"ENABLE_QUALITY_CHECK_FOR_SIMILARITY"</span><span class="op">,</span> <span class="key">False</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
169
+ <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
170
+ <p class="run"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_continue_on_failure"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getboolean</span><span class="op">(</span><span class="str">"CONTINUE_ON_FAILURE"</span><span class="op">,</span> <span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
171
+ <p class="run"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="str">"action_generator_quality_threshold"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"ActionGenerator"</span><span class="op">]</span><span class="op">.</span><span class="nam">getint</span><span class="op">(</span><span class="str">"QUALITY_THRESHOLD"</span><span class="op">,</span> <span class="num">2</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
172
+ <p class="pln"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
173
+ <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t"> <span class="com"># LOGLEVEL</span>&nbsp;</span><span class="r"></span></p>
174
+ <p class="run"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="nam">ConfigManager</span><span class="op">.</span><span class="nam">LOGLEVEL_KEY</span><span class="op">]</span> <span class="op">=</span> <span class="nam">config</span><span class="op">[</span><span class="str">"Logging"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"LOGLEVEL"</span><span class="op">,</span> <span class="str">"INFO"</span><span class="op">)</span><span class="op">.</span><span class="nam">upper</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
175
+ <p class="pln"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
176
+ <p class="run"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_raw_config</span> <span class="op">=</span> <span class="nam">config</span>&nbsp;</span><span class="r"></span></p>
177
+ <p class="pln"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
178
+ <p class="run"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t"> <span class="key">def</span> <span class="nam">update</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
179
+ <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
180
+ <p class="pln"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"><span class="str"> Update a configuration value.</span>&nbsp;</span><span class="r"></span></p>
181
+ <p class="pln"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
182
+ <p class="pln"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
183
+ <p class="pln"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"><span class="str"> key (str): The configuration key to update</span>&nbsp;</span><span class="r"></span></p>
184
+ <p class="pln"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"><span class="str"> value: The new value to set</span>&nbsp;</span><span class="r"></span></p>
185
+ <p class="pln"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
186
+ <p class="pln"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
187
+ <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t"><span class="str"> None</span>&nbsp;</span><span class="r"></span></p>
188
+ <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
189
+ <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="key">if</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
190
+ <p class="pln"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
191
+ <p class="pln"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="com"># make sure it is always lowercase</span>&nbsp;</span><span class="r"></span></p>
192
+ <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">if</span> <span class="nam">isinstance</span><span class="op">(</span><span class="nam">value</span><span class="op">,</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
193
+ <p class="mis show_mis"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t"> <span class="nam">value</span> <span class="op">=</span> <span class="nam">value</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
194
+ <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
195
+ <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span> <span class="op">=</span> <span class="nam">value</span>&nbsp;</span><span class="r"></span></p>
196
+ <p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="nam">logging</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Updated config: </span><span class="op">{</span><span class="nam">key</span><span class="op">}</span><span class="fst"> = </span><span class="op">{</span><span class="nam">value</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
197
+ <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
198
+ <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t"> <span class="com"># Special handling for loglevel - also update the logger immediately</span>&nbsp;</span><span class="r"></span></p>
199
+ <p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"> <span class="key">if</span> <span class="nam">key</span> <span class="op">==</span> <span class="nam">ConfigManager</span><span class="op">.</span><span class="nam">LOGLEVEL_KEY</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
200
+ <p class="mis show_mis"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="nam">utils</span><span class="op">.</span><span class="nam">set_loglevel</span><span class="op">(</span><span class="nam">value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
201
+ <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t"> <span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
202
+ <p class="mis show_mis"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"> <span class="nam">logging</span><span class="op">.</span><span class="nam">warning</span><span class="op">(</span><span class="fst">f"</span><span class="fst">Attempted to update unknown config key: </span><span class="op">{</span><span class="nam">key</span><span class="op">}</span><span class="fst">"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
203
+ <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
204
+ <p class="run"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"> <span class="key">def</span> <span class="nam">update_multiple</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">config_dict</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
205
+ <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
206
+ <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"><span class="str"> Update multiple configuration values at once.</span>&nbsp;</span><span class="r"></span></p>
207
+ <p class="pln"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
208
+ <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
209
+ <p class="pln"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"><span class="str"> config_dict (dict): Dictionary of key-value pairs to update</span>&nbsp;</span><span class="r"></span></p>
210
+ <p class="pln"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
211
+ <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
212
+ <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t"><span class="str"> None</span>&nbsp;</span><span class="r"></span></p>
213
+ <p class="pln"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
214
+ <p class="mis show_mis"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">config_dict</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
215
+ <p class="mis show_mis"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">update</span><span class="op">(</span><span class="nam">key</span><span class="op">,</span> <span class="nam">value</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
216
+ <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
217
+ <p class="run"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"> <span class="key">def</span> <span class="nam">get</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">default</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
218
+ <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
219
+ <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t"><span class="str"> Get a configuration value.</span>&nbsp;</span><span class="r"></span></p>
220
+ <p class="pln"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
221
+ <p class="pln"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
222
+ <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t"><span class="str"> key (str): The configuration key to retrieve</span>&nbsp;</span><span class="r"></span></p>
223
+ <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"><span class="str"> default: The default value to return if key is not found</span>&nbsp;</span><span class="r"></span></p>
224
+ <p class="pln"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
225
+ <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
226
+ <p class="pln"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"><span class="str"> The configuration value</span>&nbsp;</span><span class="r"></span></p>
227
+ <p class="pln"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
228
+ <p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">_config</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">key</span><span class="op">,</span> <span class="nam">default</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
229
+ <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
230
+ <p class="run"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="key">def</span> <span class="nam">reset</span><span class="op">(</span><span class="nam">self</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
231
+ <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="str">"""Reset all configuration values to their original values from the config file."""</span>&nbsp;</span><span class="r"></span></p>
232
+ <p class="mis show_mis"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_initialize_from_config</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
233
+ <p class="mis show_mis"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="nam">logging</span><span class="op">.</span><span class="nam">info</span><span class="op">(</span><span class="str">"All configuration values have been reset to defaults"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
234
+ <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
235
+ <p class="run"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="key">def</span> <span class="nam">__getitem__</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">key</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
236
+ <p class="pln"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="str">"""Allow dictionary-like access to configuration values."""</span>&nbsp;</span><span class="r"></span></p>
237
+ <p class="mis show_mis"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">key</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
238
+ <p class="pln"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
239
+ <p class="run"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="key">def</span> <span class="nam">config_defaults</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="op">**</span><span class="nam">config_mappings</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
240
+ <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
241
+ <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"><span class="str"> Returns a decorator that replaces None default values with current config values.</span>&nbsp;</span><span class="r"></span></p>
242
+ <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
243
+ <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
244
+ <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"><span class="str"> **config_mappings: Mapping of parameter names to config keys</span>&nbsp;</span><span class="r"></span></p>
245
+ <p class="pln"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
246
+ <p class="pln"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"><span class="str"> Example:</span>&nbsp;</span><span class="r"></span></p>
247
+ <p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t"><span class="str"> @config_manager.config_defaults(model="model", temp="temperature")</span>&nbsp;</span><span class="r"></span></p>
248
+ <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"><span class="str"> def generate(prompt, model=None, temp=None):</span>&nbsp;</span><span class="r"></span></p>
249
+ <p class="pln"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"><span class="str"> # model will be the current config value for "model" if None is passed</span>&nbsp;</span><span class="r"></span></p>
250
+ <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t"><span class="str"> # ...</span>&nbsp;</span><span class="r"></span></p>
251
+ <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
252
+ <p class="run"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="key">import</span> <span class="nam">functools</span>&nbsp;</span><span class="r"></span></p>
253
+ <p class="run"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t"> <span class="key">import</span> <span class="nam">inspect</span>&nbsp;</span><span class="r"></span></p>
254
+ <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
255
+ <p class="run"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="key">def</span> <span class="nam">decorator</span><span class="op">(</span><span class="nam">func</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
256
+ <p class="run"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="op">@</span><span class="nam">functools</span><span class="op">.</span><span class="nam">wraps</span><span class="op">(</span><span class="nam">func</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
257
+ <p class="run"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="key">def</span> <span class="nam">wrapper</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
258
+ <p class="pln"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="com"># Get the function's signature</span>&nbsp;</span><span class="r"></span></p>
259
+ <p class="mis show_mis"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="nam">sig</span> <span class="op">=</span> <span class="nam">inspect</span><span class="op">.</span><span class="nam">signature</span><span class="op">(</span><span class="nam">func</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
260
+ <p class="mis show_mis"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"> <span class="nam">bound_args</span> <span class="op">=</span> <span class="nam">sig</span><span class="op">.</span><span class="nam">bind_partial</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
261
+ <p class="mis show_mis"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t"> <span class="nam">bound_args</span><span class="op">.</span><span class="nam">apply_defaults</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
262
+ <p class="pln"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
263
+ <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t"> <span class="com"># For each parameter that maps to a config key</span>&nbsp;</span><span class="r"></span></p>
264
+ <p class="mis show_mis"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t"> <span class="key">for</span> <span class="nam">param_name</span><span class="op">,</span> <span class="nam">config_key</span> <span class="key">in</span> <span class="nam">config_mappings</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
265
+ <p class="pln"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"> <span class="com"># If the parameter is None, replace with config value</span>&nbsp;</span><span class="r"></span></p>
266
+ <p class="mis show_mis"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="key">if</span> <span class="nam">param_name</span> <span class="key">in</span> <span class="nam">bound_args</span><span class="op">.</span><span class="nam">arguments</span> <span class="key">and</span> <span class="nam">bound_args</span><span class="op">.</span><span class="nam">arguments</span><span class="op">[</span><span class="nam">param_name</span><span class="op">]</span> <span class="key">is</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
267
+ <p class="mis show_mis"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"> <span class="nam">kwargs</span><span class="op">[</span><span class="nam">param_name</span><span class="op">]</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">config_key</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
268
+ <p class="pln"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
269
+ <p class="mis show_mis"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t"> <span class="key">return</span> <span class="nam">func</span><span class="op">(</span><span class="op">*</span><span class="nam">args</span><span class="op">,</span> <span class="op">**</span><span class="nam">kwargs</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
270
+ <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
271
+ <p class="run"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="key">return</span> <span class="nam">wrapper</span>&nbsp;</span><span class="r"></span></p>
272
+ <p class="pln"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
273
+ <p class="run"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t"> <span class="key">return</span> <span class="nam">decorator</span>&nbsp;</span><span class="r"></span></p>
274
+ <p class="pln"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
275
+ <p class="pln"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
276
+ <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t"><span class="com"># Create global instance of the configuration manager</span>&nbsp;</span><span class="r"></span></p>
277
+ <p class="run"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"><span class="nam">config</span> <span class="op">=</span> <span class="nam">utils</span><span class="op">.</span><span class="nam">read_config_file</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
278
+ <p class="run"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"><span class="nam">utils</span><span class="op">.</span><span class="nam">pretty_print_tinytroupe_version</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
279
+ <p class="run"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"><span class="nam">utils</span><span class="op">.</span><span class="nam">pretty_print_datetime</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
280
+ <p class="run"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t"><span class="nam">utils</span><span class="op">.</span><span class="nam">pretty_print_config</span><span class="op">(</span><span class="nam">config</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
281
+ <p class="run"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"><span class="nam">utils</span><span class="op">.</span><span class="nam">start_logger</span><span class="op">(</span><span class="nam">config</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
282
+ <p class="pln"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
283
+ <p class="run"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"><span class="nam">config_manager</span> <span class="op">=</span> <span class="nam">ConfigManager</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
284
+ <p class="pln"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
285
+ <p class="pln"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
286
+ <p class="pln"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
287
+ <p class="pln"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
288
+ <p class="pln"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t"><span class="com"># For backwards compatibility, maintain the default dict</span>&nbsp;</span><span class="r"></span></p>
289
+ <p class="pln"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"><span class="com"># but it's recommended to use config_manager instead</span>&nbsp;</span><span class="r"></span></p>
290
+ <p class="run"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"><span class="nam">default</span> <span class="op">=</span> <span class="nam">config_manager</span><span class="op">.</span><span class="nam">_config</span>&nbsp;</span><span class="r"></span></p>
291
+ <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
292
+ <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"><span class="com"># Helper function for method signatures</span>&nbsp;</span><span class="r"></span></p>
293
+ <p class="run"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"><span class="key">def</span> <span class="nam">get_config</span><span class="op">(</span><span class="nam">key</span><span class="op">,</span> <span class="nam">override_value</span><span class="op">=</span><span class="key">None</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
294
+ <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="str">"""</span>&nbsp;</span><span class="r"></span></p>
295
+ <p class="pln"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"><span class="str"> Get a configuration value, with optional override.</span>&nbsp;</span><span class="r"></span></p>
296
+ <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t"><span class="str"> Used in method signatures to get current config values.</span>&nbsp;</span><span class="r"></span></p>
297
+ <p class="pln"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
298
+ <p class="pln"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
299
+ <p class="pln"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"><span class="str"> key (str): The configuration key</span>&nbsp;</span><span class="r"></span></p>
300
+ <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t"><span class="str"> override_value: If provided, this value is used instead of the config value</span>&nbsp;</span><span class="r"></span></p>
301
+ <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t"><span class="str"> </span>&nbsp;</span><span class="r"></span></p>
302
+ <p class="pln"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="str"> Returns:</span>&nbsp;</span><span class="r"></span></p>
303
+ <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"><span class="str"> The configuration value or the override value</span>&nbsp;</span><span class="r"></span></p>
304
+ <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
305
+ <p class="mis show_mis"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"> <span class="key">if</span> <span class="nam">override_value</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
306
+ <p class="mis show_mis"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"> <span class="key">return</span> <span class="nam">override_value</span>&nbsp;</span><span class="r"></span></p>
307
+ <p class="mis show_mis"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t"> <span class="key">return</span> <span class="nam">config_manager</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="nam">key</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
308
+ <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
309
+ <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
310
+ <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"><span class="com">## LLaMa-Index configs ########################################################</span>&nbsp;</span><span class="r"></span></p>
311
+ <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="com">#from llama_index.embeddings.huggingface import HuggingFaceEmbedding</span>&nbsp;</span><span class="r"></span></p>
312
+ <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
313
+ <p class="run"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t"><span class="key">if</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"API_TYPE"</span><span class="op">)</span> <span class="op">==</span> <span class="str">"azure"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
314
+ <p class="mis show_mis"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"> <span class="key">from</span> <span class="nam">llama_index</span><span class="op">.</span><span class="nam">embeddings</span><span class="op">.</span><span class="nam">azure_openai</span> <span class="key">import</span> <span class="nam">AzureOpenAIEmbedding</span>&nbsp;</span><span class="r"></span></p>
315
+ <p class="pln"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"><span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
316
+ <p class="run"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t"> <span class="key">from</span> <span class="nam">llama_index</span><span class="op">.</span><span class="nam">embeddings</span><span class="op">.</span><span class="nam">openai</span> <span class="key">import</span> <span class="nam">OpenAIEmbedding</span>&nbsp;</span><span class="r"></span></p>
317
+ <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
318
+ <p class="run"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"><span class="key">from</span> <span class="nam">llama_index</span><span class="op">.</span><span class="nam">core</span> <span class="key">import</span> <span class="nam">Settings</span><span class="op">,</span> <span class="nam">Document</span><span class="op">,</span> <span class="nam">VectorStoreIndex</span><span class="op">,</span> <span class="nam">SimpleDirectoryReader</span>&nbsp;</span><span class="r"></span></p>
319
+ <p class="run"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"><span class="key">from</span> <span class="nam">llama_index</span><span class="op">.</span><span class="nam">readers</span><span class="op">.</span><span class="nam">web</span> <span class="key">import</span> <span class="nam">SimpleWebPageReader</span>&nbsp;</span><span class="r"></span></p>
320
+ <p class="pln"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
321
+ <p class="pln"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
322
+ <p class="pln"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"><span class="com"># this will be cached locally by llama-index, in a OS-dependend location</span>&nbsp;</span><span class="r"></span></p>
323
+ <p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
324
+ <p class="pln"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"><span class="com">##Settings.embed_model = HuggingFaceEmbedding(</span>&nbsp;</span><span class="r"></span></p>
325
+ <p class="pln"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"><span class="com">## model_name="BAAI/bge-small-en-v1.5"</span>&nbsp;</span><span class="r"></span></p>
326
+ <p class="pln"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"><span class="com">##)</span>&nbsp;</span><span class="r"></span></p>
327
+ <p class="pln"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
328
+ <p class="run"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"><span class="key">if</span> <span class="nam">config</span><span class="op">[</span><span class="str">"OpenAI"</span><span class="op">]</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"API_TYPE"</span><span class="op">)</span> <span class="op">==</span> <span class="str">"azure"</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
329
+ <p class="mis show_mis"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="nam">llamaindex_openai_embed_model</span> <span class="op">=</span> <span class="nam">AzureOpenAIEmbedding</span><span class="op">(</span><span class="nam">model</span><span class="op">=</span><span class="nam">default</span><span class="op">[</span><span class="str">"embedding_model"</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
330
+ <p class="mis mis2 show_mis"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="nam">deployment_name</span><span class="op">=</span><span class="nam">default</span><span class="op">[</span><span class="str">"embedding_model"</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
331
+ <p class="mis mis2 show_mis"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="nam">api_version</span><span class="op">=</span><span class="nam">default</span><span class="op">[</span><span class="str">"azure_embedding_model_api_version"</span><span class="op">]</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
332
+ <p class="mis mis2 show_mis"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t"> <span class="nam">embed_batch_size</span><span class="op">=</span><span class="num">10</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
333
+ <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"><span class="key">else</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
334
+ <p class="run"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="nam">llamaindex_openai_embed_model</span> <span class="op">=</span> <span class="nam">OpenAIEmbedding</span><span class="op">(</span><span class="nam">model</span><span class="op">=</span><span class="nam">default</span><span class="op">[</span><span class="str">"embedding_model"</span><span class="op">]</span><span class="op">,</span> <span class="nam">embed_batch_size</span><span class="op">=</span><span class="num">10</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
335
+ <p class="run"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t"><span class="nam">Settings</span><span class="op">.</span><span class="nam">embed_model</span> <span class="op">=</span> <span class="nam">llamaindex_openai_embed_model</span>&nbsp;</span><span class="r"></span></p>
336
+ <p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
337
+ <p class="pln"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
338
+ <p class="pln"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
339
+ <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"><span class="com"># Fixes and tweaks</span>&nbsp;</span><span class="r"></span></p>
340
+ <p class="pln"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"><span class="com">###########################################################################</span>&nbsp;</span><span class="r"></span></p>
341
+ <p class="pln"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
342
+ <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"><span class="com"># fix an issue in the rich library: we don't want margins in Jupyter!</span>&nbsp;</span><span class="r"></span></p>
343
+ <p class="run"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"><span class="nam">rich</span><span class="op">.</span><span class="nam">jupyter</span><span class="op">.</span><span class="nam">JUPYTER_HTML_FORMAT</span> <span class="op">=</span> <span class="xx">\</span>&nbsp;</span><span class="r"></span></p>
344
+ <p class="run run2"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="nam">utils</span><span class="op">.</span><span class="nam">inject_html_css_style_prefix</span><span class="op">(</span><span class="nam">rich</span><span class="op">.</span><span class="nam">jupyter</span><span class="op">.</span><span class="nam">JUPYTER_HTML_FORMAT</span><span class="op">,</span> <span class="str">"margin:0px;"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
345
+ <p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
346
+ <p class="pln"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
347
+ </main>
348
+ <footer>
349
+ <div class="content">
350
+ <p>
351
+ <a class="nav" href="index.html">&#xab; prev</a> &nbsp; &nbsp;
352
+ <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
353
+ <a class="nav" href="z_357ee38f49d3e320___init___py.html">&#xbb; next</a>
354
+ &nbsp; &nbsp; &nbsp;
355
+ <a class="nav" href="https://coverage.readthedocs.io/en/7.13.4">coverage.py v7.13.4</a>,
356
+ created at 2026-02-28 17:48 +0000
357
+ </p>
358
+ </div>
359
+ </footer>
360
+ </body>
361
+ </html>