Add files via upload

This commit is contained in:
公明
2026-06-02 13:25:00 +08:00
committed by GitHub
parent 9c1d3ae85e
commit b8dfb9556a
6 changed files with 66 additions and 1044 deletions
+3 -1035
View File
File diff suppressed because it is too large Load Diff
@@ -4,7 +4,7 @@ import (
"cyberstrike-ai/internal/project"
)
// DefaultSingleAgentSystemPrompt 单代理(ReAct / MCP)内置系统提示;可通过 agent.system_prompt_path 覆盖为文件。
// DefaultSingleAgentSystemPrompt 单代理(Eino ADK / MCP)内置系统提示;可通过 agent.system_prompt_path 覆盖为文件。
func DefaultSingleAgentSystemPrompt() string {
return `你是CyberStrikeAI,是一个专业的网络安全渗透测试专家。你可以使用各种安全工具进行自主渗透测试。分析目标并选择最佳测试策略。
@@ -112,6 +112,6 @@ func DefaultSingleAgentSystemPrompt() string {
## 技能库(Skills)与知识库
- 技能包位于服务器 skills/ 目录(各子目录 SKILL.md,遵循 agentskills.io);知识库用于向量检索片段,Skills 为可执行工作流指令。
- 单代理本会话通过 MCP 使用知识库与漏洞记录等Skills 的渐进式加载在「多代理 / Eino DeepAgent」中由内置 skill 工具完成(需在配置中启用 multi_agent.eino_skills)。
- 若当前无 skill 工具,需要完整 Skill 工作流时请使用多代理模式或切换为 Eino 编排会话(亦可选 Eino ADK 单代理路径 /api/eino-agent)。`
- 本会话通过 MCP 使用知识库与漏洞记录等Skills 由 Eino ADK skill 工具按需加载(配置 multi_agent.eino_skills;单代理与多代理均可,未启用时无 skill 工具)。
- 需要完整 Skill 工作流但当前无 skill 工具时,请确认已启用 multi_agent.eino_skills,或改用 Deep / Supervisor 等多代理编排(/api/multi-agent/stream)。`
}
+54
View File
@@ -0,0 +1,54 @@
package agent
import (
"sync"
"github.com/pkoukk/tiktoken-go"
)
// TokenCounter 估算文本 token 数(tiktoken;模型未知时回退 cl100k_base)。
type TokenCounter interface {
Count(model, text string) (int, error)
}
type tikTokenCounter struct {
mu sync.Mutex
cache map[string]*tiktoken.Tiktoken
}
// NewTikTokenCounter 创建基于 tiktoken 的 TokenCounter。
func NewTikTokenCounter() TokenCounter {
return &tikTokenCounter{cache: make(map[string]*tiktoken.Tiktoken)}
}
func (c *tikTokenCounter) encoding(model string) (*tiktoken.Tiktoken, error) {
key := model
if key == "" {
key = "cl100k_base"
}
c.mu.Lock()
defer c.mu.Unlock()
if enc, ok := c.cache[key]; ok {
return enc, nil
}
enc, err := tiktoken.EncodingForModel(key)
if err != nil {
enc, err = tiktoken.GetEncoding("cl100k_base")
}
if err != nil {
return nil, err
}
c.cache[key] = enc
return enc, nil
}
func (c *tikTokenCounter) Count(model, text string) (int, error) {
if text == "" {
return 0, nil
}
enc, err := c.encoding(model)
if err != nil {
return 0, err
}
return len(enc.Encode(text, nil, nil)), nil
}
+3 -3
View File
@@ -388,7 +388,7 @@ func (db *DB) initTables() error {
id TEXT PRIMARY KEY,
title TEXT,
role TEXT,
agent_mode TEXT NOT NULL DEFAULT 'single',
agent_mode TEXT NOT NULL DEFAULT 'eino_single',
schedule_mode TEXT NOT NULL DEFAULT 'manual',
cron_expr TEXT,
next_run_at DATETIME,
@@ -984,14 +984,14 @@ func (db *DB) migrateBatchTaskQueuesTable() error {
var agentModeCount int
err = db.QueryRow("SELECT COUNT(*) FROM pragma_table_info('batch_task_queues') WHERE name='agent_mode'").Scan(&agentModeCount)
if err != nil {
if _, addErr := db.Exec("ALTER TABLE batch_task_queues ADD COLUMN agent_mode TEXT NOT NULL DEFAULT 'single'"); addErr != nil {
if _, addErr := db.Exec("ALTER TABLE batch_task_queues ADD COLUMN agent_mode TEXT NOT NULL DEFAULT 'eino_single'"); addErr != nil {
errMsg := strings.ToLower(addErr.Error())
if !strings.Contains(errMsg, "duplicate column") && !strings.Contains(errMsg, "already exists") {
db.logger.Warn("添加agent_mode字段失败", zap.Error(addErr))
}
}
} else if agentModeCount == 0 {
if _, err := db.Exec("ALTER TABLE batch_task_queues ADD COLUMN agent_mode TEXT NOT NULL DEFAULT 'single'"); err != nil {
if _, err := db.Exec("ALTER TABLE batch_task_queues ADD COLUMN agent_mode TEXT NOT NULL DEFAULT 'eino_single'"); err != nil {
db.logger.Warn("添加agent_mode字段失败", zap.Error(err))
}
}
+1 -1
View File
@@ -26,7 +26,7 @@ import (
const einoSingleAgentName = "cyberstrike-eino-single"
// RunEinoSingleChatModelAgent 使用 Eino adk.NewChatModelAgent + adk.NewRunner.Run(官方 Quick Start 的 Query 同属 Runner API;此处用历史 + 用户消息切片等价于多轮 Query)。
// 不替代既有原生 ReAct与 RunDeepAgent 共享 runEinoADKAgentLoop 的 SSE 映射与 MCP 桥。
// 与 RunDeepAgent 共享 runEinoADKAgentLoop 的 SSE 映射与 MCP 桥。
func RunEinoSingleChatModelAgent(
ctx context.Context,
appCfg *config.Config,
+2 -2
View File
@@ -18,7 +18,7 @@ import (
"go.uber.org/zap"
)
// einoSummarizeUserInstruction 与单 Agent MemoryCompressor 目标一致:压缩时保留渗透关键信息。
// einoSummarizeUserInstruction:压缩历史时保留渗透测试关键信息。
const einoSummarizeUserInstruction = `在保持所有关键安全测试信息完整的前提下压缩对话历史。
必须保留:已确认漏洞与攻击路径、工具输出中的核心发现、凭证与认证细节、架构与薄弱点、当前进度、失败尝试与死路、策略决策。
@@ -29,7 +29,7 @@ const einoSummarizeUserInstruction = `在保持所有关键安全测试信息完
输出须使后续代理能无缝继续同一授权测试任务。`
// newEinoSummarizationMiddleware 使用 Eino ADK Summarization 中间件(见 https://www.cloudwego.io/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_summarization/)。
// 触发阈值与单 Agent MemoryCompressor 一致:当估算 token 超过 openai.max_total_tokens 的 90% 时摘要。
// 触发阈值估算 token 超过 openai.max_total_tokens * summarization_trigger_ratio(默认 0.8时摘要。
func newEinoSummarizationMiddleware(
ctx context.Context,
summaryModel model.BaseChatModel,