# 流式输出处理功能

TravelContentCreator 现在支持三种不同的流式输出处理方法，让您能够更灵活地处理 AI 模型生成的文本内容。这些方法都在 `AI_Agent` 类中实现，可以根据不同的使用场景进行选择。

## 为什么需要流式处理？

流式处理（Streaming）相比于传统的一次性返回完整响应的方式有以下优势：

1. **实时性**：内容生成的同时即可开始处理，无需等待完整响应
2. **用户体验更好**：可以实现"打字机效果"，让用户看到文本逐步生成的过程
3. **更早检测错误**：可以在响应生成过程中及早发现问题
4. **长文本处理更高效**：特别适合生成较长的内容，避免长时间等待

## 流式处理方法

`AI_Agent` 类提供了三种不同模式的流式处理方法：

### 1. 同步流式响应 (generate_text_stream)

这种方法虽然使用了流式 API 连接，但会将所有的输出整合后一次性返回，适合简单的 API 调用。

```python
def generate_text_stream(self, system_prompt, user_prompt, temperature, top_p, presence_penalty):
    """
    生成文本内容（使用流式API但返回完整响应）
    
    Args:
        system_prompt: 系统提示词
        user_prompt: 用户提示词
        temperature: 温度参数
        top_p: 核采样参数
        presence_penalty: 存在惩罚参数
        
    Returns:
        str: 完整的生成文本
    """
```

使用示例：

```python
agent = AI_Agent(base_url, model_name, api_key, timeout=30, stream_chunk_timeout=10)
result = agent.generate_text_stream(system_prompt, user_prompt, 0.7, 0.9, 0.0)
print(result)  # 输出完整的生成结果
```

### 2. 回调式流式响应 (generate_text_stream_with_callback)

这种方法使用回调函数来处理流中的每个文本块，非常适合实时显示、分析或保存过程数据，更加灵活。

```python
def generate_text_stream_with_callback(self, system_prompt, user_prompt, 
                                     callback_fn, temperature=0.7, top_p=0.9, 
                                     presence_penalty=0.0):
    """
    生成文本流并通过回调函数处理每个块
    
    Args:
        system_prompt: 系统提示词
        user_prompt: 用户提示词
        callback_fn: 处理每个文本块的回调函数，接收(content, is_last, is_timeout, is_error, error)参数
        temperature: 温度参数
        top_p: 核采样参数
        presence_penalty: 存在惩罚参数
        
    Returns:
        str: 完整的响应文本
    """
```

回调函数应符合以下格式：

```python
def my_callback(content, is_last=False, is_timeout=False, is_error=False, error=None):
    """
    处理流式响应的回调函数
    
    Args:
        content: 文本块内容
        is_last: 是否为最后一个块
        is_timeout: 是否发生超时
        is_error: 是否发生错误
        error: 错误信息
    """
    if content:
        print(content, end="", flush=True)  # 实时打印
        
    # 处理特殊情况
    if is_last:
        print("\n完成生成")
        if is_timeout:
            print("警告: 响应流超时")
        if is_error:
            print(f"错误: {error}")
```

使用示例：

```python
agent = AI_Agent(base_url, model_name, api_key, timeout=30, stream_chunk_timeout=10)
result = agent.generate_text_stream_with_callback(
    system_prompt, 
    user_prompt, 
    my_callback,  # 传入回调函数
    temperature=0.7, 
    top_p=0.9, 
    presence_penalty=0.0
)
```

### 3. 异步流式响应 (async_generate_text_stream)

这种方法基于 `asyncio`，返回一个异步生成器，非常适合与其他异步操作集成，例如在异步网络应用中使用。

```python
async def async_generate_text_stream(self, system_prompt, user_prompt, temperature=0.7, top_p=0.9, presence_penalty=0.0):
    """
    异步生成文本流
    
    Args:
        system_prompt: 系统提示词
        user_prompt: 用户提示词
        temperature: 温度参数
        top_p: 核采样参数
        presence_penalty: 存在惩罚参数
        
    Yields:
        str: 生成的文本块
        
    Raises:
        Exception: 如果API调用在所有重试后失败
    """
```

使用示例：

```python
async def demo_async_stream():
    agent = AI_Agent(base_url, model_name, api_key, timeout=30, stream_chunk_timeout=10)
    
    full_response = ""
    try:
        # 使用异步生成器
        async for chunk in agent.async_generate_text_stream(
            system_prompt, 
            user_prompt, 
            temperature=0.7,
            top_p=0.9,
            presence_penalty=0.0
        ):
            print(chunk, end="", flush=True)  # 实时显示
            full_response += chunk
            
            # 这里可以同时执行其他异步操作
            # await some_other_async_operation()
            
    except Exception as e:
        print(f"错误: {e}")
    finally:
        agent.close()

# 在异步环境中运行
asyncio.run(demo_async_stream())
```

## 超时处理

所有流式处理方法都支持两种超时设置：

1. **全局请求超时**：控制整个API请求的最大持续时间
2. **流块超时**：控制接收连续两个数据块之间的最大等待时间

在创建 `AI_Agent` 实例时设置：

```python
agent = AI_Agent(
    base_url="your_api_base_url",
    model_name="your_model_name",
    api="your_api_key",
    timeout=60,            # 整体请求超时(秒)
    max_retries=3,         # 最大重试次数
    stream_chunk_timeout=10 # 流块超时(秒)
)
```

## 完整示例

我们提供了一个完整的示例脚本，演示所有三种流式处理方法的使用：

```
examples/test_stream.py
```

运行方式：

```bash
cd TravelContentCreator
python examples/test_stream.py
```

这将依次演示三种流式处理方法，并展示它们的输出和性能差异。

## 在WebUI中的应用

TravelContentCreator的WebUI已经集成了基于回调的流式处理，实现了生成内容的实时显示，大大提升了用户体验，特别是在生成长篇内容时。

## 在自定义项目中使用

如果您想在自己的项目中使用这些流式处理功能，只需导入 `AI_Agent` 类并按照上述示例使用相应的方法即可。所有流式处理方法都内置了完善的错误处理和重试机制，提高了生产环境中的稳定性。 