latitude-sdk 1.1.0__tar.gz → 2.0.0__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 (44) hide show
  1. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/PKG-INFO +2 -3
  2. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/pyproject.toml +2 -3
  3. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/latitude.py +0 -7
  4. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/render_test.py +66 -2
  5. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/utils/utils.py +0 -8
  6. latitude_sdk-2.0.0/uv.lock +493 -0
  7. latitude_sdk-1.1.0/uv.lock +0 -1313
  8. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/.gitignore +0 -0
  9. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/.python-version +0 -0
  10. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/README.md +0 -0
  11. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/scripts/format.py +0 -0
  12. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/scripts/lint.py +0 -0
  13. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/scripts/test.py +0 -0
  14. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/__init__.py +0 -0
  15. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/client/__init__.py +0 -0
  16. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/client/client.py +0 -0
  17. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/client/payloads.py +0 -0
  18. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/client/router.py +0 -0
  19. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/env/__init__.py +0 -0
  20. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/env/env.py +0 -0
  21. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/py.typed +0 -0
  22. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/__init__.py +0 -0
  23. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/errors.py +0 -0
  24. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/evaluations.py +0 -0
  25. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/logs.py +0 -0
  26. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/prompts.py +0 -0
  27. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/sdk/types.py +0 -0
  28. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/util/__init__.py +0 -0
  29. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/src/latitude_sdk/util/utils.py +0 -0
  30. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/__init__.py +0 -0
  31. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/evaluations/__init__.py +0 -0
  32. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/evaluations/create_result_test.py +0 -0
  33. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/evaluations/trigger_test.py +0 -0
  34. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/logs/__init__.py +0 -0
  35. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/logs/create_test.py +0 -0
  36. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/__init__.py +0 -0
  37. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/chat_test.py +0 -0
  38. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/get_all_test.py +0 -0
  39. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/get_or_create_test.py +0 -0
  40. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/get_test.py +0 -0
  41. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/render_chain_test.py +0 -0
  42. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/prompts/run_test.py +0 -0
  43. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/utils/__init__.py +0 -0
  44. {latitude_sdk-1.1.0 → latitude_sdk-2.0.0}/tests/utils/fixtures.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: latitude-sdk
3
- Version: 1.1.0
3
+ Version: 2.0.0
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
@@ -11,8 +11,7 @@ License-Expression: LGPL-3.0
11
11
  Requires-Python: <3.13,>=3.9
12
12
  Requires-Dist: httpx-sse>=0.4.0
13
13
  Requires-Dist: httpx>=0.28.1
14
- Requires-Dist: latitude-telemetry>=1.0.0
15
- Requires-Dist: promptl-ai>=1.0.2
14
+ Requires-Dist: promptl-ai>=1.0.3
16
15
  Requires-Dist: pydantic>=2.10.3
17
16
  Requires-Dist: typing-extensions>=4.12.2
18
17
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "latitude-sdk"
3
- version = "1.1.0"
3
+ version = "2.0.0"
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" }]
@@ -15,8 +15,7 @@ dependencies = [
15
15
  "httpx-sse>=0.4.0",
16
16
  "pydantic>=2.10.3",
17
17
  "typing-extensions>=4.12.2",
18
- "latitude-telemetry>=1.0.0",
19
- "promptl-ai>=1.0.2",
18
+ "promptl-ai>=1.0.3",
20
19
  ]
21
20
 
22
21
  [dependency-groups]
@@ -1,6 +1,5 @@
1
1
  from typing import Optional
2
2
 
3
- from latitude_telemetry import Telemetry, TelemetryOptions
4
3
  from promptl_ai import Promptl, PromptlOptions
5
4
 
6
5
  from latitude_sdk.client import Client, ClientOptions, RouterOptions
@@ -22,7 +21,6 @@ class InternalOptions(Model):
22
21
 
23
22
  class LatitudeOptions(SdkOptions, Model):
24
23
  promptl: Optional[PromptlOptions] = None
25
- telemetry: Optional[TelemetryOptions] = None
26
24
  internal: Optional[InternalOptions] = None
27
25
 
28
26
 
@@ -41,7 +39,6 @@ DEFAULT_INTERNAL_OPTIONS = InternalOptions(
41
39
 
42
40
 
43
41
  DEFAULT_LATITUDE_OPTIONS = LatitudeOptions(
44
- telemetry=None, # NOTE: Telemetry is opt-in
45
42
  internal=DEFAULT_INTERNAL_OPTIONS,
46
43
  )
47
44
 
@@ -51,7 +48,6 @@ class Latitude:
51
48
  _client: Client
52
49
 
53
50
  promptl: Promptl
54
- telemetry: Optional[Telemetry]
55
51
 
56
52
  prompts: Prompts
57
53
  logs: Logs
@@ -81,9 +77,6 @@ class Latitude:
81
77
  )
82
78
 
83
79
  self.promptl = Promptl(self._options.promptl)
84
- if self._options.telemetry:
85
- self.telemetry = Telemetry(api_key, self._options.telemetry)
86
-
87
80
  self.prompts = Prompts(self._client, self.promptl, self._options)
88
81
  self.logs = Logs(self._client, self._options)
89
82
  self.evaluations = Evaluations(self._client, self._options)
@@ -1,6 +1,16 @@
1
1
  from unittest import mock
2
2
 
3
- from promptl_ai import Adapter, Error, ErrorPosition, PromptlError, SystemMessage, TextContent, UserMessage, openai
3
+ from promptl_ai import (
4
+ Adapter,
5
+ Error,
6
+ ErrorPosition,
7
+ PromptlError,
8
+ SystemMessage,
9
+ TextContent,
10
+ UserMessage,
11
+ anthropic,
12
+ openai,
13
+ )
4
14
 
5
15
  from latitude_sdk import RenderPromptOptions, RenderPromptResult
6
16
  from tests.utils import TestCase, fixtures
@@ -33,7 +43,7 @@ class TestRenderPrompt(TestCase):
33
43
  ),
34
44
  )
35
45
 
36
- async def test_success_with_adapter(self):
46
+ async def test_success_with_adapter_singlepart(self):
37
47
  prompt = fixtures.PROMPT.content
38
48
  options = RenderPromptOptions(
39
49
  parameters={"question": "What is PromptL"},
@@ -59,6 +69,60 @@ class TestRenderPrompt(TestCase):
59
69
  ),
60
70
  )
61
71
 
72
+ async def test_success_with_adapter_multipart(self):
73
+ parts = fixtures.PROMPT.content.split("</step>")
74
+ prompt = "</step>".join(
75
+ [
76
+ parts[0]
77
+ + """
78
+ <user>
79
+ This is text.
80
+ <content-image>This is an image.</content-image>
81
+ <content-file mime="application/pdf">This is a PDF.</content-file>
82
+ </user>
83
+ """,
84
+ *parts[1:],
85
+ ]
86
+ )
87
+ options = RenderPromptOptions(
88
+ parameters={"question": "What is PromptL"},
89
+ adapter=Adapter.Anthropic,
90
+ )
91
+
92
+ result = await self.sdk.prompts.render(prompt, options)
93
+
94
+ self.assertEqual(
95
+ result,
96
+ RenderPromptResult(
97
+ messages=[
98
+ anthropic.UserMessage(content=[anthropic.TextContent(text="What is PromptL")]),
99
+ anthropic.UserMessage(
100
+ content=[
101
+ anthropic.TextContent(text="This is text."),
102
+ anthropic.ImageContent(
103
+ source=anthropic.ContentSource(
104
+ type="base64", media_type="image/png", data="This is an image."
105
+ )
106
+ ),
107
+ anthropic.DocumentContent(
108
+ source=anthropic.ContentSource(
109
+ type="base64", media_type="application/pdf", data="This is a PDF."
110
+ )
111
+ ),
112
+ ]
113
+ ),
114
+ ],
115
+ config={
116
+ "provider": "OpenAI",
117
+ "model": "gpt-4o-mini",
118
+ "temperature": 0.5,
119
+ "max_tokens": 1024,
120
+ "top_p": 0.9,
121
+ "system": [{"type": "text", "text": "You are a helpful assistant."}],
122
+ },
123
+ ),
124
+ )
125
+
62
126
  async def test_fails(self):
63
127
  prompt = fixtures.PROMPT.content
64
128
  options = RenderPromptOptions(
@@ -4,8 +4,6 @@ from unittest import IsolatedAsyncioTestCase
4
4
 
5
5
  import httpx
6
6
  import respx
7
- from latitude_telemetry import InternalOptions as TelemetryInternalOptions
8
- from latitude_telemetry import TelemetryOptions
9
7
  from promptl_ai import (
10
8
  Adapter,
11
9
  AssistantMessage,
@@ -43,11 +41,6 @@ class TestCase(IsolatedAsyncioTestCase):
43
41
  }
44
42
 
45
43
  self.internal_options = InternalOptions.model_validate(internal_options)
46
- self.telemetry_options = TelemetryOptions(
47
- instrumentors=[],
48
- disable_batch=True,
49
- internal=TelemetryInternalOptions.model_validate(internal_options),
50
- )
51
44
  self.promptl_options = PromptlOptions(
52
45
  adapter=Adapter.Default,
53
46
  )
@@ -71,7 +64,6 @@ class TestCase(IsolatedAsyncioTestCase):
71
64
  project_id=self.project_id,
72
65
  version_uuid=self.version_uuid,
73
66
  promptl=self.promptl_options,
74
- telemetry=self.telemetry_options,
75
67
  internal=self.internal_options,
76
68
  ),
77
69
  )