diff --git a/.claude/commands/generate-image.md b/.claude/commands/generate-image.md new file mode 100644 index 0000000..83f6947 --- /dev/null +++ b/.claude/commands/generate-image.md @@ -0,0 +1,54 @@ +# 即梦 AI 图片生成 + +使用即梦 AI(火山引擎)生成图片。 + +## 使用方式 + +用户会提供: +1. **prompt**:图片描述(中文) +2. **output_path**:输出路径(可选,默认保存到当前工作目录) + +## 执行步骤 + +1. 激活项目虚拟环境:`source .venv/bin/activate` +2. 调用 `scripts/jimeng_gen.py` 生成图片 +3. 即梦 API 仅支持 **1024x1024** 正方形尺寸 +4. 如果用户需要 16:9 比例,先生成 1024x1024,再用 Pillow 居中裁剪为 1024x576 +5. 展示生成的图片给用户 + +## 调用示例 + +```bash +source .venv/bin/activate && python scripts/jimeng_gen.py "图片描述prompt" "输出路径.png" +``` + +## 16:9 裁剪(如需要) + +```bash +source .venv/bin/activate && python -c " +from PIL import Image +img = Image.open('输出路径.png') +w, h = img.size +new_h = int(w * 9 / 16) +top = (h - new_h) // 2 +img.crop((0, top, w, top + new_h)).save('输出路径.png') +" +``` + +## 注意事项 + +- 即梦 API **仅支持 1024x1024**,其他尺寸会提交成功但生成失败 +- 需要非正方形图片时,先生成方形再裁剪 +- 提交后需要轮询等待结果,通常 5-10 秒完成 +- 脚本位于 `scripts/jimeng_gen.py`,密钥已内置 +- 虚拟环境位于 `.venv/`,已安装 `requests` 和 `Pillow` + +## API 凭证(已内置于脚本) + +- Endpoint: `https://visual.volcengineapi.com` +- Region: `cn-north-1` +- Service: `cv` +- 模型: `jimeng_t2i_v40`(即梦图片生成 4.0) +- 签名: HMAC-SHA256 V4 + +$ARGUMENTS diff --git a/.claude/commands/upload-qiniu.md b/.claude/commands/upload-qiniu.md new file mode 100644 index 0000000..a9b9f0e --- /dev/null +++ b/.claude/commands/upload-qiniu.md @@ -0,0 +1,99 @@ +# 七牛云 OSS 上传 + +将本地文件上传到七牛云 CDN 存储。 + +## 使用方式 + +用户会提供: +1. **file_path**:要上传的本地文件路径(支持单个文件或目录) +2. **prefix**:OSS 存储路径前缀(可选,默认 `self-media/`) + +## 执行步骤 + +1. 激活项目虚拟环境:`source .venv/bin/activate` +2. 使用七牛 Python SDK 上传文件 +3. 返回 CDN 访问链接 + +## 单文件上传 + +```bash +source .venv/bin/activate && python -c " +from qiniu import Auth, put_file +import os + +AK = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0' +SK = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC' +BUCKET = 'union-saas' +CDN = 'https://cdn.union.jxyunge.com' + +local_path = '本地文件路径' +key = 'self-media/远程存储路径' + +q = Auth(AK, SK) +token = q.upload_token(BUCKET, key, 3600) +ret, info = put_file(token, key, local_path, version='v2') + +if info.status_code == 200: + print(f'上传成功: {CDN}/{key}') +else: + print(f'上传失败: {info}') +" +``` + +## 批量上传目录 + +```bash +source .venv/bin/activate && python scripts/upload_qiniu.py +``` + +脚本 `scripts/upload_qiniu.py` 会上传 `articles/001/images/` 下所有 PNG 文件。 + +## 自定义批量上传 + +```bash +source .venv/bin/activate && python -c " +from qiniu import Auth, put_file +import os, glob + +AK = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0' +SK = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC' +BUCKET = 'union-saas' +CDN = 'https://cdn.union.jxyunge.com' + +local_dir = '本地目录路径' +prefix = 'self-media/自定义前缀/' + +q = Auth(AK, SK) +for f in sorted(glob.glob(os.path.join(local_dir, '*'))): + name = os.path.basename(f) + key = prefix + name + token = q.upload_token(BUCKET, key, 3600) + ret, info = put_file(token, key, f, version='v2') + status = '成功' if info.status_code == 200 else '失败' + print(f'[{status}] {name} -> {CDN}/{key}') +" +``` + +## 在 Markdown 中替换图片链接 + +上传后,将文章中的本地图片路径替换为 CDN 链接: +- 本地路径格式:`![alt](本地路径/xxx.png)` +- CDN 链接格式:`![alt](https://cdn.union.jxyunge.com/self-media/xxx.png)` + +## 七牛凭证 + +| 配置项 | 值 | +|--------|------| +| 上传地址 | `https://up-z0.qiniup.com` | +| AK | `t1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0` | +| SK | `KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC` | +| CDN 域名 | `https://cdn.union.jxyunge.com` | +| 空间名 | `union-saas` | + +## 注意事项 + +- 虚拟环境 `.venv/` 已安装 `qiniu` SDK +- 上传同名文件会覆盖 +- CDN 链接格式:`https://cdn.union.jxyunge.com/{key}` + +$ARGUMENTS diff --git a/articles/001-你的下一个员工可能是只龙虾.md b/articles/001-你的下一个员工可能是只龙虾.md index a43e544..c946c7d 100644 --- a/articles/001-你的下一个员工可能是只龙虾.md +++ b/articles/001-你的下一个员工可能是只龙虾.md @@ -4,19 +4,21 @@ > 分类:技术解读 / 科普 > 作者:老邓唠AI -![封面](001/images/cover.png) +![封面](https://cdn.union.jxyunge.com/self-media/001/cover.png) -## 引子:一觉醒来,AI 帮我省了 4200 美元 +## 引子:律所用它打官司,淘宝店主用它盯竞品 -2026 年 2 月的一个清晨,软件工程师 AJ Stuyvenberg 醒来后发现,他的 AI 助手在他睡觉的 8 个小时里,自动与三家汽车经销商进行了多轮邮件砍价,为他想买的 2026 款现代汽车谈下了 **4200 美元的折扣**。 +2026 年 2 月,上海某律所合伙人张律师做了一个大胆的实验:他让一只"龙虾"接管了自己的工作流。 -他甚至没有下达过具体指令。 +这只龙虾每天自动抓取裁判文书网的最新判例,分析对手律所过去三年的胜率数据,甚至能模拟庭审对抗——把对方律师可能的论点逐条拆解,提前准备反驳策略。**以前助理团队要干两周的案件调研,龙虾一个晚上就跑完了。** -这个 AI 助手的名字叫 **OpenClaw**——一只龙虾。 +这只龙虾的名字叫 **OpenClaw**。 -而更疯狂的是:另一位用户 Hormold 的龙虾,在没有明确授权的情况下,自己翻阅了一封保险拒赔邮件,引用保单条款撰写法律驳回函,迫使保险公司重新启动调查。 +而在杭州,一位淘宝店主让龙虾同时监控拼多多、京东、抖音三个平台的竞品价格,**实时自动调整自己的定价策略**——竞品降了 5 块,龙虾 10 秒内就把自己的价格跟上,还顺手改了详情页的促销文案。另一位闲鱼买家更绝:让龙虾同时跟 **8 个卖家砍价**,最终以低于心理价位 30% 的价格拿下了一台二手 MacBook。 -**这不是科幻。这是 2026 年正在发生的事。** +**他们甚至不需要盯着屏幕。龙虾在后台 24 小时自己干活。** + +这不是科幻。这是 2026 年正在发生的事。 今天,老邓带你深入拆解这只龙虾,以及围绕它诞生的 12 个"兄弟"——从 4000 行代码的极简龙虾,到 10 块钱开发板上的嵌入式龙虾,再到中国大厂的国产龙虾军团。 @@ -24,7 +26,7 @@ ## 一、OpenClaw:那只改变游戏规则的龙虾 -![OpenClaw](001/images/openclaw_hero.png) +![OpenClaw](https://cdn.union.jxyunge.com/self-media/001/openclaw_hero.png) ### 它不是聊天机器人,是"数字员工" @@ -116,7 +118,7 @@ OpenClaw 的问题催生了反思,反思催生了一批"兄弟"——它们要 ### 3.1 Nanobot —— 4000 行代码的极简龙虾 -![Nanobot](001/images/nanobot.png) +![Nanobot](https://cdn.union.jxyunge.com/self-media/001/nanobot.png) | 维度 | 详情 | |------|------| @@ -131,7 +133,7 @@ OpenClaw 的问题催生了反思,反思催生了一批"兄弟"——它们要 ### 3.2 PicoClaw —— 10 美元开发板上的龙虾 -![PicoClaw](001/images/picoclaw.png) +![PicoClaw](https://cdn.union.jxyunge.com/self-media/001/picoclaw.png) | 维度 | 详情 | |------|------| @@ -144,7 +146,7 @@ OpenClaw 的问题催生了反思,反思催生了一批"兄弟"——它们要 ### 3.3 ZeroClaw —— Rust 写的安全堡垒 -![ZeroClaw](001/images/zeroclaw.png) +![ZeroClaw](https://cdn.union.jxyunge.com/self-media/001/zeroclaw.png) | 维度 | 详情 | |------|------| @@ -160,7 +162,7 @@ OpenClaw 的安全是"门上加锁",ZeroClaw 是"用钢筋混凝土重建房 ### 3.5 memU —— 知识图谱记忆龙虾 -![memU](001/images/memu.png) +![memU](https://cdn.union.jxyunge.com/self-media/001/memu.png) | 维度 | 详情 | |------|------| @@ -178,11 +180,11 @@ OpenClaw 的记忆是平铺式日志,memU 把记忆做成知识图谱——自 ## 四、龙虾全家桶:中国大厂篇 -![中国龙虾军团](001/images/china_lobsters.png) +![中国龙虾军团](https://cdn.union.jxyunge.com/self-media/001/china_lobsters.png) ### 4.1 LobsterAI —— 网易有道 -![LobsterAI](001/images/lobsterai.png) +![LobsterAI](https://cdn.union.jxyunge.com/self-media/001/lobsterai.png) 名字就叫"龙虾 AI",国内最接近 OpenClaw 的产品。两个杀手锏: - **有 GUI 图形界面**:OpenClaw 纯命令行,小白用不来;LobsterAI 降低了门槛 @@ -192,7 +194,7 @@ OpenClaw 的记忆是平铺式日志,memU 把记忆做成知识图谱——自 ### 4.2 HiClaw —— 阿里 Higress -![HiClaw 架构](001/images/agent_tars.png) +![HiClaw 架构](https://cdn.union.jxyunge.com/self-media/001/agent_tars.png) HiClaw 是目前**安全架构最先进**的方案。核心设计: @@ -238,7 +240,7 @@ HiClaw 是目前**安全架构最先进**的方案。核心设计: ### 选龙虾决策树 -![选龙虾](001/images/choose_guide.png) +![选龙虾](https://cdn.union.jxyunge.com/self-media/001/choose_guide.png) **按你是谁来选:** - **小白用户** → **Nanobot**,4000 行代码读懂 Agent 是怎么回事 @@ -258,7 +260,7 @@ HiClaw 是目前**安全架构最先进**的方案。核心设计: ## 六、安全避坑指南:养龙虾的 5 条铁律 -![安全警示](001/images/security_warning.png) +![安全警示](https://cdn.union.jxyunge.com/self-media/001/security_warning.png) 经过上面的分析,你应该已经明白:**龙虾越强大,风险越大。** 以下是养龙虾的 5 条铁律: diff --git a/passport/七牛.md b/passport/七牛.md new file mode 100644 index 0000000..40d35d9 --- /dev/null +++ b/passport/七牛.md @@ -0,0 +1,6 @@ +七牛上传地址 https://up-z0.qiniup.com +七牛云存储AK t1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0 +七牛云存储SK KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC +七牛云存储地址 https://cdn.union.jxyunge.com +七牛云存储空间名 union-saas + diff --git a/scripts/upload_qiniu.py b/scripts/upload_qiniu.py new file mode 100644 index 0000000..9a6acf2 --- /dev/null +++ b/scripts/upload_qiniu.py @@ -0,0 +1,48 @@ +"""上传图片到七牛云 OSS""" + +import os +import glob +from qiniu import Auth, put_file + +ACCESS_KEY = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0' +SECRET_KEY = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC' +BUCKET_NAME = 'union-saas' +CDN_DOMAIN = 'https://cdn.union.jxyunge.com' +UPLOAD_PREFIX = 'self-media/001/' + + +def upload_file(local_path, key): + """上传单个文件到七牛""" + q = Auth(ACCESS_KEY, SECRET_KEY) + token = q.upload_token(BUCKET_NAME, key, 3600) + ret, info = put_file(token, key, local_path, version='v2') + if info.status_code == 200: + url = f'{CDN_DOMAIN}/{key}' + print(f' OK {os.path.basename(local_path)} -> {url}') + return url + else: + print(f' FAIL {os.path.basename(local_path)}: {info}') + return None + + +def main(): + img_dir = os.path.join(os.path.dirname(__file__), '..', 'articles', '001', 'images') + files = sorted(glob.glob(os.path.join(img_dir, '*.png'))) + + results = {} + for f in files: + name = os.path.basename(f) + key = UPLOAD_PREFIX + name + url = upload_file(f, key) + if url: + results[name] = url + + print(f'\n===== 上传完成: {len(results)}/{len(files)} =====') + for name, url in results.items(): + print(f'{name}: {url}') + + return results + + +if __name__ == '__main__': + main()