Files
DPM/backend/app/sim_engine.py
T
Pine 18d28be943 feat: 添加后端部署和API基本检索的Docker Compose配置
- 引入新的`docker-compose.yml`文件,便于后端和MQTT代理(EMQX)的部署。
- 更新多个组件中的API基本检索,使用函数进行动态解析。
- 加强了多个组件中API调用的错误处理和日志记录。
- 优化了AI聊天面板离线场景的回退响应。
- 更新DataScreen和MediaScreen组件中的数据显示和统计,以反映准确的指标。
- 重构MQTT连接逻辑,以支持动态凭证和客户端ID。
2026-08-18 06:50:50 +08:00

263 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""园区数据引擎(后端)—— 真实数据 + 测算演示
数据来源(用户指定口径):
· 《昆明市大学生创业园运行情况统计表(2026年7月).xls》(官方月报)
· 《昆明市创业园宣传册.pdf》
测算口径(用户确认):
· TOKEN:真实业务锚点月均 200 亿 tokens → 日均 ≈ 6.67 亿(200亿/30),
实时速率 ≈ 7,700 t/s(日均/86400s),近30日累计 = 200 亿
· 工具调用:按平均每次调用消耗约 2 万 tokens 折算(今日 ≈ 3.3 万次)
其余统计指标为真实静态值;TOKEN/工具仅做轻微演示波动
"""
import random
import threading
import time
# ---------- 真实锚点(仅来自 xls 统计表 + 附件1 省级材料 + 宣传册) ----------
REAL = {
"as_of": "2026-07",
"token_monthly_yi": 200, # 月均消耗 200 亿 tokens(AI 平台业务锚点,非政府统计口径)
"token_daily_wan": 66666.7, # 日均 6.67 亿 tokens200亿/30 ≈ 66666.7 万)
"token_rate": 7700, # 实时 t/s6.67e8 / 86400 ≈ 7,716
"tools_per_call_tokens": 150000, # 平均每次工具调用消耗 tokens(真实测算:12.5M输入 ÷ 81步 ≈ 15.4万)
"occupied": 38, # 实际入驻企业数(官方口径:《2026年7月运行情况统计表》38 家)
"capacity": 49, # 园区可容纳企业个数(统计表)
"invested": 560, # 开园以来累计投入运营资金(万元,统计表)
"jobs": 213, # 带动就业人数(统计表,当年累计口径)
"revenue_total": 252.15, # 生产经营总额(万元,统计表,当年累计口径)
"revenue_tax": 1.03, # 上缴税利总额(万元,统计表,当年累计口径)
"incubated_total": 181, # 累计孵化企业(附件1 省级绩效累计口径,截至2026年5月)
"in_incubation": 31, # 当前实有在孵创业实体(附件1
"graduated": 149, # 累计成功孵化出园企业(统计表,开园以来累计)
"patents": 171, # 入驻团队发明专利(附件1 累计口径)
"jobs_total": 1529, # 累计带动就业(附件1 省级绩效累计口径)
"revenue_total_cum": 21911.14, # 入驻团队累计经营收入(万元,附件1 累计口径 ≈ 2.19 亿元)
"revenue_tax_cum": 426.2, # 入驻团队累计税收(万元,附件1 累计口径)
"mentors": 50, # 创业指导专家团队(附件1
"success_rate": 95.91, # 近3年入孵实体孵化成功率(%)(附件1)
"area": 3000, # 园区建筑面积(㎡,统计表+宣传册)
"founded": 2009, # 成立年份(宣传册)
"province_level": 2012, # 获评省级创业园年份(宣传册)
"address": "昆明市民航路229号(人力资源中心1-2楼)",
"phone": "18087174891",
"email": "714066050@qq.com",
}
# 入驻企业名录(《入驻企业信息表》39 家全称,与在园数统一口径)
COMPANIES = [
"云南派音人工智能科技有限公司", "米勒克尔蓝宝石珠宝产业化(项目)", "中泰研学合作(项目)",
"云南宸中低空经济有限公司", "昆明智海银高文化科技有限公司", "人工智能机器人大模型训练(项目)",
"云南廷秀文旅康养服务(项目)", "瀚颖AI+教育信息咨询(项目)", "云南大学AI+联合创业服务平台(项目)",
"仰光客厅(项目)", "云南上古绝学文化发展有限公司", "千楣之路(项目)",
"中越生物医疗(项目)", "中越文旅交流(项目)", "绿态环保科技项目",
"联翼航空技术低空经济应用国际化拓展(项目)", "酷享野农AI农业(项目)", "滇缅国际设计(项目)",
"昆明舒诺生物科技有限责任公司", "达岸教育管理(云南)有限公司", "昆明滇油石化有限责任公司",
"花仙子园艺肥料(云南)有限公司", "Facebook越南市场普洱茶与建水紫陶壶跨境电商(项目)",
"研X——同行者网络(项目)", "鬼才明AI创意工作室(项目)", "朵哈·玫瑰特色产业链(项目)",
"昆明云韵体育有限责任公司", "昆明舒护安养老服务有限责任公司",
"南菌优培—食用菌专用生物制剂创新与高原特色野生菌高值化全链开发(项目)",
"五华区丽裳文化艺术工作室", "云南星瑞航空(项目)", "综合性云南直播私域服务平台",
"昆明屿澈电子商务有限公司", "中外青少年研学(项目)", "星杭商务信息咨询昆明有限责任公司",
"蓝智科技(项目)", "云品出滇·纸享万家(项目)",
"云迹轻旅—昆明本土一站式轻量化文旅服务工作室(项目)", "启元人工智能科技(项目)",
]
# 宣传册四大孵化区域
ZONES = [
{"name": "OPC创业空间", "desc": "AI 技术支撑 · 数字经济/AI应用/软件开发/文创设计/电商直播等轻资产领域", "period": "拎包入驻 · 最长2年"},
{"name": "创业苗圃区", "desc": "创意阶段 · 未注册企业团队 · 开放式共享工位", "period": "最长2年"},
{"name": "孵化加速区", "desc": "已工商注册初创企业 · 独立办公空间", "period": "基础2年 · 可延1年(≤3年)"},
{"name": "国际创客区", "desc": "归国留学生 · 外籍留学生 · 国际化配套服务", "period": "参照加速区"},
]
# 园区企业行业分布(按《入驻企业信息表》39 家企业简介分类统计)
INDUSTRY_MIX = [
{"name": "人工智能", "value": 7},
{"name": "跨境电商", "value": 5},
{"name": "教育培训", "value": 4},
{"name": "文旅康养", "value": 4},
{"name": "文化创意", "value": 4},
{"name": "生物医药", "value": 4},
{"name": "低空经济", "value": 3},
{"name": "现代农业", "value": 3},
{"name": "绿色环保", "value": 2},
{"name": "企业服务", "value": 2},
{"name": "新材料", "value": 1},
]
# 园区实时动态(真实事件:园区官方公示 + 宣传册活动 + 互联网公开信息,最新在前)
FEED = [
{"id": 24, "icon": "dna", "text": "园内企业「昆明舒诺生物科技」完成GEO服务体系建设(生成式引擎优化,聚焦宠物营养品牌数字化)", "time": "2026-08"},
{"id": 1, "icon": "activity", "text": "2026年7月运行情况统计表填报完成:累计投入运营资金560万元、带动就业213人", "time": "2026-07-31"},
{"id": 2, "icon": "radio", "text": "2026年第三期入驻创业企业(项目)评审结果在昆明市人社局官网公示", "time": "2026-07-02"},
{"id": 3, "icon": "graduation", "text": "云南师范大学就业创业实践基地落地园区 · 云南旅游职业学院开展就业创业交流", "time": "2026-06-03"},
{"id": 23, "icon": "radio", "text": "「PineSound」完成 ICP 备案(滇ICP备2026008517号)与公安备案,注册地址昆明市民航路301-307号", "time": "2026"},
{"id": 4, "icon": "rocket", "text": "\"滇水逐梦·雨林创航\"昆明·西双版纳创业路演PK赛成功举办", "time": "2026-05-20"},
{"id": 5, "icon": "flag", "text": "昆明市青年企业家协会创新创业基地在园区揭牌", "time": "2026-05-13"},
{"id": 6, "icon": "users", "text": "\"聚力赋能·共创未来\"高校创新创业交流暨项目路演活动圆满举行", "time": "2026-05-08"},
{"id": 7, "icon": "trophy", "text": "\"创赢未来\"2026创业大赛昆明选拔赛暨马兰花创业培训讲师大赛举行(13个项目参赛)", "time": "2026-04-22"},
{"id": 8, "icon": "broadcast", "text": "2026年第二期创业企业(项目)入驻招募公告发布(官网 www.kmyc.gov.cn", "time": "2026-04-15"},
{"id": 21, "icon": "sparkles", "text": "「PineSound」AI驱动音频管理平台上线 pinesound.cn:智能配乐与音效生成,集成100W+音效库、50W+配乐库,全球版权授权(官网)", "time": "2026"},
{"id": 22, "icon": "medal", "text": "「PineSound」发布企业标准 Q/YNPY 001-2026《数字内容创作 配乐通用分类标准》", "time": "2026"},
{"id": 9, "icon": "award", "text": "2026年第一期入驻评审结果在昆明市人社局官网公示(23个优质项目正式入驻)", "time": "2026-03-27"},
{"id": 10, "icon": "users", "text": "2026年第一期招募集中评审完成:38个申请,23个优质项目正式入驻", "time": "2026-03-24"},
{"id": 19, "icon": "sparkles", "text": "园内企业「云南派音人工智能科技(PineSound)」专注多模态音频技术研发:自研Pine系列模型覆盖音频识别、向量嵌入、音效生成、配乐创作", "time": "2026-04"},
{"id": 20, "icon": "bolt", "text": "「PineSound」2026年4月注册成立,获北京投资支持并吸纳就业4人,入驻加速区(入驻企业信息表)", "time": "2026-04"},
{"id": 11, "icon": "cpu", "text": "云南首个人工智能OPC创新人才基地落地昆明,填补省内个体AI创业培育空白(公开报道)", "time": "2026-03-23"},
{"id": 12, "icon": "medal", "text": "第九届\"春城创业荟\"创业创新大赛圆满闭幕,获奖项目名单公布", "time": "2025-09-30"},
{"id": 13, "icon": "trophy", "text": "\"春城创业荟\"初赛落幕,147个项目晋级复赛", "time": "2025-04-28"},
{"id": 14, "icon": "building", "text": "园内企业「花仙子园艺肥料(云南)」成立,注册资本118万元(公开报道)", "time": "2025-04-28"},
{"id": 15, "icon": "radio", "text": "2025年入园项目评审结果公示(昆明市人社局官网)", "time": "2025-04-22"},
{"id": 16, "icon": "atom", "text": "研X平台入选\"创客中国\"项目库(一站式研究生学术成长平台)", "time": "2025-01"},
{"id": 17, "icon": "leaf", "text": "行业动态:园内「朵哈·玫瑰」原料产地昆明八街食用玫瑰行情上涨,玫瑰经济走强", "time": "2025-01"},
{"id": 18, "icon": "heart", "text": "行业动态:「千楣之路」主营檀娜卡——泰国天然护肤品牌Thanaka正式进入中国市场", "time": "2025-01"},
]
def _day_secs():
"""当日零点起已过秒数(时钟驱动,保证数值单向持续增长、重启连续)"""
now = time.time()
lt = time.localtime(now)
day_start = time.mktime((lt.tm_year, lt.tm_mon, lt.tm_mday, 0, 0, 0, 0, 0, -1))
return max(0.0, now - day_start)
def _today_values(prev_noise=None):
"""按真实速率推算当日累计值(单向增长 + 工具调用波动):
平台实时速率 = 单会话 157 tok/s × 49 路并发 ≈ 7,700 t/s
今日 TOKEN(万)= 秒数 × 7,700 / 10000 = 秒数 × 0.77
今日工具调用 = 今日 TOKEN / 15万 tokens 每次(真实基线)
+ 随机游走噪声(±10,波浪式波动,不单调)
"""
secs = _day_secs()
today_wan = round(secs * 0.77) # 万 tokens
base_tools = secs * 0.77 * 10000 / REAL["tools_per_call_tokens"] # 真实基线(浮点)
if prev_noise is None:
noise = 0.0
else:
noise = max(-10.0, min(10.0, prev_noise + (random.random() - 0.5) * 6.0))
today_tools = max(0, round(base_tools + noise)) # 次
return today_wan, today_tools, noise
def _make_series(base, noise, n=30):
"""生成围绕日均锚点的演示曲线(单位:万 tokens),尾点=今日实时值"""
out = []
for _ in range(n - 1):
v = base + (random.random() - 0.5) * noise
out.append(round(max(1, v), 1))
out.append(round(base, 1))
return out
def _live_values(prev=None):
"""TOKEN 面板实时运行指标(围绕真实基准动态波动,会话持续推进)"""
r = random.random
steps = (prev or {}).get("steps", 81)
steps += 1 if r() < 0.3 else 0
return {
"firstToken": round(1.3 + (r() - 0.5) * 0.2, 2), # 首 token 平均 1.3s 基准 ±0.1
"throughput": round(157 + (r() - 0.5) * 14), # 吞吐 157 tok/s 基准 ±7
"cacheHit": round(98 + (r() - 0.5) * 1.2, 1), # 缓存命中 98% 基准 ±0.6
"inputM": round((prev or {}).get("inputM", 12.5) + 0.004 + r() * 0.008, 2), # 会话输入持续推进
"outputM": round((prev or {}).get("outputM", 2.0) + 0.001 + r() * 0.002, 2), # 会话输出持续推进
"rounds": max(2, steps // 40), # 每 40 步一轮
"steps": steps, # 步数持续增长
}
def init_snapshot():
today_wan, today_tools, noise = _today_values()
return {
"as_of": REAL["as_of"],
"_toolsNoise": noise,
"live": _live_values(),
"token": {
"today": today_wan, # 万 tokens(当日累计,实时增长)
"total": REAL["token_monthly_yi"] * 10000 + today_wan, # 万 tokens(近30日 = 200亿 + 今日增量)
"rate": REAL["token_rate"], # t/s157 tok/s × 49 并发 ≈ 7,700
"series": _make_series(REAL["token_daily_wan"], REAL["token_daily_wan"] * 0.16),
},
"tools": {
"today": today_tools, # 次(随 TOKEN 实时联动)
"total": round(REAL["token_monthly_yi"] * 100000000 / REAL["tools_per_call_tokens"]) + today_tools, # 次
"success": 98.5, # 成功率(演示)
"nodes": 12, # AI 服务节点(演示)
},
"projects": {
"inPark": REAL["occupied"], # 实际入驻 38 家(2026年7月统计表官方口径)
"capacity": REAL["capacity"], # 可容纳 49 个
"invested": REAL["invested"], # 累计投入 560 万元
},
"jobs": {"total": REAL["jobs"]}, # 带动就业 213 人(当年累计口径)
"revenue": {"total": REAL["revenue_total"], "tax": REAL["revenue_tax"]}, # 万元(当年累计口径)
"cumulative": { # 省级绩效累计口径(附件1,截至2026年5月)
"incubated": REAL["incubated_total"], # 累计孵化企业 181 家
"inIncubation": REAL["in_incubation"], # 当前实有在孵 31 家
"graduated": REAL["graduated"], # 累计成功出园 149 家
"patents": REAL["patents"], # 发明专利 171 项
"jobs": REAL["jobs_total"], # 累计带动就业 1,529 人
"revenue": REAL["revenue_total_cum"], # 累计经营收入 21,911.14 万元
"tax": REAL["revenue_tax_cum"], # 累计税收 426.2 万元
"mentors": REAL["mentors"], # 创业指导专家团队 50 人
"successRate": REAL["success_rate"], # 近3年孵化成功率 95.91%
},
"park": {
"area": REAL["area"],
"founded": REAL["founded"],
"provinceLevel": REAL["province_level"],
"address": REAL["address"],
"phone": REAL["phone"],
"email": REAL["email"],
},
"zones": ZONES,
"companies": COMPANIES,
"industryMix": INDUSTRY_MIX,
"feed": FEED,
}
def next_snapshot(s):
"""时钟驱动:按真实速率重算当日累计(TOKEN 单向增长,工具调用波浪波动),其余真实静态"""
today_wan, today_tools, noise = _today_values(s.get("_toolsNoise"))
token = {
"today": today_wan,
"total": REAL["token_monthly_yi"] * 10000 + today_wan,
"rate": REAL["token_rate"],
"series": s["token"]["series"][:-1] + [today_wan],
}
tools = {
"today": today_tools,
"total": round(REAL["token_monthly_yi"] * 100000000 / REAL["tools_per_call_tokens"]) + today_tools,
"success": 98.5,
"nodes": 12,
}
return {
**s,
"_toolsNoise": noise,
"live": _live_values(s.get("live")),
"token": token,
"tools": tools,
}
class SimEngine:
"""带锁的快照引擎:单例供 API 与 MQTT tick 共用"""
def __init__(self):
self._lock = threading.RLock()
self._snap = init_snapshot()
def snapshot(self):
with self._lock:
return dict(self._snap)
def tick(self):
with self._lock:
self._snap = next_snapshot(self._snap)
return dict(self._snap)
sim_engine = SimEngine()