必须通过中间服务或原生封装绕过CORS限制;可用React Native/Flutter、Cloudflare Workers或Android原生Kotlin调用Jev模型API,注意API Key不得硬编码,需通过Authorization头传递,并按要求构造含state和noul类型questions的JSON请求体。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在手机端调用 Jev 模型 API,必须绕过浏览器同源限制和 CORS 策略,不能直接用前端 JavaScript 发起跨域 POST 请求到 https://api.typesafe.ai/v1/systemone;你得借助一个可控的中间服务或原生能力封装。
方法一:用 React Native 或 Flutter 封装原生 HTTP 请求
在 React Native 中安装 @react-native-async-storage/async-storage 和 axios,确保 Android 的 android:usesCleartextTraffic="true" 已开启(仅调试期),iOS 需在 Info.plist 添加 NSAppTransportSecurity 允许明文请求。
创建一个请求函数,传入你的 【API Key 必须通过 Authorization: Bearer {key} 传入请求头,不可硬编码在前端代码中】;实际生产环境应由你自己的后端代理转发,此处仅用于验证通路。
调用时构造 JSON body:state 字段填用户输入文本,questions 数组里至少含一个 Noul 类型问题,例如 {"type":"noul","name":"is_urgent","text":"Does this message express urgency?"}。
这一步操作起来很简单,直接把文件拖进去就行。
方法二:用手机浏览器 + Cloudflare Workers 临时中转
打开 Cloudflare Dashboard → Workers → 创建新 Worker,粘贴以下代码并部署:
export default { async fetch(request) { const { searchParams } = new URL(request.url); const state = searchParams.get('state') || ''; const q = searchParams.get('q') || 'is_urgent'; const key = 'your_api_key_here'; const res = await fetch('https://api.typesafe.ai/v1/systemone', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${key}` }, body: JSON.stringify({ state, questions: [{ type: 'noul', name: q, text: `Does this message express urgency?` }] }) }); return res; } };
【注意:此方式仅限测试,API Key 明文暴露在 Worker 源码中,上线前必须改用环境变量 + 后端鉴权】
部署成功后,用手机浏览器访问类似 https://your-worker.abc.workers.dev/?state=My+payment+failed+3+times&q=is_urgent 的链接,即可看到返回的 JSON 结构化结果。
方法三:Android 原生 App 直接调用(Kotlin)
第一步:在 app/build.gradle 中添加 OkHttp 依赖:implementation 'com.squareup.okhttp3:okhttp:4.12.0';
第二步:在 AndroidManifest.xml 的 <application> 标签下添加网络权限:android:usesCleartextTraffic="true";
第三步:在 Activity 中编写如下代码片段:
val client = OkHttpClient(); val json = JSONObject().apply { put("state", "I need refund ASAP"); put("questions", JSONArray().put(JSONObject().apply { put("type", "noul"); put("name", "is_refund_request"); put("text", "Is this a refund request?") })) }; val body = RequestBody.create(json.toString(), MediaType.get("application/json")); val request = Request.Builder() .url("https://api.typesafe.ai/v1/systemone") .post(body) .header("Authorization", "Bearer sk-xxx") .build(); client.newCall(request).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { println(response.body?.string()) } override fun onFailure(call: Call, e: IOException) { e.printStackTrace() } });
第四步:运行 App,观察 Logcat 输出是否返回 {"is_refund_request":{"noul":0.98}} —— 若返回 401,说明 Key 错误;若返回 429,说明触发了每分钟 1200 请求的速率限制。

















