@alquimia-ai/tools 1.13.2 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.d.mts +7 -17
- package/dist/actions/index.d.ts +7 -17
- package/dist/actions/index.js +45 -152
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/index.mjs +45 -152
- package/dist/actions/index.mjs.map +1 -1
- package/dist/adapters/fetch.d.mts +12 -0
- package/dist/adapters/fetch.d.ts +12 -0
- package/dist/adapters/fetch.js +44 -0
- package/dist/adapters/fetch.js.map +1 -0
- package/dist/adapters/fetch.mjs +23 -0
- package/dist/adapters/fetch.mjs.map +1 -0
- package/dist/adapters/index.d.mts +11 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.js +19 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +1 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/adapters/next.d.mts +10 -0
- package/dist/adapters/next.d.ts +10 -0
- package/dist/adapters/next.js +42 -0
- package/dist/adapters/next.js.map +1 -0
- package/dist/adapters/next.mjs +21 -0
- package/dist/adapters/next.mjs.map +1 -0
- package/dist/hooks/index.d.mts +22 -2
- package/dist/hooks/index.d.ts +22 -2
- package/dist/hooks/index.js +243 -40
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +234 -41
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/next/index.d.mts +49 -0
- package/dist/next/index.d.ts +49 -0
- package/dist/next/index.js +332 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/index.mjs +309 -0
- package/dist/next/index.mjs.map +1 -0
- package/dist/providers/index.d.mts +7 -3
- package/dist/providers/index.d.ts +7 -3
- package/dist/providers/index.js +15 -14
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +15 -14
- package/dist/providers/index.mjs.map +1 -1
- package/dist/proxy.d.mts +15 -0
- package/dist/proxy.d.ts +15 -0
- package/dist/proxy.js +147 -0
- package/dist/proxy.js.map +1 -0
- package/dist/proxy.mjs +126 -0
- package/dist/proxy.mjs.map +1 -0
- package/dist/sdk/index.d.mts +8 -14
- package/dist/sdk/index.d.ts +8 -14
- package/dist/sdk/index.js +47 -47
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/index.mjs +47 -47
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/services/index.d.mts +25 -3
- package/dist/services/index.d.ts +25 -3
- package/package.json +35 -5
- package/dist/providers/elastic/index.d.mts +0 -23
- package/dist/providers/elastic/index.d.ts +0 -23
- package/dist/providers/elastic/index.js +0 -102
- package/dist/providers/elastic/index.js.map +0 -1
- package/dist/providers/elastic/index.mjs +0 -69
- package/dist/providers/elastic/index.mjs.map +0 -1
- package/dist/services/apm/index.d.mts +0 -26
- package/dist/services/apm/index.d.ts +0 -26
- package/dist/services/apm/index.js +0 -86
- package/dist/services/apm/index.js.map +0 -1
- package/dist/services/apm/index.mjs +0 -63
- package/dist/services/apm/index.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/index.ts","../../src/proxy.ts","../../src/next/actions.ts","../../src/actions/session.action.ts"],"sourcesContent":["import { createAlquimiaProxyHandler, type ProxyConfig } from '../proxy';\n\nexport type { ProxyConfig };\n\nexport {\n handleChatRequest,\n handleStreamRequest,\n initConversation,\n type ChatRouteContext,\n type ChatRequestConfig,\n type ChatResponse,\n} from './actions';\n\nexport interface NextJsRouteContext {\n params: Promise<{ path: string[] }>;\n}\n\nexport function createNextJsRouteHandlers(config: ProxyConfig) {\n const handler = createAlquimiaProxyHandler(config);\n\n return {\n /**\n * Use as POST handler in app/api/chat/[...path]/route.ts\n */\n handleInfer: async (request: Request, context: NextJsRouteContext): Promise<Response> => {\n const { path } = await context.params;\n return handler.handleInfer(request, path.join('/'));\n },\n\n /**\n * Use as GET handler in app/api/stream/[...path]/route.ts\n */\n handleStream: async (request: Request, context: NextJsRouteContext): Promise<Response> => {\n const { path } = await context.params;\n return handler.handleStream(request, path.join('/'));\n },\n\n /**\n * Use as POST handler in app/api/attachments/[...path]/route.ts\n */\n handleAttachment: async (request: Request, context: NextJsRouteContext): Promise<Response> => {\n const { path } = await context.params;\n const [streamId, attachmentId] = path;\n if (!streamId || !attachmentId) {\n return new Response(\n JSON.stringify({ error: 'streamId and attachmentId are required in path' }),\n { status: 422, headers: { 'Content-Type': 'application/json' } }\n );\n }\n return handler.handleAttachment(request, streamId, attachmentId);\n },\n };\n}\n","export interface ProxyConfig {\n assistantBaseUrl: string;\n apiKey: string;\n inferRoute?: string; // default: 'event/infer'\n streamRoute?: string; // default: 'event/stream'\n attachmentRoute?: string; // default: 'event/attachment'\n}\n\nexport interface AlquimiaProxyHandler {\n handleInfer(request: Request, pathSuffix: string): Promise<Response>;\n handleStream(request: Request, pathSuffix: string): Promise<Response>;\n handleAttachment(request: Request, streamId: string, attachmentId: string): Promise<Response>;\n}\n\nexport function createAlquimiaProxyHandler(config: ProxyConfig): AlquimiaProxyHandler {\n const baseUrl = config.assistantBaseUrl.replace(/\\/$/, '');\n const inferRoute = config.inferRoute ?? 'event/infer';\n const streamRoute = config.streamRoute ?? 'event/stream';\n const attachmentRoute = config.attachmentRoute ?? 'event/attachment';\n const authHeader = { Authorization: `Bearer ${config.apiKey}` };\n\n return {\n async handleInfer(request: Request, pathSuffix: string): Promise<Response> {\n try {\n const body = await request.json();\n const url = new URL(request.url);\n const querySuffix = url.searchParams.toString()\n ? `?${url.searchParams.toString()}`\n : '';\n const targetUrl = `${baseUrl}/${inferRoute}/${pathSuffix}${querySuffix}`;\n\n const response = await fetch(targetUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...authHeader },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorJson = await response.json().catch(() => ({}));\n console.error('AlquimiaProxy handleInfer error:', {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n return new Response(\n JSON.stringify({\n status: response.status,\n statusText: response.statusText,\n ...errorJson,\n }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Content-Encoding',\n },\n });\n } catch (error) {\n console.error('AlquimiaProxy handleInfer exception:', error);\n return new Response(\n JSON.stringify({ error: 'Failed to forward infer request' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n },\n\n async handleStream(request: Request, pathSuffix: string): Promise<Response> {\n try {\n const targetUrl = `${baseUrl}/${streamRoute}/${pathSuffix}`;\n\n const response = await fetch(targetUrl, {\n headers: { 'Content-Type': 'application/json', ...authHeader },\n });\n\n if (!response.ok) {\n const errorJson = await response.json().catch(() => ({}));\n console.error('AlquimiaProxy handleStream error:', {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n return new Response(\n JSON.stringify({\n error: errorJson.message || response.statusText || 'Failed to forward stream',\n ...errorJson,\n }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n } catch (error) {\n console.error('AlquimiaProxy handleStream exception:', error);\n return new Response(\n JSON.stringify({ error: 'Failed to forward stream request' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n },\n\n async handleAttachment(\n request: Request,\n streamId: string,\n attachmentId: string\n ): Promise<Response> {\n try {\n const targetUrl = `${baseUrl}/${attachmentRoute}/${streamId}/${attachmentId}`;\n const contentType = request.headers.get('Content-Type') ?? '';\n\n const response = await fetch(targetUrl, {\n method: 'POST',\n headers: {\n ...authHeader,\n ...(contentType && { 'Content-Type': contentType }),\n },\n body: request.body,\n duplex: 'half',\n } as RequestInit);\n\n if (!response.ok) {\n return new Response(\n JSON.stringify({ error: 'Failed to upload attachment', status: response.status }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const responseText = await response.text();\n return new Response(responseText, {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n console.error('AlquimiaProxy handleAttachment exception:', error);\n return new Response(\n JSON.stringify({ error: 'Failed to forward attachment request' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n },\n };\n}\n","\"use server\";\nimport { NextResponse } from \"next/server\";\nimport { headers, cookies } from \"next/headers\";\nimport { initConversation as initConversationAgnostic, type SessionStorage } from \"../actions/session.action\";\n\nexport type ChatRouteContext = {\n params: {\n path: string[];\n };\n};\n\nexport type ChatRequestConfig = {\n assistantBaseUrl: string;\n assistantRoute?: string;\n apiKey: string;\n};\n\nexport type ChatResponse = Response | any;\n\n/**\n * @deprecated Use `createNextJsRouteHandlers()` from `@alquimia-ai/tools/next` instead.\n */\nexport async function handleChatRequest(\n request: Request,\n context: ChatRouteContext,\n config: ChatRequestConfig\n): Promise<ChatResponse> {\n try {\n const headersList = await headers();\n const body = await request.json();\n const routeParams = await context.params;\n const routePath = routeParams.path.join(\"/\");\n const assistantRoute = config.assistantRoute || \"infer\";\n\n const url = new URL(request.url);\n const queryString = url.searchParams.toString();\n const querySuffix = queryString ? `?${queryString}` : '';\n \n const assistantUrl = `${config.assistantBaseUrl}/${assistantRoute}/${routePath}${querySuffix}`;\n\n const response = await fetch(assistantUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...headersList,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorJson = await response.json();\n console.error(\"Chat inference server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n\n return NextResponse.json(\n {\n status: response.status,\n statusText: response.statusText ||\n \"Failed to forward Chat data\",\n ...errorJson,\n },\n { status: response.status }\n );\n }\n\n return new NextResponse(response.body, {\n status: 200,\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Content-Encoding\",\n },\n });\n } catch (error) {\n return NextResponse.json(\n { error: \"Failed to forward Chat data\" },\n { status: 500 }\n );\n }\n}\n\n/**\n * @deprecated Use `createNextJsRouteHandlers()` from `@alquimia-ai/tools/next` instead.\n */\nexport async function handleStreamRequest(\n request: Request,\n context: ChatRouteContext,\n config: ChatRequestConfig\n): Promise<Response> {\n try {\n const headersList = await headers();\n const routeParams = await context.params;\n const path = routeParams.path.join(\"/\");\n const assistantRoute = config.assistantRoute || \"stream\";\n\n const streamUrl = `${config.assistantBaseUrl}/${assistantRoute}/${path}`;\n\n const response = await fetch(streamUrl, {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...Object.fromEntries(headersList.entries()),\n },\n });\n\n if (!response.ok) {\n const errorJson = await response.json();\n console.error(\"Stream server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n\n return new Response(\n JSON.stringify({\n error:\n errorJson.message ||\n response.statusText ||\n \"Failed to forward Stream data\",\n ...errorJson,\n }),\n { status: response.status }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"Stream error:\", error);\n return new Response(\n JSON.stringify({ error: \"Failed to forward stream data\" }),\n { status: 500 }\n );\n }\n}\n\n/**\n * Next.js-specific session initializer using cookies().\n * For framework-agnostic usage, use `initConversation` from `@alquimia-ai/tools/actions`\n * with your own `SessionStorage` implementation.\n */\nexport async function initConversation(reset?: boolean, topicId?: string): Promise<string> {\n const cookieStore = await cookies();\n\n const storage: SessionStorage = {\n get(key: string) {\n return cookieStore.get(key)?.value ?? null;\n },\n set(key: string, value: string) {\n cookieStore.set(key, value);\n },\n };\n\n return initConversationAgnostic(storage, reset, topicId);\n}\n","\"use server\";\nimport { randomUUID } from \"crypto\";\nimport { ConversationsMap } from \"../types/type\";\n\nexport interface SessionStorage {\n get(key: string): string | undefined | null | Promise<string | undefined | null>;\n set(key: string, value: string): void | Promise<void>;\n}\n\nexport async function initConversation(\n storage: SessionStorage,\n reset?: boolean,\n topicId?: string\n): Promise<string> {\n if (!topicId) {\n let conversationId = randomUUID().toString();\n const existing = await storage.get(\"alquimia-session\");\n\n if (!existing || reset) {\n await storage.set(\"alquimia-session\", conversationId);\n } else {\n conversationId = existing;\n }\n\n return conversationId;\n }\n\n let conversationsMap: ConversationsMap = {};\n const existingConversations = await storage.get(\"alquimia-sessions\");\n\n if (existingConversations) {\n try {\n const decodedValue = decodeURIComponent(existingConversations);\n conversationsMap = JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n conversationsMap = {};\n }\n }\n\n if (!conversationsMap[topicId] || reset) {\n conversationsMap[topicId] = randomUUID().toString();\n }\n\n await storage.set(\"alquimia-sessions\", JSON.stringify(conversationsMap));\n\n return conversationsMap[topicId];\n}\n"],"mappings":"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","names":["initConversation","initConversation"]}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// src/proxy.ts
|
|
2
|
+
function createAlquimiaProxyHandler(config) {
|
|
3
|
+
const baseUrl = config.assistantBaseUrl.replace(/\/$/, "");
|
|
4
|
+
const inferRoute = config.inferRoute ?? "event/infer";
|
|
5
|
+
const streamRoute = config.streamRoute ?? "event/stream";
|
|
6
|
+
const attachmentRoute = config.attachmentRoute ?? "event/attachment";
|
|
7
|
+
const authHeader = { Authorization: `Bearer ${config.apiKey}` };
|
|
8
|
+
return {
|
|
9
|
+
async handleInfer(request, pathSuffix) {
|
|
10
|
+
try {
|
|
11
|
+
const body = await request.json();
|
|
12
|
+
const url = new URL(request.url);
|
|
13
|
+
const querySuffix = url.searchParams.toString() ? `?${url.searchParams.toString()}` : "";
|
|
14
|
+
const targetUrl = `${baseUrl}/${inferRoute}/${pathSuffix}${querySuffix}`;
|
|
15
|
+
const response = await fetch(targetUrl, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "Content-Type": "application/json", ...authHeader },
|
|
18
|
+
body: JSON.stringify(body)
|
|
19
|
+
});
|
|
20
|
+
if (!response.ok) {
|
|
21
|
+
const errorJson = await response.json().catch(() => ({}));
|
|
22
|
+
console.error("AlquimiaProxy handleInfer error:", {
|
|
23
|
+
status: response.status,
|
|
24
|
+
statusText: response.statusText,
|
|
25
|
+
body: errorJson
|
|
26
|
+
});
|
|
27
|
+
return new Response(
|
|
28
|
+
JSON.stringify({
|
|
29
|
+
status: response.status,
|
|
30
|
+
statusText: response.statusText,
|
|
31
|
+
...errorJson
|
|
32
|
+
}),
|
|
33
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return new Response(response.body, {
|
|
37
|
+
status: 200,
|
|
38
|
+
headers: {
|
|
39
|
+
"Access-Control-Allow-Origin": "*",
|
|
40
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
41
|
+
"Access-Control-Allow-Headers": "Content-Type, Content-Encoding"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error("AlquimiaProxy handleInfer exception:", error);
|
|
46
|
+
return new Response(
|
|
47
|
+
JSON.stringify({ error: "Failed to forward infer request" }),
|
|
48
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
async handleStream(request, pathSuffix) {
|
|
53
|
+
try {
|
|
54
|
+
const targetUrl = `${baseUrl}/${streamRoute}/${pathSuffix}`;
|
|
55
|
+
const response = await fetch(targetUrl, {
|
|
56
|
+
headers: { "Content-Type": "application/json", ...authHeader }
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const errorJson = await response.json().catch(() => ({}));
|
|
60
|
+
console.error("AlquimiaProxy handleStream error:", {
|
|
61
|
+
status: response.status,
|
|
62
|
+
statusText: response.statusText,
|
|
63
|
+
body: errorJson
|
|
64
|
+
});
|
|
65
|
+
return new Response(
|
|
66
|
+
JSON.stringify({
|
|
67
|
+
error: errorJson.message || response.statusText || "Failed to forward stream",
|
|
68
|
+
...errorJson
|
|
69
|
+
}),
|
|
70
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return new Response(response.body, {
|
|
74
|
+
status: 200,
|
|
75
|
+
headers: {
|
|
76
|
+
"Content-Type": "text/event-stream",
|
|
77
|
+
"Cache-Control": "no-cache",
|
|
78
|
+
Connection: "keep-alive"
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
} catch (error) {
|
|
82
|
+
console.error("AlquimiaProxy handleStream exception:", error);
|
|
83
|
+
return new Response(
|
|
84
|
+
JSON.stringify({ error: "Failed to forward stream request" }),
|
|
85
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
async handleAttachment(request, streamId, attachmentId) {
|
|
90
|
+
try {
|
|
91
|
+
const targetUrl = `${baseUrl}/${attachmentRoute}/${streamId}/${attachmentId}`;
|
|
92
|
+
const contentType = request.headers.get("Content-Type") ?? "";
|
|
93
|
+
const response = await fetch(targetUrl, {
|
|
94
|
+
method: "POST",
|
|
95
|
+
headers: {
|
|
96
|
+
...authHeader,
|
|
97
|
+
...contentType && { "Content-Type": contentType }
|
|
98
|
+
},
|
|
99
|
+
body: request.body,
|
|
100
|
+
duplex: "half"
|
|
101
|
+
});
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
return new Response(
|
|
104
|
+
JSON.stringify({ error: "Failed to upload attachment", status: response.status }),
|
|
105
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
const responseText = await response.text();
|
|
109
|
+
return new Response(responseText, {
|
|
110
|
+
status: 200,
|
|
111
|
+
headers: { "Content-Type": "application/json" }
|
|
112
|
+
});
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error("AlquimiaProxy handleAttachment exception:", error);
|
|
115
|
+
return new Response(
|
|
116
|
+
JSON.stringify({ error: "Failed to forward attachment request" }),
|
|
117
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// src/next/actions.ts
|
|
125
|
+
import { NextResponse } from "next/server";
|
|
126
|
+
import { headers, cookies } from "next/headers";
|
|
127
|
+
|
|
128
|
+
// src/actions/session.action.ts
|
|
129
|
+
import { randomUUID } from "crypto";
|
|
130
|
+
async function initConversation(storage, reset, topicId) {
|
|
131
|
+
if (!topicId) {
|
|
132
|
+
let conversationId = randomUUID().toString();
|
|
133
|
+
const existing = await storage.get("alquimia-session");
|
|
134
|
+
if (!existing || reset) {
|
|
135
|
+
await storage.set("alquimia-session", conversationId);
|
|
136
|
+
} else {
|
|
137
|
+
conversationId = existing;
|
|
138
|
+
}
|
|
139
|
+
return conversationId;
|
|
140
|
+
}
|
|
141
|
+
let conversationsMap = {};
|
|
142
|
+
const existingConversations = await storage.get("alquimia-sessions");
|
|
143
|
+
if (existingConversations) {
|
|
144
|
+
try {
|
|
145
|
+
const decodedValue = decodeURIComponent(existingConversations);
|
|
146
|
+
conversationsMap = JSON.parse(decodedValue);
|
|
147
|
+
} catch (e) {
|
|
148
|
+
console.error("Error parsing conversations cookie:", e);
|
|
149
|
+
conversationsMap = {};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (!conversationsMap[topicId] || reset) {
|
|
153
|
+
conversationsMap[topicId] = randomUUID().toString();
|
|
154
|
+
}
|
|
155
|
+
await storage.set("alquimia-sessions", JSON.stringify(conversationsMap));
|
|
156
|
+
return conversationsMap[topicId];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// src/next/actions.ts
|
|
160
|
+
async function handleChatRequest(request, context, config) {
|
|
161
|
+
try {
|
|
162
|
+
const headersList = await headers();
|
|
163
|
+
const body = await request.json();
|
|
164
|
+
const routeParams = await context.params;
|
|
165
|
+
const routePath = routeParams.path.join("/");
|
|
166
|
+
const assistantRoute = config.assistantRoute || "infer";
|
|
167
|
+
const url = new URL(request.url);
|
|
168
|
+
const queryString = url.searchParams.toString();
|
|
169
|
+
const querySuffix = queryString ? `?${queryString}` : "";
|
|
170
|
+
const assistantUrl = `${config.assistantBaseUrl}/${assistantRoute}/${routePath}${querySuffix}`;
|
|
171
|
+
const response = await fetch(assistantUrl, {
|
|
172
|
+
method: "POST",
|
|
173
|
+
headers: {
|
|
174
|
+
"Content-Type": "application/json",
|
|
175
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
176
|
+
...headersList
|
|
177
|
+
},
|
|
178
|
+
body: JSON.stringify(body)
|
|
179
|
+
});
|
|
180
|
+
if (!response.ok) {
|
|
181
|
+
const errorJson = await response.json();
|
|
182
|
+
console.error("Chat inference server error:", {
|
|
183
|
+
status: response.status,
|
|
184
|
+
statusText: response.statusText,
|
|
185
|
+
body: errorJson
|
|
186
|
+
});
|
|
187
|
+
return NextResponse.json(
|
|
188
|
+
{
|
|
189
|
+
status: response.status,
|
|
190
|
+
statusText: response.statusText || "Failed to forward Chat data",
|
|
191
|
+
...errorJson
|
|
192
|
+
},
|
|
193
|
+
{ status: response.status }
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
return new NextResponse(response.body, {
|
|
197
|
+
status: 200,
|
|
198
|
+
headers: {
|
|
199
|
+
"Access-Control-Allow-Origin": "*",
|
|
200
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
201
|
+
"Access-Control-Allow-Headers": "Content-Type, Content-Encoding"
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
} catch (error) {
|
|
205
|
+
return NextResponse.json(
|
|
206
|
+
{ error: "Failed to forward Chat data" },
|
|
207
|
+
{ status: 500 }
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async function handleStreamRequest(request, context, config) {
|
|
212
|
+
try {
|
|
213
|
+
const headersList = await headers();
|
|
214
|
+
const routeParams = await context.params;
|
|
215
|
+
const path = routeParams.path.join("/");
|
|
216
|
+
const assistantRoute = config.assistantRoute || "stream";
|
|
217
|
+
const streamUrl = `${config.assistantBaseUrl}/${assistantRoute}/${path}`;
|
|
218
|
+
const response = await fetch(streamUrl, {
|
|
219
|
+
headers: {
|
|
220
|
+
"Content-Type": "application/json",
|
|
221
|
+
Authorization: `Bearer ${config.apiKey}`,
|
|
222
|
+
...Object.fromEntries(headersList.entries())
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
if (!response.ok) {
|
|
226
|
+
const errorJson = await response.json();
|
|
227
|
+
console.error("Stream server error:", {
|
|
228
|
+
status: response.status,
|
|
229
|
+
statusText: response.statusText,
|
|
230
|
+
body: errorJson
|
|
231
|
+
});
|
|
232
|
+
return new Response(
|
|
233
|
+
JSON.stringify({
|
|
234
|
+
error: errorJson.message || response.statusText || "Failed to forward Stream data",
|
|
235
|
+
...errorJson
|
|
236
|
+
}),
|
|
237
|
+
{ status: response.status }
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
return new Response(response.body, {
|
|
241
|
+
status: 200,
|
|
242
|
+
headers: {
|
|
243
|
+
"Content-Type": "text/event-stream",
|
|
244
|
+
"Cache-Control": "no-cache",
|
|
245
|
+
Connection: "keep-alive"
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
} catch (error) {
|
|
249
|
+
console.error("Stream error:", error);
|
|
250
|
+
return new Response(
|
|
251
|
+
JSON.stringify({ error: "Failed to forward stream data" }),
|
|
252
|
+
{ status: 500 }
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function initConversation2(reset, topicId) {
|
|
257
|
+
const cookieStore = await cookies();
|
|
258
|
+
const storage = {
|
|
259
|
+
get(key) {
|
|
260
|
+
return cookieStore.get(key)?.value ?? null;
|
|
261
|
+
},
|
|
262
|
+
set(key, value) {
|
|
263
|
+
cookieStore.set(key, value);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
return initConversation(storage, reset, topicId);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// src/next/index.ts
|
|
270
|
+
function createNextJsRouteHandlers(config) {
|
|
271
|
+
const handler = createAlquimiaProxyHandler(config);
|
|
272
|
+
return {
|
|
273
|
+
/**
|
|
274
|
+
* Use as POST handler in app/api/chat/[...path]/route.ts
|
|
275
|
+
*/
|
|
276
|
+
handleInfer: async (request, context) => {
|
|
277
|
+
const { path } = await context.params;
|
|
278
|
+
return handler.handleInfer(request, path.join("/"));
|
|
279
|
+
},
|
|
280
|
+
/**
|
|
281
|
+
* Use as GET handler in app/api/stream/[...path]/route.ts
|
|
282
|
+
*/
|
|
283
|
+
handleStream: async (request, context) => {
|
|
284
|
+
const { path } = await context.params;
|
|
285
|
+
return handler.handleStream(request, path.join("/"));
|
|
286
|
+
},
|
|
287
|
+
/**
|
|
288
|
+
* Use as POST handler in app/api/attachments/[...path]/route.ts
|
|
289
|
+
*/
|
|
290
|
+
handleAttachment: async (request, context) => {
|
|
291
|
+
const { path } = await context.params;
|
|
292
|
+
const [streamId, attachmentId] = path;
|
|
293
|
+
if (!streamId || !attachmentId) {
|
|
294
|
+
return new Response(
|
|
295
|
+
JSON.stringify({ error: "streamId and attachmentId are required in path" }),
|
|
296
|
+
{ status: 422, headers: { "Content-Type": "application/json" } }
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
return handler.handleAttachment(request, streamId, attachmentId);
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
export {
|
|
304
|
+
createNextJsRouteHandlers,
|
|
305
|
+
handleChatRequest,
|
|
306
|
+
handleStreamRequest,
|
|
307
|
+
initConversation2 as initConversation
|
|
308
|
+
};
|
|
309
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/proxy.ts","../../src/next/actions.ts","../../src/actions/session.action.ts","../../src/next/index.ts"],"sourcesContent":["export interface ProxyConfig {\n assistantBaseUrl: string;\n apiKey: string;\n inferRoute?: string; // default: 'event/infer'\n streamRoute?: string; // default: 'event/stream'\n attachmentRoute?: string; // default: 'event/attachment'\n}\n\nexport interface AlquimiaProxyHandler {\n handleInfer(request: Request, pathSuffix: string): Promise<Response>;\n handleStream(request: Request, pathSuffix: string): Promise<Response>;\n handleAttachment(request: Request, streamId: string, attachmentId: string): Promise<Response>;\n}\n\nexport function createAlquimiaProxyHandler(config: ProxyConfig): AlquimiaProxyHandler {\n const baseUrl = config.assistantBaseUrl.replace(/\\/$/, '');\n const inferRoute = config.inferRoute ?? 'event/infer';\n const streamRoute = config.streamRoute ?? 'event/stream';\n const attachmentRoute = config.attachmentRoute ?? 'event/attachment';\n const authHeader = { Authorization: `Bearer ${config.apiKey}` };\n\n return {\n async handleInfer(request: Request, pathSuffix: string): Promise<Response> {\n try {\n const body = await request.json();\n const url = new URL(request.url);\n const querySuffix = url.searchParams.toString()\n ? `?${url.searchParams.toString()}`\n : '';\n const targetUrl = `${baseUrl}/${inferRoute}/${pathSuffix}${querySuffix}`;\n\n const response = await fetch(targetUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...authHeader },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorJson = await response.json().catch(() => ({}));\n console.error('AlquimiaProxy handleInfer error:', {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n return new Response(\n JSON.stringify({\n status: response.status,\n statusText: response.statusText,\n ...errorJson,\n }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Content-Encoding',\n },\n });\n } catch (error) {\n console.error('AlquimiaProxy handleInfer exception:', error);\n return new Response(\n JSON.stringify({ error: 'Failed to forward infer request' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n },\n\n async handleStream(request: Request, pathSuffix: string): Promise<Response> {\n try {\n const targetUrl = `${baseUrl}/${streamRoute}/${pathSuffix}`;\n\n const response = await fetch(targetUrl, {\n headers: { 'Content-Type': 'application/json', ...authHeader },\n });\n\n if (!response.ok) {\n const errorJson = await response.json().catch(() => ({}));\n console.error('AlquimiaProxy handleStream error:', {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n return new Response(\n JSON.stringify({\n error: errorJson.message || response.statusText || 'Failed to forward stream',\n ...errorJson,\n }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n } catch (error) {\n console.error('AlquimiaProxy handleStream exception:', error);\n return new Response(\n JSON.stringify({ error: 'Failed to forward stream request' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n },\n\n async handleAttachment(\n request: Request,\n streamId: string,\n attachmentId: string\n ): Promise<Response> {\n try {\n const targetUrl = `${baseUrl}/${attachmentRoute}/${streamId}/${attachmentId}`;\n const contentType = request.headers.get('Content-Type') ?? '';\n\n const response = await fetch(targetUrl, {\n method: 'POST',\n headers: {\n ...authHeader,\n ...(contentType && { 'Content-Type': contentType }),\n },\n body: request.body,\n duplex: 'half',\n } as RequestInit);\n\n if (!response.ok) {\n return new Response(\n JSON.stringify({ error: 'Failed to upload attachment', status: response.status }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const responseText = await response.text();\n return new Response(responseText, {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n console.error('AlquimiaProxy handleAttachment exception:', error);\n return new Response(\n JSON.stringify({ error: 'Failed to forward attachment request' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n },\n };\n}\n","\"use server\";\nimport { NextResponse } from \"next/server\";\nimport { headers, cookies } from \"next/headers\";\nimport { initConversation as initConversationAgnostic, type SessionStorage } from \"../actions/session.action\";\n\nexport type ChatRouteContext = {\n params: {\n path: string[];\n };\n};\n\nexport type ChatRequestConfig = {\n assistantBaseUrl: string;\n assistantRoute?: string;\n apiKey: string;\n};\n\nexport type ChatResponse = Response | any;\n\n/**\n * @deprecated Use `createNextJsRouteHandlers()` from `@alquimia-ai/tools/next` instead.\n */\nexport async function handleChatRequest(\n request: Request,\n context: ChatRouteContext,\n config: ChatRequestConfig\n): Promise<ChatResponse> {\n try {\n const headersList = await headers();\n const body = await request.json();\n const routeParams = await context.params;\n const routePath = routeParams.path.join(\"/\");\n const assistantRoute = config.assistantRoute || \"infer\";\n\n const url = new URL(request.url);\n const queryString = url.searchParams.toString();\n const querySuffix = queryString ? `?${queryString}` : '';\n \n const assistantUrl = `${config.assistantBaseUrl}/${assistantRoute}/${routePath}${querySuffix}`;\n\n const response = await fetch(assistantUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...headersList,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorJson = await response.json();\n console.error(\"Chat inference server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n\n return NextResponse.json(\n {\n status: response.status,\n statusText: response.statusText ||\n \"Failed to forward Chat data\",\n ...errorJson,\n },\n { status: response.status }\n );\n }\n\n return new NextResponse(response.body, {\n status: 200,\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Content-Encoding\",\n },\n });\n } catch (error) {\n return NextResponse.json(\n { error: \"Failed to forward Chat data\" },\n { status: 500 }\n );\n }\n}\n\n/**\n * @deprecated Use `createNextJsRouteHandlers()` from `@alquimia-ai/tools/next` instead.\n */\nexport async function handleStreamRequest(\n request: Request,\n context: ChatRouteContext,\n config: ChatRequestConfig\n): Promise<Response> {\n try {\n const headersList = await headers();\n const routeParams = await context.params;\n const path = routeParams.path.join(\"/\");\n const assistantRoute = config.assistantRoute || \"stream\";\n\n const streamUrl = `${config.assistantBaseUrl}/${assistantRoute}/${path}`;\n\n const response = await fetch(streamUrl, {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n ...Object.fromEntries(headersList.entries()),\n },\n });\n\n if (!response.ok) {\n const errorJson = await response.json();\n console.error(\"Stream server error:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorJson,\n });\n\n return new Response(\n JSON.stringify({\n error:\n errorJson.message ||\n response.statusText ||\n \"Failed to forward Stream data\",\n ...errorJson,\n }),\n { status: response.status }\n );\n }\n\n return new Response(response.body, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"Stream error:\", error);\n return new Response(\n JSON.stringify({ error: \"Failed to forward stream data\" }),\n { status: 500 }\n );\n }\n}\n\n/**\n * Next.js-specific session initializer using cookies().\n * For framework-agnostic usage, use `initConversation` from `@alquimia-ai/tools/actions`\n * with your own `SessionStorage` implementation.\n */\nexport async function initConversation(reset?: boolean, topicId?: string): Promise<string> {\n const cookieStore = await cookies();\n\n const storage: SessionStorage = {\n get(key: string) {\n return cookieStore.get(key)?.value ?? null;\n },\n set(key: string, value: string) {\n cookieStore.set(key, value);\n },\n };\n\n return initConversationAgnostic(storage, reset, topicId);\n}\n","\"use server\";\nimport { randomUUID } from \"crypto\";\nimport { ConversationsMap } from \"../types/type\";\n\nexport interface SessionStorage {\n get(key: string): string | undefined | null | Promise<string | undefined | null>;\n set(key: string, value: string): void | Promise<void>;\n}\n\nexport async function initConversation(\n storage: SessionStorage,\n reset?: boolean,\n topicId?: string\n): Promise<string> {\n if (!topicId) {\n let conversationId = randomUUID().toString();\n const existing = await storage.get(\"alquimia-session\");\n\n if (!existing || reset) {\n await storage.set(\"alquimia-session\", conversationId);\n } else {\n conversationId = existing;\n }\n\n return conversationId;\n }\n\n let conversationsMap: ConversationsMap = {};\n const existingConversations = await storage.get(\"alquimia-sessions\");\n\n if (existingConversations) {\n try {\n const decodedValue = decodeURIComponent(existingConversations);\n conversationsMap = JSON.parse(decodedValue) as ConversationsMap;\n } catch (e) {\n console.error(\"Error parsing conversations cookie:\", e);\n conversationsMap = {};\n }\n }\n\n if (!conversationsMap[topicId] || reset) {\n conversationsMap[topicId] = randomUUID().toString();\n }\n\n await storage.set(\"alquimia-sessions\", JSON.stringify(conversationsMap));\n\n return conversationsMap[topicId];\n}\n","import { createAlquimiaProxyHandler, type ProxyConfig } from '../proxy';\n\nexport type { ProxyConfig };\n\nexport {\n handleChatRequest,\n handleStreamRequest,\n initConversation,\n type ChatRouteContext,\n type ChatRequestConfig,\n type ChatResponse,\n} from './actions';\n\nexport interface NextJsRouteContext {\n params: Promise<{ path: string[] }>;\n}\n\nexport function createNextJsRouteHandlers(config: ProxyConfig) {\n const handler = createAlquimiaProxyHandler(config);\n\n return {\n /**\n * Use as POST handler in app/api/chat/[...path]/route.ts\n */\n handleInfer: async (request: Request, context: NextJsRouteContext): Promise<Response> => {\n const { path } = await context.params;\n return handler.handleInfer(request, path.join('/'));\n },\n\n /**\n * Use as GET handler in app/api/stream/[...path]/route.ts\n */\n handleStream: async (request: Request, context: NextJsRouteContext): Promise<Response> => {\n const { path } = await context.params;\n return handler.handleStream(request, path.join('/'));\n },\n\n /**\n * Use as POST handler in app/api/attachments/[...path]/route.ts\n */\n handleAttachment: async (request: Request, context: NextJsRouteContext): Promise<Response> => {\n const { path } = await context.params;\n const [streamId, attachmentId] = path;\n if (!streamId || !attachmentId) {\n return new Response(\n JSON.stringify({ error: 'streamId and attachmentId are required in path' }),\n { status: 422, headers: { 'Content-Type': 'application/json' } }\n );\n }\n return handler.handleAttachment(request, streamId, attachmentId);\n },\n };\n}\n"],"mappings":"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","names":["initConversation"]}
|
|
@@ -23,9 +23,10 @@ declare class AlquimiaRatingsProvider extends RatingsProvider {
|
|
|
23
23
|
rate(data: RatingData): Promise<Record<string, any>>;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/** textToSpeech and speechToText are not implemented — use ElevenLabsWhisperProvider or OrpheusWhisperProvider */
|
|
26
27
|
declare class OpenAIWhisperProvider extends WhisperProvider {
|
|
27
|
-
textToSpeech(
|
|
28
|
-
speechToText(
|
|
28
|
+
textToSpeech(_text: string): Promise<TTSResult>;
|
|
29
|
+
speechToText(_audio: string): Promise<string>;
|
|
29
30
|
}
|
|
30
31
|
declare class OpenAIAnalyzeCharProvider extends CharacterizationProvider {
|
|
31
32
|
private client;
|
|
@@ -47,6 +48,8 @@ interface ElevenLabsConfig {
|
|
|
47
48
|
baseURL: string;
|
|
48
49
|
apiKey: string;
|
|
49
50
|
voiceId: string;
|
|
51
|
+
model?: string;
|
|
52
|
+
language?: string;
|
|
50
53
|
voiceSettings?: {
|
|
51
54
|
stability?: number;
|
|
52
55
|
similarity_boost?: number;
|
|
@@ -75,7 +78,8 @@ interface OrpheusConfig {
|
|
|
75
78
|
}
|
|
76
79
|
declare class OrpheusWhisperProvider extends WhisperProvider {
|
|
77
80
|
constructor(config: OrpheusConfig);
|
|
78
|
-
speechToText
|
|
81
|
+
/** speechToText is not implemented for Orpheus */
|
|
82
|
+
speechToText(_audio: string): Promise<string>;
|
|
79
83
|
textToSpeech(text: string): Promise<TTSResult>;
|
|
80
84
|
}
|
|
81
85
|
|
|
@@ -23,9 +23,10 @@ declare class AlquimiaRatingsProvider extends RatingsProvider {
|
|
|
23
23
|
rate(data: RatingData): Promise<Record<string, any>>;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/** textToSpeech and speechToText are not implemented — use ElevenLabsWhisperProvider or OrpheusWhisperProvider */
|
|
26
27
|
declare class OpenAIWhisperProvider extends WhisperProvider {
|
|
27
|
-
textToSpeech(
|
|
28
|
-
speechToText(
|
|
28
|
+
textToSpeech(_text: string): Promise<TTSResult>;
|
|
29
|
+
speechToText(_audio: string): Promise<string>;
|
|
29
30
|
}
|
|
30
31
|
declare class OpenAIAnalyzeCharProvider extends CharacterizationProvider {
|
|
31
32
|
private client;
|
|
@@ -47,6 +48,8 @@ interface ElevenLabsConfig {
|
|
|
47
48
|
baseURL: string;
|
|
48
49
|
apiKey: string;
|
|
49
50
|
voiceId: string;
|
|
51
|
+
model?: string;
|
|
52
|
+
language?: string;
|
|
50
53
|
voiceSettings?: {
|
|
51
54
|
stability?: number;
|
|
52
55
|
similarity_boost?: number;
|
|
@@ -75,7 +78,8 @@ interface OrpheusConfig {
|
|
|
75
78
|
}
|
|
76
79
|
declare class OrpheusWhisperProvider extends WhisperProvider {
|
|
77
80
|
constructor(config: OrpheusConfig);
|
|
78
|
-
speechToText
|
|
81
|
+
/** speechToText is not implemented for Orpheus */
|
|
82
|
+
speechToText(_audio: string): Promise<string>;
|
|
79
83
|
textToSpeech(text: string): Promise<TTSResult>;
|
|
80
84
|
}
|
|
81
85
|
|
package/dist/providers/index.js
CHANGED
|
@@ -1976,10 +1976,10 @@ function generateTranslatePrompt(text) {
|
|
|
1976
1976
|
// src/providers/openai.ts
|
|
1977
1977
|
var import_openai = __toESM(require("openai"));
|
|
1978
1978
|
var OpenAIWhisperProvider = class extends WhisperProvider {
|
|
1979
|
-
async textToSpeech(
|
|
1979
|
+
async textToSpeech(_text) {
|
|
1980
1980
|
return { type: "url", data: "" };
|
|
1981
1981
|
}
|
|
1982
|
-
async speechToText(
|
|
1982
|
+
async speechToText(_audio) {
|
|
1983
1983
|
return "";
|
|
1984
1984
|
}
|
|
1985
1985
|
};
|
|
@@ -1992,10 +1992,12 @@ var OpenAIAnalyzeCharProvider = class extends CharacterizationProvider {
|
|
|
1992
1992
|
}
|
|
1993
1993
|
async analyzeCharacterization(text) {
|
|
1994
1994
|
const prompt = generateTranslatePrompt(text);
|
|
1995
|
+
const model = this.config.model ?? "gpt-4o-mini";
|
|
1996
|
+
const systemPrompt = this.config.systemPrompt ?? "You are a helpful assistant.";
|
|
1995
1997
|
const response = await this.client.chat.completions.create({
|
|
1996
|
-
model
|
|
1998
|
+
model,
|
|
1997
1999
|
messages: [
|
|
1998
|
-
{ role: "system", content:
|
|
2000
|
+
{ role: "system", content: systemPrompt },
|
|
1999
2001
|
{ role: "user", content: prompt }
|
|
2000
2002
|
],
|
|
2001
2003
|
max_tokens: 150,
|
|
@@ -2037,11 +2039,12 @@ var StabilityProvider = class extends StableDiffusionProvider {
|
|
|
2037
2039
|
}
|
|
2038
2040
|
async generateImage(query) {
|
|
2039
2041
|
const payload = {
|
|
2040
|
-
prompt:
|
|
2042
|
+
prompt: query,
|
|
2041
2043
|
output_format: "webp"
|
|
2042
2044
|
};
|
|
2045
|
+
const baseUrl = this.config.baseUrl ?? "https://api.stability.ai";
|
|
2043
2046
|
const response = await import_axios2.default.postForm(
|
|
2044
|
-
|
|
2047
|
+
`${baseUrl}/v2beta/stable-image/generate/ultra`,
|
|
2045
2048
|
import_axios2.default.toFormData(payload, new FormData()),
|
|
2046
2049
|
{
|
|
2047
2050
|
validateStatus: void 0,
|
|
@@ -2069,17 +2072,14 @@ var defaultVoiceSettings = {
|
|
|
2069
2072
|
similarity_boost: 0.3,
|
|
2070
2073
|
style: 0.2
|
|
2071
2074
|
};
|
|
2072
|
-
var defaultRequestSpecs = {
|
|
2073
|
-
optimize_streaming_latency: import_elevenlabs.ElevenLabs.OptimizeStreamingLatency.Zero,
|
|
2074
|
-
output_format: import_elevenlabs.ElevenLabs.OutputFormat.Mp344100128,
|
|
2075
|
-
model_id: "eleven_multilingual_v2",
|
|
2076
|
-
language: "es"
|
|
2077
|
-
};
|
|
2078
2075
|
var ElevenLabsWhisperProvider = class extends WhisperProvider {
|
|
2079
2076
|
constructor(config) {
|
|
2080
2077
|
super(config);
|
|
2081
2078
|
this.requestSpecs = {
|
|
2082
|
-
|
|
2079
|
+
optimize_streaming_latency: import_elevenlabs.ElevenLabs.OptimizeStreamingLatency.Zero,
|
|
2080
|
+
output_format: import_elevenlabs.ElevenLabs.OutputFormat.Mp344100128,
|
|
2081
|
+
model_id: config.model ?? "eleven_multilingual_v2",
|
|
2082
|
+
language: config.language ?? "es",
|
|
2083
2083
|
voice_settings: {
|
|
2084
2084
|
...defaultVoiceSettings,
|
|
2085
2085
|
...config.voiceSettings
|
|
@@ -2150,7 +2150,8 @@ var OrpheusWhisperProvider = class extends WhisperProvider {
|
|
|
2150
2150
|
constructor(config) {
|
|
2151
2151
|
super(config);
|
|
2152
2152
|
}
|
|
2153
|
-
|
|
2153
|
+
/** speechToText is not implemented for Orpheus */
|
|
2154
|
+
async speechToText(_audio) {
|
|
2154
2155
|
return "";
|
|
2155
2156
|
}
|
|
2156
2157
|
async textToSpeech(text) {
|