feat: ProxyNode 代理节点管理系统与 OpenAI Responses API 解析增强

ProxyNode 系统:新增 aether-proxy(Rust)海外 VPS 代理组件,后端实现节点注册/心跳/
HMAC 认证/健康检测调度器/模块化集成,前端新增代理节点管理页面。ProxyConfig 支持
node_id 模式,http_client 支持 HMAC 签名代理 URL 构建与 TTL 缓存。

OpenAI CLI 解析器:适配 Responses API 格式,支持 input_tokens/output_tokens 提取、
output[].content[].text 文本解析、response.completed 流式事件 usage 嵌套结构。
This commit is contained in:
fawney19
2026-02-07 12:24:42 +08:00
parent 62f852b851
commit 1180634269
40 changed files with 4761 additions and 11 deletions

View File

@@ -0,0 +1,50 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { proxyNodesApi, type ProxyNode } from '@/api/proxy-nodes'
export const useProxyNodesStore = defineStore('proxy-nodes', () => {
const nodes = ref<ProxyNode[]>([])
const total = ref(0)
const loading = ref(false)
const error = ref<string | null>(null)
async function fetchNodes(params?: { status?: string }) {
loading.value = true
error.value = null
try {
const data = await proxyNodesApi.listProxyNodes({ ...params, limit: 1000 })
nodes.value = data.items
total.value = data.total
} catch (err: any) {
error.value = err.response?.data?.error?.message || err.response?.data?.detail || '获取代理节点列表失败'
} finally {
loading.value = false
}
}
async function deleteNode(nodeId: string) {
loading.value = true
error.value = null
try {
await proxyNodesApi.deleteProxyNode(nodeId)
nodes.value = nodes.value.filter(n => n.id !== nodeId)
total.value = Math.max(0, total.value - 1)
} catch (err: any) {
error.value = err.response?.data?.error?.message || err.response?.data?.detail || '删除代理节点失败'
throw err
} finally {
loading.value = false
}
}
return {
nodes,
total,
loading,
error,
fetchNodes,
deleteNode,
}
})