latitude-sdk 0.1.0b5__tar.gz → 0.1.0b6__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 (42) hide show
  1. latitude_sdk-0.1.0b6/.python-version +1 -0
  2. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/PKG-INFO +4 -3
  3. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/README.md +1 -1
  4. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/pyproject.toml +10 -5
  5. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/latitude.py +29 -16
  6. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/util/utils.py +10 -2
  7. latitude_sdk-0.1.0b6/uv.lock +1339 -0
  8. latitude_sdk-0.1.0b5/.python-version +0 -1
  9. latitude_sdk-0.1.0b5/uv.lock +0 -541
  10. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/.gitignore +0 -0
  11. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/scripts/format.py +0 -0
  12. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/scripts/lint.py +0 -0
  13. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/scripts/test.py +0 -0
  14. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/__init__.py +0 -0
  15. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/client/__init__.py +0 -0
  16. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/client/client.py +0 -0
  17. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/client/payloads.py +0 -0
  18. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/client/router.py +0 -0
  19. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/env/__init__.py +0 -0
  20. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/env/env.py +0 -0
  21. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/py.typed +0 -0
  22. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/__init__.py +0 -0
  23. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/errors.py +0 -0
  24. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/evaluations.py +0 -0
  25. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/logs.py +0 -0
  26. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/prompts.py +0 -0
  27. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/sdk/types.py +0 -0
  28. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/src/latitude_sdk/util/__init__.py +0 -0
  29. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/__init__.py +0 -0
  30. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/evaluations/__init__.py +0 -0
  31. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/evaluations/create_result_test.py +0 -0
  32. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/evaluations/trigger_test.py +0 -0
  33. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/logs/__init__.py +0 -0
  34. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/logs/create_test.py +0 -0
  35. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/prompts/__init__.py +0 -0
  36. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/prompts/chat_test.py +0 -0
  37. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/prompts/get_or_create_test.py +0 -0
  38. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/prompts/get_test.py +0 -0
  39. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/prompts/run_test.py +0 -0
  40. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/utils/__init__.py +0 -0
  41. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/utils/fixtures.py +0 -0
  42. {latitude_sdk-0.1.0b5 → latitude_sdk-0.1.0b6}/tests/utils/utils.py +0 -0
@@ -0,0 +1 @@
1
+ 3.9.21
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: latitude-sdk
3
- Version: 0.1.0b5
3
+ Version: 0.1.0b6
4
4
  Summary: Latitude SDK for Python
5
5
  Project-URL: repository, https://github.com/latitude-dev/latitude-llm/tree/main/packages/sdks/python
6
6
  Project-URL: homepage, https://github.com/latitude-dev/latitude-llm/tree/main/packages/sdks/python#readme
@@ -8,9 +8,10 @@ Project-URL: documentation, https://github.com/latitude-dev/latitude-llm/tree/ma
8
8
  Author-email: Latitude Data SL <hello@latitude.so>
9
9
  Maintainer-email: Latitude Data SL <hello@latitude.so>
10
10
  License-Expression: LGPL-3.0
11
- Requires-Python: >=3.8
11
+ Requires-Python: >=3.9
12
12
  Requires-Dist: httpx-sse>=0.4.0
13
13
  Requires-Dist: httpx>=0.28.1
14
+ Requires-Dist: latitude-telemetry>=0.1.0b4
14
15
  Requires-Dist: pydantic>=2.10.3
15
16
  Requires-Dist: typing-extensions>=4.12.2
16
17
  Description-Content-Type: text/markdown
@@ -21,7 +22,7 @@ Description-Content-Type: text/markdown
21
22
  pip install latitude-sdk
22
23
  ```
23
24
 
24
- Requires Python `3.8` or higher.
25
+ Requires Python `3.9` or higher.
25
26
 
26
27
  Go to the [documentation](https://docs.latitude.so/guides/sdk/python) to learn more.
27
28
 
@@ -4,7 +4,7 @@
4
4
  pip install latitude-sdk
5
5
  ```
6
6
 
7
- Requires Python `3.8` or higher.
7
+ Requires Python `3.9` or higher.
8
8
 
9
9
  Go to the [documentation](https://docs.latitude.so/guides/sdk/python) to learn more.
10
10
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "latitude-sdk"
3
- version = "0.1.0-beta.5"
3
+ version = "0.1.0-beta.6"
4
4
  description = "Latitude SDK for Python"
5
5
  authors = [{ name = "Latitude Data SL", email = "hello@latitude.so" }]
6
6
  maintainers = [{ name = "Latitude Data SL", email = "hello@latitude.so" }]
@@ -9,12 +9,13 @@ license = "LGPL-3.0"
9
9
  urls.repository = "https://github.com/latitude-dev/latitude-llm/tree/main/packages/sdks/python"
10
10
  urls.homepage = "https://github.com/latitude-dev/latitude-llm/tree/main/packages/sdks/python#readme"
11
11
  urls.documentation = "https://github.com/latitude-dev/latitude-llm/tree/main/packages/sdks/python#readme"
12
- requires-python = ">=3.8"
12
+ requires-python = ">=3.9"
13
13
  dependencies = [
14
14
  "httpx>=0.28.1",
15
15
  "httpx-sse>=0.4.0",
16
16
  "pydantic>=2.10.3",
17
17
  "typing-extensions>=4.12.2",
18
+ "latitude-telemetry>=0.1.0b4",
18
19
  ]
19
20
 
20
21
  [dependency-groups]
@@ -23,20 +24,20 @@ dev = [
23
24
  "pytest-xdist>=3.6.1",
24
25
  "pytest>=8.3.4",
25
26
  "respx>=0.22.0",
26
- "pyright>=1.1.391",
27
+ "pyright>=1.1.392",
27
28
  "ruff>=0.8.3",
28
29
  "sh>=1.14.3",
29
30
  ]
30
31
 
31
32
  [tool.pyright]
32
- pythonVersion = "3.8"
33
+ pythonVersion = "3.9"
33
34
  typeCheckingMode = "strict"
34
35
  reportMissingTypeStubs = false
35
36
  reportUnnecessaryIsInstance = false
36
37
  reportPrivateUsage = false
37
38
 
38
39
  [tool.ruff]
39
- target-version = "py38"
40
+ target-version = "py39"
40
41
  line-length = 120
41
42
  indent-width = 4
42
43
 
@@ -48,6 +49,10 @@ ignore = [
48
49
  # Needed because unnecessary str() on field aliases are needed
49
50
  # https://docs.pydantic.dev/2.8/concepts/fields/#field-aliases
50
51
  "UP018",
52
+ # Needed because typing.List and typing.Dict are semi-deprecated
53
+ # in new Python versions but we want to maintain compatibility
54
+ "UP006",
55
+ "UP035",
51
56
  ]
52
57
 
53
58
  [tool.ruff.format]
@@ -1,5 +1,8 @@
1
1
  from typing import Optional
2
2
 
3
+ from latitude_telemetry import InternalOptions as TelemetryInternalOptions
4
+ from latitude_telemetry import Telemetry, TelemetryOptions
5
+
3
6
  from latitude_sdk.client import Client, ClientOptions, RouterOptions
4
7
  from latitude_sdk.env import env
5
8
  from latitude_sdk.sdk.evaluations import Evaluations
@@ -18,6 +21,7 @@ class InternalOptions(Model):
18
21
 
19
22
 
20
23
  class LatitudeOptions(SdkOptions, Model):
24
+ telemetry: Optional[TelemetryOptions] = None
21
25
  internal: Optional[InternalOptions] = None
22
26
 
23
27
 
@@ -35,42 +39,51 @@ DEFAULT_INTERNAL_OPTIONS = InternalOptions(
35
39
  )
36
40
 
37
41
 
38
- DEFAULT_LATITUDE_OPTIONS = LatitudeOptions(internal=DEFAULT_INTERNAL_OPTIONS)
42
+ DEFAULT_LATITUDE_OPTIONS = LatitudeOptions(
43
+ telemetry=None, # Note: Telemetry is opt-in
44
+ internal=DEFAULT_INTERNAL_OPTIONS,
45
+ )
39
46
 
40
47
 
41
48
  class Latitude:
42
49
  _options: LatitudeOptions
43
50
  _client: Client
44
51
 
52
+ telemetry: Optional[Telemetry]
53
+
45
54
  prompts: Prompts
46
55
  logs: Logs
47
56
  evaluations: Evaluations
48
57
 
49
58
  def __init__(self, api_key: str, options: LatitudeOptions):
50
- options.internal = options.internal or DEFAULT_INTERNAL_OPTIONS
51
- options.internal = InternalOptions(**{**dict(DEFAULT_INTERNAL_OPTIONS), **dict(options.internal)})
59
+ options.internal = InternalOptions(**{**dict(DEFAULT_INTERNAL_OPTIONS), **dict(options.internal or {})})
52
60
  options = LatitudeOptions(**{**dict(DEFAULT_LATITUDE_OPTIONS), **dict(options)})
61
+ self._options = options
53
62
 
54
- assert options.internal is not None
55
- assert options.internal.gateway is not None
56
- assert options.internal.source is not None
57
- assert options.internal.retries is not None
58
- assert options.internal.delay is not None
59
- assert options.internal.timeout is not None
63
+ assert self._options.internal is not None
64
+ assert self._options.internal.gateway is not None
65
+ assert self._options.internal.source is not None
66
+ assert self._options.internal.retries is not None
67
+ assert self._options.internal.delay is not None
68
+ assert self._options.internal.timeout is not None
60
69
 
61
- self._options = options
62
70
  self._client = Client(
63
71
  ClientOptions(
64
72
  api_key=api_key,
65
- retries=options.internal.retries,
66
- delay=options.internal.delay,
67
- timeout=options.internal.timeout,
68
- source=options.internal.source,
69
- router=RouterOptions(gateway=options.internal.gateway),
73
+ retries=self._options.internal.retries,
74
+ delay=self._options.internal.delay,
75
+ timeout=self._options.internal.timeout,
76
+ source=self._options.internal.source,
77
+ router=RouterOptions(gateway=self._options.internal.gateway),
70
78
  )
71
79
  )
72
80
 
81
+ if self._options.telemetry:
82
+ self._options.telemetry.internal = TelemetryInternalOptions(
83
+ **{**dict(self._options.internal), **dict(self._options.telemetry.internal or {})}
84
+ )
85
+ self.telemetry = Telemetry(api_key, self._options.telemetry)
86
+
73
87
  self.prompts = Prompts(self._client, self._options)
74
88
  self.logs = Logs(self._client, self._options)
75
89
  self.evaluations = Evaluations(self._client, self._options)
76
- # TODO: Telemetry - needs Telemetry SDK in Python
@@ -3,7 +3,7 @@ from enum import Enum
3
3
  from typing import Any, Callable, List, TypeVar
4
4
 
5
5
  import pydantic
6
- from typing_extensions import ParamSpec
6
+ from typing_extensions import ParamSpec, Self
7
7
 
8
8
  T = TypeVar("T", str, bool, int, List[str])
9
9
 
@@ -49,7 +49,15 @@ class StrEnum(str, Enum):
49
49
  return str(self.value)
50
50
 
51
51
  @classmethod
52
- def list(cls) -> List[str]:
52
+ def entries(cls) -> List[Self]:
53
+ return list(cls)
54
+
55
+ @classmethod
56
+ def names(cls) -> List[str]:
57
+ return [v.name for v in cls]
58
+
59
+ @classmethod
60
+ def values(cls) -> List[str]:
53
61
  return [v.value for v in cls]
54
62
 
55
63