hazo_llm_api 1.2.12 → 1.3.0

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 (204) hide show
  1. package/README.md +321 -8
  2. package/config/hazo_llm_api_config.ini +33 -0
  3. package/dist/components/index.d.ts +2 -0
  4. package/dist/components/index.d.ts.map +1 -1
  5. package/dist/components/index.js +2 -0
  6. package/dist/components/index.js.map +1 -1
  7. package/dist/components/llm_call_inspector/index.d.ts +6 -0
  8. package/dist/components/llm_call_inspector/index.d.ts.map +1 -0
  9. package/dist/components/llm_call_inspector/index.js +5 -0
  10. package/dist/components/llm_call_inspector/index.js.map +1 -0
  11. package/dist/components/llm_call_inspector/llm_call_inspector.d.ts +18 -0
  12. package/dist/components/llm_call_inspector/llm_call_inspector.d.ts.map +1 -0
  13. package/dist/components/llm_call_inspector/llm_call_inspector.js +103 -0
  14. package/dist/components/llm_call_inspector/llm_call_inspector.js.map +1 -0
  15. package/dist/components/llm_cost_dashboard/index.d.ts +6 -0
  16. package/dist/components/llm_cost_dashboard/index.d.ts.map +1 -0
  17. package/dist/components/llm_cost_dashboard/index.js +5 -0
  18. package/dist/components/llm_cost_dashboard/index.js.map +1 -0
  19. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.d.ts +16 -0
  20. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.d.ts.map +1 -0
  21. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.js +154 -0
  22. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.js.map +1 -0
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/lib/cascade/cascade_runner.d.ts +50 -0
  26. package/dist/lib/cascade/cascade_runner.d.ts.map +1 -0
  27. package/dist/lib/cascade/cascade_runner.js +115 -0
  28. package/dist/lib/cascade/cascade_runner.js.map +1 -0
  29. package/dist/lib/cascade/index.d.ts +5 -0
  30. package/dist/lib/cascade/index.d.ts.map +1 -0
  31. package/dist/lib/cascade/index.js +4 -0
  32. package/dist/lib/cascade/index.js.map +1 -0
  33. package/dist/lib/cascade/types.d.ts +35 -0
  34. package/dist/lib/cascade/types.d.ts.map +1 -0
  35. package/dist/lib/cascade/types.js +14 -0
  36. package/dist/lib/cascade/types.js.map +1 -0
  37. package/dist/lib/cost_cap/cost_cap.d.ts +40 -0
  38. package/dist/lib/cost_cap/cost_cap.d.ts.map +1 -0
  39. package/dist/lib/cost_cap/cost_cap.js +150 -0
  40. package/dist/lib/cost_cap/cost_cap.js.map +1 -0
  41. package/dist/lib/cost_cap/index.d.ts +3 -0
  42. package/dist/lib/cost_cap/index.d.ts.map +1 -0
  43. package/dist/lib/cost_cap/index.js +2 -0
  44. package/dist/lib/cost_cap/index.js.map +1 -0
  45. package/dist/lib/database/init_api_log.d.ts +10 -0
  46. package/dist/lib/database/init_api_log.d.ts.map +1 -0
  47. package/dist/lib/database/init_api_log.js +91 -0
  48. package/dist/lib/database/init_api_log.js.map +1 -0
  49. package/dist/lib/hazo_connect/direct_db_connect.d.ts +11 -7
  50. package/dist/lib/hazo_connect/direct_db_connect.d.ts.map +1 -1
  51. package/dist/lib/hazo_connect/direct_db_connect.js +59 -6
  52. package/dist/lib/hazo_connect/direct_db_connect.js.map +1 -1
  53. package/dist/lib/hazo_connect/types.d.ts +35 -3
  54. package/dist/lib/hazo_connect/types.d.ts.map +1 -1
  55. package/dist/lib/llm_api/embed_cache.d.ts +15 -0
  56. package/dist/lib/llm_api/embed_cache.d.ts.map +1 -0
  57. package/dist/lib/llm_api/embed_cache.js +53 -0
  58. package/dist/lib/llm_api/embed_cache.js.map +1 -0
  59. package/dist/lib/llm_api/hazo_llm_document_text.d.ts.map +1 -1
  60. package/dist/lib/llm_api/hazo_llm_document_text.js +56 -14
  61. package/dist/lib/llm_api/hazo_llm_document_text.js.map +1 -1
  62. package/dist/lib/llm_api/hazo_llm_dynamic_data_extract.d.ts.map +1 -1
  63. package/dist/lib/llm_api/hazo_llm_dynamic_data_extract.js +19 -1
  64. package/dist/lib/llm_api/hazo_llm_dynamic_data_extract.js.map +1 -1
  65. package/dist/lib/llm_api/hazo_llm_embed.d.ts +10 -0
  66. package/dist/lib/llm_api/hazo_llm_embed.d.ts.map +1 -0
  67. package/dist/lib/llm_api/hazo_llm_embed.js +80 -0
  68. package/dist/lib/llm_api/hazo_llm_embed.js.map +1 -0
  69. package/dist/lib/llm_api/hazo_llm_image_image.d.ts.map +1 -1
  70. package/dist/lib/llm_api/hazo_llm_image_image.js +56 -14
  71. package/dist/lib/llm_api/hazo_llm_image_image.js.map +1 -1
  72. package/dist/lib/llm_api/hazo_llm_image_text.d.ts.map +1 -1
  73. package/dist/lib/llm_api/hazo_llm_image_text.js +56 -14
  74. package/dist/lib/llm_api/hazo_llm_image_text.js.map +1 -1
  75. package/dist/lib/llm_api/hazo_llm_prompt_chain.d.ts.map +1 -1
  76. package/dist/lib/llm_api/hazo_llm_prompt_chain.js +17 -1
  77. package/dist/lib/llm_api/hazo_llm_prompt_chain.js.map +1 -1
  78. package/dist/lib/llm_api/hazo_llm_text_image.d.ts.map +1 -1
  79. package/dist/lib/llm_api/hazo_llm_text_image.js +56 -14
  80. package/dist/lib/llm_api/hazo_llm_text_image.js.map +1 -1
  81. package/dist/lib/llm_api/hazo_llm_text_text.d.ts.map +1 -1
  82. package/dist/lib/llm_api/hazo_llm_text_text.js +90 -15
  83. package/dist/lib/llm_api/hazo_llm_text_text.js.map +1 -1
  84. package/dist/lib/llm_api/index.d.ts +29 -1
  85. package/dist/lib/llm_api/index.d.ts.map +1 -1
  86. package/dist/lib/llm_api/index.js +433 -6
  87. package/dist/lib/llm_api/index.js.map +1 -1
  88. package/dist/lib/llm_api/prompt_parts_helper.d.ts +15 -0
  89. package/dist/lib/llm_api/prompt_parts_helper.d.ts.map +1 -0
  90. package/dist/lib/llm_api/prompt_parts_helper.js +9 -0
  91. package/dist/lib/llm_api/prompt_parts_helper.js.map +1 -0
  92. package/dist/lib/llm_api/types.d.ts +187 -2
  93. package/dist/lib/llm_api/types.d.ts.map +1 -1
  94. package/dist/lib/llm_api/types.js +4 -0
  95. package/dist/lib/llm_api/types.js.map +1 -1
  96. package/dist/lib/maintenance/purge_log_job.d.ts +23 -0
  97. package/dist/lib/maintenance/purge_log_job.d.ts.map +1 -0
  98. package/dist/lib/maintenance/purge_log_job.js +42 -0
  99. package/dist/lib/maintenance/purge_log_job.js.map +1 -0
  100. package/dist/lib/observability/log_context.d.ts +15 -0
  101. package/dist/lib/observability/log_context.d.ts.map +1 -0
  102. package/dist/lib/observability/log_context.js +32 -0
  103. package/dist/lib/observability/log_context.js.map +1 -0
  104. package/dist/lib/observability/log_writer.d.ts +35 -0
  105. package/dist/lib/observability/log_writer.d.ts.map +1 -0
  106. package/dist/lib/observability/log_writer.js +106 -0
  107. package/dist/lib/observability/log_writer.js.map +1 -0
  108. package/dist/lib/observability/queries.d.ts +15 -0
  109. package/dist/lib/observability/queries.d.ts.map +1 -0
  110. package/dist/lib/observability/queries.js +78 -0
  111. package/dist/lib/observability/queries.js.map +1 -0
  112. package/dist/lib/observability/types.d.ts +77 -0
  113. package/dist/lib/observability/types.d.ts.map +1 -0
  114. package/dist/lib/observability/types.js +8 -0
  115. package/dist/lib/observability/types.js.map +1 -0
  116. package/dist/lib/pricing/pricing.d.ts +49 -0
  117. package/dist/lib/pricing/pricing.d.ts.map +1 -0
  118. package/dist/lib/pricing/pricing.js +153 -0
  119. package/dist/lib/pricing/pricing.js.map +1 -0
  120. package/dist/lib/pricing/pricing.json +75 -0
  121. package/dist/lib/pricing/types.d.ts +58 -0
  122. package/dist/lib/pricing/types.d.ts.map +1 -0
  123. package/dist/lib/pricing/types.js +8 -0
  124. package/dist/lib/pricing/types.js.map +1 -0
  125. package/dist/lib/providers/anthropic/anthropic_client.d.ts +71 -0
  126. package/dist/lib/providers/anthropic/anthropic_client.d.ts.map +1 -0
  127. package/dist/lib/providers/anthropic/anthropic_client.js +134 -0
  128. package/dist/lib/providers/anthropic/anthropic_client.js.map +1 -0
  129. package/dist/lib/providers/anthropic/anthropic_provider.d.ts +60 -0
  130. package/dist/lib/providers/anthropic/anthropic_provider.d.ts.map +1 -0
  131. package/dist/lib/providers/anthropic/anthropic_provider.js +273 -0
  132. package/dist/lib/providers/anthropic/anthropic_provider.js.map +1 -0
  133. package/dist/lib/providers/anthropic/anthropic_response_to_usage.d.ts +21 -0
  134. package/dist/lib/providers/anthropic/anthropic_response_to_usage.d.ts.map +1 -0
  135. package/dist/lib/providers/anthropic/anthropic_response_to_usage.js +46 -0
  136. package/dist/lib/providers/anthropic/anthropic_response_to_usage.js.map +1 -0
  137. package/dist/lib/providers/anthropic/index.d.ts +3 -0
  138. package/dist/lib/providers/anthropic/index.d.ts.map +1 -0
  139. package/dist/lib/providers/anthropic/index.js +2 -0
  140. package/dist/lib/providers/anthropic/index.js.map +1 -0
  141. package/dist/lib/providers/deepseek/deepseek_client.d.ts +55 -0
  142. package/dist/lib/providers/deepseek/deepseek_client.d.ts.map +1 -0
  143. package/dist/lib/providers/deepseek/deepseek_client.js +129 -0
  144. package/dist/lib/providers/deepseek/deepseek_client.js.map +1 -0
  145. package/dist/lib/providers/deepseek/deepseek_provider.d.ts +50 -0
  146. package/dist/lib/providers/deepseek/deepseek_provider.d.ts.map +1 -0
  147. package/dist/lib/providers/deepseek/deepseek_provider.js +147 -0
  148. package/dist/lib/providers/deepseek/deepseek_provider.js.map +1 -0
  149. package/dist/lib/providers/deepseek/deepseek_response_to_usage.d.ts +21 -0
  150. package/dist/lib/providers/deepseek/deepseek_response_to_usage.d.ts.map +1 -0
  151. package/dist/lib/providers/deepseek/deepseek_response_to_usage.js +40 -0
  152. package/dist/lib/providers/deepseek/deepseek_response_to_usage.js.map +1 -0
  153. package/dist/lib/providers/deepseek/index.d.ts +3 -0
  154. package/dist/lib/providers/deepseek/index.d.ts.map +1 -0
  155. package/dist/lib/providers/deepseek/index.js +2 -0
  156. package/dist/lib/providers/deepseek/index.js.map +1 -0
  157. package/dist/lib/providers/gemini/gemini_provider.d.ts.map +1 -1
  158. package/dist/lib/providers/gemini/gemini_provider.js +40 -4
  159. package/dist/lib/providers/gemini/gemini_provider.js.map +1 -1
  160. package/dist/lib/providers/gemini/gemini_response_to_usage.d.ts +37 -0
  161. package/dist/lib/providers/gemini/gemini_response_to_usage.d.ts.map +1 -0
  162. package/dist/lib/providers/gemini/gemini_response_to_usage.js +49 -0
  163. package/dist/lib/providers/gemini/gemini_response_to_usage.js.map +1 -0
  164. package/dist/lib/providers/index.d.ts +3 -0
  165. package/dist/lib/providers/index.d.ts.map +1 -1
  166. package/dist/lib/providers/index.js +3 -0
  167. package/dist/lib/providers/index.js.map +1 -1
  168. package/dist/lib/providers/openai/index.d.ts +3 -0
  169. package/dist/lib/providers/openai/index.d.ts.map +1 -0
  170. package/dist/lib/providers/openai/index.js +2 -0
  171. package/dist/lib/providers/openai/index.js.map +1 -0
  172. package/dist/lib/providers/openai/openai_client.d.ts +99 -0
  173. package/dist/lib/providers/openai/openai_client.d.ts.map +1 -0
  174. package/dist/lib/providers/openai/openai_client.js +187 -0
  175. package/dist/lib/providers/openai/openai_client.js.map +1 -0
  176. package/dist/lib/providers/openai/openai_provider.d.ts +66 -0
  177. package/dist/lib/providers/openai/openai_provider.d.ts.map +1 -0
  178. package/dist/lib/providers/openai/openai_provider.js +297 -0
  179. package/dist/lib/providers/openai/openai_provider.js.map +1 -0
  180. package/dist/lib/providers/openai/openai_response_to_usage.d.ts +21 -0
  181. package/dist/lib/providers/openai/openai_response_to_usage.d.ts.map +1 -0
  182. package/dist/lib/providers/openai/openai_response_to_usage.js +50 -0
  183. package/dist/lib/providers/openai/openai_response_to_usage.js.map +1 -0
  184. package/dist/lib/providers/qwen/qwen_provider.d.ts.map +1 -1
  185. package/dist/lib/providers/qwen/qwen_provider.js +52 -5
  186. package/dist/lib/providers/qwen/qwen_provider.js.map +1 -1
  187. package/dist/lib/providers/qwen/qwen_response_to_usage.d.ts +36 -0
  188. package/dist/lib/providers/qwen/qwen_response_to_usage.d.ts.map +1 -0
  189. package/dist/lib/providers/qwen/qwen_response_to_usage.js +50 -0
  190. package/dist/lib/providers/qwen/qwen_response_to_usage.js.map +1 -0
  191. package/dist/lib/providers/types.d.ts +16 -6
  192. package/dist/lib/providers/types.d.ts.map +1 -1
  193. package/dist/lib/providers/types.js +1 -0
  194. package/dist/lib/providers/types.js.map +1 -1
  195. package/dist/lib/utils.d.ts +13 -0
  196. package/dist/lib/utils.d.ts.map +1 -0
  197. package/dist/lib/utils.js +16 -0
  198. package/dist/lib/utils.js.map +1 -0
  199. package/dist/server.d.ts +16 -2
  200. package/dist/server.d.ts.map +1 -1
  201. package/dist/server.js +29 -2
  202. package/dist/server.js.map +1 -1
  203. package/migrations/hazo_llm_api_log.sql +69 -0
  204. package/package.json +26 -11
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Anthropic Provider Implementation
3
+ *
4
+ * Implements the LLMProvider interface for Anthropic's Claude API.
5
+ * Handles all Anthropic-specific logic including API calls, configuration,
6
+ * and capabilities (text_text, image_text, document_text, text_text_stream).
7
+ */
8
+ import { SERVICE_TYPES } from '../types.js';
9
+ import { call_anthropic_api, call_anthropic_api_stream, } from './anthropic_client.js';
10
+ import { anthropic_response_to_usage } from './anthropic_response_to_usage.js';
11
+ // =============================================================================
12
+ // Default constants
13
+ // =============================================================================
14
+ const DEFAULT_API_URL = 'https://api.anthropic.com/v1/messages';
15
+ const DEFAULT_API_VERSION = '2023-06-01';
16
+ const DEFAULT_MODEL = 'claude-sonnet-4-6';
17
+ // =============================================================================
18
+ // Anthropic Provider Class
19
+ // =============================================================================
20
+ /**
21
+ * Anthropic LLM Provider
22
+ * Implements the LLMProvider interface for Anthropic Claude API
23
+ */
24
+ export class AnthropicProvider {
25
+ constructor(config) {
26
+ this.name = 'anthropic';
27
+ this.api_key = config.api_key;
28
+ this.api_url = config.api_url ?? DEFAULT_API_URL;
29
+ this.api_version = config.api_version ?? DEFAULT_API_VERSION;
30
+ this.model_text_text = config.model_text_text;
31
+ this.model_image_text = config.model_image_text;
32
+ this.model_document_text = config.model_document_text;
33
+ this.generation_config = config.generation_config;
34
+ this.logger = config.logger;
35
+ if (config.capabilities && config.capabilities.length > 0) {
36
+ this.capabilities = new Set(config.capabilities);
37
+ }
38
+ else {
39
+ this.capabilities = new Set([
40
+ SERVICE_TYPES.TEXT_TEXT,
41
+ SERVICE_TYPES.IMAGE_TEXT,
42
+ SERVICE_TYPES.DOCUMENT_TEXT,
43
+ 'text_text_stream',
44
+ ]);
45
+ }
46
+ }
47
+ // =========================================================================
48
+ // LLMProvider interface — identity & introspection
49
+ // =========================================================================
50
+ get_name() {
51
+ return this.name;
52
+ }
53
+ get_capabilities() {
54
+ return new Set(this.capabilities);
55
+ }
56
+ get_model_for_service(service_type) {
57
+ switch (service_type) {
58
+ case SERVICE_TYPES.TEXT_TEXT:
59
+ return this.model_text_text;
60
+ case SERVICE_TYPES.IMAGE_TEXT:
61
+ return this.model_image_text;
62
+ case SERVICE_TYPES.DOCUMENT_TEXT:
63
+ return this.model_document_text;
64
+ default:
65
+ return undefined;
66
+ }
67
+ }
68
+ // =========================================================================
69
+ // text_text — Text input → Text output
70
+ // =========================================================================
71
+ async text_text(params, _logger) {
72
+ const model = this.model_text_text ?? DEFAULT_MODEL;
73
+ // Build message content — support prompt_parts for native caching
74
+ let content;
75
+ if (params.prompt_parts && params.prompt_parts.length > 0) {
76
+ content = params.prompt_parts.map(part => {
77
+ const text_item = { type: 'text', text: part.text };
78
+ if (part.cache) {
79
+ // Add cache_control for Anthropic's prompt caching feature
80
+ text_item['cache_control'] = { type: 'ephemeral' };
81
+ }
82
+ return text_item;
83
+ });
84
+ }
85
+ else {
86
+ content = [{ type: 'text', text: params.prompt ?? '' }];
87
+ }
88
+ const messages = [{ role: 'user', content }];
89
+ const start_time = Date.now();
90
+ let raw;
91
+ let status;
92
+ try {
93
+ ({ raw, status } = await call_anthropic_api({
94
+ api_key: this.api_key,
95
+ api_url: this.api_url,
96
+ api_version: this.api_version,
97
+ model,
98
+ messages,
99
+ generation_config: this.generation_config,
100
+ }));
101
+ }
102
+ catch (err) {
103
+ const error = err instanceof Error ? err.message : String(err);
104
+ return { success: false, error, error_code: 'NETWORK_ERROR', retryable: true };
105
+ }
106
+ const latency_ms = Date.now() - start_time;
107
+ if (status >= 400) {
108
+ const error_code = status === 429 ? 'RATE_LIMITED' : 'API_ERROR';
109
+ return {
110
+ success: false,
111
+ error: `Anthropic API error: ${status}`,
112
+ error_code,
113
+ retryable: error_code === 'RATE_LIMITED',
114
+ };
115
+ }
116
+ const response_content = raw.content;
117
+ const data = response_content?.[0]?.text;
118
+ const usage = anthropic_response_to_usage({ raw, model_fallback: model, latency_ms });
119
+ return {
120
+ success: true,
121
+ data,
122
+ text: data,
123
+ raw_response: raw,
124
+ usage,
125
+ };
126
+ }
127
+ // =========================================================================
128
+ // image_text — Image input → Text output
129
+ // =========================================================================
130
+ async image_text(params, _logger) {
131
+ const model = this.model_image_text ?? DEFAULT_MODEL;
132
+ const content = [
133
+ {
134
+ type: 'image',
135
+ source: {
136
+ type: 'base64',
137
+ media_type: params.image_mime_type,
138
+ data: params.image_b64,
139
+ },
140
+ },
141
+ { type: 'text', text: params.prompt },
142
+ ];
143
+ const messages = [{ role: 'user', content }];
144
+ const start_time = Date.now();
145
+ let raw;
146
+ let status;
147
+ try {
148
+ ({ raw, status } = await call_anthropic_api({
149
+ api_key: this.api_key,
150
+ api_url: this.api_url,
151
+ api_version: this.api_version,
152
+ model,
153
+ messages,
154
+ generation_config: this.generation_config,
155
+ }));
156
+ }
157
+ catch (err) {
158
+ const error = err instanceof Error ? err.message : String(err);
159
+ return { success: false, error, error_code: 'NETWORK_ERROR', retryable: true };
160
+ }
161
+ const latency_ms = Date.now() - start_time;
162
+ if (status >= 400) {
163
+ const error_code = status === 429 ? 'RATE_LIMITED' : 'API_ERROR';
164
+ return {
165
+ success: false,
166
+ error: `Anthropic API error: ${status}`,
167
+ error_code,
168
+ retryable: error_code === 'RATE_LIMITED',
169
+ };
170
+ }
171
+ const content_arr = raw.content;
172
+ const data = content_arr?.[0]?.text;
173
+ const usage = anthropic_response_to_usage({ raw, model_fallback: model, latency_ms });
174
+ return {
175
+ success: true,
176
+ data,
177
+ text: data,
178
+ raw_response: raw,
179
+ usage,
180
+ };
181
+ }
182
+ // =========================================================================
183
+ // document_text — Document (PDF) input → Text output
184
+ // =========================================================================
185
+ async document_text(params, _logger) {
186
+ const model = this.model_document_text ?? DEFAULT_MODEL;
187
+ const content = [
188
+ {
189
+ type: 'document',
190
+ source: {
191
+ type: 'base64',
192
+ media_type: 'application/pdf',
193
+ data: params.document_b64,
194
+ },
195
+ },
196
+ { type: 'text', text: params.prompt },
197
+ ];
198
+ const messages = [{ role: 'user', content }];
199
+ const start_time = Date.now();
200
+ let raw;
201
+ let status;
202
+ try {
203
+ ({ raw, status } = await call_anthropic_api({
204
+ api_key: this.api_key,
205
+ api_url: this.api_url,
206
+ api_version: this.api_version,
207
+ model,
208
+ messages,
209
+ generation_config: this.generation_config,
210
+ }));
211
+ }
212
+ catch (err) {
213
+ const error = err instanceof Error ? err.message : String(err);
214
+ return { success: false, error, error_code: 'NETWORK_ERROR', retryable: true };
215
+ }
216
+ const latency_ms = Date.now() - start_time;
217
+ if (status >= 400) {
218
+ const error_code = status === 429 ? 'RATE_LIMITED' : 'API_ERROR';
219
+ return {
220
+ success: false,
221
+ error: `Anthropic API error: ${status}`,
222
+ error_code,
223
+ retryable: error_code === 'RATE_LIMITED',
224
+ };
225
+ }
226
+ const content_arr = raw.content;
227
+ const data = content_arr?.[0]?.text;
228
+ const usage = anthropic_response_to_usage({ raw, model_fallback: model, latency_ms });
229
+ return {
230
+ success: true,
231
+ data,
232
+ text: data,
233
+ raw_response: raw,
234
+ usage,
235
+ };
236
+ }
237
+ // =========================================================================
238
+ // text_text_stream — Text input → streaming Text output
239
+ // =========================================================================
240
+ async text_text_stream(params, _logger) {
241
+ const model = this.model_text_text ?? DEFAULT_MODEL;
242
+ const messages = [
243
+ {
244
+ role: 'user',
245
+ content: [{ type: 'text', text: params.prompt ?? '' }],
246
+ },
247
+ ];
248
+ return call_anthropic_api_stream({
249
+ api_key: this.api_key,
250
+ api_url: this.api_url,
251
+ api_version: this.api_version,
252
+ model,
253
+ messages,
254
+ generation_config: this.generation_config,
255
+ });
256
+ }
257
+ // =========================================================================
258
+ // Unsupported methods (satisfy LLMProvider interface completeness)
259
+ // =========================================================================
260
+ async text_image(_params, _logger) {
261
+ return {
262
+ success: false,
263
+ error: 'Anthropic provider does not support text_image',
264
+ };
265
+ }
266
+ async image_image(_params, _logger) {
267
+ return {
268
+ success: false,
269
+ error: 'Anthropic provider does not support image_image',
270
+ };
271
+ }
272
+ }
273
+ //# sourceMappingURL=anthropic_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic_provider.js","sourceRoot":"","sources":["../../../../src/lib/providers/anthropic/anthropic_provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Pure transform: Anthropic API response → normalized UsageInfo.
3
+ *
4
+ * Kept separate so it can be unit-tested without network access or mocking
5
+ * any provider internals.
6
+ */
7
+ import type { UsageInfo } from '../../pricing/types.js';
8
+ /**
9
+ * Convert a raw Anthropic Messages API response into a normalized UsageInfo object.
10
+ * Calls compute_cost() to enrich with pricing data.
11
+ *
12
+ * @param opts.raw - The raw JSON response from the Anthropic API
13
+ * @param opts.model_fallback - Model string used when raw.model is absent
14
+ * @param opts.latency_ms - Wall-clock milliseconds from request start to response received
15
+ */
16
+ export declare function anthropic_response_to_usage(opts: {
17
+ raw: Record<string, unknown>;
18
+ model_fallback: string;
19
+ latency_ms: number;
20
+ }): UsageInfo;
21
+ //# sourceMappingURL=anthropic_response_to_usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic_response_to_usage.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/anthropic/anthropic_response_to_usage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,SAAS,CAoCZ"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Pure transform: Anthropic API response → normalized UsageInfo.
3
+ *
4
+ * Kept separate so it can be unit-tested without network access or mocking
5
+ * any provider internals.
6
+ */
7
+ import { compute_cost } from '../../pricing/pricing.js';
8
+ /**
9
+ * Convert a raw Anthropic Messages API response into a normalized UsageInfo object.
10
+ * Calls compute_cost() to enrich with pricing data.
11
+ *
12
+ * @param opts.raw - The raw JSON response from the Anthropic API
13
+ * @param opts.model_fallback - Model string used when raw.model is absent
14
+ * @param opts.latency_ms - Wall-clock milliseconds from request start to response received
15
+ */
16
+ export function anthropic_response_to_usage(opts) {
17
+ const { raw, model_fallback, latency_ms } = opts;
18
+ const usage = raw.usage;
19
+ const input_tokens = typeof usage?.input_tokens === 'number' ? usage.input_tokens : 0;
20
+ const output_tokens = typeof usage?.output_tokens === 'number' ? usage.output_tokens : 0;
21
+ const model = typeof raw.model === 'string' ? raw.model : model_fallback;
22
+ const finish_reason = typeof raw.stop_reason === 'string' ? raw.stop_reason : undefined;
23
+ const cost_usd = compute_cost({
24
+ provider: 'anthropic',
25
+ model,
26
+ tokens: {
27
+ input: input_tokens,
28
+ output: output_tokens,
29
+ total: input_tokens + output_tokens,
30
+ },
31
+ latency_ms,
32
+ }).cost_usd;
33
+ return {
34
+ provider: 'anthropic',
35
+ model,
36
+ tokens: {
37
+ input: input_tokens,
38
+ output: output_tokens,
39
+ total: input_tokens + output_tokens,
40
+ },
41
+ cost_usd,
42
+ latency_ms,
43
+ finish_reason: finish_reason,
44
+ };
45
+ }
46
+ //# sourceMappingURL=anthropic_response_to_usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic_response_to_usage.js","sourceRoot":"","sources":["../../../../src/lib/providers/anthropic/anthropic_response_to_usage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAI3C;IACC,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAEjD,MAAM,KAAK,GAAG,GAAG,CAAC,KAA4C,CAAC;IAC/D,MAAM,YAAY,GAChB,OAAO,KAAK,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GACjB,OAAO,KAAK,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;IACzE,MAAM,aAAa,GACjB,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpE,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC5B,QAAQ,EAAE,WAAW;QACrB,KAAK;QACL,MAAM,EAAE;YACN,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,YAAY,GAAG,aAAa;SACpC;QACD,UAAU;KACX,CAAC,CAAC,QAAQ,CAAC;IAEZ,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,KAAK;QACL,MAAM,EAAE;YACN,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,YAAY,GAAG,aAAa;SACpC;QACD,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,aAA2C;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { AnthropicProvider, type AnthropicProviderConfig } from './anthropic_provider.js';
2
+ export type { AnthropicGenerationConfig } from './anthropic_client.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/anthropic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { AnthropicProvider } from './anthropic_provider.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/providers/anthropic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAgC,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * DeepSeek API Client Module
3
+ *
4
+ * Handles communication with the DeepSeek Chat Completions API.
5
+ * Uses the OpenAI-compatible API format.
6
+ */
7
+ import type { LLMStreamChunk } from '../../llm_api/types.js';
8
+ /**
9
+ * DeepSeek message role
10
+ */
11
+ export interface DeepSeekMessage {
12
+ role: 'user' | 'assistant' | 'system';
13
+ content: string;
14
+ }
15
+ /**
16
+ * DeepSeek generation configuration parameters
17
+ */
18
+ export interface DeepSeekGenerationConfig {
19
+ /** Controls randomness in output (0.0-2.0). Lower = more deterministic */
20
+ temperature?: number;
21
+ /** Nucleus sampling probability (0.0-1.0) */
22
+ top_p?: number;
23
+ /** Maximum number of tokens in the response */
24
+ max_tokens?: number;
25
+ }
26
+ /**
27
+ * Call the DeepSeek Chat Completions API (non-streaming)
28
+ * @param opts - API call options
29
+ * @returns Raw API response and HTTP status code
30
+ */
31
+ export declare function call_deepseek_api(opts: {
32
+ api_key: string;
33
+ api_url: string;
34
+ model: string;
35
+ messages: DeepSeekMessage[];
36
+ generation_config?: DeepSeekGenerationConfig;
37
+ }): Promise<{
38
+ raw: Record<string, unknown>;
39
+ status: number;
40
+ }>;
41
+ /**
42
+ * Call the DeepSeek Chat Completions API with streaming enabled.
43
+ * Yields LLMStreamChunk objects as SSE events arrive.
44
+ *
45
+ * @param opts - API call options
46
+ * @yields LLMStreamChunk objects with text deltas or done/error signals
47
+ */
48
+ export declare function call_deepseek_api_stream(opts: {
49
+ api_key: string;
50
+ api_url: string;
51
+ model: string;
52
+ messages: DeepSeekMessage[];
53
+ generation_config?: DeepSeekGenerationConfig;
54
+ }): AsyncGenerator<LLMStreamChunk, void, unknown>;
55
+ //# sourceMappingURL=deepseek_client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek_client.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/deepseek/deepseek_client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;CAC9C,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B5D;AAMD;;;;;;GAMG;AACH,wBAAuB,wBAAwB,CAAC,IAAI,EAAE;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;CAC9C,GAAG,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAiFhD"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * DeepSeek API Client Module
3
+ *
4
+ * Handles communication with the DeepSeek Chat Completions API.
5
+ * Uses the OpenAI-compatible API format.
6
+ */
7
+ // =============================================================================
8
+ // DeepSeek Chat Completions API Client
9
+ // =============================================================================
10
+ /**
11
+ * Call the DeepSeek Chat Completions API (non-streaming)
12
+ * @param opts - API call options
13
+ * @returns Raw API response and HTTP status code
14
+ */
15
+ export async function call_deepseek_api(opts) {
16
+ const body = {
17
+ model: opts.model,
18
+ messages: opts.messages,
19
+ };
20
+ if (opts.generation_config) {
21
+ if (opts.generation_config.temperature !== undefined) {
22
+ body.temperature = opts.generation_config.temperature;
23
+ }
24
+ if (opts.generation_config.top_p !== undefined) {
25
+ body.top_p = opts.generation_config.top_p;
26
+ }
27
+ if (opts.generation_config.max_tokens !== undefined) {
28
+ body.max_tokens = opts.generation_config.max_tokens;
29
+ }
30
+ }
31
+ const response = await fetch(opts.api_url, {
32
+ method: 'POST',
33
+ headers: {
34
+ 'Authorization': `Bearer ${opts.api_key}`,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ body: JSON.stringify(body),
38
+ });
39
+ const raw = (await response.json());
40
+ return { raw, status: response.status };
41
+ }
42
+ // =============================================================================
43
+ // DeepSeek Streaming API Client
44
+ // =============================================================================
45
+ /**
46
+ * Call the DeepSeek Chat Completions API with streaming enabled.
47
+ * Yields LLMStreamChunk objects as SSE events arrive.
48
+ *
49
+ * @param opts - API call options
50
+ * @yields LLMStreamChunk objects with text deltas or done/error signals
51
+ */
52
+ export async function* call_deepseek_api_stream(opts) {
53
+ const body = {
54
+ model: opts.model,
55
+ messages: opts.messages,
56
+ stream: true,
57
+ };
58
+ if (opts.generation_config) {
59
+ if (opts.generation_config.temperature !== undefined) {
60
+ body.temperature = opts.generation_config.temperature;
61
+ }
62
+ if (opts.generation_config.top_p !== undefined) {
63
+ body.top_p = opts.generation_config.top_p;
64
+ }
65
+ if (opts.generation_config.max_tokens !== undefined) {
66
+ body.max_tokens = opts.generation_config.max_tokens;
67
+ }
68
+ }
69
+ let response;
70
+ try {
71
+ response = await fetch(opts.api_url, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Authorization': `Bearer ${opts.api_key}`,
75
+ 'Content-Type': 'application/json',
76
+ },
77
+ body: JSON.stringify(body),
78
+ });
79
+ }
80
+ catch (err) {
81
+ const msg = err instanceof Error ? err.message : String(err);
82
+ yield { text: '', done: false, error: `DeepSeek network error: ${msg}` };
83
+ return;
84
+ }
85
+ if (!response.ok || !response.body) {
86
+ yield { text: '', done: false, error: `DeepSeek API error: ${response.status}` };
87
+ return;
88
+ }
89
+ const reader = response.body.getReader();
90
+ const decoder = new TextDecoder();
91
+ let buffer = '';
92
+ try {
93
+ while (true) {
94
+ const { done, value } = await reader.read();
95
+ if (done)
96
+ break;
97
+ buffer += decoder.decode(value, { stream: true });
98
+ const lines = buffer.split('\n');
99
+ buffer = lines.pop() ?? '';
100
+ for (const line of lines) {
101
+ if (!line.startsWith('data: '))
102
+ continue;
103
+ const data_str = line.slice(6).trim();
104
+ if (!data_str)
105
+ continue;
106
+ if (data_str === '[DONE]') {
107
+ yield { text: '', done: true };
108
+ return;
109
+ }
110
+ try {
111
+ const data = JSON.parse(data_str);
112
+ const choices = data.choices;
113
+ const delta = choices?.[0]?.delta;
114
+ const content = delta?.content;
115
+ if (content !== null && content !== undefined) {
116
+ yield { text: content, done: false };
117
+ }
118
+ }
119
+ catch {
120
+ // Ignore malformed SSE data lines
121
+ }
122
+ }
123
+ }
124
+ }
125
+ finally {
126
+ reader.releaseLock();
127
+ }
128
+ }
129
+ //# sourceMappingURL=deepseek_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek_client.js","sourceRoot":"","sources":["../../../../src/lib/providers/deepseek/deepseek_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * DeepSeek Provider Implementation
3
+ *
4
+ * Implements the LLMProvider interface for the DeepSeek API.
5
+ * Handles text generation and streaming using OpenAI-compatible API format.
6
+ */
7
+ import type { LLMProvider, LLMCapabilities, ServiceType } from '../types.js';
8
+ import type { TextTextParams, ImageTextParams, TextImageParams, ImageImageParams, DocumentTextParams, LLMResponse, LLMStreamResponse, Logger } from '../../llm_api/types.js';
9
+ import { type DeepSeekGenerationConfig } from './deepseek_client.js';
10
+ /**
11
+ * Configuration for the DeepSeek provider
12
+ */
13
+ export interface DeepSeekProviderConfig {
14
+ /** API key from .env.local (DEEPSEEK_API_KEY) */
15
+ api_key: string;
16
+ /** Chat completions API URL (default: 'https://api.deepseek.com/v1/chat/completions') */
17
+ api_url?: string;
18
+ /** Model for text_text service (default: 'deepseek-chat') */
19
+ model_text_text?: string;
20
+ /** Generation parameters applied to text calls */
21
+ generation_config?: DeepSeekGenerationConfig;
22
+ /** Capabilities this provider supports (overrides defaults when specified) */
23
+ capabilities?: ServiceType[];
24
+ /** Logger instance */
25
+ logger: Logger;
26
+ }
27
+ /**
28
+ * DeepSeek LLM Provider
29
+ * Implements the LLMProvider interface for the DeepSeek API
30
+ */
31
+ export declare class DeepSeekProvider implements LLMProvider {
32
+ private readonly name;
33
+ private readonly api_key;
34
+ private readonly api_url;
35
+ private readonly model_text_text;
36
+ private readonly generation_config;
37
+ private readonly capabilities;
38
+ private readonly logger;
39
+ constructor(config: DeepSeekProviderConfig);
40
+ get_name(): string;
41
+ get_capabilities(): LLMCapabilities;
42
+ get_model_for_service(service_type: ServiceType): string | undefined;
43
+ text_text(params: TextTextParams, _logger: Logger): Promise<LLMResponse>;
44
+ text_text_stream(params: TextTextParams, _logger: Logger): Promise<LLMStreamResponse>;
45
+ image_text(_params: ImageTextParams, _logger: Logger): Promise<LLMResponse>;
46
+ text_image(_params: TextImageParams, _logger: Logger): Promise<LLMResponse>;
47
+ image_image(_params: ImageImageParams, _logger: Logger): Promise<LLMResponse>;
48
+ document_text(_params: DocumentTextParams, _logger: Logger): Promise<LLMResponse>;
49
+ }
50
+ //# sourceMappingURL=deepseek_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek_provider.d.ts","sourceRoot":"","sources":["../../../../src/lib/providers/deepseek/deepseek_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,MAAM,EACP,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAC;AAc9B;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAEhB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAE7C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAE7B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,sBAAsB;IAqB1C,QAAQ,IAAI,MAAM;IAIlB,gBAAgB,IAAI,eAAe;IAInC,qBAAqB,CAAC,YAAY,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAa9D,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqDxE,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmBrF,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAO3E,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAO3E,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAO7E,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAMxF"}