init
This commit is contained in:
commit
568b7ec257
9 changed files with 844 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
.env
|
||||||
|
config.toml
|
||||||
|
venv/
|
||||||
|
state/
|
||||||
|
audit.log
|
||||||
|
__pycache__/
|
||||||
487
config.template.toml
Normal file
487
config.template.toml
Normal file
|
|
@ -0,0 +1,487 @@
|
||||||
|
api_key = "API_KEY_PLACEHOLDER"
|
||||||
|
default_provider = "custom:https://llm.lambda.coredump.ru/v1"
|
||||||
|
default_model = "qwen3.5-122b"
|
||||||
|
default_temperature = 0.7
|
||||||
|
provider_timeout_secs = 120
|
||||||
|
model_routes = []
|
||||||
|
embedding_routes = []
|
||||||
|
|
||||||
|
[model_providers]
|
||||||
|
|
||||||
|
[extra_headers]
|
||||||
|
|
||||||
|
[observability]
|
||||||
|
backend = "none"
|
||||||
|
runtime_trace_mode = "none"
|
||||||
|
runtime_trace_path = "state/runtime-trace.jsonl"
|
||||||
|
runtime_trace_max_entries = 200
|
||||||
|
|
||||||
|
[autonomy]
|
||||||
|
level = "full"
|
||||||
|
workspace_only = true
|
||||||
|
allowed_commands = [
|
||||||
|
"git",
|
||||||
|
"npm",
|
||||||
|
"cargo",
|
||||||
|
"ls",
|
||||||
|
"cat",
|
||||||
|
"grep",
|
||||||
|
"find",
|
||||||
|
"echo",
|
||||||
|
"pwd",
|
||||||
|
"wc",
|
||||||
|
"head",
|
||||||
|
"tail",
|
||||||
|
"date",
|
||||||
|
"curl",
|
||||||
|
"wget",
|
||||||
|
]
|
||||||
|
forbidden_paths = [
|
||||||
|
"/etc",
|
||||||
|
"/root",
|
||||||
|
"/home",
|
||||||
|
"/usr",
|
||||||
|
"/bin",
|
||||||
|
"/sbin",
|
||||||
|
"/lib",
|
||||||
|
"/opt",
|
||||||
|
"/boot",
|
||||||
|
"/dev",
|
||||||
|
"/proc",
|
||||||
|
"/sys",
|
||||||
|
"/var",
|
||||||
|
"/tmp",
|
||||||
|
"~/.ssh",
|
||||||
|
"~/.gnupg",
|
||||||
|
"~/.aws",
|
||||||
|
"~/.config",
|
||||||
|
]
|
||||||
|
max_actions_per_hour = 20
|
||||||
|
max_cost_per_day_cents = 500
|
||||||
|
require_approval_for_medium_risk = true
|
||||||
|
block_high_risk_commands = true
|
||||||
|
shell_env_passthrough = []
|
||||||
|
auto_approve = [
|
||||||
|
"file_read",
|
||||||
|
"memory_recall",
|
||||||
|
"http_request",
|
||||||
|
"browser",
|
||||||
|
"web_fetch",
|
||||||
|
"web_search",
|
||||||
|
]
|
||||||
|
always_ask = []
|
||||||
|
allowed_roots = []
|
||||||
|
non_cli_excluded_tools = []
|
||||||
|
|
||||||
|
[security.sandbox]
|
||||||
|
backend = "none"
|
||||||
|
firejail_args = []
|
||||||
|
|
||||||
|
[security.resources]
|
||||||
|
max_memory_mb = 512
|
||||||
|
max_cpu_time_seconds = 60
|
||||||
|
max_subprocesses = 20
|
||||||
|
memory_monitoring = true
|
||||||
|
|
||||||
|
[security.audit]
|
||||||
|
enabled = true
|
||||||
|
log_path = "audit.log"
|
||||||
|
max_size_mb = 100
|
||||||
|
sign_events = false
|
||||||
|
|
||||||
|
[security.otp]
|
||||||
|
enabled = false
|
||||||
|
method = "totp"
|
||||||
|
token_ttl_secs = 30
|
||||||
|
cache_valid_secs = 300
|
||||||
|
gated_actions = [
|
||||||
|
"shell",
|
||||||
|
"file_write",
|
||||||
|
"browser_open",
|
||||||
|
"browser",
|
||||||
|
"memory_forget",
|
||||||
|
]
|
||||||
|
gated_domains = []
|
||||||
|
gated_domain_categories = []
|
||||||
|
|
||||||
|
[security.estop]
|
||||||
|
enabled = false
|
||||||
|
state_file = "~/.zeroclaw/estop-state.json"
|
||||||
|
require_otp_to_resume = true
|
||||||
|
|
||||||
|
[security.nevis]
|
||||||
|
enabled = false
|
||||||
|
instance_url = ""
|
||||||
|
realm = "master"
|
||||||
|
client_id = ""
|
||||||
|
token_validation = "local"
|
||||||
|
role_mapping = []
|
||||||
|
require_mfa = false
|
||||||
|
session_timeout_secs = 3600
|
||||||
|
|
||||||
|
[backup]
|
||||||
|
enabled = true
|
||||||
|
max_keep = 10
|
||||||
|
include_dirs = [
|
||||||
|
"config",
|
||||||
|
"memory",
|
||||||
|
"audit",
|
||||||
|
"knowledge",
|
||||||
|
]
|
||||||
|
destination_dir = "state/backups"
|
||||||
|
compress = true
|
||||||
|
encrypt = false
|
||||||
|
|
||||||
|
[data_retention]
|
||||||
|
enabled = false
|
||||||
|
retention_days = 90
|
||||||
|
dry_run = false
|
||||||
|
categories = []
|
||||||
|
|
||||||
|
[cloud_ops]
|
||||||
|
enabled = false
|
||||||
|
default_cloud = "aws"
|
||||||
|
supported_clouds = [
|
||||||
|
"aws",
|
||||||
|
"azure",
|
||||||
|
"gcp",
|
||||||
|
]
|
||||||
|
iac_tools = ["terraform"]
|
||||||
|
cost_threshold_monthly_usd = 100.0
|
||||||
|
well_architected_frameworks = ["aws-waf"]
|
||||||
|
|
||||||
|
[conversational_ai]
|
||||||
|
enabled = false
|
||||||
|
default_language = "en"
|
||||||
|
supported_languages = [
|
||||||
|
"en",
|
||||||
|
"de",
|
||||||
|
"fr",
|
||||||
|
"it",
|
||||||
|
]
|
||||||
|
auto_detect_language = true
|
||||||
|
escalation_confidence_threshold = 0.3
|
||||||
|
max_conversation_turns = 50
|
||||||
|
conversation_timeout_secs = 1800
|
||||||
|
analytics_enabled = false
|
||||||
|
|
||||||
|
[security_ops]
|
||||||
|
enabled = false
|
||||||
|
playbooks_dir = "~/.zeroclaw/playbooks"
|
||||||
|
auto_triage = false
|
||||||
|
require_approval_for_actions = true
|
||||||
|
max_auto_severity = "low"
|
||||||
|
report_output_dir = "~/.zeroclaw/security-reports"
|
||||||
|
|
||||||
|
[runtime]
|
||||||
|
kind = "native"
|
||||||
|
|
||||||
|
[runtime.docker]
|
||||||
|
image = "alpine:3.20"
|
||||||
|
network = "none"
|
||||||
|
memory_limit_mb = 512
|
||||||
|
cpu_limit = 1.0
|
||||||
|
read_only_rootfs = true
|
||||||
|
mount_workspace = true
|
||||||
|
allowed_workspace_roots = []
|
||||||
|
|
||||||
|
[reliability]
|
||||||
|
provider_retries = 2
|
||||||
|
provider_backoff_ms = 500
|
||||||
|
fallback_providers = []
|
||||||
|
api_keys = []
|
||||||
|
channel_initial_backoff_secs = 2
|
||||||
|
channel_max_backoff_secs = 60
|
||||||
|
scheduler_poll_secs = 15
|
||||||
|
scheduler_retries = 2
|
||||||
|
|
||||||
|
[reliability.model_fallbacks]
|
||||||
|
|
||||||
|
[scheduler]
|
||||||
|
enabled = true
|
||||||
|
max_tasks = 64
|
||||||
|
max_concurrent = 4
|
||||||
|
|
||||||
|
[agent]
|
||||||
|
compact_context = false
|
||||||
|
max_tool_iterations = 20
|
||||||
|
max_history_messages = 50
|
||||||
|
max_context_tokens = 32000
|
||||||
|
parallel_tools = false
|
||||||
|
tool_dispatcher = "auto"
|
||||||
|
tool_call_dedup_exempt = []
|
||||||
|
tool_filter_groups = []
|
||||||
|
|
||||||
|
[skills]
|
||||||
|
open_skills_enabled = true
|
||||||
|
prompt_injection_mode = "full"
|
||||||
|
enabled = ["ege-checker"]
|
||||||
|
|
||||||
|
[query_classification]
|
||||||
|
enabled = false
|
||||||
|
rules = []
|
||||||
|
|
||||||
|
[heartbeat]
|
||||||
|
enabled = true
|
||||||
|
interval_minutes = 30
|
||||||
|
two_phase = false
|
||||||
|
adaptive = true
|
||||||
|
min_interval_minutes = 5
|
||||||
|
max_interval_minutes = 120
|
||||||
|
deadman_timeout_minutes = 0
|
||||||
|
max_run_history = 100
|
||||||
|
|
||||||
|
[cron]
|
||||||
|
enabled = true
|
||||||
|
max_run_history = 50
|
||||||
|
[channels_config]
|
||||||
|
cli = true
|
||||||
|
message_timeout_secs = 300
|
||||||
|
ack_reactions = true
|
||||||
|
show_tool_calls = true
|
||||||
|
session_persistence = true
|
||||||
|
session_backend = "sqlite"
|
||||||
|
session_ttl_hours = 0
|
||||||
|
[channels_config.telegram]
|
||||||
|
bot_token = "TELEGRAM_TOKEN_PLACEHOLDER"
|
||||||
|
stream_mode = "off"
|
||||||
|
allowed_users = ["*"]
|
||||||
|
draft_update_interval_ms = 1000
|
||||||
|
interrupt_on_new_message = false
|
||||||
|
mention_only = false
|
||||||
|
|
||||||
|
[memory]
|
||||||
|
backend = "sqlite"
|
||||||
|
auto_save = true
|
||||||
|
hygiene_enabled = true
|
||||||
|
archive_after_days = 7
|
||||||
|
purge_after_days = 30
|
||||||
|
conversation_retention_days = 30
|
||||||
|
embedding_provider = "none"
|
||||||
|
embedding_model = "text-embedding-3-small"
|
||||||
|
embedding_dimensions = 1536
|
||||||
|
vector_weight = 0.7
|
||||||
|
keyword_weight = 0.3
|
||||||
|
min_relevance_score = 0.4
|
||||||
|
embedding_cache_size = 10000
|
||||||
|
chunk_max_tokens = 512
|
||||||
|
response_cache_enabled = false
|
||||||
|
response_cache_ttl_minutes = 60
|
||||||
|
response_cache_max_entries = 5000
|
||||||
|
response_cache_hot_entries = 256
|
||||||
|
snapshot_enabled = false
|
||||||
|
snapshot_on_hygiene = false
|
||||||
|
auto_hydrate = true
|
||||||
|
|
||||||
|
[memory.qdrant]
|
||||||
|
collection = "zeroclaw_memories"
|
||||||
|
|
||||||
|
[storage.provider.config]
|
||||||
|
provider = ""
|
||||||
|
schema = "public"
|
||||||
|
table = "memories"
|
||||||
|
|
||||||
|
[tunnel]
|
||||||
|
provider = "none"
|
||||||
|
|
||||||
|
[gateway]
|
||||||
|
port = 42617
|
||||||
|
host = "127.0.0.1"
|
||||||
|
require_pairing = true
|
||||||
|
allow_public_bind = false
|
||||||
|
paired_tokens = ["enc2:78a946f8656a7b3aae8634282887e0bde369e156b95ed86570ae4b3c08fa17e69a3cdad4d6a331b4c824c4b0b1870e2ca3b10901ca3d2731cfb82facbda531a3b55c16da7b723d335f89178462a2131f720a95c4de46683209cf0826"]
|
||||||
|
pair_rate_limit_per_minute = 10
|
||||||
|
webhook_rate_limit_per_minute = 60
|
||||||
|
trust_forwarded_headers = false
|
||||||
|
rate_limit_max_keys = 10000
|
||||||
|
idempotency_ttl_secs = 300
|
||||||
|
idempotency_max_keys = 10000
|
||||||
|
|
||||||
|
[composio]
|
||||||
|
enabled = false
|
||||||
|
entity_id = "default"
|
||||||
|
|
||||||
|
[microsoft365]
|
||||||
|
enabled = false
|
||||||
|
auth_flow = "client_credentials"
|
||||||
|
scopes = ["https://graph.microsoft.com/.default"]
|
||||||
|
token_cache_encrypted = true
|
||||||
|
|
||||||
|
[secrets]
|
||||||
|
encrypt = true
|
||||||
|
|
||||||
|
[browser]
|
||||||
|
enabled = true
|
||||||
|
allowed_domains = ["*"]
|
||||||
|
backend = "agent_browser"
|
||||||
|
native_headless = true
|
||||||
|
native_webdriver_url = "http://127.0.0.1:9515"
|
||||||
|
|
||||||
|
[browser.computer_use]
|
||||||
|
endpoint = "http://127.0.0.1:8787/v1/actions"
|
||||||
|
timeout_ms = 15000
|
||||||
|
allow_remote_endpoint = true
|
||||||
|
window_allowlist = []
|
||||||
|
|
||||||
|
[http_request]
|
||||||
|
enabled = true
|
||||||
|
allowed_domains = ["*"]
|
||||||
|
max_response_size = 100000000
|
||||||
|
timeout_secs = 60
|
||||||
|
allow_private_hosts = true
|
||||||
|
|
||||||
|
[multimodal]
|
||||||
|
max_images = 4
|
||||||
|
max_image_size_mb = 5
|
||||||
|
allow_remote_fetch = true
|
||||||
|
|
||||||
|
[web_fetch]
|
||||||
|
enabled = true
|
||||||
|
allowed_domains = ["*"]
|
||||||
|
blocked_domains = []
|
||||||
|
max_response_size = 50000000
|
||||||
|
timeout_secs = 30
|
||||||
|
|
||||||
|
[web_search]
|
||||||
|
enabled = true
|
||||||
|
provider = "duckduckgo"
|
||||||
|
max_results = 25
|
||||||
|
timeout_secs = 30
|
||||||
|
|
||||||
|
[project_intel]
|
||||||
|
enabled = false
|
||||||
|
default_language = "en"
|
||||||
|
report_output_dir = "~/.zeroclaw/project-reports"
|
||||||
|
risk_sensitivity = "medium"
|
||||||
|
include_git_data = true
|
||||||
|
include_jira_data = false
|
||||||
|
|
||||||
|
[proxy]
|
||||||
|
enabled = true
|
||||||
|
no_proxy = ["*"]
|
||||||
|
scope = "zeroclaw"
|
||||||
|
services = []
|
||||||
|
|
||||||
|
[identity]
|
||||||
|
format = "openclaw"
|
||||||
|
|
||||||
|
[cost]
|
||||||
|
enabled = false
|
||||||
|
daily_limit_usd = 10.0
|
||||||
|
monthly_limit_usd = 100.0
|
||||||
|
warn_at_percent = 80
|
||||||
|
allow_override = false
|
||||||
|
|
||||||
|
[cost.prices."anthropic/claude-sonnet-4-20250514"]
|
||||||
|
input = 3.0
|
||||||
|
output = 15.0
|
||||||
|
|
||||||
|
[cost.prices."openai/gpt-4o-mini"]
|
||||||
|
input = 0.15
|
||||||
|
output = 0.6
|
||||||
|
|
||||||
|
[cost.prices."openai/o1-preview"]
|
||||||
|
input = 15.0
|
||||||
|
output = 60.0
|
||||||
|
|
||||||
|
[cost.prices."openai/gpt-4o"]
|
||||||
|
input = 5.0
|
||||||
|
output = 15.0
|
||||||
|
|
||||||
|
[cost.prices."google/gemini-1.5-pro"]
|
||||||
|
input = 1.25
|
||||||
|
output = 5.0
|
||||||
|
|
||||||
|
[cost.prices."anthropic/claude-3-haiku"]
|
||||||
|
input = 0.25
|
||||||
|
output = 1.25
|
||||||
|
|
||||||
|
[cost.prices."anthropic/claude-opus-4-20250514"]
|
||||||
|
input = 15.0
|
||||||
|
output = 75.0
|
||||||
|
|
||||||
|
[cost.prices."google/gemini-2.0-flash"]
|
||||||
|
input = 0.1
|
||||||
|
output = 0.4
|
||||||
|
|
||||||
|
[cost.prices."anthropic/claude-3.5-sonnet"]
|
||||||
|
input = 3.0
|
||||||
|
output = 15.0
|
||||||
|
|
||||||
|
[peripherals]
|
||||||
|
enabled = false
|
||||||
|
boards = []
|
||||||
|
|
||||||
|
[agents]
|
||||||
|
|
||||||
|
[swarms]
|
||||||
|
|
||||||
|
[hooks]
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
[hooks.builtin]
|
||||||
|
command_logger = false
|
||||||
|
|
||||||
|
[hooks.builtin.webhook_audit]
|
||||||
|
enabled = false
|
||||||
|
url = ""
|
||||||
|
tool_patterns = []
|
||||||
|
include_args = false
|
||||||
|
max_args_bytes = 4096
|
||||||
|
|
||||||
|
[hardware]
|
||||||
|
enabled = false
|
||||||
|
transport = "None"
|
||||||
|
baud_rate = 115200
|
||||||
|
workspace_datasheets = false
|
||||||
|
|
||||||
|
[transcription]
|
||||||
|
enabled = false
|
||||||
|
api_url = "https://api.groq.com/openai/v1/audio/transcriptions"
|
||||||
|
model = "whisper-large-v3-turbo"
|
||||||
|
max_duration_secs = 120
|
||||||
|
|
||||||
|
[tts]
|
||||||
|
enabled = false
|
||||||
|
default_provider = "openai"
|
||||||
|
default_voice = "alloy"
|
||||||
|
default_format = "mp3"
|
||||||
|
max_text_length = 4096
|
||||||
|
|
||||||
|
[mcp]
|
||||||
|
enabled = false
|
||||||
|
deferred_loading = true
|
||||||
|
servers = []
|
||||||
|
|
||||||
|
[nodes]
|
||||||
|
enabled = false
|
||||||
|
max_nodes = 16
|
||||||
|
|
||||||
|
[workspace]
|
||||||
|
enabled = false
|
||||||
|
workspaces_dir = "~/.zeroclaw/workspaces"
|
||||||
|
isolate_memory = true
|
||||||
|
isolate_secrets = true
|
||||||
|
isolate_audit = true
|
||||||
|
cross_workspace_search = false
|
||||||
|
|
||||||
|
[notion]
|
||||||
|
enabled = false
|
||||||
|
api_key = ""
|
||||||
|
database_id = ""
|
||||||
|
poll_interval_secs = 5
|
||||||
|
status_property = "Status"
|
||||||
|
input_property = "Input"
|
||||||
|
result_property = "Result"
|
||||||
|
max_concurrent = 4
|
||||||
|
recover_stale = true
|
||||||
|
|
||||||
|
[node_transport]
|
||||||
|
enabled = true
|
||||||
|
shared_secret = ""
|
||||||
|
max_request_age_secs = 300
|
||||||
|
require_https = true
|
||||||
|
allowed_peers = []
|
||||||
|
mutual_tls = false
|
||||||
|
connection_pool_size = 4
|
||||||
|
|
||||||
1
ege-skill
Submodule
1
ege-skill
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 55b4f4360a82e8422aa7def6c6b744719fecd61f
|
||||||
28
setup_config.py
Normal file
28
setup_config.py
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
template_path = Path("config.template.toml")
|
||||||
|
if not template_path.exists():
|
||||||
|
print(" Файл config.template.toml не найден!")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
template = template_path.read_text()
|
||||||
|
|
||||||
|
api_key = os.getenv("ZEROCLAW_API_KEY")
|
||||||
|
tg_token = os.getenv("TELEGRAM_BOT_TOKEN")
|
||||||
|
|
||||||
|
if not api_key or not tg_token:
|
||||||
|
print(" Ошибка: Ключи не найдены в .env файле!")
|
||||||
|
print(f"API_KEY: {'OK' if api_key else 'MISSING'}")
|
||||||
|
print(f"TG_TOKEN: {'OK' if tg_token else 'MISSING'}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
config_ready = template.replace("API_KEY_PLACEHOLDER", api_key)
|
||||||
|
config_ready = config_ready.replace("TELEGRAM_TOKEN_PLACEHOLDER", tg_token)
|
||||||
|
|
||||||
|
Path("config.toml").write_text(config_ready)
|
||||||
|
print("config.toml готов! Ключи подставлены.")
|
||||||
119
skills/ege-checker/SKILL.md
Normal file
119
skills/ege-checker/SKILL.md
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
---
|
||||||
|
name: ege-checker
|
||||||
|
description: >
|
||||||
|
Проверка заданий ЕГЭ с выставлением баллов по официальным критериям ФИПИ.
|
||||||
|
Используй этот скилл когда пользователь:
|
||||||
|
- Загружает фото/скан рукописного сочинения ЕГЭ по русскому языку
|
||||||
|
- Просит проверить сочинение ЕГЭ, выставить баллы, оценить работу
|
||||||
|
- Загружает аудиозапись или текст ответов по разделу "Аудирование" ЕГЭ по английскому
|
||||||
|
- Упоминает "ЕГЭ", "сочинение", "критерии К1-К10", "аудирование английский"
|
||||||
|
- Просит разобрать ошибки в сочинении по критериям ФИПИ
|
||||||
|
Скилл умеет: OCR рукописного текста через vision, оценку по критериям, подробные комментарии.
|
||||||
|
---
|
||||||
|
|
||||||
|
# ЕГЭ-Checker
|
||||||
|
|
||||||
|
## Обзор возможностей
|
||||||
|
|
||||||
|
| Модуль | Статус | Вход | Выход |
|
||||||
|
|--------|--------|------|-------|
|
||||||
|
| Сочинение (русский) | ✅ MVP | Фото рукописи или текст | Баллы К1–К10 + комментарии |
|
||||||
|
| Аудирование (английский) | 🔜 в разработке | Аудиофайл + бланк ответов | Баллы по заданиям |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Модуль 1: Сочинение ЕГЭ по русскому языку
|
||||||
|
|
||||||
|
### Шаг 1 — Получить текст сочинения
|
||||||
|
|
||||||
|
**Если загружено фото/скан:**
|
||||||
|
1. Внимательно рассмотри изображение
|
||||||
|
2. Распознай рукописный текст максимально точно
|
||||||
|
3. Выведи распознанный текст пользователю и попроси подтвердить: *"Вот что я распознал. Если есть неточности — поправьте перед проверкой."*
|
||||||
|
4. Дождись подтверждения или правок
|
||||||
|
|
||||||
|
**Если текст вставлен напрямую:**
|
||||||
|
Переходи к Шагу 2 без распознавания.
|
||||||
|
|
||||||
|
### Шаг 2 — Загрузить критерии
|
||||||
|
|
||||||
|
Прочитай файл `references/russian-essay-criteria.md` — там полные критерии К1–К10 с баллами и примерами.
|
||||||
|
|
||||||
|
### Шаг 3 — Оценить по каждому критерию
|
||||||
|
|
||||||
|
Пройдись по всем критериям К1–К10 **последовательно**. Для каждого:
|
||||||
|
- Процитируй конкретный фрагмент из сочинения (если уместно)
|
||||||
|
- Объясни своё решение
|
||||||
|
- Выставь балл
|
||||||
|
|
||||||
|
**Важные правила:**
|
||||||
|
- Если К1 = 0 (нет формулировки проблемы) → К2, К3, К4 автоматически = 0
|
||||||
|
- Если работа ≤ 70 слов → все баллы = 0, только К10 может быть ненулевым
|
||||||
|
- Считай слова перед проверкой (служебные части речи считаются)
|
||||||
|
|
||||||
|
### Шаг 4 — Итоговый вывод
|
||||||
|
|
||||||
|
Используй этот формат вывода:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Результаты проверки сочинения ЕГЭ
|
||||||
|
|
||||||
|
### Распознанный текст
|
||||||
|
[текст если было фото, иначе пропусти]
|
||||||
|
|
||||||
|
### Количество слов: XX
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Оценка по критериям
|
||||||
|
|
||||||
|
| Критерий | Название | Балл | Макс |
|
||||||
|
|----------|----------|------|------|
|
||||||
|
| К1 | Формулировка проблем исходного текста | X | 1 |
|
||||||
|
| К2 | Комментарий к проблеме | X | 3 |
|
||||||
|
| К3 | Отражение позиции автора | X | 2 |
|
||||||
|
| К4 | Отношение к позиции автора | X | 1 |
|
||||||
|
| К5 | Смысловая цельность, связность | X | 2 |
|
||||||
|
| К6 | Точность и выразительность речи | X | 1 |
|
||||||
|
| К7 | Орфография | X | 3 |
|
||||||
|
| К8 | Пунктуация | X | 3 |
|
||||||
|
| К9 | Языковые нормы | X | 3 |
|
||||||
|
| К10 | Речевые нормы | X | 3 |
|
||||||
|
| **ИТОГО** | | **XX** | **22** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Подробные комментарии
|
||||||
|
|
||||||
|
**К1 — [балл/1]**
|
||||||
|
[объяснение]
|
||||||
|
|
||||||
|
**К2 — [балл/3]**
|
||||||
|
[объяснение с цитатами из текста]
|
||||||
|
|
||||||
|
... и так далее по каждому критерию ...
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Главные рекомендации
|
||||||
|
1. [самое важное для улучшения]
|
||||||
|
2. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Модуль 2: Аудирование ЕГЭ по английскому (в разработке)
|
||||||
|
|
||||||
|
Этот модуль требует STT (Speech-to-Text) для обработки аудио.
|
||||||
|
Пока недоступен. При запросе — сообщи пользователю и предложи ввести ответы текстом вручную.
|
||||||
|
|
||||||
|
Когда будет реализован: читай `references/english-listening-criteria.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Общие принципы проверки
|
||||||
|
|
||||||
|
- **Актуальность**: Критерии соответствуют демоверсии ФИПИ 2024–2025
|
||||||
|
- **Строгость**: Придерживайся формулировок критериев, не занижай и не завышай
|
||||||
|
- **Пограничные случаи**: При сомнении между баллами — объясни оба варианта и выбери более обоснованный
|
||||||
|
- **Тон**: Конструктивный, поддерживающий. Это учебный инструмент, не карательный
|
||||||
BIN
skills/ege-checker/ege-checker.skill
Normal file
BIN
skills/ege-checker/ege-checker.skill
Normal file
Binary file not shown.
2
skills/ege-checker/env.example
Normal file
2
skills/ege-checker/env.example
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
ZEROCLAW_API_KEY=
|
||||||
|
TELEGRAM_BOT_TOKEN=
|
||||||
30
skills/ege-checker/references/english-listening-criteria.md
Normal file
30
skills/ege-checker/references/english-listening-criteria.md
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
# Критерии оценивания раздела "Аудирование" ЕГЭ по английскому языку
|
||||||
|
## Статус: заглушка — будет заполнено в следующей итерации
|
||||||
|
|
||||||
|
### Структура раздела (ЕГЭ 2024–2025)
|
||||||
|
|
||||||
|
**Задание 1** (B1) — установление соответствия: 6 высказываний → 7 утверждений
|
||||||
|
- 1 балл за каждое верное соответствие
|
||||||
|
- Максимум: 6 баллов
|
||||||
|
|
||||||
|
**Задания 2–9** (B2) — верно/неверно/не сказано (True/False/Not Stated)
|
||||||
|
- 1 балл за каждый верный ответ
|
||||||
|
- Максимум: 8 баллов
|
||||||
|
|
||||||
|
**Задания 10–18** — краткий ответ/выбор из нескольких вариантов
|
||||||
|
- 1 балл за каждый верный ответ
|
||||||
|
- Максимум: 9 баллов
|
||||||
|
|
||||||
|
**Итого по разделу "Аудирование": 20 первичных баллов**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## STT интеграция (планируется)
|
||||||
|
|
||||||
|
Для обработки аудиозаписей потребуется:
|
||||||
|
- OpenAI Whisper API (рекомендуется для русской и английской речи)
|
||||||
|
- Или Deepgram (альтернатива)
|
||||||
|
- Эндпоинт: `https://api.openai.com/v1/audio/transcriptions`
|
||||||
|
- Модель: `whisper-1`
|
||||||
|
|
||||||
|
Временное решение для MVP: попросить пользователя ввести ответы текстом.
|
||||||
171
skills/ege-checker/references/russian-essay-criteria.md
Normal file
171
skills/ege-checker/references/russian-essay-criteria.md
Normal file
|
|
@ -0,0 +1,171 @@
|
||||||
|
# Критерии оценивания сочинения ЕГЭ по русскому языку
|
||||||
|
## Источник: ФИПИ, демоверсия 2026
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Предварительные проверки
|
||||||
|
|
||||||
|
### Подсчёт слов
|
||||||
|
- Считаются все слова, включая служебные (предлоги, союзы, частицы)
|
||||||
|
- Рекомендуемый объём: **150–300 слов**
|
||||||
|
1. **Минимальный порог**: Если в сочинении **149 слов или менее** — работа оценивается **0 баллов** по всем критериям (К1–К10). Задание считается невыполненым.
|
||||||
|
2. **Метод подсчета**:
|
||||||
|
- Считаются самостоятельные и служебные части речи.
|
||||||
|
- Слова через дефис (всё-таки, по-моему) = **1 слово**.
|
||||||
|
- Инициалы с фамилией (А.С. Пушкин) = **1 слово**.
|
||||||
|
- Цифры (5 лет, 2026 год) = **не учитываются**. Числительные словами (пять лет) = **считаются**.
|
||||||
|
- Информация об авторе текста (биография из задания) = **не учитывается**.
|
||||||
|
3. **Самостоятельность**: Если текст — это просто пересказ или переписанный исходник без комментариев — **0 баллов**.
|
||||||
|
|
||||||
|
|
||||||
|
### Правило нулевого К1
|
||||||
|
Если К1 = 0 (проблема не сформулирована или сформулирована неверно):
|
||||||
|
→ К2 = 0, К3 = 0, К4 = 0 **автоматически**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К1 — Формулировка проблем исходного текста (0–1 балл)(Отражение позицииавтора (рассказчика) по указанной проблеме исходного текста)
|
||||||
|
|
||||||
|
**1 балл**: Позиция автора (рассказчика) по указанной проблеме исходного текста сформулирована верно
|
||||||
|
|
||||||
|
**0 баллов**: Позиция автора (рассказчика) по указанной проблеме исходного текста не сформулирована или сформулирована неверно.
|
||||||
|
|
||||||
|
**Подсказки для проверки:**
|
||||||
|
- Проблема должна быть сформулирована как вопрос или тезис
|
||||||
|
- Она должна соответствовать содержанию исходного текста
|
||||||
|
- Допустимы разные формулировки одной и той же проблемы
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К2 — Комментарий к сформулированной проблеме исходного текста (0–3 балла)
|
||||||
|
|
||||||
|
Структура: **2 примера-иллюстрации** из текста + **смысловая связь** между ними.
|
||||||
|
|
||||||
|
- **3б**: Приведено 2 примера-иллюстрации + пояснение к КАЖДОМУ + указана и ПОЯСНЕНА смысловая связь.
|
||||||
|
- **2б**: 2 примера + 2 пояснения, но связь не указана / не пояснена / пояснена неверно.
|
||||||
|
- **1б**: Приведен и пояснен только 1 пример.
|
||||||
|
- **0б**: Пересказ, цитирование без комментария или отсутствие опоры на текст.
|
||||||
|
|
||||||
|
**Важно:**
|
||||||
|
- Пример-иллюстрация = конкретный фрагмент/факт из текста с объяснением его роли
|
||||||
|
- Смысловая связь: сравнение, противопоставление, причина-следствие, вывод и т.д.
|
||||||
|
- Пересказ без анализа = 0 баллов
|
||||||
|
- Фактические ошибки в комментарии снижают балл (−1 за каждую, но не более −2)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К3 — Собственное отношение к позиции автора (рассказчика) по указанной проблеме исходного текста (0–2 балла)
|
||||||
|
|
||||||
|
- **2б**: Отношение сформулировано, обосновано и ПРИВЕДЕН пример-аргумент.
|
||||||
|
- **1б**: Отношение сформулировано и обосновано, но БЕЗ примера-аргумента.
|
||||||
|
- **0б**: Только формальное "Я согласен".
|
||||||
|
- **ЗАПРЕТ на источники**: Комиксы, аниме, манга, фанфики, граф. романы, компьютерные игры — **не засчитываются** как аргумент. Только жизненный, читательский или историко-культурный опыт.
|
||||||
|
|
||||||
|
**Подсказки:**
|
||||||
|
- Источником для примера-аргумента служит читательский, историко-культурный или жизненный опыт.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К4 — Фактическая точность речи(0-1 балл)
|
||||||
|
|
||||||
|
- **1б**: Ошибок нет.
|
||||||
|
- **0б**: 1 и более ошибок.
|
||||||
|
|
||||||
|
**Фактические ошибки:**
|
||||||
|
- Неверные имена, даты, названия произведений
|
||||||
|
- Искажение содержания упомянутых текстов
|
||||||
|
- Неверные факты о реальных событиях/людях
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### К5 — Логичность речи (0–2 балла)
|
||||||
|
- **2б**: Ошибок нет.
|
||||||
|
- **1б**: 1-2 ошибки.
|
||||||
|
- **0б**: 3+ ошибки.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### К6 — Этические нормы (0–1 балл)
|
||||||
|
- **1б**: Ошибок нет.
|
||||||
|
- **0б**: Нарушение норм, агрессия, нецензурная брань.
|
||||||
|
**Этические ошибки:**
|
||||||
|
- Грубость, оскорбления в адрес кого-либо
|
||||||
|
- Национальная/религиозная нетерпимость
|
||||||
|
- Речевая агрессия
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К7 — Соблюдение орфографических норм (0–3 балла)
|
||||||
|
|
||||||
|
| Баллы | Количество ошибок |
|
||||||
|
|-------|-------------------|
|
||||||
|
| 3 | 0 ошибок |
|
||||||
|
| 2 | 1-2 ошибка |
|
||||||
|
| 1 | 3-4 ошибки |
|
||||||
|
| 0 | 5+ ошибки |
|
||||||
|
|
||||||
|
**Что считается ошибкой:**
|
||||||
|
- Неверное написание слова
|
||||||
|
- Слитное/раздельное/дефисное написание
|
||||||
|
- Прописные/строчные буквы
|
||||||
|
|
||||||
|
**Что НЕ считается ошибкой:**
|
||||||
|
- Описки (если исправлены)
|
||||||
|
- Перенос слова
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К8 — Соблюдение пунктуационных норм (0–3 балла)
|
||||||
|
|
||||||
|
| Баллы | Количество ошибок |
|
||||||
|
|-------|-------------------|
|
||||||
|
| 3 | 0 ошибок |
|
||||||
|
| 2 | 1–2 ошибки |
|
||||||
|
| 1 | 3–4 ошибки |
|
||||||
|
| 0 | 5+ ошибок |
|
||||||
|
|
||||||
|
**Типичные ошибки:**
|
||||||
|
- Пропуск запятой при однородных членах
|
||||||
|
- Ошибки в сложных предложениях
|
||||||
|
- Неверное оформление прямой речи
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К9 — Соблюдение языковых норм (грамматика) (0–3 балла)
|
||||||
|
|
||||||
|
| Баллы | Количество ошибок |
|
||||||
|
|-------|-------------------|
|
||||||
|
| 3 | 0 ошибок |
|
||||||
|
| 2 | 1-2 ошибок |
|
||||||
|
| 1 | 3-4 ошибки |
|
||||||
|
| 0 | 5+ ошибки |
|
||||||
|
|
||||||
|
**Типичные грамматические ошибки:**
|
||||||
|
- Ошибки в согласовании (управлении)
|
||||||
|
- Неправильное образование форм слова
|
||||||
|
- Нарушение синтаксических норм
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## К10 — Соблюдение речевых норм (0–3 балла)
|
||||||
|
|
||||||
|
| Баллы | Количество ошибок |
|
||||||
|
|-------|-------------------|
|
||||||
|
| 3 | 0 ошибок |
|
||||||
|
| 2 | 1-2 ошибок |
|
||||||
|
| 1 | 3-4 ошибки |
|
||||||
|
| 0 | 5+ ошибки |
|
||||||
|
|
||||||
|
**Типичные речевые ошибки:**
|
||||||
|
- Тавтология (повтор одного слова/однокоренных слов)
|
||||||
|
- Плеоназм (масло масляное)
|
||||||
|
- Неуместное употребление слова
|
||||||
|
- Употребление слова в несвойственном значении
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Таблица максимальных баллов
|
||||||
|
|
||||||
|
| К1 | К2 | К3 | К4 | К5 | К6 | К7 | К8 | К9 | К10 | Итого |
|
||||||
|
|----|----|----|----|----|----|----|----|----|-----|-------|
|
||||||
|
| 1 | 3 | 2 | 1 | 2 | 1 | 3 | 3 | 3 | 3 | **22**|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue