spot-sdk-python 2.1.0b2__tar.gz → 2.1.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 (43) hide show
  1. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/PKG-INFO +1 -1
  2. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/pyproject.toml +1 -1
  3. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/pyproject.toml.orig +1 -1
  4. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/hosting.py +17 -8
  5. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/container.py +10 -10
  6. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/README.md +0 -0
  7. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/__init__.py +0 -0
  8. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/_json.py +0 -0
  9. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/app.py +0 -0
  10. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/artifacts.py +0 -0
  11. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/clients.py +0 -0
  12. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/config.py +0 -0
  13. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/correlation.py +0 -0
  14. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/email.py +0 -0
  15. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/errors.py +0 -0
  16. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/knowledge.py +0 -0
  17. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/knowledge_tags.py +0 -0
  18. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/llm.py +0 -0
  19. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/logging.py +0 -0
  20. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/manifest.py +0 -0
  21. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/mime.py +0 -0
  22. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/model_input.py +0 -0
  23. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/orchestrator.py +0 -0
  24. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/proxy.py +0 -0
  25. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/py.typed +0 -0
  26. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/retriever.py +0 -0
  27. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/settings.py +0 -0
  28. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/signals.py +0 -0
  29. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/README.md +0 -0
  30. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/__init__.py +0 -0
  31. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/contract.py +0 -0
  32. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/corpus.py +0 -0
  33. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/engine.py +0 -0
  34. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/fake_knowledge_client.py +0 -0
  35. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/fake_llm.py +0 -0
  36. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/fake_spot.py +0 -0
  37. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/metrics.py +0 -0
  38. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/report.py +0 -0
  39. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/settings.py +0 -0
  40. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/testing/views.py +0 -0
  41. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/urls.py +0 -0
  42. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/verdict.py +0 -0
  43. {spot_sdk_python-2.1.0b2 → spot_sdk_python-2.1.1}/spot_sdk/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spot-sdk-python
3
- Version: 2.1.0b2
3
+ Version: 2.1.1
4
4
  Summary: SPOT plugin SDK: the plugin contract, the plugin runtime, its clients and test helpers
5
5
  Author: SPOT Project
6
6
  Author-email: SPOT Project <spot@sonn.lu>
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "spot-sdk-python"
7
- version = "2.1.0b2"
7
+ version = "2.1.1"
8
8
  description = "SPOT plugin SDK: the plugin contract, the plugin runtime, its clients and test helpers"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "spot-sdk-python"
7
- version = "2.1.0b2"
7
+ version = "2.1.1"
8
8
  description = "SPOT plugin SDK: the plugin contract, the plugin runtime, its clients and test helpers"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -44,7 +44,11 @@ could expand past the bound once decoded."""
44
44
 
45
45
 
46
46
  class AnswerRefusedError(Exception):
47
- """A plugin's answer that is not read: encoded, or longer than ``MAX_ANSWER_BYTES``."""
47
+ """A plugin's answer that is not read: encoded, or longer than its bound."""
48
+
49
+
50
+ class AnswerTooLargeError(AnswerRefusedError):
51
+ """An answer longer than its bound, which a caller may treat apart from an encoded one."""
48
52
 
49
53
 
50
54
  class InvalidResponseError(Exception):
@@ -53,8 +57,10 @@ class InvalidResponseError(Exception):
53
57
 
54
58
  def isolated(egress: Egress | None) -> bool:
55
59
  """Whether a plugin of this egress class runs on a network without a route
56
- out: class none. An unrecorded class (None) counts as content."""
57
- return egress == Egress.NONE
60
+ out: every class, from SPOT 2.1 (spot/spot#148). A plugin reaches the
61
+ hosts its settings of type url name, through SPOT's egress gateway, and
62
+ nothing else: its class says what it sends out, not where it runs."""
63
+ return True
58
64
 
59
65
 
60
66
  def limits(resources: Resources) -> dict[str, Any]:
@@ -119,11 +125,14 @@ def secrets_archive(secrets: Mapping[str, str]) -> bytes:
119
125
  return buffer.getvalue()
120
126
 
121
127
 
122
- async def read_answer(response: httpx2.Response) -> bytes:
123
- """A streamed answer's body, as sent, read up to ``MAX_ANSWER_BYTES``.
128
+ async def read_answer(
129
+ response: httpx2.Response, max_bytes: int = MAX_ANSWER_BYTES
130
+ ) -> bytes:
131
+ """A streamed answer's body, as sent, read up to ``max_bytes``.
124
132
 
125
133
  Raises:
126
- AnswerRefusedError: the answer is encoded, or longer than ``MAX_ANSWER_BYTES``
134
+ AnswerRefusedError: the answer is encoded
135
+ AnswerTooLargeError: the answer is longer than ``max_bytes``
127
136
  """
128
137
  if (
129
138
  response.headers.get("content-encoding", "identity").strip().lower()
@@ -133,8 +142,8 @@ async def read_answer(response: httpx2.Response) -> bytes:
133
142
  body = bytearray()
134
143
  async for chunk in response.aiter_raw():
135
144
  body += chunk
136
- if len(body) > MAX_ANSWER_BYTES:
137
- raise AnswerRefusedError("response too large")
145
+ if len(body) > max_bytes:
146
+ raise AnswerTooLargeError(f"response too large: over {max_bytes} bytes")
138
147
  return bytes(body)
139
148
 
140
149
 
@@ -1,14 +1,14 @@
1
1
  """A plugin's image run as SPOT runs it, and checked: ``run_plugin_test``.
2
2
 
3
3
  The engine runs in a container that reaches the Docker daemon: spot-cli's
4
- image, given the socket. For each run it creates a network, without a route
5
- out for a plugin of egress class none as ``spot-plugins-isolated`` is, and
6
- joins it under SPOT's names, so that the plugin reaches the fake SPOT where it
7
- reaches SPOT. The plugin's container gets the plugin-manager's options and
8
- limits, a new token and its secret settings as files (``spot_sdk.hosting``).
9
- The network and the container carry the label ``spot.test.run=<run>``, by
10
- which the run removes them when it ends, however it ends: even one the daemon
11
- made while the call that asked for it failed. The image is never pulled.
4
+ image, given the socket. For each run it creates a network without a route
5
+ out, as SPOT runs every plugin (``isolated``), and joins it under SPOT's
6
+ names, so that the plugin reaches the fake SPOT where it reaches SPOT. The
7
+ plugin's container gets the plugin-manager's options and limits, a new token
8
+ and its secret settings as files (``spot_sdk.hosting``). The network and the
9
+ container carry the label ``spot.test.run=<run>``, by which the run removes
10
+ them when it ends, however it ends: even one the daemon made while the call
11
+ that asked for it failed. The image is never pulled.
12
12
  Needs the ``testing`` extra: ``pip install "spot-sdk-python[testing]"``.
13
13
  """
14
14
 
@@ -93,8 +93,8 @@ def run_plugin_test(
93
93
  """Run the plugin's image as SPOT runs it, against ``corpus``, and report.
94
94
 
95
95
  It runs in a container that reaches the Docker daemon: spot-cli's image,
96
- given the socket. It creates the plugin's network (internal for egress
97
- class none), joins it as SPOT's services, starts the plugin with the
96
+ given the socket. It creates the plugin's network (internal, as for every
97
+ plugin), joins it as SPOT's services, starts the plugin with the
98
98
  plugin-manager's options, its limits, a new token and its secrets as
99
99
  files, serves the fake SPOT, runs the checks and removes what it
100
100
  created, whatever happens.