latitude-sdk 0.1.0b2__py3-none-any.whl → 0.1.0b4__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
 
@@ -9,7 +9,7 @@ class ErrorResponse(Model):
9
9
  code: str = Field(alias=str("errorCode"))
10
10
  message: str
11
11
  details: Dict[str, Any]
12
- db_ref: Optional[DbErrorRef] = Field(None, alias=str("dbErrorRef"))
12
+ db_ref: Optional[DbErrorRef] = Field(default=None, alias=str("dbErrorRef"))
13
13
 
14
14
 
15
15
  class PromptRequestParams(Model):
@@ -37,7 +37,7 @@ class RunPromptRequestParams(PromptRequestParams, Model):
37
37
  class RunPromptRequestBody(Model):
38
38
  path: str
39
39
  parameters: Optional[Dict[str, Any]] = None
40
- custom_identifier: Optional[str] = Field(None, alias=str("customIdentifier"))
40
+ custom_identifier: Optional[str] = Field(default=None, alias=str("customIdentifier"))
41
41
  stream: Optional[bool] = None
42
42
 
43
43
 
@@ -74,7 +74,7 @@ class TriggerEvaluationRequestParams(EvaluationRequestParams, Model):
74
74
 
75
75
 
76
76
  class TriggerEvaluationRequestBody(Model):
77
- evaluation_uuids: Optional[List[str]] = Field(None, alias=str("evaluationUuids"))
77
+ evaluation_uuids: Optional[List[str]] = Field(default=None, alias=str("evaluationUuids"))
78
78
 
79
79
 
80
80
  class CreateEvaluationResultRequestParams(EvaluationRequestParams, Model):
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,34 +37,34 @@ 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
56
+ type: Literal[ContentType.ToolCall] = ContentType.ToolCall
57
57
  tool_call_id: str = Field(alias=str("toolCallId"))
58
58
  tool_name: str = Field(alias=str("toolName"))
59
- args: Dict[str, Any]
59
+ tool_arguments: Dict[str, Any] = Field(alias=str("toolArguments"))
60
60
 
61
61
 
62
62
  class ToolResultContent(Model):
63
- type: ContentType = ContentType.ToolResult
63
+ type: Literal[ContentType.ToolResult] = ContentType.ToolResult
64
64
  tool_call_id: str = Field(alias=str("toolCallId"))
65
65
  tool_name: str = Field(alias=str("toolName"))
66
66
  result: str
67
- is_error: Optional[bool] = Field(None, alias=str("isError"))
67
+ is_error: Optional[bool] = Field(default=None, alias=str("isError"))
68
68
 
69
69
 
70
70
  MessageContent = Union[
@@ -85,12 +85,12 @@ 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
 
@@ -102,13 +102,13 @@ class ToolCall(Model):
102
102
 
103
103
 
104
104
  class AssistantMessage(Model):
105
- role: MessageRole = MessageRole.Assistant
105
+ role: Literal[MessageRole.Assistant] = MessageRole.Assistant
106
106
  content: Union[str, List[Union[TextContent, ToolCallContent]]]
107
- tool_calls: Optional[List[ToolCall]] = Field(None, alias=str("toolCalls"))
107
+ tool_calls: Optional[List[ToolCall]] = Field(default=None, alias=str("toolCalls"))
108
108
 
109
109
 
110
110
  class ToolMessage(Model):
111
- role: MessageRole = MessageRole.Tool
111
+ role: Literal[MessageRole.Tool] = MessageRole.Tool
112
112
  content: List[ToolResultContent]
113
113
 
114
114
 
@@ -127,14 +127,14 @@ class StreamTypes(StrEnum):
127
127
 
128
128
 
129
129
  class ChainTextResponse(Model):
130
- type: StreamTypes = StreamTypes.Text
130
+ type: Literal[StreamTypes.Text] = Field(default=StreamTypes.Text, alias=str("streamType"))
131
131
  text: str
132
- tool_calls: Optional[List[ToolCall]] = Field(None, alias=str("toolCalls"))
132
+ tool_calls: Optional[List[ToolCall]] = Field(default=None, alias=str("toolCalls"))
133
133
  usage: ModelUsage
134
134
 
135
135
 
136
136
  class ChainObjectResponse(Model):
137
- type: StreamTypes = StreamTypes.Object
137
+ type: Literal[StreamTypes.Object] = Field(default=StreamTypes.Object, alias=str("streamType"))
138
138
  object: Any
139
139
  usage: ModelUsage
140
140
 
@@ -165,34 +165,34 @@ class ChainEvents(StrEnum):
165
165
 
166
166
 
167
167
  class ChainEventStep(Model):
168
- event: StreamEvents = StreamEvents.Latitude
169
- type: ChainEvents = ChainEvents.Step
170
- config: Dict[str, Any]
168
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
169
+ type: Literal[ChainEvents.Step] = ChainEvents.Step
170
+ uuid: Optional[str] = None
171
171
  is_last_step: bool = Field(alias=str("isLastStep"))
172
+ config: Dict[str, Any]
172
173
  messages: List[Message]
173
- uuid: Optional[str] = None
174
174
 
175
175
 
176
176
  class ChainEventStepCompleted(Model):
177
- event: StreamEvents = StreamEvents.Latitude
178
- type: ChainEvents = ChainEvents.StepCompleted
179
- response: ChainResponse
177
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
178
+ type: Literal[ChainEvents.StepCompleted] = ChainEvents.StepCompleted
180
179
  uuid: Optional[str] = None
180
+ response: ChainResponse
181
181
 
182
182
 
183
183
  class ChainEventCompleted(Model):
184
- event: StreamEvents = StreamEvents.Latitude
185
- type: ChainEvents = ChainEvents.Completed
184
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
185
+ type: Literal[ChainEvents.Completed] = ChainEvents.Completed
186
+ uuid: Optional[str] = None
186
187
  config: Dict[str, Any]
187
188
  messages: Optional[List[Message]] = None
188
189
  object: Optional[Any] = None
189
190
  response: ChainResponse
190
- uuid: Optional[str] = None
191
191
 
192
192
 
193
193
  class ChainEventError(Model):
194
- event: StreamEvents = StreamEvents.Latitude
195
- type: ChainEvents = ChainEvents.Error
194
+ event: Literal[StreamEvents.Latitude] = StreamEvents.Latitude
195
+ type: Literal[ChainEvents.Error] = ChainEvents.Error
196
196
  error: ChainError
197
197
 
198
198
 
@@ -203,7 +203,7 @@ LatitudeEvent = ChainEvent
203
203
 
204
204
 
205
205
  class FinishedEvent(Model):
206
- event: StreamEvents = StreamEvents.Finished
206
+ event: Literal[StreamEvents.Finished] = StreamEvents.Finished
207
207
  uuid: str
208
208
  conversation: List[Message]
209
209
  response: ChainResponse
@@ -228,7 +228,7 @@ class Log(Model):
228
228
  resolved_content: str = Field(alias=str("resolvedContent"))
229
229
  content_hash: str = Field(alias=str("contentHash"))
230
230
  parameters: Dict[str, Any]
231
- custom_identifier: Optional[str] = Field(None, alias=str("customIdentifier"))
231
+ custom_identifier: Optional[str] = Field(default=None, alias=str("customIdentifier"))
232
232
  duration: Optional[int] = None
233
233
  created_at: datetime = Field(alias=str("createdAt"))
234
234
  updated_at: datetime = Field(alias=str("updatedAt"))
@@ -245,10 +245,10 @@ class EvaluationResult(Model):
245
245
  uuid: str
246
246
  evaluation_id: int = Field(alias=str("evaluationId"))
247
247
  document_log_id: int = Field(alias=str("documentLogId"))
248
- evaluated_provider_log_id: Optional[int] = Field(None, alias=str("evaluatedProviderLogId"))
249
- evaluation_provider_log_id: Optional[int] = Field(None, alias=str("evaluationProviderLogId"))
250
- resultable_type: Optional[EvaluationResultType] = Field(None, alias=str("resultableType"))
251
- resultable_id: Optional[int] = Field(None, alias=str("resultableId"))
248
+ evaluated_provider_log_id: Optional[int] = Field(default=None, alias=str("evaluatedProviderLogId"))
249
+ evaluation_provider_log_id: Optional[int] = Field(default=None, alias=str("evaluationProviderLogId"))
250
+ resultable_type: Optional[EvaluationResultType] = Field(default=None, alias=str("resultableType"))
251
+ resultable_id: Optional[int] = Field(default=None, alias=str("resultableId"))
252
252
  result: Optional[Union[str, bool, int]] = None
253
253
  source: Optional[LogSources] = None
254
254
  reason: Optional[str] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: latitude-sdk
3
- Version: 0.1.0b2
3
+ Version: 0.1.0b4
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
5
- latitude_sdk/client/payloads.py,sha256=CwE_qn9OlLXWFO-h6tPeYxFvz-D4xAbH1-rBWX1vOCg,2672
4
+ latitude_sdk/client/client.py,sha256=Oc4COkVFR1vFewVKZzUIvztJi_yTxeSMoyeML-ivVsY,4389
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=B4Yk1sLlpZa2XhQPPo7lhHSwfv_XPDAO6QtTSokoJDY,7463
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=hlJI21gWHbHGmJPt4e6RrW5zcryHj3r7YT5FCFtwDRI,7997
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.0b2.dist-info/METADATA,sha256=NE8G4Gu2zeeSIpfll--kPATdtfZ-0mtsIbyoqegPvj0,1982
19
- latitude_sdk-0.1.0b2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
- latitude_sdk-0.1.0b2.dist-info/RECORD,,
18
+ latitude_sdk-0.1.0b4.dist-info/METADATA,sha256=NBv1qQwUlAKzFrfERPN3qMamHZi8qQ3S7v252JqTYEU,1982
19
+ latitude_sdk-0.1.0b4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
+ latitude_sdk-0.1.0b4.dist-info/RECORD,,