Metadata-Version: 2.4
Name: replyme
Version: 0.1.2
Summary: 有礼貌地生成一系列不重样的跟进消息，坚持不懈直到对方回复
Author-email: Chandler <275737875@qq.com>
License-Expression: MIT
Requires-Python: >=3.9
Requires-Dist: llmdog>=0.0.3
Requires-Dist: rich>=13.0.0
Requires-Dist: typer>=0.9.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == 'dev'
Description-Content-Type: text/markdown

# replyme - 有礼貌的跟进消息生成器

> 有礼貌地生成一系列不重样的跟进消息，坚持不懈直到对方回复。

![Python](https://img.shields.io/badge/Python-3.9+-blue.svg)
![License](https://img.shields.io/badge/License-MIT-green.svg)

---

## 目录

1. [项目简介](#1-项目简介)
2. [安装配置](#2-安装配置)
3. [快速开始](#3-快速开始)
4. [使用示例](#4-使用示例)
5. [CLI命令详解](#5-cli命令详解)
6. [Python API](#6-python-api)
7. [配置文件](#7-配置文件)
8. [项目架构](#8-项目架构)
9. [常见问题](#9-常见问题)
10. [免责声明](#10-免责声明)

---

## 1. 项目简介

### 1.1 这是什么？

replyme 是一个 Python 命令行工具，利用 AI 大语言模型自动生成有礼貌、不重样的跟进消息。

### 1.2 解决什么问题？

当你给对方发送消息或邮件后，对方迟迟不回复，你需要继续跟进时：

- ✅ 每条消息不能重复，要换角度切入
- ✅ 语气要有礼貌，不能显得咄咄逼人
- ✅ 要坚持不懈，直到对方回复为止
- ✅ 需要理解你之前发了什么、目的是什么

### 1.3 核心功能

| 功能 | 说明 |
|------|------|
| 双场景支持 | 邮件(Email) / 即时通讯(IM) |
| 多种风格 | formal/friendly/persistent/angry/poor/casual/polite |
| 智能去重 | 生成的消息绝不重复 |
| 上下文理解 | 理解你的原始诉求，生成恰当内容 |
| 日志记录 | 每次生成自动保存历史记录 |

---

## 2. 安装配置

### 2.1 系统要求

- Python 3.9 或更高版本
- macOS / Linux / Windows

### 2.2 安装步骤

```bash
# 1. 克隆或下载项目
cd replyme

# 2. 创建虚拟环境（推荐）
python -m venv .venv
source .venv/bin/activate  # macOS/Linux
# 或 .venv\Scripts\activate  # Windows

# 3. 安装项目
pip install -e .
```

### 2.3 依赖说明

replyme 依赖以下 Python 包：

| 依赖 | 版本 | 用途 |
|------|------|------|
| typer | ≥0.9.0 | 命令行界面框架 |
| llmdog | ≥0.0.3 | LLM 大模型调用 |
| rich | ≥13.0.0 | 终端美化输出 |

### 2.4 API 密钥配置

replyme 通过 llmdog 调用大模型，需要配置 API 密钥：

```bash
# 设置环境变量
export LLM_API_KEY="your-api-key-here"

# 或在 ~/.bashrc / ~/.zshrc 中永久保存
echo 'export LLM_API_KEY="your-api-key-here"' >> ~/.bashrc
source ~/.bashrc
```

**支持的模型服务商：**

- OpenAI (GPT-4, GPT-3.5)
- Claude (Anthropic)
- 通义千问
- 智谱 GLM
- 任意 OpenAI 兼容 API

详细配置请参考 [llmdog 文档](https://pypi.org/project/llmdog/)。

### 2.5 初始化配置

```bash
replyme init
```

首次运行会创建 `replyme/` 配置目录：

```
replyme/
├── config.json      # 运行时配置
├── prompts.json     # 自定义提示词
└── logs/            # 生成日志
```

---

## 3. 快速开始

### 3.1 最简单的用法

```bash
replyme run "请问项目进展如何？"
```

### 3.2 带文件输入的用法

```bash
# 读取之前的邮件内容
replyme run --input previous_email.txt --scene email --style formal

# 读取聊天记录
replyme run --input chat_history.json --scene im --style casual
```

### 3.3 Python API 用法

```python
from replyme import generate_series

# 生成5条跟进消息
messages = generate_series(
    topic="请确认合同",
    scene="im",
    style="polite",
    count=5
)

for msg in messages:
    print(msg)
```

---

## 4. 使用示例

### 4.1 Email 场景

#### 正式商务风格 (formal)

```bash
replyme run --input email.txt --scene email --style formal --count 3
```

生成特点：
- 语气正式、专业、礼貌
- 体现商务礼仪
- 字数 80-200 字

#### 友好亲切风格 (friendly)

```bash
replyme run --input email.txt --scene email --style friendly --count 3
```

生成特点：
- 语气友好、亲切、自然
- 像同事之间沟通
- 字数 80-200 字

#### 坚持不懈风格 (persistent)

```bash
replyme run --input email.txt --scene email --style persistent --count 5
```

生成特点：
- 礼貌但坚定
- 说明影响和风险
- 字数 80-200 字

#### 愤怒警告风格 (angry)

```bash
replyme run --input email.txt --scene email --style angry --count 3
```

生成特点：
- 表达强烈不满但保持基本礼貌
- 质问拖延原因、暗示后果
- 不能人身攻击或使用粗俗语言

#### 可怜求助风格 (poor)

```bash
replyme run --input email.txt --scene email --style poor --count 3
```

生成特点：
- 真诚示弱博取同情
- 说明自己的困境
- 不要卑微到失去尊严

### 4.2 IM 即时通讯场景

#### 轻松随意风格 (casual)

```bash
replyme run "周末有空一起吃饭吗？" --scene im --style casual --count 5
```

生成特点：
- 语气轻松随意，像发微信
- 字数 30-80 字

#### 礼貌得体风格 (polite)

```bash
replyme run "请问设计稿什么时候能出？" --scene im --style polite --count 5
```

生成特点：
- 礼貌温和，得体但不失亲切
- 字数 40-100 字

#### 坚持不懈风格 (persistent)

```bash
replyme run "请回复合同确认" --scene im --style persistent --count 10
```

生成特点：
- 礼貌但明确
- 请求具体时间、直接提问
- 字数 40-100 字

#### 愤怒警告风格 (angry)

```bash
replyme run "你已读不回是什么意思？" --scene im --style angry --count 3
```

生成特点：
- 表达强烈不满但保持基本礼貌
- 字数 40-100 字

#### 可怜求助风格 (poor)

```bash
replyme run "帮帮忙吧" --scene im --style poor --count 3
```

生成特点：
- 真诚示弱博取同情
- 字数 40-100 字

---

## 5. CLI命令详解

### 5.1 命令列表

| 命令 | 说明 |
|------|------|
| `replyme init` | 初始化配置目录 |
| `replyme run` | 生成跟进消息 |

### 5.2 init 命令

```bash
replyme init
```

功能：创建 `replyme/` 配置目录和默认配置文件。

### 5.3 run 命令

```bash
replyme run [TOPIC] [OPTIONS]
```

#### 参数说明

| 参数 | 缩写 | 类型 | 默认值 | 说明 |
|------|------|------|--------|------|
| `TOPIC` | — | 字符串 | 空 | 想要跟进的主题或问题，与 `--input` 二选一 |

#### 选项说明

| 选项 | 缩写 | 类型 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--input` | `-i` | 路径 | 空 | 输入文件路径（支持 txt/json/md），可指定多个 |
| `--scene` | `-s` | 字符串 | `im` | 场景：email(邮件) 或 im(即时通讯) |
| `--style` | `-t` | 字符串 | polite/casual | 风格选项 |
| `--count` | `-n` | 整数 | 5 | 生成消息数量 (1-20) |
| `--model` | `-m` | 字符串 | 空 | 指定 LLM 模型名称 |
| `--interval` | `--wait` | 整数 | 0 | 每条消息之间的间隔秒数 |
| `--output` | `-o` | 路径 | 空 | 日志输出目录 |

#### 风格选项对照

**Email 场景 (`--scene email`)**

| 风格 | 说明 |
|------|------|
| `formal` | 正式商务（默认） |
| `friendly` | 友好亲切 |
| `persistent` | 坚持不懈 |
| `angry` | 愤怒警告 |
| `poor` | 可怜求助 |

**IM 场景 (`--scene im`)**

| 风格 | 说明 |
|------|------|
| `casual` | 轻松随意 |
| `polite` | 礼貌得体（默认） |
| `persistent` | 坚持不懈 |
| `angry` | 愤怒警告 |
| `poor` | 可怜求助 |

#### 使用示例

```bash
# 纯主题模式（IM，礼貌得体）
# 直接输入文本作为跟进主题，适用于不需要文件输入的简单场景
replyme run "请问项目进展如何？" --count 5

# 纯主题模式（Email，正式商务）
# 任意文本均可作为主题，自动按指定场景和风格生成跟进内容
replyme run "上周提交的报销申请是否已审批？" --scene email --style formal --count 3

# 邮件场景 + 文件输入（正式商务）
replyme run --input previous_email.txt --scene email --style formal --count 3

# IM场景 + JSON聊天记录（轻松随意）
replyme run --input chat_record.json --scene im --style casual --count 3

# 多文件输入
replyme run --input email1.txt --input email2.md --scene email --style friendly

# 坚持不懈 + 间隔30秒
replyme run "请回复合同确认" --scene im --style persistent --count 10 --interval 30

# 指定模型
replyme run "项目进展" --model qwen3-72b-instruct --count 3

# 指定输出目录
replyme run "测试" --output ./logs
```

---

## 6. Python API

### 6.1 核心函数

#### generate_one()

生成一条跟进消息：

```python
from replyme import generate_one

msg = generate_one(
    topic="请问项目进展如何？",
    scene="im",
    style="polite",
    model=None,  # 可指定模型
)

print(msg)
```

#### generate_series()

生成一系列跟进消息：

```python
from replyme import generate_series

messages = generate_series(
    topic="请确认合同",
    count=5,
    scene="im",
    style="polite",
)

for i, msg in enumerate(messages, 1):
    print(f"第{i}条: {msg}")
```

### 6.2 完整参数说明

```python
generate_series(
    topic=None,           # 主题（与 original_content 二选一）
    count=5,             # 生成数量 (1-20)
    original_content=None,  # 原始内容（邮件/聊天记录）
    scene="im",          # 场景：email / im
    style="polite",      # 风格
    model=None,          # 指定模型
    system_prompt=None,  # 自定义系统提示词
    on_generated=None,   # 回调函数
)
```

### 6.3 回调函数示例

```python
def on_msg(index, message):
    print(f"生成第 {index + 1} 条消息:")
    print(message)
    print("-" * 50)

messages = generate_series(
    topic="请确认合同",
    count=5,
    on_generated=on_msg,
)
```

### 6.4 基于文件内容的示例

```python
from replyme import generate_series

# 邮件场景 - 基于之前发送的邮件
messages = generate_series(
    topic="项目进展跟进",
    original_content="张总您好，关于智慧园区项目...",
    scene="email",
    style="formal",
    count=3,
)

# IM场景 - 基于聊天记录
messages = generate_series(
    original_content="我: 周末有空一起吃饭吗？\n我: 发现一家新开的日料店",
    scene="im",
    style="casual",
    count=3,
)
```

---

## 7. 配置文件

### 7.1 配置目录结构

```
replyme/
├── config.json      # 运行时默认配置
├── prompts.json     # 自定义系统提示词
└── logs/            # 生成日志
    └── xxx_follow_up.json
```

### 7.2 config.json

默认配置文件：

```json
{
  "scene": "im",
  "style": "polite",
  "model": null,
  "count": 5,
  "interval": 0
}
```

| 字段 | 类型 | 说明 |
|------|------|------|
| `scene` | 字符串 | 默认场景：email / im |
| `style` | 字符串 | 默认风格 |
| `model` | 字符串/null | 默认模型 |
| `count` | 整数 | 默认生成数量 |
| `interval` | 整数 | 默认间隔秒数 |

### 7.3 prompts.json

提示词配置文件，支持自定义各场景/风格的系统提示词：

```json
{
  "email": {
    "formal": "你是一个跟进邮件撰写助手。...",
    "friendly": "...",
    "persistent": "...",
    "angry": "...",
    "poor": "..."
  },
  "im": {
    "casual": "...",
    "polite": "...",
    "persistent": "...",
    "angry": "...",
    "poor": "..."
  }
}
```

### 7.4 自定义提示词

如果你想完全自定义生成风格，可以修改 `prompts.json` 中的提示词模板。

**提示词结构要求：**

1. **角色定义 + 场景描述** - 说明你是谁，要做什么
2. **工作流程** - 先理解 → 再生成
3. **绝对规则** - 输出格式约束

**示例：自定义友好风格提示词**

```json
{
  "email": {
    "friendly": "你是一个跟进邮件撰写助手。\n\n场景：我之前给对方发过邮件，但对方一直没有回复。我需要继续发跟进邮件，友好地推动对方回复。\n\n你的工作流程：\n1. 先理解我之前发了什么邮件、核心诉求是什么\n2. 基于这个理解，写一封新的跟进邮件，换一个角度或切入点来推动回复\n\n绝对规则（必须遵守）：\n- 只输出一封邮件的正文纯文本，不要输出其他任何内容\n- 绝对不要输出多封邮件供选择，只输出一封\n- 不要加任何说明、解释、注释、编号、选项、分析过程\n- 不要使用markdown格式\n- 语气友好、亲切、自然\n- 字数控制在80-200字\n- 新邮件必须与之前发过的所有邮件明显不同"
  }
}
```

### 7.5 日志文件

每次生成消息后，会自动保存日志到 `replyme/logs/` 目录：

```json
{
  "stem": "test_email",
  "scene": "email",
  "style": "formal",
  "topic": "项目进展跟进",
  "timestamp": "2026-06-02T14:22:31.040664",
  "original_content": "张总您好，关于我们正在推进的智慧园区项目...",
  "generated_messages": [
    {"index": 1, "content": "张总您好，此前就智慧园区项目..."},
    {"index": 2, "content": "张总您好，再次跟进一下..."}
  ]
}
```

---

## 8. 项目架构

### 8.1 目录结构

```
replyme/
├── pyproject.toml              # 项目配置
├── src/replyme/
│   ├── __init__.py             # 公共 API 导出
│   ├── core.py                 # 核心生成逻辑
│   ├── config.py               # 配置管理 + 内置提示词
│   ├── cli.py                  # Typer CLI（init / run）
│   ├── reader.py               # 文件读取（txt/json/md）
│   └── logger.py               # JSON 日志保存
└── replyme/                   # 运行时配置（自动创建）
```

### 8.2 模块说明

| 模块 | 文件 | 职责 |
|------|------|------|
| CLI | `cli.py` | 命令行入口，参数解析，输出美化 |
| 配置 | `config.py` | 配置读写，提示词管理，风格定义 |
| 核心 | `core.py` | 构建用户提示，调用 LLM，消息去重 |
| 读取 | `reader.py` | 读取 txt/json/md 文件 |
| 日志 | `logger.py` | 保存生成历史到 JSON |

### 8.3 数据流

```
用户输入 (topic / --input files)
    │
    ▼
cli.py: run()
    ├── reader.py: read_files() → original_content
    ├── config.py: load_config() → ReplymeConfig
    ├── config.py: get_system_prompt() → system_prompt
    │
    ▼
core.py: generate_series()
    │   循环 N 次:
    │       generate_one()
    │           ├── 构建 user_content
    │           ├── llmdog.chat() 调用 LLM
    │           └── 返回一条新消息
    │
    ▼
logger.py: save_follow_up_log()
    └── 保存 {stem}_follow_up.json
```

### 8.4 提示词加载优先级

1. 本地文件 `replyme/prompts.json`（用户自定义）
2. 内置 `_BUILTIN_PROMPTS`（代码中定义）

### 8.5 配置加载优先级

1. 命令行参数（最高）
2. 本地配置文件 `replyme/config.json`
3. 内置默认值（最低）

---

## 9. 常见问题

### Q1: 安装失败，提示缺少依赖？

```bash
pip install --upgrade pip
pip install -e .
```

### Q2: 提示 "LLM_API_KEY" 未设置？

```bash
export LLM_API_KEY="your-api-key-here"
```

### Q3: 生成的消息太长/太短？

可以在 `prompts.json` 中自定义提示词，调整字数约束。

### Q4: 如何更改默认场景/风格？

编辑 `replyme/config.json`：

```json
{
  "scene": "email",
  "style": "formal"
}
```

### Q5: 支持哪些输入文件格式？

| 格式 | 扩展名 | 说明 |
|------|--------|------|
| 纯文本 | .txt | 直接读取 |
| JSON | .json | 支持字符串、列表、字典 |
| Markdown | .md | 自动去除格式标记 |

### Q6: 如何查看历史生成记录？

日志保存在 `replyme/logs/` 目录，每个主题一个 JSON 文件。

### Q7: 如何重置配置？

```bash
rm -rf replyme
replyme init
```

### Q8: 模型调用失败？

1. 检查 API 密钥是否正确
2. 检查网络连接
3. 确认模型名称是否正确

---

## 10. 免责声明

### 10.1 AI 生成内容

replyme 生成的跟进消息由人工智能模型自动生成，不代表开发者的观点或立场。

### 10.2 责任归属

1. **用户责任**：用户对生成内容的使用承担全部责任
2. **审查义务**：使用前请仔细审查生成内容，确保适当且准确
3. **风险承担**：因使用 AI 生成内容导致的任何后果，由用户自行承担

### 10.3 使用限制

- 请勿将生成内容用于骚扰、欺诈或其他违法用途
- 请勿生成歧视性、仇恨性或攻击性内容
- 请遵守当地法律法规和相关平台的使用条款

### 10.4 免责声明

本软件按"原样"提供，不提供任何明示或暗示的保证。开发者不对软件的功能、准确性、可靠性或适用性做出任何承诺。

在适用法律允许的最大范围内，开发者不对因使用本软件而产生的任何直接、间接、偶然、特殊、惩罚性或后果性损害承担责任。

---

## 许可证

MIT License


