Initial commit of akmon project

This commit is contained in:
2026-01-20 08:04:15 +08:00
commit 77a2bab985
1309 changed files with 343305 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
// agent session 列表参数类型
export type AgentSessionListOptions = {
page?: number,
page_size?: number,
orderby?: string,
desc?: boolean,
id?: string,
user_id?: string,
dsl?: string
}
// rag-req 类型声明
export type RagReqOptions = {
url: string;
method?: string;
headers?: UTSJSONObject;
data?: any;
timeout?: number;
};
export type RagReqResponse<T = any> = {
status: number;
data: T;
headers: UTSJSONObject;
error?: string | null;
total?: number | null;
page?: number | null;
limit?: number | null;
hasmore?: boolean | null;
origin?: any | null;
};
export interface RagReqError {
code: number;
message: string;
}
export interface RagSessionData {
id: string;
session_name?: string;
total_messages?: number;
last_message_at?: string;
is_active?: boolean;
// 索引签名已移除,兼容 UTS
}
export interface RagMessageData {
id?: string;
role?: string;
content?: string;
created_at?: string;
answer?: string;
message?: string;
// 索引签名已移除,兼容 UTS
}

View File

@@ -0,0 +1,218 @@
import { RagReqOptions, RagReqResponse, RagReqError, RagSessionData, RagMessageData, AgentSessionListOptions } from './interface.uts';
// token/session 持久化 key
const RAG_ACCESS_TOKEN_KEY = 'ragreq_access_token';
const RAG_SESSION_ID_KEY = 'ragreq_session_id';
let _accessToken : string | null = null;
let _sessionId : string | null = null;
export type RagReqConfig {
baseUrl : string;
apiKey ?: string;
}
export class RagReq {
private baseUrl : string;
constructor(config : RagReqConfig) {
this.baseUrl = config.baseUrl.replace(/\/$/, '');
if ((config.apiKey ?? '') !== '') {
RagReq.setToken(config.apiKey!);
}
}
// 设置 token
static setToken(token : string) {
_accessToken = token;
uni.setStorageSync(RAG_ACCESS_TOKEN_KEY, token);
}
static getToken() : string | null {
if (_accessToken != null) return _accessToken;
const t = uni.getStorageSync(RAG_ACCESS_TOKEN_KEY) as string | null;
_accessToken = t;
return t;
}
static clearToken() {
_accessToken = null;
uni.removeStorageSync(RAG_ACCESS_TOKEN_KEY);
}
// sessionId 管理
static setSessionId(sessionId : string) {
_sessionId = sessionId;
uni.setStorageSync(RAG_SESSION_ID_KEY, sessionId);
}
static getSessionId() : string | null {
if (_sessionId != null) return _sessionId;
const t = uni.getStorageSync(RAG_SESSION_ID_KEY) as string | null;
_sessionId = t;
return t;
}
static clearSessionId() {
_sessionId = null;
uni.removeStorageSync(RAG_SESSION_ID_KEY);
}
// 通用 request
async request(options : RagReqOptions) : Promise<RagReqResponse<any>> {
let headers = options.headers ?? ({} as UTSJSONObject);
const token = RagReq.getToken();
if ((token ?? '') !== '') {
headers = Object.assign({}, headers, { Authorization: `Bearer ${token}` }) as UTSJSONObject;
}
const url = options.url.startsWith('http') ? options.url : this.baseUrl + options.url;
return new Promise<RagReqResponse<any>>((resolve, reject) => {
uni.request({
url,
method: options.method ?? 'POST',
data: options.data,
header: headers,
timeout: options.timeout ?? 10000,
success: (res) => {
let data : UTSJSONObject | Array<UTSJSONObject> | null;
if (typeof res.data == 'string') {
try { data = JSON.parse(res.data as string) as UTSJSONObject; } catch { data = null; }
} else if (Array.isArray(res.data)) {
data = res.data as UTSJSONObject[];
} else {
data = res.data as UTSJSONObject | null;
}
resolve({
status: res.statusCode,
data: data ?? {},
headers: res.header as UTSJSONObject,
error: null
} as RagReqResponse<any>);
},
fail: (err) => {
resolve({
status: err.errCode,
data: null as any,
headers: {} as UTSJSONObject,
error: err.errMsg ?? 'request fail'
} as RagReqResponse<any>);
}
});
});
}
// 发送消息到 RAG
async sendMessage(message : string, sessionId ?: string) : Promise<RagReqResponse<RagMessageData>> {
const sid = sessionId ?? RagReq.getSessionId();
const reqOpt : RagReqOptions = {
url: '/api/session/chat',
method: 'POST',
data: { message, session_id: sid } as UTSJSONObject
};
const res = await this.request(reqOpt);
return res;
}
// 获取指定 agent 的会话列表(新接口)
async getAgentSessionList(
agentId: string,
options?: AgentSessionListOptions
): Promise<RagReqResponse<any>> {
let url = `/api/v1/agents/${agentId}/sessions`;
const params: string[] = [];
if (options!=null) {
if (options.page !== null) params.push(`page=${options.page}`);
if (options?.page_size !== null) params.push(`page_size=${options?.page_size}`);
if (options?.orderby!=null) params.push(`orderby=${encodeURIComponent(options?.orderby??'')}`);
if (options.desc !== null) params.push(`desc=${options.desc!=null ? 'true' : 'false'}`);
if (options.id!='') params.push(`id=${encodeURIComponent(options?.id??'')}`);
if (options.user_id!='') params.push(`user_id=${encodeURIComponent(options?.user_id??'')}`);
if (options.dsl!=null) params.push(`dsl=${encodeURIComponent(options?.dsl??'')}`);
}
if (params.length > 0) {
url += '?' + params.join('&');
}
const headers = {} as UTSJSONObject;
// Authorization header will be auto-added in request()
return await this.request({
url,
method: 'GET',
headers
});
}
// 获取历史消息
async getHistory(sessionId ?: string) : Promise<RagReqResponse<Array<RagMessageData>>> {
const sid = sessionId ?? RagReq.getSessionId();
const reqOpt : RagReqOptions = {
url: `/api/session/history?session_id=${sid}`,
method: 'GET'
};
const res = await this.request(reqOpt);
return res;
}
// 新建会话
async createSession() : Promise<RagReqResponse<RagSessionData>> {
const reqOpt : RagReqOptions = {
url: '/api/session/create',
method: 'POST',
data: {} as UTSJSONObject
};
const res = await this.request(reqOpt);
return res;
}
// 创建会话(支持 json 或 form-data
async createAgentSession(
agentId : string,
params ?: UTSJSONObject,
userId ?: string,
isFormData : boolean = false
) : Promise<RagReqResponse<any>> {
let url = `/api/v1/agents/${agentId}/sessions`;
if ((userId ?? '') !== '') url += `?user_id=${encodeURIComponent(userId!)}`;
let headers = {} as UTSJSONObject;
let data : any = params ?? {};
if (isFormData) {
headers['Content-Type'] = 'multipart/form-data';
} else {
headers['Content-Type'] = 'application/json';
}
return await this.request({
url,
method: 'POST',
headers,
data
});
}
// 与 agent 对话
async converseWithAgent(
agentId : string,
body : UTSJSONObject
) : Promise<RagReqResponse<UTSJSONObject>> {
const url = `/api/v1/agents/${agentId}/completions`;
const headers = { 'Content-Type': 'application/json' } as UTSJSONObject;
return await this.request({
url,
method: 'POST',
headers,
data: body
});
}
// 删除 agent 的会话(批量)
async deleteAgentSessions(
agentId: string,
ids: string[]
): Promise<RagReqResponse<any>> {
const url = `/api/v1/agents/${agentId}/sessions`;
const headers = { 'Content-Type': 'application/json' } as UTSJSONObject;
const data = { ids } as UTSJSONObject;
return await this.request({
url,
method: 'DELETE',
headers,
data
});
}
}
export default RagReq;