OneLi ב־LangChain / LangGraph

איך נותנים לסוכן שבנוי ב־LangChain / LangGraph לבצע שיחות טלפון בעברית דרך OneLi, לעקוב אחרי השיחה, לענות להתייעצויות ולקבל את התוצאה.

מאז langchain 1.4 התיעוד מציג את MCPAdapter המובנה (בטא) במקום MultiServerMCPClient. הסוכן שנוצר עם create_agent רץ על LangGraph.

התקנה

  1. יוצרים מפתח API ב־oneli.io/app/connect ושומרים אותו במשתנה הסביבה ONELI_API_KEY בשרת.
  2. מתקינים את החבילות:
Terminal
pip install "langchain[mcp]" langchain-openai   # or: npm i langchain @langchain/mcp-adapters @langchain/core @langchain/langgraph zod

נבדק מול: langchain 1.4.7 (Python) · langchain 1.5.18 + @langchain/mcp-adapters 2.0.1 (JS)

Python: ‏MCPAdapter

Python
# Current (beta) API: FastMCP Client, auth=<str> sends "Authorization: Bearer <str>"
import asyncio, os
from fastmcp.client import Client
from langchain.agents import create_agent
from langchain.mcp import MCPAdapter

async def main():
    async with MCPAdapter(Client("https://mcp.oneli.io/mcp", auth=os.environ["ONELI_API_KEY"])) as adapter:
        agent = create_agent("openai:gpt-5", await adapter.list_tools())
        r = await agent.ainvoke({"messages": [{"role": "user", "content": "Call +972… and book a table"}]})
        print(r["messages"][-1].content)
asyncio.run(main())

# Legacy, still published and still working:
# from langchain_mcp_adapters.client import MultiServerMCPClient
# client = MultiServerMCPClient({"oneli": {"transport": "http", "url": "https://mcp.oneli.io/mcp",
#     "headers": {"Authorization": f"Bearer {os.environ['ONELI_API_KEY']}"}}})
# tools = await client.get_tools()

JavaScript: ‏MCPAdapter וכלי REST

TypeScript
import { MCPAdapter } from '@langchain/mcp-adapters';
import { createAgent, tool } from 'langchain';
import { z } from 'zod';

const adapter = new MCPAdapter({ servers: { oneli: { url: 'https://mcp.oneli.io/mcp',
  headers: { Authorization: `Bearer ${process.env.ONELI_API_KEY}` } } } });
try {
  const agent = createAgent({ model: 'openai:gpt-5', tools: await adapter.listTools() });
  const res = await agent.invoke({ messages: [{ role: 'user', content: 'Call +972…' }] });
  console.log(res.messages.at(-1)?.text);
} finally { await adapter.close(); }

const createCallTask = tool(async ({ to_number, goal, instructions }) => {
  const r = await fetch('https://api.oneli.io/v1/call-tasks', { method: 'POST',
    headers: { Authorization: `Bearer ${process.env.ONELI_API_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ idempotency_key: crypto.randomUUID(), to_number, goal, instructions }) });
  return JSON.stringify(await r.json());
}, { name: 'create_call_task', description: 'Place an AI phone call via OneLi',
     schema: z.object({ to_number: z.string(), goal: z.string(), instructions: z.string().optional() }) });

שימו לב

  • langchain.mcp מציג אזהרת LangChainBetaWarning.
  • סוג התעבורה נגזר מהכתובת.
  • בלקוח הישן השתמשו ב־"transport": "http".
  • כלי REST ב־Python: ‏@tool מ־langchain.tools על פונקציה ששולחת את אותה בקשת POST.

מספרי טלפון: OneLi מקבלת מספר ישראלי בכל פורמט נפוץ (050-1234567,‏ +972501234567). כשהשיחה מתחילה, הסוכן ממשיך עם get_call_events או עם GET /v1/call-tasks/:id/events כדי לעקוב, לענות להתייעצויות ולקבל את הסיכום.

מה הלאה

מקורות: docs.langchain.com/oss/python/langchain/mcp · docs.langchain.com/oss/python/langchain/mcp/auth · docs.langchain.com/oss/python/migrate/langchain-mcp-adapters · docs.langchain.com/oss/javascript/langchain/mcp