just migrate
# Or manually
uv run alembic upgrade head
5.启动开发服务器
just dev
# Or manually
uv run uvicorn app.main:app --reload --port 8001
服务器将在以下时间可用 http://localhost:8001.
API终点
API版本
API标准基本路径: /v1
向后兼容性:现有的未版本化端点目前仍然可用。
兼容性策略:
可以添加新的非中断功能 /v1.
重大更改需要新版本(例如, /v2).
未指定的路由被认为是兼容性别名,在未来的主要版本中可能会被弃用。
认证
方法
端点
描述
职位
/auth/register
注册新用户
职位
/auth/login
登录并获取JWT代币
职位
/auth/refresh
刷新访问令牌
得到
/auth/me
获取当前用户配置文件
拱顶
方法
端点
描述
得到
/vaults
列出所有保险库
职位
/vaults
创建vault
得到
/vaults/{slug}
获取保险库
删除
/vaults/{slug}
删除vault
职位
/vaults/{slug}/ingest
上传ZIP
得到
/vaults/{slug}/export
下载ZIP
文件
方法
端点
描述
得到
/vaults/{slug}/documents
列出文件
职位
/vaults/{slug}/documents
创建文档
得到
/vaults/{slug}/documents/{id}
获取文档
补丁
/vaults/{slug}/documents/{id}
更新文档
删除
/vaults/{slug}/documents/{id}
删除文档
链接
方法
端点
描述
得到
/vaults/{slug}/documents/{id}/links/outgoing
获取外发链接
得到
/vaults/{slug}/documents/{id}/links/incoming
获取反向链接
搜索
方法
端点
描述
职位
/vaults/{slug}/search/semantic
语义搜索(需要嵌入)
得到
/vaults/{slug}/search/fulltext
全文搜索
图
方法
端点
描述
得到
/vaults/{slug}/graph/connections/{id}
获取文档连接
得到
/vaults/{slug}/graph/hubs
获取连接最多的文档
得到
/vaults/{slug}/graph/orphans
获取没有连接的文档
得到
/vaults/{slug}/graph/path
获取文档之间的最短路径
表(结构化数据)
方法
端点
描述
得到
/vaults/{slug}/tables
列出所有表格
职位
/vaults/{slug}/tables
使用架构创建表
得到
/vaults/{slug}/tables/{table}
获取表架构
补丁
/vaults/{slug}/tables/{table}
更新表格
删除
/vaults/{slug}/tables/{table}
删除表(级联行)
表格行
方法
端点
描述
得到
/vaults/{slug}/tables/{table}/rows
列出行(带筛选器)
职位
/vaults/{slug}/tables/{table}/rows
创建行
得到
/vaults/{slug}/tables/{table}/rows/{id}
获取行
补丁
/vaults/{slug}/tables/{table}/rows/{id}
更新行
删除
/vaults/{slug}/tables/{table}/rows/{id}
删除行
CSV导入/导出
方法
端点
描述
职位
/vaults/{slug}/tables/import/csv
将CSV导入为新表
职位
/vaults/{slug}/tables/{table}/import/csv
将CSV附加到表中
得到
/vaults/{slug}/tables/{table}/export/csv
将表格导出为CSV
文档表查询
方法
端点
描述
得到
/vaults/{slug}/documents/{id}/tables
获取文档引用的表
得到
/vaults/{slug}/tables/{table}/documents
获取文档引用表
职位
/vaults/{slug}/documents/{id}/query
执行数据视图样式查询
行筛选查询参数
?filter[column]=value # Equality
?filter[column][gt]=value # Greater than
?filter[column][lt]=value # Less than
?filter[column][like]=pattern # LIKE match
?sort=column&order=asc|desc # Sorting
?limit=50&offset=0 # Pagination
?q=search_term # Full-text search
数据视图查询语法
TABLE name, email FROM Contacts WHERE status = 'active' SORT name ASC LIMIT 10
支持条款:
TABLE col1, col2 FROM table_name -选择列
WHERE column = value -过滤器(=,!=,>,<,LIKE,IN)
SORT column ASC|DESC -订购
LIMIT n -限制结果
结构化数据列类型
表支持丰富的列类型:
类型
描述
示例
text
字符串值
"Hello World"
number
整数或浮点数
42, 3.14
boolean
正确/错误
true
date
仅限日期
"2024-01-15"
datetime
日期和时间
"2024-01-15T10:30:00Z"
json
嵌套对象
{"key": "value"}
array
值列表
["a", "b", "c"]
reference
FK到另一张桌子
"uuid-of-row"
document
链接到vault文档
"uuid-of-document"
computed
基于公式(已存储)
"=price * quantity"
richtext
Markdown内容
"# Heading\n\nParagraph"
文档表链接语法
文档可以使用扩展的wiki链接语法引用表:
# Project Notes
See all contacts: [[table:Contacts]]
Specific contact: [[row:Contacts/550e8400-e29b-41d4-a716-446655440000]]
## Embedded Query
```dataview
TABLE name, email FROM Contacts WHERE status = "active"
## Configuration
| Variable | Default | Description |
|----------|---------|-------------|
| `DATABASE_URL` | `postgresql+asyncpg://...` | PostgreSQL connection string (async) |
| `OPENAI_API_KEY` | - | OpenAI API key for embeddings (required for semantic search) |
| `JWT_SECRET` | `change-me-in-production` | Secret key for JWT tokens (change in production) |
| `JWT_ALGORITHM` | `HS256` | JWT signing algorithm |
| `ACCESS_TOKEN_EXPIRE_MINUTES` | `60` | Access token expiry in minutes |
| `REFRESH_TOKEN_EXPIRE_DAYS` | `7` | Refresh token expiry in days |
| `EMBEDDING_MODEL` | `text-embedding-ada-002` | OpenAI embedding model |
| `EMBEDDING_DIMENSIONS` | `1536` | Embedding vector dimensions |
| `LOG_LEVEL` | `INFO` | Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
| `DEBUG` | `False` | Enable debug mode |
| `STORAGE_PATH` | `./storage` | Path for file storage |
| `RATE_LIMIT_ENABLED` | `True` | Enable rate limiting |
| `CHUNK_SIZE` | `500` | Tokens per embedding chunk |
| `CHUNK_OVERLAP` | `50` | Token overlap between chunks |
## MCP Tools
The server exposes MCP tools for AI agent integration via the Model Context Protocol.
```mermaid
graph LR
subgraph "AI Agent"
LLM[LLM]
end
subgraph "MCP Server"
Tools[MCP Tools]
end
subgraph "Capabilities"
Docs[Documents]
Search[Search]
Graph[Graph]
Tables[Tables]
end
LLM <-->|MCP Protocol| Tools
Tools --> Docs
Tools --> Search
Tools --> Graph
Tools --> Tables
erDiagram
users ||--o{ vaults : owns
vaults ||--o{ documents : contains
vaults ||--o{ folders : contains
vaults ||--o{ tags : contains
vaults ||--o{ data_tables : contains
documents ||--o{ document_links : has
documents ||--o{ document_tags : has
documents ||--o{ embedding_chunks : has
documents ||--o{ document_table_links : references
data_tables ||--o{ table_rows : contains
data_tables ||--o{ table_relationships : has
data_tables ||--o{ document_table_links : referenced_by
users {
uuid id PK
string email UK
string password_hash
string display_name
boolean is_active
}
vaults {
uuid id PK
uuid user_id FK
string name
string slug UK
int document_count
}
documents {
uuid id PK
uuid vault_id FK
uuid folder_id FK
string title
string path
text content
jsonb frontmatter
}
data_tables {
uuid id PK
uuid vault_id FK
string name
string slug
jsonb schema
int row_count
}
table_rows {
uuid id PK
uuid table_id FK
uuid vault_id FK
jsonb data
}
核心表
users -具有JWT身份验证的用户帐户
vaults -黑曜石拱顶(每位用户)
documents -带元数据的Markdown文档
folders -文件夹层次结构
document_links -文档之间的Wiki链接
tags -分层标签
document_tags -文档标签关联
结构化数据表
data_tables -JSONB模式的表定义
table_rows -JSONB存储的行数据(GIN索引)
table_relationships -表之间的外键定义
document_table_links -从文档到表/行的链接
扩展
embedding_chunks -用于语义搜索的pgvector嵌入
obsidian_graph -用于关系查询的Apache AGE图
测试
该项目具有全面的测试覆盖范围:
测试套件
描述
单元测试(域)
实体验证、值对象、域服务
单元测试(应用程序)
用例、DTO、业务逻辑
单元测试(基础设施)
存储库、适配器、MCP工具
BDD场景
使用Gherkin语法的特征驱动测试
API测试
REST端点集成测试
集成测试
全栈数据库
总计:433次测试
# Run all tests
just test
# Run with coverage
just test-cov
# Run specific test suite
uv run pytest tests/unit -v
uv run pytest tests/api -v
uv run pytest tests/bdd -v