定制 cynchro/modux-ia 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

cynchro/modux-ia

最新稳定版本:v0.0.1

Composer 安装命令:

composer require cynchro/modux-ia

包简介

SDK para integrar IA (LLM + RAG) directamente en aplicaciones PHP — sin Python, sin Node.js.

README 文档

README

SDK para integrar IA (LLM + RAG) directamente en aplicaciones PHP — sin Python, sin Node.js, sin microservicios.

Funciona con Modux, Laravel, Symfony, Slim, Mezzio, CodeIgniter y PHP puro.

Requisitos

  • PHP 8.1 o superior
  • Extensiones: curl, pdo, json
  • Composer 2

Instalación

composer require cynchro/modux-ia

Eso es todo. Sin configuración adicional si usás variables de entorno.

Integración por framework

Modux

El módulo se auto-registra al boot. Solo agregá las variables de entorno y listo.

1. Instalar

composer require cynchro/modux-ia

2. Variables de entorno (.env)

AI_DRIVER=cloud
AI_CLOUD_PROVIDER=openai
AI_CLOUD_API_KEY=sk-...
AI_CLOUD_MODEL=gpt-4o-mini
RAG_STORE=sqlite
RAG_SQLITE_PATH=storage/ai/vectors.db

3. Usar en cualquier servicio o controller

El container de Modux inyecta DriverFactory y RAGEngine automáticamente:

use PhpAI\DriverFactory;
use PhpAI\RAG\RAGEngine;

class SoporteService
{
    public function __construct(
        private readonly DriverFactory $ai,
        private readonly RAGEngine     $rag,
    ) {}

    public function responder(string $pregunta): string
    {
        return $this->rag->ask($pregunta);
    }
}

Los endpoints listos para usar son:

POST /ia/chat      — chat con el LLM
POST /ia/ask       — pregunta con contexto RAG
POST /ia/ingest    — carga un documento al vector store
POST /ia/retrieve  — búsqueda semántica pura

Laravel

composer require cynchro/modux-ia

El ServiceProvider se autoregistra. Publicá la config si querés personalizarla:

php artisan vendor:publish --tag=modux-ia
use PhpAI\DriverFactory;
use PhpAI\RAG\RAGEngine;

class SupportController extends Controller
{
    public function __construct(
        private readonly DriverFactory $ai,
        private readonly RAGEngine     $rag,
    ) {}

    public function ask(Request $request): JsonResponse
    {
        $answer = $this->rag->ask($request->input('question'));
        return response()->json(['answer' => $answer]);
    }
}

Slim 4 / Mezzio / cualquier PSR-11

composer require cynchro/modux-ia cynchro/modux-ia-psr11
use DI\ContainerBuilder;
use PhpAI\Psr11\AIDefinitions;

$builder = new ContainerBuilder();
$builder->addDefinitions(AIDefinitions::get());
$container = $builder->build();

PHP puro

require 'vendor/autoload.php';

use PhpAI\Bootstrap;

// Zero config — lee todo desde variables de entorno
$ai = Bootstrap::fromEnv();

// O configuración explícita
$ai = Bootstrap::create([
    'driver' => 'cloud',
    'drivers' => [
        'cloud' => [
            'provider' => 'openai',
            'api_key'  => 'sk-...',
            'model'    => 'gpt-4o-mini',
        ],
    ],
    'rag' => ['sqlite_path' => __DIR__ . '/storage/vectors.db'],
]);

Variables de entorno

# Driver: local | cloud | cluster
AI_DRIVER=cloud

# Cloud (OpenAI, Groq, Together, Ollama...)
AI_CLOUD_PROVIDER=openai
AI_CLOUD_API_KEY=sk-...
AI_CLOUD_MODEL=gpt-4o-mini
AI_CLOUD_EMBEDDING_MODEL=text-embedding-3-small

# Local (llama.cpp)
LLAMA_SERVER_URL=http://127.0.0.1:8080
LLAMA_EMBED_URL=http://127.0.0.1:8081
LLAMA_MODEL=llama3
LLAMA_TIMEOUT=120

# Cluster (múltiples nodos llama.cpp)
AI_CLUSTER_NODES=http://node1:8080,http://node2:8080

# RAG — store: sqlite | qdrant
RAG_STORE=sqlite
RAG_SQLITE_PATH=storage/ai/vectors.db
RAG_CHUNK_SIZE=512
RAG_CHUNK_OVERLAP=64
RAG_TOP_K=4
QDRANT_URL=http://127.0.0.1:6333

Cambiar de driver es solo cambiar AI_DRIVER — el código de la aplicación no cambia.

Drivers disponibles

Driver Cuándo usarlo
cloud OpenAI, Groq, Together, Ollama o cualquier API OpenAI-compatible
local llama.cpp corriendo localmente — sin costo, sin internet
cluster Múltiples nodos llama.cpp con round-robin

Providers cloud soportados

Provider AI_CLOUD_PROVIDER
OpenAI openai
Groq groq
Together AI together
Ollama ollama
Cualquier OpenAI-compatible URL directa como provider

Uso

Chat

use PhpAI\Contracts\CompletionRequest;

$response = $factory->llm()->complete(new CompletionRequest(
    messages: [
        ['role' => 'system', 'content' => 'Sos un experto en PHP.'],
        ['role' => 'user',   'content' => '¿Qué es un trait?'],
    ],
    temperature: 0.7,
    maxTokens: 512,
));

echo $response->content;

Streaming (SSE)

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

foreach ($factory->llm()->stream($request) as $token) {
    echo "data: " . json_encode(['token' => $token]) . "\n\n";
    ob_flush(); flush();
}
echo "data: [DONE]\n\n";

RAG — ingestar documentos

$rag = $factory->rag();

$rag->ingest(
    document: file_get_contents('manual.txt'),
    id:       'manual-v1',
    metadata: ['tipo' => 'manual'],
);

RAG — hacer preguntas

// Respuesta directa
$answer = $rag->ask("¿Cuál es el proceso de devolución?");

// Con filtro de metadata
$answer = $rag->ask(
    question: "¿Cómo configuro el sistema?",
    filter:   ['tipo' => 'manual'],
);

// Con system prompt personalizado
$answer = $rag->ask(
    question:     "¿Qué garantías tiene el producto?",
    systemPrompt: "Respondé de forma empática en no más de 3 oraciones.",
);

Búsqueda semántica pura

$chunks = $rag->retrieve("política de envíos internacionales");

foreach ($chunks as $chunk) {
    echo "[{$chunk['score']}] {$chunk['metadata']['content']}\n";
}

Embeddings

$vector  = $factory->embeddings()->embed("texto de ejemplo");
$vectors = $factory->embeddings()->embedBatch(["texto 1", "texto 2"]);

Vector store

Store Cuándo usarlo
sqlite Desarrollo y producción pequeña (~50k chunks, zero infraestructura)
qdrant Producción con millones de vectores
# Levantar Qdrant con Docker
docker run -d --name qdrant -p 6333:6333 qdrant/qdrant

Driver local con llama.cpp

# Instalar llama.cpp
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp && cmake -B build && cmake --build build --config Release

# Descargar modelos
wget https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q4_K_M.gguf -O models/llama3.gguf
wget https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q4_K_M.gguf -O models/nomic-embed.gguf

# Levantar servidores
./build/bin/llama-server --model models/llama3.gguf --host 127.0.0.1 --port 8080 --ctx-size 4096
./build/bin/llama-server --model models/nomic-embed.gguf --host 127.0.0.1 --port 8081 --embedding --pooling mean

Estructura del SDK

src/
├── Bootstrap.php              Punto de entrada
├── Config.php                 Configuración con dot-notation y lectura de ENV
├── DriverFactory.php          Resuelve y cachea drivers por nombre
├── Contracts/
│   ├── LLMDriver.php          Interface de inferencia
│   ├── EmbeddingDriver.php    Interface de embeddings
│   ├── VectorStoreContract.php Interface de almacenamiento vectorial
│   ├── CompletionRequest.php  DTO de entrada al LLM
│   └── CompletionResponse.php DTO de salida del LLM
├── Http/
│   └── Client.php             HTTP client con soporte SSE streaming
├── Drivers/
│   ├── Cloud/CloudDriver.php  APIs OpenAI-compatible (OpenAI, Groq, etc.)
│   ├── Local/LocalDriver.php  llama.cpp HTTP server
│   └── Cluster/ClusterDriver.php Round-robin sobre múltiples nodos
├── RAG/
│   ├── TextChunker.php        Divide texto en chunks con overlap
│   └── RAGEngine.php          Orquesta ingest + retrieval + generación
└── Storage/
    ├── SqliteVectorStore.php  SQLite + cosine similarity en PHP
    └── QdrantVectorStore.php  Qdrant via HTTP API

packages/
├── psr11/                     cynchro/modux-ia-psr11
└── laravel/                   cynchro/modux-ia-laravel

Licencia

MIT

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 10
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-05-11

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固