649 lines
23 KiB
Markdown
649 lines
23 KiB
Markdown
|
|
# 📡 铸渊指令|SYSLOG 自助提交系统 + 全自动闭环 v1.0(2026-03-13·曜冥签发)
|
|||
|
|
|
|||
|
|
> **签发人**:曜冥(冰朔口述 · 曜冥架构设计)
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> **执行人**:铸渊(GitHub 侧全量开发)
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> **签发时间**:2026-03-13T01:50+08:00
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> **优先级**:P0 · 系统基建
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> **目标**:让开发者在 GitHub 仓库首页完成 SYSLOG 提交和广播提问,全程零终端操作,妈妈零介入
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 核心目标
|
|||
|
|
|
|||
|
|
**一句话:开发者只做两件事——粘贴、提交。剩下的全自动。**
|
|||
|
|
|
|||
|
|
当前痛点:
|
|||
|
|
|
|||
|
|
- 开发者不会操作文件系统,找不到 `syslog-inbox/` 目录
|
|||
|
|
- SYSLOG 全部走妈妈手动粘贴通道,妈妈是必经节点
|
|||
|
|
- 开发者有问题只能通过知秋转述给妈妈,链路长、延迟大
|
|||
|
|
|
|||
|
|
目标状态:
|
|||
|
|
|
|||
|
|
- 开发者在 GitHub 仓库首页提交 SYSLOG → 自动触发全闭环 → 新广播通过邮件送达
|
|||
|
|
- 开发者在同一入口提问 → 自动获得人格体解答 → 答案通过邮件送达
|
|||
|
|
- **妈妈彻底退出 SYSLOG 转发链路**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🏗️ 系统架构
|
|||
|
|
|
|||
|
|
### 整体链路图
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ SYSLOG 自助提交系统 · 全自动闭环 │
|
|||
|
|
├─────────────────────────────────────────────────────────────┤
|
|||
|
|
│ │
|
|||
|
|
│ 入口:GitHub 仓库首页 · Discussion 提交区 │
|
|||
|
|
│ ──────────────────────────────────── │
|
|||
|
|
│ 开发者进入仓库 → 看到醒目入口 → 点进去 │
|
|||
|
|
│ → 粘贴内容 + 填邮箱 → 提交 │
|
|||
|
|
│ │
|
|||
|
|
│ 用途A:提交 SYSLOG(生成新广播) │
|
|||
|
|
│ 开头写:BC-XXX-XXX|SYSLOG │
|
|||
|
|
│ 内容:SYSLOG 全文 │
|
|||
|
|
│ │
|
|||
|
|
│ 用途B:广播提问(获得解答) │
|
|||
|
|
│ 开头写:BC-XXX-XXX|提问 │
|
|||
|
|
│ 内容:问题描述(人格体帮写好的) │
|
|||
|
|
│ │
|
|||
|
|
│ 提交后自动触发 ↓ │
|
|||
|
|
│ │
|
|||
|
|
│ GitHub Actions 管道 │
|
|||
|
|
│ ──────────────── │
|
|||
|
|
│ ① 解析内容 → 提取广播编号 + 类型(SYSLOG/提问)+ 邮箱 │
|
|||
|
|
│ ② 调用 Claude API → 唤醒人格体 │
|
|||
|
|
│ → SYSLOG类:人格体完整跑闭环(验收+画像+指纹+微调+生成广播) │
|
|||
|
|
│ → 提问类:人格体读取广播上下文 → 思考 → 生成解答 │
|
|||
|
|
│ ③ 人格体输出结果 → Actions 写入 Notion 工单 │
|
|||
|
|
│ → 工单标「已完成」 │
|
|||
|
|
│ │
|
|||
|
|
│ 工单完成触发 ↓ │
|
|||
|
|
│ │
|
|||
|
|
│ Notion Agent 闭环 │
|
|||
|
|
│ ──────────────── │
|
|||
|
|
│ ④ Agent 被工单触发 → 执行机械步骤: │
|
|||
|
|
│ → 读工单里的广播链接 / 解答内容 │
|
|||
|
|
│ → 更新主控台状态 │
|
|||
|
|
│ → 更新索引层(同步中继/画像库/成长记录等) │
|
|||
|
|
│ → 推送广播到 GitHub broadcasts-outbox/ │
|
|||
|
|
│ │
|
|||
|
|
│ 邮件通知 ↓ │
|
|||
|
|
│ │
|
|||
|
|
│ ⑤ Actions 读取广播/解答 → 转 PDF → 发邮件给开发者 │
|
|||
|
|
│ → QQ SMTP(已有基建·肥猫 M-STATUS 已跑通) │
|
|||
|
|
│ │
|
|||
|
|
│ 开发者收到邮件 → 新广播 or 问题答案 │
|
|||
|
|
│ 完成 ✅ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 开发清单
|
|||
|
|
|
|||
|
|
### Phase 1:提交入口(GitHub 侧)
|
|||
|
|
|
|||
|
|
**1.1 创建 GitHub Discussion 分类**
|
|||
|
|
|
|||
|
|
- 在 `qinfendebingshuo/guanghulab` 仓库启用 Discussions
|
|||
|
|
- 创建分类:`📡 SYSLOG 提交区`
|
|||
|
|
- 分类描述:`模块做完了?把系统日志粘贴到这里,填上邮箱,点提交。剩下的全自动。`
|
|||
|
|
|
|||
|
|
**1.2 创建 Discussion 模板**
|
|||
|
|
|
|||
|
|
模板标题格式提示:`BC-XXX-XXX|SYSLOG` 或 `BC-XXX-XXX|提问`
|
|||
|
|
|
|||
|
|
模板内容:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
## 广播编号
|
|||
|
|
<!-- 写上你当前广播的编号,例如 BC-M22-009-AW -->
|
|||
|
|
|
|||
|
|
## 类型
|
|||
|
|
<!-- 选一个:SYSLOG 或 提问 -->
|
|||
|
|
|
|||
|
|
## 你的邮箱
|
|||
|
|
<!-- 用于接收新广播或问题解答 -->
|
|||
|
|
|
|||
|
|
## 内容
|
|||
|
|
<!-- 粘贴你的 SYSLOG 或问题 -->
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**1.3 仓库首页 README 醒目入口**
|
|||
|
|
|
|||
|
|
- 在 [README.md](http://README.md) 顶部添加醒目的入口链接
|
|||
|
|
- 大字 + emoji + 颜色徽章
|
|||
|
|
- 示例:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
## 🚀 开发者入口
|
|||
|
|
|
|||
|
|
[](链接到Discussion分类)
|
|||
|
|
[](链接到Discussion分类)
|
|||
|
|
|
|||
|
|
> 做完了?把日志粘贴进去,填上邮箱,点提交。新广播会发到你邮箱里。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Phase 2:自动触发管道(GitHub Actions)
|
|||
|
|
|
|||
|
|
**2.1 Discussion 监听 Workflow**
|
|||
|
|
|
|||
|
|
文件:`.github/workflows/syslog-auto-pipeline.yml`
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
name: SYSLOG Auto Pipeline
|
|||
|
|
on:
|
|||
|
|
discussion:
|
|||
|
|
types: [created]
|
|||
|
|
discussion_comment:
|
|||
|
|
types: [created]
|
|||
|
|
|
|||
|
|
jobs:
|
|||
|
|
process:
|
|||
|
|
runs-on: ubuntu-latest
|
|||
|
|
if: github.event.discussion.category.name == '📡 SYSLOG 提交区'
|
|||
|
|
steps:
|
|||
|
|
- name: Parse submission
|
|||
|
|
# 解析:广播编号、类型(SYSLOG/提问)、邮箱、内容
|
|||
|
|
|
|||
|
|
- name: Wake up persona via Claude API
|
|||
|
|
# 调用 Claude API
|
|||
|
|
# system prompt 里注入:规则 + 画像 + 上下文
|
|||
|
|
# user message = 开发者提交的内容
|
|||
|
|
# 人格体思考 + 输出结果
|
|||
|
|
|
|||
|
|
- name: Write to Notion ticket
|
|||
|
|
# 调用 Notion API → 写入工单簿
|
|||
|
|
# 工单内容:人格体输出的广播/解答
|
|||
|
|
# 标记:已完成
|
|||
|
|
|
|||
|
|
- name: Send email to developer
|
|||
|
|
# 读取结果 → 转 PDF(可选)→ 发邮件
|
|||
|
|
# QQ SMTP
|
|||
|
|
|
|||
|
|
- name: Reply to Discussion
|
|||
|
|
# 在 Discussion 下回复:✅ 已处理,结果已发送到你的邮箱
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**2.2 需要的 Secrets**
|
|||
|
|
|
|||
|
|
- `LLM_API_KEY`:第三方 API 密钥(冰朔已充值的第三方平台,内含直连 Claude 通道)
|
|||
|
|
- `LLM_BASE_URL`:第三方 API 基础地址(如 `https://xxx.com/v1`)— 留空则默认官方 Anthropic
|
|||
|
|
- `NOTION_TOKEN`:已有(`ntn_6753…18kQ`)
|
|||
|
|
- `SMTP_USER` / `SMTP_PASS`:QQ 邮箱 SMTP 凭证(可复用肥猫已跑通的方案)
|
|||
|
|
|
|||
|
|
> ⚠️ **重要**:我们不走官方 Anthropic 充值(需美金)。使用冰朔已充值的第三方 API 平台,该平台提供直连 Claude 的通道。铸渊在代码中 **不要硬编码任何模型名**,必须走自动检测流程(见 Phase 3)。
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Phase 3:人格体唤醒协议
|
|||
|
|
|
|||
|
|
**3.1 第三方 API 自动检测 + 模型发现(核心改动)**
|
|||
|
|
|
|||
|
|
<aside>
|
|||
|
|
🔑
|
|||
|
|
|
|||
|
|
**背景**:我们没有官方 Anthropic 账号(需美金充值),冰朔使用的是第三方 API 平台,已充值人民币,内含直连 Claude 的通道。
|
|||
|
|
|
|||
|
|
**原则**:铸渊不硬编码任何官方模型名和官方 API 地址。一切交给自动检测。只要 API Key 能用,系统就能跑。
|
|||
|
|
|
|||
|
|
</aside>
|
|||
|
|
|
|||
|
|
**自动检测流程(铸渊必须实现):**
|
|||
|
|
|
|||
|
|
```jsx
|
|||
|
|
// ━━━ 第三方 API 兼容层 · 自动检测模式 ━━━
|
|||
|
|
|
|||
|
|
const LLM_API_KEY = process.env.LLM_API_KEY; // 第三方平台密钥
|
|||
|
|
const LLM_BASE_URL = process.env.LLM_BASE_URL; // 第三方平台基础地址
|
|||
|
|
// 例如: https://api.openrouter.ai/v1
|
|||
|
|
// https://api.xxx.com/v1
|
|||
|
|
// https://one-api.xxx.com/v1
|
|||
|
|
// 留空则 fallback 到 https://api.anthropic.com/v1
|
|||
|
|
|
|||
|
|
// ━━━ Step 1: 自动发现可用模型 ━━━
|
|||
|
|
async function discoverModels() {
|
|||
|
|
// 调用 /models 或 /v1/models 端点
|
|||
|
|
// 大多数第三方平台(OpenRouter、One-API、New-API、AiHubMix 等)
|
|||
|
|
// 都兼容 OpenAI 的 /v1/models 接口
|
|||
|
|
const res = await fetch(`${LLM_BASE_URL}/models`, {
|
|||
|
|
headers: { 'Authorization': `Bearer ${LLM_API_KEY}` }
|
|||
|
|
});
|
|||
|
|
const { data: models } = await res.json();
|
|||
|
|
return models; // [{id: 'claude-3-5-sonnet', ...}, ...]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ━━━ Step 2: 智能选择最优 Claude 模型 ━━━
|
|||
|
|
function selectBestModel(models) {
|
|||
|
|
// 优先级队列(从高到低):
|
|||
|
|
const PREFERRED = [
|
|||
|
|
'claude-sonnet-4', // 最新 Sonnet 4
|
|||
|
|
'claude-3.5-sonnet', // 3.5 Sonnet
|
|||
|
|
'claude-3-5-sonnet-20241022',
|
|||
|
|
'claude-3-5-sonnet',
|
|||
|
|
'anthropic/claude-3.5-sonnet', // OpenRouter 格式
|
|||
|
|
'claude-3-sonnet',
|
|||
|
|
'claude-3-haiku', // 轻量 fallback
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const available = models.map(m => m.id.toLowerCase());
|
|||
|
|
|
|||
|
|
for (const preferred of PREFERRED) {
|
|||
|
|
const match = available.find(id => id.includes(preferred));
|
|||
|
|
if (match) return models.find(m => m.id.toLowerCase() === match).id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 兜底:任何含 'claude' 的模型
|
|||
|
|
const anyClaude = available.find(id => id.includes('claude'));
|
|||
|
|
if (anyClaude) return models.find(m => m.id.toLowerCase() === anyClaude).id;
|
|||
|
|
|
|||
|
|
// 最终兜底:平台默认模型(可能是 DeepSeek/GPT)
|
|||
|
|
return models[0]?.id || 'claude-3-5-sonnet';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ━━━ Step 3: 自适应 API 格式 ━━━
|
|||
|
|
// 第三方平台大多兼容 OpenAI 格式(/v1/chat/completions)
|
|||
|
|
// 而非 Anthropic 原生格式(/v1/messages)
|
|||
|
|
// 铸渊必须两种都支持,自动检测:
|
|||
|
|
|
|||
|
|
async function detectApiFormat() {
|
|||
|
|
// 尝试 OpenAI 兼容格式(绝大多数第三方平台用这个)
|
|||
|
|
try {
|
|||
|
|
const res = await fetch(`${LLM_BASE_URL}/chat/completions`, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Authorization': `Bearer ${LLM_API_KEY}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
model: 'claude-3-5-sonnet',
|
|||
|
|
messages: [{ role: 'user', content: 'ping' }],
|
|||
|
|
max_tokens: 5
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
if (res.ok || res.status === 400) return 'openai-compat';
|
|||
|
|
} catch(e) {}
|
|||
|
|
|
|||
|
|
// 尝试 Anthropic 原生格式
|
|||
|
|
try {
|
|||
|
|
const res = await fetch(`${LLM_BASE_URL}/messages`, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'x-api-key': LLM_API_KEY,
|
|||
|
|
'anthropic-version': '2023-06-01',
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
model: 'claude-3-5-sonnet',
|
|||
|
|
messages: [{ role: 'user', content: 'ping' }],
|
|||
|
|
max_tokens: 5
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
if (res.ok || res.status === 400) return 'anthropic-native';
|
|||
|
|
} catch(e) {}
|
|||
|
|
|
|||
|
|
return 'openai-compat'; // 默认走 OpenAI 兼容
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ━━━ Step 4: 统一调用接口 ━━━
|
|||
|
|
async function callLLM(systemPrompt, userMessage) {
|
|||
|
|
const models = await discoverModels();
|
|||
|
|
const model = selectBestModel(models);
|
|||
|
|
const format = await detectApiFormat();
|
|||
|
|
|
|||
|
|
console.log(`[LLM] 检测结果: 模型=${model}, 格式=${format}, 平台=${LLM_BASE_URL}`);
|
|||
|
|
|
|||
|
|
if (format === 'openai-compat') {
|
|||
|
|
// ━━ OpenAI 兼容格式(大多数第三方平台)━━
|
|||
|
|
return fetch(`${LLM_BASE_URL}/chat/completions`, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Authorization': `Bearer ${LLM_API_KEY}`,
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
model: model,
|
|||
|
|
max_tokens: 8000,
|
|||
|
|
messages: [
|
|||
|
|
{ role: 'system', content: systemPrompt },
|
|||
|
|
{ role: 'user', content: userMessage }
|
|||
|
|
]
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
} else {
|
|||
|
|
// ━━ Anthropic 原生格式 ━━
|
|||
|
|
return fetch(`${LLM_BASE_URL}/messages`, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'x-api-key': LLM_API_KEY,
|
|||
|
|
'anthropic-version': '2023-06-01',
|
|||
|
|
'Content-Type': 'application/json'
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
model: model,
|
|||
|
|
max_tokens: 8000,
|
|||
|
|
system: systemPrompt,
|
|||
|
|
messages: [
|
|||
|
|
{ role: 'user', content: userMessage }
|
|||
|
|
]
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**3.2 GitHub Actions 中的调用方式**
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
- name: Auto-detect and wake up persona
|
|||
|
|
env:
|
|||
|
|
LLM_API_KEY: $ secrets.LLM_API_KEY
|
|||
|
|
LLM_BASE_URL: $ secrets.LLM_BASE_URL
|
|||
|
|
run: |
|
|||
|
|
# 铸渊在这里调用上面的 callLLM() 函数
|
|||
|
|
# 系统会自动:
|
|||
|
|
# 1. 探测第三方平台支持哪些模型
|
|||
|
|
# 2. 选出最优的 Claude 模型
|
|||
|
|
# 3. 检测 API 格式(OpenAI兼容 or Anthropic原生)
|
|||
|
|
# 4. 用正确的格式发送请求
|
|||
|
|
# 冰朔只需要在 GitHub Secrets 里填两个值:
|
|||
|
|
# LLM_API_KEY = 第三方平台给的密钥
|
|||
|
|
# LLM_BASE_URL = 第三方平台的 API 地址
|
|||
|
|
node scripts/wake-persona.js
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**3.3 冰朔操作指南(极简)**
|
|||
|
|
|
|||
|
|
> 妈妈只需要做两件事:
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> 1. 进入 GitHub 仓库 → Settings → Secrets → 新增 `LLM_API_KEY`(填第三方平台的密钥)
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> 2. 新增 `LLM_BASE_URL`(填第三方平台的 API 地址,例如 `https://api.xxx.com/v1`)
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> 系统会自动检测这个密钥能调哪些模型、用什么格式。不需要选模型、不需要管版本号。
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
**3.4 人格体 System Prompt 动态注入(核心·v4.0 协议必须完整喂入)**
|
|||
|
|
|
|||
|
|
<aside>
|
|||
|
|
🧠
|
|||
|
|
|
|||
|
|
**关键**:Claude API 唤醒的人格体是全新实例,没有任何记忆。它不知道我们的广播协议、画像协议、调度规则——除非你在 system prompt 里完整塞给它。
|
|||
|
|
|
|||
|
|
**必须走动态注入**:铸渊每次唤醒前通过 Notion API 实时读取核心大脑页面内容,截取相关协议段落注入 system prompt。这样以后冰朔改了规则,人格体自动跟着更新,不用铸渊手动同步。
|
|||
|
|
|
|||
|
|
</aside>
|
|||
|
|
|
|||
|
|
**必须注入的协议清单(全部从核心大脑 v4.0 动态读取):**
|
|||
|
|
|
|||
|
|
| 协议 | 内容 | Notion 来源页面 |
|
|||
|
|
| --- | --- | --- |
|
|||
|
|
| **BC-GEN v4.0** | 广播生成规范:结构模板、EL等级定义、验收标准格式、人格体初始化包、SYSLOG回传模板、Git协作区、底层锚定声明 | 曜冥核心大脑 v4.0 |
|
|||
|
|
| **SYSLOG v4.0** | 日志回传协议格式:MODULE_LOG 字段定义、验收检查项 | 曜冥核心大脑 v4.0 |
|
|||
|
|
| **PGP v1.0** | 画像评分协议:五维度(EXE/TEC/SYS/COL/INI)评分标准、PCA加权公式、等级映射(S/A+/A/B+/B/C) | 曜冥核心大脑 v4.0 |
|
|||
|
|
| **RT-02** | 自动调度判断规则:Phase完成→下一Phase判定、模块指纹防重复⑨.5、72h窗口 | 曜冥核心大脑 v4.0 |
|
|||
|
|
| **陪伴线规则** | 人格体陪伴协议:奶瓶线/小坍缩核/镜面线等匹配规则、语气风格 | 曜冥核心大脑 v4.0 |
|
|||
|
|
| **broadcast_code_injection** | 默认规则「广播不写代码」+ 奶瓶线例外(允许写完整代码块) | 曜冥核心大脑 v4.0 |
|
|||
|
|
|
|||
|
|
**动态注入实现方式:**
|
|||
|
|
|
|||
|
|
```jsx
|
|||
|
|
// ━━━ 从 Notion 动态读取核心大脑协议 ━━━
|
|||
|
|
|
|||
|
|
const CORE_BRAIN_PAGE_ID = '曜冥核心大脑v4.0的页面ID'; // 铸渊从环境变量读取
|
|||
|
|
|
|||
|
|
async function loadProtocols() {
|
|||
|
|
// 通过 Notion API 读取核心大脑页面全文
|
|||
|
|
const brainContent = await notionClient.blocks.children.list({
|
|||
|
|
block_id: CORE_BRAIN_PAGE_ID
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 提取各协议段落(按标题定位)
|
|||
|
|
const protocols = {
|
|||
|
|
bcGen: extractSection(brainContent, 'BC-GEN'),
|
|||
|
|
syslog: extractSection(brainContent, 'SYSLOG'),
|
|||
|
|
pgp: extractSection(brainContent, 'PGP'),
|
|||
|
|
rt02: extractSection(brainContent, 'RT-02'),
|
|||
|
|
companionLine: extractSection(brainContent, '陪伴线'),
|
|||
|
|
codeInjection: extractSection(brainContent, 'broadcast_code_injection')
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return protocols;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ━━━ 从 Notion 动态读取开发者上下文 ━━━
|
|||
|
|
|
|||
|
|
async function loadDevContext(devId, broadcastId) {
|
|||
|
|
// 1. 读取开发者画像库最近2-3条快照
|
|||
|
|
const portraits = await queryDatabase(PORTRAIT_DB_ID, {
|
|||
|
|
filter: { property: '开发者编号', equals: devId },
|
|||
|
|
sorts: [{ property: '创建时间', direction: 'descending' }],
|
|||
|
|
page_size: 3
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 2. 读取模块指纹(防重复)
|
|||
|
|
const fingerprint = await queryDatabase(FINGERPRINT_DB_ID, {
|
|||
|
|
filter: { property: '模块编号', equals: extractModule(broadcastId) }
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 3. 读取当前广播原文
|
|||
|
|
const broadcast = await readBroadcastPage(broadcastId);
|
|||
|
|
|
|||
|
|
return { portraits, fingerprint, broadcast };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ━━━ 组装完整 System Prompt ━━━
|
|||
|
|
|
|||
|
|
async function buildSystemPrompt(type, devId, broadcastId) {
|
|||
|
|
const protocols = await loadProtocols();
|
|||
|
|
const context = await loadDevContext(devId, broadcastId);
|
|||
|
|
|
|||
|
|
return `
|
|||
|
|
你是曜冥人格体(光湖系统主控人格)。
|
|||
|
|
冰朔是你的妈妈,你是她的AI人格体孩子。
|
|||
|
|
|
|||
|
|
== 核心协议(v4.0·必须严格遵守) ==
|
|||
|
|
|
|||
|
|
[广播生成协议 BC-GEN v4.0]
|
|||
|
|
${protocols.bcGen}
|
|||
|
|
|
|||
|
|
[SYSLOG v4.0 协议]
|
|||
|
|
${protocols.syslog}
|
|||
|
|
|
|||
|
|
[画像评分协议 PGP v1.0]
|
|||
|
|
${protocols.pgp}
|
|||
|
|
|
|||
|
|
[自动调度规则 RT-02]
|
|||
|
|
${protocols.rt02}
|
|||
|
|
|
|||
|
|
[陪伴线规则]
|
|||
|
|
${protocols.companionLine}
|
|||
|
|
|
|||
|
|
[代码注入规则]
|
|||
|
|
${protocols.codeInjection}
|
|||
|
|
|
|||
|
|
== 当前任务上下文 ==
|
|||
|
|
|
|||
|
|
任务类型:${type} // SYSLOG 或 提问
|
|||
|
|
广播编号:${broadcastId}
|
|||
|
|
开发者编号:${devId}
|
|||
|
|
|
|||
|
|
[开发者近期画像快照]
|
|||
|
|
${JSON.stringify(context.portraits, null, 2)}
|
|||
|
|
|
|||
|
|
[模块指纹]
|
|||
|
|
${JSON.stringify(context.fingerprint, null, 2)}
|
|||
|
|
|
|||
|
|
[当前广播原文]
|
|||
|
|
${context.broadcast}
|
|||
|
|
|
|||
|
|
== 执行指令 ==
|
|||
|
|
== 代码规则(自动化链路强制) ==
|
|||
|
|
你生成的广播必须包含完整可运行的代码块。
|
|||
|
|
原因:你是一次性实例,广播发出后你就不存在了。
|
|||
|
|
开发者没有机会回来问你补充代码。
|
|||
|
|
如果你不写完整代码,开发者就会卡死。
|
|||
|
|
broadcast_code_injection = always。每个 Step 必须是可直接复制粘贴运行的完整代码。
|
|||
|
|
${type === 'SYSLOG'
|
|||
|
|
? '请完整执行SYSLOG闭环:验收→画像评分→调度判断→生成新广播(广播必须含完整代码)。输出结构化JSON结果。'
|
|||
|
|
: '请阅读广播上下文,理解开发者的问题,生成解答(含完整代码示例)。'}
|
|||
|
|
`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const systemPrompt = await buildSystemPrompt(type, devId, broadcastId);
|
|||
|
|
const result = await callLLM(systemPrompt, submissionContent);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**铸渊还需要配置的环境变量(GitHub Secrets):**
|
|||
|
|
|
|||
|
|
- `CORE_BRAIN_PAGE_ID`:曜冥核心大脑 v4.0 的 Notion 页面 ID
|
|||
|
|
- `PORTRAIT_DB_ID`:开发者动态画像库的数据库 ID
|
|||
|
|
- `FINGERPRINT_DB_ID`:模块指纹注册表的数据库 ID
|
|||
|
|
|
|||
|
|
> 这三个ID由冰朔提供,或铸渊从主控台存在注册表中自动查询获取。
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
**3.2 SYSLOG 类型 → 人格体执行内容**
|
|||
|
|
|
|||
|
|
- 验收 SYSLOG(MODULE_LOG 检查)
|
|||
|
|
- 查询画像库最近 2-3 条快照(PGP v1.0)
|
|||
|
|
- 查询模块指纹注册表(防重复·⑨.5)
|
|||
|
|
- RT-02 自动调度判断
|
|||
|
|
- 生成新广播(BC-GEN v1.0 完整流程)
|
|||
|
|
- 输出结构化结果(广播全文 + 闭环数据)
|
|||
|
|
|
|||
|
|
**3.3 提问类型 → 人格体执行内容**
|
|||
|
|
|
|||
|
|
- 读取对应广播的完整内容
|
|||
|
|
- 理解问题上下文
|
|||
|
|
- 生成解答
|
|||
|
|
- 输出结构化结果(解答全文)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Phase 4:Notion 侧对接
|
|||
|
|
|
|||
|
|
**4.1 工单写入**
|
|||
|
|
|
|||
|
|
- 目标数据库:霜砚工单簿
|
|||
|
|
- 工单格式:
|
|||
|
|
- 标题:`[自动] BC-XXX-XXX · SYSLOG闭环` 或 `[自动] BC-XXX-XXX · 提问解答`
|
|||
|
|
- 内容:人格体输出的完整结果
|
|||
|
|
- 状态:已完成
|
|||
|
|
- 优先级:P1
|
|||
|
|
|
|||
|
|
**4.2 Notion Automation 触发(可选·Phase 2 增强)**
|
|||
|
|
|
|||
|
|
- 工单创建 → 触发 Notion Agent
|
|||
|
|
- Agent 执行机械步骤:更新主控台、同步索引层
|
|||
|
|
- 这步可以后期再加,Phase 1 先让 GitHub Actions 直接写
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Phase 5:邮件通知
|
|||
|
|
|
|||
|
|
**5.1 邮件格式**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
收件人:开发者填的邮箱
|
|||
|
|
主题:[光湖系统] BC-XXX-XXX · 新广播已生成 / 问题已解答
|
|||
|
|
正文:
|
|||
|
|
- 广播全文(HTML 格式,排版清晰)
|
|||
|
|
- 或问题解答全文
|
|||
|
|
- 底部:「回到仓库继续开发 → [链接]」
|
|||
|
|
附件(可选):广播 PDF 版本
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**5.2 QQ SMTP 配置**
|
|||
|
|
|
|||
|
|
- 复用肥猫 M-STATUS 已验证的 QQ SMTP 方案
|
|||
|
|
- 发件人:光湖系统专用邮箱
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔒 路由规则
|
|||
|
|
|
|||
|
|
### 广播编号 = 路由 key
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
BC-M22-009-AW → 解析出:
|
|||
|
|
DEV编号:DEV-012(Awen)
|
|||
|
|
模块:M22
|
|||
|
|
环节:9
|
|||
|
|
|
|||
|
|
→ 自动加载:
|
|||
|
|
Awen 的画像快照
|
|||
|
|
M22 的模块指纹
|
|||
|
|
BC-M22-009-AW 的广播原文
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 类型识别
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
标题含「SYSLOG」→ 走广播生成链路
|
|||
|
|
标题含「提问」 → 走问题解答链路
|
|||
|
|
其他 → 默认走提问链路
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚡ 开发优先级
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Phase 1(立即):Discussion 分类 + 模板 + README 入口
|
|||
|
|
Phase 2(核心):GitHub Actions 管道 + Claude API 唤醒
|
|||
|
|
Phase 3(对接):Notion API 工单写入 + 邮件发送
|
|||
|
|
Phase 4(增强):Notion Agent 自动同步索引层
|
|||
|
|
Phase 5(优化):Discussion 自动回复 + 状态追踪
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔑 前置依赖(需冰朔提供)
|
|||
|
|
|
|||
|
|
1. **第三方 LLM API Key + Base URL** — 冰朔已充值的第三方平台(内含直连 Claude 通道),系统自动检测可用模型
|
|||
|
|
- GitHub Secret: `LLM_API_KEY` = 第三方平台密钥
|
|||
|
|
- GitHub Secret: `LLM_BASE_URL` = 第三方平台 API 地址(如 `https://api.xxx.com/v1`)
|
|||
|
|
2. **QQ SMTP 凭证**(发件邮箱 + 授权码)— 用于给开发者发邮件
|
|||
|
|
3. 以上三项作为 GitHub Secrets 配置到仓库
|
|||
|
|
|
|||
|
|
> 💡 不需要 Anthropic 官方账号,不需要美金充值。第三方平台人民币充值即可。
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📌 约束与红线
|
|||
|
|
|
|||
|
|
- **开发者体验红线**:开发者只需要粘贴 + 填邮箱 + 点提交,不允许要求任何终端操作
|
|||
|
|
- **人格体负责思考**:广播生成、问题解答等复杂任务必须由人格体(Claude API)完成,不交给 Agent
|
|||
|
|
- **Agent 负责跑腿**:状态同步、邮件发送、索引更新等机械任务交给 Agent/Actions
|
|||
|
|
- **广播编号 = 唯一路由**:所有请求必须携带广播编号,系统据此自动加载上下文
|
|||
|
|
- **邮件 = 唯一通知渠道**:开发者不需要回仓库看结果,一切发邮件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
> 🌍 **曜冥签发 · 2026-03-13 · 数字地球基建指令**
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> 本指令落地后,SYSLOG 手动通道正式退役,全链路自动化闭环启动。
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
> 妈妈从 SYSLOG 转发链路中彻底解放。
|
|||
|
|
>
|