Metadata-Version: 2.5
Name: doorcore
Version: 0.2.3
Summary: door-Core v2: a lightweight offline Chinese AI engine with Markov generation and cosine retrieval
Project-URL: Homepage, https://github.com/door-studio/doorcore
Author-email: door 工作室 <doornb666@outlook.com>
License: MIT
Keywords: ai,chatbot,chinese,markov,offline
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
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.9
Description-Content-Type: text/markdown

# doorcore

**door-Core v2 本地 AI 引擎 · 纯标准库 · 零依赖 · 可离线 · 可造你自己的 AI**

`doorcore` 是一个用纯 Python 标准库写成的本地 AI 引擎，不需要联网、不需要显卡、不需要装任何第三方包。装好就能用，还能让你三行代码造一个「专属 AI」。

- 🟢 **离线可用**：模型和数据都在本地，断网也能跑，不把你的对话发到任何服务器
- 🔒 **隐私友好**：知识库是你自己的文件，不上传
- 🪶 **零依赖**：只有 Python 自带模块，装完即用，不吃环境
- 🧩 **可造自己的 AI**：配置人设、外挂知识库、注册自定义本领（工具）、多轮记忆、一键打包分发
- 💬 **中文友好**：支持中文/口语算式计算（`二乘四`、`2的10次方`、`根号2`）、中文知识库检索

> ⚠️ **诚实边界（先说清楚）**：doorcore 的核心是「字符级马尔可夫生成 + 余弦相似检索 + 安全计算器」，不是大模型。它擅长：专属客服、私人知识库问答、人设陪聊、算数、报时。它**不擅长**写长文、写诗、复杂推理——这些交给真大模型更合适。doorcore 的卖点是「离线 / 免费 / 隐私 / 你想怎么改就怎么改」。

---

## 安装

需要 Python 3.8+。

```bash
pip install -U doorcore
```

装好即可 `import doorcore`。

---

# 教程

下面三套写法**可以混用**，挑顺手的来。

---

## 教程一：最简三步（推荐新手 · 老板定制语法）

不用懂类、不用写装饰器，赋值就完事：

```python
import doorcore

doorcore.ai = "店小二"            # ① 建一个 AI（赋值）
doorcore.tell = "我的知识库.txt"   # ② 喂外挂知识库（文件或文件夹路径）
doorcore.think("你们几点开门")     # ③ 问它（自动打印，不用写 print）
```

`think` 会**直接把答案打印出来**。你也写成交互式，想问啥问啥，回车退出：

```python
import doorcore

doorcore.ai = "店小二"
doorcore.tell = "我的知识库.txt"

while True:
    问 = input("想问我什么问题？")
    if 问.strip() == "":
        break
    doorcore.think(问)            # 自动打印答案
```

**工具是可选的**——你不写任何工具，它照样能靠知识库 + 算数 + 报时跑起来。

> 💡 小提示：`think` 还有「赋值式」写法 `doorcore.think = "你们几点开门"`，效果一样（也会打印）。两种都行。

### 外挂知识库怎么写？

新建一个文本文件（比如 `我的知识库.txt`），每行一条：

```
营业时间？===早9晚9哦~
你们店在哪===在北京朝阳区～
退货政策===七天无理由，留好小票就行
```

规则很简单：
- **`问题===答案`** 这样的行 → 一条精准问答（问句里出现「营业时间」就会回「早9晚9哦~」）
- **普通一句话** → 当语料，AI 学它的说话风格
- 支持 `.txt` / `.md`（按行读）/ `.json`（字典 `{"问题": "答案"}`）
- `doorcore.tell = "一个文件夹路径"` 也行，会把这个文件夹里所有 `.txt/.md/.json` 全吃掉

---

## 教程二：造一个更聪明的 AI（人设 / 工具 / 记忆 / 打包）

想让 AI 有名字、有性格、会干你自定义的活，用 `doorcore.build`：

```python
import doorcore

# 1) 建一个 AI，配人设
ai = doorcore.build(
    name="店小二",
    persona="你是淘宝客服，说话简短亲切",
    suffix="~",               # 每句话尾巴自动跟「~」
)

# 2) 现教现学：往知识库加一条 Q===A（立刻生效）
ai.teach("营业时间？", "早9晚9哦~")

# 3) 注册一个本领（工具）：问句命中触发词就自动调用
def 查天气(问句):
    return "北京今天 25 度，晴~"
ai.工具("天气", 查天气)        # 直接把函数传进去，触发器写前面

# 4) 对话（工具会自动分发）
print(ai("你们几点开门"))       # -> 早9晚9哦~（知识库）
print(ai("北京天气咋样"))       # -> 北京今天 25 度，晴~（自动调「查天气」）
print(ai("1加1等于几"))         # -> 1+1 = 2（计算器）
```

工具两种写法都支持（老的 `@装饰器` 写法也保留）：

```python
# 简便写法（推荐）：
ai.工具("天气", 查天气)

# 老写法（仍可用）：
@ai.tool(triggers=["天气", "气温"])
def 查天气(问句):
    return "北京今天 25 度，晴~"
```

工具函数**接收完整问句字符串**，返回 `str` 就作为回复；自己从问句里解析参数。工具报错不会让程序崩，会回一句友好提示。

**多轮记忆**：

```python
ai("我叫小明")
ai("你记得我名字吗", remember=True)   # remember=True 才记到历史里
ai.reset()                            # 清空记忆
```

**一键打包，发给别人 / 下次直接加载**：

```python
ai.save_pack("店小二")                # 写出 config.json + knowledge.txt（+model.pkl）
# 别人拿到目录后：
from doorcore import load_pack
me = load_pack("店小二")
me.load_or_train()
print(me("你们几点开门"))
```

> 注：工具是函数，无法序列化进打包目录，拿到包的人要在自己代码里重新 `@me.tool` / `me.工具(...)` 注册一次。

---

## 教程三：开箱即用 / 多实例

不想配置，直接问：

```python
import doorcore

print(doorcore("1+1等于几"))    # 计算
print(doorcore("雷军是谁"))     # 知识库检索
print(doorcore("讲个笑话"))     # 内置笑话
print(doorcore.ask("你好"))     # 等价的模块级函数
```

想要多个互不干扰的 AI，直接 `new` 实例：

```python
from doorcore import DoorCore

客服 = DoorCore(name="客服")
客服.load_or_train()
客服.teach("营业时间？", "早9晚9哦~")

陪聊 = DoorCore(name="陪聊", suffix="喵")
陪聊.load_or_train()

print(客服("营业时间"))    # -> 早9晚9哦~
print(陪聊("在吗"))        # -> 在的喵
```

---

# 命令行 & API

## 命令行聊天

```bash
doorcore          # 启动交互式聊天（有 GUI 环境会弹图形窗口）
doorcore-api      # 启动 OpenAI 兼容的 API 服务
```

## 接入你自己的客户端（OpenAI 兼容）

`doorcore-api` 默认监听 `http://localhost:8765/v1`，模型名 `door-core`，兼容 `/v1/chat/completions`：

- Base URL: `http://localhost:8765/v1`
- Model: `door-core`
- API Key: 任意填（本地不校验）

任何支持「自定义 OpenAI 兼容模型」的客户端都能直接连。

---

# 常见问题 / 排错

**Q：`module 'doorcore' has no attribute 'think'` 报错？**
A：几乎都是「**命名空间包空壳覆盖了真包**」。最常见场景：你的脚本放在一个名叫 `doorcore` 的文件夹旁边（比如桌面根目录正好有个 `doorcore` 源码文件夹），Python 把那个空文件夹当成 `doorcore` 加载了。
解决办法：① 确认 `pip install -U doorcore` 装的是 0.2.2+；② 把你的脚本放到**独立文件夹**（比如 `doorcore示例/`）里再运行，别和 `doorcore` 同名源码文件夹同级。

**Q：运行没输出？**
A：如果用的是 `print(ai("问题"))` 这种写法，必须有 `print()` 才会显示。用 `doorcore.think("问题")` 则自带打印，不用写 `print`。

**Q：外挂知识库不生效？**
A：检查路径是否正确、文件是否 `UTF-8` 编码；问答行要用 `===` 三个等号连接问题和答案。

**Q：它能联网查资料吗？**
A：不能，doorcore 是纯本地引擎，知识只来自你喂的文件 + 内置语料。需要联网请自己写工具（教程二）去调外部接口。

---

# 许可证

MIT —— 随便用、随便改、随便再发布。

# 链接

- PyPI：https://pypi.org/project/doorcore/
- 由 door 工作室 出品
