Skip to content

xiscoxu/gemini-cli-sdk

Repository files navigation

特性

  • 异步支持: 完全异步的 API,支持高并发操作
  • 流式响应: 支持流式返回,实时获取思考过程中的回复
  • 会話管理: 自动管理对话上下文和会话状态
  • 进程池: 智能的进程池管理,自动复用和清理空闲进程
  • 系统命令: 完整支持 Gemini CLI 的所有系统命令(/help, /clear, /stats 等)
  • 文件引用: 支持 @ 语法引用文件内容
  • Shell 集成: 支持 ! 语法执行 shell 命令
  • 配置灵活: 支持文件配置和环境变量配置
  • 错误处理: 完善的异常处理和错误恢复机制
  • 类型安全: 完整的类型注解支持
  • 易于使用: 简洁的 API 设计,支持一行代码调用

安装

从源码安装:

git clone https://github.com/example/gemini-cli-sdk.git
cd gemini-cli-sdk
pip install -e .

前置条件

确保已安装 Gemini CLI 工具并且在 PATH 中可用:

# 检查 Gemini CLI 是否可用
gemini --version

快速开始

基本用法

import asyncio
from gemini_cli_sdk import GeminiClient

async def main():
    # 使用上下文管理器自动管理资源
    async with GeminiClient() as client:
        # 简单的一次性查询
        response = await client.one_shot("什么是 Python?")
        print(response.content)

asyncio.run(main())

会话对话

import asyncio
from gemini_cli_sdk import GeminiClient

async def main():
    async with GeminiClient() as client:
        # 创建会话以维护对话上下文
        session_id = client.create_session()
        
        # 在会话中进行对话
        response1 = await client.chat("你好,我正在学习编程", session_id)
        response2 = await client.chat("能给我一些建议吗?", session_id)
        
        print(f"AI: {response1.content}")
        print(f"AI: {response2.content}")
        
        # 清理会话
        client.close_session(session_id)

asyncio.run(main())

流式响应

import asyncio
import json # 导入json模块
from gemini_cli_sdk import GeminiClient

async def main():
    async with GeminiClient() as client:
        print("AI (流式): ", end="")
        async for chunk in await client.chat("写一首关于宇宙的短诗", stream=True):
            try:
                json_chunk = json.loads(chunk)
                if json_chunk.get("type") == "message" and json_chunk.get("role") == "assistant":
                    content_part = json_chunk.get("content", "")
                    print(content_part, end="", flush=True)
            except json.JSONDecodeError:
                # 处理非JSON格式的块,或者错误情况
                print(chunk, end="", flush=True) # 作为回退,直接打印原始内容
        print() # 流式输出结束后换行

asyncio.run(main())

批量处理

import asyncio
from gemini_cli_sdk import GeminiClient

async def main():
    async with GeminiClient() as client:
        # 顺序发送多个消息(共享上下文)
        messages = [
            "介绍一下机器学习",
            "深度学习和机器学习有什么区别?",
            "推荐一些学习资源"
        ]
        
        session_id = client.create_session()
        responses = await client.send_batch(messages, session_id)
        
        for i, response in enumerate(responses):
            print(f"Q{i+1}: {messages[i]}")
            print(f"A{i+1}: {response.content}\n")

asyncio.run(main())

并发处理

import asyncio
from gemini_cli_sdk import GeminiClient

async def main():
    async with GeminiClient() as client:
        # 并发发送多个独立的消息
        questions = [
            "什么是 Python?",
            "什么是 JavaScript?",
            "什么是 Go?"
        ]
        
        responses = await client.send_concurrent(questions)
        
        for question, response in zip(questions, responses):
            print(f"Q: {question}")
            print(f"A: {response.content}\n")

asyncio.run(main())

配置

配置文件

创建 ~/.gemini_cli_sdk.json 配置文件:

{
  "max_processes": 5,
  "idle_timeout": 300,
  "max_context_length": 50,
  "gemini_command": "gemini",
  "gemini_args": [],
  "enable_logging": true,
  "log_level": "INFO",
  "response_timeout": 30.0,
  "cleanup_interval": 60
}

环境变量

export GEMINI_MAX_PROCESSES=5
export GEMINI_IDLE_TIMEOUT=300
export GEMINI_MAX_CONTEXT_LENGTH=50
export GEMINI_COMMAND=gemini
export GEMINI_ARGS=""
export GEMINI_ENABLE_LOGGING=true
export GEMINI_LOG_LEVEL=INFO
export GEMINI_RESPONSE_TIMEOUT=30.0
export GEMINI_CLEANUP_INTERVAL=60

代码配置

from gemini_cli_sdk import GeminiClient, GeminiConfig

config = GeminiConfig(
    max_processes=3,
    idle_timeout=600,
    max_context_length=100,
    response_timeout=60.0
)

async with GeminiClient(config=config) as client:
    response = await client.chat("Hello!")
    print(response.content)

API 参考

GeminiClient

主要的客户端类,提供与 Gemini CLI 交互的接口。

方法

  • async start(): 启动客户端
  • async stop(): 停止客户端
  • create_session(user_id=None, metadata=None): 创建新会话
  • close_session(session_id): 关闭会话
  • async send_message(message, session_id=None, system_instruction=None, maintain_context=True, stream=False): 发送消息,根据 stream 参数返回 GeminiResponse 或异步生成器
  • async chat(message, session_id=None, stream=False): 简单聊天接口,支持流式返回
  • async one_shot(message, system_instruction=None, stream=False): 一次性查询,支持流式返回
  • async send_batch(messages, session_id=None, system_instruction=None): 批量发送
  • async send_concurrent(messages, system_instruction=None): 并发发送
  • get_stats(): 获取客户端统计信息
  • async health_check(): 健康检查

数据模型

GeminiResponse

@dataclass
class GeminiResponse:
    content: str
    session_id: Optional[str] = None
    process_id: Optional[str] = None
    timestamp: float = field(default_factory=time.time)
    metadata: Dict[str, Any] = field(default_factory=dict)

SessionInfo

@dataclass
class SessionInfo:
    session_id: str
    created_at: float
    last_activity: float
    message_count: int
    process_id: Optional[str] = None
    metadata: Dict[str, Any] = field(default_factory=dict)

异常

  • GeminiSDKError: 基础异常类
  • GeminiProcessError: 进程相关错误
  • GeminiSessionError: 会话相关错误
  • GeminiConfigError: 配置相关错误
  • GeminiTimeoutError: 超时错误
  • GeminiNotFoundError: Gemini CLI 未找到
  • GeminiConnectionError: 连接错误
  • GeminiValidationError: 输入验证错误

高级用法

自定义系统指令

async with GeminiClient() as client:
    system_instruction = "你是一个专业的 Python 编程助手,请用简洁明了的方式回答问题。"
    
    response = await client.one_shot(
        "如何创建一个 Python 类?",
        system_instruction=system_instruction
    )
    print(response.content)

会话元数据

async with GeminiClient() as client:
    # 创建带元数据的会话
    session_id = client.create_session(
        user_id="user123",
        metadata={"topic": "programming", "level": "beginner"}
    )
    
    # 获取会话信息
    session_info = client.get_session_info(session_id)
    print(f"会话创建时间: {session_info.created_at}")
    print(f"消息数量: {session_info.message_count}")

监控和统计

async with GeminiClient() as client:
    # 获取客户端统计信息
    stats = client.get_stats()
    print(f"活跃会话数: {stats['sessions']['active']}")
    print(f"进程池状态: {stats['processes']['idle']}/{stats['processes']['total']}")
    
    # 健康检查
    health = await client.health_check()
    print(f"健康状态: {health['status']}")

系统命令

SDK 完整支持 Gemini CLI 的所有系统命令:

async with GeminiClient() as client:
    # 获取帮助信息
    help_result = await client.system_help()
    print(help_result['available_commands'])
    
    # 获取版本信息
    about_result = await client.system_about()
    print(about_result['version'])
    
    # 获取系统统计
    stats_result = await client.system_stats('model')
    print(stats_result)
    
    # 清除会话历史
    await client.system_clear(session_id)
    
    # 管理对话检查点
    await client.chat_save_checkpoint("my_checkpoint", session_id)
    checkpoints = await client.chat_list_checkpoints()
    await client.chat_resume_checkpoint("my_checkpoint")
    
    # 管理扩展
    extensions = await client.manage_extensions("list")
    await client.manage_extensions("update", "extension_name")
    
    # 管理 MCP 服务器
    mcp_servers = await client.manage_mcp_servers("list")
    await client.manage_mcp_servers("refresh")
    
    # 管理工作空间目录
    await client.manage_workspace_directories("add", "/path/to/dir")
    dirs = await client.manage_workspace_directories("show")
    
    # 管理内存
    await client.manage_memory("add", "重要信息")
    memory = await client.manage_memory("show")
    
    # 列出可用工具
    tools = await client.list_tools(show_descriptions=True)

高级消息功能

支持文件引用、Shell 命令和系统命令的统一接口:

async with GeminiClient() as client:
    # 使用系统命令
    response = await client.send_message_with_features("/help")
    print(response.metadata['command_result'])
    
    # 使用文件引用(@ 语法)
    response = await client.send_message_with_features(
        "分析这个文件 @src/main.py 的代码结构",
        process_file_refs=True
    )
    
    # 使用 Shell 命令(! 语法)
    response = await client.send_message_with_features(
        "!ls -la",
        allow_shell_commands=True
    )
    
    # 直接执行系统命令
    result = await client.execute_system_command("stats", ["model"])
    print(result)

开发

安装开发依赖

pip install -e ".[dev]"

运行测试

# 运行所有测试
pytest

# 运行详细测试输出
pytest -v

# 运行特定测试文件
pytest tests/test_basic.py -v
pytest tests/test_system_commands.py -v

# 运行测试并显示覆盖率
pytest --cov=gemini_cli_sdk tests/

运行示例代码

# 基础使用示例
PYTHONPATH=. python3 examples/basic_usage.py

# 配置示例
PYTHONPATH=. python3 examples/configuration_example.py

# 系统命令示例
PYTHONPATH=. python3 examples/system_commands_example.py

# 高级功能示例(文件引用、Shell命令等)
PYTHONPATH=. python3 examples/advanced_features_example.py

测试新功能

如果你想测试文件引用和Shell命令功能,可以运行高级功能示例:

cd gemini-cli-sdk
PYTHONPATH=. python3 examples/advanced_features_example.py

这个示例会演示:

  • ✅ 文件引用处理 (@filename 语法)
  • ✅ Shell命令执行 (!command 语法)
  • ✅ 系统命令集成 (/command 语法)
  • ✅ 统一消息接口
  • ✅ 安全特性(危险命令阻止、文件大小限制等)

查看日志输出

SDK 默认启用日志功能,你可以看到详细的操作日志:

# 运行示例时会看到日志输出
PYTHONPATH=. python3 examples/advanced_features_example.py

# 运行测试时查看日志
PYTHONPATH=. python3 -m pytest tests/test_logging.py -v -s

# 测试特定功能的日志
PYTHONPATH=. python3 -m pytest tests/test_system_commands.py -v -s

日志输出示例:

2025-12-27 13:48:08,851 - gemini_cli_sdk.process_manager - INFO - Verified Gemini CLI at: gemini
2025-12-27 13:48:08,851 - gemini_cli_sdk.process_manager - INFO - Process manager started
2025-12-27 13:48:08,851 - gemini_cli_sdk.client - INFO - Gemini client started
2025-12-27 13:48:08,851 - gemini_cli_sdk.system_commands - INFO - Executed command: /help
2025-12-27 13:48:08,870 - gemini_cli_sdk.client - INFO - Executed shell command: echo Hello World (return code: 0)

配置日志级别

你可以通过配置文件或环境变量调整日志级别:

# 设置为 DEBUG 级别查看更详细的日志
export GEMINI_LOG_LEVEL=DEBUG
PYTHONPATH=. python3 examples/advanced_features_example.py

# 或者禁用日志
export GEMINI_ENABLE_LOGGING=false
PYTHONPATH=. python3 examples/advanced_features_example.py

代码格式化

black gemini_cli_sdk/

类型检查

mypy gemini_cli_sdk/

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

更新日志

v1.0.0

  • 初始版本发布
  • 支持基本的 Gemini CLI 交互
  • 会话管理功能
  • 进程池管理
  • 配置系统
  • 完整的异常处理

About

gemini cli sdk for python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages