rasa-sdk 3.9.0.dev1__tar.gz → 3.9.0.dev2__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 (30) hide show
  1. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/PKG-INFO +2 -2
  2. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/pyproject.toml +3 -3
  3. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/__main__.py +1 -3
  4. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/endpoint.py +48 -17
  5. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/tracing/utils.py +6 -14
  6. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/version.py +1 -1
  7. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/LICENSE.txt +0 -0
  8. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/README.md +0 -0
  9. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/__init__.py +0 -0
  10. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/cli/__init__.py +0 -0
  11. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/cli/arguments.py +0 -0
  12. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/constants.py +0 -0
  13. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/events.py +0 -0
  14. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/exceptions.py +0 -0
  15. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/executor.py +0 -0
  16. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/forms.py +0 -0
  17. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/interfaces.py +0 -0
  18. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/knowledge_base/__init__.py +0 -0
  19. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/knowledge_base/actions.py +0 -0
  20. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/knowledge_base/storage.py +0 -0
  21. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/knowledge_base/utils.py +0 -0
  22. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/plugin.py +0 -0
  23. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/slots.py +0 -0
  24. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/tracing/config.py +0 -0
  25. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/tracing/endpoints.py +0 -0
  26. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/tracing/instrumentation/attribute_extractors.py +0 -0
  27. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/tracing/instrumentation/instrumentation.py +0 -0
  28. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/tracing/tracer_register.py +0 -0
  29. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/types.py +0 -0
  30. {rasa_sdk-3.9.0.dev1 → rasa_sdk-3.9.0.dev2}/rasa_sdk/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-sdk
3
- Version: 3.9.0.dev1
3
+ Version: 3.9.0.dev2
4
4
  Summary: Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants
5
5
  Home-page: https://rasa.com
6
6
  License: Apache-2.0
@@ -27,7 +27,7 @@ Requires-Dist: opentelemetry-sdk (>=1.15.0,<1.16.0)
27
27
  Requires-Dist: pluggy (>=1.0.0,<2.0.0)
28
28
  Requires-Dist: prompt-toolkit (>=3.0,<3.0.29)
29
29
  Requires-Dist: ruamel.yaml (>=0.16.5,<0.18.0)
30
- Requires-Dist: sanic (>=21.12.0,<22.0.0)
30
+ Requires-Dist: sanic (>=22.12,<23.0)
31
31
  Requires-Dist: typing-extensions (>=4.1.1,<5.0.0)
32
32
  Requires-Dist: websockets (>=10.0,<12.0)
33
33
  Project-URL: Documentation, https://rasa.com/docs
@@ -9,7 +9,7 @@ exclude = "((.eggs | .git | .mypy_cache | .pytest_cache | build | dist))"
9
9
 
10
10
  [tool.poetry]
11
11
  name = "rasa-sdk"
12
- version = "3.9.0.dev1"
12
+ version = "3.9.0.dev2"
13
13
  description = "Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants"
14
14
  authors = [ "Rasa Technologies GmbH <hi@rasa.com>",]
15
15
  maintainers = [ "Tom Bocklisch <tom@rasa.com>",]
@@ -76,7 +76,7 @@ select = [ "D", "E", "F", "W", "RUF",]
76
76
  [tool.poetry.dependencies]
77
77
  python = ">=3.8,<3.11"
78
78
  coloredlogs = ">=10,<16"
79
- sanic = "^21.12.0"
79
+ sanic = "^22.12"
80
80
  typing-extensions = ">=4.1.1,<5.0.0"
81
81
  Sanic-Cors = "^2.0.0"
82
82
  prompt-toolkit = "^3.0,<3.0.29"
@@ -99,7 +99,7 @@ toml = "^0.10.0"
99
99
  pep440-version-utils = "^0.3.0"
100
100
  semantic_version = "^2.8.5"
101
101
  mypy = "^1.5"
102
- sanic-testing = "^22.3.0, <22.9.0"
102
+ sanic-testing = "^22.12"
103
103
 
104
104
  [tool.ruff.pydocstyle]
105
105
  convention = "google"
@@ -3,7 +3,6 @@ import logging
3
3
  from rasa_sdk import utils
4
4
  from rasa_sdk.endpoint import create_argument_parser, run
5
5
  from rasa_sdk.constants import APPLICATION_ROOT_LOGGER_NAME
6
- from rasa_sdk.tracing.utils import get_tracer_provider
7
6
 
8
7
 
9
8
  def main_from_args(args):
@@ -18,7 +17,6 @@ def main_from_args(args):
18
17
  args.logging_config_file,
19
18
  )
20
19
  utils.update_sanic_log_level()
21
- tracer_provider = get_tracer_provider(args)
22
20
 
23
21
  run(
24
22
  args.actions,
@@ -28,7 +26,7 @@ def main_from_args(args):
28
26
  args.ssl_keyfile,
29
27
  args.ssl_password,
30
28
  args.auto_reload,
31
- tracer_provider,
29
+ args.endpoints,
32
30
  )
33
31
 
34
32
 
@@ -5,10 +5,12 @@ import types
5
5
  import warnings
6
6
  import zlib
7
7
  import json
8
+ from functools import partial
8
9
  from typing import List, Text, Union, Optional
9
10
  from ssl import SSLContext
10
11
  from sanic import Sanic, response
11
12
  from sanic.response import HTTPResponse
13
+ from sanic.worker.loader import AppLoader
12
14
 
13
15
  # catching:
14
16
  # - all `pkg_resources` deprecation warning from multiple dependencies
@@ -24,16 +26,23 @@ with warnings.catch_warnings():
24
26
  category=DeprecationWarning,
25
27
  message="distutils Version classes are deprecated",
26
28
  )
27
- from opentelemetry.sdk.trace import TracerProvider
28
29
  from sanic_cors import CORS
29
30
  from sanic.request import Request
30
31
  from rasa_sdk import utils
31
32
  from rasa_sdk.cli.arguments import add_endpoint_arguments
32
- from rasa_sdk.constants import DEFAULT_KEEP_ALIVE_TIMEOUT, DEFAULT_SERVER_PORT
33
+ from rasa_sdk.constants import (
34
+ DEFAULT_ENDPOINTS_PATH,
35
+ DEFAULT_KEEP_ALIVE_TIMEOUT,
36
+ DEFAULT_SERVER_PORT,
37
+ )
33
38
  from rasa_sdk.executor import ActionExecutor
34
39
  from rasa_sdk.interfaces import ActionExecutionRejection, ActionNotFoundException
35
40
  from rasa_sdk.plugin import plugin_manager
36
- from rasa_sdk.tracing.utils import get_tracer_and_context, set_span_attributes
41
+ from rasa_sdk.tracing.utils import (
42
+ get_tracer_and_context,
43
+ get_tracer_provider,
44
+ set_span_attributes,
45
+ )
37
46
 
38
47
  logger = logging.getLogger(__name__)
39
48
 
@@ -42,7 +51,6 @@ def configure_cors(
42
51
  app: Sanic, cors_origins: Union[Text, List[Text], None] = ""
43
52
  ) -> None:
44
53
  """Configure CORS origins for the given app."""
45
-
46
54
  CORS(
47
55
  app, resources={r"/*": {"origins": cors_origins or ""}}, automatic_options=True
48
56
  )
@@ -54,7 +62,6 @@ def create_ssl_context(
54
62
  ssl_password: Optional[Text] = None,
55
63
  ) -> Optional[SSLContext]:
56
64
  """Create a SSL context if a certificate is passed."""
57
-
58
65
  if ssl_certificate:
59
66
  import ssl
60
67
 
@@ -69,7 +76,6 @@ def create_ssl_context(
69
76
 
70
77
  def create_argument_parser():
71
78
  """Parse all the command line arguments for the run script."""
72
-
73
79
  parser = argparse.ArgumentParser(description="starts the action endpoint")
74
80
  add_endpoint_arguments(parser)
75
81
  utils.add_logging_level_option_arguments(parser)
@@ -77,11 +83,16 @@ def create_argument_parser():
77
83
  return parser
78
84
 
79
85
 
86
+ async def load_tracer_provider(endpoints: str, app: Sanic):
87
+ """Load the tracer provider into the Sanic app."""
88
+ tracer_provider = get_tracer_provider(endpoints)
89
+ app.ctx.tracer_provider = tracer_provider
90
+
91
+
80
92
  def create_app(
81
93
  action_package_name: Union[Text, types.ModuleType],
82
94
  cors_origins: Union[Text, List[Text], None] = "*",
83
95
  auto_reload: bool = False,
84
- tracer_provider: Optional[TracerProvider] = None,
85
96
  ) -> Sanic:
86
97
  """Create a Sanic application and return it.
87
98
 
@@ -90,7 +101,6 @@ def create_app(
90
101
  from.
91
102
  cors_origins: CORS origins to allow.
92
103
  auto_reload: When `True`, auto-reloading of actions is enabled.
93
- tracer_provider: Tracer provider to use for tracing.
94
104
 
95
105
  Returns:
96
106
  A new Sanic application ready to be run.
@@ -102,6 +112,8 @@ def create_app(
102
112
  executor = ActionExecutor()
103
113
  executor.register_package(action_package_name)
104
114
 
115
+ app.ctx.tracer_provider = None
116
+
105
117
  @app.get("/health")
106
118
  async def health(_) -> HTTPResponse:
107
119
  """Ping endpoint to check if the server is running and well."""
@@ -111,7 +123,9 @@ def create_app(
111
123
  @app.post("/webhook")
112
124
  async def webhook(request: Request) -> HTTPResponse:
113
125
  """Webhook to retrieve action calls."""
114
- tracer, context, span_name = get_tracer_and_context(tracer_provider, request)
126
+ tracer, context, span_name = get_tracer_and_context(
127
+ request.app.ctx.tracer_provider, request
128
+ )
115
129
 
116
130
  with tracer.start_as_current_span(span_name, context=context) as span:
117
131
  if request.headers.get("Content-Encoding") == "deflate":
@@ -173,27 +187,44 @@ def run(
173
187
  ssl_keyfile: Optional[Text] = None,
174
188
  ssl_password: Optional[Text] = None,
175
189
  auto_reload: bool = False,
176
- tracer_provider: Optional[TracerProvider] = None,
190
+ endpoints: str = DEFAULT_ENDPOINTS_PATH,
177
191
  keep_alive_timeout: int = DEFAULT_KEEP_ALIVE_TIMEOUT,
178
192
  ) -> None:
179
193
  """Starts the action endpoint server with given config values."""
180
194
  logger.info("Starting action endpoint server...")
181
- app = create_app(
182
- action_package_name,
183
- cors_origins=cors_origins,
184
- auto_reload=auto_reload,
185
- tracer_provider=tracer_provider,
195
+ loader = AppLoader(
196
+ factory=partial(
197
+ create_app,
198
+ action_package_name,
199
+ cors_origins=cors_origins,
200
+ auto_reload=auto_reload,
201
+ ),
186
202
  )
203
+ app = loader.load()
204
+
187
205
  app.config.KEEP_ALIVE_TIMEOUT = keep_alive_timeout
188
- ## Attach additional sanic extensions: listeners, middleware and routing
206
+
207
+ app.register_listener(
208
+ partial(load_tracer_provider, endpoints),
209
+ "before_server_start",
210
+ )
211
+
212
+ # Attach additional sanic extensions: listeners, middleware and routing
189
213
  logger.info("Starting plugins...")
190
214
  plugin_manager().hook.attach_sanic_app_extensions(app=app)
215
+
191
216
  ssl_context = create_ssl_context(ssl_certificate, ssl_keyfile, ssl_password)
192
217
  protocol = "https" if ssl_context else "http"
193
218
  host = os.environ.get("SANIC_HOST", "0.0.0.0")
194
219
 
195
220
  logger.info(f"Action endpoint is up and running on {protocol}://{host}:{port}")
196
- app.run(host, port, ssl=ssl_context, workers=utils.number_of_sanic_workers())
221
+ app.run(
222
+ host=host,
223
+ port=port,
224
+ ssl=ssl_context,
225
+ workers=utils.number_of_sanic_workers(),
226
+ legacy=True,
227
+ )
197
228
 
198
229
 
199
230
  if __name__ == "__main__":
@@ -1,4 +1,3 @@
1
- import argparse
2
1
  from rasa_sdk.tracing import config
3
2
  from opentelemetry import trace
4
3
  from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
@@ -9,25 +8,18 @@ from sanic.request import Request
9
8
  from typing import Optional, Tuple, Any, Text
10
9
 
11
10
 
12
- def get_tracer_provider(
13
- cmdline_arguments: argparse.Namespace,
14
- ) -> Optional[TracerProvider]:
11
+ def get_tracer_provider(endpoints_file: str) -> Optional[TracerProvider]:
15
12
  """Gets the tracer provider from the command line arguments."""
16
- tracer_provider = None
17
- endpoints_file = ""
18
- if "endpoints" in cmdline_arguments:
19
- endpoints_file = cmdline_arguments.endpoints
20
-
21
- if endpoints_file is not None:
22
- tracer_provider = config.get_tracer_provider(endpoints_file)
23
- config.configure_tracing(tracer_provider)
13
+ tracer_provider = config.get_tracer_provider(endpoints_file)
14
+ config.configure_tracing(tracer_provider)
15
+
24
16
  return tracer_provider
25
17
 
26
18
 
27
19
  def get_tracer_and_context(
28
20
  tracer_provider: Optional[TracerProvider], request: Request
29
21
  ) -> Tuple[Any, Any, Text]:
30
- """Gets tracer and context"""
22
+ """Gets tracer and context."""
31
23
  span_name = "create_app.webhook"
32
24
  if tracer_provider is None:
33
25
  tracer = trace.get_tracer(span_name)
@@ -39,7 +31,7 @@ def get_tracer_and_context(
39
31
 
40
32
 
41
33
  def set_span_attributes(span: Any, action_call: dict) -> None:
42
- """Sets span attributes"""
34
+ """Sets span attributes."""
43
35
  tracker = action_call.get("tracker", {})
44
36
  set_span_attributes = {
45
37
  "http.method": "POST",
@@ -1,3 +1,3 @@
1
1
  # this file will automatically be changed,
2
2
  # do not add anything but the version number here!
3
- __version__ = "3.9.0.dev1"
3
+ __version__ = "3.9.0.dev2"
File without changes
File without changes