@alquimia-ai/tools 1.13.1 → 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.
Files changed (79) hide show
  1. package/dist/actions/index.d.mts +7 -17
  2. package/dist/actions/index.d.ts +7 -17
  3. package/dist/actions/index.js +45 -152
  4. package/dist/actions/index.js.map +1 -1
  5. package/dist/actions/index.mjs +45 -152
  6. package/dist/actions/index.mjs.map +1 -1
  7. package/dist/adapters/fetch.d.mts +12 -0
  8. package/dist/adapters/fetch.d.ts +12 -0
  9. package/dist/adapters/fetch.js +44 -0
  10. package/dist/adapters/fetch.js.map +1 -0
  11. package/dist/adapters/fetch.mjs +23 -0
  12. package/dist/adapters/fetch.mjs.map +1 -0
  13. package/dist/adapters/index.d.mts +11 -0
  14. package/dist/adapters/index.d.ts +11 -0
  15. package/dist/adapters/index.js +19 -0
  16. package/dist/adapters/index.js.map +1 -0
  17. package/dist/adapters/index.mjs +1 -0
  18. package/dist/adapters/index.mjs.map +1 -0
  19. package/dist/adapters/next.d.mts +10 -0
  20. package/dist/adapters/next.d.ts +10 -0
  21. package/dist/adapters/next.js +42 -0
  22. package/dist/adapters/next.js.map +1 -0
  23. package/dist/adapters/next.mjs +21 -0
  24. package/dist/adapters/next.mjs.map +1 -0
  25. package/dist/hooks/index.d.mts +22 -2
  26. package/dist/hooks/index.d.ts +22 -2
  27. package/dist/hooks/index.js +283 -66
  28. package/dist/hooks/index.js.map +1 -1
  29. package/dist/hooks/index.mjs +274 -67
  30. package/dist/hooks/index.mjs.map +1 -1
  31. package/dist/next/index.d.mts +49 -0
  32. package/dist/next/index.d.ts +49 -0
  33. package/dist/next/index.js +332 -0
  34. package/dist/next/index.js.map +1 -0
  35. package/dist/next/index.mjs +309 -0
  36. package/dist/next/index.mjs.map +1 -0
  37. package/dist/providers/index.d.mts +7 -3
  38. package/dist/providers/index.d.ts +7 -3
  39. package/dist/providers/index.js +15 -14
  40. package/dist/providers/index.js.map +1 -1
  41. package/dist/providers/index.mjs +15 -14
  42. package/dist/providers/index.mjs.map +1 -1
  43. package/dist/proxy.d.mts +15 -0
  44. package/dist/proxy.d.ts +15 -0
  45. package/dist/proxy.js +147 -0
  46. package/dist/proxy.js.map +1 -0
  47. package/dist/proxy.mjs +126 -0
  48. package/dist/proxy.mjs.map +1 -0
  49. package/dist/sdk/index.d.mts +8 -14
  50. package/dist/sdk/index.d.ts +8 -14
  51. package/dist/sdk/index.js +49 -49
  52. package/dist/sdk/index.js.map +1 -1
  53. package/dist/sdk/index.mjs +49 -49
  54. package/dist/sdk/index.mjs.map +1 -1
  55. package/dist/services/index.d.mts +25 -3
  56. package/dist/services/index.d.ts +25 -3
  57. package/dist/types/index.d.mts +2 -1
  58. package/dist/types/index.d.ts +2 -1
  59. package/dist/types/index.js.map +1 -1
  60. package/dist/types/index.mjs.map +1 -1
  61. package/dist/utils/index.d.mts +1 -2
  62. package/dist/utils/index.d.ts +1 -2
  63. package/dist/utils/index.js +0 -17
  64. package/dist/utils/index.js.map +1 -1
  65. package/dist/utils/index.mjs +0 -17
  66. package/dist/utils/index.mjs.map +1 -1
  67. package/package.json +35 -5
  68. package/dist/providers/elastic/index.d.mts +0 -23
  69. package/dist/providers/elastic/index.d.ts +0 -23
  70. package/dist/providers/elastic/index.js +0 -102
  71. package/dist/providers/elastic/index.js.map +0 -1
  72. package/dist/providers/elastic/index.mjs +0 -69
  73. package/dist/providers/elastic/index.mjs.map +0 -1
  74. package/dist/services/apm/index.d.mts +0 -26
  75. package/dist/services/apm/index.d.ts +0 -26
  76. package/dist/services/apm/index.js +0 -86
  77. package/dist/services/apm/index.js.map +0 -1
  78. package/dist/services/apm/index.mjs +0 -63
  79. 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":";AAcO,SAAS,2BAA2B,QAA2C;AACpF,QAAM,UAAU,OAAO,iBAAiB,QAAQ,OAAO,EAAE;AACzD,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,cAAc,OAAO,eAAe;AAC1C,QAAM,kBAAkB,OAAO,mBAAmB;AAClD,QAAM,aAAa,EAAE,eAAe,UAAU,OAAO,MAAM,GAAG;AAE9D,SAAO;AAAA,IACL,MAAM,YAAY,SAAkB,YAAuC;AACzE,UAAI;AACF,cAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,cAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,cAAM,cAAc,IAAI,aAAa,SAAS,IAC1C,IAAI,IAAI,aAAa,SAAS,CAAC,KAC/B;AACJ,cAAM,YAAY,GAAG,OAAO,IAAI,UAAU,IAAI,UAAU,GAAG,WAAW;AAEtE,cAAM,WAAW,MAAM,MAAM,WAAW;AAAA,UACtC,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,WAAW;AAAA,UAC7D,MAAM,KAAK,UAAU,IAAI;AAAA,QAC3B,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,kBAAQ,MAAM,oCAAoC;AAAA,YAChD,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,YACrB,MAAM;AAAA,UACR,CAAC;AACD,iBAAO,IAAI;AAAA,YACT,KAAK,UAAU;AAAA,cACb,QAAQ,SAAS;AAAA,cACjB,YAAY,SAAS;AAAA,cACrB,GAAG;AAAA,YACL,CAAC;AAAA,YACD,EAAE,QAAQ,SAAS,QAAQ,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,UAC7E;AAAA,QACF;AAEA,eAAO,IAAI,SAAS,SAAS,MAAM;AAAA,UACjC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,+BAA+B;AAAA,YAC/B,gCAAgC;AAAA,YAChC,gCAAgC;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,wCAAwC,KAAK;AAC3D,eAAO,IAAI;AAAA,UACT,KAAK,UAAU,EAAE,OAAO,kCAAkC,CAAC;AAAA,UAC3D,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,SAAkB,YAAuC;AAC1E,UAAI;AACF,cAAM,YAAY,GAAG,OAAO,IAAI,WAAW,IAAI,UAAU;AAEzD,cAAM,WAAW,MAAM,MAAM,WAAW;AAAA,UACtC,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,WAAW;AAAA,QAC/D,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,kBAAQ,MAAM,qCAAqC;AAAA,YACjD,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,YACrB,MAAM;AAAA,UACR,CAAC;AACD,iBAAO,IAAI;AAAA,YACT,KAAK,UAAU;AAAA,cACb,OAAO,UAAU,WAAW,SAAS,cAAc;AAAA,cACnD,GAAG;AAAA,YACL,CAAC;AAAA,YACD,EAAE,QAAQ,SAAS,QAAQ,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,UAC7E;AAAA,QACF;AAEA,eAAO,IAAI,SAAS,SAAS,MAAM;AAAA,UACjC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,iBAAiB;AAAA,YACjB,YAAY;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,yCAAyC,KAAK;AAC5D,eAAO,IAAI;AAAA,UACT,KAAK,UAAU,EAAE,OAAO,mCAAmC,CAAC;AAAA,UAC5D,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,iBACJ,SACA,UACA,cACmB;AACnB,UAAI;AACF,cAAM,YAAY,GAAG,OAAO,IAAI,eAAe,IAAI,QAAQ,IAAI,YAAY;AAC3E,cAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,KAAK;AAE3D,cAAM,WAAW,MAAM,MAAM,WAAW;AAAA,UACtC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,GAAG;AAAA,YACH,GAAI,eAAe,EAAE,gBAAgB,YAAY;AAAA,UACnD;AAAA,UACA,MAAM,QAAQ;AAAA,UACd,QAAQ;AAAA,QACV,CAAgB;AAEhB,YAAI,CAAC,SAAS,IAAI;AAChB,iBAAO,IAAI;AAAA,YACT,KAAK,UAAU,EAAE,OAAO,+BAA+B,QAAQ,SAAS,OAAO,CAAC;AAAA,YAChF,EAAE,QAAQ,SAAS,QAAQ,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,UAC7E;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,SAAS,KAAK;AACzC,eAAO,IAAI,SAAS,cAAc;AAAA,UAChC,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,6CAA6C,KAAK;AAChE,eAAO,IAAI;AAAA,UACT,KAAK,UAAU,EAAE,OAAO,uCAAuC,CAAC;AAAA,UAChE,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACvJA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,eAAe;;;ACDjC,SAAS,kBAAkB;AAQ3B,eAAsB,iBACpB,SACA,OACA,SACiB;AACjB,MAAI,CAAC,SAAS;AACZ,QAAI,iBAAiB,WAAW,EAAE,SAAS;AAC3C,UAAM,WAAW,MAAM,QAAQ,IAAI,kBAAkB;AAErD,QAAI,CAAC,YAAY,OAAO;AACtB,YAAM,QAAQ,IAAI,oBAAoB,cAAc;AAAA,IACtD,OAAO;AACL,uBAAiB;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,mBAAqC,CAAC;AAC1C,QAAM,wBAAwB,MAAM,QAAQ,IAAI,mBAAmB;AAEnE,MAAI,uBAAuB;AACzB,QAAI;AACF,YAAM,eAAe,mBAAmB,qBAAqB;AAC7D,yBAAmB,KAAK,MAAM,YAAY;AAAA,IAC5C,SAAS,GAAG;AACV,cAAQ,MAAM,uCAAuC,CAAC;AACtD,yBAAmB,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB,OAAO,KAAK,OAAO;AACvC,qBAAiB,OAAO,IAAI,WAAW,EAAE,SAAS;AAAA,EACpD;AAEA,QAAM,QAAQ,IAAI,qBAAqB,KAAK,UAAU,gBAAgB,CAAC;AAEvE,SAAO,iBAAiB,OAAO;AACjC;;;ADzBA,eAAsB,kBACpB,SACA,SACA,QACuB;AACvB,MAAI;AACF,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,YAAY,YAAY,KAAK,KAAK,GAAG;AAC3C,UAAM,iBAAiB,OAAO,kBAAkB;AAEhD,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,cAAc,IAAI,aAAa,SAAS;AAC9C,UAAM,cAAc,cAAc,IAAI,WAAW,KAAK;AAEtD,UAAM,eAAe,GAAG,OAAO,gBAAgB,IAAI,cAAc,IAAI,SAAS,GAAG,WAAW;AAE5F,UAAM,WAAW,MAAM,MAAM,cAAc;AAAA,MACzC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,OAAO,MAAM;AAAA,QACtC,GAAG;AAAA,MACL;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAQ,MAAM,gCAAgC;AAAA,QAC5C,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAED,aAAO,aAAa;AAAA,QAClB;AAAA,UACE,QAAQ,SAAS;AAAA,UACjB,YAAY,SAAS,cACrB;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,EAAE,QAAQ,SAAS,OAAO;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO,IAAI,aAAa,SAAS,MAAM;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,+BAA+B;AAAA,QAC/B,gCAAgC;AAAA,QAChC,gCAAgC;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,aAAa;AAAA,MAClB,EAAE,OAAO,8BAA8B;AAAA,MACvC,EAAE,QAAQ,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAKA,eAAsB,oBACpB,SACA,SACA,QACmB;AACnB,MAAI;AACF,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,OAAO,YAAY,KAAK,KAAK,GAAG;AACtC,UAAM,iBAAiB,OAAO,kBAAkB;AAEhD,UAAM,YAAY,GAAG,OAAO,gBAAgB,IAAI,cAAc,IAAI,IAAI;AAEtE,UAAM,WAAW,MAAM,MAAM,WAAW;AAAA,MACtC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,OAAO,MAAM;AAAA,QACtC,GAAG,OAAO,YAAY,YAAY,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAQ,MAAM,wBAAwB;AAAA,QACpC,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAED,aAAO,IAAI;AAAA,QACT,KAAK,UAAU;AAAA,UACb,OACE,UAAU,WACV,SAAS,cACT;AAAA,UACA,GAAG;AAAA,QACP,CAAC;AAAA,QACD,EAAE,QAAQ,SAAS,OAAO;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO,IAAI,SAAS,SAAS,MAAM;AAAA,MACjC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,KAAK;AACpC,WAAO,IAAI;AAAA,MACT,KAAK,UAAU,EAAE,OAAO,gCAAgC,CAAC;AAAA,MACzD,EAAE,QAAQ,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAOA,eAAsBA,kBAAiB,OAAiB,SAAmC;AACzF,QAAM,cAAc,MAAM,QAAQ;AAElC,QAAM,UAA0B;AAAA,IAC9B,IAAI,KAAa;AACf,aAAO,YAAY,IAAI,GAAG,GAAG,SAAS;AAAA,IACxC;AAAA,IACA,IAAI,KAAa,OAAe;AAC9B,kBAAY,IAAI,KAAK,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,iBAAyB,SAAS,OAAO,OAAO;AACzD;;;AEnJO,SAAS,0BAA0B,QAAqB;AAC7D,QAAM,UAAU,2BAA2B,MAAM;AAEjD,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,aAAa,OAAO,SAAkB,YAAmD;AACvF,YAAM,EAAE,KAAK,IAAI,MAAM,QAAQ;AAC/B,aAAO,QAAQ,YAAY,SAAS,KAAK,KAAK,GAAG,CAAC;AAAA,IACpD;AAAA;AAAA;AAAA;AAAA,IAKA,cAAc,OAAO,SAAkB,YAAmD;AACxF,YAAM,EAAE,KAAK,IAAI,MAAM,QAAQ;AAC/B,aAAO,QAAQ,aAAa,SAAS,KAAK,KAAK,GAAG,CAAC;AAAA,IACrD;AAAA;AAAA;AAAA;AAAA,IAKA,kBAAkB,OAAO,SAAkB,YAAmD;AAC5F,YAAM,EAAE,KAAK,IAAI,MAAM,QAAQ;AAC/B,YAAM,CAAC,UAAU,YAAY,IAAI;AACjC,UAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,eAAO,IAAI;AAAA,UACT,KAAK,UAAU,EAAE,OAAO,iDAAiD,CAAC;AAAA,UAC1E,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,QACjE;AAAA,MACF;AACA,aAAO,QAAQ,iBAAiB,SAAS,UAAU,YAAY;AAAA,IACjE;AAAA,EACF;AACF;","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(text: string): Promise<TTSResult>;
28
- speechToText(audio: string): Promise<string>;
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(audio: string): Promise<string>;
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(text: string): Promise<TTSResult>;
28
- speechToText(audio: string): Promise<string>;
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(audio: string): Promise<string>;
81
+ /** speechToText is not implemented for Orpheus */
82
+ speechToText(_audio: string): Promise<string>;
79
83
  textToSpeech(text: string): Promise<TTSResult>;
80
84
  }
81
85
 
@@ -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(text) {
1979
+ async textToSpeech(_text) {
1980
1980
  return { type: "url", data: "" };
1981
1981
  }
1982
- async speechToText(audio) {
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: "gpt-4o-mini",
1998
+ model,
1997
1999
  messages: [
1998
- { role: "system", content: "You are a helpful assistant." },
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: "query",
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
- `https://api.stability.ai/v2beta/stable-image/generate/ultra`,
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
- ...defaultRequestSpecs,
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
- async speechToText(audio) {
2153
+ /** speechToText is not implemented for Orpheus */
2154
+ async speechToText(_audio) {
2154
2155
  return "";
2155
2156
  }
2156
2157
  async textToSpeech(text) {