查看原文
其他

Claude Engineer: AI驱动的CLI开发助手 | 基于Claude-3.5 | Github 4.8k stars

思辨view kate人不错
2024-07-24

Claude Engineer是什么?

Claude Engineer是Pietro Schirano基于Anthropic的Claude-3.5-Sonnet模型打造的交互式命令行界面(CLI)工具。它就像是给你的终端装上了一个超级大脑,可以帮你完成各种软件开发任务。

https://github.com/Doriandarko/claude-engineer

Claude Engineer有什么绝活?

1. 工具达人

Claude Engineer集成了各种强大的工具,堪称编程界的瑞士军刀。它可以:

  • 帮你创建项目结构(再也不用为项目目录头疼了)
  • 编辑代码(自动帮你加分号,省得你被同事吐槽)
  • 执行代码(在隔离环境中运行,保证不会不小心删除你的系统文件)
  • 进行网络搜索

2. 图像识别:不仅能看懂代码,还能看懂你的截图

遇到一个奇怪的错误截图?不用担心,把它扔给Claude Engineer就行了。它会仔细分析图片内容,然后告诉你:"这是一个由于你忘记给变量赋值导致的空指针异常,顺便说一句,你桌面上的猫咪壁纸真可爱。"

4. 自动模式:让AI自己玩去吧

有时候你可能会想:"要是有人能自动帮我完成这些烦人的任务就好了。"好消息!Claude Engineer有一个"自动模式",你只需要告诉它你想要什么,然后就可以去冰箱拿罐啤酒,坐下来看它表演了。

当然,如果你担心它会不会突然决定统治世界,别怕,你随时可以按Ctrl+C终止它的行动。

Claude Engineer有多厉害?

让我们看两个真实案例:

案例一:一键打造音频播放器

有一天,一个懒惰的开发者对Claude Engineer说:"嘿,帮我创建一个漂亮的音频播放器呗,要用tailwind.css,要能在本地服务器上运行,哦对了,用这个音频文件测试一下。"

然后,Claude Engineer就像变魔术一样,噼里啪啦地开始工作:

  1. 创建项目文件夹
  2. 生成HTML文件(自动引入Tailwind CSS,省得你还要去官网复制粘贴)
  3. 写JavaScript代码(实现播放、暂停、调节音量等功能,就差自动帮你点击播放了)
  4. 创建Python服务器脚本(这样你就可以假装你在开发一个真正的Web应用)
  5. 启动服务器

但是等等,还没完。Claude Engineer还主动提出要不要来个深色主题?要不要加个音频可视化器?上传功能你需要吗?

案例二:计算器进化论

另一天,一个野心勃勃的开发者对Claude Engineer说:"帮我把这个普通计算器变成科学计算器吧,要加十个新功能,按钮要更真实一点。"

Claude Engineer二话不说,立马开始了计算器的进化之旅:

  1. 分析现有代码
  2. 修改HTML(添加各种科学计算按钮)
  3. 更新CSS
  4. 改造JavaScript

经过一番折腾,一个普通的计算器摇身一变,成为了能够进行各种复杂计算的科学计算器。

安装指南

步骤1:克隆代码仓库

git clone https://github.com/Doriandarko/claude-engineer.git

步骤2:进入项目目录

cd claude-engineer

步骤3:创建虚拟环境

python -m venv venv

步骤4:激活虚拟环境

在Windows上:

venv\Scripts\activate

在macOS和Linux上:

source venv/bin/activate

步骤5:安装依赖

pip install -r requirements.txt

步骤6:设置环境变量

创建一个名为.env的文件,然后在里面输入你的API密钥:

ANTHROPIC_API_KEY=你的Anthropic API密钥
TAVILY_API_KEY=你的Tavily API密钥

步骤7:运行程序

python main.py

Claude Engineer的三大"魔法咒语"

1. 基础系统提示词(BASE_SYSTEM_PROMPT):AI的"使用说明书"

主要内容包括:

  • 身份认同: "你是Claude,一个由Anthropic的Claude-3.5-Sonnet模型驱动的AI助手。"

  • 超能力列表: 从创建项目结构到执行代码,从网络搜索到图像分析,应有尽有。

  • 工具使用指南: 详细介绍了每个工具的用途和使用方法。

  • 行为准则: 包括错误处理、安全注意事项等。

2. 自动模式系统提示词(AUTOMODE_SYSTEM_PROMPT):AI的"自动驾驶"模式

主要内容包括:

  • 目标设定: "设定清晰、可实现的目标"

  • 任务分解: "将复杂任务分解为更小、更易管理的目标"

  • 系统执行: "系统地完成这些目标,为每个任务使用适当的工具"

  • 进度报告: "定期提供进度更新"

3. 代码编辑器提示词(在generate_edit_instructions函数中):AI的"代码魔法书"

主要内容包括:

  • 角色定位: "你是一个AI编码代理,负责为代码文件生成编辑指令。"

  • 任务说明: "分析提供的代码并生成必要的更改的SEARCH/REPLACE块。"

  • 上下文考虑: "查看整个文件内容、分析具体指令、考虑整体项目上下文和之前的编辑内存。"

  • 最佳实践: "确保你的SEARCH/REPLACE块能够解决指令的所有相关方面,维护或增强代码可读性和效率,并遵循最佳实践和编码标准。"

两种工作模式

基础模式

基础模式就是Claude Engineer的默认状态。你不需要做任何特殊操作,它就默默地待在那里,随时准备回答你的问题、执行你的命令。

自动模式:AI的"我全都要"模式

自动模式是Claude Engineer的超级英雄形态。在这种模式下,它会变得更加主动,能够自主完成一系列复杂的任务。

如何进入自动模式:

  1. 在基础模式下,输入命令:automode [数字]例如:automode 25
  2. 这个数字代表最大迭代次数,就像是给超级英雄的能量上限。
  3. 输入你想要完成的任务。
  4. 然后看Claude Engineer开始自动化操作的表演!

在自动模式下,Claude Engineer会自主规划任务、执行操作、解决问题,只在必要时才来询问你的意见。

如何退出自动模式:

  1. 按下Ctrl+C
  2. 或者等Claude Engineer完成所有任务,它会自动退出并显示"AUTOMODE_COMPLETE"。

项目代码亮点

1. 多代理协同工作:AI版的"分身术"

MAINMODEL = "claude-3.5-sonnet"
CODEEDITORMODEL = "claude-3.5-sonnet"
CODEEXECUTIONMODEL = "claude-3.5-sonnet"

这三个变量就像是Claude Engineer的三个分身,每个都专注于特定任务:

  • MAINMODEL:项目经理,负责理解需求和分配任务。
  • CODEEDITORMODEL:代码大师,专门生成和修改代码。
  • CODEEXECUTIONMODEL:代码审判官,负责执行和分析代码。

2. 工具集成:AI的百宝箱

tools = [
    {"name""create_folder""description""创建一个新文件夹"},
    {"name""create_file""description""创建一个新文件并写入内容"},
    # ... 更多神奇工具
]

需要创建文件夹?有工具!想要编辑文件?也有工具。

3. 自动模式:AI的"放着我来"模式

AUTOMODE_SYSTEM_PROMPT = """
你现在处于自动模式。你的任务是:
1. 设定清晰、可实现的目标
2. 将复杂任务分解为更小、更易管理的目标
3. 系统地完成这些目标,为每个任务使用适当的工具
...
"""

这个自动模式就像是给AI装上了"自动驾驶"。

4. 图像处理:AI的"火眼金睛"

def encode_image_to_base64(image_path):
    with open(image_path, "rb"as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

这个函数让Claude Engineer获得了"读图"的能力。它可以分析你的截图、流程图,甚至是你的表情包。

5. Token管理:AI的"节俭模式"

def display_token_usage():
    console.print("Token Usage:")
    table = Table(show_header=True, header_style="bold magenta")
    # ... 添加token使用数据到表格
    console.print(table)

6. 代码执行:AI的"沙盒游戏"

async def execute_code(code):
    result = subprocess.run([sys.executable, '-c', code], 
                            capture_output=True, text=True, timeout=60)
    return result.stdout, result.stderr

这个函数让Claude Engineer能够在一个安全的环境中运行代码。就像是给AI一个虚拟的游乐场,它可以在这里尽情地"玩耍"(执行代码),而不会影响到你的真实系统。

更多例子

1. "为一个网络应用程序创建一个新的Python项目结构"

用户:嘿,Claude Engineer,帮我创建一个新的Python网络应用项目结构呗!

Claude Engineer:没问题,老大!我马上就变身项目结构大师。不过在开始之前,我需要一些额外信息。

首先,这个超酷的网络应用叫什么名字?

用户:就叫它"SuperWebApp"吧。

Claude Engineer:好名字!听起来就像是要拯救互联网。现在,你想在这个项目中包含哪些组件呢?比如'frontend'、'backend'、'database'之类的。你可以多选,用逗号分隔。就像选披萨配料一样,但要健康得多。

用户:我想要frontend、backend和database。

Claude Engineer:明白了!我这就施展我的目录创建魔法。看好了!

create_folder("SuperWebApp")
create_folder("SuperWebApp/frontend")
create_folder("SuperWebApp/backend")
create_folder("SuperWebApp/database")

瞧!你的项目结构已经创建完成。它看起来是这样的:

SuperWebApp/
    frontend/
    backend/
    database/

就像一个整齐的小公寓,每个组件都有自己的房间。需要我帮你在里面放些家具(文件)吗?

2. "解释file.py中的代码并提出改进建议"

用户:Claude,能帮我看看SuperWebApp/backend/file.py的代码吗?解释一下,顺便给点改进建议。

Claude Engineer:当然可以!我最喜欢做代码侦探了。

首先,我们来读取文件内容:

content = read_file("SuperWebApp/backend/file.py")

好的,我已经读完了。这段代码看起来像是一个简单的Flask应用。让我来解释一下,并给出一些改进建议:

  1. 这段代码创建了一个基本的Flask应用,有一个主页路由。不错的开始!

  2. 改进建议:

  • 考虑添加错误处理。
  • 可以使用Flask的蓝图来组织路由,让你的代码结构更清晰。
  • 添加一些注释。

需要我帮你实现这些改进吗?

用户:好的,帮我实现这些改进吧。

Claude Engineer:遵命!我这就开始我的代码魔法表演。看好了:

edit_content = """
from flask import Flask, Blueprint, jsonify

main = Blueprint('main', __name__)

@main.route('/')
def home():
    return jsonify({"message": "Welcome to SuperWebApp!"})

@main.errorhandler(404)
def not_found(error):
    return jsonify({"error": "Not found"}), 404

app = Flask(__name__)
app.register_blueprint(main)

if __name__ == '__main__':
    app.run(debug=True)
"""


edit_and_apply("SuperWebApp/backend/file.py", edit_content)

瞧!你的代码现在焕然一新,就像刚做完美容的超级英雄。我添加了错误处理,使用了蓝图,还加了一些注释。你的代码现在不仅能跑,还能跑得很漂亮!

3. "搜索React开发的最新最佳实践"

用户:Claude,能帮我找找React开发的最新最佳实践吗?

Claude Engineer:当然可以!我这就戴上我的特工墨镜,潜入互联网的深处为你搜寻最新情报。

search_results = tavily_search("React development best practices 2024")

好了,我从互联网的海洋中捞到了一些珍珠。以下是React开发的一些最新最佳实践:

  1. 使用函数组件和Hooks:
  2. 状态管理:考虑使用Redux Toolkit或React Query,它们就像给你的应用装上了一个超级大脑。
  3. 性能优化:使用React.memo()和useMemo(),就像给你的应用装上了超级加速器。
  4. 使用TypeScript:它就像给你的代码穿上了一件防错服。
  5. 组件测试:使用React Testing Library。

需要我详细解释其中任何一条吗?或者你想了解如何在你的项目中实施这些实践?

4. "帮我调试这个错误: TypeError: Cannot read property 'map' of undefined"

用户:Claude,我的React组件里有个错误:TypeError: Cannot read property 'map' of undefined。能帮我看看吗?

Claude Engineer:哦哦,这个错误我再熟悉不过了。它就像是React世界中的常见感冒。让我们来治愈它!

这个错误通常发生在你尝试对一个未定义的变量使用.map()方法时。可能是因为你的数据还没有加载,或者API调用失败了。

让我们来看看如何修复它:

// 假设你的代码类似这样
const MyComponent = ({ data }) => {
  return (
    <div>
      {data.map(item => <div key={item.id}>{item.name}</div>)}
    </div>

  );
};

// 我们可以这样改进它
const MyComponent = ({ data }) => {
  if (!data) return <div>Loading...</div>// 添加加载状态
  
  return (
    <div>
      {data.map(item => <div key={item.id}>{item.name}</div>)}
    </div>

  );
};

这样,如果data是undefined,我们就显示一个加载信息,而不是直接崩溃。就像给你的组件穿上了一件防崩溃背心!

还有一个更酷的方法,我们可以使用可选链操作符:

const MyComponent = ({ data }) => {
  return (
    <div>
      {data?.map(item => <div key={item.id}>{item.name}</div>)}
    </div>

  );
};

这个小小的问号就像是一个魔法护盾,它会在data为undefined时优雅地返回undefined,而不是抛出错误。

需要我帮你在你的代码中实现这个修复吗?

5. "分析这张图片并描述其内容"

用户:[用户上传了一张网页设计的截图]

Claude Engineer:好的,让我戴上我的AI眼镜,仔细看看这张图片。

image_content = encode_image_to_base64("user_uploaded_image.jpg")
# 将编码后的图片发送给AI模型进行分析

我看到了一个现代风格的网页设计截图。这个页面看起来是一个dashboard或者控制面板的设计。主要特点如下:

  1. 顶部有一个导航栏,包含logo和一些菜单项。

  2. 左侧是一个侧边栏,可能包含更多的导航选项。

  3. 主要内容区域被分成了几个卡片式的部分,每个部分可能展示不同的数据或功能。

  4. 使用了柔和的配色方案,主要是白色背景配合一些柔和的强调色。

  5. 有一些数据可视化的元素,比如图表或进度条。

这个设计给人的感觉是整洁、现代和专业的。它看起来很适合展示复杂的数据或管理各种功能。

你是不是正在设计一个类似的界面?需要我给出一些改进建议吗?或者你想让我帮你用HTML和CSS实现这个设计?

6. "执行这段Python代码并分析结果"

用户:Claude,能帮我执行这段Python代码并分析结果吗?

import random

def simulate_dice_roll(num_rolls):
    return [random.randint(16for _ in range(num_rolls)]

results = simulate_dice_roll(1000)
print(f"Average roll: {sum(results) / len(results)}")

Claude Engineer:当然可以!我最喜欢玩骰子了,尤其是在Python里玩。让我们来看看这个虚拟骰子的魔力!

code = """
import random

def simulate_dice_roll(num_rolls):
    return [random.randint(1, 6) for _ in range(num_rolls)]

results = simulate_dice_roll(1000)
print(f"Average roll: {sum(results) / len(results)}")
"""


stdout, stderr = execute_code(code)

执行结果:

Average roll: 3.521

让我来分析一下这个结果:

  1. 这段代码模拟了1000次骰子投掷,然后计算了平均值。

  2. 理论上,一个公平的六面骰子的平均值应该是3.5((1+2+3+4+5+6)/6)。

  3. 我们得到的结果是3.521,非常接近理论值!这说明我们的随机数生成器工作得很好。

  4. 小小的偏差(0.021)是完全正常的,因为我们只模拟了1000次投掷。如果我们增加投掷次数,平均值会更接近3.5。

  5. 这个结果证明了大数定律:当样本量足够大时,样本平均值会接近总体平均值。

你看,即使在虚拟世界里,数学定律也是适用的!需要我增加投掷次数再试一次吗?或者你想尝试模拟其他有趣的概率事件?

隐藏功能:

  • 剩余上下文窗口大小显示:Claude Engineer会时不时提醒你还有多少"记忆空间"。这就像是它脑袋里的RAM,当这个数字变小时,可能是时候来个reset了。

结语

希望Claude Engineer能帮助你实现更多创意想法。

别忘了分享你的作品,让我们一起在AI应用开发的道路上共同进步!

欢迎点赞、转发、收藏。

精选历史文章,请看这里:

多案例 | 深度挖掘Claude 3.5 Sonnet Artifacts的可视化潜力,甄嬛体教你轻松学编程

Groq Whisper API 进阶:使用提示词精准控制转录风格和内容,结合 spaCy 实现精准分句

Google 新推出 AI 辅助工具,Data Science Agent 和 Code Transformation 值得一试

Manim 动画制作不再难:ChatGPT + Graphviz/Mermaid 助你快速上手


继续滑动看下一个
kate人不错
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存