chore: 以本地为准,上传全部并替换 GitHub

This commit is contained in:
卡若
2026-02-03 11:36:53 +08:00
parent 1219166526
commit b404bf546e
131 changed files with 37618 additions and 3930 deletions

185
app/api/channels/route.ts Normal file
View File

@@ -0,0 +1,185 @@
import { NextRequest, NextResponse } from 'next/server'
// 渠道配置接口
interface ChannelConfig {
id: string
type: 'feishu' | 'wecom' | 'wechat' | 'api'
name: string
status: 'active' | 'pending' | 'error'
config: Record<string, string>
lastChecked?: string
error?: string
}
// 网关地址卡若AI部署的网关
const GATEWAY_URL = process.env.GATEWAY_URL || 'http://localhost:8000'
// GET: 获取渠道状态
export async function GET(request: NextRequest) {
const { searchParams } = new URL(request.url)
const action = searchParams.get('action')
const type = searchParams.get('type')
try {
// 测试飞书连接
if (action === 'test' && type === 'feishu') {
try {
const res = await fetch(`${GATEWAY_URL}/feishu/test`, {
method: 'GET',
headers: { 'Content-Type': 'application/json' }
})
const data = await res.json()
return NextResponse.json({
success: data.status === 'success',
message: data.message,
appId: data.app_id
})
} catch (e) {
return NextResponse.json({
success: false,
message: '网关连接失败请确认卡若AI网关已启动',
error: String(e)
})
}
}
// 获取飞书群列表
if (action === 'chats' && type === 'feishu') {
try {
const res = await fetch(`${GATEWAY_URL}/feishu/chats?refresh=true`)
const data = await res.json()
return NextResponse.json({
success: data.success,
chats: data.chats || [],
count: data.count || 0
})
} catch (e) {
return NextResponse.json({
success: false,
message: '获取群列表失败',
chats: []
})
}
}
// 获取所有渠道状态
const channels: ChannelConfig[] = [
{
id: 'feishu-1',
type: 'feishu',
name: '飞书机器人',
status: 'pending',
config: {
webhookUrl: `${GATEWAY_URL}/feishu/webhook`,
testUrl: `${GATEWAY_URL}/feishu/test`
}
},
{
id: 'wecom-1',
type: 'wecom',
name: '企业微信应用',
status: 'pending',
config: {
webhookUrl: `${GATEWAY_URL}/wecom/callback`
}
},
{
id: 'api-1',
type: 'api',
name: 'REST API',
status: 'active',
config: {
endpoint: '/api/ai-chat',
method: 'POST'
}
}
]
return NextResponse.json({
success: true,
channels,
gateway: GATEWAY_URL
})
} catch (error) {
return NextResponse.json({
success: false,
error: String(error)
}, { status: 500 })
}
}
// POST: 发送消息到渠道
export async function POST(request: NextRequest) {
try {
const body = await request.json()
const { action, type, ...params } = body
// 发送消息到飞书群
if (action === 'send' && type === 'feishu') {
const { chatName, content } = params
if (!chatName || !content) {
return NextResponse.json({
success: false,
error: '缺少参数: chatName, content'
}, { status: 400 })
}
try {
const res = await fetch(`${GATEWAY_URL}/feishu/send_message`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_name: chatName,
content: content
})
})
const data = await res.json()
return NextResponse.json(data)
} catch (e) {
return NextResponse.json({
success: false,
message: '发送失败',
error: String(e)
})
}
}
// 发送会议纪要
if (action === 'send_minutes' && type === 'feishu') {
const { minutesUrl, chatName, useLlm = true } = params
try {
const res = await fetch(`${GATEWAY_URL}/feishu/send_minutes`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
minutes_url: minutesUrl,
chat_name: chatName,
use_llm: useLlm
})
})
const data = await res.json()
return NextResponse.json(data)
} catch (e) {
return NextResponse.json({
success: false,
message: '发送会议纪要失败',
error: String(e)
})
}
}
return NextResponse.json({
success: false,
error: '未知操作'
}, { status: 400 })
} catch (error) {
return NextResponse.json({
success: false,
error: String(error)
}, { status: 500 })
}
}