autocoder-cli-sdk


Nameautocoder-cli-sdk JSON
Version 0.0.1 PyPI version JSON
download
home_pageNone
SummaryPython SDK for AutoCoder CLI - 便于在Python代码中调用auto-coder.run功能
upload_time2025-10-19 11:22:07
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseMIT License Copyright (c) 2024 AutoCoder Team 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 ai api autocoder cli code-generation python sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # AutoCoder CLI SDK for Python

一个便于在Python代码中调用`auto-coder.run`功能的SDK,无需直接使用subprocess或fork进程。

## 特性

- 🚀 **易于使用**: 提供简洁直观的API接口
- 🔄 **同步/异步**: 同时支持同步和异步调用方式
- 📡 **流式处理**: 支持实时流式输出和事件处理
- 💬 **会话管理**: 内置会话上下文管理,支持多轮对话
- ⚡ **并发支持**: 异步客户端支持并发查询
- 🛠 **完整配置**: 支持所有auto-coder.run命令行选项
- 📦 **零依赖**: 可选择性使用内部SDK或subprocess调用
- 🐍 **类型提示**: 完整的类型提示支持

## 安装

### 使用 uv (推荐)

```bash
cd cli-sdks/python
uv sync  # 安装依赖并创建虚拟环境
```

### 使用 pip

```bash
cd cli-sdks/python
pip install -e .
```

## 快速开始

### 基础用法(文本格式 - Generator接口)

```python
from autocoder_cli_sdk import AutoCoderClient, QueryOptions

# 创建客户端
client = AutoCoderClient()

# 执行查询,返回generator
options = QueryOptions(output_format="text")

for line in client.query("创建一个Python函数来计算斐波那契数列", options):
    print(line)  # 逐行输出生成的代码
```

### JSON格式输出(Pydantic模型)

```python
from autocoder_cli_sdk import AutoCoderClient, QueryOptions, QueryResponseModel

client = AutoCoderClient()
options = QueryOptions(output_format="json")

for response in client.query("创建一个Python类", options):
    if isinstance(response, QueryResponseModel):
        print(f"事件总数: {response.summary.total_events}")
        print(f"最终结果: {response.final_result}")
```

### 异步用法

```python
import asyncio
from autocoder_cli_sdk import AsyncAutoCoderClient, QueryOptions

async def main():
    async with AsyncAutoCoderClient() as client:
        options = QueryOptions(output_format="text")
        
        async for line in client.query("创建一个Python类来管理任务队列", options):
            print(line)  # 异步逐行输出

asyncio.run(main())
```

### 中止操作

```python
import asyncio
from autocoder_cli_sdk import AsyncAutoCoderClient

async def main():
    async with AsyncAutoCoderClient() as client:
        # 启动查询
        query_task = asyncio.create_task(
            client.query("复杂的查询任务").__anext__()
        )
        
        # 5秒后中止
        await asyncio.sleep(5)
        if client.is_running:
            success = await client.abort()  # 优雅中止
            # 或者 await client.abort_force()  # 强制中止
            
asyncio.run(main())
```

### 流式处理

```python
import asyncio
from autocoder_cli_sdk import AsyncAutoCoderClient

async def main():
    async with AsyncAutoCoderClient() as client:
        async for event in client.stream_query("创建一个Web API"):
            if event.event_type == "content":
                print(event.content, end="", flush=True)

asyncio.run(main())
```

### 会话管理

```python
from autocoder_cli_sdk import AutoCoderClient

client = AutoCoderClient()

# 使用会话上下文进行多轮对话
with client.session() as session:
    # 第一轮
    result1 = session.query("创建一个User类")
    
    # 第二轮(基于第一轮的上下文)
    result2 = session.query("为User类添加验证方法")
    
    # 第三轮
    result3 = session.query("添加单元测试")
```

## API 文档

### 客户端类

#### `AutoCoderClient` (同步客户端)

主要的同步客户端,提供所有基础功能。

```python
class AutoCoderClient:
    def __init__(self, config: Optional[SDKConfig] = None)
    def query(self, prompt: str, options: Optional[QueryOptions] = None) -> QueryResult
    def stream_query(self, prompt: str, options: Optional[QueryOptions] = None) -> Iterator[StreamEvent]
    def configure(self, config_dict: Dict[str, str]) -> ConfigResult
    def session(self, session_id: Optional[str] = None) -> ContextManager
    def get_version(self) -> str
```

#### `AsyncAutoCoderClient` (异步客户端)

异步版本的客户端,支持并发和流式处理。

```python
class AsyncAutoCoderClient:
    async def query(self, prompt: str, options: Optional[QueryOptions] = None) -> QueryResult
    async def stream_query(self, prompt: str, options: Optional[QueryOptions] = None) -> AsyncIterator[StreamEvent]
    async def batch_query(self, prompts: List[str], max_concurrency: int = 3) -> List[QueryResult]
    async def configure(self, config_dict: Dict[str, str]) -> ConfigResult
    async def session(self, session_id: Optional[str] = None) -> AsyncContextManager
```

### 配置类

#### `SDKConfig` (SDK全局配置)

```python
@dataclass
class SDKConfig:
    default_model: Optional[str] = None
    default_max_turns: int = 10000
    default_permission_mode: str = "manual"
    default_output_format: str = "text"
    verbose: bool = False
    default_cwd: Optional[str] = None
    system_prompt_path: Optional[str] = None
    include_rules: bool = False
    default_allowed_tools: Optional[List[str]] = None
```

#### `QueryOptions` (查询选项)

```python
@dataclass
class QueryOptions:
    model: Optional[str] = None
    max_turns: Optional[int] = None
    system_prompt: Optional[str] = None
    output_format: str = "text"
    verbose: bool = False
    cwd: Optional[str] = None
    session_id: Optional[str] = None
    continue_session: bool = False
    allowed_tools: Optional[List[str]] = None
    permission_mode: str = "manual"
    include_rules: bool = False
    pr: bool = False
    is_sub_agent: bool = False
    
    # 异步代理运行器选项
    async_mode: bool = False
    split_mode: str = "h1"
    delimiter: str = "==="
    min_level: int = 1
    max_level: int = 3
    workdir: Optional[str] = None
    from_branch: str = ""
    bg_mode: bool = False
    task_prefix: str = ""
    worktree_name: Optional[str] = None
```

### 响应类

#### `QueryResult` (查询结果)

```python
@dataclass
class QueryResult:
    success: bool
    content: str
    error: Optional[str] = None
    session_id: Optional[str] = None
    events: List[StreamEvent] = field(default_factory=list)
    metadata: Dict[str, Any] = field(default_factory=dict)
    execution_time: Optional[float] = None
    
    @property
    def is_success(self) -> bool
    @property
    def has_error(self) -> bool
```

#### `StreamEvent` (流式事件)

```python
@dataclass
class StreamEvent:
    event_type: str  # start, content, tool_call, completion, error, end
    data: Dict[str, Any]
    timestamp: Optional[datetime] = None
    
    @property
    def is_content(self) -> bool
    @property
    def content(self) -> str
```

## 高级用法

### 自定义配置

```python
from autocoder_cli_sdk import AutoCoderClient, SDKConfig, QueryOptions

# 全局配置
config = SDKConfig(
    default_model="gpt-4",
    default_max_turns=20,
    verbose=True,
    default_permission_mode="acceptEdits"
)

client = AutoCoderClient(config)

# 查询特定选项
options = QueryOptions(
    max_turns=15,
    system_prompt="你是一个Python专家",
    output_format="json",
    include_rules=True
)

result = client.query("创建一个数据结构", options)
```

### 并发查询

```python
import asyncio
from autocoder_cli_sdk import AsyncAutoCoderClient

async def main():
    async with AsyncAutoCoderClient() as client:
        prompts = [
            "创建一个用户管理模块",
            "创建一个日志模块", 
            "创建一个配置管理模块"
        ]
        
        # 并发执行,最大并发数为2
        results = await client.batch_query(prompts, max_concurrency=2)
        
        for i, result in enumerate(results):
            print(f"查询 {i+1}: {'成功' if result.is_success else '失败'}")
```

### 配置管理

```python
from autocoder_cli_sdk import AutoCoderClient

client = AutoCoderClient()

# 设置配置
result = client.configure({
    "model": "gpt-4",
    "max_turns": "25",
    "permission_mode": "acceptEdits"
})

if result.success:
    print("配置更新成功")
    print("应用的配置:", result.applied_configs)
```

### 异步代理运行器

```python
from autocoder_cli_sdk import AutoCoderClient, QueryOptions

client = AutoCoderClient()

# 使用异步代理运行器模式
options = QueryOptions(
    async_mode=True,
    split_mode="h1",
    workdir="/path/to/work",
    bg_mode=False,
    task_prefix="feature-"
)

result = client.query("""
# 任务1:用户管理模块

创建用户管理相关功能...

# 任务2:权限管理模块  

创建权限管理相关功能...
""", options)
```

## 示例项目

查看 `examples/` 目录中的完整示例:

- `basic_usage.py` - 基础用法演示
- `async_usage.py` - 异步用法演示  
- `session_management.py` - 会话管理演示

运行示例:

```bash
# 使用 uv (推荐)
uv run python examples/basic_usage.py
uv run python examples/async_usage.py
uv run python examples/session_management.py

# 或使用开发脚本
python scripts/dev.py example basic_usage
python scripts/dev.py example async_usage
```

## 错误处理

```python
from autocoder_cli_sdk import AutoCoderClient, AutoCoderError, ValidationError

client = AutoCoderClient()

try:
    result = client.query("创建一个函数")
    if result.is_success:
        print(result.content)
    else:
        print("执行失败:", result.error)
        
except ValidationError as e:
    print("参数验证失败:", e)
except AutoCoderError as e:
    print("SDK错误:", e)  
except Exception as e:
    print("未知错误:", e)
```

## 依赖说明

这个SDK设计为可选依赖:

1. **内部SDK模式**: 如果可以导入`autocoder.sdk`模块,将直接使用内部API,性能更好
2. **Subprocess模式**: 如果无法导入内部模块,将回退到调用`auto-coder.run`命令行工具

两种模式API完全一致,用户无需关心底层实现。

## 类型提示

SDK提供完整的类型提示支持,在支持的IDE中可以获得良好的代码补全和类型检查:

```python
from typing import Optional
from autocoder_cli_sdk import AutoCoderClient, QueryOptions, QueryResult

client: AutoCoderClient = AutoCoderClient()
options: Optional[QueryOptions] = QueryOptions(max_turns=10)
result: QueryResult = client.query("prompt", options)
```

## 开发

### 设置开发环境

```bash
cd cli-sdks/python
uv sync  # 安装所有依赖(包括开发依赖)
```

### 开发任务

```bash
# 运行测试
python scripts/dev.py test
# 或直接使用 uv run pytest tests/ -v

# 代码格式化
python scripts/dev.py format
# 或分别运行 uv run black . 和 uv run isort .

# 代码检查
python scripts/dev.py lint
# 或直接使用 uv run flake8 autocoder_cli_sdk/

# 构建包
python scripts/dev.py build
# 或直接使用 uv build

# 运行示例
python scripts/dev.py example basic_usage
```

### 版本管理

项目使用 uv 进行依赖管理:

- `pyproject.toml` - 项目配置和依赖定义
- `uv.lock` - 锁定的依赖版本
- `.venv/` - 虚拟环境(由 uv 自动创建)

## 版本兼容性

- Python 3.7+
- 兼容所有版本的auto-coder.run命令行工具
- 支持asyncio (Python 3.7+)
- 使用 uv 0.8+ 进行包管理

## 许可证

MIT License - 详见 LICENSE 文件。

## 贡献

欢迎提交Issue和Pull Request来改进这个SDK。开发流程:

1. Fork 项目
2. 创建功能分支
3. 使用 `uv sync` 设置开发环境
4. 运行 `python scripts/dev.py test` 确保测试通过
5. 运行 `python scripts/dev.py format` 格式化代码
6. 提交 Pull Request

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "autocoder-cli-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "ai, api, autocoder, cli, code-generation, python, sdk",
    "author": null,
    "author_email": "AutoCoder Team <support@autocoder.com>",
    "download_url": "https://files.pythonhosted.org/packages/44/96/316c989d907b077fb6cd8287a8f3144a7285fa5d5c53198082e3b90a7e0a/autocoder_cli_sdk-0.0.1.tar.gz",
    "platform": null,
    "description": "# AutoCoder CLI SDK for Python\n\n\u4e00\u4e2a\u4fbf\u4e8e\u5728Python\u4ee3\u7801\u4e2d\u8c03\u7528`auto-coder.run`\u529f\u80fd\u7684SDK\uff0c\u65e0\u9700\u76f4\u63a5\u4f7f\u7528subprocess\u6216fork\u8fdb\u7a0b\u3002\n\n## \u7279\u6027\n\n- \ud83d\ude80 **\u6613\u4e8e\u4f7f\u7528**: \u63d0\u4f9b\u7b80\u6d01\u76f4\u89c2\u7684API\u63a5\u53e3\n- \ud83d\udd04 **\u540c\u6b65/\u5f02\u6b65**: \u540c\u65f6\u652f\u6301\u540c\u6b65\u548c\u5f02\u6b65\u8c03\u7528\u65b9\u5f0f\n- \ud83d\udce1 **\u6d41\u5f0f\u5904\u7406**: \u652f\u6301\u5b9e\u65f6\u6d41\u5f0f\u8f93\u51fa\u548c\u4e8b\u4ef6\u5904\u7406\n- \ud83d\udcac **\u4f1a\u8bdd\u7ba1\u7406**: \u5185\u7f6e\u4f1a\u8bdd\u4e0a\u4e0b\u6587\u7ba1\u7406\uff0c\u652f\u6301\u591a\u8f6e\u5bf9\u8bdd\n- \u26a1 **\u5e76\u53d1\u652f\u6301**: \u5f02\u6b65\u5ba2\u6237\u7aef\u652f\u6301\u5e76\u53d1\u67e5\u8be2\n- \ud83d\udee0 **\u5b8c\u6574\u914d\u7f6e**: \u652f\u6301\u6240\u6709auto-coder.run\u547d\u4ee4\u884c\u9009\u9879\n- \ud83d\udce6 **\u96f6\u4f9d\u8d56**: \u53ef\u9009\u62e9\u6027\u4f7f\u7528\u5185\u90e8SDK\u6216subprocess\u8c03\u7528\n- \ud83d\udc0d **\u7c7b\u578b\u63d0\u793a**: \u5b8c\u6574\u7684\u7c7b\u578b\u63d0\u793a\u652f\u6301\n\n## \u5b89\u88c5\n\n### \u4f7f\u7528 uv (\u63a8\u8350)\n\n```bash\ncd cli-sdks/python\nuv sync  # \u5b89\u88c5\u4f9d\u8d56\u5e76\u521b\u5efa\u865a\u62df\u73af\u5883\n```\n\n### \u4f7f\u7528 pip\n\n```bash\ncd cli-sdks/python\npip install -e .\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u57fa\u7840\u7528\u6cd5\uff08\u6587\u672c\u683c\u5f0f - Generator\u63a5\u53e3\uff09\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient, QueryOptions\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\nclient = AutoCoderClient()\n\n# \u6267\u884c\u67e5\u8be2\uff0c\u8fd4\u56degenerator\noptions = QueryOptions(output_format=\"text\")\n\nfor line in client.query(\"\u521b\u5efa\u4e00\u4e2aPython\u51fd\u6570\u6765\u8ba1\u7b97\u6590\u6ce2\u90a3\u5951\u6570\u5217\", options):\n    print(line)  # \u9010\u884c\u8f93\u51fa\u751f\u6210\u7684\u4ee3\u7801\n```\n\n### JSON\u683c\u5f0f\u8f93\u51fa\uff08Pydantic\u6a21\u578b\uff09\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient, QueryOptions, QueryResponseModel\n\nclient = AutoCoderClient()\noptions = QueryOptions(output_format=\"json\")\n\nfor response in client.query(\"\u521b\u5efa\u4e00\u4e2aPython\u7c7b\", options):\n    if isinstance(response, QueryResponseModel):\n        print(f\"\u4e8b\u4ef6\u603b\u6570: {response.summary.total_events}\")\n        print(f\"\u6700\u7ec8\u7ed3\u679c: {response.final_result}\")\n```\n\n### \u5f02\u6b65\u7528\u6cd5\n\n```python\nimport asyncio\nfrom autocoder_cli_sdk import AsyncAutoCoderClient, QueryOptions\n\nasync def main():\n    async with AsyncAutoCoderClient() as client:\n        options = QueryOptions(output_format=\"text\")\n        \n        async for line in client.query(\"\u521b\u5efa\u4e00\u4e2aPython\u7c7b\u6765\u7ba1\u7406\u4efb\u52a1\u961f\u5217\", options):\n            print(line)  # \u5f02\u6b65\u9010\u884c\u8f93\u51fa\n\nasyncio.run(main())\n```\n\n### \u4e2d\u6b62\u64cd\u4f5c\n\n```python\nimport asyncio\nfrom autocoder_cli_sdk import AsyncAutoCoderClient\n\nasync def main():\n    async with AsyncAutoCoderClient() as client:\n        # \u542f\u52a8\u67e5\u8be2\n        query_task = asyncio.create_task(\n            client.query(\"\u590d\u6742\u7684\u67e5\u8be2\u4efb\u52a1\").__anext__()\n        )\n        \n        # 5\u79d2\u540e\u4e2d\u6b62\n        await asyncio.sleep(5)\n        if client.is_running:\n            success = await client.abort()  # \u4f18\u96c5\u4e2d\u6b62\n            # \u6216\u8005 await client.abort_force()  # \u5f3a\u5236\u4e2d\u6b62\n            \nasyncio.run(main())\n```\n\n### \u6d41\u5f0f\u5904\u7406\n\n```python\nimport asyncio\nfrom autocoder_cli_sdk import AsyncAutoCoderClient\n\nasync def main():\n    async with AsyncAutoCoderClient() as client:\n        async for event in client.stream_query(\"\u521b\u5efa\u4e00\u4e2aWeb API\"):\n            if event.event_type == \"content\":\n                print(event.content, end=\"\", flush=True)\n\nasyncio.run(main())\n```\n\n### \u4f1a\u8bdd\u7ba1\u7406\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient\n\nclient = AutoCoderClient()\n\n# \u4f7f\u7528\u4f1a\u8bdd\u4e0a\u4e0b\u6587\u8fdb\u884c\u591a\u8f6e\u5bf9\u8bdd\nwith client.session() as session:\n    # \u7b2c\u4e00\u8f6e\n    result1 = session.query(\"\u521b\u5efa\u4e00\u4e2aUser\u7c7b\")\n    \n    # \u7b2c\u4e8c\u8f6e\uff08\u57fa\u4e8e\u7b2c\u4e00\u8f6e\u7684\u4e0a\u4e0b\u6587\uff09\n    result2 = session.query(\"\u4e3aUser\u7c7b\u6dfb\u52a0\u9a8c\u8bc1\u65b9\u6cd5\")\n    \n    # \u7b2c\u4e09\u8f6e\n    result3 = session.query(\"\u6dfb\u52a0\u5355\u5143\u6d4b\u8bd5\")\n```\n\n## API \u6587\u6863\n\n### \u5ba2\u6237\u7aef\u7c7b\n\n#### `AutoCoderClient` (\u540c\u6b65\u5ba2\u6237\u7aef)\n\n\u4e3b\u8981\u7684\u540c\u6b65\u5ba2\u6237\u7aef\uff0c\u63d0\u4f9b\u6240\u6709\u57fa\u7840\u529f\u80fd\u3002\n\n```python\nclass AutoCoderClient:\n    def __init__(self, config: Optional[SDKConfig] = None)\n    def query(self, prompt: str, options: Optional[QueryOptions] = None) -> QueryResult\n    def stream_query(self, prompt: str, options: Optional[QueryOptions] = None) -> Iterator[StreamEvent]\n    def configure(self, config_dict: Dict[str, str]) -> ConfigResult\n    def session(self, session_id: Optional[str] = None) -> ContextManager\n    def get_version(self) -> str\n```\n\n#### `AsyncAutoCoderClient` (\u5f02\u6b65\u5ba2\u6237\u7aef)\n\n\u5f02\u6b65\u7248\u672c\u7684\u5ba2\u6237\u7aef\uff0c\u652f\u6301\u5e76\u53d1\u548c\u6d41\u5f0f\u5904\u7406\u3002\n\n```python\nclass AsyncAutoCoderClient:\n    async def query(self, prompt: str, options: Optional[QueryOptions] = None) -> QueryResult\n    async def stream_query(self, prompt: str, options: Optional[QueryOptions] = None) -> AsyncIterator[StreamEvent]\n    async def batch_query(self, prompts: List[str], max_concurrency: int = 3) -> List[QueryResult]\n    async def configure(self, config_dict: Dict[str, str]) -> ConfigResult\n    async def session(self, session_id: Optional[str] = None) -> AsyncContextManager\n```\n\n### \u914d\u7f6e\u7c7b\n\n#### `SDKConfig` (SDK\u5168\u5c40\u914d\u7f6e)\n\n```python\n@dataclass\nclass SDKConfig:\n    default_model: Optional[str] = None\n    default_max_turns: int = 10000\n    default_permission_mode: str = \"manual\"\n    default_output_format: str = \"text\"\n    verbose: bool = False\n    default_cwd: Optional[str] = None\n    system_prompt_path: Optional[str] = None\n    include_rules: bool = False\n    default_allowed_tools: Optional[List[str]] = None\n```\n\n#### `QueryOptions` (\u67e5\u8be2\u9009\u9879)\n\n```python\n@dataclass\nclass QueryOptions:\n    model: Optional[str] = None\n    max_turns: Optional[int] = None\n    system_prompt: Optional[str] = None\n    output_format: str = \"text\"\n    verbose: bool = False\n    cwd: Optional[str] = None\n    session_id: Optional[str] = None\n    continue_session: bool = False\n    allowed_tools: Optional[List[str]] = None\n    permission_mode: str = \"manual\"\n    include_rules: bool = False\n    pr: bool = False\n    is_sub_agent: bool = False\n    \n    # \u5f02\u6b65\u4ee3\u7406\u8fd0\u884c\u5668\u9009\u9879\n    async_mode: bool = False\n    split_mode: str = \"h1\"\n    delimiter: str = \"===\"\n    min_level: int = 1\n    max_level: int = 3\n    workdir: Optional[str] = None\n    from_branch: str = \"\"\n    bg_mode: bool = False\n    task_prefix: str = \"\"\n    worktree_name: Optional[str] = None\n```\n\n### \u54cd\u5e94\u7c7b\n\n#### `QueryResult` (\u67e5\u8be2\u7ed3\u679c)\n\n```python\n@dataclass\nclass QueryResult:\n    success: bool\n    content: str\n    error: Optional[str] = None\n    session_id: Optional[str] = None\n    events: List[StreamEvent] = field(default_factory=list)\n    metadata: Dict[str, Any] = field(default_factory=dict)\n    execution_time: Optional[float] = None\n    \n    @property\n    def is_success(self) -> bool\n    @property\n    def has_error(self) -> bool\n```\n\n#### `StreamEvent` (\u6d41\u5f0f\u4e8b\u4ef6)\n\n```python\n@dataclass\nclass StreamEvent:\n    event_type: str  # start, content, tool_call, completion, error, end\n    data: Dict[str, Any]\n    timestamp: Optional[datetime] = None\n    \n    @property\n    def is_content(self) -> bool\n    @property\n    def content(self) -> str\n```\n\n## \u9ad8\u7ea7\u7528\u6cd5\n\n### \u81ea\u5b9a\u4e49\u914d\u7f6e\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient, SDKConfig, QueryOptions\n\n# \u5168\u5c40\u914d\u7f6e\nconfig = SDKConfig(\n    default_model=\"gpt-4\",\n    default_max_turns=20,\n    verbose=True,\n    default_permission_mode=\"acceptEdits\"\n)\n\nclient = AutoCoderClient(config)\n\n# \u67e5\u8be2\u7279\u5b9a\u9009\u9879\noptions = QueryOptions(\n    max_turns=15,\n    system_prompt=\"\u4f60\u662f\u4e00\u4e2aPython\u4e13\u5bb6\",\n    output_format=\"json\",\n    include_rules=True\n)\n\nresult = client.query(\"\u521b\u5efa\u4e00\u4e2a\u6570\u636e\u7ed3\u6784\", options)\n```\n\n### \u5e76\u53d1\u67e5\u8be2\n\n```python\nimport asyncio\nfrom autocoder_cli_sdk import AsyncAutoCoderClient\n\nasync def main():\n    async with AsyncAutoCoderClient() as client:\n        prompts = [\n            \"\u521b\u5efa\u4e00\u4e2a\u7528\u6237\u7ba1\u7406\u6a21\u5757\",\n            \"\u521b\u5efa\u4e00\u4e2a\u65e5\u5fd7\u6a21\u5757\", \n            \"\u521b\u5efa\u4e00\u4e2a\u914d\u7f6e\u7ba1\u7406\u6a21\u5757\"\n        ]\n        \n        # \u5e76\u53d1\u6267\u884c\uff0c\u6700\u5927\u5e76\u53d1\u6570\u4e3a2\n        results = await client.batch_query(prompts, max_concurrency=2)\n        \n        for i, result in enumerate(results):\n            print(f\"\u67e5\u8be2 {i+1}: {'\u6210\u529f' if result.is_success else '\u5931\u8d25'}\")\n```\n\n### \u914d\u7f6e\u7ba1\u7406\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient\n\nclient = AutoCoderClient()\n\n# \u8bbe\u7f6e\u914d\u7f6e\nresult = client.configure({\n    \"model\": \"gpt-4\",\n    \"max_turns\": \"25\",\n    \"permission_mode\": \"acceptEdits\"\n})\n\nif result.success:\n    print(\"\u914d\u7f6e\u66f4\u65b0\u6210\u529f\")\n    print(\"\u5e94\u7528\u7684\u914d\u7f6e:\", result.applied_configs)\n```\n\n### \u5f02\u6b65\u4ee3\u7406\u8fd0\u884c\u5668\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient, QueryOptions\n\nclient = AutoCoderClient()\n\n# \u4f7f\u7528\u5f02\u6b65\u4ee3\u7406\u8fd0\u884c\u5668\u6a21\u5f0f\noptions = QueryOptions(\n    async_mode=True,\n    split_mode=\"h1\",\n    workdir=\"/path/to/work\",\n    bg_mode=False,\n    task_prefix=\"feature-\"\n)\n\nresult = client.query(\"\"\"\n# \u4efb\u52a11\uff1a\u7528\u6237\u7ba1\u7406\u6a21\u5757\n\n\u521b\u5efa\u7528\u6237\u7ba1\u7406\u76f8\u5173\u529f\u80fd...\n\n# \u4efb\u52a12\uff1a\u6743\u9650\u7ba1\u7406\u6a21\u5757  \n\n\u521b\u5efa\u6743\u9650\u7ba1\u7406\u76f8\u5173\u529f\u80fd...\n\"\"\", options)\n```\n\n## \u793a\u4f8b\u9879\u76ee\n\n\u67e5\u770b `examples/` \u76ee\u5f55\u4e2d\u7684\u5b8c\u6574\u793a\u4f8b\uff1a\n\n- `basic_usage.py` - \u57fa\u7840\u7528\u6cd5\u6f14\u793a\n- `async_usage.py` - \u5f02\u6b65\u7528\u6cd5\u6f14\u793a  \n- `session_management.py` - \u4f1a\u8bdd\u7ba1\u7406\u6f14\u793a\n\n\u8fd0\u884c\u793a\u4f8b\uff1a\n\n```bash\n# \u4f7f\u7528 uv (\u63a8\u8350)\nuv run python examples/basic_usage.py\nuv run python examples/async_usage.py\nuv run python examples/session_management.py\n\n# \u6216\u4f7f\u7528\u5f00\u53d1\u811a\u672c\npython scripts/dev.py example basic_usage\npython scripts/dev.py example async_usage\n```\n\n## \u9519\u8bef\u5904\u7406\n\n```python\nfrom autocoder_cli_sdk import AutoCoderClient, AutoCoderError, ValidationError\n\nclient = AutoCoderClient()\n\ntry:\n    result = client.query(\"\u521b\u5efa\u4e00\u4e2a\u51fd\u6570\")\n    if result.is_success:\n        print(result.content)\n    else:\n        print(\"\u6267\u884c\u5931\u8d25:\", result.error)\n        \nexcept ValidationError as e:\n    print(\"\u53c2\u6570\u9a8c\u8bc1\u5931\u8d25:\", e)\nexcept AutoCoderError as e:\n    print(\"SDK\u9519\u8bef:\", e)  \nexcept Exception as e:\n    print(\"\u672a\u77e5\u9519\u8bef:\", e)\n```\n\n## \u4f9d\u8d56\u8bf4\u660e\n\n\u8fd9\u4e2aSDK\u8bbe\u8ba1\u4e3a\u53ef\u9009\u4f9d\u8d56\uff1a\n\n1. **\u5185\u90e8SDK\u6a21\u5f0f**: \u5982\u679c\u53ef\u4ee5\u5bfc\u5165`autocoder.sdk`\u6a21\u5757\uff0c\u5c06\u76f4\u63a5\u4f7f\u7528\u5185\u90e8API\uff0c\u6027\u80fd\u66f4\u597d\n2. **Subprocess\u6a21\u5f0f**: \u5982\u679c\u65e0\u6cd5\u5bfc\u5165\u5185\u90e8\u6a21\u5757\uff0c\u5c06\u56de\u9000\u5230\u8c03\u7528`auto-coder.run`\u547d\u4ee4\u884c\u5de5\u5177\n\n\u4e24\u79cd\u6a21\u5f0fAPI\u5b8c\u5168\u4e00\u81f4\uff0c\u7528\u6237\u65e0\u9700\u5173\u5fc3\u5e95\u5c42\u5b9e\u73b0\u3002\n\n## \u7c7b\u578b\u63d0\u793a\n\nSDK\u63d0\u4f9b\u5b8c\u6574\u7684\u7c7b\u578b\u63d0\u793a\u652f\u6301\uff0c\u5728\u652f\u6301\u7684IDE\u4e2d\u53ef\u4ee5\u83b7\u5f97\u826f\u597d\u7684\u4ee3\u7801\u8865\u5168\u548c\u7c7b\u578b\u68c0\u67e5\uff1a\n\n```python\nfrom typing import Optional\nfrom autocoder_cli_sdk import AutoCoderClient, QueryOptions, QueryResult\n\nclient: AutoCoderClient = AutoCoderClient()\noptions: Optional[QueryOptions] = QueryOptions(max_turns=10)\nresult: QueryResult = client.query(\"prompt\", options)\n```\n\n## \u5f00\u53d1\n\n### \u8bbe\u7f6e\u5f00\u53d1\u73af\u5883\n\n```bash\ncd cli-sdks/python\nuv sync  # \u5b89\u88c5\u6240\u6709\u4f9d\u8d56\uff08\u5305\u62ec\u5f00\u53d1\u4f9d\u8d56\uff09\n```\n\n### \u5f00\u53d1\u4efb\u52a1\n\n```bash\n# \u8fd0\u884c\u6d4b\u8bd5\npython scripts/dev.py test\n# \u6216\u76f4\u63a5\u4f7f\u7528 uv run pytest tests/ -v\n\n# \u4ee3\u7801\u683c\u5f0f\u5316\npython scripts/dev.py format\n# \u6216\u5206\u522b\u8fd0\u884c uv run black . \u548c uv run isort .\n\n# \u4ee3\u7801\u68c0\u67e5\npython scripts/dev.py lint\n# \u6216\u76f4\u63a5\u4f7f\u7528 uv run flake8 autocoder_cli_sdk/\n\n# \u6784\u5efa\u5305\npython scripts/dev.py build\n# \u6216\u76f4\u63a5\u4f7f\u7528 uv build\n\n# \u8fd0\u884c\u793a\u4f8b\npython scripts/dev.py example basic_usage\n```\n\n### \u7248\u672c\u7ba1\u7406\n\n\u9879\u76ee\u4f7f\u7528 uv \u8fdb\u884c\u4f9d\u8d56\u7ba1\u7406\uff1a\n\n- `pyproject.toml` - \u9879\u76ee\u914d\u7f6e\u548c\u4f9d\u8d56\u5b9a\u4e49\n- `uv.lock` - \u9501\u5b9a\u7684\u4f9d\u8d56\u7248\u672c\n- `.venv/` - \u865a\u62df\u73af\u5883\uff08\u7531 uv \u81ea\u52a8\u521b\u5efa\uff09\n\n## \u7248\u672c\u517c\u5bb9\u6027\n\n- Python 3.7+\n- \u517c\u5bb9\u6240\u6709\u7248\u672c\u7684auto-coder.run\u547d\u4ee4\u884c\u5de5\u5177\n- \u652f\u6301asyncio (Python 3.7+)\n- \u4f7f\u7528 uv 0.8+ \u8fdb\u884c\u5305\u7ba1\u7406\n\n## \u8bb8\u53ef\u8bc1\n\nMIT License - \u8be6\u89c1 LICENSE \u6587\u4ef6\u3002\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\u6765\u6539\u8fdb\u8fd9\u4e2aSDK\u3002\u5f00\u53d1\u6d41\u7a0b\uff1a\n\n1. Fork \u9879\u76ee\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f\n3. \u4f7f\u7528 `uv sync` \u8bbe\u7f6e\u5f00\u53d1\u73af\u5883\n4. \u8fd0\u884c `python scripts/dev.py test` \u786e\u4fdd\u6d4b\u8bd5\u901a\u8fc7\n5. \u8fd0\u884c `python scripts/dev.py format` \u683c\u5f0f\u5316\u4ee3\u7801\n6. \u63d0\u4ea4 Pull Request\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2024 AutoCoder Team\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": "Python SDK for AutoCoder CLI - \u4fbf\u4e8e\u5728Python\u4ee3\u7801\u4e2d\u8c03\u7528auto-coder.run\u529f\u80fd",
    "version": "0.0.1",
    "project_urls": {
        "Bug Tracker": "https://github.com/your-org/auto-coder/issues",
        "Documentation": "https://github.com/your-org/auto-coder/tree/master/cli-sdks/python",
        "Homepage": "https://github.com/your-org/auto-coder",
        "Repository": "https://github.com/your-org/auto-coder"
    },
    "split_keywords": [
        "ai",
        " api",
        " autocoder",
        " cli",
        " code-generation",
        " python",
        " sdk"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "db96ddc3a380f047ad80af1a4a31c562faf5c829e639cf5115e081220b0e5186",
                "md5": "fd1a1fbb6355a67ef48e0666c08ba7df",
                "sha256": "7ded507d74b7cda872abe8ffe3f0af7741a28c9553462c0df4e7a55f01da3943"
            },
            "downloads": -1,
            "filename": "autocoder_cli_sdk-0.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fd1a1fbb6355a67ef48e0666c08ba7df",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 29797,
            "upload_time": "2025-10-19T11:22:04",
            "upload_time_iso_8601": "2025-10-19T11:22:04.882237Z",
            "url": "https://files.pythonhosted.org/packages/db/96/ddc3a380f047ad80af1a4a31c562faf5c829e639cf5115e081220b0e5186/autocoder_cli_sdk-0.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4496316c989d907b077fb6cd8287a8f3144a7285fa5d5c53198082e3b90a7e0a",
                "md5": "86e66d2a61522fa739676951c89ad891",
                "sha256": "235153989505d885a2388c2788ec3203eb404a499f1c3604f58874b6f936befd"
            },
            "downloads": -1,
            "filename": "autocoder_cli_sdk-0.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "86e66d2a61522fa739676951c89ad891",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 141839,
            "upload_time": "2025-10-19T11:22:07",
            "upload_time_iso_8601": "2025-10-19T11:22:07.235818Z",
            "url": "https://files.pythonhosted.org/packages/44/96/316c989d907b077fb6cd8287a8f3144a7285fa5d5c53198082e3b90a7e0a/autocoder_cli_sdk-0.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-19 11:22:07",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "your-org",
    "github_project": "auto-coder",
    "github_not_found": true,
    "lcname": "autocoder-cli-sdk"
}
        
Elapsed time: 0.97062s