Name | onellmclient JSON |
Version |
0.1.3
JSON |
| download |
home_page | None |
Summary | A unified Python client to normalize interfaces across major LLM providers (OpenAI, Anthropic, Gemini, DeepSeek, xAI). |
upload_time | 2025-10-21 13:30:11 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | MIT License
Copyright (c) 2025
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. |
keywords |
anthropic
client
deepseek
gemini
grok
llm
openai
sdk
xai
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# onellmclient
统一主要 LLM 提供商接口的 Python 客户端,让你用一套 API 调用 OpenAI、Anthropic、Gemini、DeepSeek、xAI 等不同厂商的模型。
## ✨ 特性
- **统一接口**:一套 API 调用多个 LLM 厂商,无需学习不同 SDK
- **开箱即用**:一次安装,支持所有主流 LLM 提供商(OpenAI、Anthropic、Gemini、DeepSeek、xAI)
- **透明切换**:随时切换不同的模型提供商,代码几乎无需改动
- **完整功能**:支持文本生成、工具调用、结构化输出等核心功能
## 📦 安装
```bash
# 使用 uv(推荐)
uv add onellmclient
# 或使用 pip
pip install onellmclient
```
**注意**:安装 `onellmclient` 会自动安装所有支持的 LLM 提供商 SDK(OpenAI、Anthropic、Gemini),DeepSeek 和 xAI 使用 OpenAI 兼容的 API,无需额外依赖。
## 🚀 快速开始
### 基础用法
```python
from onellmclient import Client
# 初始化客户端(支持多个厂商)
client = Client(
openai={"key": "your-openai-api-key"},
anthropic={"key": "your-anthropic-api-key"},
gemini={"key": "your-gemini-api-key"},
deepseek={"key": "your-deepseek-api-key"},
xai={"key": "your-xai-api-key"}
)
# 调用 OpenAI 模型
response = client.completion(
provider="openai",
model="gpt-4o-mini",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.content)
# 切换到 Anthropic 模型,代码几乎不变
response = client.completion(
provider="anthropic",
model="claude-3-5-sonnet",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.content)
# 切换到 DeepSeek 模型,同样简单
response = client.completion(
provider="deepseek",
model="deepseek-v3.2-exp",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.content)
# 切换到 xAI Grok 模型
response = client.completion(
provider="xai",
model="grok-beta",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.content)
```
### 高级功能
#### 结构化输出
```python
# 定义 JSON Schema
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"hobbies": {"type": "array", "items": {"type": "string"}}
},
"required": ["name", "age"]
}
response = client.completion(
provider="openai",
model="gpt-4o-mini",
messages=[{"role": "user", "content": "请介绍一个虚构的人物"}],
schema=schema
)
# response.content 将是一个符合 schema 的 JSON 字符串
```
#### 工具调用
```python
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"]
}
}
}
]
response = client.completion(
provider="openai",
model="gpt-4o-mini",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools
)
```
#### 推理能力(Claude)
```python
response = client.completion(
provider="anthropic",
model="claude-3-5-sonnet",
messages=[{"role": "user", "content": "解这个数学题:2x + 5 = 13"}],
reasoning_effort="medium" # off, minimal, low, medium, high
)
```
## 📋 支持的厂商和模型
| 厂商 | 支持的模型 | 特殊功能 |
|------|------------|----------|
| **OpenAI** | gpt-4o, gpt-4o-mini, gpt-4, gpt-3.5-turbo 等 | 结构化输出、工具调用、网络搜索 |
| **Anthropic** | claude-3-5-sonnet, claude-3-opus, claude-3-haiku 等 | 推理能力、工具调用 |
| **Gemini** | gemini-1.5-pro, gemini-1.5-flash 等 | 工具调用 |
| **DeepSeek** | deepseek-v3.2-exp, deepseek-chat 等 | 结构化输出、工具调用 |
| **xAI** | grok-beta, grok-vision-beta 等 | 结构化输出、工具调用、推理能力、网络搜索 |
## 🔧 API 参考
### Client 初始化
```python
Client(
openai={"key": "api-key", "base": "https://api.openai.com/v1"}, # 可选
anthropic={"key": "api-key", "base": "https://api.anthropic.com"}, # 可选
gemini={"key": "api-key", "base": "https://generativelanguage.googleapis.com"}, # 可选
deepseek={"key": "api-key", "base": "https://api.deepseek.com"}, # 可选
xai={"key": "api-key", "base": "https://api.x.ai/v1"} # 可选
)
```
### completion 方法
```python
client.completion(
provider: str, # "openai", "anthropic", "gemini", "deepseek", "xai"
model: str, # 模型名称
messages: List[Dict], # 消息列表
instructions: Optional[str], # 系统指令
schema: Optional[Dict], # JSON Schema(结构化输出)
tools: Optional[List[Dict]], # 工具定义
reasoning_effort: Optional[str], # 推理能力:"off", "minimal", "low", "medium", "high"(Anthropic, xAI)
temperature: Optional[float], # 温度参数 0-2
web_search: bool, # 是否启用网络搜索(OpenAI, xAI)
tool_choice: Optional[str] # 工具选择策略:"auto", "none", "required"
)
```
## 💡 最佳实践
1. **环境变量管理**:将 API 密钥存储在环境变量中
```python
import os
client = Client(
openai={"key": os.getenv("OPENAI_API_KEY")},
anthropic={"key": os.getenv("ANTHROPIC_API_KEY")},
deepseek={"key": os.getenv("DEEPSEEK_API_KEY")},
xai={"key": os.getenv("XAI_API_KEY")}
)
```
2. **错误处理**:捕获特定异常
```python
try:
response = client.completion(provider="openai", model="gpt-4", messages=[...])
except ValueError as e:
print(f"配置错误: {e}")
```
3. **模型切换**:为不同场景选择合适的模型
```python
# 快速响应场景
response = client.completion(provider="openai", model="gpt-4o-mini", messages=[...])
# 复杂推理场景
response = client.completion(provider="anthropic", model="claude-3-5-sonnet", messages=[...], reasoning_effort="high")
```
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 📄 开源协议
MIT License
Raw data
{
"_id": null,
"home_page": null,
"name": "onellmclient",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "anthropic, client, deepseek, gemini, grok, llm, openai, sdk, xai",
"author": null,
"author_email": "Elevioux <elevioux@live.com>",
"download_url": "https://files.pythonhosted.org/packages/cd/31/9f3f1a1dfb976f3a737693fade3fa9e8c9087c0b1dac4dd942a0a19deed7/onellmclient-0.1.3.tar.gz",
"platform": null,
"description": "# onellmclient\n\n\u7edf\u4e00\u4e3b\u8981 LLM \u63d0\u4f9b\u5546\u63a5\u53e3\u7684 Python \u5ba2\u6237\u7aef\uff0c\u8ba9\u4f60\u7528\u4e00\u5957 API \u8c03\u7528 OpenAI\u3001Anthropic\u3001Gemini\u3001DeepSeek\u3001xAI \u7b49\u4e0d\u540c\u5382\u5546\u7684\u6a21\u578b\u3002\n\n## \u2728 \u7279\u6027\n\n- **\u7edf\u4e00\u63a5\u53e3**\uff1a\u4e00\u5957 API \u8c03\u7528\u591a\u4e2a LLM \u5382\u5546\uff0c\u65e0\u9700\u5b66\u4e60\u4e0d\u540c SDK\n- **\u5f00\u7bb1\u5373\u7528**\uff1a\u4e00\u6b21\u5b89\u88c5\uff0c\u652f\u6301\u6240\u6709\u4e3b\u6d41 LLM \u63d0\u4f9b\u5546\uff08OpenAI\u3001Anthropic\u3001Gemini\u3001DeepSeek\u3001xAI\uff09\n- **\u900f\u660e\u5207\u6362**\uff1a\u968f\u65f6\u5207\u6362\u4e0d\u540c\u7684\u6a21\u578b\u63d0\u4f9b\u5546\uff0c\u4ee3\u7801\u51e0\u4e4e\u65e0\u9700\u6539\u52a8\n- **\u5b8c\u6574\u529f\u80fd**\uff1a\u652f\u6301\u6587\u672c\u751f\u6210\u3001\u5de5\u5177\u8c03\u7528\u3001\u7ed3\u6784\u5316\u8f93\u51fa\u7b49\u6838\u5fc3\u529f\u80fd\n\n## \ud83d\udce6 \u5b89\u88c5\n\n```bash\n# \u4f7f\u7528 uv\uff08\u63a8\u8350\uff09\nuv add onellmclient\n\n# \u6216\u4f7f\u7528 pip\npip install onellmclient\n```\n\n**\u6ce8\u610f**\uff1a\u5b89\u88c5 `onellmclient` \u4f1a\u81ea\u52a8\u5b89\u88c5\u6240\u6709\u652f\u6301\u7684 LLM \u63d0\u4f9b\u5546 SDK\uff08OpenAI\u3001Anthropic\u3001Gemini\uff09\uff0cDeepSeek \u548c xAI \u4f7f\u7528 OpenAI \u517c\u5bb9\u7684 API\uff0c\u65e0\u9700\u989d\u5916\u4f9d\u8d56\u3002\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u57fa\u7840\u7528\u6cd5\n\n```python\nfrom onellmclient import Client\n\n# \u521d\u59cb\u5316\u5ba2\u6237\u7aef\uff08\u652f\u6301\u591a\u4e2a\u5382\u5546\uff09\nclient = Client(\n openai={\"key\": \"your-openai-api-key\"},\n anthropic={\"key\": \"your-anthropic-api-key\"},\n gemini={\"key\": \"your-gemini-api-key\"},\n deepseek={\"key\": \"your-deepseek-api-key\"},\n xai={\"key\": \"your-xai-api-key\"}\n)\n\n# \u8c03\u7528 OpenAI \u6a21\u578b\nresponse = client.completion(\n provider=\"openai\",\n model=\"gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"\u4f60\u597d\uff0c\u8bf7\u4ecb\u7ecd\u4e00\u4e0b\u81ea\u5df1\"}]\n)\nprint(response.content)\n\n# \u5207\u6362\u5230 Anthropic \u6a21\u578b\uff0c\u4ee3\u7801\u51e0\u4e4e\u4e0d\u53d8\nresponse = client.completion(\n provider=\"anthropic\",\n model=\"claude-3-5-sonnet\",\n messages=[{\"role\": \"user\", \"content\": \"\u4f60\u597d\uff0c\u8bf7\u4ecb\u7ecd\u4e00\u4e0b\u81ea\u5df1\"}]\n)\nprint(response.content)\n\n# \u5207\u6362\u5230 DeepSeek \u6a21\u578b\uff0c\u540c\u6837\u7b80\u5355\nresponse = client.completion(\n provider=\"deepseek\",\n model=\"deepseek-v3.2-exp\",\n messages=[{\"role\": \"user\", \"content\": \"\u4f60\u597d\uff0c\u8bf7\u4ecb\u7ecd\u4e00\u4e0b\u81ea\u5df1\"}]\n)\nprint(response.content)\n\n# \u5207\u6362\u5230 xAI Grok \u6a21\u578b\nresponse = client.completion(\n provider=\"xai\",\n model=\"grok-beta\",\n messages=[{\"role\": \"user\", \"content\": \"\u4f60\u597d\uff0c\u8bf7\u4ecb\u7ecd\u4e00\u4e0b\u81ea\u5df1\"}]\n)\nprint(response.content)\n```\n\n### \u9ad8\u7ea7\u529f\u80fd\n\n#### \u7ed3\u6784\u5316\u8f93\u51fa\n\n```python\n# \u5b9a\u4e49 JSON Schema\nschema = {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\"type\": \"string\"},\n \"age\": {\"type\": \"integer\"},\n \"hobbies\": {\"type\": \"array\", \"items\": {\"type\": \"string\"}}\n },\n \"required\": [\"name\", \"age\"]\n}\n\nresponse = client.completion(\n provider=\"openai\",\n model=\"gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"\u8bf7\u4ecb\u7ecd\u4e00\u4e2a\u865a\u6784\u7684\u4eba\u7269\"}],\n schema=schema\n)\n# response.content \u5c06\u662f\u4e00\u4e2a\u7b26\u5408 schema \u7684 JSON \u5b57\u7b26\u4e32\n```\n\n#### \u5de5\u5177\u8c03\u7528\n\n```python\ntools = [\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"get_weather\",\n \"description\": \"\u83b7\u53d6\u6307\u5b9a\u57ce\u5e02\u7684\u5929\u6c14\u4fe1\u606f\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"city\": {\"type\": \"string\", \"description\": \"\u57ce\u5e02\u540d\u79f0\"}\n },\n \"required\": [\"city\"]\n }\n }\n }\n]\n\nresponse = client.completion(\n provider=\"openai\",\n model=\"gpt-4o-mini\",\n messages=[{\"role\": \"user\", \"content\": \"\u5317\u4eac\u4eca\u5929\u5929\u6c14\u600e\u4e48\u6837\uff1f\"}],\n tools=tools\n)\n```\n\n#### \u63a8\u7406\u80fd\u529b\uff08Claude\uff09\n\n```python\nresponse = client.completion(\n provider=\"anthropic\",\n model=\"claude-3-5-sonnet\",\n messages=[{\"role\": \"user\", \"content\": \"\u89e3\u8fd9\u4e2a\u6570\u5b66\u9898\uff1a2x + 5 = 13\"}],\n reasoning_effort=\"medium\" # off, minimal, low, medium, high\n)\n```\n\n## \ud83d\udccb \u652f\u6301\u7684\u5382\u5546\u548c\u6a21\u578b\n\n| \u5382\u5546 | \u652f\u6301\u7684\u6a21\u578b | \u7279\u6b8a\u529f\u80fd |\n|------|------------|----------|\n| **OpenAI** | gpt-4o, gpt-4o-mini, gpt-4, gpt-3.5-turbo \u7b49 | \u7ed3\u6784\u5316\u8f93\u51fa\u3001\u5de5\u5177\u8c03\u7528\u3001\u7f51\u7edc\u641c\u7d22 |\n| **Anthropic** | claude-3-5-sonnet, claude-3-opus, claude-3-haiku \u7b49 | \u63a8\u7406\u80fd\u529b\u3001\u5de5\u5177\u8c03\u7528 |\n| **Gemini** | gemini-1.5-pro, gemini-1.5-flash \u7b49 | \u5de5\u5177\u8c03\u7528 |\n| **DeepSeek** | deepseek-v3.2-exp, deepseek-chat \u7b49 | \u7ed3\u6784\u5316\u8f93\u51fa\u3001\u5de5\u5177\u8c03\u7528 |\n| **xAI** | grok-beta, grok-vision-beta \u7b49 | \u7ed3\u6784\u5316\u8f93\u51fa\u3001\u5de5\u5177\u8c03\u7528\u3001\u63a8\u7406\u80fd\u529b\u3001\u7f51\u7edc\u641c\u7d22 |\n\n## \ud83d\udd27 API \u53c2\u8003\n\n### Client \u521d\u59cb\u5316\n\n```python\nClient(\n openai={\"key\": \"api-key\", \"base\": \"https://api.openai.com/v1\"}, # \u53ef\u9009\n anthropic={\"key\": \"api-key\", \"base\": \"https://api.anthropic.com\"}, # \u53ef\u9009\n gemini={\"key\": \"api-key\", \"base\": \"https://generativelanguage.googleapis.com\"}, # \u53ef\u9009\n deepseek={\"key\": \"api-key\", \"base\": \"https://api.deepseek.com\"}, # \u53ef\u9009\n xai={\"key\": \"api-key\", \"base\": \"https://api.x.ai/v1\"} # \u53ef\u9009\n)\n```\n\n### completion \u65b9\u6cd5\n\n```python\nclient.completion(\n provider: str, # \"openai\", \"anthropic\", \"gemini\", \"deepseek\", \"xai\"\n model: str, # \u6a21\u578b\u540d\u79f0\n messages: List[Dict], # \u6d88\u606f\u5217\u8868\n instructions: Optional[str], # \u7cfb\u7edf\u6307\u4ee4\n schema: Optional[Dict], # JSON Schema\uff08\u7ed3\u6784\u5316\u8f93\u51fa\uff09\n tools: Optional[List[Dict]], # \u5de5\u5177\u5b9a\u4e49\n reasoning_effort: Optional[str], # \u63a8\u7406\u80fd\u529b\uff1a\"off\", \"minimal\", \"low\", \"medium\", \"high\"\uff08Anthropic, xAI\uff09\n temperature: Optional[float], # \u6e29\u5ea6\u53c2\u6570 0-2\n web_search: bool, # \u662f\u5426\u542f\u7528\u7f51\u7edc\u641c\u7d22\uff08OpenAI, xAI\uff09\n tool_choice: Optional[str] # \u5de5\u5177\u9009\u62e9\u7b56\u7565\uff1a\"auto\", \"none\", \"required\"\n)\n```\n\n## \ud83d\udca1 \u6700\u4f73\u5b9e\u8df5\n\n1. **\u73af\u5883\u53d8\u91cf\u7ba1\u7406**\uff1a\u5c06 API \u5bc6\u94a5\u5b58\u50a8\u5728\u73af\u5883\u53d8\u91cf\u4e2d\n```python\nimport os\nclient = Client(\n openai={\"key\": os.getenv(\"OPENAI_API_KEY\")},\n anthropic={\"key\": os.getenv(\"ANTHROPIC_API_KEY\")},\n deepseek={\"key\": os.getenv(\"DEEPSEEK_API_KEY\")},\n xai={\"key\": os.getenv(\"XAI_API_KEY\")}\n)\n```\n\n2. **\u9519\u8bef\u5904\u7406**\uff1a\u6355\u83b7\u7279\u5b9a\u5f02\u5e38\n```python\ntry:\n response = client.completion(provider=\"openai\", model=\"gpt-4\", messages=[...])\nexcept ValueError as e:\n print(f\"\u914d\u7f6e\u9519\u8bef: {e}\")\n```\n\n3. **\u6a21\u578b\u5207\u6362**\uff1a\u4e3a\u4e0d\u540c\u573a\u666f\u9009\u62e9\u5408\u9002\u7684\u6a21\u578b\n```python\n# \u5feb\u901f\u54cd\u5e94\u573a\u666f\nresponse = client.completion(provider=\"openai\", model=\"gpt-4o-mini\", messages=[...])\n\n# \u590d\u6742\u63a8\u7406\u573a\u666f\nresponse = client.completion(provider=\"anthropic\", model=\"claude-3-5-sonnet\", messages=[...], reasoning_effort=\"high\")\n```\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\n\n## \ud83d\udcc4 \u5f00\u6e90\u534f\u8bae\n\nMIT License\n",
"bugtrack_url": null,
"license": "MIT License\n \n Copyright (c) 2025\n \n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n \n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n \n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.",
"summary": "A unified Python client to normalize interfaces across major LLM providers (OpenAI, Anthropic, Gemini, DeepSeek, xAI).",
"version": "0.1.3",
"project_urls": null,
"split_keywords": [
"anthropic",
" client",
" deepseek",
" gemini",
" grok",
" llm",
" openai",
" sdk",
" xai"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "1befe51de552dbc175afcdebfc020a88983472a4d3ebcda9acb11d6404e1e80a",
"md5": "4a69fe9cd330b1de5662f59ccf9851f1",
"sha256": "f94800220b0e267ee21b4e5aac07f244d9d1e17f7ae1e6a94866cdc6944dd516"
},
"downloads": -1,
"filename": "onellmclient-0.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4a69fe9cd330b1de5662f59ccf9851f1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 15841,
"upload_time": "2025-10-21T13:30:09",
"upload_time_iso_8601": "2025-10-21T13:30:09.052806Z",
"url": "https://files.pythonhosted.org/packages/1b/ef/e51de552dbc175afcdebfc020a88983472a4d3ebcda9acb11d6404e1e80a/onellmclient-0.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cd319f3f1a1dfb976f3a737693fade3fa9e8c9087c0b1dac4dd942a0a19deed7",
"md5": "f27aacc7c692ea98adfd83075eb3999d",
"sha256": "124e4f05f2a329580ebfdd9e45025b96429b9e6207bf5361d84fcb18bf860066"
},
"downloads": -1,
"filename": "onellmclient-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "f27aacc7c692ea98adfd83075eb3999d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 70754,
"upload_time": "2025-10-21T13:30:11",
"upload_time_iso_8601": "2025-10-21T13:30:11.227845Z",
"url": "https://files.pythonhosted.org/packages/cd/31/9f3f1a1dfb976f3a737693fade3fa9e8c9087c0b1dac4dd942a0a19deed7/onellmclient-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-21 13:30:11",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "onellmclient"
}