anomalyco/opencode-sdk-python

GitHub: anomalyco/opencode-sdk-python

Opencode AI 平台的官方 Python SDK,提供类型安全的同步/异步客户端,便捷访问 Opencode REST API。

Stars: 202 | Forks: 19

# Opencode Python API 库 [![PyPI 版本](https://img.shields.io/pypi/v/opencode-ai.svg?label=pypi%20(stable))](https://pypi.org/project/opencode-ai/) Opencode Python 库提供了从任何 Python 3.8+ 应用程序便捷访问 Opencode REST API 的方式。该库包含对所有请求参数和响应字段的类型定义,并提供由 [httpx](https://github.com/encode/httpx) 驱动的同步和异步客户端。 它由 [Stainless](https://www.stainless.com/) 生成。 ## 文档 REST API 文档可在 [opencode.ai](https://opencode.ai/docs) 上找到。该库的完整 API 可在 [api.md](api.md) 中找到。 ## 安装 ``` # 从 PyPI install pip install --pre opencode-ai ``` ## 使用方法 该库的完整 API 可在 [api.md](api.md) 中找到。 ``` from opencode_ai import Opencode client = Opencode() sessions = client.session.list() ``` ## 异步使用 只需导入 `AsyncOpencode` 而不是 `Opencode`,并在每次 API 调用时使用 `await`: ``` import asyncio from opencode_ai import AsyncOpencode client = AsyncOpencode() async def main() -> None: sessions = await client.session.list() asyncio.run(main()) ``` 同步和异步客户端的功能在其他方面完全相同。 ### 使用 aiohttp 默认情况下,异步客户端使用 `httpx` 进行 HTTP 请求。但是,为了提高并发性能,您也可以使用 `aiohttp` 作为 HTTP 后端。 您可以通过安装 `aiohttp` 来启用它: ``` # 从 PyPI install pip install --pre opencode-ai[aiohttp] ``` 然后您可以通过使用 `http_client=DefaultAioHttpClient()` 实例化客户端来启用它: ``` import asyncio from opencode_ai import DefaultAioHttpClient from opencode_ai import AsyncOpencode async def main() -> None: async with AsyncOpencode( http_client=DefaultAioHttpClient(), ) as client: sessions = await client.session.list() asyncio.run(main()) ``` ## 流式响应 我们提供使用 Server Side Events (SSE) 的流式响应支持。 ``` from opencode_ai import Opencode client = Opencode() stream = client.event.list() for events in stream: print(events) ``` 异步客户端使用完全相同的接口。 ``` from opencode_ai import AsyncOpencode client = AsyncOpencode() stream = await client.event.list() async for events in stream: print(events) ``` ## 使用类型 嵌套的请求参数是 [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict)。响应是 [Pydantic models](https://docs.pydantic.dev),它们还提供用于以下操作的辅助方法: - 序列化回 JSON,`model.to_json()` - 转换为字典,`model.to_dict()` 类型化的请求和响应在您的编辑器中提供自动补全和文档。如果您希望在 VS Code 中看到类型错误以帮助更早地捕获 Bug,请将 `python.analysis.typeCheckingMode` 设置为 `basic`。 ## 处理错误 当库无法连接到 API 时(例如,由于网络连接问题或超时),会引发 `opencode_ai.APIConnectionError` 的子类。 当 API 返回非成功状态码(即 4xx 或 5xx 响应)时,会引发 `opencode_ai.APIStatusError` 的子类,其中包含 `status_code` 和 `response` 属性。 所有错误均继承自 `opencode_ai.APIError`。 ``` import opencode_ai from opencode_ai import Opencode client = Opencode() try: client.session.list() except opencode_ai.APIConnectionError as e: print("The server could not be reached") print(e.__cause__) # an underlying Exception, likely raised within httpx. except opencode_ai.RateLimitError as e: print("A 429 status code was received; we should back off a bit.") except opencode_ai.APIStatusError as e: print("Another non-200-range status code was received") print(e.status_code) print(e.response) ``` 错误码如下: | 状态码 | 错误类型 | | ----------- | -------------------------- | | 400 | `BadRequestError` | | 401 | `AuthenticationError` | | 403 | `PermissionDeniedError` | | 404 | `NotFoundError` | | 422 | `UnprocessableEntityError` | | 429 | `RateLimitError` | | >=500 | `InternalServerError` | | N/A | `APIConnectionError` | ### 重试 默认情况下,某些错误会自动重试 2 次,并带有短暂的指数退避。 连接错误(例如,由于网络连接问题)、408 Request Timeout、409 Conflict、429 Rate Limit 以及 >=500 Internal 错误默认都会被重试。 您可以使用 `max_retries` 选项来配置或禁用重试设置: ``` from opencode_ai import Opencode # Configure 所有 requests 的默认设置: client = Opencode( # default is 2 max_retries=0, ) # 或者,按 request Configure: client.with_options(max_retries=5).session.list() ``` ### 超时 默认情况下,请求会在 1 分钟后超时。您可以使用 `timeout` 选项进行配置,该选项接受一个浮点数或一个 [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) 对象: ``` from opencode_ai import Opencode # Configure 所有 requests 的默认设置: client = Opencode( # 20 seconds (default is 1 minute) timeout=20.0, ) # 更精细的控制: client = Opencode( timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0), ) # 按 request Override: client.with_options(timeout=5.0).session.list() ``` 超时时,会抛出 `APITimeoutError`。 请注意,超时的请求默认[会重试两次](#retries)。 ## 高级 ### 日志 我们使用标准库的 [`logging`](https://docs.python.org/3/library/logging.html) 模块。 您可以通过将环境变量 `OPENCODE_LOG` 设置为 `info` 来启用日志记录。 ``` $ export OPENCODE_LOG=info ``` 或者设置为 `debug` 以获取更详细的日志。 ### 如何判断 `None` 表示 `null` 还是缺失 在 API 响应中,一个字段可能是显式的 `null`,或者完全缺失;在这两种情况下,该库中的值均为 `None`。您可以使用 `.model_fields_set` 来区分这两种情况: ``` if response.my_field is None: if 'my_field' not in response.model_fields_set: print('Got json like {}, without a "my_field" key present at all.') else: print('Got json like {"my_field": null}.') ``` ### 访问原始响应数据(例如 headers) 可以通过在任何 HTTP 方法调用前加上 `.with_raw_response.` 来访问“原始”Response 对象,例如, ``` from opencode_ai import Opencode client = Opencode() response = client.session.with_raw_response.list() print(response.headers.get('X-My-Header')) session = response.parse() # get the object that `session.list()` would have returned print(session) ``` 这些方法返回一个 [`APIResponse`](https://github.com/sst/opencode-sdk-python/tree/main/src/opencode_ai/_response.py) 对象。 异步客户端返回一个具有相同结构的 [`AsyncAPIResponse`](https://github.com/sst/opencode-sdk-python/tree/main/src/opencode_ai/_response.py),唯一的区别是读取响应内容的方法是 `await`able 的。 #### `.with_streaming_response` 上述接口在您发出请求时会立即读取完整的响应体,这可能并不总是您想要的。 要流式传输响应体,请改用 `.with_streaming_response`,这需要使用上下文管理器,并且只有在您调用 `.read()`、`.text()`、`.json()`、`.iter_bytes()`、`.iter_text()`、`.iter_lines()` 或 `.parse()` 时才会读取响应体。在异步客户端中,这些是异步方法。 ``` with client.session.with_streaming_response.list() as response: print(response.headers.get("X-My-Header")) for line in response.iter_lines(): print(line) ``` 之所以需要上下文管理器,是为了确保响应能够被可靠地关闭。 ### 发出自定义/未记录的请求 该库为便捷访问已记录的 API 进行了类型化处理。 如果您需要访问未记录的 endpoints、params 或 response properties,仍然可以使用该库。 #### 未记录的 endpoints 要向未记录的 endpoints 发出请求,您可以使用 `client.get`、`client.post` 以及其他 HTTP 动词。发出此请求时,客户端上的选项(例如重试)将得到遵守。 ``` import httpx response = client.post( "/foo", cast_to=httpx.Response, body={"my_param": True}, ) print(response.headers.get("x-foo")) ``` #### 未记录的请求参数 如果您想显式发送额外的参数,可以通过 `extra_query`、`extra_body` 和 `extra_headers` 请求选项来实现。 #### 未记录的响应属性 要访问未记录的响应属性,您可以像 `response.unknown_prop` 这样访问额外的字段。您还可以使用 [`response.model_extra`](https://docs.pydantic.dev/latest/api/base_model/#pydantic.BaseModel.model_extra) 将 Pydantic 模型上的所有额外字段作为 dict 获取。 ### 配置 HTTP 客户端 您可以直接重写 [httpx client](https://www.python-httpx.org/api/#client) 以根据您的用例进行自定义,包括: - 支持 [proxies](https://www.python-httpx.org/advanced/proxies/) - 自定义 [transports](https://www.python-httpx.org/advanced/transports/) - 其他 [advanced](https://www.python-httpx.org/advanced/clients/) 功能 ``` import httpx from opencode_ai import Opencode, DefaultHttpxClient client = Opencode( # Or use the `OPENCODE_BASE_URL` env var base_url="http://my.test.server.example.com:8083", http_client=DefaultHttpxClient( proxy="http://my.test.proxy.example.com", transport=httpx.HTTPTransport(local_address="0.0.0.0"), ), ) ``` 您还可以使用 `with_options()` 在每个请求的基础上自定义客户端: ``` client.with_options(http_client=DefaultHttpxClient(...)) ``` ### 管理 HTTP 资源 默认情况下,只要客户端被[垃圾回收](https://docs.python.org/3/reference/datamodel.html#object.__del__),该库就会关闭底层的 HTTP 连接。如果需要,您可以使用 `.close()` 方法手动关闭客户端,或者在退出时关闭的上下文管理器中关闭它。 ``` from opencode_ai import Opencode with Opencode() as client: # make requests here ... # HTTP client 现已 closed ``` ## 版本控制 此包通常遵循 [SemVer](https://semver.org/spec/v2.0.0.html) 约定,尽管某些向后不兼容的更改可能会作为次要版本发布: 1. 仅影响静态类型而不破坏运行时行为的更改。 2. 对库内部结构的更改,这些内部结构在技术上是公开的,但并非旨在或记录供外部使用。_(如果您依赖于此类内部结构,请开启一个 GitHub issue 告知我们。)_ 3. 我们预计在实践中不会影响绝大多数用户的更改。 我们非常重视向后兼容性,并努力确保您获得顺畅的升级体验。 我们热切期待您的反馈;如有任何问题、Bug 或建议,请开启一个 [issue](https://www.github.com/sst/opencode-sdk-python/issues)。 ### 确定已安装的版本 如果您已升级到最新版本,但没有看到您期望的任何新功能,那么您的 python 环境可能仍在使用旧版本。 您可以通过以下方式确定运行时正在使用的版本: ``` import opencode_ai print(opencode_ai.__version__) ``` ## 要求 Python 3.8 或更高版本。 ## 贡献 参见[贡献文档](./CONTRIBUTING.md)。
标签:aiohttp, AI开发工具, API客户端, DLL 劫持, httpx, LLM工具, Opencode, PyPI, Python, RESTful API, SaaS API, 人工智能, 大语言模型, 威胁情报, 开发者工具, 开源库, 异步编程, 提示词优化, 搜索引擎爬虫, 无后门, 用户模式Hook绕过, 类型提示, 网络调试, 自动化, 运行时操纵, 逆向工具