Skip to content

Commit de79eae

Browse files
authored
🔧💥 #15 Apply API breaking changes from Glide v0.0.4-rc.1 (#16)
Applying breaking changes from EinStack/glide#236: - changed the request/response field name format to snake_case - renamed router_id, model_name, provider_id fields - introduced error name in the error responses
1 parent fcef3b9 commit de79eae

File tree

8 files changed

+68
-39
lines changed

8 files changed

+68
-39
lines changed

.github/workflows/activity-notifications.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Pull Request Activity Notifications
22

33
on:
4-
pull_request:
4+
pull_request_target:
55
types: [opened, closed, reopened]
66

77
jobs:

examples/lang/chat_stream_async.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ async def chat_stream() -> None:
4040
continue
4141

4242
if err := message.error:
43-
print(f"💥ERR: {err.message} (code: {err.err_code})")
43+
print(f"💥ERR ({err.name}): {err.message}")
4444
print("🧹 Restarting the stream")
4545
continue
4646

@@ -50,7 +50,7 @@ async def chat_stream() -> None:
5050

5151
if last_msg and last_msg.chunk and last_msg.finish_reason:
5252
# LLM gen context
53-
provider_name = last_msg.chunk.provider_name
53+
provider_name = last_msg.chunk.provider_id
5454
model_name = last_msg.chunk.model_name
5555
finish_reason = last_msg.finish_reason
5656

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ requires-python = ">=3.8"
2626
[project.urls]
2727
Homepage = "https://glide.einstack.ai/"
2828
Documentation = "https://glide.einstack.ai/"
29-
Repository = "https://github.com/me/spam.git"
30-
Issues = "https://github.com/EinStack/glide-python"
29+
Repository = "https://github.com/EinStack/glide-py.git"
30+
Issues = "https://github.com/EinStack/glide-py/issues/"
3131

3232
[tool.pdm.version]
3333
source = "scm"

src/glide/exceptions.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,22 @@ class GlideClientError(GlideError):
1717
Occurs when there is an issue with sending a Glide request
1818
"""
1919

20+
def __init__(self, message: str, err_name: str) -> None:
21+
super().__init__(message)
22+
23+
self.err_name = err_name
24+
25+
26+
class GlideServerError(GlideError):
27+
"""
28+
Occurs when there is an issue with sending a Glide request related to Glide server issues
29+
"""
30+
31+
def __init__(self, message: str, err_name: str) -> None:
32+
super().__init__(message)
33+
34+
self.err_name = err_name
35+
2036

2137
class GlideClientMismatch(GlideError):
2238
"""
@@ -29,7 +45,7 @@ class GlideChatStreamError(GlideError):
2945
Occurs when chat stream ends with an error
3046
"""
3147

32-
def __init__(self, message: str, err_code: str) -> None:
48+
def __init__(self, message: str, err_name: str) -> None:
3349
super().__init__(message)
3450

35-
self.err_code = err_code
51+
self.err_name = err_name

src/glide/lang/router_async.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@
1818
GlideClientError,
1919
GlideClientMismatch,
2020
GlideChatStreamError,
21+
GlideServerError,
2122
)
2223
from glide.lang import schemas
23-
from glide.lang.schemas import ChatStreamRequest, ChatStreamMessage, ChatRequestId
24+
from glide.lang.schemas import (
25+
ChatStreamRequest,
26+
ChatStreamMessage,
27+
ChatRequestId,
28+
ChatError,
29+
)
2430
from glide.logging import logger
2531
from glide.typing import RouterId
2632

@@ -82,8 +88,8 @@ async def chat_stream(
8288
if err := message.ended_with_err:
8389
# fail only on fatal errors that indicate stream stop
8490
raise GlideChatStreamError(
85-
f"Chat stream {req.id} ended with an error: {err.message} (code: {err.err_code})",
86-
err.err_code,
91+
f"Chat stream {req.id} ended with an error ({err.name}): {err.message}",
92+
err.name,
8793
)
8894

8995
yield message # returns content chunk and some error messages
@@ -113,7 +119,7 @@ async def _sender(self) -> None:
113119

114120
await self._ws_client.send(chat_request.json())
115121
except asyncio.CancelledError:
116-
# TODO: log
122+
logger.debug("chat stream sender task is canceled")
117123
break
118124

119125
async def _receiver(self) -> None:
@@ -136,6 +142,7 @@ async def _receiver(self) -> None:
136142
exc_info=True,
137143
)
138144
except asyncio.CancelledError:
145+
logger.debug("chat stream receiver task is canceled")
139146
break
140147
except Exception as e:
141148
logger.exception(e)
@@ -213,33 +220,36 @@ async def chat(
213220
"""
214221
Send a chat request to a specified language router
215222
"""
216-
try:
217-
headers = {}
223+
headers = {}
218224

219-
if self._user_agent:
220-
headers["User-Agent"] = self._user_agent
225+
if self._user_agent:
226+
headers["User-Agent"] = self._user_agent
221227

228+
try:
222229
resp = await self._http_client.post(
223230
f"/language/{router_id}/chat",
224231
headers=headers,
225232
json=request.dict(by_alias=True),
226233
)
227234

228-
except httpx.NetworkError as e:
229-
raise GlideUnavailable() from e
235+
if resp.is_error:
236+
err_data = ChatError(**resp.json())
230237

231-
if not resp.is_success:
232-
raise GlideClientError(
233-
f"Failed to send a chat request: {resp.text} (status_code: {resp.status_code})"
234-
)
238+
if resp.is_client_error:
239+
raise GlideClientError(err_data.message, err_data.name)
235240

236-
try:
237-
raw_response = resp.json()
241+
if resp.is_server_error:
242+
raise GlideServerError(err_data.message, err_data.name)
243+
244+
raw_resp = resp.json()
238245

239-
return schemas.ChatResponse(**raw_response)
246+
return schemas.ChatResponse(**raw_resp)
247+
except httpx.NetworkError as e:
248+
raise GlideUnavailable() from e
240249
except pydantic.ValidationError as err:
241250
raise GlideClientMismatch(
242-
"Failed to validate Glide API response. Please make sure Glide API and client versions are compatible"
251+
"Failed to validate Glide API response. "
252+
"Please make sure Glide API and client versions are compatible"
243253
) from err
244254

245255
def stream_client(self, router_id: RouterId) -> AsyncStreamChatClient:

src/glide/lang/schemas.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,17 @@
88
from pydantic import Field
99

1010
from glide.schames import Schema
11-
from glide.typing import RouterId, ProviderName, ModelName
11+
from glide.typing import RouterId, ProviderId, ModelName
1212

1313
ChatRequestId = str
1414
Metadata = Dict[str, Any]
1515

1616

17+
class ChatError(Schema):
18+
name: str
19+
message: str
20+
21+
1722
class FinishReason(str, Enum):
1823
# generation is finished successfully without interruptions
1924
COMPLETE = "complete"
@@ -45,7 +50,7 @@ class ModelMessageOverride(Schema):
4550
class ChatRequest(Schema):
4651
message: ChatMessage
4752
message_history: List[ChatMessage] = Field(default_factory=list)
48-
override: Optional[ModelMessageOverride] = None
53+
override_params: Optional[ModelMessageOverride] = None
4954

5055

5156
class TokenUsage(Schema):
@@ -55,26 +60,26 @@ class TokenUsage(Schema):
5560

5661

5762
class ModelResponse(Schema):
58-
response_id: Dict[str, str]
63+
metadata: Dict[str, str]
5964
message: ChatMessage
60-
token_count: TokenUsage
65+
token_usage: TokenUsage
6166

6267

6368
class ChatResponse(Schema):
6469
id: ChatRequestId
65-
created: datetime
66-
provider: ProviderName
67-
router: RouterId
70+
created_at: datetime
71+
provider_id: ProviderId
72+
router_id: RouterId
6873
model_id: str
69-
model: ModelName
74+
model_name: ModelName
7075
model_response: ModelResponse
7176

7277

7378
class ChatStreamRequest(Schema):
7479
id: ChatRequestId = Field(default_factory=lambda: str(uuid.uuid4()))
7580
message: ChatMessage
7681
message_history: List[ChatMessage] = Field(default_factory=list)
77-
override: Optional[ModelMessageOverride] = None
82+
override_params: Optional[ModelMessageOverride] = None
7883
metadata: Optional[Metadata] = None
7984

8085

@@ -90,7 +95,7 @@ class ChatStreamChunk(Schema):
9095

9196
model_id: str
9297

93-
provider_name: ProviderName
98+
provider_id: ProviderId
9499
model_name: ModelName
95100

96101
model_response: ModelChunkResponse
@@ -99,7 +104,7 @@ class ChatStreamChunk(Schema):
99104

100105
class ChatStreamError(Schema):
101106
id: ChatRequestId
102-
err_code: str
107+
name: str
103108
message: str
104109
finish_reason: Optional[FinishReason] = None
105110

src/glide/schames.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright EinStack
22
# SPDX-License-Identifier: APACHE-2.0
33
from pydantic import BaseModel, ConfigDict
4-
from pydantic.alias_generators import to_camel
54

65

76
class Schema(BaseModel):
@@ -10,7 +9,6 @@ class Schema(BaseModel):
109
"""
1110

1211
model_config = ConfigDict(
13-
alias_generator=to_camel,
1412
populate_by_name=True,
1513
from_attributes=True,
1614
protected_namespaces=(),

src/glide/typing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
# SPDX-License-Identifier: APACHE-2.0
33

44
RouterId = str
5-
ProviderName = str
5+
ProviderId = str
66
ModelName = str

0 commit comments

Comments
 (0)