Expose an async variant of NineRouter using httpx.AsyncClient with the same method surface: await client.chat(...), async for chunk in client.chat_stream(...), etc.
Why: most real apps are async; the sync client is done.
Design notes:
- Keep the sync client untouched
- Share request-building logic between sync/async
- Add mocked tests with
respx
Good first issue: no deep gateway knowledge needed, just follow the existing patterns.
Expose an async variant of
NineRouterusinghttpx.AsyncClientwith the same method surface:await client.chat(...),async for chunk in client.chat_stream(...), etc.Why: most real apps are async; the sync client is done.
Design notes:
respxGood first issue: no deep gateway knowledge needed, just follow the existing patterns.