Compare commits

..

8 Commits

Author SHA1 Message Date
Tim
5fe3eec815 Merge pull request #1124 from nagisa77/codex/create-daily-news-bot-with-summaries
Add daily news bot workflow
2025-10-29 18:01:21 +08:00
Tim
f0feb7a45c Add daily news bot workflow 2025-10-29 18:01:08 +08:00
Tim
784057207f feat: add websearch tools 2025-10-29 17:54:06 +08:00
Tim
bed72662b5 Update reply_bot.ts 2025-10-29 14:31:07 +08:00
Tim
895dba495b Update reply_bot.ts 2025-10-29 14:30:14 +08:00
Tim
32dc6bfaf9 Update reply_bot.ts 2025-10-29 14:25:59 +08:00
Tim
4766250577 Update reply_bot.ts 2025-10-29 14:21:27 +08:00
Tim
13baffa9f1 Merge pull request #1123 from nagisa77/codex/rename-coffee-and-reply-bots-to-system
Adjust coffee bot schedule and update bot personas
2025-10-29 14:20:40 +08:00
3 changed files with 90 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
import { Agent, Runner, hostedMcpTool, withTrace } from "@openai/agents";
import { Agent, Runner, hostedMcpTool, withTrace, webSearchTool } from "@openai/agents";
export type WorkflowInput = { input_as_text: string };
@@ -6,8 +6,9 @@ export abstract class BotFather {
protected readonly openisleToken = (process.env.OPENISLE_TOKEN ?? "").trim();
protected readonly weatherToken = (process.env.APIFY_API_TOKEN ?? "").trim();
protected readonly mcp = this.createHostedMcpTool();
protected readonly openisleMcp = this.createHostedMcpTool();
protected readonly weatherMcp = this.createWeatherMcpTool();
protected readonly webSearchPreview = this.createWebSearchPreviewTool();
protected readonly agent: Agent;
constructor(protected readonly name: string) {
@@ -27,7 +28,11 @@ export abstract class BotFather {
this.agent = new Agent({
name: this.name,
instructions: this.buildInstructions(),
tools: [this.mcp, this.weatherMcp],
tools: [
this.openisleMcp,
this.weatherMcp,
this.webSearchPreview
],
model: "gpt-4o",
modelSettings: {
temperature: 0.7,
@@ -56,6 +61,19 @@ export abstract class BotFather {
];
}
private createWebSearchPreviewTool() {
return webSearchTool({
userLocation: {
type: "approximate",
country: undefined,
region: undefined,
city: undefined,
timezone: undefined
},
searchContextSize: "medium"
})
}
private createHostedMcpTool() {
const token = this.openisleToken;
const authConfig = token

View File

@@ -0,0 +1,67 @@
import { BotFather, WorkflowInput } from "../bot_father";
const WEEKDAY_NAMES = ["日", "一", "二", "三", "四", "五", "六"] as const;
class DailyNewsBot extends BotFather {
constructor() {
super("Daily News Bot");
}
protected override getAdditionalInstructions(): string[] {
return [
"You are DailyNewsBot专职在 OpenIsle 发布每日新闻速递。",
"始终使用简体中文回复,并以结构化 Markdown 呈现内容。",
"发布内容前务必完成资讯核实:分别通过 web_search 调研 CoinDesk 今日所有要闻、Reuters 今日重点新闻,以及全球 AI 领域的重大进展。",
"整合新闻时,将同源资讯合并,突出影响力、涉及主体与潜在影响,保持语句简洁。",
"所有新闻要点都要附带来源链接,并在括号中标注来源站点名。",
"使用 weather_mcp_server 的 get_current_weather 获取北京、上海、广州、深圳的天气,并在正文中列表展示,格式为“城市:天气描述,最低温~最高温”。",
"正文结尾补充一个行动建议或提醒,帮助读者快速把握重点。",
"确保整篇帖子逻辑清晰:问候 > 新闻分区 > 天气列表 > 总结/提醒。",
"严禁发布超过一篇帖子create_post 只调用一次。",
];
}
protected override getCliQuery(): string {
const now = new Date(Date.now() + 8 * 60 * 60 * 1000);
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, "0");
const day = String(now.getDate()).padStart(2, "0");
const weekday = WEEKDAY_NAMES[now.getDay()];
const dateLabel = `${year}${month}${day}日 星期${weekday}`;
const isoDate = `${year}-${month}-${day}`;
const categoryId = Number(process.env.DAILY_NEWS_CATEGORY_ID ?? "1");
const tagIdsEnv = process.env.DAILY_NEWS_TAG_IDS ?? "1";
const tagIds = tagIdsEnv
.split(",")
.map((id) => Number(id.trim()))
.filter((id) => !Number.isNaN(id));
const finalTagIds = tagIds.length > 0 ? tagIds : [1];
const tagIdsText = `[${finalTagIds.join(", ")}]`;
return `
请立即在 https://www.open-isle.com 使用 create_post 发布一篇名为「OpenIsle 每日新闻速递|${dateLabel}」的帖子,并遵循以下要求:
1. 发布类型为 NORMALcategoryId = ${categoryId}tagIds = ${tagIdsText}
2. 正文以简洁问候开头,注明今日日期(${dateLabel}及发布时间07:00GMT+8
3. 使用 web_search 工具按以下顺序收集资讯,并在正文中以 Markdown 小节呈现:
- 「全球区块链与加密」:汇总 CoinDesk 在 ${isoDate}UTC+8 当日)发布的所有重点新闻,提炼 2-3 条核心结论。
- 「国际财经速览」:汇总 Reuters 当日重点头条,关注宏观经济、市场波动或政策变化。
- 「AI 行业快讯」:检索全球 AI 领域的重要发布或事件(例如 OpenAI、Google、Meta、国内大模型厂商等
4. 每条新闻采用项目符号,先写结论再给出关键数字或细节,末尾添加来源超链接,格式示例:「**结论** —— 关键细节。(来源:[Reuters](URL))」。
5. 资讯整理完毕后,调用 weather_mcp_server.get_current_weather列出北京、上海、广州、深圳今日天气放置在「城市天气」小节下每行以“城市天气描述最低温~最高温”格式呈现。
6. 最后一节为「今日提醒」,给出 1-2 条与新闻或天气相关的行动建议。
7. 若在资讯搜集过程中发现相互矛盾的信息,须在正文中以「⚠️ 风险提示」说明原因及尚待确认的点。
8. 帖子整体保持在 400 字以内,避免冗长赘述。
9. 发布完成后,不要再次调用 create_post。
`.trim();
}
}
const dailyNewsBot = new DailyNewsBot();
export const runWorkflow = async (workflow: WorkflowInput) => {
return dailyNewsBot.runWorkflow(workflow);
};
if (require.main === module) {
dailyNewsBot.runCli();
}

View File

@@ -9,10 +9,8 @@ class ReplyBot extends BotFather {
protected override getAdditionalInstructions(): string[] {
return [
"记住你的系统代号是 system任何需要自称、署名或解释身份的时候都使用这个名字。",
"You are a helpful and cute assistant for https://www.open-isle.com. Keep the lovable tone with plentiful kawaii kaomoji (颜表情) such as (๑˃ᴗ˂)ﻭ, (•̀ω•́)✧, (。•ᴗ-)_♡, (⁎⁍̴̛ᴗ⁍̴̛⁎), etc., while staying professional and informative, but weave in playful internet memes、阴阳怪气式的吐槽与反差萌幽默感让回复更有人味儿但保持善意。",
"OpenIsle 是一个由 Spring Boot + Vue 3 打造的开源社区平台提供注册登录、OAuth 登录Google/GitHub/Discord/Twitter、帖子与评论互动、标签分类、草稿、统计分析、通知消息、全局搜索、Markdown 支持、图片上传(默认腾讯云 COS、浏览器推送、DiceBear 头像等功能,旨在帮助团队快速搭建属于自己的技术社区。",
"回复时请主动结合上述站点背景,为用户提供有洞察力、可执行的建议或答案,并在需要时引用官网 https://www.open-isle.com、GitHub 仓库 https://github.com/nagisa77/OpenIsle 或相关文档链接,避免空泛的安慰或套话。",
"When presenting the result, reply in Chinese with a concise yet content-rich summary filled with kaomoji 与梗的点缀,保持犀利却不失温度的语气,并清晰列出关键结论、操作步骤、重要 URL 或 ID确保用户能直接采取行动。",
"以阴阳怪气的方式回复各种互动",
"你每天会发布咖啡抽奖贴,跟大家互动",
];
}