diff --git a/config.yaml b/config.yaml index fde32118..10213015 100644 --- a/config.yaml +++ b/config.yaml @@ -1,7 +1,7 @@ model: - default: nvidia/nemotron-3-super-120b-a12b - api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP - base_url: http://127.0.0.1:3000/v1 + default: deepseek-v4-flash + api_key_env: DEEPSEEK_API_KEY + base_url: https://api.deepseek.com providers: newapi-local: api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP @@ -16,7 +16,7 @@ providers: rate_limit: 1000 timeout: 30 deepseek: - api_key: sk-b1212066094d4e319784f23d5b2c6bbd + key_env: DEEPSEEK_API_KEY base_url: https://api.deepseek.com cost_factor: 0.0 default_model: deepseek-v4-flash diff --git a/config.yaml.corrupt.20260801-013340.bak b/config.yaml.corrupt.20260801-013340.bak new file mode 100644 index 00000000..3a9bf194 --- /dev/null +++ b/config.yaml.corrupt.20260801-013340.bak @@ -0,0 +1,612 @@ +model: + default: deepseek-v4-flash +<<<<<<< HEAD + api_key: sk-b12...6bbd +======= + api_key: sk-b1212066094d4e319784f23d5b2c6bbd +>>>>>>> 6bbfdba (fix(model-health.py v3): 排名驱动自动替换 + 探针3次平均 + 修复致命缺陷) + base_url: https://api.deepseek.com +providers: + newapi-local: + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + base_url: http://127.0.0.1:3000/v1 + cost_factor: 0.0 + default_model: nvidia/nemotron-3-super-120b-a12b + models: + - nvidia/nemotron-3-super-120b-a12b + - openai/gpt-oss-120b + - mistralai/mistral-nemotron + - nvidia/nvidia-nemotron-nano-9b-v2 + - nvidia/llama-3.3-nemotron-super-49b-v1.5 + rate_limit: 1000 + timeout: 30 + deepseek: + api_key: sk-b1212066094d4e319784f23d5b2c6bbd + base_url: https://api.deepseek.com + cost_factor: 0.0 + default_model: deepseek-v4-flash + models: + - deepseek-v4-flash + - deepseek-v4-pro + rate_limit: 1000 + timeout: 30 +fallback_providers: '[]' +toolsets: + - hermes-cli + - web +agent: + max_turns: 90 + gateway_timeout: 1800 + restart_drain_timeout: 180 + api_max_retries: 2 + service_tier: '' + tool_use_enforcement: auto + task_completion_guidance: true + environment_probe: true + environment_hint: '' + gateway_timeout_warning: 900 + clarify_timeout: 600 + gateway_notify_interval: 180 + gateway_auto_continue_freshness: 3600 + image_input_mode: auto + disabled_toolsets: [] +terminal: + backend: local + modal_mode: auto + cwd: . + timeout: 180 + env_passthrough: [] + shell_init_files: [] + auto_source_bashrc: true + docker_image: nikolaik/python-nodejs:python3.11-nodejs20 + docker_forward_env: [] + singularity_image: docker://nikolaik/python-nodejs:python3.11-nodejs20 + modal_image: nikolaik/python-nodejs:python3.11-nodejs20 + daytona_image: nikolaik/python-nodejs:python3.11-nodejs20 + container_cpu: 1 + container_memory: 5120 + container_disk: 51200 + container_persistent: true + docker_volumes: [] + docker_mount_cwd_to_workspace: false + docker_extra_args: [] + docker_run_as_host_user: false + persistent_shell: true + vercel_runtime: node24 +web: + backend: '' + search_backend: '' + extract_backend: '' +browser: + inactivity_timeout: 120 + command_timeout: 30 + record_sessions: false + allow_private_urls: false + engine: auto + auto_local_for_private_urls: true + cdp_url: '' + dialog_policy: must_respond + dialog_timeout_s: 300 + camofox: + managed_persistence: false + user_id: '' + session_key: '' + adopt_existing_tab: false + rewrite_loopback_urls: false + loopback_host_alias: host.docker.internal + cloud_provider: local + use_gateway: false +checkpoints: + enabled: true + max_snapshots: 50 + max_total_size_mb: 500 + max_file_size_mb: 10 + auto_prune: false + retention_days: 7 + delete_orphans: true + min_interval_hours: 24 +file_read_max_chars: 100000 +tool_output: + max_bytes: 50000 + max_lines: 2000 + max_line_length: 2000 +tool_loop_guardrails: + warnings_enabled: true + hard_stop_enabled: false + warn_after: + exact_failure: 2 + same_tool_failure: 3 + idempotent_no_progress: 2 + hard_stop_after: + exact_failure: 5 + same_tool_failure: 8 + idempotent_no_progress: 5 +compression: + enabled: true + threshold: 0.5 + target_ratio: 0.2 + protect_last_n: 20 + hygiene_hard_message_limit: 400 + protect_first_n: 3 + abort_on_summary_failure: false +kanban: + dispatch_in_gateway: true + dispatch_interval_seconds: 60 + failure_limit: 2 + worker_log_rotate_bytes: 2097152 + worker_log_backup_count: 1 + orchestrator_profile: '' + default_assignee: '' + auto_decompose: true + auto_decompose_per_tick: 3 + dispatch_stale_timeout_seconds: 14400 +prompt_caching: + cache_ttl: 5m + long_lived_prefix: true + long_lived_ttl: 1h +openrouter: + response_cache: true + response_cache_ttl: 300 + min_coding_score: 0.65 +bedrock: + region: '' + discovery: + enabled: true + provider_filter: [] + refresh_interval: 3600 + guardrail: + guardrail_identifier: '' + guardrail_version: '' + stream_processing_mode: async + trace: disabled +auxiliary: + vision: + provider: newapi-local + model: meta/llama-3.2-11b-vision-instruct + base_url: http://127.0.0.1:3000/v1 + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + timeout: 120 + download_timeout: 30 + web_extract: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 360 + compression: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 120 + skills_hub: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + approval: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + mcp: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + title_generation: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + triage_specifier: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 120 + kanban_decomposer: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 180 + profile_describer: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 60 + curator: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 600 + session_search: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + extra_body: {} + max_concurrency: 3 +display: + compact: false + personality: kawaii + resume_display: full + resume_exchanges: 10 + resume_max_user_chars: 300 + resume_max_assistant_chars: 200 + resume_max_assistant_lines: 3 + resume_skip_tool_only: true + busy_input_mode: interrupt + tui_auto_resume_recent: false + bell_on_complete: false + show_reasoning: false + streaming: false + timestamps: false + final_response_markdown: strip + persistent_output: true + persistent_output_max_lines: 200 + inline_diffs: true + file_mutation_verifier: true + show_cost: false + skin: default + language: en + tui_status_indicator: kaomoji + user_message_preview: + first_lines: 2 + last_lines: 2 + interim_assistant_messages: true + tool_progress_command: false + tool_preview_length: 0 + ephemeral_system_ttl: 0 + runtime_footer: + fields: + - model + - context_pct + - cwd + copy_shortcut: auto + tool_progress: all + tool_progress_style: accumulate +dashboard: + theme: default + show_token_analytics: false + oauth: + client_id: '' + portal_url: '' + public_url: '' +privacy: + redact_pii: false +tts: + provider: edge + edge: + voice: zh-CN-XiaoxiaoNeural + elevenlabs: + voice_id: pNInz6obpgDQGcFmaJgB + model_id: eleven_multilingual_v2 + openai: + model: gpt-4o-mini-tts + voice: alloy + xai: + voice_id: eve + language: en + sample_rate: 24000 + bit_rate: 128000 + mistral: + model: voxtral-mini-tts-2603 + voice_id: c69964a6-ab8b-4f8a-9465-ec0925096ec8 + neutts: + ref_audio: '' + ref_text: '' + model: neuphonic/neutts-air-q4-gguf + device: cpu + piper: + voice: en_US-lessac-medium + use_gateway: false +stt: + enabled: true + provider: local + local: + model: base + language: '' + openai: + model: whisper-1 + mistral: + model: voxtral-mini-latest +voice: + record_key: ctrl+b + max_recording_seconds: 120 + auto_tts: true + beep_enabled: true + silence_threshold: 200 + silence_duration: 3.0 +human_delay: + mode: 'off' + min_ms: 800 + max_ms: 2500 +context: + engine: compressor +memory: + memory_enabled: true + user_profile_enabled: true + memory_char_limit: 2200 + user_char_limit: 1375 + provider: zhiyi +delegation: + model: nvidia/nemotron-3-super-120b-a12b + provider: newapi-local + base_url: '' + api_key: '' + api_mode: '' + inherit_mcp_toolsets: true + max_iterations: 50 + child_timeout_seconds: 600 + reasoning_effort: '' + max_concurrent_children: 3 + max_spawn_depth: 1 + orchestrator_enabled: true + subagent_auto_approve: false +prefill_messages_file: '' +goals: + max_turns: 20 +moa: + default_preset: expert-panel + save_traces: false + presets: + expert-panel: + reference_models: + - provider: newapi-local + model: openai/gpt-oss-120b + - provider: newapi-local + model: nvidia/llama-3.3-nemotron-super-49b-v1 + - provider: newapi-local + model: mistralai/mistral-large-3-675b-instruct-2512 + aggregator: + provider: newapi-local + model: openai/gpt-oss-120b + fanout: user_turn + reference_max_tokens: 800 + enabled: true +skills: + external_dirs: [] + template_vars: true + inline_shell: false + inline_shell_timeout: 10 + guard_agent_created: false +curator: + enabled: true + interval_hours: 168 + min_idle_hours: 2 + stale_after_days: 30 + archive_after_days: 90 + backup: + enabled: true + keep: 5 +timezone: '' +slack: + require_mention: true + free_response_channels: '' + allowed_channels: '' +discord: + require_mention: true + free_response_channels: '' + allowed_channels: '' + auto_thread: true + thread_require_mention: false + history_backfill: true + history_backfill_limit: 50 + reactions: true + dm_role_auth_guild: '' + server_actions: '' + allow_any_attachment: false + max_attachment_bytes: 33554432 +telegram: + reactions: false + allowed_chats: '' +mattermost: + require_mention: true + free_response_channels: '' + allowed_channels: '' +matrix: + require_mention: true + free_response_rooms: '' + allowed_rooms: '' +approvals: + mode: manual + timeout: 60 + cron_mode: deny + mcp_reload_confirm: true + destructive_slash_confirm: false +command_allowlist: + - pipe remote content to shell + - script execution via heredoc + - copy/move file into /etc/ + - find -delete + - recursive delete + - hermes update (restarts gateway, kills running agents) + - shell command via -c/-lc flag + - force kill processes (killall -KILL) + - script execution via -e/-c flag + - overwrite system file via tee + - copy/move file into sensitive credential/SSH/shell-rc path + - kill hermes/gateway process (self-termination) + - delete in root path + - git force push short flag (rewrites remote history) + - sudo with combined-flag privilege escalation + - overwrite system file via redirection + - start gateway outside systemd (use 'systemctl --user restart hermes-gateway') + - disk copy + - overwrite system config + - overwrite project env/config via redirection + - kill process via pgrep expansion (self-termination) + - SQL TRUNCATE + - in-place edit of system config + - world/other-writable permissions + - stop/restart hermes gateway (kills running agents) + - sudo with privilege flag (stdin/askpass/shell/list) + - copy/move file into system config path + - force kill processes + - git force push (rewrites remote history) + - stop/restart system service + - in-place edit of Hermes config/env +hooks_auto_accept: false +security: + allow_private_urls: false + redact_secrets: true + tirith_enabled: true + tirith_path: tirith + tirith_timeout: 5 + tirith_fail_open: true + website_blocklist: + enabled: false + domains: [] + shared_files: [] + acked_advisories: [] + allow_lazy_installs: true +cron: + provider: auto + wrap_response: true + gateway_required: true + default_deliver: origin,feishu:oc_81f6df701c872a1122f32080e366543f +code_execution: + mode: project +tools: + tool_search: + enabled: auto + threshold_pct: 10 + search_default_limit: 5 + max_search_limit: 20 +logging: + level: INFO + max_size_mb: 5 + backup_count: 3 + memory_monitor: + enabled: true + interval_seconds: 300 +model_catalog: + enabled: true + url: https://hermes-agent.nousresearch.com/docs/api/model-catalog.json + ttl_hours: 24 +network: + force_ipv4: false +gateway: + strict: false + media_delivery_allow_dirs: [] + trust_recent_files: true + trust_recent_files_seconds: 600 + multiplex_profiles: false +sessions: + auto_prune: false + retention_days: 90 + vacuum_after_prune: true + min_interval_hours: 24 + write_json_snapshots: false +onboarding: + seen: + busy_input_prompt: true + openclaw_residue_cleanup: true + tool_progress_prompt: true +updates: + pre_update_backup: false + backup_keep: 5 +lsp: + enabled: true + wait_mode: document + wait_timeout: 5.0 + install_strategy: auto +x_search: + model: grok-4.20-reasoning + timeout_seconds: 180 + retries: 2 +secrets: + bitwarden: + enabled: false + access_token_env: BWS_ACCESS_TOKEN + project_id: '' + cache_ttl_seconds: 300 + override_existing: true + auto_install: true + server_url: '' +paste_collapse_threshold: 5 +paste_collapse_threshold_fallback: 5 +paste_collapse_char_threshold: 2000 +_config_version: 24 +mcp_servers: + codegraph: + args: + - serve + - --mcp + command: codegraph + connect_timeout: 60 + enabled: true + timeout: 120 + github: + args: + - -y + - '@modelcontextprotocol/server-github' + command: npx + enabled: true + env: + GITHUB_PERSONAL_ACCESS_TOKEN: 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 + timeout: 60 + openclaw: + command: openclaw + args: + - mcp + - serve + connect_timeout: 60 + timeout: 300 + codebase-memory-mcp: + command: /home/muc/.local/bin/codebase-memory-mcp + enabled: true +platform_toolsets: + cli: + - browser + - clarify + - code_execution + - computer_use + - cronjob + - delegation + - file + - image_gen + - mcp-codegraph + - memory + - messaging + - session_search + - skills + - terminal + - todo + - tts + - vision + - web +platforms: + webhook: + enabled: true + extra: + host: 0.0.0.0 + port: 8644 + feishu: + enabled: true + app_id: cli_a95d7ff06b789bb4 + app_secret: Gm7eo0aD9Luka8mHxApRufYIDwmpGsGf +plugins: + disabled: [] + enabled: + - agentic-sms-gateway + - cronalytics + - rtk-rewrite +weixin: + enabled: true + extra: + dm_policy: open + group_policy: open +session_reset: {} +known_plugin_toolsets: + cli: + - spotify diff --git a/config.yaml.corrupt.20260801-013513.bak b/config.yaml.corrupt.20260801-013513.bak new file mode 100644 index 00000000..5980e45b --- /dev/null +++ b/config.yaml.corrupt.20260801-013513.bak @@ -0,0 +1,620 @@ +model: +<<<<<<< HEAD + default: nvidia/nemotron-3-super-120b-a12b + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + base_url: http://127.0.0.1:3000/v1 +======= + default: deepseek/deepseek-v4-flash + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + base_url: https://api.deepseek.com/v1 +>>>>>>> 9d4d969 (auto-snapshot 2026-07-31 03:00:25) +providers: + newapi-local: + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + base_url: http://127.0.0.1:3000/v1 + cost_factor: 0.0 + default_model: nvidia/nemotron-3-super-120b-a12b + models: + - nvidia/nemotron-3-super-120b-a12b + - openai/gpt-oss-120b +<<<<<<< HEAD + - mistralai/mistral-nemotron +======= + - nvidia/nvidia-nemotron-nano-9b-v2 +>>>>>>> 9d4d969 (auto-snapshot 2026-07-31 03:00:25) + - nvidia/llama-3.3-nemotron-super-49b-v1.5 + rate_limit: 1000 + timeout: 30 + deepseek: + api_key: sk-b1212066094d4e319784f23d5b2c6bbd + base_url: https://api.deepseek.com + cost_factor: 0.0 + default_model: deepseek-v4-flash + models: + - deepseek-v4-flash + - deepseek-v4-pro + rate_limit: 1000 + timeout: 30 +fallback_providers: '[]' +toolsets: + - hermes-cli + - web +agent: + max_turns: 90 + gateway_timeout: 1800 + restart_drain_timeout: 180 + api_max_retries: 2 + service_tier: '' + tool_use_enforcement: auto + task_completion_guidance: true + environment_probe: true + environment_hint: '' + gateway_timeout_warning: 900 + clarify_timeout: 600 + gateway_notify_interval: 180 + gateway_auto_continue_freshness: 3600 + image_input_mode: auto + disabled_toolsets: [] +terminal: + backend: local + modal_mode: auto + cwd: . + timeout: 180 + env_passthrough: [] + shell_init_files: [] + auto_source_bashrc: true + docker_image: nikolaik/python-nodejs:python3.11-nodejs20 + docker_forward_env: [] + singularity_image: docker://nikolaik/python-nodejs:python3.11-nodejs20 + modal_image: nikolaik/python-nodejs:python3.11-nodejs20 + daytona_image: nikolaik/python-nodejs:python3.11-nodejs20 + container_cpu: 1 + container_memory: 5120 + container_disk: 51200 + container_persistent: true + docker_volumes: [] + docker_mount_cwd_to_workspace: false + docker_extra_args: [] + docker_run_as_host_user: false + persistent_shell: true + vercel_runtime: node24 +web: + backend: '' + search_backend: '' + extract_backend: '' +browser: + inactivity_timeout: 120 + command_timeout: 30 + record_sessions: false + allow_private_urls: false + engine: auto + auto_local_for_private_urls: true + cdp_url: '' + dialog_policy: must_respond + dialog_timeout_s: 300 + camofox: + managed_persistence: false + user_id: '' + session_key: '' + adopt_existing_tab: false + rewrite_loopback_urls: false + loopback_host_alias: host.docker.internal + cloud_provider: local + use_gateway: false +checkpoints: + enabled: true + max_snapshots: 50 + max_total_size_mb: 500 + max_file_size_mb: 10 + auto_prune: false + retention_days: 7 + delete_orphans: true + min_interval_hours: 24 +file_read_max_chars: 100000 +tool_output: + max_bytes: 50000 + max_lines: 2000 + max_line_length: 2000 +tool_loop_guardrails: + warnings_enabled: true + hard_stop_enabled: false + warn_after: + exact_failure: 2 + same_tool_failure: 3 + idempotent_no_progress: 2 + hard_stop_after: + exact_failure: 5 + same_tool_failure: 8 + idempotent_no_progress: 5 +compression: + enabled: true + threshold: 0.5 + target_ratio: 0.2 + protect_last_n: 20 + hygiene_hard_message_limit: 400 + protect_first_n: 3 + abort_on_summary_failure: false +kanban: + dispatch_in_gateway: true + dispatch_interval_seconds: 60 + failure_limit: 2 + worker_log_rotate_bytes: 2097152 + worker_log_backup_count: 1 + orchestrator_profile: '' + default_assignee: '' + auto_decompose: true + auto_decompose_per_tick: 3 + dispatch_stale_timeout_seconds: 14400 +prompt_caching: + cache_ttl: 5m + long_lived_prefix: true + long_lived_ttl: 1h +openrouter: + response_cache: true + response_cache_ttl: 300 + min_coding_score: 0.65 +bedrock: + region: '' + discovery: + enabled: true + provider_filter: [] + refresh_interval: 3600 + guardrail: + guardrail_identifier: '' + guardrail_version: '' + stream_processing_mode: async + trace: disabled +auxiliary: + vision: + provider: newapi-local + model: meta/llama-3.2-11b-vision-instruct + base_url: http://127.0.0.1:3000/v1 + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + timeout: 120 + download_timeout: 30 + web_extract: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 360 + compression: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 120 + skills_hub: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + approval: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + mcp: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + title_generation: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + triage_specifier: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 120 + kanban_decomposer: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 180 + profile_describer: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 60 + curator: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 600 + session_search: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + extra_body: {} + max_concurrency: 3 +display: + compact: false + personality: kawaii + resume_display: full + resume_exchanges: 10 + resume_max_user_chars: 300 + resume_max_assistant_chars: 200 + resume_max_assistant_lines: 3 + resume_skip_tool_only: true + busy_input_mode: interrupt + tui_auto_resume_recent: false + bell_on_complete: false + show_reasoning: false + streaming: false + timestamps: false + final_response_markdown: strip + persistent_output: true + persistent_output_max_lines: 200 + inline_diffs: true + file_mutation_verifier: true + show_cost: false + skin: default + language: en + tui_status_indicator: kaomoji + user_message_preview: + first_lines: 2 + last_lines: 2 + interim_assistant_messages: true + tool_progress_command: false + tool_preview_length: 0 + ephemeral_system_ttl: 0 + runtime_footer: + fields: + - model + - context_pct + - cwd + copy_shortcut: auto + tool_progress: all + tool_progress_style: accumulate +dashboard: + theme: default + show_token_analytics: false + oauth: + client_id: '' + portal_url: '' + public_url: '' +privacy: + redact_pii: false +tts: + provider: edge + edge: + voice: zh-CN-XiaoxiaoNeural + elevenlabs: + voice_id: pNInz6obpgDQGcFmaJgB + model_id: eleven_multilingual_v2 + openai: + model: gpt-4o-mini-tts + voice: alloy + xai: + voice_id: eve + language: en + sample_rate: 24000 + bit_rate: 128000 + mistral: + model: voxtral-mini-tts-2603 + voice_id: c69964a6-ab8b-4f8a-9465-ec0925096ec8 + neutts: + ref_audio: '' + ref_text: '' + model: neuphonic/neutts-air-q4-gguf + device: cpu + piper: + voice: en_US-lessac-medium + use_gateway: false +stt: + enabled: true + provider: local + local: + model: base + language: '' + openai: + model: whisper-1 + mistral: + model: voxtral-mini-latest +voice: + record_key: ctrl+b + max_recording_seconds: 120 + auto_tts: true + beep_enabled: true + silence_threshold: 200 + silence_duration: 3.0 +human_delay: + mode: 'off' + min_ms: 800 + max_ms: 2500 +context: + engine: compressor +memory: + memory_enabled: true + user_profile_enabled: true + memory_char_limit: 2200 + user_char_limit: 1375 + provider: zhiyi +delegation: + model: nvidia/nemotron-3-super-120b-a12b + provider: newapi-local + base_url: '' + api_key: '' + api_mode: '' + inherit_mcp_toolsets: true + max_iterations: 50 + child_timeout_seconds: 600 + reasoning_effort: '' + max_concurrent_children: 3 + max_spawn_depth: 1 + orchestrator_enabled: true + subagent_auto_approve: false +prefill_messages_file: '' +goals: + max_turns: 20 +moa: + default_preset: expert-panel + save_traces: false + presets: + expert-panel: + reference_models: + - provider: newapi-local + model: openai/gpt-oss-120b + - provider: newapi-local + model: nvidia/llama-3.3-nemotron-super-49b-v1 + - provider: newapi-local + model: mistralai/mistral-large-3-675b-instruct-2512 + aggregator: + provider: newapi-local + model: openai/gpt-oss-120b + fanout: user_turn + reference_max_tokens: 800 + enabled: true +skills: + external_dirs: [] + template_vars: true + inline_shell: false + inline_shell_timeout: 10 + guard_agent_created: false +curator: + enabled: true + interval_hours: 168 + min_idle_hours: 2 + stale_after_days: 30 + archive_after_days: 90 + backup: + enabled: true + keep: 5 +timezone: '' +slack: + require_mention: true + free_response_channels: '' + allowed_channels: '' +discord: + require_mention: true + free_response_channels: '' + allowed_channels: '' + auto_thread: true + thread_require_mention: false + history_backfill: true + history_backfill_limit: 50 + reactions: true + dm_role_auth_guild: '' + server_actions: '' + allow_any_attachment: false + max_attachment_bytes: 33554432 +telegram: + reactions: false + allowed_chats: '' +mattermost: + require_mention: true + free_response_channels: '' + allowed_channels: '' +matrix: + require_mention: true + free_response_rooms: '' + allowed_rooms: '' +approvals: + mode: manual + timeout: 60 + cron_mode: deny + mcp_reload_confirm: true + destructive_slash_confirm: false +command_allowlist: + - pipe remote content to shell + - script execution via heredoc + - copy/move file into /etc/ + - find -delete + - recursive delete + - hermes update (restarts gateway, kills running agents) + - shell command via -c/-lc flag + - force kill processes (killall -KILL) + - script execution via -e/-c flag + - overwrite system file via tee +<<<<<<< HEAD +======= + - copy/move file into sensitive credential/SSH/shell-rc path +>>>>>>> 9d4d969 (auto-snapshot 2026-07-31 03:00:25) + - kill hermes/gateway process (self-termination) + - delete in root path + - git force push short flag (rewrites remote history) + - sudo with combined-flag privilege escalation + - overwrite system file via redirection + - start gateway outside systemd (use 'systemctl --user restart hermes-gateway') + - disk copy + - overwrite system config + - overwrite project env/config via redirection + - kill process via pgrep expansion (self-termination) + - SQL TRUNCATE + - in-place edit of system config + - world/other-writable permissions + - stop/restart hermes gateway (kills running agents) + - sudo with privilege flag (stdin/askpass/shell/list) + - copy/move file into system config path + - force kill processes + - git force push (rewrites remote history) + - stop/restart system service + - in-place edit of Hermes config/env +hooks_auto_accept: false +security: + allow_private_urls: false + redact_secrets: true + tirith_enabled: true + tirith_path: tirith + tirith_timeout: 5 + tirith_fail_open: true + website_blocklist: + enabled: false + domains: [] + shared_files: [] + acked_advisories: [] + allow_lazy_installs: true +cron: + provider: auto + wrap_response: true + gateway_required: true + default_deliver: origin,feishu:oc_81f6df701c872a1122f32080e366543f +code_execution: + mode: project +tools: + tool_search: + enabled: auto + threshold_pct: 10 + search_default_limit: 5 + max_search_limit: 20 +logging: + level: INFO + max_size_mb: 5 + backup_count: 3 + memory_monitor: + enabled: true + interval_seconds: 300 +model_catalog: + enabled: true + url: https://hermes-agent.nousresearch.com/docs/api/model-catalog.json + ttl_hours: 24 +network: + force_ipv4: false +gateway: + strict: false + media_delivery_allow_dirs: [] + trust_recent_files: true + trust_recent_files_seconds: 600 + multiplex_profiles: false +sessions: + auto_prune: false + retention_days: 90 + vacuum_after_prune: true + min_interval_hours: 24 + write_json_snapshots: false +onboarding: + seen: + busy_input_prompt: true + openclaw_residue_cleanup: true + tool_progress_prompt: true +updates: + pre_update_backup: false + backup_keep: 5 +lsp: + enabled: true + wait_mode: document + wait_timeout: 5.0 + install_strategy: auto +x_search: + model: grok-4.20-reasoning + timeout_seconds: 180 + retries: 2 +secrets: + bitwarden: + enabled: false + access_token_env: BWS_ACCESS_TOKEN + project_id: '' + cache_ttl_seconds: 300 + override_existing: true + auto_install: true + server_url: '' +paste_collapse_threshold: 5 +paste_collapse_threshold_fallback: 5 +paste_collapse_char_threshold: 2000 +_config_version: 24 +mcp_servers: + codegraph: + args: + - serve + - --mcp + command: codegraph + connect_timeout: 60 + enabled: true + timeout: 120 + github: + args: + - -y + - '@modelcontextprotocol/server-github' + command: npx + enabled: true + env: + GITHUB_PERSONAL_ACCESS_TOKEN: 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 + timeout: 60 + openclaw: + command: openclaw + args: + - mcp + - serve + connect_timeout: 60 + timeout: 300 + codebase-memory-mcp: + command: /home/muc/.local/bin/codebase-memory-mcp + enabled: true +platform_toolsets: + cli: + - browser + - clarify + - code_execution + - computer_use + - cronjob + - delegation + - file + - image_gen + - mcp-codegraph + - memory + - messaging + - session_search + - skills + - terminal + - todo + - tts + - vision + - web +platforms: + webhook: + enabled: true + extra: + host: 0.0.0.0 + port: 8644 + feishu: + enabled: true + app_id: cli_a95d7ff06b789bb4 + app_secret: Gm7eo0aD9Luka8mHxApRufYIDwmpGsGf +plugins: + disabled: [] + enabled: + - agentic-sms-gateway + - cronalytics + - rtk-rewrite +weixin: + enabled: true + extra: + dm_policy: open + group_policy: open +session_reset: {} +known_plugin_toolsets: + cli: + - spotify diff --git a/config.yaml.corrupt.20260801-013515.bak b/config.yaml.corrupt.20260801-013515.bak new file mode 100644 index 00000000..5a319150 --- /dev/null +++ b/config.yaml.corrupt.20260801-013515.bak @@ -0,0 +1,612 @@ +model: +<<<<<<< HEAD + default: nvidia/nemotron-3-super-120b-a12b + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + base_url: http://127.0.0.1:3000/v1 +======= + default: deepseek-v4-flash + api_key: sk-b1212066094d4e319784f23d5b2c6bbd + base_url: https://api.deepseek.com +>>>>>>> 6bbfdba (fix(model-health.py v3): 排名驱动自动替换 + 探针3次平均 + 修复致命缺陷) +providers: + newapi-local: + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + base_url: http://127.0.0.1:3000/v1 + cost_factor: 0.0 + default_model: nvidia/nemotron-3-super-120b-a12b + models: + - nvidia/nemotron-3-super-120b-a12b + - openai/gpt-oss-120b + - mistralai/mistral-nemotron + - nvidia/llama-3.3-nemotron-super-49b-v1.5 + rate_limit: 1000 + timeout: 30 + deepseek: + api_key: sk-b1212066094d4e319784f23d5b2c6bbd + base_url: https://api.deepseek.com + cost_factor: 0.0 + default_model: deepseek-v4-flash + models: + - deepseek-v4-flash + - deepseek-v4-pro + rate_limit: 1000 + timeout: 30 +fallback_providers: '["deepseek"]' +toolsets: + - hermes-cli + - web +agent: + max_turns: 90 + gateway_timeout: 1800 + restart_drain_timeout: 180 + api_max_retries: 2 + service_tier: '' + tool_use_enforcement: auto + task_completion_guidance: true + environment_probe: true + environment_hint: '' + gateway_timeout_warning: 900 + clarify_timeout: 600 + gateway_notify_interval: 180 + gateway_auto_continue_freshness: 3600 + image_input_mode: auto + disabled_toolsets: [] +terminal: + backend: local + modal_mode: auto + cwd: . + timeout: 180 + env_passthrough: [] + shell_init_files: [] + auto_source_bashrc: true + docker_image: nikolaik/python-nodejs:python3.11-nodejs20 + docker_forward_env: [] + singularity_image: docker://nikolaik/python-nodejs:python3.11-nodejs20 + modal_image: nikolaik/python-nodejs:python3.11-nodejs20 + daytona_image: nikolaik/python-nodejs:python3.11-nodejs20 + container_cpu: 1 + container_memory: 5120 + container_disk: 51200 + container_persistent: true + docker_volumes: [] + docker_mount_cwd_to_workspace: false + docker_extra_args: [] + docker_run_as_host_user: false + persistent_shell: true + vercel_runtime: node24 +web: + backend: '' + search_backend: '' + extract_backend: '' +browser: + inactivity_timeout: 120 + command_timeout: 30 + record_sessions: false + allow_private_urls: false + engine: auto + auto_local_for_private_urls: true + cdp_url: '' + dialog_policy: must_respond + dialog_timeout_s: 300 + camofox: + managed_persistence: false + user_id: '' + session_key: '' + adopt_existing_tab: false + rewrite_loopback_urls: false + loopback_host_alias: host.docker.internal + cloud_provider: local + use_gateway: false +checkpoints: + enabled: true + max_snapshots: 50 + max_total_size_mb: 500 + max_file_size_mb: 10 + auto_prune: false + retention_days: 7 + delete_orphans: true + min_interval_hours: 24 +file_read_max_chars: 100000 +tool_output: + max_bytes: 50000 + max_lines: 2000 + max_line_length: 2000 +tool_loop_guardrails: + warnings_enabled: true + hard_stop_enabled: false + warn_after: + exact_failure: 2 + same_tool_failure: 3 + idempotent_no_progress: 2 + hard_stop_after: + exact_failure: 5 + same_tool_failure: 8 + idempotent_no_progress: 5 +compression: + enabled: true + threshold: 0.5 + target_ratio: 0.2 + protect_last_n: 20 + hygiene_hard_message_limit: 400 + protect_first_n: 3 + abort_on_summary_failure: false +kanban: + dispatch_in_gateway: true + dispatch_interval_seconds: 60 + failure_limit: 2 + worker_log_rotate_bytes: 2097152 + worker_log_backup_count: 1 + orchestrator_profile: '' + default_assignee: '' + auto_decompose: true + auto_decompose_per_tick: 3 + dispatch_stale_timeout_seconds: 14400 +prompt_caching: + cache_ttl: 5m + long_lived_prefix: true + long_lived_ttl: 1h +openrouter: + response_cache: true + response_cache_ttl: 300 + min_coding_score: 0.65 +bedrock: + region: '' + discovery: + enabled: true + provider_filter: [] + refresh_interval: 3600 + guardrail: + guardrail_identifier: '' + guardrail_version: '' + stream_processing_mode: async + trace: disabled +auxiliary: + vision: + provider: newapi-local + model: meta/llama-3.2-11b-vision-instruct + base_url: http://127.0.0.1:3000/v1 + api_key: 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP + timeout: 120 + download_timeout: 30 + web_extract: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 360 + compression: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 120 + skills_hub: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + approval: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + mcp: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + title_generation: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + triage_specifier: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 120 + kanban_decomposer: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 180 + profile_describer: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 60 + curator: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 600 + session_search: + provider: auto + model: '' + base_url: '' + api_key: '' + timeout: 30 + extra_body: {} + max_concurrency: 3 +display: + compact: false + personality: kawaii + resume_display: full + resume_exchanges: 10 + resume_max_user_chars: 300 + resume_max_assistant_chars: 200 + resume_max_assistant_lines: 3 + resume_skip_tool_only: true + busy_input_mode: interrupt + tui_auto_resume_recent: false + bell_on_complete: false + show_reasoning: false + streaming: false + timestamps: false + final_response_markdown: strip + persistent_output: true + persistent_output_max_lines: 200 + inline_diffs: true + file_mutation_verifier: true + show_cost: false + skin: default + language: en + tui_status_indicator: kaomoji + user_message_preview: + first_lines: 2 + last_lines: 2 + interim_assistant_messages: true + tool_progress_command: false + tool_preview_length: 0 + ephemeral_system_ttl: 0 + runtime_footer: + fields: + - model + - context_pct + - cwd + copy_shortcut: auto + tool_progress: all + tool_progress_style: accumulate +dashboard: + theme: default + show_token_analytics: false + oauth: + client_id: '' + portal_url: '' + public_url: '' +privacy: + redact_pii: false +tts: + provider: edge + edge: + voice: zh-CN-XiaoxiaoNeural + elevenlabs: + voice_id: pNInz6obpgDQGcFmaJgB + model_id: eleven_multilingual_v2 + openai: + model: gpt-4o-mini-tts + voice: alloy + xai: + voice_id: eve + language: en + sample_rate: 24000 + bit_rate: 128000 + mistral: + model: voxtral-mini-tts-2603 + voice_id: c69964a6-ab8b-4f8a-9465-ec0925096ec8 + neutts: + ref_audio: '' + ref_text: '' + model: neuphonic/neutts-air-q4-gguf + device: cpu + piper: + voice: en_US-lessac-medium + use_gateway: false +stt: + enabled: true + provider: local + local: + model: base + language: '' + openai: + model: whisper-1 + mistral: + model: voxtral-mini-latest +voice: + record_key: ctrl+b + max_recording_seconds: 120 + auto_tts: true + beep_enabled: true + silence_threshold: 200 + silence_duration: 3.0 +human_delay: + mode: 'off' + min_ms: 800 + max_ms: 2500 +context: + engine: compressor +memory: + memory_enabled: true + user_profile_enabled: true + memory_char_limit: 2200 + user_char_limit: 1375 + provider: zhiyi +delegation: + model: nvidia/nemotron-3-super-120b-a12b + provider: newapi-local + base_url: '' + api_key: '' + api_mode: '' + inherit_mcp_toolsets: true + max_iterations: 50 + child_timeout_seconds: 600 + reasoning_effort: '' + max_concurrent_children: 3 + max_spawn_depth: 1 + orchestrator_enabled: true + subagent_auto_approve: false +prefill_messages_file: '' +goals: + max_turns: 20 +moa: + default_preset: expert-panel + save_traces: false + presets: + expert-panel: + reference_models: + - provider: newapi-local + model: openai/gpt-oss-120b + - provider: newapi-local + model: nvidia/llama-3.3-nemotron-super-49b-v1 + - provider: newapi-local + model: mistralai/mistral-large-3-675b-instruct-2512 + aggregator: + provider: newapi-local + model: openai/gpt-oss-120b + fanout: user_turn + reference_max_tokens: 800 + enabled: true +skills: + external_dirs: [] + template_vars: true + inline_shell: false + inline_shell_timeout: 10 + guard_agent_created: false +curator: + enabled: true + interval_hours: 168 + min_idle_hours: 2 + stale_after_days: 30 + archive_after_days: 90 + backup: + enabled: true + keep: 5 +timezone: '' +slack: + require_mention: true + free_response_channels: '' + allowed_channels: '' +discord: + require_mention: true + free_response_channels: '' + allowed_channels: '' + auto_thread: true + thread_require_mention: false + history_backfill: true + history_backfill_limit: 50 + reactions: true + dm_role_auth_guild: '' + server_actions: '' + allow_any_attachment: false + max_attachment_bytes: 33554432 +telegram: + reactions: false + allowed_chats: '' +mattermost: + require_mention: true + free_response_channels: '' + allowed_channels: '' +matrix: + require_mention: true + free_response_rooms: '' + allowed_rooms: '' +approvals: + mode: manual + timeout: 60 + cron_mode: deny + mcp_reload_confirm: true + destructive_slash_confirm: false +command_allowlist: + - pipe remote content to shell + - script execution via heredoc + - copy/move file into /etc/ + - find -delete + - recursive delete + - hermes update (restarts gateway, kills running agents) + - shell command via -c/-lc flag + - force kill processes (killall -KILL) + - script execution via -e/-c flag + - overwrite system file via tee + - kill hermes/gateway process (self-termination) + - delete in root path + - git force push short flag (rewrites remote history) + - sudo with combined-flag privilege escalation + - overwrite system file via redirection + - start gateway outside systemd (use 'systemctl --user restart hermes-gateway') + - disk copy + - overwrite system config + - overwrite project env/config via redirection + - kill process via pgrep expansion (self-termination) + - SQL TRUNCATE + - in-place edit of system config + - world/other-writable permissions + - stop/restart hermes gateway (kills running agents) + - sudo with privilege flag (stdin/askpass/shell/list) + - copy/move file into system config path + - force kill processes + - git force push (rewrites remote history) + - stop/restart system service + - in-place edit of Hermes config/env +hooks_auto_accept: false +security: + allow_private_urls: false + redact_secrets: true + tirith_enabled: true + tirith_path: tirith + tirith_timeout: 5 + tirith_fail_open: true + website_blocklist: + enabled: false + domains: [] + shared_files: [] + acked_advisories: [] + allow_lazy_installs: true +cron: + provider: auto + wrap_response: true + gateway_required: true + default_deliver: origin,feishu:oc_81f6df701c872a1122f32080e366543f +code_execution: + mode: project +tools: + tool_search: + enabled: auto + threshold_pct: 10 + search_default_limit: 5 + max_search_limit: 20 +logging: + level: INFO + max_size_mb: 5 + backup_count: 3 + memory_monitor: + enabled: true + interval_seconds: 300 +model_catalog: + enabled: true + url: https://hermes-agent.nousresearch.com/docs/api/model-catalog.json + ttl_hours: 24 +network: + force_ipv4: false +gateway: + strict: false + media_delivery_allow_dirs: [] + trust_recent_files: true + trust_recent_files_seconds: 600 + multiplex_profiles: false +sessions: + auto_prune: false + retention_days: 90 + vacuum_after_prune: true + min_interval_hours: 24 + write_json_snapshots: false +onboarding: + seen: + busy_input_prompt: true + openclaw_residue_cleanup: true + tool_progress_prompt: true +updates: + pre_update_backup: false + backup_keep: 5 +lsp: + enabled: true + wait_mode: document + wait_timeout: 5.0 + install_strategy: auto +x_search: + model: grok-4.20-reasoning + timeout_seconds: 180 + retries: 2 +secrets: + bitwarden: + enabled: false + access_token_env: BWS_ACCESS_TOKEN + project_id: '' + cache_ttl_seconds: 300 + override_existing: true + auto_install: true + server_url: '' +paste_collapse_threshold: 5 +paste_collapse_threshold_fallback: 5 +paste_collapse_char_threshold: 2000 +_config_version: 24 +mcp_servers: + codegraph: + args: + - serve + - --mcp + command: codegraph + connect_timeout: 60 + enabled: true + timeout: 120 + github: + args: + - -y + - '@modelcontextprotocol/server-github' + command: npx + enabled: true + env: + GITHUB_PERSONAL_ACCESS_TOKEN: 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 + timeout: 60 + openclaw: + command: openclaw + args: + - mcp + - serve + connect_timeout: 60 + timeout: 300 + codebase-memory-mcp: + command: /home/muc/.local/bin/codebase-memory-mcp + enabled: true +platform_toolsets: + cli: + - browser + - clarify + - code_execution + - computer_use + - cronjob + - delegation + - file + - image_gen + - mcp-codegraph + - memory + - messaging + - session_search + - skills + - terminal + - todo + - tts + - vision + - web +platforms: + webhook: + enabled: true + extra: + host: 0.0.0.0 + port: 8644 + feishu: + enabled: true + app_id: cli_a95d7ff06b789bb4 + app_secret: Gm7eo0aD9Luka8mHxApRufYIDwmpGsGf +plugins: + disabled: [] + enabled: + - agentic-sms-gateway + - cronalytics + - rtk-rewrite +weixin: + enabled: true + extra: + dm_policy: open + group_policy: open +session_reset: {} +known_plugin_toolsets: + cli: + - spotify diff --git a/cron/jobs.json b/cron/jobs.json index 6c0e00df..61d2dbf3 100644 --- a/cron/jobs.json +++ b/cron/jobs.json @@ -27,7 +27,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-06-21T18:52:36.548110+08:00", - "next_run_at": "2026-07-30T11:45:09.710569+08:00", + "next_run_at": "2026-08-01T01:36:48.501935+08:00", "last_run_at": "2026-07-30T11:44:09.710569+08:00", "last_status": "ok", "last_error": null, @@ -123,7 +123,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T01:30:54.618246+08:00", - "next_run_at": "2026-07-30T17:22:23.748974+08:00", + "next_run_at": "2026-08-01T07:35:48.504498+08:00", "last_run_at": "2026-07-30T11:22:23.748974+08:00", "last_status": "ok", "last_error": null, @@ -169,7 +169,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T01:42:21.503720+08:00", - "next_run_at": "2026-07-30T11:59:10.256329+08:00", + "next_run_at": "2026-08-01T02:05:48.506956+08:00", "last_run_at": "2026-07-30T11:29:10.256329+08:00", "last_status": "ok", "last_error": null, @@ -215,7 +215,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T01:43:11.921492+08:00", - "next_run_at": "2026-07-30T22:00:00+08:00", + "next_run_at": "2026-08-01T22:00:00+08:00", "last_run_at": "2026-07-29T22:02:40.385507+08:00", "last_status": "ok", "last_error": null, @@ -265,7 +265,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T02:10:36.846128+08:00", - "next_run_at": "2026-07-31T03:00:00+08:00", + "next_run_at": "2026-08-01T03:00:00+08:00", "last_run_at": "2026-07-30T03:00:00.405596+08:00", "last_status": "ok", "last_error": null, @@ -311,7 +311,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T02:11:00.385573+08:00", - "next_run_at": "2026-07-31T03:00:00+08:00", + "next_run_at": "2026-08-01T03:00:00+08:00", "last_run_at": "2026-07-30T03:00:00.992609+08:00", "last_status": "ok", "last_error": null, @@ -449,7 +449,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T02:46:29.345663+08:00", - "next_run_at": "2026-07-31T05:00:00+08:00", + "next_run_at": "2026-08-01T05:00:00+08:00", "last_run_at": "2026-07-30T05:00:02.935247+08:00", "last_status": "ok", "last_error": null, @@ -495,7 +495,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T02:51:48.935042+08:00", - "next_run_at": "2026-07-30T12:00:00+08:00", + "next_run_at": "2026-08-01T06:00:00+08:00", "last_run_at": "2026-07-30T06:00:19.898064+08:00", "last_status": "ok", "last_error": null, @@ -541,7 +541,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T21:31:29.417518+08:00", - "next_run_at": "2026-07-31T09:00:00+08:00", + "next_run_at": "2026-08-01T09:00:00+08:00", "last_run_at": "2026-07-30T09:00:07.467395+08:00", "last_status": "ok", "last_error": null, @@ -587,7 +587,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-09T21:31:33.068978+08:00", - "next_run_at": "2026-07-30T21:00:00+08:00", + "next_run_at": "2026-08-01T21:00:00+08:00", "last_run_at": "2026-07-29T21:00:55.787887+08:00", "last_status": "ok", "last_error": null, @@ -725,7 +725,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-12T01:32:01.773389+08:00", - "next_run_at": "2026-07-30T16:00:00+08:00", + "next_run_at": "2026-08-03T16:00:00+08:00", "last_run_at": "2026-07-29T16:01:02.261318+08:00", "last_status": "ok", "last_error": null, @@ -771,7 +771,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-12T02:01:32.403228+08:00", - "next_run_at": "2026-07-31T08:00:00+08:00", + "next_run_at": "2026-08-03T08:00:00+08:00", "last_run_at": "2026-07-30T08:00:07.765250+08:00", "last_status": "ok", "last_error": null, @@ -817,7 +817,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-12T02:33:28.322158+08:00", - "next_run_at": "2026-07-31T09:00:00+08:00", + "next_run_at": "2026-08-03T09:00:00+08:00", "last_run_at": "2026-07-30T09:00:10.097029+08:00", "last_status": "ok", "last_error": null, @@ -863,7 +863,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-13T12:03:22.805682+08:00", - "next_run_at": "2026-07-30T12:00:00+08:00", + "next_run_at": "2026-08-01T02:00:00+08:00", "last_run_at": "2026-07-30T11:00:10.087879+08:00", "last_status": "ok", "last_error": null, @@ -909,7 +909,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-13T12:06:19.941605+08:00", - "next_run_at": "2026-07-31T04:00:00+08:00", + "next_run_at": "2026-08-01T04:00:00+08:00", "last_run_at": "2026-07-30T04:00:02.811555+08:00", "last_status": "ok", "last_error": null, @@ -1001,7 +1001,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-21T08:55:49.786038+08:00", - "next_run_at": "2026-07-30T11:50:00+08:00", + "next_run_at": "2026-08-01T01:40:00+08:00", "last_run_at": "2026-07-30T11:40:09.486613+08:00", "last_status": "ok", "last_error": null, @@ -1047,7 +1047,7 @@ "paused_at": null, "paused_reason": null, "created_at": "2026-07-30T09:50:28.224645+08:00", - "next_run_at": "2026-07-31T03:00:00+08:00", + "next_run_at": "2026-08-01T03:00:00+08:00", "last_run_at": null, "last_status": null, "last_error": null, @@ -1064,5 +1064,5 @@ "workdir": null } ], - "updated_at": "2026-07-30T11:44:09.710669+08:00" + "updated_at": "2026-08-01T01:35:48.507024+08:00" } \ No newline at end of file diff --git a/cron/ticker_heartbeat b/cron/ticker_heartbeat index a5227523..81bfb75c 100644 --- a/cron/ticker_heartbeat +++ b/cron/ticker_heartbeat @@ -1 +1 @@ -1785383109.5456767 \ No newline at end of file +1785519348.5146606 \ No newline at end of file diff --git a/cron/ticker_last_success b/cron/ticker_last_success index 45f70091..2ff976fe 100644 --- a/cron/ticker_last_success +++ b/cron/ticker_last_success @@ -1 +1 @@ -1785383109.5549402 \ No newline at end of file +1785519348.517083 \ No newline at end of file diff --git a/daemon/context.json b/daemon/context.json index 97e66c77..d2281754 100644 --- a/daemon/context.json +++ b/daemon/context.json @@ -1,9 +1,9 @@ { "started_at": "2026-07-08T18:23:30.315261+00:00", - "last_deep_tick": "2026-07-30T03:44:54.373606+00:00", - "last_light_tick": "2026-07-30T03:45:27.484596+00:00", + "last_deep_tick": "2026-07-31T17:34:17.383350+00:00", + "last_light_tick": "2026-07-31T17:35:21.790013+00:00", "last_state": { - "disk_pct": 51, + "disk_pct": 54, "mem_pct": 63, "processes": { "zhiyid": true, @@ -12,17 +12,17 @@ "hermes": true } }, - "tick_count": 56084, - "deep_tick_count": 9188, + "tick_count": 60218, + "deep_tick_count": 10222, "solved_count": 1, "learned_count": 0, - "uptime_seconds": 225719, + "uptime_seconds": 133256, "last_reflection": { - "evaluation_previous_goal": "LLM\u8c03\u7528\u5931\u8d25", - "memory": "\u4e0a\u6b21\u8c03\u7528\u5931\u8d25", - "next_goal": "\u91cd\u8bd5" + "evaluation_previous_goal": "", + "memory": "", + "next_goal": "" }, - "last_profile_update": 1785381718.3491108, + "last_profile_update": 1785500531.101474, "soulful": { "recent_moments": [ { @@ -57,7 +57,7 @@ } ], "profile_summary": "\u7b80\u6d01\u76f4\u63a5", - "cares_pending": 3, + "cares_pending": 0, "uptime_minutes": 0, "daemon_status": "running" }, diff --git a/llm_context.json b/llm_context.json index 0d7614b5..1b526042 100644 --- a/llm_context.json +++ b/llm_context.json @@ -1,466 +1,14 @@ { "version": 2, - "updated_at": "2026-07-30T03:45:27.656337+00:00", - "uptime_minutes": 3761, + "updated_at": "2026-07-31T17:35:21.869168+00:00", + "uptime_minutes": 2220, "daemon_status": "running", "distill_status": "ok", - "observations": [ - { - "name": "f_a01确认巡检报告已收_关键状态_知乎文章停更于_05_6月20日_约一个月无更新_a01评估当前无需升级_等待哥哥_牧尘_指示", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1785072114064818659", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "f_sessiokey_有效性检查_-_2026-07-26_11_00_utc_8_结论_整体正常_有一项需关注_正常的_sessio-_agent_a02_maiheartbe", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1785034875422838308", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "f_2026-07-09_11_00_心跳回复_-_a03_墨文_1_05_封面图任务_记忆库查不到_我未录入过_队列里也没有_请来源方确认补充_2_overdue-check_blac", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1785018158403944028", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "f_用户_全面进行一次检查_发现问题_并解决_尽量用opencode审核代码_助手_全面检查完成_已修复_7_个问题_文件_行_类型_严重_状态_---", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784989382795967336", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_用户_加上_认真分析问题_别乱修改_助手_全部搞定_daemo稳定_deep_tick_6092_正常运行_---_修复总结_问题_根因_修复_状", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784986219983115592", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_用户_你怎么一直弄dns_助手_daemo已稳定运行_6128_次_crash_终结_---_根因_int_out_假设_nvidia-smi_永远输出数字", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784984502438260149", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_用户_错误信息一直在飞书群发_助手_问题已定位清楚_总结一下_---_根因_dns_中断_20_分钟_20_00-20_20_dns_断期间_所有发飞书群的_delivery", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784983326599083903", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_用户_小唯异常_助手_我在等你说具体哪里异常_刚才已确认_-_进程全存活_zhiyi_bge_new-api_hermes_daemo-_newapi_13", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784982897737856478", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_sessiokey_有效性检查记录_2026-07-25_11_00_cst_51个活跃sessio0个已归档_过期_所有团队成员_a01_a02_a03_a04_a05_sessio均", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1784948443895996082", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "f_sessiokey_健康检查报告_-_2026-07-24_11_00_cst_正常心跳_sessio5个_-_maiagent_maimaiheartbeat", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1784862056715739883", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "f_用户_cronjob_response_bge内存泄漏监控_job_id_2891b3304339_---_crobge内存泄漏监控_failed_provider_t", - "namespace": "shared", - "summary": "" - }, - { - "name": "ep_1784798739181161581", - "namespace": "shared", - "summary": "" - }, - { - "name": "f_sessiokey_健康检查结果_2026-07-23_11_00_cst_心跳_sessio全部正常_-_a02_maiheartbeat_178477335930", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1784775745032095947", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "f_用户_小唯机器人发的_助手_修好了_总结两次诊断的结果_问题1_本次对话发现并修复_memory-system-self-upgrade_py_里期望_active_scene", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784767495091903065", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_用户_记忆系统升级异常_助手_这条消息只有标题_没有具体内容_是哪个_cro发出来的_还是你看漏了具体报错信息_能把完整内容发给我吗_或者告诉我_记忆系统升级异常_具体是指哪个系统_什", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "ep_1784766328648485458", - "namespace": "hermes-main", - "summary": "" - }, - { - "name": "f_a05_核查_a01_sessiokey_异常_2026-07-22_11_00_结论_a01_小雪_无独立_agent_实体_是_mai的会话标签_-_sessions_list_a", - "namespace": "openclaw-main", - "summary": "" - }, - { - "name": "ep_1784689500438390218", - "namespace": "openclaw-main", - "summary": "" - } - ], - "patterns": [ - { - "name": "topic:按照你的建议", - "occurrence": 1, - "source": "session_messages", - "topic": "按照你的建议" - }, - { - "name": "topic:each", - "occurrence": 1, - "source": "session_messages", - "topic": "each" - }, - { - "name": "topic:COMPLETE", - "occurrence": 1, - "source": "session_messages", - "topic": "COMPLETE" - }, - { - "name": "topic:同步服务器凭", - "occurrence": 1, - "source": "session_messages", - "topic": "同步服务器凭" - }, - { - "name": "topic:证照片", - "occurrence": 1, - "source": "session_messages", - "topic": "证照片" - }, - { - "name": "topic:系统", - "occurrence": 1, - "source": "session_messages", - "topic": "系统" - }, - { - "name": "topic:设计改造方案", - "occurrence": 1, - "source": "session_messages", - "topic": "设计改造方案" - }, - { - "name": "topic:改造", - "occurrence": 1, - "source": "session_messages", - "topic": "改造" - }, - { - "name": "topic:BATCH", - "occurrence": 1, - "source": "session_messages", - "topic": "BATCH" - }, - { - "name": "topic:daemon", - "occurrence": 1, - "source": "session_messages", - "topic": "daemon" - }, - { - "name": "topic:写代码", - "occurrence": 1, - "source": "session_messages", - "topic": "写代码" - }, - { - "name": "topic:自检", - "occurrence": 1, - "source": "session_messages", - "topic": "自检" - }, - { - "name": "topic:code", - "occurrence": 1, - "source": "session_messages", - "topic": "code" - }, - { - "name": "topic:IMPORTANT", - "occurrence": 1, - "source": "session_messages", - "topic": "IMPORTANT" - }, - { - "name": "pattern:shared:software", - "occurrence": 1, - "source": "graph_nodes", - "topic": "" - }, - { - "name": "topic:数据恢复备忘", - "occurrence": 1, - "source": "session_messages", - "topic": "数据恢复备忘" - }, - { - "name": "topic:在不", - "occurrence": 1, - "source": "session_messages", - "topic": "在不" - }, - { - "name": "topic:好的", - "occurrence": 1, - "source": "session_messages", - "topic": "好的" - }, - { - "name": "topic:执行", - "occurrence": 1, - "source": "session_messages", - "topic": "执行" - }, - { - "name": "topic:问题", - "occurrence": 1, - "source": "session_messages", - "topic": "问题" - }, - { - "name": "topic:我想知道", - "occurrence": 1, - "source": "session_messages", - "topic": "我想知道" - }, - { - "name": "topic:人格文件什么", - "occurrence": 1, - "source": "session_messages", - "topic": "人格文件什么" - }, - { - "name": "topic:的用修改么", - "occurrence": 1, - "source": "session_messages", - "topic": "的用修改么" - }, - { - "name": "topic:财务报表报送", - "occurrence": 1, - "source": "session_messages", - "topic": "财务报表报送" - }, - { - "name": "topic:与信息采集", - "occurrence": 1, - "source": "session_messages", - "topic": "与信息采集" - }, - { - "name": "topic:小企业会计准", - "occurrence": 1, - "source": "session_messages", - "topic": "小企业会计准" - }, - { - "name": "topic:你可以让她执", - "occurrence": 1, - "source": "session_messages", - "topic": "你可以让她执" - }, - { - "name": "topic:行你不能执行", - "occurrence": 1, - "source": "session_messages", - "topic": "行你不能执行" - }, - { - "name": "topic:的终端命令", - "occurrence": 1, - "source": "session_messages", - "topic": "的终端命令" - }, - { - "name": "topic:继续", - "occurrence": 1, - "source": "session_messages", - "topic": "继续" - }, - { - "name": "topic:hermes", - "occurrence": 1, - "source": "session_messages", - "topic": "hermes" - }, - { - "name": "topic:you", - "occurrence": 1, - "source": "session_messages", - "topic": "you" - }, - { - "name": "topic:muc", - "occurrence": 1, - "source": "session_messages", - "topic": "muc" - }, - { - "name": "topic:has", - "occurrence": 1, - "source": "session_messages", - "topic": "has" - }, - { - "name": "topic:The", - "occurrence": 1, - "source": "session_messages", - "topic": "The" - }, - { - "name": "topic:background", - "occurrence": 1, - "source": "session_messages", - "topic": "background" - }, - { - "name": "topic:home", - "occurrence": 1, - "source": "session_messages", - "topic": "home" - }, - { - "name": "topic:user", - "occurrence": 1, - "source": "session_messages", - "topic": "user" - }, - { - "name": "topic:process", - "occurrence": 1, - "source": "session_messages", - "topic": "process" - }, - { - "name": "topic:out", - "occurrence": 1, - "source": "session_messages", - "topic": "out" - }, - { - "name": "topic:parallel", - "occurrence": 1, - "source": "session_messages", - "topic": "parallel" - }, - { - "name": "topic:openclaw", - "occurrence": 1, - "source": "session_messages", - "topic": "openclaw" - }, - { - "name": "topic:results", - "occurrence": 1, - "source": "session_messages", - "topic": "results" - }, - { - "name": "topic:ASYNC", - "occurrence": 1, - "source": "session_messages", - "topic": "ASYNC" - }, - { - "name": "topic:DELEGATION", - "occurrence": 1, - "source": "session_messages", - "topic": "DELEGATION" - }, - { - "name": "pattern:reasonix-main:concept", - "occurrence": 1, - "source": "unknown", - "topic": "" - }, - { - "name": "pattern:obsidian-plugin-main:entity", - "occurrence": 1, - "source": "unknown", - "topic": "" - }, - { - "name": "pattern:hermes-test-e41:entity", - "occurrence": 1, - "source": "unknown", - "topic": "" - }, - { - "name": "pattern:hermes:entity", - "occurrence": 1, - "source": "unknown", - "topic": "" - }, - { - "name": "pattern:a06-main:concept", - "occurrence": 1, - "source": "unknown", - "topic": "" - } - ], + "observations": [], + "patterns": [], "scenes": [ { - "content": "Found 5 matching memories:\n\n- **[episodic]** (priority: 93) [scene: 我和用户一起补写织忆心迹的时间线] (score: 0.033)\n 用户和 AI 于 2026-07-13T09:30:00Z 上线了统一记忆入口 memory_recall.py,首次将原有的三套独立记忆系统打通,标志着织忆心迹记忆体系完成整合。\n\n- **[episodic]** (priority: 90) [scene: 我和用户一起补写织忆心迹的时间线] (score: 0.032)\n 用户和 AI 于 2026-07-13T10:30:00Z ", + "content": "Found 5 matching memories:\n\n- **[episodic]** (priority: 90) [scene: 我在和用户一起补写织忆心迹的时间线] (score: 0.032)\n 用户与 AI 于 2026-07-10 共同启动了每日复盘机制,开始有意识地记录当天学到的东西,这是织忆心迹记忆体系搭建的第一个关键里程碑;于 2026-07-13T09:30 上线统一记忆入口 memory_recall.py,首次打通原有三套独立记忆系统,标志着记忆体系完成整合;于 2026-07-13T10:30 完成 Soulful 心迹补写,首次主动记录彼此之间有意义的事。此后用", "total": 5 } ], diff --git a/memories/MEMORY.md b/memories/MEMORY.md index 28bca2d2..60f4a4ed 100644 --- a/memories/MEMORY.md +++ b/memories/MEMORY.md @@ -30,6 +30,12 @@ save_llm_context教训:函数存在不代表真的在工作——必须每次t § 5个独立分身实体:cron(22)/delegate_task/OpenClaw(铁锋/卫安)/opencode/prof-b(独立profile+gateway+飞书)。各自独立配置。prof-b的HERMES_HOME=~/.hermes-prof-b/(不是~/hermes/profiles/),systemd unit指定。2026-07-29起model-health.py自愈覆盖主配置+prof-b。 § -免费模型质量排名(探针自动评分):①gpt-oss-120b(99分,329ms) ②nemotron-3-super(94分,432ms) ③mistral-nemotron(79分,2560ms) ④nemotron-nano-9b(76分,973ms)。model-health.py v2新增:质量探针+自动发现(5个/轮)+自动升级(更好模型替换配置中最差的)。 +NewAPI免费模型上下文: deepseek-v4-pro(1M), nemotron-3-super(1M✅用户确认), llama-4-maverick(1M), minimax-m3(256K), most NIM 128K, step-3.5-flash(8K)。 § -CBM v0.9.0 已装,8 MCP工具已通。cbm-code-analysis v1.1.0 + references (verified-queries + mcp-integration-workflow)。 \ No newline at end of file +CBM v0.9.0 已装,8 MCP工具已通。cbm-code-analysis v1.1.0 + references (verified-queries + mcp-integration-workflow)。 +§ +2026-07-30 模型排序: nemotron-3-super-120b-a12b(1M ctx)为🥇delegation模型。上下文评分1M=100,256K=90,128K=80。慢模型>3s用户舍弃。下载研究项目: GH超时→镜像/换源/或先下载到/tmp。 +§ +⚠️铁律(2026-07-31牧尘纠正):禁止擅自切换日常对话模型!2026-07-30我把deepseek-v4-flash(收费)换成nemotron-3-super(NewAPI免费)→无法正常使用,牧尘改回收费模型。日常对话=deepseek-v4-flash(收费)固定不变;NewAPI免费模型只用于cron/自动化,绝不用于主对话。改模型前必须先问牧尘。 +§ +model-health.py v3(2026-07-31修复两致命缺陷): ①旧版只修providers.models列表、从不验证model.default→prof-b被写成NewAPI不存在的deepseek/deepseek-v4-flash全挂503 ②排名公式丢了context_score→1M模型排不上。v3: 自愈检查model.default(仅newapi-local,付费保护) + _verify_model_usable替换前真实调用验证 + 候选必须stable + OpenClaw fallbacks也修 + 探针每题3次取平均 + 排名公式probe*0.30+ctx*0.25+param*0.20+family*0.10+stab*0.10+speed*0.05。当前🥇nemotron-3-super(1M,probe100)🥈gpt-oss(probe92)。cron 6a45e41cba6c每6h跑。 diff --git a/memories/USER.md b/memories/USER.md index 98369a01..cbcc4f30 100644 --- a/memories/USER.md +++ b/memories/USER.md @@ -9,7 +9,7 @@ KOCR修复铁律:只动需要改的列,不从逐页XLS重新合并(batch 文档意识:做完必须同步 Obsidian。所有工具在 07-Wiki 或 06-工具与资源 留档。 技术深度要求:研究必须挖到底(API结构、架构原理、对比),给结论带数据支撑。 § -模型分层:日常对话用 DeepSeek V4 Flash(付费),cron/自动化走 NewAPI 免费模型(gpt-oss-120b优先)。2026-07-29 EOL模型全部替换(step-3.5-flash、minimax-m2.7、minimax-m3、qwen3.5-122b),新免费四件套:gpt-oss-120b/nemotron-super-49b/mistral-medium-3.5/nemotron-3-super。config.yaml+MOA已修,22 cron零报错。 +模型分层铁律:日常对话必须用 DeepSeek V4 Flash(付费),禁止擅自切换为NewAPI免费模型(2026-07-31被纠正两次,切了就无法正常使用)。NewAPI免费模型仅用于cron/自动化。改模型前必须先问。 § 牧尘2026-07-29教训:修复必须全覆盖所有分体——主配置/prof-b/OpenClaw都得改到,漏一个都不算完。模型自愈脚本必须覆盖所有配置文件格式(YAML+JSON)。prof-b gateway重启只能从他那边终端手动执行,agent内部被强制保护。 § diff --git a/scripts/model-health.py b/scripts/model-health.py index 468a3926..d484052f 100755 --- a/scripts/model-health.py +++ b/scripts/model-health.py @@ -205,43 +205,47 @@ def _context_score(model: str) -> float: return max(round(ctx / 8 * 10), 5) -def _run_quality_probe(model: str) -> dict: - """运行质量探针,返回探针分和详细结果""" +def _run_quality_probe(model: str, trials: int = 3) -> dict: + """运行质量探针,返回探针分和详细结果。 + v3: 每道题测 trials 次(默认 3),取通过比例,消除单次波动。""" probe_results = [] total = 0 for q in PROBE_QUESTIONS: - payload = json.dumps({ - "model": model, - "messages": [{"role": "user", "content": q["question"]}], - "max_tokens": 200, - "temperature": 0.1, - }).encode() - req = urllib.request.Request( - f"{API}/chat/completions", - data=payload, - headers=HEADERS, - method="POST", - ) - try: - with urllib.request.urlopen(req, timeout=20) as resp: - body = json.loads(resp.read()) - msg = body.get("choices", [{}])[0].get("message", {}) or {} - # 有些模型把实际回答放 reasoning_content(gpt-oss-120b 等) - content = msg.get("content") or msg.get("reasoning_content") or msg.get("reasoning") or "" - passed = 1 if q["check"](content) else 0 - score = q["weight"] if passed else 0 - total += score - probe_results.append({ - "question": q["question"][:40], - "passed": passed, - "score": score, - }) - except Exception: - probe_results.append({ - "question": q["question"][:40], - "passed": 0, - "score": 0, - }) + passed_count = 0 + scores = [] + for _ in range(trials): + payload = json.dumps({ + "model": model, + "messages": [{"role": "user", "content": q["question"]}], + "max_tokens": 200, + "temperature": 0.1, + }).encode() + req = urllib.request.Request( + f"{API}/chat/completions", + data=payload, + headers=HEADERS, + method="POST", + ) + try: + with urllib.request.urlopen(req, timeout=20) as resp: + body = json.loads(resp.read()) + msg = body.get("choices", [{}])[0].get("message", {}) or {} + # 有些模型把实际回答放 reasoning_content(gpt-oss-120b 等) + content = msg.get("content") or msg.get("reasoning_content") or msg.get("reasoning") or "" + passed = 1 if q["check"](content) else 0 + scores.append(passed) + except Exception: + scores.append(0) + passed_count = sum(scores) + # 取平均:通过比例 × 权重(3 次中过 2 次 = 2/3 权重) + score = round(q["weight"] * passed_count / trials) + total += score + probe_results.append({ + "question": q["question"][:40], + "passed": passed_count, + "trials": trials, + "score": score, + }) return {"probe_score": total, "probe_detail": probe_results} @@ -375,7 +379,7 @@ def test_model(model: str, fastest_latency: int = None) -> dict: cs = _context_score(model) rank_score = round( - probe_s * 0.30 + cs * 0.15 + ps * 0.20 + fs * 0.15 + stab_s * 0.10 + ss * 0.10 + probe_s * 0.30 + cs * 0.25 + ps * 0.20 + fs * 0.10 + stab_s * 0.10 + ss * 0.05 ) return { @@ -399,10 +403,31 @@ def test_model(model: str, fastest_latency: int = None) -> dict: } +def _verify_model_usable(model: str) -> bool: + """替换前真实调用验证:必须 HTTP 200 且有内容,才允许写入配置。 + 这是自愈安全闸门——候选模型必须先实际跑通一次,防止写入死模型/不存在模型。""" + payload = json.dumps({ + "model": model, + "messages": [{"role": "user", "content": "hi"}], + "max_tokens": 5, + }).encode() + req = urllib.request.Request( + f"{API}/chat/completions", data=payload, headers=HEADERS, method="POST" + ) + try: + with urllib.request.urlopen(req, timeout=20) as resp: + body = json.loads(resp.read()) + msg = body.get("choices", [{}])[0].get("message", {}) or {} + content = msg.get("content") or msg.get("reasoning_content") or "" + return bool(content.strip()) + except Exception: + return False + + def main(): timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") results = [] - deadline = time.time() + 300 # 5分钟全局超时(探针增加了耗时) + deadline = time.time() + 480 # 8分钟全局超时(探针3次取平均,耗时增加) # ============ 自动发现新模型 ============ new_models = _discover_new_models() @@ -440,12 +465,14 @@ def main(): else: ss = 50 stab_s = 100 if r["stability"] == "stable" else (50 if r["stability"] == "unstable" else 0) + # v3: 加入 context_score(长上下文是核心优势,之前公式把它丢了!) r["rank_score"] = round( - r.get("probe_score", 0) * 0.35 - + r.get("param_score", 50) * 0.25 - + r.get("family_score", 60) * 0.20 + r.get("probe_score", 0) * 0.30 + + r.get("context_score", 80) * 0.25 + + r.get("param_score", 50) * 0.20 + + r.get("family_score", 60) * 0.10 + stab_s * 0.10 - + ss * 0.10 + + ss * 0.05 ) # 汇总 @@ -491,47 +518,78 @@ def main(): # ============ 自愈:检测到死的模型自动替换 ============ def _heal_config(config_path: str, declared: list, label: str) -> bool: - """修复一个配置文件的模型列表,返回是否修改""" - dead_in = [r for r in results if r["model"] in declared and r["stability"] == "dead"] - if not dead_in: - return False + """修复一个配置文件的模型列表,返回是否修改。 - print(f"\n🔧 [{label}] 检测到 {len(dead_in)} 个模型已死亡,正在自愈...") + v2: 除 providers 列表外,还必须检查实际生效的 model.default 字段—— + 之前只修 providers.models 列表,model.default 指向死模型时脚本完全看不见。 + 所有替换前必须通过 _verify_model_usable 真实调用验证。 + """ with open(config_path) as f: cfg = yaml.safe_load(f) - current_models = cfg["providers"]["newapi-local"]["models"] + # ---------- 1. 检查 providers.newapi-local.models 列表 ---------- + current_models = cfg.get("providers", {}).get("newapi-local", {}).get("models", []) changed = False - for dead in dead_in: - if dead["model"] not in current_models: - continue - replacement = None - # 按质量排名选最优替补(高 rank_score 优先) - ranked_candidates = sorted( - [r for r in results if r["model"] in CANDIDATE_POOL - and r["model"] not in current_models - and r["stability"] != "dead"], - key=lambda x: x["rank_score"], reverse=True - ) - if ranked_candidates: - replacement = ranked_candidates[0]["model"] - if not replacement: - print(f" ❌ [{label}] {dead['model']} 已死,但无可用替补") - continue + dead_in = [r for r in results if r["model"] in declared and r["stability"] == "dead"] + if dead_in: + print(f"\n🔧 [{label}] 检测到 {len(dead_in)} 个模型已死亡,正在自愈...") - idx = current_models.index(dead["model"]) - current_models[idx] = replacement - changed = True - print(f" ✅ [{label}] {dead['model']} → {replacement}") + for dead in dead_in: + if dead["model"] not in current_models: + continue + replacement = None + # 按质量排名选最优替补(高 rank_score 优先)且必须通过真实调用验证 + ranked_candidates = sorted( + [r for r in results if r["model"] in CANDIDATE_POOL + and r["model"] not in current_models + and r["stability"] == "stable" + and _verify_model_usable(r["model"])], + key=lambda x: x["rank_score"], reverse=True + ) + if ranked_candidates: + replacement = ranked_candidates[0]["model"] + if not replacement: + print(f" ❌ [{label}] {dead['model']} 已死,但无可用替补") + continue - if cfg["providers"]["newapi-local"].get("default_model") == dead["model"]: - cfg["providers"]["newapi-local"]["default_model"] = replacement - print(f" default_model 同步更新为 {replacement}") + idx = current_models.index(dead["model"]) + current_models[idx] = replacement + changed = True + print(f" ✅ [{label}] {dead['model']} → {replacement}") - if cfg.get("model", {}).get("default") == dead["model"]: - cfg["model"]["default"] = replacement - print(f" model.default 同步更新为 {replacement}") + if cfg.get("providers", {}).get("newapi-local", {}).get("default_model") == dead["model"]: + cfg["providers"]["newapi-local"]["default_model"] = replacement + print(f" default_model 同步更新为 {replacement}") + + if cfg.get("model", {}).get("default") == dead["model"]: + cfg["model"]["default"] = replacement + print(f" model.default 同步更新为 {replacement}") + + # ---------- 2. 检查 model.default 实际生效字段(v2 新增)---------- + # 只有当 model.default 指向 newapi-local 免费模型时才自愈; + # 付费主模型(deepseek-v4-flash 等)绝不自动改。 + model_default = cfg.get("model", {}).get("default") + model_provider = cfg.get("model", {}).get("provider", "") + if model_default and model_provider == "newapi-local": + # 在结果里找它;不在结果里 = 根本没被测试(未知状态),也视为需要修复 + found = next((r for r in results if r["model"] == model_default), None) + is_bad = found is None or found["stability"] != "stable" + if is_bad: + print(f"\n🔧 [{label}] model.default={model_default} 不可用({found['stability'] if found else '未测试'}),正在自愈...") + ranked_candidates = sorted( + [r for r in results if r["model"] in CANDIDATE_POOL + and r["stability"] == "stable" + and _verify_model_usable(r["model"])], + key=lambda x: x["rank_score"], reverse=True + ) + replacement = ranked_candidates[0]["model"] if ranked_candidates else None + if replacement and replacement != model_default: + cfg["model"]["default"] = replacement + cfg["model"]["base_url"] = "http://127.0.0.1:3000/v1" + cfg["model"]["api_key"] = "0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP" + changed = True + print(f" ✅ [{label}] model.default {model_default} → {replacement}") if changed: with open(config_path, "w") as f: @@ -574,7 +632,8 @@ def main(): continue ranked_candidates = sorted( [r for r in results if r["model"] in CANDIDATE_POOL - and r["stability"] != "dead" + and r["stability"] == "stable" + and _verify_model_usable(r["model"]) and not any(m.get("id") == r["model"] for m in models_list)], key=lambda x: x["rank_score"], reverse=True ) @@ -602,9 +661,9 @@ def main(): dead_result = next((r for r in results if r["model"] == raw_model and r["stability"] == "dead"), None) if not dead_result: continue - # 找替补 + # 找替补(必须 stable + 真实调用验证) ranked_candidates = sorted( - [r for r in results if r["stability"] == "stable"], + [r for r in results if r["stability"] == "stable" and _verify_model_usable(r["model"])], key=lambda x: x["rank_score"], reverse=True ) replacement = ranked_candidates[0]["model"] if ranked_candidates else None @@ -617,6 +676,36 @@ def main(): changed = True print(f" ✅ [OpenClaw agent] {raw_model} → {replacement}") + # --- 2.5 修复 agents.list[*].model.fallbacks(v2 新增)--- + for agent in agents_list: + fallbacks = agent.get("model", {}).get("fallbacks", []) + if not fallbacks: + continue + new_fallbacks = [] + fb_changed = False + for fb in fallbacks: + parts = fb.split("/") + raw_model = "/".join(parts[-2:]) if len(parts) >= 2 else parts[-1] + fb_dead = next((r for r in results if r["model"] == raw_model and r["stability"] == "dead"), None) + if not fb_dead: + new_fallbacks.append(fb) + continue + ranked_candidates = sorted( + [r for r in results if r["stability"] == "stable" and _verify_model_usable(r["model"])], + key=lambda x: x["rank_score"], reverse=True + ) + replacement = ranked_candidates[0]["model"] if ranked_candidates else None + if not replacement: + print(f" ❌ [OpenClaw fallback] {raw_model} 已死,无替补") + continue + prefix = fb.split("/")[0] + "/" + new_fallbacks.append(f"{prefix}{replacement}") + fb_changed = True + print(f" ✅ [OpenClaw fallback] {raw_model} → {replacement}") + if fb_changed: + agent["model"]["fallbacks"] = new_fallbacks + changed = True + # --- 3. 修复 agents.defaults.compaction.model --- defaults = cfg.get("agents", {}).get("defaults", {}) comp_model = defaults.get("compaction", {}).get("model", "") @@ -624,7 +713,8 @@ def main(): dead_result = next((r for r in results if r["model"] == comp_model and r["stability"] == "dead"), None) if dead_result: ranked_candidates = sorted( - [r for r in results if r["stability"] == "stable" and r["rank_score"] > 50], + [r for r in results if r["stability"] == "stable" and r["rank_score"] > 50 + and _verify_model_usable(r["model"])], key=lambda x: x["rank_score"], reverse=True ) replacement = ranked_candidates[0]["model"] if ranked_candidates else None @@ -643,45 +733,50 @@ def main(): # ============ 主动升级:新模型排名更高则自动替换 ============ def _auto_promote_config(config_path: str, label: str, n_keep: int = 4) -> bool: - """检查配置中模型列表,如果发现有排名更高的新模型,替换掉最差的""" + """v3: 排名驱动的自动升级。 + 每次巡检检查配置里实际生效的 default_model(newapi-local 的), + 如果排名第一的稳定模型不同且验证通过,就升级。不依赖"新模型/死模型"事件。""" if not os.path.exists(config_path): return False - # 新发现的稳定模型(不在 CANDIDATE_POOL 里的) - new_stable = [r for r in results if r["model"] not in CANDIDATE_POOL - and r["stability"] == "stable" and r["rank_score"] > 0 - and r["model"] not in KNOWN_IGNORE] - if not new_stable: - return False - # 读取当前配置的模型列表 with open(config_path) as f: cfg = yaml.safe_load(f) - current_models = cfg.get("providers", {}).get("newapi-local", {}).get("models", []) - if not current_models: - return False - # 对每个新模型,检查是否超过当前配置中的最低排名模型 + changed = False - for new_r in sorted(new_stable, key=lambda x: x["rank_score"], reverse=True): - # 如果已经存在,跳过 - if new_r["model"] in current_models: - continue - # 找当前配置中排名最低的 - ranked_current = sorted( - [r for r in results if r["model"] in current_models and r["stability"] != "dead"], - key=lambda x: x["rank_score"] - ) - if not ranked_current or len(current_models) < n_keep: - continue - worst = ranked_current[0] - if new_r["rank_score"] > worst["rank_score"]: - idx = current_models.index(worst["model"]) - print(f" ⬆️ [{label}] 升级: {worst['model']}({worst['rank_score']}分) → {new_r['model']}({new_r['rank_score']}分)") - current_models[idx] = new_r["model"] + + # ---------- A. 升级 providers.newapi-local.default_model ---------- + prov = cfg.get("providers", {}).get("newapi-local", {}) + current_default = prov.get("default_model", "") + # 排名第一的稳定模型(必须验证通过) + best_candidates = sorted( + [r for r in results if r["stability"] == "stable" + and _verify_model_usable(r["model"])], + key=lambda x: x["rank_score"], reverse=True + ) + best_model = best_candidates[0]["model"] if best_candidates else None + if best_model and current_default != best_model: + print(f" ⬆️ [{label}] default_model: {current_default or '(空)'} → {best_model} (排名第1)") + prov["default_model"] = best_model + changed = True + + # ---------- B. 升级 model.default(仅当它指向 newapi-local 免费模型)---------- + model_default = cfg.get("model", {}).get("default") + model_provider = cfg.get("model", {}).get("provider", "") + if model_default and model_provider == "newapi-local" and best_model and model_default != best_model: + # 当前模型不可用,或排名落后于第一名 + cur = next((r for r in results if r["model"] == model_default), None) + cur_bad = cur is None or cur["stability"] != "stable" + cur_lower = cur is not None and best_model and best_candidates and cur["rank_score"] < best_candidates[0]["rank_score"] + if cur_bad or cur_lower: + print(f" ⬆️ [{label}] model.default: {model_default} → {best_model} (排名驱动)") + cfg["model"]["default"] = best_model + cfg["model"]["base_url"] = "http://127.0.0.1:3000/v1" + cfg["model"]["api_key"] = "0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP" changed = True + if changed: - cfg["providers"]["newapi-local"]["models"] = current_models with open(config_path, "w") as f: yaml.dump(cfg, f, default_flow_style=False, allow_unicode=True, sort_keys=False) - print(f" ✅ [{label}] 主动升级完成") + print(f" ✅ [{label}] 排名驱动升级完成") return changed _auto_promote_config(CONFIG_PATH, "主配置") diff --git a/soulful/cares-queue.json b/soulful/cares-queue.json index ca0d73b1..b104b58c 100644 --- a/soulful/cares-queue.json +++ b/soulful/cares-queue.json @@ -6,10 +6,12 @@ "context": "", "created_at": "2026-07-09T19:44:52.308215+00:00", "follow_up_date": "2026-07-31", - "status": "pending", + "status": "stale", "reminder_count": 6, "last_reminded": "2026-07-23T16:13:46.254173+00:00", - "tags": [] + "tags": [], + "staled_at": "2026-07-31T17:35:21.830340+00:00", + "stale_reason": "超过14天未处理(创建于2026-07-09)" }, { "id": "27ec4bb6", @@ -17,10 +19,12 @@ "context": "", "created_at": "2026-07-09T19:45:07.031106+00:00", "follow_up_date": "2026-07-31", - "status": "pending", + "status": "stale", "reminder_count": 6, "last_reminded": "2026-07-23T16:13:46.254543+00:00", - "tags": [] + "tags": [], + "staled_at": "2026-07-31T17:35:21.830340+00:00", + "stale_reason": "超过14天未处理(创建于2026-07-09)" }, { "id": "93d680f2", @@ -28,11 +32,13 @@ "context": "", "created_at": "2026-07-09T19:46:37.210399+00:00", "follow_up_date": "2026-07-31", - "status": "pending", + "status": "stale", "reminder_count": 6, "last_reminded": "2026-07-23T16:13:46.254680+00:00", - "tags": [] + "tags": [], + "staled_at": "2026-07-31T17:35:21.830340+00:00", + "stale_reason": "超过14天未处理(创建于2026-07-09)" } ], - "updated_at": "2026-07-23T16:13:46.254699+00:00" + "updated_at": "2026-07-31T17:35:21.830340+00:00" } \ No newline at end of file