/**
* 이미지 분석 도구
*/
import { z } from 'zod';
import { analyzeFile, type GeminiModel, type GeminiProvider, getDefaultProvider } from '../services/gemini.js';
export const analyzeImageSchema = z.object({
source: z.string().describe('이미지 경로 (URL 또는 로컬 파일). 지원 포맷: JPEG, PNG, GIF, WebP'),
prompt: z.string().describe('분석 프롬프트'),
model: z.enum(['flash', 'pro']).optional().default('flash').describe('모델 선택'),
provider: z.enum(['api', 'cli']).optional().describe('백엔드 선택: api(직접 API) 또는 cli(Gemini CLI, 높은 쿼터)'),
});
export type AnalyzeImageInput = z.infer<typeof analyzeImageSchema>;
export async function analyzeImage(input: AnalyzeImageInput) {
const result = await analyzeFile({
source: input.source,
prompt: input.prompt,
model: input.model as GeminiModel,
provider: (input.provider || getDefaultProvider()) as GeminiProvider,
});
if (!result.success) {
return {
content: [{ type: 'text' as const, text: `오류: ${result.error}` }],
isError: true,
};
}
const providerLabel = result.provider === 'cli' ? 'CLI (높은 쿼터)' : 'API';
const summary = [
`## 이미지 분석 결과`,
`- **소스**: ${result.source} (${result.sourceType})`,
`- **타입**: ${result.mimeType}`,
`- **크기**: ${(result.fileSizeBytes / 1024).toFixed(1)}KB`,
`- **모델**: ${result.model}`,
`- **백엔드**: ${providerLabel}`,
result.tokenUsage
? `- **토큰**: ${result.tokenUsage.totalTokens} (입력: ${result.tokenUsage.promptTokens}, 출력: ${result.tokenUsage.completionTokens})`
: '',
'',
'---',
'',
result.analysis,
]
.filter(Boolean)
.join('\n');
return {
content: [{ type: 'text' as const, text: summary }],
};
}