Skip to content

Commit 4db7199

Browse files
feat(api): api update
1 parent 6927a1b commit 4db7199

File tree

3 files changed

+31
-57
lines changed

3 files changed

+31
-57
lines changed

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 22
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-7270b9e4859010d6680bcc92afcd6f7c679d80a2645f65d7097d19ce2e8cdc5a.yml
33
openapi_spec_hash: 5fcbfaedebfea62c17c74437a9728b04
4-
config_hash: 931828b5dd9393834a3c1703e02e02b0
4+
config_hash: 38a50dff50297c2f735b5e1c83fa0188

README.md

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ from opencode_ai import Opencode
2929

3030
client = Opencode()
3131

32-
events = client.event.list()
32+
sessions = client.session.list()
3333
```
3434

3535
## Async usage
@@ -44,7 +44,7 @@ client = AsyncOpencode()
4444

4545

4646
async def main() -> None:
47-
events = await client.event.list()
47+
sessions = await client.session.list()
4848

4949

5050
asyncio.run(main())
@@ -75,38 +75,12 @@ async def main() -> None:
7575
async with AsyncOpencode(
7676
http_client=DefaultAioHttpClient(),
7777
) as client:
78-
events = await client.event.list()
78+
sessions = await client.session.list()
7979

8080

8181
asyncio.run(main())
8282
```
8383

84-
## Streaming responses
85-
86-
We provide support for streaming responses using Server Side Events (SSE).
87-
88-
```python
89-
from opencode_ai import Opencode
90-
91-
client = Opencode()
92-
93-
stream = client.event.list()
94-
for events in stream:
95-
print(events)
96-
```
97-
98-
The async client uses the exact same interface.
99-
100-
```python
101-
from opencode_ai import AsyncOpencode
102-
103-
client = AsyncOpencode()
104-
105-
stream = await client.event.list()
106-
async for events in stream:
107-
print(events)
108-
```
109-
11084
## Using types
11185

11286
Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:
@@ -132,7 +106,7 @@ from opencode_ai import Opencode
132106
client = Opencode()
133107

134108
try:
135-
client.event.list()
109+
client.session.list()
136110
except opencode_ai.APIConnectionError as e:
137111
print("The server could not be reached")
138112
print(e.__cause__) # an underlying Exception, likely raised within httpx.
@@ -175,7 +149,7 @@ client = Opencode(
175149
)
176150

177151
# Or, configure per-request:
178-
client.with_options(max_retries=5).event.list()
152+
client.with_options(max_retries=5).session.list()
179153
```
180154

181155
### Timeouts
@@ -198,7 +172,7 @@ client = Opencode(
198172
)
199173

200174
# Override per-request:
201-
client.with_options(timeout=5.0).event.list()
175+
client.with_options(timeout=5.0).session.list()
202176
```
203177

204178
On timeout, an `APITimeoutError` is thrown.
@@ -239,11 +213,11 @@ The "raw" Response object can be accessed by prefixing `.with_raw_response.` to
239213
from opencode_ai import Opencode
240214

241215
client = Opencode()
242-
response = client.event.with_raw_response.list()
216+
response = client.session.with_raw_response.list()
243217
print(response.headers.get('X-My-Header'))
244218

245-
event = response.parse() # get the object that `event.list()` would have returned
246-
print(event)
219+
session = response.parse() # get the object that `session.list()` would have returned
220+
print(session)
247221
```
248222

249223
These methods return an [`APIResponse`](https://github.com/sst/opencode-sdk-python/tree/main/src/opencode_ai/_response.py) object.
@@ -257,7 +231,7 @@ The above interface eagerly reads the full response body when you make the reque
257231
To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.
258232

259233
```python
260-
with client.event.with_streaming_response.list() as response:
234+
with client.session.with_streaming_response.list() as response:
261235
print(response.headers.get("X-My-Header"))
262236

263237
for line in response.iter_lines():

tests/test_client.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -686,20 +686,20 @@ def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str
686686
@mock.patch("opencode_ai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
687687
@pytest.mark.respx(base_url=base_url)
688688
def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter, client: Opencode) -> None:
689-
respx_mock.get("/event").mock(side_effect=httpx.TimeoutException("Test timeout error"))
689+
respx_mock.get("/session").mock(side_effect=httpx.TimeoutException("Test timeout error"))
690690

691691
with pytest.raises(APITimeoutError):
692-
client.event.with_streaming_response.list().__enter__()
692+
client.session.with_streaming_response.list().__enter__()
693693

694694
assert _get_open_connections(self.client) == 0
695695

696696
@mock.patch("opencode_ai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
697697
@pytest.mark.respx(base_url=base_url)
698698
def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter, client: Opencode) -> None:
699-
respx_mock.get("/event").mock(return_value=httpx.Response(500))
699+
respx_mock.get("/session").mock(return_value=httpx.Response(500))
700700

701701
with pytest.raises(APIStatusError):
702-
client.event.with_streaming_response.list().__enter__()
702+
client.session.with_streaming_response.list().__enter__()
703703
assert _get_open_connections(self.client) == 0
704704

705705
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
@@ -726,9 +726,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
726726
return httpx.Response(500)
727727
return httpx.Response(200)
728728

729-
respx_mock.get("/event").mock(side_effect=retry_handler)
729+
respx_mock.get("/session").mock(side_effect=retry_handler)
730730

731-
response = client.event.with_raw_response.list()
731+
response = client.session.with_raw_response.list()
732732

733733
assert response.retries_taken == failures_before_success
734734
assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
@@ -750,9 +750,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
750750
return httpx.Response(500)
751751
return httpx.Response(200)
752752

753-
respx_mock.get("/event").mock(side_effect=retry_handler)
753+
respx_mock.get("/session").mock(side_effect=retry_handler)
754754

755-
response = client.event.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
755+
response = client.session.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
756756

757757
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
758758

@@ -773,9 +773,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
773773
return httpx.Response(500)
774774
return httpx.Response(200)
775775

776-
respx_mock.get("/event").mock(side_effect=retry_handler)
776+
respx_mock.get("/session").mock(side_effect=retry_handler)
777777

778-
response = client.event.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
778+
response = client.session.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
779779

780780
assert response.http_request.headers.get("x-stainless-retry-count") == "42"
781781

@@ -1468,10 +1468,10 @@ async def test_parse_retry_after_header(self, remaining_retries: int, retry_afte
14681468
async def test_retrying_timeout_errors_doesnt_leak(
14691469
self, respx_mock: MockRouter, async_client: AsyncOpencode
14701470
) -> None:
1471-
respx_mock.get("/event").mock(side_effect=httpx.TimeoutException("Test timeout error"))
1471+
respx_mock.get("/session").mock(side_effect=httpx.TimeoutException("Test timeout error"))
14721472

14731473
with pytest.raises(APITimeoutError):
1474-
await async_client.event.with_streaming_response.list().__aenter__()
1474+
await async_client.session.with_streaming_response.list().__aenter__()
14751475

14761476
assert _get_open_connections(self.client) == 0
14771477

@@ -1480,10 +1480,10 @@ async def test_retrying_timeout_errors_doesnt_leak(
14801480
async def test_retrying_status_errors_doesnt_leak(
14811481
self, respx_mock: MockRouter, async_client: AsyncOpencode
14821482
) -> None:
1483-
respx_mock.get("/event").mock(return_value=httpx.Response(500))
1483+
respx_mock.get("/session").mock(return_value=httpx.Response(500))
14841484

14851485
with pytest.raises(APIStatusError):
1486-
await async_client.event.with_streaming_response.list().__aenter__()
1486+
await async_client.session.with_streaming_response.list().__aenter__()
14871487
assert _get_open_connections(self.client) == 0
14881488

14891489
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
@@ -1511,9 +1511,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
15111511
return httpx.Response(500)
15121512
return httpx.Response(200)
15131513

1514-
respx_mock.get("/event").mock(side_effect=retry_handler)
1514+
respx_mock.get("/session").mock(side_effect=retry_handler)
15151515

1516-
response = await client.event.with_raw_response.list()
1516+
response = await client.session.with_raw_response.list()
15171517

15181518
assert response.retries_taken == failures_before_success
15191519
assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
@@ -1536,9 +1536,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
15361536
return httpx.Response(500)
15371537
return httpx.Response(200)
15381538

1539-
respx_mock.get("/event").mock(side_effect=retry_handler)
1539+
respx_mock.get("/session").mock(side_effect=retry_handler)
15401540

1541-
response = await client.event.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
1541+
response = await client.session.with_raw_response.list(extra_headers={"x-stainless-retry-count": Omit()})
15421542

15431543
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
15441544

@@ -1560,9 +1560,9 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
15601560
return httpx.Response(500)
15611561
return httpx.Response(200)
15621562

1563-
respx_mock.get("/event").mock(side_effect=retry_handler)
1563+
respx_mock.get("/session").mock(side_effect=retry_handler)
15641564

1565-
response = await client.event.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
1565+
response = await client.session.with_raw_response.list(extra_headers={"x-stainless-retry-count": "42"})
15661566

15671567
assert response.http_request.headers.get("x-stainless-retry-count") == "42"
15681568

0 commit comments

Comments
 (0)