2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

5 分钟上手!用 #Workspace 为 screenshot-to-code 项目增加新功能

  • 2024-12-10
    北京
  • 本文字数:3505 字

    阅读完需:约 11 分钟

大小:461.89K时长:02:37
5 分钟上手!用 #Workspace 为 screenshot-to-code 项目增加新功能

在之前的文章中,我们教过大家如何 5 分钟实现网站复刻,同时为大家介绍了 screenshot-to-code 这个开源项目,以及如何基于该项目增加调用 Gemini 模型,最终实现上传图片生成代码的效果。


当时就有不少小伙伴提出疑问,怎么快速找到需要修改的地方呢?


在此之前,我们要先花一些时间去了解阅读源码才能找到相关函数,但在今天,给大家介绍一个豆包MarsCode的利器:#Workspace,有了它,妈妈再也不用担心我找不到修改函数的入口啦!



今天给大家演示一下,如何利用豆包MarsCode 的 #Workspace 功能,快速上手修改开源项目!

在修改之前,需要首先了解并熟悉当前项目的模块和架构,我们可以使用豆包 MarsCode #Workspace 功能,总结并输出模块的架构:




接着,我们可以把 #Workspace 输出的 mermaid 内容,贴到 mermaid 在线展示网站(https://sourl.cn/RUYGf4)上,就得到了 screenshot-to-code 项目的模块架构:


了解熟悉完架构后,接着使用 #Workspace 让豆包MarsCode 告诉我们如何本地启动项目:



根据它给的方式,我们在终端内一步步执行,即可成功启动项目。



下一步,我们需要增加调用 Gemini 模型,但模块代码这么多,该怎么快速找到需要修改哪些地方呢?

这时我们再次使出 #Workspace 利器,可以看到豆包MarsCode精准地给出了我们要修改的地方:






接下来,让我们按照豆包MarsCode 给的教程,动手改起来。


首先,我们需要打开 frontend/src/lib/models.ts 增加 Gemini 模型的枚举。当输入 GEMINI 之后,豆包 MarsCode 自动为你推荐了补全代码,点击 Tab 键采纳即可。




紧接着,我们需要打开 frontend/src/App.tsx,找到修改入口:



我们先拿豆包 MarsCode 来解释一下这个函数的功能。



根据解释,该函数只是用于更新指令并生成代码,和我们要改的模型无关,我们忽略这个文件直接改后端代码。


后端部分主要修改 llm.py 和 generate_code.py 2 个文件。根据前面的架构介绍,llm.py 负责调用 LLM,generate_code.py 则是生成代码的路由处理。因此我们需要先改 llm.py,增加调用 Gemini。

在这里,我们直接复制上次的代码,修改 llm.py:


class Llm(Enum):    GPT_4_VISION = "gpt-4-vision-preview"    GPT_4_TURBO_2024_04_09 = "gpt-4-turbo-2024-04-09"    GPT_4O_2024_05_13 = "gpt-4o-2024-05-13"    CLAUDE_3_SONNET = "claude-3-sonnet-20240229"    CLAUDE_3_OPUS = "claude-3-opus-20240229"    CLAUDE_3_HAIKU = "claude-3-haiku-20240307"    CLAUDE_3_5_SONNET_2024_06_20 = "claude-3-5-sonnet-20240620"    //新增gemini    GEMINI_1_5_PRO_LATEST = "gemini-1.5-pro-latest"        async def stream_gemini_response(    messages: List[ChatCompletionMessageParam],    api_key: str,    callback: Callable[[str], Awaitable[None]],) -> str:  genai.configure(api_key=api_key)    generation_config = genai.GenerationConfig(    temperature = 0.0  )  model = genai.GenerativeModel(    model_name = "gemini-1.5-pro-latest",    generation_config = generation_config  )  contents = parse_openai_to_gemini_prompt(messages);    response = model.generate_content(    contents = contents,    #Support streaming    stream = True,   )     for chunk in response:    content = chunk.text or ""    await callback(content)
if not response: raise Exception("No HTML response found in AI response") else: return response.text;
def parse_openai_to_gemini_prompt(prompts): messages = [] for prompt in prompts: message = {} message['role'] = prompt['role'] if prompt['role'] == 'system': message['role'] = 'user' if prompt['role'] == 'assistant': message['role'] = 'model' message['parts'] = [] content = prompt['content'] if isinstance(content, list): for content in prompt['content']: part = {} if content['type'] == 'image_url': base64 = content['image_url']['url'] part['inline_data'] = { 'data': base64.split(",")[1], 'mime_type': base64.split(";")[0].split(":")[1] } elif content['type'] == 'text': part['text'] = content['text'] message['parts'].append(part) else: message['parts'] = [content] messages.append(message) return messages
复制代码


最后,我们再修改 generate_code.py,增加调用 Gemini 的函数:


if validated_input_mode == "video":                if not anthropic_api_key:                    await throw_error(                        "Video only works with Anthropic models. No Anthropic API key found. Please add the environment variable ANTHROPIC_API_KEY to backend/.env or in the settings dialog"                    )                    raise Exception("No Anthropic key")
completion = await stream_claude_response_native( system_prompt=VIDEO_PROMPT, messages=prompt_messages, # type: ignore api_key=anthropic_api_key, callback=lambda x: process_chunk(x), model=Llm.CLAUDE_3_OPUS, include_thinking=True, ) exact_llm_version = Llm.CLAUDE_3_OPUS elif ( code_generation_model == Llm.CLAUDE_3_SONNET or code_generation_model == Llm.CLAUDE_3_5_SONNET_2024_06_20 ): if not anthropic_api_key: await throw_error( "No Anthropic API key found. Please add the environment variable ANTHROPIC_API_KEY to backend/.env or in the settings dialog" ) raise Exception("No Anthropic key")
completion = await stream_claude_response( prompt_messages, # type: ignore api_key=anthropic_api_key, callback=lambda x: process_chunk(x), model=code_generation_model, ) exact_llm_version = code_generation_model # 增加调用gemini elif ( code_generation_model == Llm.GEMINI_1_5_PRO_LATEST ): if not GEMINI_API_KEY: await throw_error( "No GEMINI API key found. Please add the environment variable ANTHROPIC_API_KEY to backend/.env or in the settings dialog" ) raise Exception("No GEMINI key")
completion = await stream_gemini_response( prompt_messages, # type: ignore api_key=GEMINI_API_KEY, callback=lambda x: process_chunk(x), ) exact_llm_version = code_generation_model else: completion = await stream_openai_response( prompt_messages, # type: ignore api_key=openai_api_key, base_url=openai_base_url, callback=lambda x: process_chunk(x), model=code_generation_model, ) exact_llm_version = code_generation_model
复制代码


经过以上几个步骤的修改,我们就完成了代码修改部分,最后我们再安装 google-generativeai 库:


cd backendpoetry add google-generativeai
复制代码


安装完库后,再次启动项目,就可以愉快地使用 Gemini 来生成代码啦,大家赶快去试试使用 #Workspace 吧!

2024-12-10 17:305957

评论

发布
暂无评论
发现更多内容

【FAQ】HarmonyOS SDK 闭源开放能力 — Background Tasks Kit

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

淘宝天猫商品评论API:轻松挑选优质商品的利器

Datafox(数据狐)

天猫商品评论数据接口 天猫商品评论API 淘宝评论采集 天猫评论采集

AI 财报分析软件系统的技术架构

北京木奇移动技术有限公司

财务分析 AI技术 软件外包公司

AI 财报分析软件的开发

北京木奇移动技术有限公司

财务分析 AI技术开发 软件外包公司

嘿嘿,猜我刚刚发现了什么?IDEA全新UI,极致优雅贼好看!

BugShare

Java ide IDEA

淘宝天猫店铺商品API:电商运营的数据赋能利器

Datafox(数据狐)

天猫店铺所有商品API 天猫店铺数据采集 天猫店铺数据分析 天猫店铺商品采集

汽车维修间如何选购RFID智能工具车提升效率?

斯科信息

RFID智能工具车 CK-GTC7

MyEMS:赋能双碳目标的开源能源管理实战利器

开源能源管理系统

开源 能源管理系统

你的线上营销费用,真的在“有效燃烧”吗?

赛博威科技

快消品 营销费用

超融合部署避雷针:这5个“坑”没想清楚,千万别急着上线!

智驱前线

Electron应用优化与性能调优策略

inBuilder低代码平台

Electron 性能调优 桌面开发

哈尔滨等保测评安全产品的分类与核心功能

等保测评

用户说“App 卡死了”,你却查不到原因?可能是监控方式错了

阿里巴巴云原生

ios 阿里云 云原生 Arms

海外舆情监控方案全解析:价格、功能与适用场景深度对比

沃观Wovision

舆情监控 海外舆情监控 海外舆情监测 全球舆情监控

欢迎报名!Kusica 基于K8s的多方安全协同框架11月亮相杭州KCD

隐语SecretFlow

这些CAD看图实用常识你一定用的到!

在路上

cad CAD看图王

基于Portal的NJet模拟环境

通明湖

大数据-142 ClickHouse分片×副本×Distributed 实战 ReplicatedMergeTree、Keeper、insert_quorum 与负载均衡

武子康

大数据 flink spark 分布式 Clickhouse

AI赋能生物医药,枫清科技连续中标头部医药公司产业智能升级项目

Fabarta

昆仑芯 X HAMi X 百度智能云 | 昆仑芯 P800 XPU/vXPU 双模式算力调度方案落地

Baidu AICLOUD

MyEMS:从技术到体验,开源能源管理的落地新范式

开源能源管理系统

开源 能源管理系统

产品创新,想做到质效拉满?你还差这样一个AI智囊团!

赛博威科技

科技 产品创新 人工智能、

MyEMS:数字化能源管理的创新实践者

开源能源管理系统

开源 能源管理系统

Dify代理商赛博威:私有化部署 + 场景化 Agent,让 AI 转化为实际生产力

赛博威科技

人工智能 AI Agent 费用管理

狄耐克智能家居接入米家生态 构建跨平台智慧生活新体验

新消费日报

手机三维览图快!30+格式全覆盖,告别格式烦恼

在路上

cad cad看图 CAD看图王

黑龙江等保测评公司怎么选?按需适配 + 效能优化的实用指南

等保测评

不只是监测:新一代AI驱动的海外舆情平台如何赋能品牌增长?

沃观Wovision

海外舆情 海外舆情监测 海外舆情平台

光大永明人寿 2025 三季度持续扭亏为盈

北京中暄互动广告传媒有限公司

财报分析软件系统的主要功能

北京木奇移动技术有限公司

AI技术开发 软件外包公司 财报分析

国产超融合的“芯”征程:自主可控不只是口号,看技术突破与生态布局

智驱前线

5 分钟上手!用 #Workspace 为 screenshot-to-code 项目增加新功能_AI&大模型_TRAE.ai_InfoQ精选文章