Initial commit of akmon project
This commit is contained in:
55
uni_modules/rag-req/interface.uts
Normal file
55
uni_modules/rag-req/interface.uts
Normal 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
|
||||
}
|
||||
218
uni_modules/rag-req/rag-req.uts
Normal file
218
uni_modules/rag-req/rag-req.uts
Normal 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;
|
||||
Reference in New Issue
Block a user