🚀 LingKong AI API
基于 Gemma 3N 的本地推理 API,完全兼容 Google Gemini 3 Pro Preview 格式,支持端到端加密通信。
🔒
端到端加密
ChaCha20-Poly1305 + X25519 ECDH,消息全程加密传输
⚡
本地推理
基于 llama.cpp,GPU 加速,零网络延迟
📷
多模态支持
支持图像理解和音频转录,视觉+听觉双模态
🧠
思考模式
支持 thinkingLevel 配置,模拟深度推理
💡
API 兼容性
本 API 完全兼容 Google Gemini API 格式,现有 Gemini 客户端只需修改 base URL 即可接入。
快速开始
5 分钟内完成 API 调用
POST
/v1beta/models/gemini-3-pro-preview:generateContent
生成文本内容的核心接口。支持纯文本、多模态输入,以及工具调用。
cURL
Python
JavaScript
Bash
# 基础文本生成
curl -X POST http://localhost:5001/v1beta/models/gemini-3-pro-preview:generateContent \
-H "Content-Type: application/json" \
-d '{
"contents": [
{"parts": [{"text": "你好,请介绍一下你自己"}]}
],
"generationConfig": {
"maxOutputTokens": 512,
"temperature": 0.7
}
}'
generateContent
生成文本内容的核心接口
POST
/v1beta/models/{model}:generateContent
📃 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 必填 | 模型名称,支持 gemini-3-pro-preview 或
gemini-3-flash-preview |
📦 请求体参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| contents | array | 必填 | 对话内容数组,每个元素包含 role 和 parts |
| generationConfig | object | 可选 | 生成配置,包括 maxOutputTokens, temperature, thinkingConfig 等 |
| systemInstruction | object | 可选 | 系统指令/人设设定 |
| tools | array | 可选 | 工具/函数声明列表 |
| toolConfig | object | 可选 | 工具调用配置,mode 可选 AUTO/ANY/NONE |
200 OK
响应示例
{
"candidates": [{
"content": {
"role": "model",
"parts": [{
"text": "你好!我是 LingKong AI...",
"thoughtSignature": "EoQDCAIS..."
}]
},
"finishReason": "STOP",
"index": 0
}],
"usageMetadata": {
"promptTokenCount": 15,
"candidatesTokenCount": 128,
"totalTokenCount": 143,
"thoughtsTokenCount": 50
},
"modelVersion": "gemma-3n-local"
}
🧠 思考模式 (thinkingConfig)
启用深度推理,让模型在回答前进行思考
💫
思考模式说明
思考模式通过 prompt engineering 模拟 Gemini 3 的 thinking 功能。
模型会先在 <thinking> 标签中进行推理,然后在 <answer> 标签中给出答案。
thinkingLevel 可选值
| 值 | 思考深度 | 输出格式 | 适用场景 |
|---|---|---|---|
| none | 禁用 | 直接输出答案 | 简单问答、快速响应 |
| minimal | 极简 | 1-2 句思考 | 简单任务 |
| low | 浅层 | 简短思考(不显示) | 日常对话 |
| medium | 中等(默认) | 结构化思考 | 一般问题 |
| high | 深度 | 详细推理过程 | 复杂问题、数学、逻辑 |
请求示例
{
"contents": [{"parts": [{"text": "解释量子纠缠现象"}]}],
"generationConfig": {
"thinkingConfig": {
"thinkingLevel": "high",
"includeThoughts": true
},
"maxOutputTokens": 1024
}
}
🔧 工具调用 (Function Calling)
让模型调用外部函数,支持并行调用
工具声明示例
{
"contents": [{"parts": [{"text": "查询北京和上海的天气"}]}],
"tools": [{
"functionDeclarations": [{
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
}
},
"required": ["location"]
}
}]
}],
"toolConfig": {
"functionCallingConfig": {
"mode": "AUTO" // AUTO | ANY | NONE
}
}
}
toolConfig.mode 说明
| 模式 | 行为 |
|---|---|
| AUTO | 模型自动决定是否调用工具(默认) |
| ANY | 强制调用工具,不返回纯文本 |
| NONE | 禁用工具调用,只返回文本 |
📷 三模态支持
支持文本、图像理解和音频转录
💬
文本对话
多轮对话、系统指令
支持 thinking 深度推理
支持 thinking 深度推理
🎨
图像理解
支持 PNG, JPEG, WebP, GIF
通过 Vision mmproj (570MB)
通过 Vision mmproj (570MB)
🎤
音频转录
支持 WAV, MP3, FLAC, OGG
通过 Audio mmproj (1.4GB)
通过 Audio mmproj (1.4GB)
图像理解示例
{
"contents": [{
"role": "user",
"parts": [
{"text": "描述这张图片的内容"},
{
"inlineData": {
"mimeType": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUgAA..." // Base64
}
}
]
}]
}
音频转录示例
{
"contents": [{
"role": "user",
"parts": [
{"text": "Transcribe this audio and describe what you hear"},
{
"inlineData": {
"mimeType": "audio/wav",
"data": "UklGRi4AAABXQVZFZm10..." // Base64 WAV (16kHz mono)
}
}
]
}],
"generationConfig": {
"maxOutputTokens": 1024
}
}
🎤
音频格式要求
推荐使用 16kHz 单声道 WAV 格式以获得最佳效果。
支持的格式: WAV, MP3, FLAC, OGG, WebM。
音频文件需转换为 Base64 编码后传入 inlineData.data 字段。
💻
平台支持 (2025-01)
macOS (Apple Silicon): Metal GPU 加速,完整支持
Ubuntu x86_64 (CUDA): NVIDIA GPU 加速,完整支持 (包含音频转录修复)
Linux x86_64 (CPU): 纯 CPU 推理,速度较慢
音频转录功能已在 Ubuntu 22.04 + NVIDIA RTX 4090 上测试通过。
Ubuntu x86_64 (CUDA): NVIDIA GPU 加速,完整支持 (包含音频转录修复)
Linux x86_64 (CPU): 纯 CPU 推理,速度较慢
音频转录功能已在 Ubuntu 22.04 + NVIDIA RTX 4090 上测试通过。
🔑 思维签名 (Thought Signature)
AI 的"工作记忆",实现真正的有状态推理
🧠
核心概念
传统 LLM 像患有"短期记忆丧失症"的天才,每次对话都要重新阅读历史。
Thought Signature 通过 KV Cache 持久化,让 AI 具备真正的工作记忆。
🧠
推理生成
→
💾
KV Cache 捕获
→
📄
Base64 签名
→
🔁
状态恢复
多轮对话中使用 thoughtSignature
{
"contents": [
{"role": "user", "parts": [{"text": "我想学 Python"}]},
{
"role": "model",
"parts": [
{"text": "Python 是很好的选择..."},
{"thoughtSignature": "EoQDCAISOg..."} // 上一轮的签名
]
},
{"role": "user", "parts": [{"text": "有什么推荐的资源吗?"}]}
]
}
🔒 端到端加密通信
确保 AI 对话的绝对隐私
💡
为什么需要加密?
即使使用本地推理,消息在传输过程中仍可能被截获。端到端加密确保只有你和 AI 能读取对话内容。
LingKong 基于 Signal Protocol 设计,提供前向保密和密钥轮换保护。
🔐
Ed25519 身份
→
🔁
X25519 KEM
→
🔒
ChaCha20 加密
→
✅
Poly1305 认证
🔑
KEM 密钥封装
非交互式密钥建立,无需多轮握手
🔒
ChaCha20-Poly1305
AEAD 认证加密,机密性+完整性保障
✏
Ed25519 签名
数字签名验证消息真实性,防篡改
🔄
前向保密
每次请求使用临时密钥,历史消息不可破解
加密 API 端点
GET
/crypto/status
检查加密功能状态
响应示例
{
"crypto_available": true,
"server_keys_loaded": true,
"registered_clients": 3,
"algorithms": {
"key_exchange": "X25519",
"signature": "Ed25519",
"encryption": "ChaCha20-Poly1305",
"kdf": "HMAC-SHA256"
}
}
GET
/crypto/public-key
获取服务器公钥(用于加密请求)
响应示例
{
"signing_public": "base64_ed25519_public_key",
"x25519_public": "base64_x25519_public_key",
"user_id": "server_unique_id"
}
POST
/v1beta/models/{model}:generateContentEncrypted
加密的内容生成 API
密钥交换流程
使用 LingKong Client SDK 进行端到端加密通信
Python - 使用 LingKong Client SDK
from lingkong_client import LingKongClient
# 1. 创建客户端 (自动获取服务器公钥)
client = LingKongClient(
base_url="https://lingkong.xyz",
api_key="sk-your-api-key"
)
# 2. 发送加密请求
response = client.generate_content(
prompt="你好,请介绍一下端到端加密",
encrypted=True # 启用端到端加密
)
# 3. 获取解密后的响应
print(response.text)
# 备份客户端密钥 (重要!)
keys = client.export_keys()
print(f"User ID: {keys['user_id']}")
# 安全存储 keys['signing_key'] 和 keys['x25519_key']
Python - 底层 API (使用 lingkong_crypto)
import lingkong_crypto as lk
import requests
import json
# 1. 生成客户端密钥对
client_keys = lk.UserKeys()
print(f"Client ID: {client_keys.user_id()}")
# 2. 获取服务器公钥
resp = requests.get("https://lingkong.xyz/crypto/public-key")
server_x25519_public = lk.base64_decode(resp.json()["x25519_public"])
# 3. 构建请求
request_body = {
"contents": [{"parts": [{"text": "你好"}]}],
"generationConfig": {"maxOutputTokens": 256}
}
# 4. 加密请求 (KEM + ChaCha20)
encrypted_req = lk.EncryptedRequest.create(
json.dumps(request_body),
client_keys,
bytes(server_x25519_public)
)
# 5. 发送加密请求
resp = requests.post(
"https://lingkong.xyz/v1beta/models/gemma:generateContentEncrypted",
json=json.loads(encrypted_req.to_json())
)
# 6. 解密响应 (使用共享密钥)
# ... 响应解密逻辑
加密消息格式
请求和响应的加密信封结构
加密请求结构 (EncryptedRequest)
{
"ephemeral_public": "base64_x25519_临时公钥",
"ciphertext": "base64_chacha20_加密内容",
"nonce": "base64_12字节随机数",
"sender_id": "base64_ed25519_签名公钥",
"signature": "base64_ed25519_签名",
"timestamp": 1735862400
}
加密响应结构 (EncryptedResponse)
{
"ciphertext": "base64_chacha20_加密响应",
"nonce": "base64_12字节随机数",
"signature": "base64_服务器签名",
"timestamp": 1735862401
}
⚠
安全提示
每条消息都使用唯一的临时密钥对 (ephemeral_public),确保前向保密。
即使长期密钥泄露,历史消息也无法被解密。
双棘轮协议 (可选)
长期会话的增强前向保密
💡
适用场景
对于长期会话或高安全需求场景,可以使用双棘轮协议。
每条消息都会触发密钥轮换,提供更强的安全保障。
Python - 双棘轮会话
import lingkong_crypto as lk
# 1. 初始化会话 (发起方)
shared_secret = ... # 从 KEM 获取
peer_dh_public = ... # 对方 DH 公钥
session = lk.DoubleRatchetSession.init_as_initiator(
shared_secret,
peer_dh_public
)
# 2. 加密消息 (发送)
ciphertext, nonce, current_dh = session.encrypt(b"Hello!")
# 3. 解密消息 (接收)
plaintext = session.decrypt(
ciphertext,
nonce,
sender_dh_public
)
# 4. 查看会话状态
print(f"发送消息数: {session.send_count}")
print(f"接收消息数: {session.recv_count}")
print(f"DH 棘轮次数: {session.dh_ratchet_count}")
# 5. 保存会话状态
state_json = session.export_state()
# 存储到安全位置...
# 6. 恢复会话
restored = lk.DoubleRatchetSession.import_state(state_json)
🔁
KEM 初始化
→
🔄
链棘轮
→
🔑
DH 棘轮
→
🔒
消息加密
错误处理
| 状态码 | 错误类型 | 说明 |
|---|---|---|
| 200 | 成功 | 请求处理成功 |
| 400 | 请求错误 | 请求参数无效或缺失 |
| 500 | 服务器错误 | 推理服务异常 |
错误响应格式
{
"error": {
"message": "contents 不能为空",
"code": "400"
}
}
💻 在线测试
POST
/v1beta/models/gemini-3-pro-preview:generateContent
响应
点击"发送请求"查看响应...