npm package: @iamex/iamex
Description: IAMEX SDK para JavaScript/TypeScript (compat v1)
Author: Inteligencia Artificial México
Latest version: 0.0.2

IAMEX SDK para JavaScript/TypeScript

Instalación
```bash
npm install @iamex/iamex
```

Obtener API Key
- Portal: `dev.iamex.io`
- Configurar en tu proyecto (elige 1):
  - .env (recomendado)
    ```env
    IAMEX_API_KEY=TU_API_KEY
    ```
  - Variable de entorno
    - PowerShell: `$env:IAMEX_API_KEY="TU_API_KEY"`
    - bash/zsh: `export IAMEX_API_KEY="TU_API_KEY"`
  - Pasarla al constructor: `new IAMEX({ apiKey: "TU_API_KEY" })`

Uso rápido (Chat no-stream)
```ts
import { IAMEX } from '@iamex/iamex';

const client = new IAMEX(); // usa IAMEX_API_KEY del entorno
const chat = await client.chat.completions.create({
  model: 'IAM-advanced',
  messages: [{ role: 'user', content: 'Explica la recursión en una frase.' }],
});
console.log(chat.choices?.[0]?.message?.content);
```

Chat (stream, estilo OpenAI)
```ts
for await (const chunk of client.chat.completions.stream({
  model: 'IAM-advanced',
  messages: [{ role: 'user', content: 'Escribe un haiku sobre JavaScript.' }],
})) {
  const choice = (chunk.choices || [])[0] || {};
  const piece = (choice.delta || {}).content;
  if (piece) process.stdout.write(piece);
}
```

Chat (solo texto final, helper opcional)
```ts
let text = '';
for await (const piece of client.chat.completions.streamText({
  model: 'IAM-advanced',
  messages: [{ role: 'user', content: 'Dime un chiste corto.' }],
})) {
  text += piece;
}
console.log(text);
```

Text Completions (stream)
```ts
for await (const chunk of client.completions.stream({
  model: 'IAM-advanced',
  prompt: 'Di hola en 3 palabras.',
})) {
  const choice = (chunk.choices || [])[0] || {};
  const piece = choice.text || (choice.delta || {}).content;
  if (piece) process.stdout.write(piece);
}
```

Responses (no-stream y stream)
```ts
// no-stream
const resp = await client.responses.create({
  model: 'IAM-advanced',
  input: 'Escribe un haiku sobre JavaScript.'
});
console.log(resp.output_text);

// stream (mensajes)
for await (const obj of client.responses.stream({
  model: 'IAM-advanced',
  messages: [{ role: 'user', content: 'Escribe un haiku sobre JavaScript.' }],
})) {
  const out = (obj && typeof obj === 'object' && 'output_text' in obj) ? obj.output_text : '';
  if (typeof out === 'string' && out) process.stdout.write(out);
}
```

Generación de Imágenes
```ts
const imageResponse = await client.image.generate({
  model: 'IAM-image',
  prompt: 'Un paisaje montañoso al atardecer con colores vibrantes',
});
console.log(imageResponse.url || imageResponse.b64_json);
```

Análisis de Imágenes (Vision)
```ts
// Respuesta completa
const visionResponse = await client.vision.analyze({
  prompt: 'Describe esta imagen detalladamente. ¿Qué ves en ella?',
  image: 'imagen.jpg',
  max_tokens: 200,
  temperature: 0.7
});
console.log(visionResponse.choices[0].message.content);

// O usando el helper createText (solo el texto)
const description = await client.vision.createText({
  prompt: 'Describe esta imagen',
  image: 'imagen.jpg',
  max_tokens: 200,
  temperature: 0.7
});
console.log(description);

// También disponible como analisis (alias en español)
const analisis = await client.vision.analisis({
  prompt: '¿Qué hay en esta imagen?',
  image: 'imagen.jpg',
});
console.log(analisis.choices[0].message.content);
```

Notas
- Streaming usa SSE; el servidor cierra con `data: [DONE]`.
- Helpers `streamText` y `streamToText` son opcionales, para extraer solo el texto final.
- Para `vision.analyze()`, el parámetro `image` debe ser una ruta de archivo local (solo Node.js).
- Los tipos MIME de imagen soportados son: `image/jpeg`, `image/png`, `image/gif`, `image/webp`, `image/bmp`.

Licencia: MIT