@daitanjs/senses
Version:
A library for AI-powered image generation and analysis using OpenAI.
8 lines (7 loc) • 30.8 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.js", "../src/imagegeneration.js", "../src/vision.js", "../src/capture.js"],
"sourcesContent": ["// senses/src/index.js\n/**\n * @file Main entry point for the @daitanjs/senses package.\n * @module @daitanjs/senses\n *\n * @description\n * This package provides a suite of utilities for AI-powered sensory tasks,\n * bridging the gap between digital content and machine perception.\n *\n * Key Features:\n * - **Image Generation**: `generateImage` function to create images from text\n * prompts using OpenAI's DALL-E models.\n * - **Image Analysis**: `analyzeImage` function to interpret and describe images\n * using OpenAI's vision-capable models (e.g., GPT-4o).\n * - **Media Capture (Browser-only)**:\n * - `captureAudio`: Captures audio from a user's microphone.\n * - `captureVideo`: Captures video (and optionally audio) from a user's webcam.\n *\n * It integrates with the DaitanJS ecosystem for configuration, logging, and error handling.\n */\n\nimport { getLogger } from '@daitanjs/development';\n\nconst sensesIndexLogger = getLogger('daitan-senses-index');\n\nsensesIndexLogger.debug('Exporting DaitanJS Senses module functionalities...');\n\n// --- Image Generation (DALL-E) ---\nexport { generateImage } from './imagegeneration.js';\n\n// --- Image Analysis (Vision API - e.g., GPT-4o, GPT-4V) ---\nexport { analyzeImage } from './vision.js';\n\n// --- Media Capture (Browser-only) ---\nexport { captureAudio, captureVideo } from './capture.js';\n\nsensesIndexLogger.info('DaitanJS Senses module exports ready.');", "// senses/src/imagegeneration.js\n/**\n * @file OpenAI DALL-E image generation functionalities.\n * @module @daitanjs/senses/imagegeneration\n */\nimport { getLogger } from '@daitanjs/development';\nimport { getConfigManager } from '@daitanjs/config';\nimport {\n DaitanConfigurationError,\n DaitanApiError,\n DaitanFileOperationError,\n DaitanInvalidInputError,\n DaitanError,\n} from '@daitanjs/error';\nimport { query as apiQuery } from '@daitanjs/apiqueries'; // Retained for now if needed, though generateIntelligence is preferred\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { Buffer } from 'buffer';\n\nconst logger = getLogger('daitan-senses-imagegen');\n\nconst OPENAI_IMAGE_GENERATION_API_URL =\n 'https://api.openai.com/v1/images/generations';\n\n/**\n * @typedef {Object} ImageGenerationResult\n * @property {string | string[]} [outputPath]\n * @property {string | string[]} [base64Data]\n * @property {string[]} [urls]\n * @property {string | string[]} [revisedPrompt]\n * @property {number} created\n * @property {Array<object>} rawData\n */\n\n/**\n * @typedef {Object} GenerateImageParams\n * @property {string} prompt\n * @property {string} [outputPath]\n * @property {number} [n=1]\n * @property {'256x256'|'512x512'|'1024x1024'|'1792x1024'|'1024x1792'} [size='1024x1024']\n * @property {'url'|'b64_json'} [response_format='b64_json']\n * @property {string} [model='dall-e-3']\n * @property {'standard'|'hd'} [quality]\n * @property {'vivid'|'natural'} [style]\n * @property {string} [user]\n */\n\n/**\n * Generates an image using OpenAI's DALL-E API.\n * @public\n * @async\n * @param {GenerateImageParams} params\n * @returns {Promise<ImageGenerationResult>}\n */\nexport const generateImage = async ({\n prompt,\n outputPath,\n n = 1,\n size = '1024x1024',\n response_format = 'b64_json',\n model = 'dall-e-3',\n quality,\n style,\n user,\n}) => {\n const callId = `imageGen-${Date.now().toString(36)}`;\n logger.info(`[${callId}] generateImage: Initiated.`, {\n model,\n n,\n size,\n promptPreview: String(prompt).substring(0, 50) + '...',\n });\n\n if (!prompt || typeof prompt !== 'string' || !prompt.trim()) {\n throw new DaitanInvalidInputError('Prompt must be a non-empty string.');\n }\n if (model === 'dall-e-3' && n > 1) {\n logger.warn(`[${callId}] DALL-E 3 only supports n=1. Setting n to 1.`);\n n = 1;\n }\n const dalle2_sizes = ['256x256', '512x512', '1024x1024'];\n const dalle3_sizes = ['1024x1024', '1792x1024', '1024x1792'];\n if (model === 'dall-e-2' && !dalle2_sizes.includes(size)) {\n throw new DaitanInvalidInputError(\n `DALL-E 2 does not support size ${size}.`\n );\n }\n if (model === 'dall-e-3' && !dalle3_sizes.includes(size)) {\n throw new DaitanInvalidInputError(\n `DALL-E 3 does not support size ${size}.`\n );\n }\n\n const configManager = getConfigManager();\n\n const apiKey = configManager.getApiKeyForProvider('openai');\n if (!apiKey) {\n throw new DaitanConfigurationError('OpenAI API key is not configured.');\n }\n\n const requestBody = { prompt, n, size, response_format, model };\n if (quality && model === 'dall-e-3') requestBody.quality = quality;\n if (style && model === 'dall-e-3') requestBody.style = style;\n if (user) requestBody.user = user;\n\n try {\n // Using apiQuery directly as this is a specific non-LLM OpenAI endpoint\n const responseData = await apiQuery({\n url: OPENAI_IMAGE_GENERATION_API_URL,\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}` },\n data: requestBody,\n summary: `OpenAI Image Generation: ${prompt.substring(0, 30)}`,\n });\n\n if (!responseData?.data?.[0]) {\n throw new DaitanApiError(\n 'OpenAI API returned an unexpected successful response structure.',\n 'OpenAI Image Generation'\n );\n }\n\n const results = {\n revisedPrompt: responseData.data\n .map((item) => item.revised_prompt)\n .filter(Boolean),\n created: responseData.created,\n rawData: responseData.data,\n };\n if (results.revisedPrompt.length === 1)\n results.revisedPrompt = results.revisedPrompt[0];\n if (results.revisedPrompt.length === 0) delete results.revisedPrompt;\n\n if (response_format === 'b64_json') {\n results.base64Data = responseData.data.map((item) => item.b64_json);\n if (results.base64Data.length === 1)\n results.base64Data = results.base64Data[0];\n\n if (outputPath && typeof window === 'undefined') {\n const savedPaths = await saveBase64Images(\n outputPath,\n results.base64Data\n );\n results.outputPath =\n savedPaths.length === 1 ? savedPaths[0] : savedPaths;\n }\n } else {\n // response_format === 'url'\n results.urls = responseData.data.map((item) => item.url);\n }\n\n return results;\n } catch (error) {\n logger.error(\n `[${callId}] Error during OpenAI image generation: ${error.message}`\n );\n if (error instanceof DaitanError) throw error;\n throw new DaitanApiError(\n `OpenAI image generation failed: ${error.message}`,\n 'OpenAI Image Generation',\n error.response?.status,\n { responseData: error.response?.data },\n error\n );\n }\n};\n\n/** @private */\nasync function saveBase64Images(outputPath, base64Data) {\n const imagesToSave = Array.isArray(base64Data) ? base64Data : [base64Data];\n const savedPaths = [];\n for (let i = 0; i < imagesToSave.length; i++) {\n const imageBuffer = Buffer.from(imagesToSave[i], 'base64');\n let currentOutputPath = outputPath;\n if (imagesToSave.length > 1) {\n const ext = path.extname(outputPath) || '.png';\n const base = path.basename(outputPath, ext);\n const dir = path.dirname(outputPath);\n currentOutputPath = path.join(dir, `${base}_${i}${ext}`);\n }\n try {\n await fs.mkdir(path.dirname(currentOutputPath), { recursive: true });\n await fs.writeFile(currentOutputPath, imageBuffer);\n savedPaths.push(currentOutputPath);\n } catch (fileError) {\n throw new DaitanFileOperationError(\n `Failed to save image to ${currentOutputPath}: ${fileError.message}`,\n { path: currentOutputPath },\n fileError\n );\n }\n }\n return savedPaths;\n}\n", "// senses/src/vision.js\n/**\n * @file OpenAI Vision API (e.g., GPT-4o, GPT-4 Vision) image analysis functionalities.\n * @module @daitanjs/senses/vision\n */\nimport fs from 'fs/promises';\nimport { getLogger } from '@daitanjs/development';\nimport { getConfigManager } from '@daitanjs/config';\nimport {\n DaitanConfigurationError,\n DaitanApiError,\n DaitanFileOperationError,\n DaitanInvalidInputError,\n DaitanError,\n} from '@daitanjs/error';\nimport { query as apiQuery } from '@daitanjs/apiqueries'; // FIXED: Using apiqueries instead of intelligence\nimport { isValidURL } from '@daitanjs/validation';\nimport { Buffer } from 'buffer';\n\nconst logger = getLogger('daitan-senses-vision');\n\nconst OPENAI_VISION_API_URL = 'https://api.openai.com/v1/chat/completions';\nconst DEFAULT_OPENAI_VISION_MODEL = 'gpt-4o-mini';\n\n/** @private */\nconst encodeImageLocalFileToBase64WithMime = async (imagePath) => {\n if (typeof window !== 'undefined') {\n throw new DaitanConfigurationError(\n 'encodeImageLocalFileToBase64 is for Node.js only.'\n );\n }\n try {\n const buffer = await fs.readFile(imagePath);\n const mimeTypes = await import('mime-types');\n const contentType =\n mimeTypes.lookup(imagePath) || 'application/octet-stream';\n return { base64: buffer.toString('base64'), contentType };\n } catch (error) {\n throw new DaitanFileOperationError(\n `Error reading image file \"${imagePath}\": ${error.message}`,\n { path: imagePath },\n error\n );\n }\n};\n\n/**\n * @typedef {Object} ImageAnalysisResult\n * @property {string} analysis\n * @property {object | null} usage\n * @property {string} modelUsed\n * @property {object} [rawResponse]\n */\n\n/**\n * @typedef {Object} AnalyzeImageParams\n * @property {string} imageSource\n * @property {string} [prompt=\"Describe this image in detail.\"]\n * @property {string} [model]\n * @property {number} [max_tokens=500]\n * @property {'low'|'high'|'auto'} [detailLevel='auto']\n * @property {object} [llmConfigOptions]\n */\n\n/**\n * Analyzes an image using an OpenAI vision-capable model.\n * @public\n * @async\n * @param {AnalyzeImageParams} params\n * @returns {Promise<ImageAnalysisResult>}\n */\nexport const analyzeImage = async ({\n imageSource,\n prompt = 'Describe this image in detail.',\n model,\n max_tokens = 500,\n detailLevel = 'auto',\n llmConfigOptions = {}, // Kept for API consistency but not used in this direct call\n}) => {\n const callId = `analyzeImage-${Date.now().toString(36)}`;\n logger.info(`[${callId}] analyzeImage: Initiated.`);\n\n if (!imageSource || typeof imageSource !== 'string' || !imageSource.trim()) {\n throw new DaitanInvalidInputError(\n 'Image source (URL, local path, or data URL) must be a non-empty string.'\n );\n }\n\n const configManager = getConfigManager();\n const apiKey = configManager.get('OPENAI_API_KEY');\n if (!apiKey) {\n throw new DaitanConfigurationError('OpenAI API key is not configured.');\n }\n\n const effectiveModel =\n model ||\n configManager.get('OPENAI_VISION_MODEL') ||\n DEFAULT_OPENAI_VISION_MODEL;\n\n let imageUrlObject;\n if (imageSource.startsWith('data:image/')) {\n imageUrlObject = { url: imageSource, detail: detailLevel };\n } else if (isValidURL(imageSource)) {\n imageUrlObject = { url: imageSource, detail: detailLevel };\n } else {\n const { base64, contentType } = await encodeImageLocalFileToBase64WithMime(\n imageSource\n );\n imageUrlObject = { url: `data:${contentType};base64,${base64}`, detail: detailLevel };\n }\n\n const requestBody = {\n model: effectiveModel,\n messages: [\n {\n role: 'user',\n content: [\n { type: 'text', text: prompt },\n { type: 'image_url', image_url: imageUrlObject },\n ],\n },\n ],\n max_tokens: max_tokens,\n };\n\n logger.debug(\n `[${callId}] Sending vision analysis request to OpenAI. Model: ${effectiveModel}`\n );\n\n try {\n const responseData = await apiQuery({\n url: OPENAI_VISION_API_URL,\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}` },\n data: requestBody,\n summary: `OpenAI Vision Analysis: \"${prompt.substring(0, 30)}...\"`,\n });\n\n const analysisText = responseData?.choices?.[0]?.message?.content;\n if (typeof analysisText !== 'string') {\n throw new DaitanApiError('Invalid response structure from OpenAI Vision API.', 'OpenAI Vision', 200, { responseData });\n }\n \n return {\n analysis: analysisText,\n usage: responseData.usage || null,\n modelUsed: responseData.model || effectiveModel,\n rawResponse: responseData,\n };\n } catch (error) {\n if (error instanceof DaitanError) throw error;\n throw new DaitanApiError(\n `OpenAI Vision API request failed: ${error.message}`,\n 'OpenAI Vision',\n error.httpStatusCode || 500,\n { modelUsed: effectiveModel },\n error\n );\n }\n};", "// senses/src/capture.js\n/**\n * @file Browser-based media capture (microphone audio, webcam video).\n * @module @daitanjs/senses/capture\n *\n * @description\n * This module provides high-level functions for capturing audio from the user's microphone\n * and video from their webcam using the browser's `MediaDevices` API. This functionality is\n * strictly for front-end browser environments.\n */\n\nimport { getLogger } from '@daitanjs/development';\nimport {\n DaitanBrowserSpecificError,\n DaitanOperationError,\n} from '@daitanjs/error';\n\nconst captureLogger = getLogger('daitan-senses-capture');\n\n/**\n * Checks if the required browser APIs (`navigator.mediaDevices`) are available.\n * @private\n * @throws {DaitanBrowserSpecificError} If not in a browser environment or if APIs are missing.\n */\nfunction ensureBrowserMediaAPIs() {\n if (\n typeof window === 'undefined' ||\n !navigator.mediaDevices ||\n !navigator.mediaDevices.getUserMedia\n ) {\n throw new DaitanBrowserSpecificError(\n 'Media capture is only available in a browser environment with support for the MediaDevices API.'\n );\n }\n}\n\n/**\n * @typedef {Object} MediaRecorderControls\n * @property {() => void} start - Starts the recording.\n * @property {() => void} stop - Stops the recording and resolves the promise with the result.\n * @property {() => void} pause - Pauses the recording.\n * @property {() => void} resume - Resumes a paused recording.\n * @property {() => 'recording' | 'paused' | 'inactive'} state - Gets the current state of the recorder.\n */\n\n/**\n * @typedef {Object} AudioRecordingResult\n * @property {Blob} blob - The recorded audio data as a Blob.\n * @property {string} objectURL - A temporary URL for the Blob, useful for playback.\n * @property {string} mimeType - The MIME type of the recorded audio Blob.\n */\n\n/**\n * Captures audio from the user's microphone. This function returns a Promise that\n * resolves when the recording is stopped, along with controls to manage the recording.\n *\n * @public\n * @async\n * @param {object} [options={}] - Options for audio capture.\n * @param {string} [options.mimeType='audio/webm;codecs=opus'] - The desired MIME type for the recording. Browser support may vary. 'audio/mpeg' or 'audio/wav' are other possibilities.\n * @returns {Promise<{ recording: Promise<AudioRecordingResult>, controls: MediaRecorderControls }>} An object containing a `recording` promise and `controls` to start/stop the capture.\n * @throws {DaitanBrowserSpecificError} If not run in a supported browser environment.\n * @throws {DaitanOperationError} If permission to use the microphone is denied or another error occurs.\n *\n * @example\n * async function startRecording() {\n * try {\n * const { recording, controls } = await captureAudio();\n * console.log(\"Ready to record. Call controls.start()\");\n * // In a UI button click:\n * // recordButton.onclick = controls.start;\n * // stopButton.onclick = controls.stop;\n *\n * const { blob, objectURL } = await recording;\n * console.log(\"Recording finished!\", blob.size, objectURL);\n * // Now you can play the audio or upload the blob\n * const audioPlayer = new Audio(objectURL);\n * audioPlayer.play();\n * } catch (error) {\n * console.error(\"Failed to start audio capture:\", error.message);\n * }\n * }\n */\nexport const captureAudio = async (options = {}) => {\n ensureBrowserMediaAPIs();\n const { mimeType = 'audio/webm;codecs=opus' } = options;\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n video: false,\n });\n const mediaRecorder = new MediaRecorder(stream, { mimeType });\n const audioChunks = [];\n\n mediaRecorder.addEventListener('dataavailable', (event) => {\n audioChunks.push(event.data);\n });\n\n const recordingPromise = new Promise((resolve, reject) => {\n mediaRecorder.addEventListener('stop', () => {\n const audioBlob = new Blob(audioChunks, {\n type: mediaRecorder.mimeType,\n });\n const objectURL = URL.createObjectURL(audioBlob);\n stream.getTracks().forEach((track) => track.stop()); // Stop the mic stream\n resolve({\n blob: audioBlob,\n objectURL,\n mimeType: mediaRecorder.mimeType,\n });\n });\n mediaRecorder.addEventListener('error', (event) => {\n stream.getTracks().forEach((track) => track.stop());\n reject(\n new DaitanOperationError(\n `MediaRecorder error: ${event.error.message}`\n )\n );\n });\n });\n\n const controls = {\n start: () => mediaRecorder.start(),\n stop: () => mediaRecorder.stop(),\n pause: () => mediaRecorder.pause(),\n resume: () => mediaRecorder.resume(),\n state: () => mediaRecorder.state,\n };\n\n return { recording: recordingPromise, controls };\n } catch (error) {\n let errorMessage = `Failed to get microphone access: ${error.message}`;\n if (\n error.name === 'NotAllowedError' ||\n error.name === 'PermissionDeniedError'\n ) {\n errorMessage =\n 'Permission to use the microphone was denied. Please allow microphone access in your browser settings.';\n } else if (\n error.name === 'NotFoundError' ||\n error.name === 'DevicesNotFoundError'\n ) {\n errorMessage = 'No microphone was found on this device.';\n }\n captureLogger.error('Error initializing audio capture.', {\n errorName: error.name,\n message: errorMessage,\n });\n throw new DaitanOperationError(errorMessage, { originalError: error });\n }\n};\n\n/**\n * @typedef {Object} VideoRecordingResult\n * @property {Blob} blob - The recorded video data as a Blob.\n * @property {string} objectURL - A temporary URL for the Blob, useful for playback.\n * @property {string} mimeType - The MIME type of the recorded video Blob.\n */\n\n/**\n * Captures video (and optionally audio) from the user's webcam and microphone.\n * Returns a Promise that resolves when the recording is stopped, along with controls.\n *\n * @public\n * @async\n * @param {object} [options={}] - Options for video capture.\n * @param {string} [options.mimeType='video/webm;codecs=vp8,opus'] - The desired MIME type.\n * @param {boolean} [options.includeAudio=true] - Whether to include audio in the recording.\n * @param {object} [options.constraints] - Custom `MediaStreamConstraints` to pass to `getUserMedia`.\n * @returns {Promise<{ recording: Promise<VideoRecordingResult>, controls: MediaRecorderControls }>}\n * @throws {DaitanBrowserSpecificError} If not run in a supported browser environment.\n * @throws {DaitanOperationError} If permission is denied or another error occurs.\n */\nexport const captureVideo = async (options = {}) => {\n ensureBrowserMediaAPIs();\n const {\n mimeType = 'video/webm;codecs=vp8,opus',\n includeAudio = true,\n constraints = { video: true, audio: includeAudio },\n } = options;\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n const mediaRecorder = new MediaRecorder(stream, { mimeType });\n const videoChunks = [];\n\n mediaRecorder.addEventListener('dataavailable', (event) => {\n videoChunks.push(event.data);\n });\n\n const recordingPromise = new Promise((resolve, reject) => {\n mediaRecorder.addEventListener('stop', () => {\n const videoBlob = new Blob(videoChunks, {\n type: mediaRecorder.mimeType,\n });\n const objectURL = URL.createObjectURL(videoBlob);\n stream.getTracks().forEach((track) => track.stop()); // Stop camera and mic\n resolve({\n blob: videoBlob,\n objectURL,\n mimeType: mediaRecorder.mimeType,\n });\n });\n mediaRecorder.addEventListener('error', (event) => {\n stream.getTracks().forEach((track) => track.stop());\n reject(\n new DaitanOperationError(\n `MediaRecorder error: ${event.error.message}`\n )\n );\n });\n });\n\n const controls = {\n start: () => mediaRecorder.start(),\n stop: () => mediaRecorder.stop(),\n pause: () => mediaRecorder.pause(),\n resume: () => mediaRecorder.resume(),\n state: () => mediaRecorder.state,\n };\n\n return { recording: recordingPromise, controls };\n } catch (error) {\n let errorMessage = `Failed to get camera/microphone access: ${error.message}`;\n if (\n error.name === 'NotAllowedError' ||\n error.name === 'PermissionDeniedError'\n ) {\n errorMessage =\n 'Permission to use the camera and/or microphone was denied.';\n } else if (\n error.name === 'NotFoundError' ||\n error.name === 'DevicesNotFoundError'\n ) {\n errorMessage = 'No camera and/or microphone was found on this device.';\n }\n captureLogger.error('Error initializing video capture.', {\n errorName: error.name,\n message: errorMessage,\n });\n throw new DaitanOperationError(errorMessage, { originalError: error });\n }\n};\n"],
"mappings": "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",
"names": ["import_development", "apiQuery", "path", "fs", "import_promises", "import_development", "import_config", "import_error", "import_apiqueries", "logger", "fs", "apiQuery", "import_development", "import_error"]
}