前一周发布了skill转为agent产品的帖子,佬友有兴趣: 【开源】又开源15个Agent给佬友! 把技能做成产品-基于skill用 claude-agent-sdk 资源荟萃 本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 之前我在l… 【开源】一键搞定skill转为产品 - flue-framework-skill - 基于typescript的harness agent 资源荟萃 本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 上个月在l… 开源了2个skill帮忙佬友 利用 claude-agent-sdk 和 flue框架 把自己的skill转为agent产品对外公开访问,例如webapp,saas等等, 我展示更多例子和效果,可能有更多讨论和了解: flue-framework-skill的使用方法: ❯ 请先阅读文章Astro-flue简要.txt,新需求为利用skill: flue-framework 创建一个完整的 针对 skill:tikhub-api-helper (替换成你的skill)的社交网络信息搜索agent, 请你先给我具体方案 其实生成整个可用的agent产品才1mb, 非常轻量级,但是已经包括所有skill的agent能力了: 上线也简单,一个 deepseek api 就可以了: # 开发模式(带热重载) npm run dev # 生产模式(推荐) npm run build && npm start 就如一个普通typescript程序一样,就这么简单,不需要安装什么。 展示效果: 直接展示复杂可交互的html: 感谢佬友支持,有用再发更多资料 3 个帖子 - 3 位参与者 阅读完整话题
**在线示例报告(脱敏假数据): https://caigee-cmd.github.io/wechat-insight/demo/index.html GitHub: https://github.com/caigee-cmd/wechat-insight 起因很简单。我自己微信上客户、家人、群消息混在一起,经常有人发了消息我忘了回,年底也想知道这一年到底都在跟谁聊。翻了一圈现成工具,要么要把聊天记录传到它服务器,要么就是导出个 txt 完事。传聊天记录这事我实在做不到,就自己写了一个。 它是跑在 macOS 上的,从本地微信 4.x 的数据库里把消息读出来,然后做这几件事: 出日报:最近都在跟谁聊、几点最活跃、消息收发比例、回复一般隔多久 拉客户线索:把私聊里的提问、报价、负面反馈这些挑出来,凑成一个待跟进的清单,省得漏回 生成一份滑动年报,就是上面那个预览链接的样子,单个 HTML 文件,双击就开,发给别人也方便 还有几个偏娱乐的:MBTI 、情绪、口头禅、社交图谱。这几个就是按聊天文本里的关键词统计估的,不是什么心理测评,图一乐就行 数据都是在自己电脑上处理的,没往任何服务器传,代码也都开源,想看的可以自己翻。 用法 我把它做成了 Claude Code 插件,装上之后用大白话指挥就行: /plugin marketplace add caigee-cmd/wechat-insight /plugin install wechat-insight@wechat-insight 然后直接说「分析下我的微信聊天记录」「看看最近有哪些客户要跟进」「生成一份微信年报」之类的,它会自己把导出、分析、出报告这些步骤串起来。 几点说明 目前只支持 macOS + 微信 Mac 4.x ,Windows 还没做。另外提一句,请只分析你自己有权处理的数据。 代码、问题、想法都欢迎来 GitHub: https://github.com/caigee-cmd/wechat-insight
示例图: 背景图:via-Foxtail-Grass Studio-Remember*C -spring- (2011.02) 介绍: Windows Terminal外壳,Git Bash核心 特性: 1.选择=复制,右击=粘贴 2.Acrylic毛玻璃材质 3.AdwaitaMono等宽字体 食用方法: 1.安装字体,安装Git,安装Windows Terminal github.com GitHub - ryanoasis/nerd-fonts: Iconic font aggregator, collection, & patcher.... Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more git-scm.com Git Microsoft Store - 下载适用于 Windows 电脑的应用、游戏等 Windows Terminal - Windows官方下载 | 微软应用商店 | Microsoft Store Windows 终端程序是一款新式、快速、高效、强大且高效的终端应用程序,适用于命令行工具和命令提示符,PowerShell和 WSL 等 Shell 用户。主要功能包括多个选项卡、窗格、Unicode、和 UTF-8 字符支持,GPU 加速文本渲染引擎以及自定义主题、样式和配置。 这是一个开源项目,我们欢迎社区参与。如要参与,请访问 https://github.com/microsoft/terminal 2.打开终端, 按下 Ctrl + Shift + , 粘贴以下代码,保存重启即可 { "$help": "https://aka.ms/terminal-documentation", "$schema": "https://aka.ms/terminal-profiles-schema", "actions": [], "copyFormatting": "none", "copyOnSelect": true, "defaultProfile": "{00000000-0000-0000-0000-000000000001}", "newTabMenu": [ { "type": "remainingProfiles" } ], "profiles": { "defaults": { "antialiasingMode": "grayscale", "colorScheme": "One Half Dark", "font": { "face": "AdwaitaMono Nerd Font", "size": 15.0 }, "opacity": 75, "startingDirectory": "%USERPROFILE%", "useAcrylic": true }, "list": [ { "commandline": "\"C:\\Program Files\\Git\\bin\\bash.exe\" --login -i", "guid": "{00000000-0000-0000-0000-000000000001}", "icon": "C:\\Program Files\\Git\\mingw64\\share\\git\\git-for-windows.ico", "name": "Git Bash", "startingDirectory": "%USERPROFILE%" }, { "commandline": "powershell.exe -NoLogo", "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", "name": "Windows PowerShell", "startingDirectory": "%USERPROFILE%" }, { "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", "hidden": true, "name": "Command Prompt" }, { "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}", "hidden": true, "name": "Azure Cloud Shell", "source": "Windows.Terminal.Azure" } ] }, "schemes": [ { "background": "#0C0C0C", "black": "#0C0C0C", "blue": "#0037DA", "brightBlack": "#767676", "brightBlue": "#3B78FF", "brightCyan": "#61D6D6", "brightGreen": "#16C60C", "brightPurple": "#B4009E", "brightRed": "#E74856", "brightWhite": "#F2F2F2", "brightYellow": "#F9F1A5", "cursorColor": "#FFFFFF", "cyan": "#3A96DD", "foreground": "#CCCCCC", "green": "#13A10E", "name": "Campbell", "purple": "#881798", "red": "#C50F1F", "selectionBackground": "#FFFFFF", "white": "#CCCCCC", "yellow": "#C19C00" }, { "background": "#012456", "black": "#0C0C0C", "blue": "#0037DA", "brightBlack": "#767676", "brightBlue": "#3B78FF", "brightCyan": "#61D6D6", "brightGreen": "#16C60C", "brightPurple": "#B4009E", "brightRed": "#E74856", "brightWhite": "#F2F2F2", "brightYellow": "#F9F1A5", "cursorColor": "#FFFFFF", "cyan": "#3A96DD", "foreground": "#CCCCCC", "green": "#13A10E", "name": "Campbell Powershell", "purple": "#881798", "red": "#C50F1F", "selectionBackground": "#FFFFFF", "white": "#CCCCCC", "yellow": "#C19C00" }, { "background": "#282C34", "black": "#282C34", "blue": "#61AFEF", "brightBlack": "#5A6374", "brightBlue": "#61AFEF", "brightCyan": "#56B6C2", "brightGreen": "#98C379", "brightPurple": "#C678DD", "brightRed": "#E06C75", "brightWhite": "#DCDFE4", "brightYellow": "#E5C07B", "cursorColor": "#FFFFFF", "cyan": "#56B6C2", "foreground": "#DCDFE4", "green": "#98C379", "name": "One Half Dark", "purple": "#C678DD", "red": "#E06C75", "selectionBackground": "#FFFFFF", "white": "#DCDFE4", "yellow": "#E5C07B" }, { "background": "#FAFAFA", "black": "#383A42", "blue": "#0184BC", "brightBlack": "#4F525D", "brightBlue": "#61AFEF", "brightCyan": "#56B5C1", "brightGreen": "#98C379", "brightPurple": "#C577DD", "brightRed": "#DF6C75", "brightWhite": "#FFFFFF", "brightYellow": "#E4C07A", "cursorColor": "#4F525D", "cyan": "#0997B3", "foreground": "#383A42", "green": "#50A14F", "name": "One Half Light", "purple": "#A626A4", "red": "#E45649", "selectionBackground": "#4F525D", "white": "#FAFAFA", "yellow": "#C18301" }, { "background": "#002B36", "black": "#002B36", "blue": "#268BD2", "brightBlack": "#073642", "brightBlue": "#839496", "brightCyan": "#93A1A1", "brightGreen": "#586E75", "brightPurple": "#6C71C4", "brightRed": "#CB4B16", "brightWhite": "#FDF6E3", "brightYellow": "#657B83", "cursorColor": "#FFFFFF", "cyan": "#2AA198", "foreground": "#839496", "green": "#859900", "name": "Solarized Dark", "purple": "#D33682", "red": "#DC322F", "selectionBackground": "#FFFFFF", "white": "#EEE8D5", "yellow": "#B58900" }, { "background": "#FDF6E3", "black": "#002B36", "blue": "#268BD2", "brightBlack": "#073642", "brightBlue": "#839496", "brightCyan": "#93A1A1", "brightGreen": "#586E75", "brightPurple": "#6C71C4", "brightRed": "#CB4B16", "brightWhite": "#FDF6E3", "brightYellow": "#657B83", "cursorColor": "#002B36", "cyan": "#2AA198", "foreground": "#657B83", "green": "#859900", "name": "Solarized Light", "purple": "#D33682", "red": "#DC322F", "selectionBackground": "#073642", "white": "#EEE8D5", "yellow": "#B58900" }, { "background": "#000000", "black": "#000000", "blue": "#3465A4", "brightBlack": "#555753", "brightBlue": "#729FCF", "brightCyan": "#34E2E2", "brightGreen": "#8AE234", "brightPurple": "#AD7FA8", "brightRed": "#EF2929", "brightWhite": "#EEEEEC", "brightYellow": "#FCE94F", "cursorColor": "#FFFFFF", "cyan": "#06989A", "foreground": "#D3D7CF", "green": "#4E9A06", "name": "Tango Dark", "purple": "#75507B", "red": "#CC0000", "selectionBackground": "#FFFFFF", "white": "#D3D7CF", "yellow": "#C4A000" }, { "background": "#FFFFFF", "black": "#000000", "blue": "#3465A4", "brightBlack": "#555753", "brightBlue": "#729FCF", "brightCyan": "#34E2E2", "brightGreen": "#8AE234", "brightPurple": "#AD7FA8", "brightRed": "#EF2929", "brightWhite": "#EEEEEC", "brightYellow": "#FCE94F", "cursorColor": "#000000", "cyan": "#06989A", "foreground": "#555753", "green": "#4E9A06", "name": "Tango Light", "purple": "#75507B", "red": "#CC0000", "selectionBackground": "#555753", "white": "#D3D7CF", "yellow": "#C4A000" }, { "background": "#000000", "black": "#000000", "blue": "#000080", "brightBlack": "#808080", "brightBlue": "#0000FF", "brightCyan": "#00FFFF", "brightGreen": "#00FF00", "brightPurple": "#FF00FF", "brightRed": "#FF0000", "brightWhite": "#FFFFFF", "brightYellow": "#FFFF00", "cursorColor": "#FFFFFF", "cyan": "#008080", "foreground": "#C0C0C0", "green": "#008000", "name": "Vintage", "purple": "#800080", "red": "#800000", "selectionBackground": "#FFFFFF", "white": "#C0C0C0", "yellow": "#808000" } ], "themes": [] } 1 个帖子 - 1 位参与者 阅读完整话题
本意是想问下工具调用的具体实现,结果在AI尝试输出示例给我讲解的时候直接中断了,重复几次都是这样 OpenCode Desktop 1.15.12 这种情况是不是OpenCode误以为是真的在调用工具所以尝试解析执行? 重复几次都是这样 话说这算不算bug? 主要请求本身尚未完成呢,结果似乎OpenCode看到调用结构就直接中断会话去尝试调用了 1 个帖子 - 1 位参与者 阅读完整话题
比如 /t/1215221 目前有 190 条回复,可以用 edge.v2ex.com/chat?topic=1215221 直接总结回复。
比如 /t/1215221 目前有 190 条回复,可以用 edge.v2ex.com/chat?topic=1215221 直接总结回复。
比如 /t/1215221 目前有 190 条回复,可以用 edge.v2ex.com/chat?topic=1215221 直接总结回复。
比如 /t/1215221 目前有 190 条回复,可以用 edge.v2ex.com/chat?topic=1215221 直接总结回复。
比如 /t/1215221 目前有 190 条回复,可以用 edge.v2ex.com/chat?topic=1215221 直接总结回复。
比如 /t/1215221 目前有 190 条回复,可以用 edge.v2ex.com/chat?topic=1215221 直接总结回复。
看看佬们的Github Profile 从此贴继续讨论,首先用GPT生成一张动态九宫格。 示例提示词: 给我一套汽车从汽车变身成为机器人的过程 九宫格 汽车要保时捷风格 机器人要机甲风 图片中不要出现字体 然后到KIMI网页版让它根据该九宫格生成GIF,它会在线运行代码并附上下载链接(凡是支持在线运行代码的AI厂商应该都可以)。 然后同时生成三张GIF放到Github Profile里面去. 然后你会得到一个欠揍的Profile。快去试试吧。期待各位佬友的创意。 1 个帖子 - 1 位参与者 阅读完整话题
Rust Openai 多模态示例 use async_openai::{ Client, types::chat::{ ChatCompletionRequestMessageContentPartImage, ChatCompletionRequestMessageContentPartText, ChatCompletionRequestUserMessageArgs, CreateChatCompletionRequestArgs, ImageDetail, ImageUrl, }, }; use base64::{Engine as _, engine::general_purpose::STANDARD}; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenvy::dotenv().ok(); let image_path = "playground/examples/assets/广州塔.jpeg"; let image_bytes = std::fs::read(image_path)?; let image_url = format!("data:image/jpeg;base64,{}", STANDARD.encode(&image_bytes)); let client = Client::new(); let request = CreateChatCompletionRequestArgs::default() .model("gpt-5.5") .messages([ChatCompletionRequestUserMessageArgs::default() .content(vec![ ChatCompletionRequestMessageContentPartText::from( "请描述下这张图片,这张图片所在位置是哪里呢?", ) .into(), ChatCompletionRequestMessageContentPartImage::from(ImageUrl { url: image_url, detail: Some(ImageDetail::High), }) .into(), ]) .build()? .into()]) .build()?; let response = client.chat().create(request).await?; println!("{response:#?}"); Ok(()) } 使用 Response use async_openai::{ Client, types::responses::{CreateResponseArgs, InputContent, InputImageArgs, InputMessageArgs}, }; use base64::{Engine as _, engine::general_purpose::STANDARD}; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenvy::dotenv().ok(); // Read local image and encode as base64 data URL let image_path = "playground/examples/assets/广州塔.jpeg"; let image_bytes = std::fs::read(image_path)?; let image_url = format!("data:image/jpeg;base64,{}", STANDARD.encode(&image_bytes)); let client = Client::new(); let request = CreateResponseArgs::default() .model("gpt-5.5") .input( InputMessageArgs::default() .content(vec![ InputContent::from("请描述下这张图片,这张图片所在位置是哪里呢?"), InputImageArgs::default() .image_url(image_url) .build()? .into(), ]) .build()?, ) .build()?; let response = client.responses().create(request).await?; println!("{response:#?}"); Ok(()) } 6 个帖子 - 4 位参与者 阅读完整话题
力扣 LeetCode 61. 旋转链表 - 力扣(LeetCode) 61. 旋转链表 - 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: [https://assets.leetcode.com/uploads/2020/11/13/rotate1.jpg] 输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3] 示例 2: [https://assets.leetcode.com/uploads/2020/11/13/roate2.jpg] 输入:head =... 还在旋转,还在旋转 思路 实际的移动次数是 k 对链表长度取模。取模后取链表后 k 个节点,接到开头即可。 注意链表可能为空。 代码 class Solution { public: ListNode* rotateRight(ListNode* head, int k) { if (head == nullptr) { return head; } // 先求出整个链表的长度 int n = 0; ListNode *ptr = head, *tail = nullptr; while (ptr != nullptr) { n++; if (ptr->next == nullptr) { tail = ptr; } ptr = ptr->next; } // 计算实际移动次数 k %= n; // 找到后 k 个结点接到开头即可 if (k == 0) { return head; } ptr = head; ListNode* prev = nullptr; // 移动指针到后 k 个节点的开头 for (int i = 0; i < n - k; i++) { prev = ptr; ptr = ptr->next; } // 前后两截断开 if (prev != nullptr) { prev->next = nullptr; } // 把前一截接到后一截后面 tail->next = head; return ptr; } }; 1 个帖子 - 1 位参与者 阅读完整话题
在本分析中,coding plan为opencode go,人民币兑美元视作7比1,美元统一向人民币转换,示例调用指文档中使用的模板单次调用,额度指文档中各时段的美元额度 示例调用: DeepSeek V4 Pro:83,040 token(750 未命中、82,000 命中、290 输出) DeepSeek V4 Flash:69,070 token(790 未命中、68,000 命中、280 输出) 额度折算人民币: 5 小时:12 美元 ≈ 84 元人民币 每周:30 美元 ≈ 210 元人民币 每月:60 美元 ≈ 420 元人民币 文档调用次数: DeepSeek V4 Pro:5 小时 3,450 次;每周 8,550 次;每月 17,150 次 DeepSeek V4 Flash:5 小时 31,650 次;每周 79,050 次;每月 158,150 次 示例调用如果按官方 API 计价: DeepSeek V4 Pro(2.5折后,0.025、3、6): 单次调用:0.00604 元 5 小时:20.838 元 每周:51.642 元 每月:103.586 元 DeepSeek V4 Pro(原价,0.1、12、24): 单次调用:0.02416 元 5 小时:83.352 元 每周:206.568 元 每月:414.344 元 DeepSeek V4 Flash: 单次调用:0.00271 元 5 小时:85.7715 元 每周:214.2255 元 每月:428.5865 元 对应额度相当于官方api人民币的计价与使用额度的实际比例: DeepSeek V4 Pro(2.5折后): 5 小时:20.838 / 84 = 24.81% 每周:51.642 / 210 = 24.59% 每月:103.586 / 420 = 24.66% DeepSeek V4 Pro(原价): 5 小时:83.352 / 84 = 99.23% 每周:206.568 / 210 = 98.37% 每月:414.344 / 420 = 98.65% DeepSeek V4 Flash: 5 小时:85.7715 / 84 = 102.11% 每周:214.2255 / 210 = 102.01% 每月:428.5865 / 420 = 102.04% 反推获知模型的调用价格: DeepSeek V4 Pro:用的是原价,不是2.5折后价,0.1缓存命中、12输入、24输出 DeepSeek V4 Flash:0.02缓存命中、1输入、2输出 将调用次数换算回词元的限额示意: DeepSeek V4 Pro: 5 小时:2.86亿token(286,488,000 token) 每周:7亿token(709,992,000 token) 每月:14.24亿token(1,424,136,000 token) DeepSeek V4 Flash: 5 小时:21.86亿token(2,186,065,500 token) 每周:54.6亿token(5,459,983,500 token) 每月:109.23亿token(10,923,420,500 token) 我本人使用opencode调用官方api的命中/未命中/输出比例:140.0 : 2.9 : 1(总输入的9.8成会命中缓存) 示例调用的命中/未命中/输出比例: DeepSeek V4 Pro:282.8 : 2.6 : 1(总输入的9.9成会命中缓存) DeepSeek V4 Flash:242.9 : 2.8 : 1(总输入的9.88成会命中缓存) 实际使用中的命中/未命中/输出比例:我还没买,暂待补充,佬们有统计的可以分享一下 如果使用本人的命中/未命中/输出比例构造示例调用,则限额: 按 140.0 : 2.9 : 1 (总输入的9.8成会命中缓存)构造调用:41,731 token(841 未命中、40,600 命中、290 输出) DeepSeek V4 Pro: 5 小时:1.66亿token(166,005,918 token) 每周:4.15亿token(415,056,526 token) 每月:8.30亿token(830,154,783 token) DeepSeek V4 Flash: 5 小时:15.70亿token(1,569,795,027 token) 每周:39.25亿token(3,924,508,433 token) 每月:78.49亿token(7,849,058,597 token) 7 个帖子 - 5 位参与者 阅读完整话题
他把方法名改成中文了 这是我的问题 气死我了 1 个帖子 - 1 位参与者 阅读完整话题
/** 可口可乐吧 签到 - 青龙多账号版 环境变量: WXID: 备注#wxid,多账号用 & 或 换行 分隔 示例: 账号1#wxid_xxxxxxxx&账号2#wxid_yyyyyyyy 功能: 微信 code → Bearer token(带缓存) 查询签到状态 执行每日签到 查询积分 cron: 30 8 * * * const: disabled = false */ const axios = require(‘axios’); const fs = require(‘fs’); const path = require(‘path’); /* ==================== 常量配置 ==================== */ const APPID = ‘wxa5811e0426a94686’; const BASE_URL = ‘ https://member-api.icoke.cn ’; const UA = ‘Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.59(0x18003b2e) NetType/4G Language/zh_CN’; const REFERER = https://servicewechat.com/${APPID}/499/page-frame.html ; const SCRIPT_DIR = path.dirname(__filename); const CACHE_FILE = path.join(SCRIPT_DIR, ‘可口可乐签到_cache.txt’); /* ==================== 环境变量 ==================== */ const WECHAT_SERVER = process.env.WECHAT_SERVER; const WXID_ENV = process.env.WXID; if (!WECHAT_SERVER || !WXID_ENV) { console.log(‘ 请设置 WECHAT_SERVER 和 WXID 环境变量’); process.exit(1); } const wxidList = WXID_ENV.split(/[\n&]/).map(i => i.trim()).filter(i => i && i.includes(‘#’)); if (!wxidList.length) { console.log(‘ WXID 格式错误,请使用 备注#wxid 格式’); process.exit(1); } /* ==================== 缓存管理 ==================== */ function loadTokenCache() { const cacheMap = {}; try { if (fs.existsSync(CACHE_FILE)) { fs.readFileSync(CACHE_FILE, ‘utf8’).split(/\n/).filter(Boolean).forEach(line => { const idx = line.indexOf(‘#’); if (idx > 0) { const remark = line.substring(0, idx); const token = line.substring(idx + 1); cacheMap[remark] = token; } }); } } catch (e) {} return cacheMap; } function saveTokenCache(cacheMap) { try { const content = Object.entries(cacheMap).map(([r, t]) => ${r}#${t} ).join(‘\n’); fs.writeFileSync(CACHE_FILE, content || ‘ #cache ’, { encoding: ‘utf8’, flag: ‘w’ }); } catch (e) {} } /* ==================== 微信 code 换 token ==================== */ async function getCode(wxid) { try { const url = ${WECHAT_SERVER}/api/v1/wx/app/get/code ; const res = await axios.post(url, { wxid, appid: APPID }, { timeout: 10000 }); const code = res.data?.Data?.code; if (!code) { console.log(‘ getCode 响应:’, JSON.stringify(res.data)); return null; } return code; } catch (e) { console.log(‘ getCode 异常:’, e.message); return null; } } async function codeToToken(code) { try { const url = ${BASE_URL}/api/sp-portal/store/icoke/wechat/loginNoCache/${code} ; const headers = { ‘Host’: ‘ member-api.icoke.cn ’, ‘content-type’: ‘application/json’, ‘Accept’: ‘application/json, text/plain, / ’, ‘Accept-Encoding’: ‘gzip,compress,br,deflate’, ‘User-Agent’: UA, ‘Referer’: REFERER, }; const res = await axios.get(url, { headers, timeout: 10000 }); const body = res.data; // 实际抓包确认:token 在响应体的 jwtString 字段 if (body && body.jwtString) { return body.jwtString; } console.log(‘ codeToToken 响应:’, JSON.stringify(body).substring(0, 300)); return null; } catch (e) { console.log(‘ codeToToken 异常:’, e.message); return null; } } async function getValidToken(remark, wxid, force = false) { const m = loadTokenCache(); if (force) delete m[remark]; if (m[remark]) { console.log(‘ 使用缓存 token’); return m[remark]; } console.log(‘ 获取微信 code…’); const code = await getCode(wxid); if (!code) return null; console.log( ✅ code: ${code.substring(0, 10)}... ); const token = await codeToToken(code); if (!token) return null; m[remark] = token; saveTokenCache(m); console.log(‘ token 已缓存’); return token; } /* ==================== 判断 token 失效 ==================== */ function isTokenInvalid(data) { if (!data) return false; const msg = (data.message || data.msg || ‘’).toLowerCase(); return msg.includes(‘未登录’) || msg.includes(‘token’) || msg.includes(‘登录’) || data.code === ‘401’ || data.code === 401 || data.status === 401 || data.httpStatus === 401; } /* ==================== 公共请求头 ==================== */ function getHeaders(token) { return { ‘Host’: ‘ member-api.icoke.cn ’, ‘Authorization’: token, ‘content-type’: ‘application/json’, ‘Accept’: ‘application/json, text/plain, / ’, ‘Accept-Encoding’: ‘gzip,compress,br,deflate’, ‘User-Agent’: UA, ‘Referer’: REFERER, }; } /* ==================== API 请求封装 ==================== */ async function apiGet(path, token, params) { try { const res = await axios.get( ${BASE_URL}${path} , { headers: getHeaders(token), params, timeout: 15000, }); return res.data; } catch (e) { console.log( ❌ GET ${path} 异常: , e.message); return null; } } async function apiPost(path, token, data) { try { const res = await axios.post( ${BASE_URL}${path} , data, { headers: getHeaders(token), timeout: 15000, }); return res.data; } catch (e) { console.log( ❌ POST ${path} 异常: , e.message); return null; } } /* ==================== 业务接口 ==================== */ async function getSignOutline(token) { const res = await apiGet(‘/api/icoke-sign/icoke/mini/sign/main/getSignOutline’, token); if (!res) return null; if (isTokenInvalid(res)) return { needRefresh: true }; const today = new Date(); const y = today.getFullYear(), m = today.getMonth() + 1, d = today.getDate(); const list = res.data || ; const todayRecord = list.find(r => r.year === y && r.month === m && r.day === d); return { signed: !!(todayRecord && todayRecord.exist), totalDays: list.filter(r => r.exist).length, point: todayRecord?.point || 0, data: list, raw: res, }; } async function doSign(token) { const res = await apiGet(‘/api/icoke-sign/icoke/mini/sign/main/sign’, token); if (!res) return { success: false, msg: ‘请求失败’ }; if (isTokenInvalid(res)) return { needRefresh: true }; if (res.success === true || res.isSuccess === true) { return { success: true, point: res.point || 0, msg: res.message || ‘签到成功’, }; } const msg = res.message || res.msg || JSON.stringify(res); if (msg.includes(‘已签’) || msg.includes(‘重复’) || msg.includes(‘already’)) { return { success: false, alreadySigned: true, msg }; } return { success: false, msg }; } /** 查询积分 */ async function getPoints(token) { const res = await apiGet(‘/api/icoke-customer/icoke/mini/customer/main/points’, token); if (!res) return null; return { point: res.point || 0, experiencePoints: res.experiencePoints || 0, frozenPoint: res.frozenPoint || 0, }; } /** 查询用户基本信息 */ async function getUserInfo(token) { const res = await apiGet(‘/api/icoke-customer/icoke/mini/customer/main/base/info’, token); if (!res) return null; return { name: res.name || ‘未知’, mobile: res.mobile || ‘’, grade: res.grade || ‘’, }; } /* ==================== 工具函数 ==================== */ function sleep(ms) { return new Promise(r => setTimeout(r, ms)); } /* ==================== 单账号执行 ==================== */ async function runSingleAccount(accountStr, index) { const sepIdx = accountStr.indexOf(‘#’); if (sepIdx <= 0) { console.log( ❌ 第${index}个账号格式错误,应为 备注#wxid ); return; } const remark = accountStr.substring(0, sepIdx); const wxid = accountStr.substring(sepIdx + 1).trim(); console.log( \n==================================== ); console.log( 🚀 【可口可乐】${remark}(第${index}个) ); console.log( ==================================== ); // 获取 token let token = await getValidToken(remark, wxid); if (!token) { console.log(‘ 获取 token 失败,跳过’); return; } // 查询签到状态 let outline = await getSignOutline(token); if (outline?.needRefresh) { console.log(‘ token 失效,重新获取…’); token = await getValidToken(remark, wxid, true); if (!token) { console.log(‘ 重新获取 token 失败’); return; } outline = await getSignOutline(token); } if (outline) { if (outline.signed) { console.log( 📅 签到状态:✅ 今日已签到 | 本月已签 ${outline.totalDays} 天 ); } else { console.log( 📅 签到状态:❌ 今日未签到 | 本月已签 ${outline.totalDays} 天 ); } } // 执行签到 let signResult = await doSign(token); if (signResult?.needRefresh) { console.log(‘ token 失效,重新获取…’); token = await getValidToken(remark, wxid, true); if (!token) { console.log(‘ 重新获取 token 失败’); return; } signResult = await doSign(token); } if (signResult?.success) { console.log( ✅ 签到成功!获得积分:${signResult.point} ); } else if (signResult?.alreadySigned) { console.log( ℹ️ 今日已签到:${signResult.msg} ); } else { console.log( ⚠️ 签到结果:${signResult?.msg || '未知'} ); } await sleep(1000); // 查询积分 const pts = await getPoints(token); if (pts) { console.log( 💰 当前积分:${pts.point} | 经验值:${pts.experiencePoints} | 冻结:${pts.frozenPoint} ); } // 查询用户信息 const userInfo = await getUserInfo(token); if (userInfo) { console.log( 👤 会员:${userInfo.name} | 手机:${userInfo.mobile} ); } console.log( ✨ ${remark} 执行完成\n ); } /* ==================== 主函数 ==================== */ !(async () => { console.log( 📢 可口可乐吧签到 - 共检测到 ${wxidList.length} 个账号 ); for (let i = 0; i < wxidList.length; i++) { await runSingleAccount(wxidList[i], i + 1); if (i < wxidList.length - 1) await sleep(2000); } console.log(‘ 全部账号执行完毕!’); })(); 4 个帖子 - 4 位参与者 阅读完整话题
https://modelscope-resouces.oss-cn-zhangjiakou.aliyuncs.com/avatar%2F4162c45f-9a45-4740-9941-ade7047ab0cd.mp4 现在说绕口令都很溜了,马斯克确实更新勤快 5 个帖子 - 4 位参与者 阅读完整话题
用了一个 kimi 官网的 Agent 的示例 Prompt: 「 Meridian Architecture 」高端建筑设计事务所官网,展示项目作品、设计理念、团队、获奖、联系表单、留言簿。中英双语、极简主义建筑美学、深色系(黑/深灰)+ 金铜色点缀。区块:Hero (全屏摩天大楼航拍视频 + "Shaping the Horizon" 标题 + EST.2008 标签)、Projects ( 4 个项目卡片,16:10 比例 + 编号 + 位置 + 描述)、Philosophy ( 3 列数字统计 148 项目/32 国家/26 奖项 + 工匠打磨视频)、Team ( 8 位建筑师网格)、Awards ( 10 条奖项时间线 + 6 本出版物)、Contact (表单 + 留言簿)、Footer 。技术:React + Express + tRPC + MySQL + Drizzle + OAuth + AI 聊天助手(浮动右下金色按钮)。 总体效果超出预期。 DeepSeek V4 Pro 在 Claude Code 中开启了一些常见的 skill 或插件(有一个 front-design 的 skill ),效果预览: https://demo5-opal.vercel.app/ Kimi K2.6 Agent 在网页里直接生成的: https://q6bxlhhftz5de.kimi.site/ kimi 的有很多重复的图片(可能是抽卡效果不好),而且部署时间挺长,然后公开分享出来由于会占用服务器资源,还会按日扣除订阅里的额度,后面会取消公开分享。 大概过程: 直接在 Claude Code 里输入 Prompt ,一次性生成,本地预览前端没啥问题,日志里有一些应该不算严重的错误日志,API 花费大概 10 块钱。 然后我想部署出来看看,直接和 DeepSeek 讨论是否能直接部署到 Vercel ,由于项目有 MySQL 数据库,它建议分开部署,前端部署到 Vercel 。在他的提示下安装了 Vercel 的 cli 并授权了( Vercel 的 Claude Code 插件是自己手动安装的,授权那个没有明显提示,自己手动打开了它的输出里的链接进行了授权,不够友好且感觉有点不安全)。之后一次性部署成功。 之后发现缺少图片,它解释是说需要从后端获取,让它改成前端暂时用 mock/静态的数据,然后修改后重新部署到 Vercel 上就是上面最终的效果。 个人感受: 审美上:这次界面很惊艳,一个是没有滥用的圆角矩形,还有一个是那个团队那里把鼠标移到图片上的效果我很喜欢。 Claude Code 里的使用:长任务应该没啥问题,但是可能输出有点慢,第一次本地一次性生成大概会费了 30-40 分钟,没有中断。工具调用感觉也不错,调用工具挺积极的,看了几次,调用得也比较合适。 由于还没有 Coding Plan ,单纯 API 计费确实不便宜,总共大概花费了 16 块钱。 有了前面的那个打脸,单纯的几次测试确实也还看不出来啥,仅供参考吧。 而且这种一次性的 Prompt 没办法看出来模型对于对于细节,项目理解,代码修改方面的水平,后续还需要更多测试,也希望能尽快出个 Coding Plan 吧,不然现在的价格确实性价比不高。
用了一个 kimi 官网的 Agent 的示例 Prompt: 「 Meridian Architecture 」高端建筑设计事务所官网,展示项目作品、设计理念、团队、获奖、联系表单、留言簿。中英双语、极简主义建筑美学、深色系(黑/深灰)+ 金铜色点缀。区块:Hero (全屏摩天大楼航拍视频 + "Shaping the Horizon" 标题 + EST.2008 标签)、Projects ( 4 个项目卡片,16:10 比例 + 编号 + 位置 + 描述)、Philosophy ( 3 列数字统计 148 项目/32 国家/26 奖项 + 工匠打磨视频)、Team ( 8 位建筑师网格)、Awards ( 10 条奖项时间线 + 6 本出版物)、Contact (表单 + 留言簿)、Footer 。技术:React + Express + tRPC + MySQL + Drizzle + OAuth + AI 聊天助手(浮动右下金色按钮)。 总体效果超出预期。 DeepSeek V4 Pro 在 Claude Code 中开启了一些常见的 skill 或插件(有一个 front-design 的 skill ),效果预览: https://demo5-opal.vercel.app/ Kimi K2.6 Agent 在网页里直接生成的: https://q6bxlhhftz5de.kimi.site/ kimi 的有很多重复的图片(可能是抽卡效果不好),而且部署时间挺长,然后公开分享出来由于会占用服务器资源,还会按日扣除订阅里的额度,后面会取消公开分享。 大概过程: 直接在 Claude Code 里输入 Prompt ,一次性生成,本地预览前端没啥问题,日志里有一些应该不算严重的错误日志,API 花费大概 10 块钱。 然后我想部署出来看看,直接和 DeepSeek 讨论是否能直接部署到 Vercel ,由于项目有 MySQL 数据库,它建议分开部署,前端部署到 Vercel 。在他的提示下安装了 Vercel 的 cli 并授权了( Vercel 的 Claude Code 插件是自己手动安装的,授权那个没有明显提示,自己手动打开了它的输出里的链接进行了授权,不够友好且感觉有点不安全)。之后一次性部署成功。 之后发现缺少图片,它解释是说需要从后端获取,让它改成前端暂时用 mock/静态的数据,然后修改后重新部署到 Vercel 上就是上面最终的效果。 个人感受: 审美上:这次界面很惊艳,一个是没有滥用的圆角矩形,还有一个是那个团队那里把鼠标移到图片上的效果我很喜欢。 Claude Code 里的使用:长任务应该没啥问题,但是可能输出有点慢,第一次本地一次性生成大概会费了 30-40 分钟,没有中断。工具调用感觉也不错,调用工具挺积极的,看了几次,调用得也比较合适。 由于还没有 Coding Plan ,单纯 API 计费确实不便宜,总共大概花费了 16 块钱。 有了前面的那个打脸,单纯的几次测试确实也还看不出来啥,仅供参考吧。 而且这种一次性的 Prompt 没办法看出来模型对于对于细节,项目理解,代码修改方面的水平,后续还需要更多测试,也希望能尽快出个 Coding Plan 吧,不然现在的价格确实性价比不高。
用了一个 kimi 官网的 Agent 的示例 Prompt: 「 Meridian Architecture 」高端建筑设计事务所官网,展示项目作品、设计理念、团队、获奖、联系表单、留言簿。中英双语、极简主义建筑美学、深色系(黑/深灰)+ 金铜色点缀。区块:Hero (全屏摩天大楼航拍视频 + "Shaping the Horizon" 标题 + EST.2008 标签)、Projects ( 4 个项目卡片,16:10 比例 + 编号 + 位置 + 描述)、Philosophy ( 3 列数字统计 148 项目/32 国家/26 奖项 + 工匠打磨视频)、Team ( 8 位建筑师网格)、Awards ( 10 条奖项时间线 + 6 本出版物)、Contact (表单 + 留言簿)、Footer 。技术:React + Express + tRPC + MySQL + Drizzle + OAuth + AI 聊天助手(浮动右下金色按钮)。 总体效果超出预期。 DeepSeek V4 Pro 在 Claude Code 中开启了一些常见的 skill 或插件(有一个 front-design 的 skill ),效果预览: https://demo5-opal.vercel.app/ Kimi K2.6 Agent 在网页里直接生成的: https://q6bxlhhftz5de.kimi.site/ kimi 的有很多重复的图片(可能是抽卡效果不好),而且部署时间挺长,然后公开分享出来由于会占用服务器资源,还会按日扣除订阅里的额度,后面会取消公开分享。 大概过程: 直接在 Claude Code 里输入 Prompt ,一次性生成,本地预览前端没啥问题,日志里有一些应该不算严重的错误日志,API 花费大概 10 块钱。 然后我想部署出来看看,直接和 DeepSeek 讨论是否能直接部署到 Vercel ,由于项目有 MySQL 数据库,它建议分开部署,前端部署到 Vercel 。在他的提示下安装了 Vercel 的 cli 并授权了( Vercel 的 Claude Code 插件是自己手动安装的,授权那个没有明显提示,自己手动打开了它的输出里的链接进行了授权,不够友好且感觉有点不安全)。之后一次性部署成功。 之后发现缺少图片,它解释是说需要从后端获取,让它改成前端暂时用 mock/静态的数据,然后修改后重新部署到 Vercel 上就是上面最终的效果。 个人感受: 审美上:这次界面很惊艳,一个是没有滥用的圆角矩形,还有一个是那个团队那里把鼠标移到图片上的效果我很喜欢。 Claude Code 里的使用:长任务应该没啥问题,但是可能输出有点慢,第一次本地一次性生成大概会费了 30-40 分钟,没有中断。工具调用感觉也不错,调用工具挺积极的,看了几次,调用得也比较合适。 由于还没有 Coding Plan ,单纯 API 计费确实不便宜,总共大概花费了 16 块钱。 有了前面的那个打脸,单纯的几次测试确实也还看不出来啥,仅供参考吧。 而且这种一次性的 Prompt 没办法看出来模型对于对于细节,项目理解,代码修改方面的水平,后续还需要更多测试,也希望能尽快出个 Coding Plan 吧,不然现在的价格确实性价比不高。