first_model_shell - 第一层大模型交互Shell
一个极简的大模型交互Shell,使用文件系统记录所有交互历史,实现上下文管理。
file is all:所有交互状态都通过文件记录和管理。初始化设定、用户输入、模型输出均保存为文件,下次交互时拼接历史文件和最新输入实现上下文。通过编辑文件即可编辑上下文。
- 简单交互:只实现最基础的交互功能
- 零抽象:禁止任何抽象、方法抽取调用,整个脚本一目了然
- 专注基础:高级功能(会话管理、上下文工具、子代理、任务规划等)不在此层实现,请使用其他高级工具
- Ollama - 本地大模型运行环境
# 简单对话
bash ./chat.sh "你好,介绍一下这个项目"
# 带命令执行的对话
bash ./command.sh "创建一个test.txt文件"
# 归档当前会话
bash ./log_archive.sh| 目录 | 说明 |
|---|---|
init_log_chat/ |
简单对话会话的初始化模板 |
init_log_command/ |
带命令执行对话会话的初始化模板 |
log_chat/ |
当前进行的简单对话会话(自动创建) |
log_command/ |
当前进行的带命令执行对话会话(自动创建) |
zzz/ |
会话归档目录,按时间戳存放历史会话 |
# 开始新对话或继续现有对话
./chat.sh "用户消息内容"
# 无参数时继续现有对话
./chat.sh功能:
- 如果
log_chat目录不存在,从init_log_chat复制模板创建新会话 - 记录用户输入到时间戳命名的
.msg文件 - 合并所有历史消息发送给Ollama模型(使用
qwen2.5:7b) - 保存模型输出到
.model_output文件并追加到消息文件
# 开始新命令会话或继续现有会话
./command.sh "执行一个Linux命令"
# 无参数时继续现有会话
./command.sh功能:
- 如果
log_command目录不存在,从init_log_command复制模板创建新会话 - 与
chat.sh相同的对话记录功能 - 额外功能:解析模型输出中的命令块并执行
- 命令块格式:
MCCB_model_call_command_blocks_start # 命令内容(如:echo "Hello World") MCCB_model_call_command_blocks_end - 包含安全机制:检查危险操作(如
rm -rf)需要用户确认
# 将当前会话归档到zzz目录
./log_archive.sh功能:
- 将
log_chat和log_command目录移动到zzz/目录下 - 按时间戳重命名(格式:
log_chat_YYYYMMDD_HHMMSS) - 归档后可以开始新的会话
$ ./chat.sh "你好"
会话开始
用户: 你好
model: 你好!有什么我可以帮助你的吗?
$ ./chat.sh "介绍一下Linux"
用户: 介绍一下Linux
model: Linux是一种开源的操作系统内核,由林纳斯·托瓦兹于1991年首次发布...$ ./command.sh "创建一个hello.txt文件"
会话开始
用户: 创建一个hello.txt文件
model: 我来帮你创建一个hello.txt文件。
MCCB_model_call_command_blocks_start
echo "Hello World" > hello.txt
MCCB_model_call_command_blocks_end
脚本执行结果:
Hello World
脚本退出状态: 0$ ./log_archive.sh
# log_chat和log_command目录被移动到zzz/log_chat_20260404_161609等目录.msg文件:纯文本格式,包含完整的对话历史.model_output文件:模型原始输出.model_output_command.sh文件:从模型输出提取的可执行脚本
- 安全警告:
command.sh会执行模型生成的命令,请谨慎使用 - 模型要求:默认使用
qwen2.5:7b模型,确保已通过ollama pull qwen2.5:7b下载 - 会话管理:长时间对话可能产生大量文件,定期使用
log_archive.sh归档 - 自定义模型:修改脚本中的
ollama run qwen2.5:7b部分可使用其他模型
用户输入 → 保存到.msg文件 → 拼接所有历史.msg文件 → 发送给模型
↑ ↓
上下文维护 ← 模型输出保存到.msg文件 ← 接收模型输出
通过编辑历史 .msg 文件,可以手动修改对话上下文,实现精确的上下文控制。