desireeia-server 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. desireeia_server-0.0.1/PKG-INFO +119 -0
  2. desireeia_server-0.0.1/README.md +100 -0
  3. desireeia_server-0.0.1/desireeia_server.egg-info/PKG-INFO +119 -0
  4. desireeia_server-0.0.1/desireeia_server.egg-info/SOURCES.txt +62 -0
  5. desireeia_server-0.0.1/desireeia_server.egg-info/dependency_links.txt +1 -0
  6. desireeia_server-0.0.1/desireeia_server.egg-info/entry_points.txt +2 -0
  7. desireeia_server-0.0.1/desireeia_server.egg-info/requires.txt +10 -0
  8. desireeia_server-0.0.1/desireeia_server.egg-info/top_level.txt +1 -0
  9. desireeia_server-0.0.1/desireeiaserver/__init__.py +1 -0
  10. desireeia_server-0.0.1/desireeiaserver/__main__.py +4 -0
  11. desireeia_server-0.0.1/desireeiaserver/api/__init__.py +21 -0
  12. desireeia_server-0.0.1/desireeiaserver/api/chat.py +359 -0
  13. desireeia_server-0.0.1/desireeiaserver/api/embeddings.py +70 -0
  14. desireeia_server-0.0.1/desireeiaserver/api/errors.py +79 -0
  15. desireeia_server-0.0.1/desireeiaserver/api/health.py +61 -0
  16. desireeia_server-0.0.1/desireeiaserver/api/metrics_api.py +27 -0
  17. desireeia_server-0.0.1/desireeiaserver/api/models_files.py +132 -0
  18. desireeia_server-0.0.1/desireeiaserver/api/props.py +32 -0
  19. desireeia_server-0.0.1/desireeiaserver/api/settings_api.py +48 -0
  20. desireeia_server-0.0.1/desireeiaserver/api/tokenize.py +80 -0
  21. desireeia_server-0.0.1/desireeiaserver/api/tools_api.py +186 -0
  22. desireeia_server-0.0.1/desireeiaserver/api/transcribe_api.py +65 -0
  23. desireeia_server-0.0.1/desireeiaserver/api/v1.py +86 -0
  24. desireeia_server-0.0.1/desireeiaserver/app.py +131 -0
  25. desireeia_server-0.0.1/desireeiaserver/cli.py +26 -0
  26. desireeia_server-0.0.1/desireeiaserver/config.py +275 -0
  27. desireeia_server-0.0.1/desireeiaserver/engine.py +163 -0
  28. desireeia_server-0.0.1/desireeiaserver/generation.py +132 -0
  29. desireeia_server-0.0.1/desireeiaserver/logging_setup.py +26 -0
  30. desireeia_server-0.0.1/desireeiaserver/metrics.py +116 -0
  31. desireeia_server-0.0.1/desireeiaserver/middleware.py +154 -0
  32. desireeia_server-0.0.1/desireeiaserver/models_events.py +52 -0
  33. desireeia_server-0.0.1/desireeiaserver/models_store.py +237 -0
  34. desireeia_server-0.0.1/desireeiaserver/sampling.py +144 -0
  35. desireeia_server-0.0.1/desireeiaserver/sandbox.py +244 -0
  36. desireeia_server-0.0.1/desireeiaserver/slots.py +487 -0
  37. desireeia_server-0.0.1/desireeiaserver/static/OnlyLogoWhite.svg +259 -0
  38. desireeia_server-0.0.1/desireeiaserver/static/apple-touch-icon.png +0 -0
  39. desireeia_server-0.0.1/desireeiaserver/static/favicon-96x96.png +0 -0
  40. desireeia_server-0.0.1/desireeiaserver/static/favicon.ico +0 -0
  41. desireeia_server-0.0.1/desireeiaserver/static/favicon.svg +1 -0
  42. desireeia_server-0.0.1/desireeiaserver/static/index.html +2397 -0
  43. desireeia_server-0.0.1/desireeiaserver/static/site.webmanifest +21 -0
  44. desireeia_server-0.0.1/desireeiaserver/static/web-app-manifest-192x192.png +0 -0
  45. desireeia_server-0.0.1/desireeiaserver/static/web-app-manifest-512x512.png +0 -0
  46. desireeia_server-0.0.1/desireeiaserver/token_stats.py +40 -0
  47. desireeia_server-0.0.1/desireeiaserver/toolcalling.py +185 -0
  48. desireeia_server-0.0.1/desireeiaserver/transcription.py +106 -0
  49. desireeia_server-0.0.1/pyproject.toml +51 -0
  50. desireeia_server-0.0.1/setup.cfg +4 -0
  51. desireeia_server-0.0.1/tests/test_chat.py +152 -0
  52. desireeia_server-0.0.1/tests/test_config.py +81 -0
  53. desireeia_server-0.0.1/tests/test_config_file.py +66 -0
  54. desireeia_server-0.0.1/tests/test_engine.py +65 -0
  55. desireeia_server-0.0.1/tests/test_hardening.py +337 -0
  56. desireeia_server-0.0.1/tests/test_health.py +108 -0
  57. desireeia_server-0.0.1/tests/test_model_lifecycle.py +79 -0
  58. desireeia_server-0.0.1/tests/test_models_api.py +133 -0
  59. desireeia_server-0.0.1/tests/test_models_store.py +131 -0
  60. desireeia_server-0.0.1/tests/test_sampling.py +77 -0
  61. desireeia_server-0.0.1/tests/test_slots.py +261 -0
  62. desireeia_server-0.0.1/tests/test_token_stats.py +31 -0
  63. desireeia_server-0.0.1/tests/test_tool_calling.py +321 -0
  64. desireeia_server-0.0.1/tests/test_transcribe.py +179 -0
@@ -0,0 +1,119 @@
1
+ Metadata-Version: 2.4
2
+ Name: desireeia-server
3
+ Version: 0.0.1
4
+ Summary: OpenAI-compatible API server and web UI for the DesireeIA local LLM engine
5
+ Author: Passaro Francesco Paolo
6
+ License: Proprietary
7
+ Keywords: llm,inference,local,desireeia,openai,server
8
+ Requires-Python: >=3.10
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: desireeia>=0.0.1
11
+ Requires-Dist: fastapi>=0.110
12
+ Requires-Dist: uvicorn>=0.29
13
+ Requires-Dist: pydantic>=2.6
14
+ Requires-Dist: python-multipart>=0.0.9
15
+ Requires-Dist: faster-whisper>=1.0
16
+ Provides-Extra: dev
17
+ Requires-Dist: pytest>=8.0; extra == "dev"
18
+ Requires-Dist: httpx>=0.27; extra == "dev"
19
+
20
+ # desireeia-server
21
+
22
+ OpenAI-compatible API server and self-hosted chat web UI for the
23
+ [DesireeIA](../README.md) local LLM inference engine. The inference motor is
24
+ **always DesireeIA** — this package is a thin HTTP layer over the existing
25
+ [`desireeia`](../python/desireeia) Python wrapper and ships everything it needs.
26
+
27
+ The external project this surface mirrors (and generalizes past) is referred
28
+ to here only as **desireeialmn**; no code or documentation text is copied from
29
+ it. Convention of this repository: the words "llama" and "colibri" are not
30
+ used anywhere in code, docs or identifiers.
31
+
32
+ ## Quick start
33
+
34
+ ### Install from PyPI
35
+
36
+ ```bash
37
+ pip install desireeia-server
38
+ ```
39
+
40
+ This also installs its `desireeia` dependency (the inference engine
41
+ wrapper, with prebuilt native binaries bundled — see
42
+ [desireeia's README](../Build/Python/README.md#bundled-platforms) for the
43
+ per-OS prerequisites, e.g. the VC++ Redistributable on Windows).
44
+
45
+ ### Run
46
+
47
+ Identical on Windows, Linux and macOS — `desireeia-server` is a normal
48
+ console command once installed:
49
+
50
+ ```bash
51
+ desireeia-server --model path/to/model.gguf --port 8080
52
+ # open http://127.0.0.1:8080
53
+ ```
54
+
55
+ Without `--model`, the server runs in router mode: it manages whatever
56
+ checkpoints it finds in the models folder (default `<data-dir>/models`,
57
+ created automatically). Drop a GGUF in there, or upload it from the UI, and
58
+ it becomes selectable without a restart.
59
+
60
+ ```bash
61
+ desireeia-server --models-dir ./models
62
+ ```
63
+
64
+ By default the server runs in the foreground (logs print to the terminal).
65
+ To stop it: **Ctrl+C** in that terminal, on any OS.
66
+
67
+ To run it in the background instead:
68
+
69
+ ```bash
70
+ # Windows (PowerShell) - start detached, keep the PID to stop it later
71
+ Start-Process desireeia-server -ArgumentList "--model path\to\model.gguf --port 8080" -PassThru | Select-Object -ExpandProperty Id
72
+ # stop it:
73
+ Stop-Process -Id <pid>
74
+
75
+ # Linux / macOS - start detached, keep the PID to stop it later
76
+ desireeia-server --model path/to/model.gguf --port 8080 & echo $!
77
+ # stop it:
78
+ kill <pid>
79
+ ```
80
+
81
+ ### Dev install from the repo (instead of PyPI)
82
+
83
+ ```bash
84
+ pip install <desireeia_source>/python <desireeia_source>/DesireeIAServer # Windows: use \ instead of /
85
+ ```
86
+
87
+ The engine, backend and sampling surface you can steer:
88
+
89
+ ```bash
90
+ desireeia-server --model model.gguf --backend auto --threads 8 \
91
+ --n-gpu-layers 0 --temperature 0.7 --top-k 40 --top-p 0.95 \
92
+ --repeat-penalty 1.1 --n-predict 512
93
+ ```
94
+
95
+ Run `desireeia-server --help` for the full surface.
96
+
97
+ ## Layout
98
+
99
+ - `desireeiaserver/` — the package: `config.py` (CLI/env), `engine.py` (the
100
+ DesireeIA adapter), `app.py` (FastAPI factory), `api/` (routes), `static/`
101
+ (generated UI bundle, copied from `../ui` via `sync_static.py`).
102
+ - `../ui/` — the web UI source (single-page chat app).
103
+ - `../python/` — the `desireeia` engine wrapper this package depends on.
104
+
105
+ ## Development
106
+
107
+ ```bash
108
+ python -m venv .venv # repo root, gitignored
109
+ .venv/Scripts/pip install -e ./python
110
+ .venv/Scripts/pip install -e ./DesireeIAServer[dev]
111
+ .venv/Scripts/python -m pytest DesireeIAServer/tests
112
+ ```
113
+
114
+ ## Roadmap
115
+
116
+ See `../ProjectsRequirements.md` §10. Bootstrap status: HTTP scaffold,
117
+ `/health`, `/props`, `/v1/models` shape, UI placeholder, tests with an
118
+ in-memory mock engine. Streaming, router/slots, tools and the full UI land in
119
+ the next iterations.
@@ -0,0 +1,100 @@
1
+ # desireeia-server
2
+
3
+ OpenAI-compatible API server and self-hosted chat web UI for the
4
+ [DesireeIA](../README.md) local LLM inference engine. The inference motor is
5
+ **always DesireeIA** — this package is a thin HTTP layer over the existing
6
+ [`desireeia`](../python/desireeia) Python wrapper and ships everything it needs.
7
+
8
+ The external project this surface mirrors (and generalizes past) is referred
9
+ to here only as **desireeialmn**; no code or documentation text is copied from
10
+ it. Convention of this repository: the words "llama" and "colibri" are not
11
+ used anywhere in code, docs or identifiers.
12
+
13
+ ## Quick start
14
+
15
+ ### Install from PyPI
16
+
17
+ ```bash
18
+ pip install desireeia-server
19
+ ```
20
+
21
+ This also installs its `desireeia` dependency (the inference engine
22
+ wrapper, with prebuilt native binaries bundled — see
23
+ [desireeia's README](../Build/Python/README.md#bundled-platforms) for the
24
+ per-OS prerequisites, e.g. the VC++ Redistributable on Windows).
25
+
26
+ ### Run
27
+
28
+ Identical on Windows, Linux and macOS — `desireeia-server` is a normal
29
+ console command once installed:
30
+
31
+ ```bash
32
+ desireeia-server --model path/to/model.gguf --port 8080
33
+ # open http://127.0.0.1:8080
34
+ ```
35
+
36
+ Without `--model`, the server runs in router mode: it manages whatever
37
+ checkpoints it finds in the models folder (default `<data-dir>/models`,
38
+ created automatically). Drop a GGUF in there, or upload it from the UI, and
39
+ it becomes selectable without a restart.
40
+
41
+ ```bash
42
+ desireeia-server --models-dir ./models
43
+ ```
44
+
45
+ By default the server runs in the foreground (logs print to the terminal).
46
+ To stop it: **Ctrl+C** in that terminal, on any OS.
47
+
48
+ To run it in the background instead:
49
+
50
+ ```bash
51
+ # Windows (PowerShell) - start detached, keep the PID to stop it later
52
+ Start-Process desireeia-server -ArgumentList "--model path\to\model.gguf --port 8080" -PassThru | Select-Object -ExpandProperty Id
53
+ # stop it:
54
+ Stop-Process -Id <pid>
55
+
56
+ # Linux / macOS - start detached, keep the PID to stop it later
57
+ desireeia-server --model path/to/model.gguf --port 8080 & echo $!
58
+ # stop it:
59
+ kill <pid>
60
+ ```
61
+
62
+ ### Dev install from the repo (instead of PyPI)
63
+
64
+ ```bash
65
+ pip install <desireeia_source>/python <desireeia_source>/DesireeIAServer # Windows: use \ instead of /
66
+ ```
67
+
68
+ The engine, backend and sampling surface you can steer:
69
+
70
+ ```bash
71
+ desireeia-server --model model.gguf --backend auto --threads 8 \
72
+ --n-gpu-layers 0 --temperature 0.7 --top-k 40 --top-p 0.95 \
73
+ --repeat-penalty 1.1 --n-predict 512
74
+ ```
75
+
76
+ Run `desireeia-server --help` for the full surface.
77
+
78
+ ## Layout
79
+
80
+ - `desireeiaserver/` — the package: `config.py` (CLI/env), `engine.py` (the
81
+ DesireeIA adapter), `app.py` (FastAPI factory), `api/` (routes), `static/`
82
+ (generated UI bundle, copied from `../ui` via `sync_static.py`).
83
+ - `../ui/` — the web UI source (single-page chat app).
84
+ - `../python/` — the `desireeia` engine wrapper this package depends on.
85
+
86
+ ## Development
87
+
88
+ ```bash
89
+ python -m venv .venv # repo root, gitignored
90
+ .venv/Scripts/pip install -e ./python
91
+ .venv/Scripts/pip install -e ./DesireeIAServer[dev]
92
+ .venv/Scripts/python -m pytest DesireeIAServer/tests
93
+ ```
94
+
95
+ ## Roadmap
96
+
97
+ See `../ProjectsRequirements.md` §10. Bootstrap status: HTTP scaffold,
98
+ `/health`, `/props`, `/v1/models` shape, UI placeholder, tests with an
99
+ in-memory mock engine. Streaming, router/slots, tools and the full UI land in
100
+ the next iterations.
@@ -0,0 +1,119 @@
1
+ Metadata-Version: 2.4
2
+ Name: desireeia-server
3
+ Version: 0.0.1
4
+ Summary: OpenAI-compatible API server and web UI for the DesireeIA local LLM engine
5
+ Author: Passaro Francesco Paolo
6
+ License: Proprietary
7
+ Keywords: llm,inference,local,desireeia,openai,server
8
+ Requires-Python: >=3.10
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: desireeia>=0.0.1
11
+ Requires-Dist: fastapi>=0.110
12
+ Requires-Dist: uvicorn>=0.29
13
+ Requires-Dist: pydantic>=2.6
14
+ Requires-Dist: python-multipart>=0.0.9
15
+ Requires-Dist: faster-whisper>=1.0
16
+ Provides-Extra: dev
17
+ Requires-Dist: pytest>=8.0; extra == "dev"
18
+ Requires-Dist: httpx>=0.27; extra == "dev"
19
+
20
+ # desireeia-server
21
+
22
+ OpenAI-compatible API server and self-hosted chat web UI for the
23
+ [DesireeIA](../README.md) local LLM inference engine. The inference motor is
24
+ **always DesireeIA** — this package is a thin HTTP layer over the existing
25
+ [`desireeia`](../python/desireeia) Python wrapper and ships everything it needs.
26
+
27
+ The external project this surface mirrors (and generalizes past) is referred
28
+ to here only as **desireeialmn**; no code or documentation text is copied from
29
+ it. Convention of this repository: the words "llama" and "colibri" are not
30
+ used anywhere in code, docs or identifiers.
31
+
32
+ ## Quick start
33
+
34
+ ### Install from PyPI
35
+
36
+ ```bash
37
+ pip install desireeia-server
38
+ ```
39
+
40
+ This also installs its `desireeia` dependency (the inference engine
41
+ wrapper, with prebuilt native binaries bundled — see
42
+ [desireeia's README](../Build/Python/README.md#bundled-platforms) for the
43
+ per-OS prerequisites, e.g. the VC++ Redistributable on Windows).
44
+
45
+ ### Run
46
+
47
+ Identical on Windows, Linux and macOS — `desireeia-server` is a normal
48
+ console command once installed:
49
+
50
+ ```bash
51
+ desireeia-server --model path/to/model.gguf --port 8080
52
+ # open http://127.0.0.1:8080
53
+ ```
54
+
55
+ Without `--model`, the server runs in router mode: it manages whatever
56
+ checkpoints it finds in the models folder (default `<data-dir>/models`,
57
+ created automatically). Drop a GGUF in there, or upload it from the UI, and
58
+ it becomes selectable without a restart.
59
+
60
+ ```bash
61
+ desireeia-server --models-dir ./models
62
+ ```
63
+
64
+ By default the server runs in the foreground (logs print to the terminal).
65
+ To stop it: **Ctrl+C** in that terminal, on any OS.
66
+
67
+ To run it in the background instead:
68
+
69
+ ```bash
70
+ # Windows (PowerShell) - start detached, keep the PID to stop it later
71
+ Start-Process desireeia-server -ArgumentList "--model path\to\model.gguf --port 8080" -PassThru | Select-Object -ExpandProperty Id
72
+ # stop it:
73
+ Stop-Process -Id <pid>
74
+
75
+ # Linux / macOS - start detached, keep the PID to stop it later
76
+ desireeia-server --model path/to/model.gguf --port 8080 & echo $!
77
+ # stop it:
78
+ kill <pid>
79
+ ```
80
+
81
+ ### Dev install from the repo (instead of PyPI)
82
+
83
+ ```bash
84
+ pip install <desireeia_source>/python <desireeia_source>/DesireeIAServer # Windows: use \ instead of /
85
+ ```
86
+
87
+ The engine, backend and sampling surface you can steer:
88
+
89
+ ```bash
90
+ desireeia-server --model model.gguf --backend auto --threads 8 \
91
+ --n-gpu-layers 0 --temperature 0.7 --top-k 40 --top-p 0.95 \
92
+ --repeat-penalty 1.1 --n-predict 512
93
+ ```
94
+
95
+ Run `desireeia-server --help` for the full surface.
96
+
97
+ ## Layout
98
+
99
+ - `desireeiaserver/` — the package: `config.py` (CLI/env), `engine.py` (the
100
+ DesireeIA adapter), `app.py` (FastAPI factory), `api/` (routes), `static/`
101
+ (generated UI bundle, copied from `../ui` via `sync_static.py`).
102
+ - `../ui/` — the web UI source (single-page chat app).
103
+ - `../python/` — the `desireeia` engine wrapper this package depends on.
104
+
105
+ ## Development
106
+
107
+ ```bash
108
+ python -m venv .venv # repo root, gitignored
109
+ .venv/Scripts/pip install -e ./python
110
+ .venv/Scripts/pip install -e ./DesireeIAServer[dev]
111
+ .venv/Scripts/python -m pytest DesireeIAServer/tests
112
+ ```
113
+
114
+ ## Roadmap
115
+
116
+ See `../ProjectsRequirements.md` §10. Bootstrap status: HTTP scaffold,
117
+ `/health`, `/props`, `/v1/models` shape, UI placeholder, tests with an
118
+ in-memory mock engine. Streaming, router/slots, tools and the full UI land in
119
+ the next iterations.
@@ -0,0 +1,62 @@
1
+ README.md
2
+ pyproject.toml
3
+ desireeia_server.egg-info/PKG-INFO
4
+ desireeia_server.egg-info/SOURCES.txt
5
+ desireeia_server.egg-info/dependency_links.txt
6
+ desireeia_server.egg-info/entry_points.txt
7
+ desireeia_server.egg-info/requires.txt
8
+ desireeia_server.egg-info/top_level.txt
9
+ desireeiaserver/__init__.py
10
+ desireeiaserver/__main__.py
11
+ desireeiaserver/app.py
12
+ desireeiaserver/cli.py
13
+ desireeiaserver/config.py
14
+ desireeiaserver/engine.py
15
+ desireeiaserver/generation.py
16
+ desireeiaserver/logging_setup.py
17
+ desireeiaserver/metrics.py
18
+ desireeiaserver/middleware.py
19
+ desireeiaserver/models_events.py
20
+ desireeiaserver/models_store.py
21
+ desireeiaserver/sampling.py
22
+ desireeiaserver/sandbox.py
23
+ desireeiaserver/slots.py
24
+ desireeiaserver/token_stats.py
25
+ desireeiaserver/toolcalling.py
26
+ desireeiaserver/transcription.py
27
+ desireeiaserver/api/__init__.py
28
+ desireeiaserver/api/chat.py
29
+ desireeiaserver/api/embeddings.py
30
+ desireeiaserver/api/errors.py
31
+ desireeiaserver/api/health.py
32
+ desireeiaserver/api/metrics_api.py
33
+ desireeiaserver/api/models_files.py
34
+ desireeiaserver/api/props.py
35
+ desireeiaserver/api/settings_api.py
36
+ desireeiaserver/api/tokenize.py
37
+ desireeiaserver/api/tools_api.py
38
+ desireeiaserver/api/transcribe_api.py
39
+ desireeiaserver/api/v1.py
40
+ desireeiaserver/static/OnlyLogoWhite.svg
41
+ desireeiaserver/static/apple-touch-icon.png
42
+ desireeiaserver/static/favicon-96x96.png
43
+ desireeiaserver/static/favicon.ico
44
+ desireeiaserver/static/favicon.svg
45
+ desireeiaserver/static/index.html
46
+ desireeiaserver/static/site.webmanifest
47
+ desireeiaserver/static/web-app-manifest-192x192.png
48
+ desireeiaserver/static/web-app-manifest-512x512.png
49
+ tests/test_chat.py
50
+ tests/test_config.py
51
+ tests/test_config_file.py
52
+ tests/test_engine.py
53
+ tests/test_hardening.py
54
+ tests/test_health.py
55
+ tests/test_model_lifecycle.py
56
+ tests/test_models_api.py
57
+ tests/test_models_store.py
58
+ tests/test_sampling.py
59
+ tests/test_slots.py
60
+ tests/test_token_stats.py
61
+ tests/test_tool_calling.py
62
+ tests/test_transcribe.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ desireeia-server = desireeiaserver.cli:main
@@ -0,0 +1,10 @@
1
+ desireeia>=0.0.1
2
+ fastapi>=0.110
3
+ uvicorn>=0.29
4
+ pydantic>=2.6
5
+ python-multipart>=0.0.9
6
+ faster-whisper>=1.0
7
+
8
+ [dev]
9
+ pytest>=8.0
10
+ httpx>=0.27
@@ -0,0 +1 @@
1
+ desireeiaserver
@@ -0,0 +1 @@
1
+ __version__ = "0.0.1"
@@ -0,0 +1,4 @@
1
+ from .cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()
@@ -0,0 +1,21 @@
1
+ from .errors import (
2
+ AuthenticationError,
3
+ InvalidRequestError,
4
+ NotImplementedEndpointError,
5
+ NotSupportedError,
6
+ NotFoundError,
7
+ OpenAIError,
8
+ UnavailableError,
9
+ exception_handler,
10
+ )
11
+
12
+ __all__ = [
13
+ "AuthenticationError",
14
+ "InvalidRequestError",
15
+ "NotImplementedEndpointError",
16
+ "NotSupportedError",
17
+ "NotFoundError",
18
+ "OpenAIError",
19
+ "UnavailableError",
20
+ "exception_handler",
21
+ ]