()
| 120 | |
| 121 | |
| 122 | def main(): |
| 123 | cfg = {} |
| 124 | try: |
| 125 | cfg = json.loads(OPENCLAW_CFG.read_text(encoding='utf-8')) |
| 126 | except Exception as e: |
| 127 | log.warning(f'cannot read openclaw.json: {e}') |
| 128 | return |
| 129 | |
| 130 | agents_cfg = cfg.get('agents', {}) |
| 131 | default_model = normalize_model(agents_cfg.get('defaults', {}).get('model', {}), 'unknown') |
| 132 | agents_list = agents_cfg.get('list', []) |
| 133 | merged_models = _collect_openclaw_models(cfg) |
| 134 | |
| 135 | result = [] |
| 136 | seen_ids = set() |
| 137 | for ag in agents_list: |
| 138 | ag_id = ag.get('id', '') |
| 139 | if ag_id not in ID_LABEL: |
| 140 | continue |
| 141 | meta = ID_LABEL[ag_id] |
| 142 | workspace = ag.get('workspace', str(OPENCLAW_HOME / f'workspace-{ag_id}')) |
| 143 | if 'allowAgents' in ag: |
| 144 | allow_agents = ag.get('allowAgents', []) or [] |
| 145 | else: |
| 146 | allow_agents = ag.get('subagents', {}).get('allowAgents', []) |
| 147 | result.append({ |
| 148 | 'id': ag_id, |
| 149 | 'label': meta['label'], 'role': meta['role'], 'duty': meta['duty'], 'emoji': meta['emoji'], |
| 150 | 'model': normalize_model(ag.get('model', default_model), default_model), |
| 151 | 'defaultModel': default_model, |
| 152 | 'workspace': workspace, |
| 153 | 'skills': get_skills(workspace), |
| 154 | 'allowAgents': allow_agents, |
| 155 | }) |
| 156 | seen_ids.add(ag_id) |
| 157 | |
| 158 | # 补充不在 openclaw.json agents list 中的 agent(兼容旧版 main) |
| 159 | EXTRA_AGENTS = { |
| 160 | 'taizi': {'model': default_model, 'workspace': str(OPENCLAW_HOME / 'workspace-taizi'), |
| 161 | 'allowAgents': ['zhongshu']}, |
| 162 | 'main': {'model': default_model, 'workspace': str(OPENCLAW_HOME / 'workspace-main'), |
| 163 | 'allowAgents': ['zhongshu','menxia','shangshu','hubu','libu','bingbu','xingbu','gongbu','libu_hr']}, |
| 164 | 'zaochao': {'model': default_model, 'workspace': str(OPENCLAW_HOME / 'workspace-zaochao'), |
| 165 | 'allowAgents': []}, |
| 166 | 'libu_hr': {'model': default_model, 'workspace': str(OPENCLAW_HOME / 'workspace-libu_hr'), |
| 167 | 'allowAgents': ['shangshu']}, |
| 168 | } |
| 169 | for ag_id, extra in EXTRA_AGENTS.items(): |
| 170 | if ag_id in seen_ids or ag_id not in ID_LABEL: |
| 171 | continue |
| 172 | meta = ID_LABEL[ag_id] |
| 173 | result.append({ |
| 174 | 'id': ag_id, |
| 175 | 'label': meta['label'], 'role': meta['role'], 'duty': meta['duty'], 'emoji': meta['emoji'], |
| 176 | 'model': extra['model'], |
| 177 | 'defaultModel': default_model, |
| 178 | 'workspace': extra['workspace'], |
| 179 | 'skills': get_skills(extra['workspace']), |
no test coverage detected