Jangada AIJangada AI

Diferenças em relação ao Python

O pacote jangada-ai do npm segue o comportamento da lib Python: mesmos providers, mesma política de retry e fallback, mesmo contrato de usage, mesma tabela de preços. Comportamento diferente do Python é tratado como bug, exceto nas diferenças listadas aqui, que existem por causa do runtime ou das convenções de JavaScript.

Linguagem e API

TemaPythonJavaScript / TypeScript
Sync e asynccomplete e acomplete, stream e astreamsó async: complete devolve Promise, stream devolve AsyncIterable
Nomessnake_case (max_tokens, tool_calls, with_fallback)camelCase (maxTokens, toolCalls, withFallback)
Opçõeskwargs (complete(p, images=[...]))objeto no último argumento (complete(p, { images: [...] }))
Variáveis do templatecomplete(prompt, nome="Ana")complete(prompt, { variables: { nome: "Ana" } })
Template com objetostr(valor)objetos e arrays viram JSON
Structured outputclasse PydanticZod, Standard Schema (Valibot, ArkType) ou jsonSchema()
Toolsfunção vira tool pela assinaturatool({ name, parameters, execute })
BytesbytesUint8Array
Cancelamentonão temsignal?: AbortSignal em toda chamada de rede
Temposegundos (backoff_base, ttl, poll_interval)milissegundos (backoffBaseMs, ttlMs, pollIntervalMs, timeoutMs)
Usageinput_tokens, cache_read_tokensinputTokens, cacheReadTokens (o payload de observability converte)
Graphgraph.then(a, b)graph.connect(a, b) (um método then faria await graph quebrar)
Contexto de Flow/Graphrun(**ctx), com nomes reservadosrun(ctx), objeto separado, sem nomes reservados
Ramos paralelos com falhacancela as tasks asynciocancela os ramos via AbortSignal
Fechar clientesclose()/aclose() e with LLM(...)await llm.close() ou await using llm = new LLM(...)

Pacote e runtime

O núcleo roda em Node 22+, Bun, Deno e edge (Cloudflare Workers, Vercel Edge), por isso não toca o disco. O que depende do Node fica em subpaths.

ImportConteúdo
jangada-aiLLM, erros, preços, cache, guardrails, vision, documentos, Flow, Graph, Agent, Squad, observability, prompts
jangada-ai/node.env, readImage, readAudio, readDocument, runInSession, serveMcp, serveA2a
jangada-ai/mcpcliente e servidor MCP, Code Mode
jangada-ai/ragRAG, chunking, rerank, stores
jangada-ai/evalDataset, Evaluator, evaluate
jangada-ai/prebuilttools prontas
jangada-ai/a2aservidor A2A web-standard
TemaPythonJavaScript / TypeScript
.envcarregado no import jangada_aicarregado no import "jangada-ai/node" ou com loadEnv(); desligue com JANGADA_NO_DOTENV=1
Imagem do discoimages=["foto.jpg"], Image.from_pathreadImage("foto.jpg"); no núcleo, ImagePart, data URI ou URL
Áudio do discotranscribe("audio.mp3")transcribe(await readAudio("audio.mp3"))
Documento do discofiles=["a.pdf"], Document("a.pdf")readDocument("a.pdf") ou new Document(bytes, { name })
Dependências de documentopypdf, python-docx, openpyxl (extra [files])unpdf, mammoth, exceljs; @napi-rs/canvas para PDF por vision
Dataset.from_jsonlcaminho do arquivoDataset.fromJsonl(texto)
OCR da Mistralaceita caminhosó bytes, URL ou data URI (caminho lança UnsupportedError)
Cache do catálogo de preçosdisco (~/.cache/jangada), TTL 1 diamemória, TTL 1 dia por processo
SDKsextras do pippeerDependencies opcionais, carregadas com import() só quando o provider é usado

Observability e prompts

TemaPythonJavaScript / TypeScript
Sessãowith observability_session(...) as trace_idobservabilitySession() passada em { trace }, ou runInSession(opts, fn) de jangada-ai/node
Flush no fimatexitbeforeExit com jangada-ai/node; em serverless, await flushObservability()
Prompt usado no tracewith p.use():{ trace: p.trace() }
Contexto da requisição MCPContextVar2º argumento do execute (ctx) e AsyncLocalStorage quando existir

Erros, cache e guardrails

TemaPythonJavaScript / TypeScript
classifystatus HTTP e nome da classetambém cause.code de rede do Node (ECONNRESET, UND_ERR_CONNECT_TIMEOUT...)
Guardrail própriocheck_input e acheck_input, GuardResult(ok, reason)só async checkInput, devolve { ok, reason }
Reentrância do judgeContextVarmarca na própria chamada do judge (funciona em qualquer runtime)
detectObjectsaceita caminho; JSON fora do schema pode virar OutputValidationErrorsó ImagePart; leitura sempre tolerante (caixas inválidas são descartadas)

Providers

TemaPythonJavaScript / TypeScript
GroqSDK groqSDK openai com a URL do Groq
OllamaSDK ollamafetch direto na API nativa (roda em edge)
Gemini, structured outputresponse_schema (Pydantic)responseJsonSchema (JSON Schema)
Gemini, profiles e extrasthinking_budget, top_pthinkingBudget, topP (vocabulário do @google/genai)
Avisos dos profileslog de debug (logging, logger jangada_ai)linha profile: ... no trace de debug: true
Gemini, embeddingsembed(..., output_dimensionality=768)embed(textos, { outputDimensionality: 768 })
Gemini com MCPAFC do SDK; usage só da última respostaloop da jangada; usage somado das rodadas
Gemini Interactionspoll_interval/timeout em segundos, sync e asyncpollIntervalMs/timeoutMs, só async, signal cancela o polling
Mistral parsechat.parse com PydanticresponseFormat json_schema strict
Mistral stream com tools nativasUnsupportedErrorchamada normal da Conversations API, texto de uma vez
Mistral toolChoice por nome (Conversations API)aceitaUnsupportedError (o SDK JS só aceita auto, none, any, required)
Rerank Cohere e VoyageSDKsAPI HTTP direta
BM25 do RAGrank_bm25implementação própria, mesma fórmula
pgvectoruma conexão psycopgPool do pg (injetável), mesmo advisory lock do Python

MCP e A2A

TemaPythonJavaScript / TypeScript
Code ModePython no sandbox MontyJavaScript no QuickJS (quickjs-emscripten); só return devolve valor
App HTTP do servidor MCPStarlette ASGIhandler web-standard Request => Response (Node, Bun, Deno, Workers, Hono, Next)
serve_mcpbloqueiaserveMcp() devolve { url, port, close() }
authToken e OPTIONS401 também no preflightOPTIONS passa sem token (clientes de navegador)
keepAlive e HTTP 4044xx não reconecta404 reconecta (sessão expirada, conforme a spec)
SSRF nas tools prontasresolve DNS e checa cada IPcheca o host literal; setResolveHost liga a checagem por DNS
A2Abuild_a2a_app (Starlette)buildA2aHandler web-standard ou serveA2a de jangada-ai/node; TTLs em ms

Relacionado: Começando, Providers, documentação da lib Python.

On this page