@nahisaho/katashiro-llm 2.0.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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/dist/LLMClient.d.ts +64 -0
  3. package/dist/LLMClient.d.ts.map +1 -0
  4. package/dist/LLMClient.js +139 -0
  5. package/dist/LLMClient.js.map +1 -0
  6. package/dist/PromptManager.d.ts +66 -0
  7. package/dist/PromptManager.d.ts.map +1 -0
  8. package/dist/PromptManager.js +121 -0
  9. package/dist/PromptManager.js.map +1 -0
  10. package/dist/TokenCounter.d.ts +43 -0
  11. package/dist/TokenCounter.d.ts.map +1 -0
  12. package/dist/TokenCounter.js +100 -0
  13. package/dist/TokenCounter.js.map +1 -0
  14. package/dist/index.d.ts +12 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +17 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/providers/AzureOpenAILLMProvider.d.ts +82 -0
  19. package/dist/providers/AzureOpenAILLMProvider.d.ts.map +1 -0
  20. package/dist/providers/AzureOpenAILLMProvider.js +339 -0
  21. package/dist/providers/AzureOpenAILLMProvider.js.map +1 -0
  22. package/dist/providers/BaseLLMProvider.d.ts +51 -0
  23. package/dist/providers/BaseLLMProvider.d.ts.map +1 -0
  24. package/dist/providers/BaseLLMProvider.js +72 -0
  25. package/dist/providers/BaseLLMProvider.js.map +1 -0
  26. package/dist/providers/LLMFactory.d.ts +75 -0
  27. package/dist/providers/LLMFactory.d.ts.map +1 -0
  28. package/dist/providers/LLMFactory.js +149 -0
  29. package/dist/providers/LLMFactory.js.map +1 -0
  30. package/dist/providers/MockLLMProvider.d.ts +57 -0
  31. package/dist/providers/MockLLMProvider.d.ts.map +1 -0
  32. package/dist/providers/MockLLMProvider.js +120 -0
  33. package/dist/providers/MockLLMProvider.js.map +1 -0
  34. package/dist/providers/OllamaLLMProvider.d.ts +73 -0
  35. package/dist/providers/OllamaLLMProvider.d.ts.map +1 -0
  36. package/dist/providers/OllamaLLMProvider.js +242 -0
  37. package/dist/providers/OllamaLLMProvider.js.map +1 -0
  38. package/dist/providers/OpenAILLMProvider.d.ts +87 -0
  39. package/dist/providers/OpenAILLMProvider.d.ts.map +1 -0
  40. package/dist/providers/OpenAILLMProvider.js +349 -0
  41. package/dist/providers/OpenAILLMProvider.js.map +1 -0
  42. package/dist/providers/index.d.ts +17 -0
  43. package/dist/providers/index.d.ts.map +1 -0
  44. package/dist/providers/index.js +19 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/types.d.ts +251 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +8 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +51 -0
  51. package/src/LLMClient.ts +171 -0
  52. package/src/PromptManager.ts +156 -0
  53. package/src/TokenCounter.ts +114 -0
  54. package/src/index.ts +35 -0
  55. package/src/providers/AzureOpenAILLMProvider.ts +494 -0
  56. package/src/providers/BaseLLMProvider.ts +110 -0
  57. package/src/providers/LLMFactory.ts +216 -0
  58. package/src/providers/MockLLMProvider.ts +173 -0
  59. package/src/providers/OllamaLLMProvider.ts +322 -0
  60. package/src/providers/OpenAILLMProvider.ts +500 -0
  61. package/src/providers/index.ts +35 -0
  62. package/src/types.ts +268 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Azure OpenAI LLM Provider
3
+ *
4
+ * Azure OpenAI Service provider for chat completions
5
+ *
6
+ * @requirement REQ-LLM-001
7
+ * @design DES-KATASHIRO-003-LLM
8
+ */
9
+ import type { z, ZodType } from 'zod';
10
+ import type { ProviderConfig, GenerateRequest, GenerateResponse, StreamChunk } from '../types.js';
11
+ import { BaseLLMProvider } from './BaseLLMProvider.js';
12
+ /**
13
+ * Azure OpenAI設定
14
+ */
15
+ export interface AzureOpenAIProviderConfig extends ProviderConfig {
16
+ /** Azure OpenAI エンドポイント */
17
+ endpoint?: string;
18
+ /** APIキー */
19
+ apiKey?: string;
20
+ /** デプロイメント名 */
21
+ deploymentName?: string;
22
+ /** APIバージョン */
23
+ apiVersion?: string;
24
+ }
25
+ /**
26
+ * Azure OpenAI LLMプロバイダー
27
+ *
28
+ * Azure OpenAI Serviceを使用したテキスト生成
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const provider = new AzureOpenAILLMProvider({
33
+ * endpoint: 'https://your-resource.openai.azure.com',
34
+ * apiKey: process.env.AZURE_OPENAI_API_KEY,
35
+ * deploymentName: 'gpt-4o',
36
+ * apiVersion: '2024-02-15-preview',
37
+ * });
38
+ *
39
+ * const response = await provider.generate({
40
+ * messages: [{ role: 'user', content: 'Hello!' }],
41
+ * });
42
+ * ```
43
+ */
44
+ export declare class AzureOpenAILLMProvider extends BaseLLMProvider {
45
+ readonly name = "azure-openai";
46
+ readonly supportedModels: string[];
47
+ private readonly endpoint;
48
+ private readonly apiKey;
49
+ private readonly deploymentName;
50
+ private readonly apiVersion;
51
+ constructor(config?: AzureOpenAIProviderConfig);
52
+ protected getDefaultModel(): string;
53
+ /**
54
+ * メッセージ形式変換
55
+ */
56
+ private convertMessages;
57
+ /**
58
+ * ツール定義変換
59
+ */
60
+ private convertTools;
61
+ /**
62
+ * Finish Reason変換
63
+ */
64
+ private convertFinishReason;
65
+ /**
66
+ * テキスト生成
67
+ */
68
+ generate(request: GenerateRequest): Promise<GenerateResponse>;
69
+ /**
70
+ * ストリーミング生成
71
+ */
72
+ generateStream(request: GenerateRequest): AsyncGenerator<StreamChunk>;
73
+ /**
74
+ * 構造化出力生成
75
+ */
76
+ generateStructured<T extends ZodType>(request: GenerateRequest, schema: T): Promise<z.infer<T>>;
77
+ /**
78
+ * トークン数カウント(近似)
79
+ */
80
+ countTokens(text: string, _model?: string): Promise<number>;
81
+ }
82
+ //# sourceMappingURL=AzureOpenAILLMProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AzureOpenAILLMProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AzureOpenAILLMProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,WAAW,EAMZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAC/D,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAuB,SAAQ,eAAe;IACzD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,eAAe,WAMtB;IAEF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,GAAE,yBAA8B;IA8BlD,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC;;OAEG;IACH,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuFnE;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC;IAkI5E;;OAEG;IACY,kBAAkB,CAAC,CAAC,SAAS,OAAO,EACjD,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAoBtB;;OAEG;IACY,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAK3E"}
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Azure OpenAI LLM Provider
3
+ *
4
+ * Azure OpenAI Service provider for chat completions
5
+ *
6
+ * @requirement REQ-LLM-001
7
+ * @design DES-KATASHIRO-003-LLM
8
+ */
9
+ import { BaseLLMProvider } from './BaseLLMProvider.js';
10
+ /**
11
+ * Azure OpenAI LLMプロバイダー
12
+ *
13
+ * Azure OpenAI Serviceを使用したテキスト生成
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const provider = new AzureOpenAILLMProvider({
18
+ * endpoint: 'https://your-resource.openai.azure.com',
19
+ * apiKey: process.env.AZURE_OPENAI_API_KEY,
20
+ * deploymentName: 'gpt-4o',
21
+ * apiVersion: '2024-02-15-preview',
22
+ * });
23
+ *
24
+ * const response = await provider.generate({
25
+ * messages: [{ role: 'user', content: 'Hello!' }],
26
+ * });
27
+ * ```
28
+ */
29
+ export class AzureOpenAILLMProvider extends BaseLLMProvider {
30
+ name = 'azure-openai';
31
+ supportedModels = [
32
+ 'gpt-4o',
33
+ 'gpt-4o-mini',
34
+ 'gpt-4-turbo',
35
+ 'gpt-4',
36
+ 'gpt-35-turbo',
37
+ ];
38
+ endpoint;
39
+ apiKey;
40
+ deploymentName;
41
+ apiVersion;
42
+ constructor(config = {}) {
43
+ super(config);
44
+ this.endpoint = config.endpoint ?? process.env.AZURE_OPENAI_ENDPOINT ?? '';
45
+ this.apiKey = config.apiKey ?? process.env.AZURE_OPENAI_API_KEY ?? '';
46
+ this.deploymentName =
47
+ config.deploymentName ??
48
+ process.env.AZURE_OPENAI_DEPLOYMENT ??
49
+ config.defaultModel ??
50
+ '';
51
+ this.apiVersion = config.apiVersion ?? '2024-02-15-preview';
52
+ // 設定検証
53
+ if (!this.endpoint) {
54
+ throw new Error('Azure OpenAI endpoint is required. Set AZURE_OPENAI_ENDPOINT or provide endpoint in config.');
55
+ }
56
+ if (!this.apiKey) {
57
+ throw new Error('Azure OpenAI API key is required. Set AZURE_OPENAI_API_KEY or provide apiKey in config.');
58
+ }
59
+ if (!this.deploymentName) {
60
+ throw new Error('Azure OpenAI deployment name is required. Set AZURE_OPENAI_DEPLOYMENT or provide deploymentName in config.');
61
+ }
62
+ }
63
+ getDefaultModel() {
64
+ return this.deploymentName;
65
+ }
66
+ /**
67
+ * メッセージ形式変換
68
+ */
69
+ convertMessages(messages) {
70
+ return messages.map((msg) => {
71
+ const converted = {
72
+ role: msg.role,
73
+ content: typeof msg.content === 'string'
74
+ ? msg.content
75
+ : JSON.stringify(msg.content),
76
+ };
77
+ if (msg.name)
78
+ converted.name = msg.name;
79
+ if (msg.toolCallId)
80
+ converted.tool_call_id = msg.toolCallId;
81
+ if (msg.toolCalls) {
82
+ converted.tool_calls = msg.toolCalls.map((tc) => ({
83
+ id: tc.id,
84
+ type: tc.type,
85
+ function: tc.function,
86
+ }));
87
+ }
88
+ return converted;
89
+ });
90
+ }
91
+ /**
92
+ * ツール定義変換
93
+ */
94
+ convertTools(tools) {
95
+ if (!tools)
96
+ return undefined;
97
+ return tools.map((tool) => ({
98
+ type: tool.type,
99
+ function: {
100
+ name: tool.function.name,
101
+ description: tool.function.description,
102
+ parameters: tool.function.parameters,
103
+ },
104
+ }));
105
+ }
106
+ /**
107
+ * Finish Reason変換
108
+ */
109
+ convertFinishReason(reason) {
110
+ switch (reason) {
111
+ case 'stop':
112
+ return 'stop';
113
+ case 'length':
114
+ return 'length';
115
+ case 'tool_calls':
116
+ return 'tool_calls';
117
+ case 'content_filter':
118
+ return 'content_filter';
119
+ default:
120
+ return 'stop';
121
+ }
122
+ }
123
+ /**
124
+ * テキスト生成
125
+ */
126
+ async generate(request) {
127
+ const baseUrl = this.endpoint.endsWith('/')
128
+ ? this.endpoint.slice(0, -1)
129
+ : this.endpoint;
130
+ const url = `${baseUrl}/openai/deployments/${this.deploymentName}/chat/completions?api-version=${this.apiVersion}`;
131
+ const headers = {
132
+ 'Content-Type': 'application/json',
133
+ 'api-key': this.apiKey,
134
+ };
135
+ const body = {
136
+ messages: this.convertMessages(request.messages),
137
+ temperature: request.temperature,
138
+ max_tokens: request.maxTokens,
139
+ top_p: request.topP,
140
+ stop: request.stopSequences,
141
+ user: request.user,
142
+ };
143
+ if (request.tools) {
144
+ body.tools = this.convertTools(request.tools);
145
+ body.tool_choice = request.toolChoice;
146
+ }
147
+ if (request.responseFormat) {
148
+ body.response_format = {
149
+ type: request.responseFormat.type,
150
+ };
151
+ }
152
+ const controller = new AbortController();
153
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout ?? 30000);
154
+ try {
155
+ const response = await fetch(url, {
156
+ method: 'POST',
157
+ headers,
158
+ body: JSON.stringify(body),
159
+ signal: controller.signal,
160
+ });
161
+ if (!response.ok) {
162
+ const errorText = await response.text();
163
+ throw new Error(`Azure OpenAI API error: ${response.status} - ${errorText}`);
164
+ }
165
+ const data = (await response.json());
166
+ const choice = data.choices[0];
167
+ if (!choice) {
168
+ throw new Error('No choices returned from Azure OpenAI API');
169
+ }
170
+ const toolCalls = choice.message.tool_calls?.map((tc) => ({
171
+ id: tc.id,
172
+ type: tc.type,
173
+ function: tc.function,
174
+ }));
175
+ const usage = {
176
+ promptTokens: data.usage.prompt_tokens,
177
+ completionTokens: data.usage.completion_tokens,
178
+ totalTokens: data.usage.total_tokens,
179
+ };
180
+ return {
181
+ id: data.id,
182
+ model: data.model,
183
+ content: choice.message.content ?? '',
184
+ toolCalls,
185
+ usage,
186
+ finishReason: this.convertFinishReason(choice.finish_reason),
187
+ };
188
+ }
189
+ finally {
190
+ clearTimeout(timeoutId);
191
+ }
192
+ }
193
+ /**
194
+ * ストリーミング生成
195
+ */
196
+ async *generateStream(request) {
197
+ const baseUrl = this.endpoint.endsWith('/')
198
+ ? this.endpoint.slice(0, -1)
199
+ : this.endpoint;
200
+ const url = `${baseUrl}/openai/deployments/${this.deploymentName}/chat/completions?api-version=${this.apiVersion}`;
201
+ const headers = {
202
+ 'Content-Type': 'application/json',
203
+ 'api-key': this.apiKey,
204
+ };
205
+ const body = {
206
+ messages: this.convertMessages(request.messages),
207
+ temperature: request.temperature,
208
+ max_tokens: request.maxTokens,
209
+ top_p: request.topP,
210
+ stop: request.stopSequences,
211
+ user: request.user,
212
+ stream: true,
213
+ };
214
+ if (request.tools) {
215
+ body.tools = this.convertTools(request.tools);
216
+ body.tool_choice = request.toolChoice;
217
+ }
218
+ const response = await fetch(url, {
219
+ method: 'POST',
220
+ headers,
221
+ body: JSON.stringify(body),
222
+ });
223
+ if (!response.ok || !response.body) {
224
+ const errorText = await response.text();
225
+ throw new Error(`Azure OpenAI API error: ${response.status} - ${errorText}`);
226
+ }
227
+ const reader = response.body.getReader();
228
+ const decoder = new TextDecoder();
229
+ let buffer = '';
230
+ const toolCallsMap = new Map();
231
+ try {
232
+ while (true) {
233
+ const { done, value } = await reader.read();
234
+ if (done)
235
+ break;
236
+ buffer += decoder.decode(value, { stream: true });
237
+ const lines = buffer.split('\n');
238
+ buffer = lines.pop() ?? '';
239
+ for (const line of lines) {
240
+ if (!line.startsWith('data: '))
241
+ continue;
242
+ const data = line.slice(6).trim();
243
+ if (data === '[DONE]') {
244
+ yield { type: 'done' };
245
+ continue;
246
+ }
247
+ try {
248
+ const chunk = JSON.parse(data);
249
+ const delta = chunk.choices[0]?.delta;
250
+ if (delta?.content) {
251
+ yield {
252
+ type: 'content',
253
+ content: delta.content,
254
+ };
255
+ }
256
+ if (delta?.tool_calls) {
257
+ for (const tc of delta.tool_calls) {
258
+ const existing = toolCallsMap.get(tc.index) ?? {
259
+ id: '',
260
+ name: '',
261
+ arguments: '',
262
+ };
263
+ if (tc.id)
264
+ existing.id = tc.id;
265
+ if (tc.function?.name)
266
+ existing.name = tc.function.name;
267
+ if (tc.function?.arguments) {
268
+ existing.arguments += tc.function.arguments;
269
+ }
270
+ toolCallsMap.set(tc.index, existing);
271
+ }
272
+ }
273
+ if (chunk.usage) {
274
+ yield {
275
+ type: 'usage',
276
+ usage: {
277
+ promptTokens: chunk.usage.prompt_tokens,
278
+ completionTokens: chunk.usage.completion_tokens,
279
+ totalTokens: chunk.usage.total_tokens,
280
+ },
281
+ };
282
+ }
283
+ const finishReason = chunk.choices[0]?.finish_reason;
284
+ if (finishReason === 'tool_calls') {
285
+ for (const [, tc] of toolCallsMap) {
286
+ yield {
287
+ type: 'tool_call',
288
+ toolCall: {
289
+ id: tc.id,
290
+ type: 'function',
291
+ function: {
292
+ name: tc.name,
293
+ arguments: tc.arguments,
294
+ },
295
+ },
296
+ };
297
+ }
298
+ }
299
+ }
300
+ catch {
301
+ // JSON parse error - skip
302
+ }
303
+ }
304
+ }
305
+ }
306
+ finally {
307
+ reader.releaseLock();
308
+ }
309
+ }
310
+ /**
311
+ * 構造化出力生成
312
+ */
313
+ async generateStructured(request, schema) {
314
+ const jsonSchema = this.zodToJsonSchema(schema);
315
+ const enhancedRequest = {
316
+ ...request,
317
+ responseFormat: { type: 'json_object' },
318
+ messages: [
319
+ ...request.messages,
320
+ {
321
+ role: 'user',
322
+ content: `Respond with valid JSON matching this schema:\n${JSON.stringify(jsonSchema, null, 2)}`,
323
+ },
324
+ ],
325
+ };
326
+ const response = await this.generate(enhancedRequest);
327
+ const parsed = JSON.parse(response.content);
328
+ return schema.parse(parsed);
329
+ }
330
+ /**
331
+ * トークン数カウント(近似)
332
+ */
333
+ async countTokens(text, _model) {
334
+ const englishChars = text.replace(/[^\x00-\x7F]/g, '').length;
335
+ const nonEnglishChars = text.length - englishChars;
336
+ return Math.ceil(englishChars / 4 + nonEnglishChars / 2);
337
+ }
338
+ }
339
+ //# sourceMappingURL=AzureOpenAILLMProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AzureOpenAILLMProvider.js","sourceRoot":"","sources":["../../src/providers/AzureOpenAILLMProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAsFvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,sBAAuB,SAAQ,eAAe;IAChD,IAAI,GAAG,cAAc,CAAC;IACtB,eAAe,GAAG;QACzB,QAAQ;QACR,aAAa;QACb,aAAa;QACb,OAAO;QACP,cAAc;KACf,CAAC;IAEe,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,cAAc,CAAS;IACvB,UAAU,CAAS;IAEpC,YAAY,SAAoC,EAAE;QAChD,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;QAC3E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;QACtE,IAAI,CAAC,cAAc;YACjB,MAAM,CAAC,cAAc;gBACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB;gBACnC,MAAM,CAAC,YAAY;gBACnB,EAAE,CAAC;QACL,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,oBAAoB,CAAC;QAE5D,OAAO;QACP,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;QACJ,CAAC;IACH,CAAC;IAES,eAAe;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAmB;QACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAiB;gBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EACL,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;oBAC7B,CAAC,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;aAClC,CAAC;YAEF,IAAI,GAAG,CAAC,IAAI;gBAAE,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACxC,IAAI,GAAG,CAAC,UAAU;gBAAE,SAAS,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;YAC5D,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAChD,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;iBACtB,CAAC,CAAC,CAAC;YACN,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,KAAwB;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;gBACxB,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;gBACtC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;aACrC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,MAAqB;QAC/C,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC;YAClB,KAAK,YAAY;gBACf,OAAO,YAAY,CAAC;YACtB,KAAK,gBAAgB;gBACnB,OAAO,gBAAgB,CAAC;YAC1B;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAElB,MAAM,GAAG,GAAG,GAAG,OAAO,uBAAuB,IAAI,CAAC,cAAc,iCAAiC,IAAI,CAAC,UAAU,EAAE,CAAC;QAEnH,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM;SACvB,CAAC;QAEF,MAAM,IAAI,GAA4B;YACpC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChD,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,IAAI,EAAE,OAAO,CAAC,aAAa;YAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,GAAG;gBACrB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI;aAClC,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAC1B,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAC7B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAC5D,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,SAAS,GAA2B,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CACtE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACP,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,QAAQ,EAAE,EAAE,CAAC,QAAQ;aACtB,CAAC,CACH,CAAC;YAEF,MAAM,KAAK,GAAe;gBACxB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;gBACtC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;gBAC9C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;aACrC,CAAC;YAEF,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;gBACrC,SAAS;gBACT,KAAK;gBACL,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC;aAC7D,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,cAAc,CAAC,OAAwB;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAElB,MAAM,GAAG,GAAG,GAAG,OAAO,uBAAuB,IAAI,CAAC,cAAc,iCAAiC,IAAI,CAAC,UAAU,EAAE,CAAC;QAEnH,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM;SACvB,CAAC;QAEF,MAAM,IAAI,GAA4B;YACpC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChD,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,IAAI,EAAE,OAAO,CAAC,aAAa;YAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACxC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,YAAY,GAAG,IAAI,GAAG,EAGzB,CAAC;QAEJ,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAAE,SAAS;oBACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACtB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wBACvB,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;wBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;wBAEtC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;4BACnB,MAAM;gCACJ,IAAI,EAAE,SAAS;gCACf,OAAO,EAAE,KAAK,CAAC,OAAO;6BACvB,CAAC;wBACJ,CAAC;wBAED,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;4BACtB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gCAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI;oCAC7C,EAAE,EAAE,EAAE;oCACN,IAAI,EAAE,EAAE;oCACR,SAAS,EAAE,EAAE;iCACd,CAAC;gCACF,IAAI,EAAE,CAAC,EAAE;oCAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;gCAC/B,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI;oCAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gCACxD,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;oCAC3B,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;gCAC9C,CAAC;gCACD,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;4BACvC,CAAC;wBACH,CAAC;wBAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;4BAChB,MAAM;gCACJ,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE;oCACL,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;oCACvC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;oCAC/C,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY;iCACtC;6BACF,CAAC;wBACJ,CAAC;wBAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC;wBACrD,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;4BAClC,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;gCAClC,MAAM;oCACJ,IAAI,EAAE,WAAW;oCACjB,QAAQ,EAAE;wCACR,EAAE,EAAE,EAAE,CAAC,EAAE;wCACT,IAAI,EAAE,UAAU;wCAChB,QAAQ,EAAE;4CACR,IAAI,EAAE,EAAE,CAAC,IAAI;4CACb,SAAS,EAAE,EAAE,CAAC,SAAS;yCACxB;qCACF;iCACF,CAAC;4BACJ,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,0BAA0B;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,kBAAkB,CAC/B,OAAwB,EACxB,MAAS;QAET,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,eAAe,GAAoB;YACvC,GAAG,OAAO;YACV,cAAc,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;YACvC,QAAQ,EAAE;gBACR,GAAG,OAAO,CAAC,QAAQ;gBACnB;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,kDAAkD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBACjG;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,MAAe;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Base LLM Provider
3
+ *
4
+ * @requirement REQ-LLM-001
5
+ * @design DES-KATASHIRO-003-LLM §3.1.1
6
+ */
7
+ import type { z, ZodType } from 'zod';
8
+ import type { LLMProvider, ProviderConfig, GenerateRequest, GenerateResponse, StreamChunk } from '../types.js';
9
+ /**
10
+ * 抽象LLMプロバイダー基底クラス
11
+ */
12
+ export declare abstract class BaseLLMProvider implements LLMProvider {
13
+ abstract readonly name: string;
14
+ abstract readonly supportedModels: string[];
15
+ protected config: ProviderConfig;
16
+ protected defaultModel: string;
17
+ constructor(config?: ProviderConfig);
18
+ /**
19
+ * デフォルトモデル取得
20
+ */
21
+ protected abstract getDefaultModel(): string;
22
+ /**
23
+ * テキスト生成(抽象メソッド)
24
+ */
25
+ abstract generate(request: GenerateRequest): Promise<GenerateResponse>;
26
+ /**
27
+ * ストリーミング生成(抽象メソッド)
28
+ */
29
+ abstract generateStream(request: GenerateRequest): AsyncGenerator<StreamChunk>;
30
+ /**
31
+ * 構造化出力生成
32
+ */
33
+ generateStructured<T extends ZodType>(request: GenerateRequest, schema: T): Promise<z.infer<T>>;
34
+ /**
35
+ * トークン数カウント(デフォルト実装)
36
+ */
37
+ countTokens(text: string, _model?: string): Promise<number>;
38
+ /**
39
+ * モデルサポート確認
40
+ */
41
+ isModelSupported(model: string): boolean;
42
+ /**
43
+ * モデル取得(デフォルトまたは指定)
44
+ */
45
+ protected getModel(request: GenerateRequest): string;
46
+ /**
47
+ * Zodスキーマ→JSONスキーマ変換(簡易実装)
48
+ */
49
+ protected zodToJsonSchema(schema: ZodType): Record<string, unknown>;
50
+ }
51
+ //# sourceMappingURL=BaseLLMProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseLLMProvider.d.ts","sourceRoot":"","sources":["../../src/providers/BaseLLMProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,8BAAsB,eAAgB,YAAW,WAAW;IAC1D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAE5C,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;gBAEnB,MAAM,GAAE,cAAmB;IASvC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,MAAM;IAE5C;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAEtE;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC;IAE9E;;OAEG;IACG,kBAAkB,CAAC,CAAC,SAAS,OAAO,EACxC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAoBtB;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjE;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM;IAIpD;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQpE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Base LLM Provider
3
+ *
4
+ * @requirement REQ-LLM-001
5
+ * @design DES-KATASHIRO-003-LLM §3.1.1
6
+ */
7
+ /**
8
+ * 抽象LLMプロバイダー基底クラス
9
+ */
10
+ export class BaseLLMProvider {
11
+ config;
12
+ defaultModel;
13
+ constructor(config = {}) {
14
+ this.config = {
15
+ timeout: 30000,
16
+ maxRetries: 3,
17
+ ...config,
18
+ };
19
+ this.defaultModel = config.defaultModel ?? this.getDefaultModel();
20
+ }
21
+ /**
22
+ * 構造化出力生成
23
+ */
24
+ async generateStructured(request, schema) {
25
+ const jsonSchema = this.zodToJsonSchema(schema);
26
+ const enhancedRequest = {
27
+ ...request,
28
+ responseFormat: { type: 'json_object' },
29
+ messages: [
30
+ ...request.messages,
31
+ {
32
+ role: 'user',
33
+ content: `Respond with valid JSON matching this schema:\n${JSON.stringify(jsonSchema, null, 2)}`,
34
+ },
35
+ ],
36
+ };
37
+ const response = await this.generate(enhancedRequest);
38
+ const parsed = JSON.parse(response.content);
39
+ return schema.parse(parsed);
40
+ }
41
+ /**
42
+ * トークン数カウント(デフォルト実装)
43
+ */
44
+ async countTokens(text, _model) {
45
+ // 簡易実装: 4文字 ≈ 1トークン
46
+ return Math.ceil(text.length / 4);
47
+ }
48
+ /**
49
+ * モデルサポート確認
50
+ */
51
+ isModelSupported(model) {
52
+ return this.supportedModels.includes(model);
53
+ }
54
+ /**
55
+ * モデル取得(デフォルトまたは指定)
56
+ */
57
+ getModel(request) {
58
+ return request.model ?? this.defaultModel;
59
+ }
60
+ /**
61
+ * Zodスキーマ→JSONスキーマ変換(簡易実装)
62
+ */
63
+ zodToJsonSchema(schema) {
64
+ // 実際にはzod-to-json-schemaライブラリを使用
65
+ const description = schema.description;
66
+ return {
67
+ type: 'object',
68
+ description: description ?? 'Generated schema',
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=BaseLLMProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseLLMProvider.js","sourceRoot":"","sources":["../../src/providers/BaseLLMProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH;;GAEG;AACH,MAAM,OAAgB,eAAe;IAIzB,MAAM,CAAiB;IACvB,YAAY,CAAS;IAE/B,YAAY,SAAyB,EAAE;QACrC,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,CAAC;YACb,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;IACpE,CAAC;IAiBD;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,OAAwB,EACxB,MAAS;QAET,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,eAAe,GAAoB;YACvC,GAAG,OAAO;YACV,cAAc,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;YACvC,QAAQ,EAAE;gBACR,GAAG,OAAO,CAAC,QAAQ;gBACnB;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,kDAAkD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBACjG;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,MAAe;QAC7C,oBAAoB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACO,QAAQ,CAAC,OAAwB;QACzC,OAAO,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;IAC5C,CAAC;IAED;;OAEG;IACO,eAAe,CAAC,MAAe;QACvC,iCAAiC;QACjC,MAAM,WAAW,GAAI,MAAmC,CAAC,WAAW,CAAC;QACrE,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,WAAW,IAAI,kBAAkB;SAC/C,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * LLM Provider Factory
3
+ *
4
+ * Esperanto-style factory for creating LLM providers
5
+ *
6
+ * @requirement REQ-LLM-001
7
+ * @design DES-KATASHIRO-003-LLM
8
+ */
9
+ import type { LLMProvider, ProviderConfig } from '../types.js';
10
+ import type { OllamaProviderConfig } from './OllamaLLMProvider.js';
11
+ import type { OpenAIProviderConfig } from './OpenAILLMProvider.js';
12
+ import type { AzureOpenAIProviderConfig } from './AzureOpenAILLMProvider.js';
13
+ /**
14
+ * プロバイダータイプ
15
+ */
16
+ export type LLMProviderType = 'mock' | 'ollama' | 'openai' | 'openai-compatible' | 'azure-openai';
17
+ /**
18
+ * プロバイダー設定マップ
19
+ */
20
+ export interface LLMProviderConfigMap {
21
+ mock: ProviderConfig;
22
+ ollama: OllamaProviderConfig;
23
+ openai: OpenAIProviderConfig;
24
+ 'openai-compatible': OpenAIProviderConfig;
25
+ 'azure-openai': AzureOpenAIProviderConfig;
26
+ }
27
+ /**
28
+ * LLM Provider Factory
29
+ *
30
+ * Esperantoスタイルのファクトリクラス
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * // 利用可能なプロバイダーを確認
35
+ * const providers = LLMFactory.getAvailableProviders();
36
+ *
37
+ * // プロバイダーを作成
38
+ * const provider = LLMFactory.create('ollama', {
39
+ * baseUrl: 'http://192.168.224.1:11434',
40
+ * model: 'llama3.2',
41
+ * });
42
+ *
43
+ * // または環境変数から自動設定
44
+ * const provider = LLMFactory.create('openai');
45
+ * ```
46
+ */
47
+ export declare class LLMFactory {
48
+ /**
49
+ * プロバイダー作成
50
+ */
51
+ static create<T extends LLMProviderType>(provider: T, config?: Partial<LLMProviderConfigMap[T]>): LLMProvider;
52
+ /**
53
+ * 利用可能なプロバイダー一覧
54
+ */
55
+ static getAvailableProviders(): LLMProviderType[];
56
+ /**
57
+ * デフォルトプロバイダー取得
58
+ *
59
+ * 環境変数から自動判定
60
+ */
61
+ static getDefaultProvider(): LLMProvider;
62
+ /**
63
+ * プロバイダーの利用可能確認
64
+ */
65
+ static isProviderConfigured(provider: LLMProviderType): boolean;
66
+ }
67
+ /**
68
+ * 便利関数: LLMプロバイダー作成
69
+ */
70
+ export declare function createLLMProvider<T extends LLMProviderType>(provider: T, config?: Partial<LLMProviderConfigMap[T]>): LLMProvider;
71
+ /**
72
+ * 便利関数: デフォルトプロバイダー取得
73
+ */
74
+ export declare function getDefaultLLMProvider(): LLMProvider;
75
+ //# sourceMappingURL=LLMFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLMFactory.d.ts","sourceRoot":"","sources":["../../src/providers/LLMFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAE7E;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,mBAAmB,GACnB,cAAc,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,cAAc,EAAE,yBAAyB,CAAC;CAC3C;AA8CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,eAAe,EACrC,QAAQ,EAAE,CAAC,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,GACxC,WAAW;IA0Bd;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,eAAe,EAAE;IAIjD;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,IAAI,WAAW;IAqBxC;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO;CA0BhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzD,QAAQ,EAAE,CAAC,EACX,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,GACxC,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,CAEnD"}