Dùng VieNeu từ OpenAI API
Nếu bạn tự làm app trên model của OpenAI, bạn có thể trao thẳng các công cụ VieNeu
cho model: model tự quyết khi nào tìm giọng, khi nào đọc, còn OpenAI gọi
https://api.vieneu.io/mcp thay bạn.
Cần có: OpenAI API key và API key của VieNeu
(vn_sk_..., tạo ở trang Nhà phát triển). Để cả hai trong biến môi trường:
export OPENAI_API_KEY=sk-...
export VIENEU_API_KEY=vn_sk_...
Nếu code của bạn đã biết sẵn văn bản và giọng thì không cần MCP hay LLM — gọi thẳng endpoint tương thích OpenAI bằng OpenAI SDK. MCP dành cho lúc bạn muốn model tự quyết.
Responses API
Responses API có sẵn công cụ MCP từ xa. Đưa key VieNeu vào authorization; OpenAI
gửi nó tới VieNeu dưới dạng Bearer token, và VieNeu chấp nhận.
import os
from openai import OpenAI
client = OpenAI()
resp = client.responses.create(
model="gpt-5", # model hiện hành bất kỳ có hỗ trợ tool
tools=[{
"type": "mcp",
"server_label": "vieneu",
"server_url": "https://api.vieneu.io/mcp",
"authorization": os.environ["VIENEU_API_KEY"],
"allowed_tools": ["list_voices", "text_to_speech", "get_speech_status", "get_token_balance"],
"require_approval": "never",
}],
input="Tìm một giọng nữ miền Bắc rồi đọc câu: Xin chào, đây là VieNeu. Trả về link tải.",
)
print(resp.output_text)
import OpenAI from "openai";
const client = new OpenAI();
const resp = await client.responses.create({
model: "gpt-5",
tools: [{
type: "mcp",
server_label: "vieneu",
server_url: "https://api.vieneu.io/mcp",
authorization: process.env.VIENEU_API_KEY,
allowed_tools: ["list_voices", "text_to_speech", "get_speech_status", "get_token_balance"],
require_approval: "never",
}],
input: "Tìm một giọng nữ miền Bắc rồi đọc câu: Xin chào, đây là VieNeu. Trả về link tải.",
});
console.log(resp.output_text);
require_approval: mặc định mỗi lần gọi công cụ đều cần duyệt (khi đó câu trả lời có các mụcmcp_approval_requestmà bạn phải trả lời)."never"cho model tự tiêu token VieNeu của bạn mà không hỏi — hãy giới hạnallowed_tools, hoặc chỉ bắt duyệt riêngtext_to_speech:"require_approval": {"always": {"tool_names": ["text_to_speech"]}}.- OpenAI không lưu key, nên phải gửi kèm mỗi request.
- Link audio nằm trong kết quả công cụ và thường có trong câu trả lời của model;
các mục
mcp_calltrongresp.outputchứa kết quả thô.
OpenAI Agents SDK (Python)
Để OpenAI gọi VieNeu thay bạn (hosted tool):
import os
from agents import Agent, HostedMCPTool, Runner
agent = Agent(
name="Narrator",
instructions="Bạn đọc văn bản tiếng Việt bằng VieNeu và trả về link audio.",
tools=[HostedMCPTool(tool_config={
"type": "mcp",
"server_label": "vieneu",
"server_url": "https://api.vieneu.io/mcp",
"authorization": os.environ["VIENEU_API_KEY"],
"require_approval": "never",
})],
)
result = Runner.run_sync(agent, "Đọc câu 'Chào buổi sáng' bằng giọng Thu Trang.")
print(result.final_output)
Hoặc kết nối từ chính tiến trình của bạn (code của bạn gọi VieNeu, header tuỳ ý):
import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
async with MCPServerStreamableHttp(
name="vieneu",
params={
"url": "https://api.vieneu.io/mcp",
"headers": {"X-API-Key": os.environ["VIENEU_API_KEY"]},
"timeout": 60,
},
cache_tools_list=True,
) as vieneu:
agent = Agent(name="Narrator", mcp_servers=[vieneu])
result = await Runner.run(agent, "Đọc câu 'Chào buổi sáng' bằng giọng Thu Trang.")
print(result.final_output)
asyncio.run(main())
Để timeout rộng rãi: text_to_speech chờ audio xong (vài giây với câu ngắn,
tới khoảng 50 giây với văn bản dài).
Chi phí
Hai hoá đơn riêng: OpenAI tính token của model, VieNeu trừ gói của bạn cho mỗi
lần tạo audio (theo ký tự, tối thiểu 50). list_voices, list_emotion_tags,
get_speech_status và get_token_balance miễn phí phía VieNeu.