Codeaha(码悟)v1.0.0 的重点不只是增加一个代码聊天窗口,而是给出了一个明确的工程取向:以本地数据存储为基础,通过 Agent 工作流理解和修改代码,同时兼顾国产大模型与 MCP 工具体系。对于在意源码边界、会话可追溯性和部署复杂度的团队,这种架构比单纯比较模型参数更值得关注。
“本地优先”具体解决了什么
根据此次发布信息,Codeaha 会把会话、消息和代码变更落盘到本地 SQLite。这样做有几个直接影响:
- 数据归属更清楚:历史会话和变更记录不必依赖远端 SaaS 账户保存。
- 迁移与备份更直接:SQLite 本质上是文件,适合纳入现有的工作站备份、快照和加密策略。
- 故障排查更可控:管理员可以检查数据库是否存在、何时更新,以及包含哪些表,而不必先进入云端控制台。
- 部署依赖较少:项目使用 GF SQLite 驱动和
glebarez/go-sqlite,后者采用纯 Go 实现,无需 CGO。这有利于减少不同操作系统上的本地编译与动态库问题。
不过,本地落盘不等于完整的离线运行。只要配置的是远程模型接口,请求中的提示词、代码片段或工具结果仍可能离开本机;MCP 工具也可能访问网络服务。因此,评估时应把“存储位置”“模型推理位置”和“工具执行位置”分开检查。
GoFrame、Eino Graph 与 MCP 各自承担什么角色
Codeaha 的技术栈组合体现了一个典型 Agent 应用的分层方式:
- GoFrame 承担 Go 应用的基础工程能力,并配合数据库驱动管理本地数据。
- Eino Graph 用于组织 Agent 推理流程。与一次性的问答不同,编程任务通常需要经历读取上下文、规划、调用工具、生成修改、检查结果等多个节点。图式工作流更适合表达这些步骤及其分支。
- mark3labs/mcp-go 提供 MCP 相关能力,使 Agent 可以通过标准化方式连接外部工具或上下文来源。
- SQLite 保存会话、消息和代码变更,让 Agent 的执行过程具备本地持久化基础。
这套组合的价值在于解耦:模型负责推理,Graph 负责调度,MCP 负责工具边界,SQLite 负责状态。更换模型时,不必同时重写全部工具;新增工具时,也不必把执行细节硬编码进提示词。
“国产大模型友好”也应从这一角度理解。真正影响接入体验的,不只是能否填写一个模型地址,还包括工具调用格式、上下文窗口、结构化输出稳定性、超时与重试策略。v1.0.0 可以视为架构基线,团队仍应使用自己的仓库和任务集验证具体模型表现。
实践:先验证本地数据库,而不是直接读取业务内容
在不知道 Codeaha 实际数据库路径和表结构的情况下,不应编造固定路径或 SQL。下面的只读 Python 脚本可以用于检查任意 SQLite 文件:它只列出表名与行数,不打印消息或代码正文。
将内容保存为 inspect_sqlite.py,运行前把命令中的数据库路径替换为实际文件位置。建议先退出正在运行的应用,或者对数据库副本执行检查。
#!/usr/bin/env python3
import argparse
import sqlite3
from pathlib import Path
def main() -> None:
parser = argparse.ArgumentParser(
description="Inspect a local SQLite database without printing row contents."
)
parser.add_argument("database", help="Path to the SQLite database file")
args = parser.parse_args()
db_path = Path(args.database).expanduser().resolve()
if not db_path.is_file():
raise SystemExit(f"Database not found: {db_path}")
# Open in read-only mode to avoid accidental writes.
uri = db_path.as_uri() + "?mode=ro"
connection = sqlite3.connect(uri, uri=True)
try:
rows = connection.execute(
"""
SELECT name
FROM sqlite_master
WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
ORDER BY name
"""
).fetchall()
print(f"Database: {db_path}")
print(f"Size: {db_path.stat().st_size} bytes")
if not rows:
print("No user tables found.")
return
for (table_name,) in rows:
# Quote the identifier safely; table names cannot be SQL parameters.
quoted_name = table_name.replace('"', '""')
count = connection.execute(
f'SELECT COUNT(*) FROM "{quoted_name}"'
).fetchone()[0]
print(f"{table_name}: {count} rows")
finally:
connection.close()
if __name__ == "__main__":
main()
运行方式:
python3 inspect_sqlite.py /path/to/codeaha.db
这个检查可以回答三个基础问题:数据文件是否真的位于预期目录、应用运行后数据库是否发生变化、备份是否覆盖了主要数据表。它不会证明模型请求完全离线,因此还需要结合应用配置和系统网络监控进行验证。
给 Agent 的任务要能检查,而不只是能生成
Agent 推理流程的效果高度依赖任务描述。与其只输入“重构这个模块”,不如给出边界、验收命令和禁止修改项。例如可以采用下面的任务模板:
目标:把 internal/order 中重复的价格计算逻辑提取为一个函数。
约束:
- 不改变公开 API。
- 不修改数据库结构。
- 不新增第三方依赖。
- 金额继续使用项目现有的数据类型,不改为 float。
执行步骤:
1. 先列出涉及的文件和重复逻辑。
2. 给出修改计划,等待确认后再写入代码。
3. 修改后运行现有单元测试。
4. 汇总修改文件、测试结果和仍未覆盖的风险。
验收命令:
go test ./internal/order/...
这种输入能让 Graph 工作流中的规划、修改和验证节点拥有明确目标,也方便开发者审查本地保存的代码变更。对于高风险仓库,还可以要求 Agent 默认只生成补丁,不直接覆盖工作区。
采用前应完成的检查
Codeaha v1.0.0 适合优先在个人项目、内部工具或非关键仓库中试运行。正式接入团队开发流程前,建议逐项确认:
- 找到 SQLite 文件位置,并将其纳入加密、备份和清理策略。
- 明确所选模型是在本地推理还是通过远程 API 调用。
- 检查 MCP 工具能够访问的目录、命令、凭据和网络地址。
- 使用测试仓库验证代码修改是否可预览、撤销和审计。
- 准备一组固定任务,对不同国产模型比较成功率、延迟和工具调用稳定性。
- 不把数据库文件、模型密钥和包含敏感上下文的日志提交到 Git。
本地优先降低了数据被平台集中托管的风险,但不会自动消除模型服务、插件权限和本机安全问题。把 Codeaha 当成一个拥有读写代码能力的开发工具,为它设置与人类开发者同样清晰的权限、审查和回滚机制,才能真正发挥这套 Agent 架构的价值。