Why Choose Calljmp for AI Workflow Automation in Mobile Apps?
Tired of wiring raw AI APIs? Calljmp is your cloud AI platform for mobile-first integration. Define AI agents as code, orchestrate workflows, and scale with a built-in backend - no Firebase or Supabase needed.
Mobile-First AI SDKs
- React Native hooks (Expo-ready) for instant AI calls
- Flutter SDK designed for async Dart workflows
- Drop-in primitives: text, image, speech-to-text
From AI Primitives to Agents
- Orchestrate multi-step AI like visual workflow builders
- AutoRAG for semantic search over your app data
- Templates: chat, voice translator, more coming
Backend Included (MBaaS)
- Secure auth + App Attestation / Play Integrity
- SQLite-compatible D1 for vectors & usage logs
- Realtime pub/sub for streaming + async responses
From Hook to Edge Execution
Integrated Capabilities
AI Text Generation
Turn user prompts into structured output via Workers AI or proxied models.
Generate structured text with retry, abort, and streaming variants. The useTextGeneration
hook wraps model invocation, handles abort signals, and optionally retries transient failures.
import { useTextGeneration } from '@calljmp/react-native';
export function SummaryCard({ article }: { article: string }) {
const { result, loading, error, generate, abort } = useTextGeneration({
prompt: 'Summarize: ' + article,
});
return (
<View>
{loading && <ActivityIndicator />}
{error && <Text>Error: {error.message}</Text>}
{result && <Text>{result.text}</Text>}
<Button onPress={() => generate({ prompt: 'Summarize: ' + article })}>Retry</Button>
<Button onPress={abort}>Cancel</Button>
</View>
);
}
Streaming Chatbot
Add a realtime AI agent for chat, with personalization.
Realtime token streaming with partial assistant message accumulation. The useChat
hook composes useTextStream
and retries transient failures with exponential backoff.
import { useChat } from '@calljmp/react-native';
export function TravelAssistant() {
const { messages, partialMessage, sendMessage, isSending } = useChat({
systemPrompt: 'You are a helpful travel planner focused on budget tips.'
});
return (
<View>
{[...messages, partialMessage].filter(Boolean).map((m, i) => (
<Text key={i}>{m!.role}: {m!.content}</Text>
))}
<Button disabled={isSending} onPress={() => sendMessage('Plan 3 day Tokyo trip under $500')}>Ask</Button>
</View>
);
}
Voice Translator
Speech-to-text, then translate - all edge-native.
Convert speech to text, optionally translate, then feed into any agent workflow. Edge execution keeps latency low for conversational UX.
import calljmp from '@calljmp/react-native';
async function translateAudio(audioBlob: Blob) {
const text = await calljmp.ai.speech.toText(audioBlob, { language: 'en' });
const translated = await calljmp.ai.text.translate(text, 'es');
return translated;
}
AI Image Captioner
Generate captions or process images (e.g., background removal).
Generate accessible captions or transform images (background removal, thumbnail generation) using unified image APIs.
const caption = await calljmp.ai.image.toText(photoUri, {
prompt: 'Describe for visually impaired user'
});
// or background removal
const processed = await calljmp.ai.image.removeBackground(photoUri);
Semantic Search
Embeddings-based search for app data.
Embed and search your structured or unstructured content. Vector similarity leverages D1 + edge inference for low-latency retrieval.
const results = await calljmp.ai.search.semantic({
query: 'refund policy',
dataset: 'faqs',
topK: 5,
});
results.forEach(r => console.log(r.score, r.text));
Multi-Step Agent Workflow
Chain actions into AI agents as code - no servers needed.
Compose multi-step AI logic as code: branching, memory passing, tool calls, and side-effects. Define operators once; reuse across flows.
import { Calljmp, operator, workflow, OperatorContext } from '@calljmp/react-native';
const calljmp = new Calljmp();
// Operator fn for generating embeddings (async/await)
const generateEmbedding = calljmp.ai.operator<
{ query: string },
{ embedding: number[] }
>(async (context) => {
const ai = context.env.AI;
const embeddingResponse = await ai.run('@cf/baai/bge-base-en-v1.5', { text: [context.input.query] });
return { embedding: embeddingResponse.data[0] };
});
// Operator fn for vector search (async, Vectorize binding)
const vectorSearch = calljmp.ai.operator<
{ embedding: number[] },
{ results: object[] }
>(async (context) => {
const matches = await context.env.VECTORIZE.query(context.input.embedding, { topK: 10 });
return { results: matches.matches };
});
// Operator fn for filtering results (with memory)
const filterResults = calljmp.ai.operator<
{ results: object[] },
{ filteredResults: object[] }
>(async (context) => {
const { results } = context.input;
const threshold = context.memory.threshold || 0.80; // Read from memory with default
const filtered = results.filter((item) => item.score > threshold);
return { filteredResults: filtered, _memory: { filteredCount: filtered.length } };
});
// Operator fn for AI summarization (async)
const summarizeWithAI = calljmp.ai.operator<
{ filteredResults: object[] },
{ summary: string }
>(async (context) => {
const ai = context.env.AI;
const summary = await ai.run('@cf/meta/llama-2-7b-chat-fp16', `Summarize: ${JSON.stringify(context.input.filteredResults)}`);
return { summary };
});
// Operator fn for sending email notification (async, custom binding)
const sendEmailNotification = calljmp.ai.operator<
{ summary: string },
{ notificationStatus: string }
>(async (context) => {
await context.env.EMAIL.send({
to: 'user@example.com',
subject: 'Summary Ready',
body: context.input.summary,
});
return { notificationStatus: 'sent' };
});
// Sequential workflow with type changes
const workflow = calljmp.ai.workflow('Search Workflow', 'Embedding to Email Notification', (flow) => {
flow.next(generateEmbedding.with({ inputs: ['query'] })); // flow.outputs.embedding: number[]
flow.next(vectorSearch); // flow.outputs.results: object[]
flow.next(filterResults); // flow.outputs.filteredResults: object[]; flow.memory.filteredCount: number
flow.next(summarizeWithAI); // flow.outputs.summary: string
flow.next(sendEmailNotification); // flow.outputs.notificationStatus: string
});

AI Text Generation
Turn user prompts into structured output via Workers AI or proxied models.
Generate structured text with retry, abort, and streaming variants. The useTextGeneration
hook wraps model invocation, handles abort signals, and optionally retries transient failures.
import { useTextGeneration } from '@calljmp/react-native';
export function SummaryCard({ article }: { article: string }) {
const { result, loading, error, generate, abort } = useTextGeneration({
prompt: 'Summarize: ' + article,
});
return (
<View>
{loading && <ActivityIndicator />}
{error && <Text>Error: {error.message}</Text>}
{result && <Text>{result.text}</Text>}
<Button onPress={() => generate({ prompt: 'Summarize: ' + article })}>Retry</Button>
<Button onPress={abort}>Cancel</Button>
</View>
);
}
Streaming Chatbot
Add a realtime AI agent for chat, with personalization.
Realtime token streaming with partial assistant message accumulation. The useChat
hook composes useTextStream
and retries transient failures with exponential backoff.
import { useChat } from '@calljmp/react-native';
export function TravelAssistant() {
const { messages, partialMessage, sendMessage, isSending } = useChat({
systemPrompt: 'You are a helpful travel planner focused on budget tips.'
});
return (
<View>
{[...messages, partialMessage].filter(Boolean).map((m, i) => (
<Text key={i}>{m!.role}: {m!.content}</Text>
))}
<Button disabled={isSending} onPress={() => sendMessage('Plan 3 day Tokyo trip under $500')}>Ask</Button>
</View>
);
}
Voice Translator
Speech-to-text, then translate - all edge-native.
Convert speech to text, optionally translate, then feed into any agent workflow. Edge execution keeps latency low for conversational UX.
import calljmp from '@calljmp/react-native';
async function translateAudio(audioBlob: Blob) {
const text = await calljmp.ai.speech.toText(audioBlob, { language: 'en' });
const translated = await calljmp.ai.text.translate(text, 'es');
return translated;
}
AI Image Captioner
Generate captions or process images (e.g., background removal).
Generate accessible captions or transform images (background removal, thumbnail generation) using unified image APIs.
const caption = await calljmp.ai.image.toText(photoUri, {
prompt: 'Describe for visually impaired user'
});
// or background removal
const processed = await calljmp.ai.image.removeBackground(photoUri);
Semantic Search
Embeddings-based search for app data.
Embed and search your structured or unstructured content. Vector similarity leverages D1 + edge inference for low-latency retrieval.
const results = await calljmp.ai.search.semantic({
query: 'refund policy',
dataset: 'faqs',
topK: 5,
});
results.forEach(r => console.log(r.score, r.text));
Multi-Step Agent Workflow
Chain actions into AI agents as code - no servers needed.
Compose multi-step AI logic as code: branching, memory passing, tool calls, and side-effects. Define operators once; reuse across flows.
import { Calljmp, operator, workflow, OperatorContext } from '@calljmp/react-native';
const calljmp = new Calljmp();
// Operator fn for generating embeddings (async/await)
const generateEmbedding = calljmp.ai.operator<
{ query: string },
{ embedding: number[] }
>(async (context) => {
const ai = context.env.AI;
const embeddingResponse = await ai.run('@cf/baai/bge-base-en-v1.5', { text: [context.input.query] });
return { embedding: embeddingResponse.data[0] };
});
// Operator fn for vector search (async, Vectorize binding)
const vectorSearch = calljmp.ai.operator<
{ embedding: number[] },
{ results: object[] }
>(async (context) => {
const matches = await context.env.VECTORIZE.query(context.input.embedding, { topK: 10 });
return { results: matches.matches };
});
// Operator fn for filtering results (with memory)
const filterResults = calljmp.ai.operator<
{ results: object[] },
{ filteredResults: object[] }
>(async (context) => {
const { results } = context.input;
const threshold = context.memory.threshold || 0.80; // Read from memory with default
const filtered = results.filter((item) => item.score > threshold);
return { filteredResults: filtered, _memory: { filteredCount: filtered.length } };
});
// Operator fn for AI summarization (async)
const summarizeWithAI = calljmp.ai.operator<
{ filteredResults: object[] },
{ summary: string }
>(async (context) => {
const ai = context.env.AI;
const summary = await ai.run('@cf/meta/llama-2-7b-chat-fp16', `Summarize: ${JSON.stringify(context.input.filteredResults)}`);
return { summary };
});
// Operator fn for sending email notification (async, custom binding)
const sendEmailNotification = calljmp.ai.operator<
{ summary: string },
{ notificationStatus: string }
>(async (context) => {
await context.env.EMAIL.send({
to: 'user@example.com',
subject: 'Summary Ready',
body: context.input.summary,
});
return { notificationStatus: 'sent' };
});
// Sequential workflow with type changes
const workflow = calljmp.ai.workflow('Search Workflow', 'Embedding to Email Notification', (flow) => {
flow.next(generateEmbedding.with({ inputs: ['query'] })); // flow.outputs.embedding: number[]
flow.next(vectorSearch); // flow.outputs.results: object[]
flow.next(filterResults); // flow.outputs.filteredResults: object[]; flow.memory.filteredCount: number
flow.next(summarizeWithAI); // flow.outputs.summary: string
flow.next(sendEmailNotification); // flow.outputs.notificationStatus: string
});
Secure and Scalable AI Backend Powered by Cloudflare
Calljmp provides AI as a Service (AIaaS) integrated with a robust Mobile Backend as a Service (MBaaS). Deliver secure AI invocations with comprehensive authentication and usage tracking, enabling developers to build intelligent mobile applications without backend complexity.
Secure by design
- App AttestationVerify device integrity for trusted AI access.
- Signed URLsSecure temporary access to resources.
- Row-Level Security (RLS)Fine-grained data access controls.
- Auth-Tracked UsageMonitor and limit AI consumption per user.
System architecture
Transparent pricing
Bill based on invocationsrather than messages or tokens. Avoid unexpected costs with a predictable model that scales efficiently with your application's growth.
Edge-native scalability
Leverage Cloudflare Workers AI, D1, and R2 for inference and data management at the edge. Achieve zero egress costs, minimal latency, and seamless global distribution.
Advanced observability
Trusted by mobile developers
Calljmp helps developers ship faster with a secure, real-time backend - no servers, no setup.
Simple, transparent pricing for mobile apps
Start free, scale with predictable costs. AI invocations include primitives, agents, and chains - the backend (auth, database, storage, realtime) is bundled in every plan.
Free
$0/month
For prototyping AI agents. Start free, scale later. AI invocations include primitives, agents, and chains - backend free.
- 10,000 AI invocations / mo
- All SDKs (React Native, Flutter)
- Backend: auth, D1, R2, realtime
- Community support
Pro
$20/month
For production AI workflows with predictable scale and priority response times.
Everything in the Free, plus:
- 1,000,000 AI invocations / mo
- Unlimited agents & chains
- Additional usage $1 / million
- Priority support
Scale
$499/month
For enterprise AI automation. Custom limits, SLAs, and premium onboarding.
Everything in the Pro, plus:
- Custom usage & SLAs
- Premium support & onboarding
- Compliance & governance tools
- Strategic architecture reviews
From our blog
Insights, tutorials, and stories from the world of mobile development. Learn how to build better apps with less complexity.
Frequently asked questions
Find answers to common questions about Calljmp's features, pricing, and capabilities.