latitude-sdk 0.1.0b3__py3-none-any.whl → 0.1.0b5__py3-none-any.whl

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.
@@ -16,7 +16,7 @@ from latitude_sdk.sdk.errors import (
16
16
  from latitude_sdk.sdk.types import LogSources
17
17
  from latitude_sdk.util import Model
18
18
 
19
- RETRIABLE_STATUSES = [429, 500, 502, 503, 504]
19
+ RETRIABLE_STATUSES = [408, 409, 429, 500, 502, 503, 504]
20
20
 
21
21
  ClientEvent = httpx_sse.ServerSentEvent
22
22
 
latitude_sdk/env/env.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from latitude_sdk.util import Model, get_env
2
2
 
3
3
  DEFAULT_GATEWAY_HOSTNAME = "gateway.latitude.so"
4
- DEFAULT_GATEWAY_PORT = 8787
4
+ DEFAULT_GATEWAY_PORT = 443
5
5
  DEFAULT_GATEWAY_SSL = True
6
6
 
7
7
 
@@ -57,3 +57,13 @@ class ApiError(Exception):
57
57
  return f"Unexpected API Error: {status} {message}"
58
58
 
59
59
  return message
60
+
61
+ def __eq__(self, other: object) -> bool:
62
+ return (
63
+ isinstance(other, ApiError)
64
+ and self.status == other.status
65
+ and self.code == other.code
66
+ and self.message == other.message
67
+ and self.response == other.response
68
+ and self.db_ref == other.db_ref
69
+ )
latitude_sdk/sdk/logs.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import List, Optional
1
+ from typing import Iterable, Optional
2
2
 
3
3
  from latitude_sdk.client import Client, CreateLogRequestBody, CreateLogRequestParams, RequestHandler
4
4
  from latitude_sdk.sdk.errors import ApiError, ApiErrorCodes
@@ -45,7 +45,7 @@ class Logs:
45
45
 
46
46
  return LogOptions(project_id=project_id, version_uuid=version_uuid)
47
47
 
48
- async def create(self, path: str, messages: List[Message], options: CreateLogOptions) -> CreateLogResult:
48
+ async def create(self, path: str, messages: Iterable[Message], options: CreateLogOptions) -> CreateLogResult:
49
49
  log_options = self._ensure_options(options)
50
50
  options = CreateLogOptions(**{**dict(options), **dict(log_options)})
51
51
 
@@ -59,7 +59,7 @@ class Logs:
59
59
  ),
60
60
  body=CreateLogRequestBody(
61
61
  path=path,
62
- messages=messages,
62
+ messages=list(messages),
63
63
  response=options.response,
64
64
  ),
65
65
  ) as response:
@@ -1,4 +1,4 @@
1
- from typing import Any, AsyncGenerator, Dict, List, Optional
1
+ from typing import Any, AsyncGenerator, Dict, Iterable, List, Optional
2
2
 
3
3
  from latitude_sdk.client import (
4
4
  ChatPromptRequestBody,
@@ -119,7 +119,7 @@ class Prompts:
119
119
  elif type == str(ChainEvents.Error):
120
120
  event = ChainEventError.model_validate_json(stream_event.data)
121
121
  raise ApiError(
122
- status=500,
122
+ status=400,
123
123
  code=ApiErrorCodes.AIRunError,
124
124
  message=event.error.message,
125
125
  response=stream_event.data,
@@ -130,7 +130,7 @@ class Prompts:
130
130
  status=500,
131
131
  code=ApiErrorCodes.InternalServerError,
132
132
  message=f"Unknown latitude event: {type}",
133
- response=f"Unknown latitude event: {type}",
133
+ response=stream_event.data,
134
134
  )
135
135
 
136
136
  elif stream_event.event == str(StreamEvents.Provider):
@@ -142,7 +142,7 @@ class Prompts:
142
142
  status=500,
143
143
  code=ApiErrorCodes.InternalServerError,
144
144
  message=f"Unknown stream event: {stream_event.event}",
145
- response=f"Unknown stream event: {stream_event.event}",
145
+ response=stream_event.data,
146
146
  )
147
147
 
148
148
  if callbacks.on_event:
@@ -247,7 +247,9 @@ class Prompts:
247
247
 
248
248
  return None
249
249
 
250
- async def chat(self, uuid: str, messages: List[Message], options: ChatPromptOptions) -> Optional[ChatPromptResult]:
250
+ async def chat(
251
+ self, uuid: str, messages: Iterable[Message], options: ChatPromptOptions
252
+ ) -> Optional[ChatPromptResult]:
251
253
  try:
252
254
  async with self._client.request(
253
255
  handler=RequestHandler.ChatPrompt,
@@ -255,7 +257,7 @@ class Prompts:
255
257
  conversation_uuid=uuid,
256
258
  ),
257
259
  body=ChatPromptRequestBody(
258
- messages=messages,
260
+ messages=list(messages),
259
261
  stream=options.stream,
260
262
  ),
261
263
  ) as response:
latitude_sdk/sdk/types.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime
2
- from typing import Any, Dict, List, Optional, Protocol, Union, runtime_checkable
2
+ from typing import Any, Dict, List, Literal, Optional, Protocol, Union, runtime_checkable
3
3
 
4
4
  from latitude_sdk.sdk.errors import ApiError
5
5
  from latitude_sdk.util import Field, Model, StrEnum
@@ -37,32 +37,32 @@ class ContentType(StrEnum):
37
37
 
38
38
 
39
39
  class TextContent(Model):
40
- type: ContentType = ContentType.Text
40
+ type: Literal[ContentType.Text] = ContentType.Text
41
41
  text: str
42
42
 
43
43
 
44
44
  class ImageContent(Model):
45
- type: ContentType = ContentType.Image
45
+ type: Literal[ContentType.Image] = ContentType.Image
46
46
  image: str
47
47
 
48
48
 
49
49
  class FileContent(Model):
50
- type: ContentType = ContentType.File
50
+ type: Literal[ContentType.File] = ContentType.File
51
51
  file: str
52
52
  mime_type: str = Field(alias=str("mimeType"))
53
53
 
54
54
 
55
55
  class ToolCallContent(Model):
56
- type: ContentType = ContentType.ToolCall
57
- tool_call_id: str = Field(alias=str("toolCallId"))
58
- tool_name: str = Field(alias=str("toolName"))
59
- args: Dict[str, Any]
56
+ type: Literal[ContentType.ToolCall] = ContentType.ToolCall
57
+ id: str = Field(alias=str("toolCallId"))
58
+ name: str = Field(alias=str("toolName"))
59
+ arguments: Dict[str, Any] = Field(alias=str("args"))
60
60
 
61
61
 
62
62
  class ToolResultContent(Model):
63
- type: ContentType = ContentType.ToolResult
64
- tool_call_id: str = Field(alias=str("toolCallId"))
65
- tool_name: str = Field(alias=str("toolName"))
63
+ type: Literal[ContentType.ToolResult] = ContentType.ToolResult
64
+ id: str = Field(alias=str("toolCallId"))
65
+ name: str = Field(alias=str("toolName"))
66
66
  result: str
67
67
  is_error: Optional[bool] = Field(default=None, alias=str("isError"))
68
68
 
@@ -85,30 +85,23 @@ class MessageRole(StrEnum):
85
85
 
86
86
 
87
87
  class SystemMessage(Model):
88
- role: MessageRole = MessageRole.System
88
+ role: Literal[MessageRole.System] = MessageRole.System
89
89
  content: Union[str, List[TextContent]]
90
90
 
91
91
 
92
92
  class UserMessage(Model):
93
- role: MessageRole = MessageRole.User
93
+ role: Literal[MessageRole.User] = MessageRole.User
94
94
  content: Union[str, List[Union[TextContent, ImageContent, FileContent]]]
95
95
  name: Optional[str] = None
96
96
 
97
97
 
98
- class ToolCall(Model):
99
- id: str
100
- name: str
101
- arguments: Dict[str, Any]
102
-
103
-
104
98
  class AssistantMessage(Model):
105
- role: MessageRole = MessageRole.Assistant
99
+ role: Literal[MessageRole.Assistant] = MessageRole.Assistant
106
100
  content: Union[str, List[Union[TextContent, ToolCallContent]]]
107
- tool_calls: Optional[List[ToolCall]] = Field(default=None, alias=str("toolCalls"))
108
101
 
109
102
 
110
103
  class ToolMessage(Model):
111
- role: MessageRole = MessageRole.Tool
104
+ role: Literal[MessageRole.Tool] = MessageRole.Tool
112
105
  content: List[ToolResultContent]
113
106
 
114
107
 
@@ -121,20 +114,26 @@ class ModelUsage(Model):
121
114
  total_tokens: int = Field(alias=str("totalTokens"))
122
115
 
123
116
 
117
+ class ToolCall(Model):
118
+ id: str
119
+ name: str
120
+ arguments: Dict[str, Any]
121
+
122
+
124
123
  class StreamTypes(StrEnum):
125
124
  Text = "text"
126
125
  Object = "object"
127
126
 
128
127
 
129
128
  class ChainTextResponse(Model):
130
- type: StreamTypes = StreamTypes.Text
129
+ type: Literal[StreamTypes.Text] = Field(default=StreamTypes.Text, alias=str("streamType"))
131
130
  text: str
132
131
  tool_calls: Optional[List[ToolCall]] = Field(default=None, alias=str("toolCalls"))
133
132
  usage: ModelUsage
134
133
 
135
134
 
136
135
  class ChainObjectResponse(Model):
137
- type: StreamTypes = StreamTypes.Object
136
+ type: Literal[StreamTypes.Object] = Field(default=StreamTypes.Object, alias=str("streamType"))
138
137
  object: Any
139
138
  usage: ModelUsage
140
139
 
@@ -165,34 +164,34 @@ class ChainEvents(StrEnum):
165
164
 
166
165
 
167
166
  class ChainEventStep(Model):
168
- event: StreamEvents = StreamEvents.Latitude
169
- type: ChainEvents = ChainEvents.Step
170
- config: Dict[str, Any]
167
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
168
+ type: Literal[ChainEvents.Step] = ChainEvents.Step
169
+ uuid: Optional[str] = None
171
170
  is_last_step: bool = Field(alias=str("isLastStep"))
171
+ config: Dict[str, Any]
172
172
  messages: List[Message]
173
- uuid: Optional[str] = None
174
173
 
175
174
 
176
175
  class ChainEventStepCompleted(Model):
177
- event: StreamEvents = StreamEvents.Latitude
178
- type: ChainEvents = ChainEvents.StepCompleted
179
- response: ChainResponse
176
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
177
+ type: Literal[ChainEvents.StepCompleted] = ChainEvents.StepCompleted
180
178
  uuid: Optional[str] = None
179
+ response: ChainResponse
181
180
 
182
181
 
183
182
  class ChainEventCompleted(Model):
184
- event: StreamEvents = StreamEvents.Latitude
185
- type: ChainEvents = ChainEvents.Completed
183
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
184
+ type: Literal[ChainEvents.Completed] = ChainEvents.Completed
185
+ uuid: Optional[str] = None
186
186
  config: Dict[str, Any]
187
187
  messages: Optional[List[Message]] = None
188
188
  object: Optional[Any] = None
189
189
  response: ChainResponse
190
- uuid: Optional[str] = None
191
190
 
192
191
 
193
192
  class ChainEventError(Model):
194
- event: StreamEvents = StreamEvents.Latitude
195
- type: ChainEvents = ChainEvents.Error
193
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
194
+ type: Literal[ChainEvents.Error] = ChainEvents.Error
196
195
  error: ChainError
197
196
 
198
197
 
@@ -203,7 +202,7 @@ LatitudeEvent = ChainEvent
203
202
 
204
203
 
205
204
  class FinishedEvent(Model):
206
- event: StreamEvents = StreamEvents.Finished
205
+ event: Literal[StreamEvents.Finished] = StreamEvents.Finished
207
206
  uuid: str
208
207
  conversation: List[Message]
209
208
  response: ChainResponse
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: latitude-sdk
3
- Version: 0.1.0b3
3
+ Version: 0.1.0b5
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
@@ -1,20 +1,20 @@
1
1
  latitude_sdk/__init__.py,sha256=-AbNXLmzDZeGbRdDIOpNjdCbacOvLBflSJwQtLlZfgk,19
2
2
  latitude_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  latitude_sdk/client/__init__.py,sha256=d8CnNB8UoGwcftiIeeC0twdg01qNvfpj-v7O40I7IiE,68
4
- latitude_sdk/client/client.py,sha256=ff49AlX6hxfoAwKA4_c5B6zXuZMQwV588_XaD6A7K4E,4379
4
+ latitude_sdk/client/client.py,sha256=Oc4COkVFR1vFewVKZzUIvztJi_yTxeSMoyeML-ivVsY,4389
5
5
  latitude_sdk/client/payloads.py,sha256=4fZS5jlTRRiA93QiDMUBh1utctI_9Xyh0fQV2bygiRU,2696
6
6
  latitude_sdk/client/router.py,sha256=XYi24oUKL1wHDLvydpwLWCjy9tDGSVPN-zhetuvaj8I,4038
7
7
  latitude_sdk/env/__init__.py,sha256=66of5veJ-u1aNI025L65Rrj321AjrYevMqomTMYIrPQ,19
8
- latitude_sdk/env/env.py,sha256=OSBVGHXJr_48plkVagCANNy5n5F3tb48Dug_r7uo0m4,456
8
+ latitude_sdk/env/env.py,sha256=MnXexPOHE6aXcAszrDCbW7hzACUv4YtU1bfxpYwvHNw,455
9
9
  latitude_sdk/sdk/__init__.py,sha256=C9LlIjfnrS7KOK3-ruXKmbT77nSQMm23nZ6-t8sO8ME,137
10
- latitude_sdk/sdk/errors.py,sha256=cq5swDrRFYAZWtohR1Fz9aq0D17eSb2JUTa-FeTNOC8,1412
10
+ latitude_sdk/sdk/errors.py,sha256=9GlGdDE8LGy3dE2Ry_BipBg-tDbQx7LWXJfSnTJSSBE,1747
11
11
  latitude_sdk/sdk/evaluations.py,sha256=ASWfNfH124qeahzhAn-gb2Ep4QIew5uDveY5NbNsNfk,2086
12
12
  latitude_sdk/sdk/latitude.py,sha256=8OZ_8st4EkaUvyvmzFBYGtnkFQzFtaRE_OyY3iQes_4,2471
13
- latitude_sdk/sdk/logs.py,sha256=BXo-SN-CarRmR_HHk7biutqyegA01UkjkIKN0Huz4Zc,2042
14
- latitude_sdk/sdk/prompts.py,sha256=HiFlOl56YOwR_Kq9ce6o4fNsoQwJucFYY9DrtUqCjMo,10144
15
- latitude_sdk/sdk/types.py,sha256=-y6aH8TK-dAOqC-ozzBp7Kzk7vxANkyFxqVWmDLQE5A,7527
13
+ latitude_sdk/sdk/logs.py,sha256=UBlQzNq8AtWVkeVztqUWTs78jGkfA8a2r6wOhasUpxs,2056
14
+ latitude_sdk/sdk/prompts.py,sha256=VaqI3qbVpcSbiT5xtd63eEwbIGTdMusDSoZeQZO8z4g,10134
15
+ latitude_sdk/sdk/types.py,sha256=1sBtKNppipuayPj3j8qoUzMekIO0DxSBBXYNCEVsZjU,7866
16
16
  latitude_sdk/util/__init__.py,sha256=alIDGBnxWH4JvP-UW-7N99seBBi0r1GV1h8f1ERFBec,21
17
17
  latitude_sdk/util/utils.py,sha256=WKm20UsceP352psbP8bmlgZ_IPTPYKXUIrXcesG_c08,2710
18
- latitude_sdk-0.1.0b3.dist-info/METADATA,sha256=nLZCboyGmJwZSc4WwT43kJddtoeykt-KQG0WmkpG2bk,1982
19
- latitude_sdk-0.1.0b3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
- latitude_sdk-0.1.0b3.dist-info/RECORD,,
18
+ latitude_sdk-0.1.0b5.dist-info/METADATA,sha256=WiPG0_TK3U1Ojeo1MKo47hqz3imEzLn1pG2PwJH7otk,1982
19
+ latitude_sdk-0.1.0b5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
+ latitude_sdk-0.1.0b5.dist-info/RECORD,,