Metadata-Version: 2.4
Name: eracore
Version: 0.3.0
Summary: NN-фреймворк + AI-инструменты (search/brain/file) + Agent + CLI
Author-email: eraAI <contact@eraai.dev>
License: MIT
Project-URL: Homepage, https://github.com/ph1ncyn/eracore
Project-URL: Repository, https://github.com/ph1ncyn/eracore
Keywords: neural networks,ai,agent,llm,search,cli,eraai
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: numpy>=1.20.0
Requires-Dist: requests>=2.28
Requires-Dist: beautifulsoup4>=4.12
Provides-Extra: llamacpp
Requires-Dist: llama-cpp-python>=0.2.0; extra == "llamacpp"
Provides-Extra: pdf
Requires-Dist: pdfminer.six>=20221105; extra == "pdf"
Provides-Extra: docx
Requires-Dist: python-docx>=1.0; extra == "docx"
Provides-Extra: xlsx
Requires-Dist: openpyxl>=3.1; extra == "xlsx"
Provides-Extra: all
Requires-Dist: llama-cpp-python>=0.2.0; extra == "all"
Requires-Dist: pdfminer.six>=20221105; extra == "all"
Requires-Dist: python-docx>=1.0; extra == "all"
Requires-Dist: openpyxl>=3.1; extra == "all"
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
Requires-Dist: black>=22.0; extra == "dev"

# eraCore

NN-фреймворк на NumPy + AI-инструменты + Agent + CLI.

## Установка

```bash
pip install -e .          # из исходников
pip install -e ".[all]"   # + llama_cpp, pdf, docx, xlsx
```

После установки доступна команда `era`.

---

## CLI — `era`

Интерактивный AI-агент в терминале (по духу: claude code / gemini cli).

```bash
# Интерактивный чат
era

# Одиночный вопрос
era "Что такое backpropagation?"

# Режим
era --mode coder "Пример Dense-слоя на Python"
era --mode expert "Объясни градиентный спуск"

# Вопрос про файл
era --file model.py "Что делает этот файл?"
era --file data.csv "Сколько строк и какие колонки?"

# С Ollama (нужен запущенный ollama)
era --ollama --model qwen2.5:3b "Привет"
era --ollama --model llama3.2 --port 11434

# OpenAI-совместимый endpoint (LM Studio, OpenAI, etc.)
era --llm-url http://localhost:1234/v1 --model mistral "Вопрос"

# Локальный GGUF через llama_cpp
era --gguf ./models/qwen-3b.gguf "Вопрос"

# Без стриминга
era --no-stream "Вопрос"
```

### Команды внутри чата

| Команда | Описание |
|---|---|
| `/help` | Список команд |
| `/mode coder` | Сменить режим |
| `/modes` | Доступные режимы |
| `/clear` | Очистить контекст сессии |
| `/memory` | Статистика памяти и кэша |
| `/file path.py что делает?` | Спросить про файл |
| `/exit` | Выйти |

---

## AI Tools

### eraai.search
```python
from eraCore.tools import search

results = search.run("Python asyncio")            # одиночный поиск
results = search.multi(["запрос 1", "запрос 2"]) # параллельный
context = search.context("тема", max_chars=1500) # текст для LLM
```

### eraai.brain
```python
from eraCore.tools import brain

brain.remember("что такое relu", "max(0, x)")
answer = brain.recall("что такое relu?")    # difflib, порог 0.82

brain.push("user", "Привет!")
brain.push("assistant", "Привет!")
ctx = brain.context_text(last_n=6)

print(brain.stats())
brain.forget("что такое relu")
brain.clear_knowledge()
brain.clear_context()
```

### eraai.file
```python
from eraCore.tools import file as efile

text  = efile.read("report.txt")
data  = efile.read_json("config.json")
rows  = efile.read_csv("data.csv")
lines = efile.read_lines("log.txt")

efile.write("output.txt", "Hello!")
efile.write_json("result.json", {"ok": True})
efile.append("log.txt", "\nновая строка")

info  = efile.info("file.py")     # name, size_kb, type, lines
files = efile.list(".", pattern="*.py", recursive=True)
efile.delete("temp.txt")
```

---

## Agent

```python
import asyncio
from eraCore import Agent
from eraCore.config import AgentConfig

# Без LLM — поиск + кэш
agent = Agent()

# С Ollama
agent = Agent(config=AgentConfig(
    llm_url="http://localhost:11434/v1",
    llm_model="qwen2.5:3b",
))

# С локальным GGUF
agent = Agent(config=AgentConfig(llm_path="./models/qwen-3b.gguf"))

async def main():
    # Вопрос
    answer = await agent.ask("Что такое градиентный спуск?")

    # Режим
    answer = await agent.ask("Пример кода", mode="coder")
    answer = await agent.ask("Глубокий анализ", mode="expert")

    # Стриминг
    async for chunk in await agent.ask("Привет", stream=True):
        print(chunk, end="", flush=True)

    # Файл
    answer = await agent.ask_file("data.csv", "Что за данные?")

    # Свой режим
    async def translator(question: str, stream: bool = False) -> str:
        return f"[перевод] {question}"
    agent.add_mode("translate", translator)

    # Подключить LLM после создания
    agent.set_llm(url="http://localhost:11434/v1", model="qwen2.5:3b")

    print(agent.stats())

asyncio.run(main())
```

---

## LLM

```python
from eraCore.llm import LLM

# Ollama / OpenAI-совместимый
llm = LLM(url="http://localhost:11434/v1", model="qwen2.5:3b")

# llama_cpp (GGUF)
llm = LLM(path="./models/qwen-3b.gguf")

# Mock (для тестов)
llm = LLM()

answer = llm.generate("Вопрос")
for chunk in llm.stream("Вопрос"): print(chunk, end="")

# Async
answer = await llm.agenerate("Вопрос")
async for chunk in llm.astream("Вопрос"): print(chunk, end="")
```

---

## Neural Network

```python
from eraCore import Model, Dense, ReLU, Softmax
import numpy as np

model = Model([
    Dense(784, 256), ReLU(),
    Dense(256, 128), ReLU(),
    Dense(128, 10),  Softmax(),
])
model.compile(optimizer="adam", loss="crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=10, batch_size=32)
loss, acc = model.evaluate(x_test, y_test)
preds = model.predict(x_test)
```

**Слои:** Dense, Conv2D, MaxPool2D, Flatten, Dropout  
**Активации:** ReLU, Sigmoid, Tanh, Softmax, LeakyReLU, ELU  
**Оптимизаторы:** Adam, SGD, RMSprop, Adagrad  
**Потери:** CrossEntropy, MSE, BinaryCrossEntropy, MAE, HuberLoss

---

## CI

```bash
python demo_ci.py
```

---

## Лицензия

MIT
