一位 Laravel 开发者把已有 Claude Code 订阅利用起来,将 Claude Code CLI 封装成 Prism provider,从而在不额外支付 API 费用的情况下继续使用 Prism 的 LLM 调用接口。整套实现只有约 200 行代码,通过 stdin/stdout 与 CLI 交互,并保留了按环境变量切换 provider 的能力。
核心思路:Prism 的 provider 是扩展自 Prism\Prism\Providers\Provider 的类。这里只需实现 text() 和 structured() 两个方法,不支持 embedding、图片和流式。
CLI 调用输出包含 is_error、result、usage、model,可直接映射到 Prism 的 TextResponse / StructuredResponse。
安全要点:命令参数用数组传给 Laravel Process(避免 shell 注入);用户 prompt 走 stdin 而非 argv;工作目录设为 sys_get_temp_dir() 避免项目指令泄漏;额外检查 envelope 中的 is_error 字段。
结构化输出模拟:CLI 不支持原生 JSON schema,因此在 prompt 末尾拼接 schema 要求,并在解析时先尝试直接 json_decode,再剥离 markdown 代码块,最后截取首尾大括号。
注册方式:在 ServiceProvider 的 boot 中通过 PrismManager::extend() 注册闭包,确保 Octane 下每次解析都重新读取配置。
切换 provider 只需修改环境变量,例如 PRISM_TEXT_PROVIDER=claude-cli PRISM_TEXT_MODEL=claude-haiku-4-5。resolveModel 方法会捕获旧模型名并回退到默认值。
注意:CLI 调用慢(大 prompt 30-90 秒),需注意超时链设置;容器内需安装 Node.js;高并发下进程创建开销大,不适合生产规模流量。对于 solo 开发或小产品,可大幅节省 API 成本。
#开发者 #工具 #Prism #ClaudeCode #CLI #Laravel #LLM
@DevToolboxHub