API
npm install openai @doconda/sdk
import OpenAI from "openai"
import { Doconda } from "@doconda/sdk"
const openai = new OpenAI()
const docondaTools = new Doconda().tools()
const tools = docondaTools.map((t) => ({ type: "function" as const, function: { name: t.name, description: t.description, parameters: t.inputSchema } }))
const messages: any[] = [{ role: "user", content: "Redacta un memo para el equipo: la oficina cierra el viernes" }]
while (true) {
const res = await openai.chat.completions.create({ model: "gpt-5", messages, tools })
const message = res.choices[0]?.message
if (!message) break
messages.push(message)
if (!message.tool_calls?.length) {
console.log(message.content)
break
}
for (const call of message.tool_calls) {
if (call.type !== "function") continue
const result = await docondaTools.find((t) => t.name === call.function.name)!.run(JSON.parse(call.function.arguments))
messages.push({ role: "tool", tool_call_id: call.id, content: JSON.stringify(result) })
}
}
openai("gpt-5") de @ai-sdk/openai.
Con Python
pip install openai doconda
import json
from doconda import Doconda
from openai import OpenAI
openai = OpenAI()
tools = Doconda().tools()
specs = [{"type": "function", "function": {"name": t.name, "description": t.description, "parameters": t.input_schema}} for t in tools]
messages = [{"role": "user", "content": "Redacta un memo para el equipo: la oficina cierra el viernes"}]
while True:
message = openai.chat.completions.create(model="gpt-5", messages=messages, tools=specs).choices[0].message
messages.append(message)
if not message.tool_calls:
break
for call in message.tool_calls:
out = next(t for t in tools if t.name == call.function.name).run(json.loads(call.function.arguments))
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(out)})
print(message.content)
OpenAI Codex
En~/.codex/config.toml:
[mcp_servers.doconda]
command = "npx"
args = ["-y", "@doconda/mcp"]
env = { DOCONDA_API_KEY = "ak_eu_…" }