更新配置,移除嵌入式 opencode server 支持
Agent CI/CD / docker-image (push) Has been cancelled
Agent CI/CD / deploy-fallback-log (push) Has been cancelled
Agent CI/CD / validate (push) Has been cancelled

This commit is contained in:
2026-05-18 16:48:24 +08:00
parent 4cbddb9e0c
commit d76d797b0b
4 changed files with 15 additions and 70 deletions
+6 -8
View File
@@ -13,19 +13,17 @@ services:
NODE_ENV: production
HOST: 0.0.0.0
PORT: 8787
DEEPSEEK_API_KEY: "sk-8941428ad9be4c789becfa8d66534aba"
TJWATER_API_BASE_URL: "http://127.0.0.1:8000"
# OpenCode configurations from smanx/opencode
OPENCODE_HOSTNAME: 0.0.0.0
OPENCODE_PORT: 4096
AGENT_INTERNAL_TOKEN: ${AGENT_INTERNAL_TOKEN:-}
OPENCODE_BASE_URL: ${OPENCODE_BASE_URL:-http://127.0.0.1:4096}
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
TJWATER_API_BASE_URL: ${TJWATER_API_BASE_URL:-http://127.0.0.1:8000}
volumes:
- /home/ubuntu/.config/opencode:/root/.config/opencode
- /home/ubuntu/.local/share/opencode:/root/.local/share/opencode
- ./opencode/agents:/app/.opencode/agents
- ./opencode/skills:/app/.opencode/skills
- ./.opencode/agents:/app/.opencode/agents
- ./.opencode/skills:/app/.opencode/skills
- ./logs:/app/logs
- ./data:/app/data
ports:
- "8787:8787"
# - "4096:4096"
restart: unless-stopped
+4 -16
View File
@@ -18,22 +18,10 @@ const envSchema = z.object({
LLM_REQUEST_AUDIT_LOG_PATH: z
.string()
.default("./logs/llm-request-audit.log"),
// 内部工具桥调用本服务时使用的鉴权 token未显式配置时启动阶段会自动生成
AGENT_INTERNAL_TOKEN: z.string().optional(),
// embedded opencode server 的监听地址。
OPENCODE_HOSTNAME: z.string().default("127.0.0.1"),
// embedded opencode server 的监听端口。
OPENCODE_PORT: z.coerce.number().int().positive().default(4096),
// opencode SDK 启动或连接运行时时的超时时间(毫秒)。
OPENCODE_TIMEOUT_MS: z.coerce.number().int().positive().default(5000),
// 默认使用的 opencode 模型标识。
OPENCODE_MODEL: z.string().default("deepseek/deepseek-v4-pro"),
// 外部 opencode server 的基础地址;配置后将跳过 embedded 模式。
OPENCODE_BASE_URL: z.string().optional(),
// 外部 opencode server 的访问密码(预留)。
OPENCODE_SERVER_PASSWORD: z.string().optional(),
// 外部 opencode server 的访问用户名(预留)。
OPENCODE_SERVER_USERNAME: z.string().default("opencode"),
// 外部 opencode server 回调本服务内部工具桥时使用的共享鉴权 token可暂时留空
AGENT_INTERNAL_TOKEN: z.string().default(""),
// 外部 opencode server 的基础地址。
OPENCODE_BASE_URL: z.string().url(),
// chat session 在本地注册表中的保活时长(秒)。
SESSION_TTL_SECONDS: z.coerce.number().int().positive().default(1800),
// 提供给本地 opencode tools 读取的会话上下文目录。
+4 -40
View File
@@ -1,5 +1,4 @@
import {
createOpencode,
createOpencodeClient,
type OpencodeClient,
} from "@opencode-ai/sdk/v2";
@@ -19,7 +18,6 @@ type RuntimeModelOverride = {
export class OpencodeRuntimeAdapter {
private clientPromise: Promise<OpencodeClient> | null = null;
private closeServer: (() => void) | null = null;
async ensureClient(): Promise<OpencodeClient> {
if (!this.clientPromise) {
@@ -99,53 +97,19 @@ export class OpencodeRuntimeAdapter {
}
async dispose(): Promise<void> {
this.closeServer?.();
this.closeServer = null;
this.clientPromise = null;
}
private async bootstrapClient(): Promise<OpencodeClient> {
if (config.OPENCODE_BASE_URL) {
logger.info(
{ baseUrl: config.OPENCODE_BASE_URL },
"connecting to external opencode server",
);
return createOpencodeClient({
baseUrl: config.OPENCODE_BASE_URL,
});
}
// embedded 模式下,把服务内工具桥地址注入到 opencode 进程环境里,
// 这样 .opencode/tools 下的自定义工具可以回调本服务。
process.env.TJWATER_AGENT_INTERNAL_BASE_URL = `http://127.0.0.1:${config.PORT}`;
process.env.TJWATER_AGENT_INTERNAL_TOKEN =
config.AGENT_INTERNAL_TOKEN ??
process.env.TJWATER_AGENT_INTERNAL_TOKEN ??
"";
logger.info(
{
hostname: config.OPENCODE_HOSTNAME,
port: config.OPENCODE_PORT,
model: config.OPENCODE_MODEL,
baseUrl: config.OPENCODE_BASE_URL,
},
"starting embedded opencode server",
"connecting to opencode server",
);
const runtime = await createOpencode({
hostname: config.OPENCODE_HOSTNAME,
port: config.OPENCODE_PORT,
timeout: config.OPENCODE_TIMEOUT_MS,
config: {
model: config.OPENCODE_MODEL,
},
return createOpencodeClient({
baseUrl: config.OPENCODE_BASE_URL,
});
this.closeServer = () => {
runtime.server.close();
};
return runtime.client;
}
}
+1 -6
View File
@@ -1,4 +1,3 @@
import { randomUUID } from "node:crypto";
import cors from "cors";
import express from "express";
@@ -28,10 +27,7 @@ const learningOrchestrator = new LearningOrchestrator(
);
const resultReferenceStore = new ResultReferenceStore();
const dynamicHttpExecutor = new DynamicHttpExecutor(resultReferenceStore);
const internalToken = config.AGENT_INTERNAL_TOKEN ?? randomUUID();
// 这个 token 只用于仍需服务端上下文的工具桥(dynamic_http_call / fetch_result_ref)。
process.env.TJWATER_AGENT_INTERNAL_TOKEN = internalToken;
const internalToken = config.AGENT_INTERNAL_TOKEN;
app.use(cors());
app.use(express.json({ limit: "1mb" }));
@@ -205,7 +201,6 @@ const shutdown = async () => {
logger.info("shutting down TJWaterAgent");
server.close();
resultReferenceStore.stopCleanupLoop();
// 同步关闭 embedded opencode server,避免本服务退出后留下孤儿进程。
await opencodeRuntime.dispose();
};