Skip to content

Commit 13cb30b

Browse files
RobLe3claude
andcommitted
fix: ruff lint (B904/UP037/I001/F401/E501) + feature parity
- _http.py: raise from err/None in all except clauses (B904) - types.py: TYPE_CHECKING import for IicpError, remove quoted annotation (UP037), move IicpError import from bottom; add ChatOptions.timeout_ms - client.py: use opts.timeout_ms in chat_async() if set - tests/test_client.py: sort imports (I001), remove unused TaskConstraints (F401), wrap two long lines (E501) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 56a29eb commit 13cb30b

4 files changed

Lines changed: 25 additions & 21 deletions

File tree

src/iicp_client/_http.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ async def get_json(
5454
message=f"Request to {url} timed out after {timeout_ms}ms",
5555
component=component,
5656
retryable=True,
57-
)
57+
) from None
5858
except httpx.RequestError as exc:
5959
raise IicpError(
6060
code="IICP-E004",
6161
message=f"Network error reaching {url}: {exc}",
6262
component=component,
6363
retryable=True,
64-
)
64+
) from exc
6565
if not resp.is_success:
6666
raise from_http(resp.status_code, _safe_json(resp), component)
6767
return resp.json()
@@ -91,14 +91,14 @@ async def post_json(
9191
message=f"Request to {url} timed out after {timeout_ms}ms",
9292
component=component,
9393
retryable=True,
94-
)
94+
) from None
9595
except httpx.RequestError as exc:
9696
raise IicpError(
9797
code="IICP-E004",
9898
message=f"Network error reaching {url}: {exc}",
9999
component=component,
100100
retryable=True,
101-
)
101+
) from exc
102102
elapsed = int((time.monotonic() - t0) * 1000)
103103
if not resp.is_success:
104104
raise from_http(resp.status_code, _safe_json(resp), component)

src/iicp_client/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ async def chat_async(
184184
intent="urn:iicp:intent:llm:chat:v1",
185185
payload=payload,
186186
constraints=TaskConstraints(
187-
timeout_ms=self._cfg.timeout_ms,
187+
timeout_ms=opts.timeout_ms or self._cfg.timeout_ms,
188188
qos=opts.qos,
189189
),
190190
auth=TaskAuth(node_token=opts.node_token),

src/iicp_client/types.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
from __future__ import annotations
33

44
from dataclasses import dataclass, field
5-
from typing import Any
5+
from typing import TYPE_CHECKING, Any
6+
7+
if TYPE_CHECKING:
8+
from iicp_client.errors import IicpError
69

710

811
@dataclass
@@ -47,7 +50,7 @@ class TaskResponse:
4750
status: str
4851
result: dict[str, Any] | None
4952
metrics: TaskMetrics
50-
error: "IicpError | None" = None
53+
error: IicpError | None = None
5154

5255

5356
@dataclass
@@ -61,6 +64,7 @@ class ChatOptions:
6164
model: str | None = None
6265
max_tokens: int | None = None
6366
temperature: float | None = None
67+
timeout_ms: int | None = None
6468
qos: str = "interactive"
6569
node_token: str | None = None
6670

@@ -112,7 +116,3 @@ class NodeList:
112116
nodes: list[Node]
113117
query_ms: int
114118

115-
116-
# Forward reference resolution
117-
from iicp_client.errors import IicpError # noqa: E402
118-
TaskResponse.__annotations__["error"] = "IicpError | None"

tests/test_client.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
"""Unit tests for IicpClient (ADR-016 SDK-01..SDK-06)."""
22
from __future__ import annotations
33

4+
import httpx
45
import pytest
56
import respx
6-
import httpx
77

88
from iicp_client import (
9-
IicpClient,
10-
IicpError,
11-
ClientConfig,
129
ChatMessage,
1310
ChatOptions,
14-
TaskRequest,
15-
TaskConstraints,
16-
TaskAuth,
11+
ClientConfig,
1712
DiscoverOptions,
13+
IicpClient,
14+
IicpError,
15+
TaskAuth,
16+
TaskRequest,
1817
)
1918

20-
2119
DIRECTORY = "https://iicp.test"
2220
NODE = "https://node.iicp.test"
2321
DISCOVER_URL = f"{DIRECTORY}/v1/discover"
@@ -134,7 +132,10 @@ async def _noop_sleep(_: float) -> None:
134132
respx.post(TASK_URL).mock(
135133
side_effect=[
136134
httpx.Response(503, json={"code": "IICP-E005", "message": "overload"}),
137-
httpx.Response(200, json={"task_id": "t-2", "status": "success", "result": {}, "usage": {}}),
135+
httpx.Response(
136+
200,
137+
json={"task_id": "t-2", "status": "success", "result": {}, "usage": {}},
138+
),
138139
]
139140
)
140141
client = IicpClient(ClientConfig(directory_url=DIRECTORY, max_retries=3))
@@ -175,7 +176,10 @@ def test_chat_sdk02_openai_compat_shape():
175176
"status": "success",
176177
"result": {
177178
"choices": [
178-
{"message": {"role": "assistant", "content": "Hello!"}, "finish_reason": "stop"}
179+
{
180+
"message": {"role": "assistant", "content": "Hello!"},
181+
"finish_reason": "stop",
182+
}
179183
],
180184
"usage": {"prompt_tokens": 5, "completion_tokens": 3, "total_tokens": 8},
181185
"model": "llama3",

0 commit comments

Comments
 (0)