Files
KiloStar/main.py
T
zhaoxi 457d12834f feat(standalone): 新增单机模式,KILOSTAR_MODE=standalone 时去掉 Ray 依赖
通过 StandaloneProxy 适配层让 .remote() 调用在单机模式下透明降级为
asyncio 协程调用,7 个 Actor 和 workflow task 均可在纯 asyncio 环境运行,
启动快、资源占用低。分布式模式行为完全不变。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-03 15:52:41 +00:00

172 lines
5.8 KiB
Python

import os
import secrets
import sys
_INSECURE_SECRETS = {"secret", "114514", "changethiskey12345"}
_secret_key = os.getenv("SECRET_KEY")
_is_dev = os.getenv("KILOSTAR_ENV", "production").lower() in ("dev", "development")
if not _secret_key or _secret_key in _INSECURE_SECRETS:
if _is_dev:
_secret_key = secrets.token_urlsafe(32)
os.environ["SECRET_KEY"] = _secret_key
print(
"⚠️ [开发模式] 未提供有效的 SECRET_KEY,已生成临时随机密钥(重启后失效)。"
)
else:
print(
"❌ [致命错误] 未提供有效的 SECRET_KEY 或使用了不安全的默认值。\n"
" 请设置环境变量 SECRET_KEY 为一个高熵的随机字符串。\n"
" 可使用: python -c \"import secrets; print(secrets.token_urlsafe(32))\"\n"
" 若为开发环境,请设置 KILOSTAR_ENV=dev 以允许自动生成临时密钥。"
)
sys.exit(1)
from kilostar.utils.config_loader import get_app_config
try:
_app_cfg = get_app_config()
except Exception as e:
print(f"❌ [致命错误] 配置文件校验失败:{e}")
sys.exit(1)
import asyncio
KILOSTAR_MODE = os.environ.get("KILOSTAR_MODE", "distributed")
from kilostar.worker_cluster import WorkerCluster
from kilostar.utils.banner import print_banner
from kilostar.core.postgres_database import PostgresDatabase
from kilostar.core.global_state_machine import GlobalStateMachine
from kilostar.core.global_workflow_manager import GlobalWorkflowManager
from kilostar.core.individual.regulatory_node import RegulatoryNode
from kilostar.core.individual.consciousness_node import ConsciousnessNode
from kilostar.core.individual.control_node import ControlNode
if KILOSTAR_MODE != "standalone":
import ray
from ray import serve
from kilostar.api import KiloStarGateway
async def start_standalone():
"""单机模式:纯 asyncio,不依赖 Ray。"""
import uvicorn
from kilostar.utils.ray_hook import register_standalone
from kilostar.api import app
postgres_database = PostgresDatabase()
await postgres_database.init_db()
register_standalone("postgres_database", postgres_database)
global_state_machine = GlobalStateMachine(postgres_database)
await global_state_machine.init_state_machine()
register_standalone("global_state_machine", global_state_machine)
global_workflow_manager = GlobalWorkflowManager()
await global_workflow_manager.init_manager()
register_standalone("global_workflow_manager", global_workflow_manager)
regulatory_node = RegulatoryNode()
register_standalone("regulatory_node", regulatory_node)
consciousness_node = ConsciousnessNode()
register_standalone("consciousness_node", consciousness_node)
control_node = ControlNode()
register_standalone("control_node", control_node)
worker_cluster = WorkerCluster()
await worker_cluster.start()
register_standalone("worker_cluster", worker_cluster)
print(f"✅ KiloStar 单机模式启动完成,监听 0.0.0.0:8000")
config = uvicorn.Config(app, host="0.0.0.0", port=8000, log_level="info")
server = uvicorn.Server(config)
await server.serve()
async def start_distributed():
"""分布式模式:使用 Ray Actor + Ray Serve。"""
env_vars = {
"POSTGRES_USER": os.getenv("POSTGRES_USER", "postgres"),
"POSTGRES_PASSWORD": os.getenv("POSTGRES_PASSWORD", ""),
"POSTGRES_HOST": os.getenv("POSTGRES_HOST", "db"),
"POSTGRES_PORT": os.getenv("POSTGRES_PORT", "5432"),
"POSTGRES_DB": os.getenv("POSTGRES_DB", "postgres"),
"SECRET_KEY": os.getenv("SECRET_KEY"),
}
ray.init(
ignore_reinit_error=True,
namespace="kilostar",
dashboard_host="0.0.0.0",
dashboard_port=8265,
runtime_env={"env_vars": env_vars},
)
postgres_database = PostgresDatabase.options(
name="postgres_database"
).remote()
await postgres_database.init_db.remote()
global_state_machine = GlobalStateMachine.options(
name="global_state_machine", namespace="kilostar", lifetime="detached"
).remote(postgres_database)
print("正在等待 GlobalStateMachine 初始化并加载注册表...")
try:
await global_state_machine.init_state_machine.remote()
print("GlobalStateMachine 初始化成功!")
except Exception as e:
print(f"\n[致命错误] GlobalStateMachine 启动失败!\n{e}\n")
return
global_workflow_manager = GlobalWorkflowManager.options(
name="global_workflow_manager", namespace="kilostar", lifetime="detached"
).remote()
RegulatoryNode.options(name="regulatory_node").remote()
ConsciousnessNode.options(name="consciousness_node").remote()
ControlNode.options(name="control_node").remote()
try:
WorkerCluster.options(
name="worker_cluster", lifetime="detached"
).remote()
print("✅ WorkerCluster 已成功启动并注册!")
except ValueError:
print("WorkerCluster 已经存在。")
print("正在等待 GlobalWorkflowManager 初始化与恢复工作流...")
try:
await global_workflow_manager.init_manager.remote()
print("GlobalWorkflowManager 初始化成功!")
except Exception as e:
print(f"\n[致命错误] GlobalWorkflowManager 启动失败!\n{e}\n")
return
serve.start(http_options={"host": "0.0.0.0", "port": 8000})
serve.run(KiloStarGateway.bind())
while True:
await asyncio.sleep(3600)
def main():
print_banner()
mode = KILOSTAR_MODE
print(f"启动模式: {mode}")
try:
if mode == "standalone":
asyncio.run(start_standalone())
else:
asyncio.run(start_distributed())
except KeyboardInterrupt:
print("系统已退出。")
if __name__ == "__main__":
main()