sii-agent-sdk


Namesii-agent-sdk JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryPython SDK for SII-CLI - AI Agent Framework
upload_time2025-10-06 13:54:51
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseApache-2.0
keywords ai agent sii gemini assistant
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # SII Agent SDK for Python

Python SDK for SII-CLI - AI Agent Framework

[![Python Version](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![Node.js](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen.svg)](https://nodejs.org/)

## 概述

SII Agent SDK 是 SII-CLI 的 Python 接口,使 Python 开发者能够通过编程方式调用 SII-CLI 的强大 AI 智能体功能。

本项目设计参考了 [claude-agent-sdk-python](https://github.com/anthropics/claude-agent-sdk-python),提供相似的 API 体验,同时集成了 SII 的特色功能。

### 主要特性

- ✅ **Claude SDK 风格 API**: API 设计参考 claude-agent-sdk-python,降低学习成本
- ✅ **YOLO 自主执行**: 一句话触发,AI 自动完成任务(基于 SimpleYoloAgent)
- ✅ **多认证支持**: 支持 USE_SII, USE_GEMINI, USE_OPENAI 等多种认证方式
- ✅ **SII 专属工具**: 深度集成 sii_cognitions, sii_deep_research, sii_hybrid_search 等工具
- ✅ **流式响应**: 基于 JSONL 协议,实时返回执行进度和结果
- ✅ **类型安全**: 完整的类型提示和 IDE 支持
- ✅ **进程隔离**: 通过 Node.js Bridge 实现 Python 与 SII-CLI Core 的进程间通信

## 架构设计

```
┌─────────────────┐         JSONL Protocol          ┌──────────────────┐
│                 │      (stdin/stdout/stderr)       │                  │
│  Python SDK     │◄────────────────────────────────►│  Node.js Bridge  │
│  (用户代码)     │                                  │  (sii-bridge)    │
│                 │                                  │                  │
└─────────────────┘                                  └──────────────────┘
                                                              │
                                                              │ 直接调用
                                                              ▼
                                                     ┌──────────────────┐
                                                     │  SII-CLI Core    │
                                                     │  - AgentService  │
                                                     │  - SimpleYolo    │
                                                     │  - ToolRegistry  │
                                                     └──────────────────┘
```

### 组件说明

1. **Python SDK** (`sii_agent_sdk/`)
   - 提供 Pythonic 的 API 接口
   - 管理 Bridge 进程生命周期
   - 解析 JSONL 事件流
   - 类型安全的消息封装

2. **Node.js Bridge** (`bridge/`)
   - 桥接 Python 和 Node.js 生态
   - 处理 JSONL 协议通信
   - 管理 SII-CLI Core 实例
   - 提供进程隔离和错误恢复

3. **SII-CLI Core** (`../core/`)
   - 复用现有的核心功能
   - AgentService: 对话式交互
   - SimpleYoloAgent: 自主执行
   - ToolRegistry: 工具管理

## 安装

### 前置要求

- **Python**: >= 3.10
- **Node.js**: >= 20.0.0
- **SII-CLI**: 已构建的 `@gair/sii-cli-core` 包

### 从源码安装(推荐开发环境)

```bash
# 1. 克隆仓库
git clone https://github.com/GAIR-NLP/sii-cli.git
cd sii-cli

# 2. 安装依赖并构建项目
npm install
npm run build

# 3. 安装 Python SDK
cd packages/python-sdk
pip install -e ".[dev]"

# 4. 验证安装
python -c "from sii_agent_sdk import query; print('安装成功!')"
```

> 💡 **构建说明**:
>
> - `npm run build` 会自动构建所有依赖包(包括 core 和 bridge)
> - Bridge 包依赖于 core 包,构建脚本会自动确保依赖顺序正确
> - 如果遇到构建问题,请先运行 `npm run build --workspace=@gair/sii-cli-core` 确保 core 包已构建

## 认证方式

SDK 支持 SII-CLI 的所有认证方式。不同认证方式决定了可用的工具集:

| 认证类型         | 说明           | 环境变量                       | 可用工具                |
| ---------------- | -------------- | ------------------------------ | ----------------------- |
| `USE_SII` (默认) | SII 平台认证   | `SII_USERNAME`和`SII_PASSWORD` | 所有工具 + SII 专属工具 |
| `USE_OPENAI`     | OpenAI API Key | `OPENAI_API_KEY`               | 基础工具                |

### 配置认证

方式 1: 通过代码设置

```python
from sii_agent_sdk import query, SiiAgentOptions

async for message in query(
    prompt="你的任务",
    options=SiiAgentOptions(auth_type="USE_GEMINI")
):
    print(message)
```

方式 2: 通过环境变量

```bash
# SII CLI automatically configures these when using interactive authentication
export SII_OPENAI_API_KEY="your_api_key_here"
export SII_OPENAI_BASE_URL="your_api_endpoint"
export SII_OPENAI_MODEL="your_model_choice"

# For SII Account authentication
export SII_USERNAME="your_username"
export SII_PASSWORD="your_password"
export SII_BASE_URL="https://www.opensii.ai/backend"
export SII_OPENAI_MODEL="your_model_choice"  # Shared model setting
```

```python
from sii_agent_sdk import query

# 自动从环境变量读取认证信息
async for message in query(prompt="你的任务"):
    print(message)
```

### 从 PyPI 安装(未来支持)

```bash
pip install sii-agent-sdk
```

## 快速开始

### 1. 基础查询

最简单的用法,使用默认配置:

```python
import anyio
from sii_agent_sdk import query

async def main():
    async for message in query(prompt="列出当前目录的所有文件"):
        print(message)

anyio.run(main)
```

### 2. YOLO 自主执行模式

让 AI 自动执行所有步骤,无需人工确认:

```python
import anyio
from sii_agent_sdk import query, SiiAgentOptions

async def main():
    # YOLO 模式 - AI 自动执行所有工具调用
    async for message in query(
        prompt="创建一个 README.md 文件,包含项目简介和安装说明",
        options=SiiAgentOptions(
            yolo=True,
            max_turns=10,
            allowed_tools=["write_file", "read_file", "list_dir"]
        )
    ):
        if message.type == "assistant_message":
            print(f"🤖 助手: {message.content[0].text}")
        elif message.type == "tool_call":
            print(f"🔧 工具调用: {message.tool_name}")
        elif message.type == "completed":
            print(f"✅ 完成!用时: {message.metadata.time_elapsed}ms")

anyio.run(main)
```

### 3. 使用 SII 专属工具

充分利用 SII 平台的认知能力:

```python
import anyio
from sii_agent_sdk import query, SiiAgentOptions

async def main():
    # 使用 SII 认知数据库和混合搜索
    async for message in query(
        prompt="搜索最新的大语言模型训练技术研究进展",
        options=SiiAgentOptions(
            auth_type="USE_SII",
            allowed_tools=[
                "sii_cognitions",
                "sii_deep_research",
                "sii_hybrid_search"
            ],
            max_turns=5
        )
    ):
        if message.type == "assistant_message":
            print(message.content[0].text)

anyio.run(main)
```

### 4. 指定工作目录和模型

自定义执行环境:

```python
import anyio
from sii_agent_sdk import query, SiiAgentOptions

async def main():
    async for message in query(
        prompt="分析 src/ 目录下的代码结构",
        options=SiiAgentOptions(
            cwd="/path/to/your/project",
            model="gemini-2.0-flash-exp",
            temperature=0.7,
            max_turns=8,
            allowed_tools=["read_file", "list_dir", "grep_search"]
        )
    ):
        print(message)

anyio.run(main)
```

### 5. 持久会话(未来支持)

保持多轮对话上下文:

```python
import anyio
from sii_agent_sdk import SiiSDKClient, SiiAgentOptions

async def main():
    # 注意:SiiSDKClient 功能尚未完全实现
    async with SiiSDKClient(
        options=SiiAgentOptions(auth_type="USE_SII")
    ) as client:
        # 第一轮对话
        await client.query("分析这个项目的结构")
        async for msg in client.receive_response():
            print(msg)

        # 第二轮对话 - 基于上下文
        await client.query("基于刚才的分析,创建一个改进计划")
        async for msg in client.receive_response():
            print(msg)

anyio.run(main)
```

## API 参考

### `query()` 函数

简单的一次性查询接口,适合大多数场景。

```python
async def query(
    prompt: str,
    *,
    options: SiiAgentOptions | None = None
) -> AsyncIterator[Message]
```

**参数**:

- `prompt`: 用户输入的任务描述
- `options`: 可选的配置选项(见下文)

**返回**: 异步迭代器,产生 `Message` 对象

### `SiiAgentOptions` 配置

```python
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class SiiAgentOptions:
    # 认证配置
    auth_type: Optional[str] = None  # "USE_SII", "USE_GEMINI", "USE_OPENAI"

    # 执行模式
    yolo: bool = False               # YOLO 自主执行模式
    max_turns: int = 10              # 最大对话轮数
    timeout_ms: int = 120000         # 超时时间(毫秒)

    # 工具控制
    allowed_tools: Optional[List[str]] = None  # 允许使用的工具白名单

    # 模型配置
    model: Optional[str] = None      # 模型名称,如 "gemini-2.0-flash-exp"
    temperature: Optional[float] = None  # 温度参数 (0.0-2.0)
    system_prompt: Optional[str] = None  # 自定义系统提示

    # 环境配置
    cwd: Optional[str] = None        # 工作目录
    session_id: Optional[str] = None # 会话 ID
```

### Message 类型

所有消息都继承自 `Message` 基类:

```python
# 状态消息
class StatusMessage(Message):
    type: Literal["status"]
    status: str                      # "initializing", "authenticating", "ready", "running"
    message: str
    auth_type: Optional[str]
    available_tools: Optional[List[str]]

# 助手消息
class AssistantMessage(Message):
    type: Literal["assistant_message"]
    role: Literal["assistant"]
    content: List[ContentBlock]      # 内容块列表

# 工具调用
class ToolCallMessage(Message):
    type: Literal["tool_call"]
    tool_name: str
    tool_call_id: str
    args: Dict[str, Any]

# 工具结果
class ToolResultMessage(Message):
    type: Literal["tool_result"]
    tool_call_id: str
    result: Dict[str, Any]

# 完成消息
class CompletedMessage(Message):
    type: Literal["completed"]
    metadata: Dict[str, Any]         # turns_used, time_elapsed, tokens_used

# 错误消息
class ErrorMessage(Message):
    type: Literal["error"]
    error: Dict[str, Any]            # code, message, details
```

## 示例

### 完整示例代码

查看 `examples/` 目录获取更多示例:

```
examples/
├── quick_start.py          # 快速入门
├── yolo_example.py         # YOLO 模式演示
├── auth_modes.py           # 多认证方式
├── tool_filtering.py       # 工具过滤
├── error_handling.py       # 错误处理
└── advanced_usage.py       # 高级用法
```

运行示例:

```bash
cd examples
python quick_start.py
```

## 开发

### 项目结构

```
packages/python-sdk/
├── sii_agent_sdk/              # Python SDK 源码
│   ├── __init__.py
│   ├── query.py                # query() 函数实现
│   ├── types.py                # 类型定义
│   ├── errors.py               # 异常类
│   ├── bridge.py               # Bridge 进程管理
│   └── _internal/              # 内部实现
│       ├── protocol.py         # JSONL 协议解析
│       └── process.py          # 进程管理
├── bridge/                     # Node.js Bridge
│   ├── src/
│   │   ├── index.ts            # Bridge 入口
│   │   ├── protocol.ts         # 协议处理
│   │   ├── executor.ts         # 执行器
│   │   ├── stream.ts           # 事件流
│   │   └── types.ts            # 类型定义
│   ├── package.json
│   └── tsconfig.json
├── tests/                      # 测试
│   ├── test_query.py
│   ├── test_bridge.py
│   └── test_types.py
├── examples/                   # 示例
├── docs/                       # 文档
├── pyproject.toml              # Python 项目配置
└── README.md                   # 本文件
```

### 运行测试

```bash
# 运行所有测试
pytest tests/

# 运行特定测试
pytest tests/test_query.py -v

# 生成覆盖率报告
pytest tests/ --cov=sii_agent_sdk --cov-report=html
```

### 代码质量检查

```bash
# 代码格式化
black sii_agent_sdk/ tests/ examples/

# Lint 检查
ruff check sii_agent_sdk/ tests/

# 类型检查
mypy sii_agent_sdk/
```

### 调试 Bridge

设置环境变量启用详细日志:

```bash
export SII_BRIDGE_DEBUG=1
python your_script.py
```

## 常见问题

### 1. Bridge 进程启动失败

**问题**: `BridgeNotFoundError: Bridge executable not found`

**解决方案**:

- 确保已构建 SII-CLI Core: `npm run build`
- 检查 Node.js 版本: `node --version` (需要 >= 20.0.0)
- 手动指定 Bridge 路径: `export SII_BRIDGE_PATH=/path/to/bridge`

### 2. 认证失败

**问题**: `AuthenticationError: Authentication failed`

**解决方案**:

- 检查环境变量是否正确设置
- 验证 API Key 是否有效
- 使用 `list_tools` 方法检查可用工具

### 3. 工具调用超时

**问题**: `TimeoutError: Tool execution timeout`

**解决方案**:

- 增加超时时间: `SiiAgentOptions(timeout_ms=300000)` # 5分钟
- 减少 `max_turns` 限制复杂度
- 使用更精确的 `allowed_tools` 过滤

### 4. JSONL 解析错误

**问题**: `JSONDecodeError: Failed to parse event`

**解决方案**:

- 启用调试模式查看原始输出
- 更新到最新版本
- 提交 issue 附带错误日志

## 项目状态

**当前版本**: 0.1.0 (Alpha)

**开发进度**:

- ✅ Phase 1: Node.js Bridge 基础结构
- ✅ Phase 2: Python SDK 核心 API (`query()`)
- ✅ Phase 3: YOLO 模式集成
- ✅ Phase 4: 多认证方式支持
- 🚧 Phase 5: 持久会话 (`SiiSDKClient`) - 开发中
- ⏳ Phase 6: 完整测试覆盖
- ⏳ Phase 7: 性能优化
- ⏳ Phase 8: 发布到 PyPI

### 已知限制

- `SiiSDKClient` 类尚未完全实现持久会话功能
- 工具白名单 (`allowed_tools`) 当前仅作为建议,未强制执行
- 部分高级配置选项尚未实现(如自定义错误处理器)
- 文档和示例仍在完善中

### 路线图

- [ ] 完善 `SiiSDKClient` 持久会话支持
- [ ] 实现工具白名单强制过滤
- [ ] 添加性能监控和指标收集
- [ ] 支持自定义工具注册
- [ ] 提供更丰富的事件钩子
- [ ] 完善文档和教程
- [ ] 发布到 PyPI

## 贡献

欢迎贡献!请遵循以下步骤:

1. Fork 本仓库
2. 创建功能分支: `git checkout -b feature/your-feature`
3. 提交更改: `git commit -am 'Add new feature'`
4. 推送到分支: `git push origin feature/your-feature`
5. 提交 Pull Request

更多详情请查看 [CONTRIBUTING.md](../../CONTRIBUTING.md)

### 开发规范

- 代码格式: Black (line-length=100)
- 类型检查: 使用 mypy strict 模式
- 测试覆盖率: 目标 >= 80%
- 提交信息: 遵循 Conventional Commits

## 许可

Apache License 2.0 - 详见 [LICENSE](../../LICENSE)

## 致谢

- 本项目设计参考了 [claude-agent-sdk-python](https://github.com/anthropics/claude-agent-sdk-python)
- 感谢 Anthropic 团队的优秀设计理念
- 感谢 SII-CLI 核心团队提供强大的基础设施

## 相关链接

- [SII-CLI 主项目](https://github.com/GAIR-NLP/sii-cli)
- [SII 平台官网](https://sii.gair-nlp.com)
- [Claude Agent SDK](https://github.com/anthropics/claude-agent-sdk-python)
- [问题反馈](https://github.com/GAIR-NLP/sii-cli/issues)
- [讨论区](https://github.com/GAIR-NLP/sii-cli/discussions)

---

**提示**: 本项目处于早期开发阶段,API 可能会有较大变动。建议关注 [CHANGELOG.md](./CHANGELOG.md) 了解最新更新。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "sii-agent-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "ai, agent, sii, gemini, assistant",
    "author": null,
    "author_email": "GAIR-NLP <snowy2002@sjtu.edu.cn>",
    "download_url": null,
    "platform": null,
    "description": "# SII Agent SDK for Python\n\nPython SDK for SII-CLI - AI Agent Framework\n\n[![Python Version](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen.svg)](https://nodejs.org/)\n\n## \u6982\u8ff0\n\nSII Agent SDK \u662f SII-CLI \u7684 Python \u63a5\u53e3\uff0c\u4f7f Python \u5f00\u53d1\u8005\u80fd\u591f\u901a\u8fc7\u7f16\u7a0b\u65b9\u5f0f\u8c03\u7528 SII-CLI \u7684\u5f3a\u5927 AI \u667a\u80fd\u4f53\u529f\u80fd\u3002\n\n\u672c\u9879\u76ee\u8bbe\u8ba1\u53c2\u8003\u4e86 [claude-agent-sdk-python](https://github.com/anthropics/claude-agent-sdk-python)\uff0c\u63d0\u4f9b\u76f8\u4f3c\u7684 API \u4f53\u9a8c\uff0c\u540c\u65f6\u96c6\u6210\u4e86 SII \u7684\u7279\u8272\u529f\u80fd\u3002\n\n### \u4e3b\u8981\u7279\u6027\n\n- \u2705 **Claude SDK \u98ce\u683c API**: API \u8bbe\u8ba1\u53c2\u8003 claude-agent-sdk-python\uff0c\u964d\u4f4e\u5b66\u4e60\u6210\u672c\n- \u2705 **YOLO \u81ea\u4e3b\u6267\u884c**: \u4e00\u53e5\u8bdd\u89e6\u53d1\uff0cAI \u81ea\u52a8\u5b8c\u6210\u4efb\u52a1\uff08\u57fa\u4e8e SimpleYoloAgent\uff09\n- \u2705 **\u591a\u8ba4\u8bc1\u652f\u6301**: \u652f\u6301 USE_SII, USE_GEMINI, USE_OPENAI \u7b49\u591a\u79cd\u8ba4\u8bc1\u65b9\u5f0f\n- \u2705 **SII \u4e13\u5c5e\u5de5\u5177**: \u6df1\u5ea6\u96c6\u6210 sii_cognitions, sii_deep_research, sii_hybrid_search \u7b49\u5de5\u5177\n- \u2705 **\u6d41\u5f0f\u54cd\u5e94**: \u57fa\u4e8e JSONL \u534f\u8bae\uff0c\u5b9e\u65f6\u8fd4\u56de\u6267\u884c\u8fdb\u5ea6\u548c\u7ed3\u679c\n- \u2705 **\u7c7b\u578b\u5b89\u5168**: \u5b8c\u6574\u7684\u7c7b\u578b\u63d0\u793a\u548c IDE \u652f\u6301\n- \u2705 **\u8fdb\u7a0b\u9694\u79bb**: \u901a\u8fc7 Node.js Bridge \u5b9e\u73b0 Python \u4e0e SII-CLI Core \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\n\n## \u67b6\u6784\u8bbe\u8ba1\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         JSONL Protocol          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                 \u2502      (stdin/stdout/stderr)       \u2502                  \u2502\n\u2502  Python SDK     \u2502\u25c4\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502  Node.js Bridge  \u2502\n\u2502  (\u7528\u6237\u4ee3\u7801)     \u2502                                  \u2502  (sii-bridge)    \u2502\n\u2502                 \u2502                                  \u2502                  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                                  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                                              \u2502\n                                                              \u2502 \u76f4\u63a5\u8c03\u7528\n                                                              \u25bc\n                                                     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                                                     \u2502  SII-CLI Core    \u2502\n                                                     \u2502  - AgentService  \u2502\n                                                     \u2502  - SimpleYolo    \u2502\n                                                     \u2502  - ToolRegistry  \u2502\n                                                     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n### \u7ec4\u4ef6\u8bf4\u660e\n\n1. **Python SDK** (`sii_agent_sdk/`)\n   - \u63d0\u4f9b Pythonic \u7684 API \u63a5\u53e3\n   - \u7ba1\u7406 Bridge \u8fdb\u7a0b\u751f\u547d\u5468\u671f\n   - \u89e3\u6790 JSONL \u4e8b\u4ef6\u6d41\n   - \u7c7b\u578b\u5b89\u5168\u7684\u6d88\u606f\u5c01\u88c5\n\n2. **Node.js Bridge** (`bridge/`)\n   - \u6865\u63a5 Python \u548c Node.js \u751f\u6001\n   - \u5904\u7406 JSONL \u534f\u8bae\u901a\u4fe1\n   - \u7ba1\u7406 SII-CLI Core \u5b9e\u4f8b\n   - \u63d0\u4f9b\u8fdb\u7a0b\u9694\u79bb\u548c\u9519\u8bef\u6062\u590d\n\n3. **SII-CLI Core** (`../core/`)\n   - \u590d\u7528\u73b0\u6709\u7684\u6838\u5fc3\u529f\u80fd\n   - AgentService: \u5bf9\u8bdd\u5f0f\u4ea4\u4e92\n   - SimpleYoloAgent: \u81ea\u4e3b\u6267\u884c\n   - ToolRegistry: \u5de5\u5177\u7ba1\u7406\n\n## \u5b89\u88c5\n\n### \u524d\u7f6e\u8981\u6c42\n\n- **Python**: >= 3.10\n- **Node.js**: >= 20.0.0\n- **SII-CLI**: \u5df2\u6784\u5efa\u7684 `@gair/sii-cli-core` \u5305\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\uff08\u63a8\u8350\u5f00\u53d1\u73af\u5883\uff09\n\n```bash\n# 1. \u514b\u9686\u4ed3\u5e93\ngit clone https://github.com/GAIR-NLP/sii-cli.git\ncd sii-cli\n\n# 2. \u5b89\u88c5\u4f9d\u8d56\u5e76\u6784\u5efa\u9879\u76ee\nnpm install\nnpm run build\n\n# 3. \u5b89\u88c5 Python SDK\ncd packages/python-sdk\npip install -e \".[dev]\"\n\n# 4. \u9a8c\u8bc1\u5b89\u88c5\npython -c \"from sii_agent_sdk import query; print('\u5b89\u88c5\u6210\u529f\uff01')\"\n```\n\n> \ud83d\udca1 **\u6784\u5efa\u8bf4\u660e**\uff1a\n>\n> - `npm run build` \u4f1a\u81ea\u52a8\u6784\u5efa\u6240\u6709\u4f9d\u8d56\u5305\uff08\u5305\u62ec core \u548c bridge\uff09\n> - Bridge \u5305\u4f9d\u8d56\u4e8e core \u5305\uff0c\u6784\u5efa\u811a\u672c\u4f1a\u81ea\u52a8\u786e\u4fdd\u4f9d\u8d56\u987a\u5e8f\u6b63\u786e\n> - \u5982\u679c\u9047\u5230\u6784\u5efa\u95ee\u9898\uff0c\u8bf7\u5148\u8fd0\u884c `npm run build --workspace=@gair/sii-cli-core` \u786e\u4fdd core \u5305\u5df2\u6784\u5efa\n\n## \u8ba4\u8bc1\u65b9\u5f0f\n\nSDK \u652f\u6301 SII-CLI \u7684\u6240\u6709\u8ba4\u8bc1\u65b9\u5f0f\u3002\u4e0d\u540c\u8ba4\u8bc1\u65b9\u5f0f\u51b3\u5b9a\u4e86\u53ef\u7528\u7684\u5de5\u5177\u96c6\uff1a\n\n| \u8ba4\u8bc1\u7c7b\u578b         | \u8bf4\u660e           | \u73af\u5883\u53d8\u91cf                       | \u53ef\u7528\u5de5\u5177                |\n| ---------------- | -------------- | ------------------------------ | ----------------------- |\n| `USE_SII` (\u9ed8\u8ba4) | SII \u5e73\u53f0\u8ba4\u8bc1   | `SII_USERNAME`\u548c`SII_PASSWORD` | \u6240\u6709\u5de5\u5177 + SII \u4e13\u5c5e\u5de5\u5177 |\n| `USE_OPENAI`     | OpenAI API Key | `OPENAI_API_KEY`               | \u57fa\u7840\u5de5\u5177                |\n\n### \u914d\u7f6e\u8ba4\u8bc1\n\n\u65b9\u5f0f 1: \u901a\u8fc7\u4ee3\u7801\u8bbe\u7f6e\n\n```python\nfrom sii_agent_sdk import query, SiiAgentOptions\n\nasync for message in query(\n    prompt=\"\u4f60\u7684\u4efb\u52a1\",\n    options=SiiAgentOptions(auth_type=\"USE_GEMINI\")\n):\n    print(message)\n```\n\n\u65b9\u5f0f 2: \u901a\u8fc7\u73af\u5883\u53d8\u91cf\n\n```bash\n# SII CLI automatically configures these when using interactive authentication\nexport SII_OPENAI_API_KEY=\"your_api_key_here\"\nexport SII_OPENAI_BASE_URL=\"your_api_endpoint\"\nexport SII_OPENAI_MODEL=\"your_model_choice\"\n\n# For SII Account authentication\nexport SII_USERNAME=\"your_username\"\nexport SII_PASSWORD=\"your_password\"\nexport SII_BASE_URL=\"https://www.opensii.ai/backend\"\nexport SII_OPENAI_MODEL=\"your_model_choice\"  # Shared model setting\n```\n\n```python\nfrom sii_agent_sdk import query\n\n# \u81ea\u52a8\u4ece\u73af\u5883\u53d8\u91cf\u8bfb\u53d6\u8ba4\u8bc1\u4fe1\u606f\nasync for message in query(prompt=\"\u4f60\u7684\u4efb\u52a1\"):\n    print(message)\n```\n\n### \u4ece PyPI \u5b89\u88c5\uff08\u672a\u6765\u652f\u6301\uff09\n\n```bash\npip install sii-agent-sdk\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### 1. \u57fa\u7840\u67e5\u8be2\n\n\u6700\u7b80\u5355\u7684\u7528\u6cd5\uff0c\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\uff1a\n\n```python\nimport anyio\nfrom sii_agent_sdk import query\n\nasync def main():\n    async for message in query(prompt=\"\u5217\u51fa\u5f53\u524d\u76ee\u5f55\u7684\u6240\u6709\u6587\u4ef6\"):\n        print(message)\n\nanyio.run(main)\n```\n\n### 2. YOLO \u81ea\u4e3b\u6267\u884c\u6a21\u5f0f\n\n\u8ba9 AI \u81ea\u52a8\u6267\u884c\u6240\u6709\u6b65\u9aa4\uff0c\u65e0\u9700\u4eba\u5de5\u786e\u8ba4\uff1a\n\n```python\nimport anyio\nfrom sii_agent_sdk import query, SiiAgentOptions\n\nasync def main():\n    # YOLO \u6a21\u5f0f - AI \u81ea\u52a8\u6267\u884c\u6240\u6709\u5de5\u5177\u8c03\u7528\n    async for message in query(\n        prompt=\"\u521b\u5efa\u4e00\u4e2a README.md \u6587\u4ef6\uff0c\u5305\u542b\u9879\u76ee\u7b80\u4ecb\u548c\u5b89\u88c5\u8bf4\u660e\",\n        options=SiiAgentOptions(\n            yolo=True,\n            max_turns=10,\n            allowed_tools=[\"write_file\", \"read_file\", \"list_dir\"]\n        )\n    ):\n        if message.type == \"assistant_message\":\n            print(f\"\ud83e\udd16 \u52a9\u624b: {message.content[0].text}\")\n        elif message.type == \"tool_call\":\n            print(f\"\ud83d\udd27 \u5de5\u5177\u8c03\u7528: {message.tool_name}\")\n        elif message.type == \"completed\":\n            print(f\"\u2705 \u5b8c\u6210\uff01\u7528\u65f6: {message.metadata.time_elapsed}ms\")\n\nanyio.run(main)\n```\n\n### 3. \u4f7f\u7528 SII \u4e13\u5c5e\u5de5\u5177\n\n\u5145\u5206\u5229\u7528 SII \u5e73\u53f0\u7684\u8ba4\u77e5\u80fd\u529b\uff1a\n\n```python\nimport anyio\nfrom sii_agent_sdk import query, SiiAgentOptions\n\nasync def main():\n    # \u4f7f\u7528 SII \u8ba4\u77e5\u6570\u636e\u5e93\u548c\u6df7\u5408\u641c\u7d22\n    async for message in query(\n        prompt=\"\u641c\u7d22\u6700\u65b0\u7684\u5927\u8bed\u8a00\u6a21\u578b\u8bad\u7ec3\u6280\u672f\u7814\u7a76\u8fdb\u5c55\",\n        options=SiiAgentOptions(\n            auth_type=\"USE_SII\",\n            allowed_tools=[\n                \"sii_cognitions\",\n                \"sii_deep_research\",\n                \"sii_hybrid_search\"\n            ],\n            max_turns=5\n        )\n    ):\n        if message.type == \"assistant_message\":\n            print(message.content[0].text)\n\nanyio.run(main)\n```\n\n### 4. \u6307\u5b9a\u5de5\u4f5c\u76ee\u5f55\u548c\u6a21\u578b\n\n\u81ea\u5b9a\u4e49\u6267\u884c\u73af\u5883\uff1a\n\n```python\nimport anyio\nfrom sii_agent_sdk import query, SiiAgentOptions\n\nasync def main():\n    async for message in query(\n        prompt=\"\u5206\u6790 src/ \u76ee\u5f55\u4e0b\u7684\u4ee3\u7801\u7ed3\u6784\",\n        options=SiiAgentOptions(\n            cwd=\"/path/to/your/project\",\n            model=\"gemini-2.0-flash-exp\",\n            temperature=0.7,\n            max_turns=8,\n            allowed_tools=[\"read_file\", \"list_dir\", \"grep_search\"]\n        )\n    ):\n        print(message)\n\nanyio.run(main)\n```\n\n### 5. \u6301\u4e45\u4f1a\u8bdd\uff08\u672a\u6765\u652f\u6301\uff09\n\n\u4fdd\u6301\u591a\u8f6e\u5bf9\u8bdd\u4e0a\u4e0b\u6587\uff1a\n\n```python\nimport anyio\nfrom sii_agent_sdk import SiiSDKClient, SiiAgentOptions\n\nasync def main():\n    # \u6ce8\u610f\uff1aSiiSDKClient \u529f\u80fd\u5c1a\u672a\u5b8c\u5168\u5b9e\u73b0\n    async with SiiSDKClient(\n        options=SiiAgentOptions(auth_type=\"USE_SII\")\n    ) as client:\n        # \u7b2c\u4e00\u8f6e\u5bf9\u8bdd\n        await client.query(\"\u5206\u6790\u8fd9\u4e2a\u9879\u76ee\u7684\u7ed3\u6784\")\n        async for msg in client.receive_response():\n            print(msg)\n\n        # \u7b2c\u4e8c\u8f6e\u5bf9\u8bdd - \u57fa\u4e8e\u4e0a\u4e0b\u6587\n        await client.query(\"\u57fa\u4e8e\u521a\u624d\u7684\u5206\u6790\uff0c\u521b\u5efa\u4e00\u4e2a\u6539\u8fdb\u8ba1\u5212\")\n        async for msg in client.receive_response():\n            print(msg)\n\nanyio.run(main)\n```\n\n## API \u53c2\u8003\n\n### `query()` \u51fd\u6570\n\n\u7b80\u5355\u7684\u4e00\u6b21\u6027\u67e5\u8be2\u63a5\u53e3\uff0c\u9002\u5408\u5927\u591a\u6570\u573a\u666f\u3002\n\n```python\nasync def query(\n    prompt: str,\n    *,\n    options: SiiAgentOptions | None = None\n) -> AsyncIterator[Message]\n```\n\n**\u53c2\u6570**:\n\n- `prompt`: \u7528\u6237\u8f93\u5165\u7684\u4efb\u52a1\u63cf\u8ff0\n- `options`: \u53ef\u9009\u7684\u914d\u7f6e\u9009\u9879\uff08\u89c1\u4e0b\u6587\uff09\n\n**\u8fd4\u56de**: \u5f02\u6b65\u8fed\u4ee3\u5668\uff0c\u4ea7\u751f `Message` \u5bf9\u8c61\n\n### `SiiAgentOptions` \u914d\u7f6e\n\n```python\nfrom dataclasses import dataclass\nfrom typing import List, Optional\n\n@dataclass\nclass SiiAgentOptions:\n    # \u8ba4\u8bc1\u914d\u7f6e\n    auth_type: Optional[str] = None  # \"USE_SII\", \"USE_GEMINI\", \"USE_OPENAI\"\n\n    # \u6267\u884c\u6a21\u5f0f\n    yolo: bool = False               # YOLO \u81ea\u4e3b\u6267\u884c\u6a21\u5f0f\n    max_turns: int = 10              # \u6700\u5927\u5bf9\u8bdd\u8f6e\u6570\n    timeout_ms: int = 120000         # \u8d85\u65f6\u65f6\u95f4\uff08\u6beb\u79d2\uff09\n\n    # \u5de5\u5177\u63a7\u5236\n    allowed_tools: Optional[List[str]] = None  # \u5141\u8bb8\u4f7f\u7528\u7684\u5de5\u5177\u767d\u540d\u5355\n\n    # \u6a21\u578b\u914d\u7f6e\n    model: Optional[str] = None      # \u6a21\u578b\u540d\u79f0\uff0c\u5982 \"gemini-2.0-flash-exp\"\n    temperature: Optional[float] = None  # \u6e29\u5ea6\u53c2\u6570 (0.0-2.0)\n    system_prompt: Optional[str] = None  # \u81ea\u5b9a\u4e49\u7cfb\u7edf\u63d0\u793a\n\n    # \u73af\u5883\u914d\u7f6e\n    cwd: Optional[str] = None        # \u5de5\u4f5c\u76ee\u5f55\n    session_id: Optional[str] = None # \u4f1a\u8bdd ID\n```\n\n### Message \u7c7b\u578b\n\n\u6240\u6709\u6d88\u606f\u90fd\u7ee7\u627f\u81ea `Message` \u57fa\u7c7b\uff1a\n\n```python\n# \u72b6\u6001\u6d88\u606f\nclass StatusMessage(Message):\n    type: Literal[\"status\"]\n    status: str                      # \"initializing\", \"authenticating\", \"ready\", \"running\"\n    message: str\n    auth_type: Optional[str]\n    available_tools: Optional[List[str]]\n\n# \u52a9\u624b\u6d88\u606f\nclass AssistantMessage(Message):\n    type: Literal[\"assistant_message\"]\n    role: Literal[\"assistant\"]\n    content: List[ContentBlock]      # \u5185\u5bb9\u5757\u5217\u8868\n\n# \u5de5\u5177\u8c03\u7528\nclass ToolCallMessage(Message):\n    type: Literal[\"tool_call\"]\n    tool_name: str\n    tool_call_id: str\n    args: Dict[str, Any]\n\n# \u5de5\u5177\u7ed3\u679c\nclass ToolResultMessage(Message):\n    type: Literal[\"tool_result\"]\n    tool_call_id: str\n    result: Dict[str, Any]\n\n# \u5b8c\u6210\u6d88\u606f\nclass CompletedMessage(Message):\n    type: Literal[\"completed\"]\n    metadata: Dict[str, Any]         # turns_used, time_elapsed, tokens_used\n\n# \u9519\u8bef\u6d88\u606f\nclass ErrorMessage(Message):\n    type: Literal[\"error\"]\n    error: Dict[str, Any]            # code, message, details\n```\n\n## \u793a\u4f8b\n\n### \u5b8c\u6574\u793a\u4f8b\u4ee3\u7801\n\n\u67e5\u770b `examples/` \u76ee\u5f55\u83b7\u53d6\u66f4\u591a\u793a\u4f8b\uff1a\n\n```\nexamples/\n\u251c\u2500\u2500 quick_start.py          # \u5feb\u901f\u5165\u95e8\n\u251c\u2500\u2500 yolo_example.py         # YOLO \u6a21\u5f0f\u6f14\u793a\n\u251c\u2500\u2500 auth_modes.py           # \u591a\u8ba4\u8bc1\u65b9\u5f0f\n\u251c\u2500\u2500 tool_filtering.py       # \u5de5\u5177\u8fc7\u6ee4\n\u251c\u2500\u2500 error_handling.py       # \u9519\u8bef\u5904\u7406\n\u2514\u2500\u2500 advanced_usage.py       # \u9ad8\u7ea7\u7528\u6cd5\n```\n\n\u8fd0\u884c\u793a\u4f8b\uff1a\n\n```bash\ncd examples\npython quick_start.py\n```\n\n## \u5f00\u53d1\n\n### \u9879\u76ee\u7ed3\u6784\n\n```\npackages/python-sdk/\n\u251c\u2500\u2500 sii_agent_sdk/              # Python SDK \u6e90\u7801\n\u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u251c\u2500\u2500 query.py                # query() \u51fd\u6570\u5b9e\u73b0\n\u2502   \u251c\u2500\u2500 types.py                # \u7c7b\u578b\u5b9a\u4e49\n\u2502   \u251c\u2500\u2500 errors.py               # \u5f02\u5e38\u7c7b\n\u2502   \u251c\u2500\u2500 bridge.py               # Bridge \u8fdb\u7a0b\u7ba1\u7406\n\u2502   \u2514\u2500\u2500 _internal/              # \u5185\u90e8\u5b9e\u73b0\n\u2502       \u251c\u2500\u2500 protocol.py         # JSONL \u534f\u8bae\u89e3\u6790\n\u2502       \u2514\u2500\u2500 process.py          # \u8fdb\u7a0b\u7ba1\u7406\n\u251c\u2500\u2500 bridge/                     # Node.js Bridge\n\u2502   \u251c\u2500\u2500 src/\n\u2502   \u2502   \u251c\u2500\u2500 index.ts            # Bridge \u5165\u53e3\n\u2502   \u2502   \u251c\u2500\u2500 protocol.ts         # \u534f\u8bae\u5904\u7406\n\u2502   \u2502   \u251c\u2500\u2500 executor.ts         # \u6267\u884c\u5668\n\u2502   \u2502   \u251c\u2500\u2500 stream.ts           # \u4e8b\u4ef6\u6d41\n\u2502   \u2502   \u2514\u2500\u2500 types.ts            # \u7c7b\u578b\u5b9a\u4e49\n\u2502   \u251c\u2500\u2500 package.json\n\u2502   \u2514\u2500\u2500 tsconfig.json\n\u251c\u2500\u2500 tests/                      # \u6d4b\u8bd5\n\u2502   \u251c\u2500\u2500 test_query.py\n\u2502   \u251c\u2500\u2500 test_bridge.py\n\u2502   \u2514\u2500\u2500 test_types.py\n\u251c\u2500\u2500 examples/                   # \u793a\u4f8b\n\u251c\u2500\u2500 docs/                       # \u6587\u6863\n\u251c\u2500\u2500 pyproject.toml              # Python \u9879\u76ee\u914d\u7f6e\n\u2514\u2500\u2500 README.md                   # \u672c\u6587\u4ef6\n```\n\n### \u8fd0\u884c\u6d4b\u8bd5\n\n```bash\n# \u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\npytest tests/\n\n# \u8fd0\u884c\u7279\u5b9a\u6d4b\u8bd5\npytest tests/test_query.py -v\n\n# \u751f\u6210\u8986\u76d6\u7387\u62a5\u544a\npytest tests/ --cov=sii_agent_sdk --cov-report=html\n```\n\n### \u4ee3\u7801\u8d28\u91cf\u68c0\u67e5\n\n```bash\n# \u4ee3\u7801\u683c\u5f0f\u5316\nblack sii_agent_sdk/ tests/ examples/\n\n# Lint \u68c0\u67e5\nruff check sii_agent_sdk/ tests/\n\n# \u7c7b\u578b\u68c0\u67e5\nmypy sii_agent_sdk/\n```\n\n### \u8c03\u8bd5 Bridge\n\n\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\u542f\u7528\u8be6\u7ec6\u65e5\u5fd7\uff1a\n\n```bash\nexport SII_BRIDGE_DEBUG=1\npython your_script.py\n```\n\n## \u5e38\u89c1\u95ee\u9898\n\n### 1. Bridge \u8fdb\u7a0b\u542f\u52a8\u5931\u8d25\n\n**\u95ee\u9898**: `BridgeNotFoundError: Bridge executable not found`\n\n**\u89e3\u51b3\u65b9\u6848**:\n\n- \u786e\u4fdd\u5df2\u6784\u5efa SII-CLI Core: `npm run build`\n- \u68c0\u67e5 Node.js \u7248\u672c: `node --version` (\u9700\u8981 >= 20.0.0)\n- \u624b\u52a8\u6307\u5b9a Bridge \u8def\u5f84: `export SII_BRIDGE_PATH=/path/to/bridge`\n\n### 2. \u8ba4\u8bc1\u5931\u8d25\n\n**\u95ee\u9898**: `AuthenticationError: Authentication failed`\n\n**\u89e3\u51b3\u65b9\u6848**:\n\n- \u68c0\u67e5\u73af\u5883\u53d8\u91cf\u662f\u5426\u6b63\u786e\u8bbe\u7f6e\n- \u9a8c\u8bc1 API Key \u662f\u5426\u6709\u6548\n- \u4f7f\u7528 `list_tools` \u65b9\u6cd5\u68c0\u67e5\u53ef\u7528\u5de5\u5177\n\n### 3. \u5de5\u5177\u8c03\u7528\u8d85\u65f6\n\n**\u95ee\u9898**: `TimeoutError: Tool execution timeout`\n\n**\u89e3\u51b3\u65b9\u6848**:\n\n- \u589e\u52a0\u8d85\u65f6\u65f6\u95f4: `SiiAgentOptions(timeout_ms=300000)` # 5\u5206\u949f\n- \u51cf\u5c11 `max_turns` \u9650\u5236\u590d\u6742\u5ea6\n- \u4f7f\u7528\u66f4\u7cbe\u786e\u7684 `allowed_tools` \u8fc7\u6ee4\n\n### 4. JSONL \u89e3\u6790\u9519\u8bef\n\n**\u95ee\u9898**: `JSONDecodeError: Failed to parse event`\n\n**\u89e3\u51b3\u65b9\u6848**:\n\n- \u542f\u7528\u8c03\u8bd5\u6a21\u5f0f\u67e5\u770b\u539f\u59cb\u8f93\u51fa\n- \u66f4\u65b0\u5230\u6700\u65b0\u7248\u672c\n- \u63d0\u4ea4 issue \u9644\u5e26\u9519\u8bef\u65e5\u5fd7\n\n## \u9879\u76ee\u72b6\u6001\n\n**\u5f53\u524d\u7248\u672c**: 0.1.0 (Alpha)\n\n**\u5f00\u53d1\u8fdb\u5ea6**:\n\n- \u2705 Phase 1: Node.js Bridge \u57fa\u7840\u7ed3\u6784\n- \u2705 Phase 2: Python SDK \u6838\u5fc3 API (`query()`)\n- \u2705 Phase 3: YOLO \u6a21\u5f0f\u96c6\u6210\n- \u2705 Phase 4: \u591a\u8ba4\u8bc1\u65b9\u5f0f\u652f\u6301\n- \ud83d\udea7 Phase 5: \u6301\u4e45\u4f1a\u8bdd (`SiiSDKClient`) - \u5f00\u53d1\u4e2d\n- \u23f3 Phase 6: \u5b8c\u6574\u6d4b\u8bd5\u8986\u76d6\n- \u23f3 Phase 7: \u6027\u80fd\u4f18\u5316\n- \u23f3 Phase 8: \u53d1\u5e03\u5230 PyPI\n\n### \u5df2\u77e5\u9650\u5236\n\n- `SiiSDKClient` \u7c7b\u5c1a\u672a\u5b8c\u5168\u5b9e\u73b0\u6301\u4e45\u4f1a\u8bdd\u529f\u80fd\n- \u5de5\u5177\u767d\u540d\u5355 (`allowed_tools`) \u5f53\u524d\u4ec5\u4f5c\u4e3a\u5efa\u8bae\uff0c\u672a\u5f3a\u5236\u6267\u884c\n- \u90e8\u5206\u9ad8\u7ea7\u914d\u7f6e\u9009\u9879\u5c1a\u672a\u5b9e\u73b0\uff08\u5982\u81ea\u5b9a\u4e49\u9519\u8bef\u5904\u7406\u5668\uff09\n- \u6587\u6863\u548c\u793a\u4f8b\u4ecd\u5728\u5b8c\u5584\u4e2d\n\n### \u8def\u7ebf\u56fe\n\n- [ ] \u5b8c\u5584 `SiiSDKClient` \u6301\u4e45\u4f1a\u8bdd\u652f\u6301\n- [ ] \u5b9e\u73b0\u5de5\u5177\u767d\u540d\u5355\u5f3a\u5236\u8fc7\u6ee4\n- [ ] \u6dfb\u52a0\u6027\u80fd\u76d1\u63a7\u548c\u6307\u6807\u6536\u96c6\n- [ ] \u652f\u6301\u81ea\u5b9a\u4e49\u5de5\u5177\u6ce8\u518c\n- [ ] \u63d0\u4f9b\u66f4\u4e30\u5bcc\u7684\u4e8b\u4ef6\u94a9\u5b50\n- [ ] \u5b8c\u5584\u6587\u6863\u548c\u6559\u7a0b\n- [ ] \u53d1\u5e03\u5230 PyPI\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u8d21\u732e\uff01\u8bf7\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a\n\n1. Fork \u672c\u4ed3\u5e93\n2. \u521b\u5efa\u529f\u80fd\u5206\u652f: `git checkout -b feature/your-feature`\n3. \u63d0\u4ea4\u66f4\u6539: `git commit -am 'Add new feature'`\n4. \u63a8\u9001\u5230\u5206\u652f: `git push origin feature/your-feature`\n5. \u63d0\u4ea4 Pull Request\n\n\u66f4\u591a\u8be6\u60c5\u8bf7\u67e5\u770b [CONTRIBUTING.md](../../CONTRIBUTING.md)\n\n### \u5f00\u53d1\u89c4\u8303\n\n- \u4ee3\u7801\u683c\u5f0f: Black (line-length=100)\n- \u7c7b\u578b\u68c0\u67e5: \u4f7f\u7528 mypy strict \u6a21\u5f0f\n- \u6d4b\u8bd5\u8986\u76d6\u7387: \u76ee\u6807 >= 80%\n- \u63d0\u4ea4\u4fe1\u606f: \u9075\u5faa Conventional Commits\n\n## \u8bb8\u53ef\n\nApache License 2.0 - \u8be6\u89c1 [LICENSE](../../LICENSE)\n\n## \u81f4\u8c22\n\n- \u672c\u9879\u76ee\u8bbe\u8ba1\u53c2\u8003\u4e86 [claude-agent-sdk-python](https://github.com/anthropics/claude-agent-sdk-python)\n- \u611f\u8c22 Anthropic \u56e2\u961f\u7684\u4f18\u79c0\u8bbe\u8ba1\u7406\u5ff5\n- \u611f\u8c22 SII-CLI \u6838\u5fc3\u56e2\u961f\u63d0\u4f9b\u5f3a\u5927\u7684\u57fa\u7840\u8bbe\u65bd\n\n## \u76f8\u5173\u94fe\u63a5\n\n- [SII-CLI \u4e3b\u9879\u76ee](https://github.com/GAIR-NLP/sii-cli)\n- [SII \u5e73\u53f0\u5b98\u7f51](https://sii.gair-nlp.com)\n- [Claude Agent SDK](https://github.com/anthropics/claude-agent-sdk-python)\n- [\u95ee\u9898\u53cd\u9988](https://github.com/GAIR-NLP/sii-cli/issues)\n- [\u8ba8\u8bba\u533a](https://github.com/GAIR-NLP/sii-cli/discussions)\n\n---\n\n**\u63d0\u793a**: \u672c\u9879\u76ee\u5904\u4e8e\u65e9\u671f\u5f00\u53d1\u9636\u6bb5\uff0cAPI \u53ef\u80fd\u4f1a\u6709\u8f83\u5927\u53d8\u52a8\u3002\u5efa\u8bae\u5173\u6ce8 [CHANGELOG.md](./CHANGELOG.md) \u4e86\u89e3\u6700\u65b0\u66f4\u65b0\u3002\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Python SDK for SII-CLI - AI Agent Framework",
    "version": "0.1.2",
    "project_urls": {
        "Documentation": "https://github.com/GAIR-NLP/sii-cli/tree/main/packages/python-sdk",
        "Homepage": "https://github.com/GAIR-NLP/sii-cli",
        "Issues": "https://github.com/GAIR-NLP/sii-cli/issues",
        "Repository": "https://github.com/GAIR-NLP/sii-cli"
    },
    "split_keywords": [
        "ai",
        " agent",
        " sii",
        " gemini",
        " assistant"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a03817fd3e09a4b3d24b1e4594e2ccd1ebe6ef38ff60699b9f3f919a386bc584",
                "md5": "515a767f97d13d0efa37db6a241a5465",
                "sha256": "703b60e64ce0591e582408165f1a9c1d1e8216264f0ef79312ff7ccc401cfc9b"
            },
            "downloads": -1,
            "filename": "sii_agent_sdk-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "515a767f97d13d0efa37db6a241a5465",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 21004,
            "upload_time": "2025-10-06T13:54:51",
            "upload_time_iso_8601": "2025-10-06T13:54:51.035776Z",
            "url": "https://files.pythonhosted.org/packages/a0/38/17fd3e09a4b3d24b1e4594e2ccd1ebe6ef38ff60699b9f3f919a386bc584/sii_agent_sdk-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-06 13:54:51",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "GAIR-NLP",
    "github_project": "sii-cli",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "sii-agent-sdk"
}
        
Elapsed time: 1.70111s