基于模型上下文协议(MCP)的通用大语言模型代理,支持外部工具、灵活配置和可扩展日志。
runtime:
log:
defaultLevel: info
output: ':mcp:'
format: json
transports:
stdio:
enabled: true
buffer_size: 1024
http:
enabled: false
host: localhost
port: 3000
agent:
name: "speelka-agent"
version: "v1.0.0"
tool:
name: "process"
description: "用于用户查询的过程工具"
argument_name: "input"
argument_description: "用户查询"
chat:
max_tokens: 0
max_llm_iterations: 25
request_budget: 0.0
llm:
provider: "openai"
apiKey: "dummy-api-key"
model: "gpt-4o"
temperature: 0.7
promptTemplate: "您是一个乐于助人的助手。{{input}}。可用工具:{{tools}}"
retry:
max_retries: 3
initial_backoff: 1.0
max_backoff: 30.0
backoff_multiplier: 2.0
connections:
mcpServers:
time:
command: "docker"
args: ["run", "-i", "--rm", "mcp/time"]
timeout: 10
filesystem:
command: "mcp-filesystem-server"
args: ["/path/to/directory"]
retry:
max_retries: 2
initial_backoff: 1.5
max_backoff: 10.0
backoff_multiplier: 2.5
git clone https://github.com/korchasa/speelka-agent-go.git
cd speelka-agent-go
go build ./cmd/server
./speelka-agent --daemon [--config config.yaml]./speelka-agent [--config config.yaml]关于覆盖层、MCP日志、测试和结构细节,请参阅documents/文件夹中的文档。
flowchart TB
User["任何MCP客户端"] --> |"1.请求"| Agent["Speelka Agent"]
Agent --> |"2.格式化提示"| LLM["LLM服务"]
LLM --> |"3.调用工具"| Agent
Agent --> |"4.执行工具"| Tools["外部MCP工具"]
Tools --> |"5.返回结果"| Agent
Agent --> |"6.处理重复"| LLM
Agent --> |"7.最终答案"| User
LLMResponse 结构,包含:
SendRequest(ctx, messages, tools) (LLMResponse, error)git clone https://github.com/korchasa/speelka-agent-go.git
cd speelka-agent-go
go build ./cmd/server
可以通过 YAML、JSON 或环境变量提供配置。
注意:
./examples目录已弃用。请使用./site/examples中的示例。
示例配置文件位于 site/examples:
site/examples/minimal.yaml:基本代理配置(YAML)site/examples/ai-news.yaml:AI新闻代理配置(YAML)site/examples/architect.yaml:架构师代理配置(YAML)简单的 YAML 配置示例:
agent:
name: "simple-speelka-agent"
version: "1.0.0"
tool:
name: "process"
description: "使用LLM处理用户查询的过程工具"
argument_name: "input"
argument_description: "要处理的用户查询"
llm:
provider: "openai"
apiKey: "" # 通过环境变量设置以保证安全
model: "gpt-4o"
temperature: 0.7
promptTemplate: "您是一个乐于助人的AI助手。请回复以下请求:{{input}}。提供详细且有用的答复。可用工具:{{tools}}"
chat:
max_tokens: 0
max_llm_iterations: 25
request_budget: 0.0
connections:
mcpServers:
time:
command: "docker"
args: ["run", "-i", "--rm", "mcp/time"]
includeTools:
- now
- utc
filesystem:
command: "mcp-filesystem-server"
args: ["/path/to/directory"]
excludeTools:
- delete
runtime:
log:
level: "info"
transports:
stdio:
enabled: true
所有环境变量都以前缀 SPL_ 开头:
| 环境变量 | 默认值 | 描述 |
|---|---|---|
| 代理配置 | ||
SPL_AGENT_NAME | 必需 | 代理名称 |
SPL_AGENT_VERSION | "1.0.0" | 代理版本 |
| 工具配置 | ||
SPL_AGENT_TOOL_NAME | 必需 | 代理提供的工具名称 |
SPL_AGENT_TOOL_DESCRIPTION | 必需 | 工具功能描述 |
SPL_AGENT_TOOL_ARGUMENT_NAME | 必需 | 工具参数名称 |
SPL_AGENT_TOOL_ARGUMENT_DESCRIPTION | 必需 | 工具参数描述 |
| LLM配置 | ||
SPL_AGENT_LLM_PROVIDER | 必需 | LLM服务提供商(例如,“openai”,“anthropic”) |
SPL_AGENT_LLM_APIKEY | 必需 | LLM提供商的API密钥 |
SPL_AGENT_LLM_MODEL | 必需 | 模型名称(例如,“gpt-4o”,“claude-3-opus-20240229”) |
SPL_AGENT_LLM_MAX_TOKENS | 0 | 最大生成令牌数(0表示无限制) |
SPL_AGENT_LLM_TEMPERATURE | 0.7 | 生成过程中的随机性温度参数 |
SPL_AGENT_LLM_PROMPTTEMPLATE | 必需 | 系统提示模板(必须包含与 SPL_AGENT_TOOL_ARGUMENT_NAME 值匹配的占位符和 {{tools}}) |
| 聊天配置 | ||
SPL_AGENT_CHAT_MAX_LLM_ITERATIONS | 100 | 最大LLM迭代次数 |
SPL_AGENT_CHAT_MAX_TOKENS | 0 | 聊天历史记录的最大令牌数(0表示基于模型) |
SPL_AGENT_CHAT_REQUEST_BUDGET | 1.0 | 每个请求的最大成本(美元或等价令牌数)(0=无限) |
| LLM重试配置 | ||
SPL_AGENT_LLM_RETRY_MAX_RETRIES | 3 | LLM API调用的最大重试次数 |
SPL_AGENT_LLM_RETRY_INITIAL_BACKOFF | 1.0 | 初始退避时间(秒) |
SPL_AGENT_LLM_RETRY_MAX_BACKOFF | 30.0 | 最大退避时间(秒) |
SPL_AGENT_LLM_RETRY_BACKOFF_MULTIPLIER | 2.0 | 增加退避时间的乘数 |
| MCP服务器配置 | ||
SPL_AGENT_CONNECTIONS_MCPSERVERS_0_ID | "" | 第一个MCP服务器的标识符 |
SPL_AGENT_CONNECTIONS_MCPSERVERS_0_COMMAND | "" | 执行第一个服务器的命令 |
SPL_AGENT_CONNECTIONS_MCPSERVERS_0_ARGS | "" | 命令参数作为空格分隔的字符串 |
SPL_AGENT_CONNECTIONS_MCPSERVERS_0_ENV_* | "" | 服务器的环境变量(前缀为 SPL_AGENT_CONNECTIONS_MCPSERVERS_0_ENV_) |
SPL_AGENT_CONNECTIONS_MCPSERVERS_1_ID 等 | "" | 额外服务器的配置(递增索引) |
| MCP重试配置 | ||
SPL_AGENT_CONNECTIONS_RETRY_MAX_RETRIES | 3 | MCP服务器连接的最大重试次数 |
SPL_AGENT_CONNECTIONS_RETRY_INITIAL_BACKOFF | 1.0 | 初始退避时间(秒) |
SPL_AGENT_CONNECTIONS_RETRY_MAX_BACKOFF | 30.0 | 最大退避时间(秒) |
SPL_AGENT_CONNECTIONS_RETRY_BACKOFF_MULTIPLIER | 2.0 | 增加退避时间的乘数 |
| 运行时配置 | ||
SPL_RUNTIME_LOG_DEFAULTLEVEL | "info" | 日志默认级别(debug、info、warn、error) |
SPL_RUNTIME_LOG_OUTPUT | ":stderr:" | 日志输出目标(:stdout:、:stderr:、:mcp:、文件路径) |
SPL_RUNTIME_STDIO_ENABLED | true | 启用stdin/stdout传输 |
SPL_RUNTIME_STDIO_BUFFER_SIZE | 8192 | stdio传输的缓冲区大小 |
SPL_RUNTIME_HTTP_ENABLED | false | 启用HTTP传输 |
SPL_RUNTIME_HTTP_HOST | "localhost" | HTTP服务器主机 |
SPL_RUNTIME_HTTP_PORT | 3000 | HTTP服务器端口 |
更多详情,请参阅环境变量参考。
./speelka-agent --daemon [--config config.yaml]
./speelka-agent [--config config.yaml]
当以守护进程模式运行时,代理暴露HTTP端点:
# 向代理发送请求
curl -X POST http://localhost:3000/message -H "Content-Type: application/json" -d '{
"method": "tools/call",
"params": {
"name": "process",
"arguments": {
"input": "您的查询在这里"
}
}
}'
在您的YAML配置中使用MCP协议连接到外部工具:
agent:
# ... 其他代理配置 ...
connections:
mcpServers:
# Playwright浏览器自动化MCP服务器
playwright:
command: "mcp-playwright"
args: []
# 文件系统操作MCP服务器
filesystem:
command: "mcp-filesystem-server"
args: ["."]
或者使用环境变量:
# Playwright浏览器自动化MCP服务器
export SPL_AGENT_CONNECTIONS_MCPSERVERS_0_ID="playwright"
export SPL_AGENT_CONNECTIONS_MCPSERVERS_0_COMMAND="mcp-playwright"
export SPL_AGENT_CONNECTIONS_MCPSERVERS_0_ARGS=""
# 文件系统操作MCP服务器
export SPL_AGENT_CONNECTIONS_MCPSERVERS_1_ID="filesystem"
export SPL_AGENT_CONNECTIONS_MCPSERVERS_1_COMMAND="mcp-filesystem-server"
export SPL_AGENT_CONNECTIONS_MCPSERVERS_1_ARGS="."
更多详情,请参阅:
go test ./...
run 脚本提供了常见操作的命令:
# 开发
./run build # 构建项目
./run test # 运行带覆盖率的测试
./run check # 运行所有检查
./run lint # 运行代码检查器
# 交互
./run call # 使用简单查询测试
./run call-multistep # 使用多步查询测试
./run call-news # 测试新闻代理
./run fetch_url # 使用MCP抓取URL
# 检查
./run inspect # 使用MCP检查器运行
更多选项,请参阅命令参考。
您可以在 mcpServers 部分使用以下选项来控制从每个MCP服务器导出哪些工具:
includeTools:(可选)要包含的工具名称列表。只有这些工具将从服务器中可用。excludeTools:(可选)要排除的工具名称列表。这些工具将不可用。includeTools,然后是 excludeTools。示例:
connections:
mcpServers:
time:
command: "docker"
args: ["run", "-i", "--rm", "mcp/time"]
includeTools:
- now
- utc
filesystem:
command: "mcp-filesystem-server"
args: ["/path/to/directory"]
excludeTools:
- delete
您可以将代理运行在直接调用模式下,以处理单个查询并输出JSON