VOOZH about

URL: https://qiita.com/Syuparn/items/0001f93221d4d7556271

⇱ 【永久0円】人間LLMのすすめ #OpenAI - Qiita


👁 Image
201

Go to list of users who liked

33

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

👁 Image
【2026年上半期】AI活用を振り返ろう!
Qiita Tech Festa20262026年7月13日まで開催中!

【永久0円】人間LLMのすすめ

201
Posted at

はじめに

こんなお悩みはありませんか?

LLMは気づいたら値上がり。最新モデルは限定公開。ローカルLLMを建てようにもグラボが足りない。

...実は、電気を使わず使い放題の計算資源があることをご存知ですか?




―そう、貴方です。

作ったもの

というわけで作りました。名付けて humanllm です。

まずはサーバーを起動します。

$ npm run dev

起動するとUI画面とOpenAI API互換サーバーが立ち上がります。
LLMモデルになって、届いたプロンプトに返答しましょう。

👁 image.png

Codexを使ってみる

さっそくエージェントで使ってみましょう。ここではOpenAI APIが導入しやすいCodexを使っていきます。
まずはモデルの設定を準備します。

~/.codex/humanllm.config.toml
model ="human"
model_provider ="humanllm"

[model_providers.humanllm]
name ="Human LLM"
# humanllmのAPIサーバー
base_url ="http://localhost:3000/v1"
# ダミー値
bearer_token_env_var ="HUMANLLM_API_KEY"

[projects."/home/syuparn/tmp/hoge"]
trust_level ="trusted"

[tui.model_availability_nux]
"gpt-5.5" =4

モデルを指定して起動します。

$ codex --profile humanllm

プロンプトを送信

Codexでプロンプトを送信します。

👁 image.png

Pythonでhello worldを実装してください。

UIにプロンプトが届きました。本文の何十倍も長いシステムプロンプトがいっしょに付いています。

👁 image.png

内容は以下の通りです。

コマンドやスキルを使う際の注意点や、ユーザーから許可をもらう必要がある点について書かれています。

その後には、本題のプロンプトがあります。

👁 image.png

返信

というわけで返答しましょう。
すぐには思いつかないのでまずは進捗を。UIの Send Progress で考えている途中経過を返しましょう。

ちょっとまってね

👁 image.png

Codexが受け取りました。

👁 image.png

思いついたので本題のソースコードを返します。今度は Send で最終的な返答を送ります。

print("Hello, world!")

👁 image.png

Codexが受け取りました。任務完了です。

👁 image.png

コマンドを実行

今度は、ファイルの保存を依頼するプロンプトが飛んできました。

hello.pyに保存してください

👁 image.png

コマンドを実行する必要があるので、 Run Command で実行したいコマンドを返します。

echo 'print("Hello, world!")' > hello.py

👁 image.png

Codex側で受け取ったコマンドが実行されたようです。

👁 image.png

成功したかどうか確認します。

ls

👁 image.png

Codexで実行されます。

👁 image.png

結果がhumanllmへ送られます。ファイルはちゃんとできているようです。

[function_call_output]
Exit code: 0
Wall time: 0 seconds
Output:
hello.py

👁 image.png

結果を返答します。

👁 image.png

Codex側へ返ってきました。

👁 image.png

お疲れさまでした。

実装

最後に humanllm の実装について軽く紹介します。
1

構成

  • OpenAI APIサーバー: localhost:3000
  • UI: localhost:5173

UI画面はAPIサーバーとWebSocketで通信しており、APIサーバーを介してCodex等エージェントとやり取りしています。

ハマったところ

webSocketが返信できない

Reactのデバッグ用の StrictMode によって、WebSocketの構築、破棄が2回連続で起きてしまい疎通が切れてしまいました。そのため、<StrictMode> タグを外しています。

途中経過の送信

途中経過が送信できず、最終結果を送信したタイミングですべてまとめて送信されてしまいました。

OpenAI APIのstreaming APIでは、途中経過と最終的な返答を別のタイプで区別してあげる必要がありました。

  • 途中経過: response.output_text.delta
  • 最終的な返答: response.completed
レスポンス例
event: response.output_text.delta
data: {"type":"response.output_text.delta","item_id":"msg_39eb1b00-9137-4a74-accd-5d85fcf21073","output_index":0,"content_index":0,"delta":"reply"}

ところが、Codexでは上記に対応しても一括で送られてしまう問題が解消しません。
Codexでは途中経過のメッセージを \n 区切りで認識しているため、さらに返答の末尾に \n を付けてあげる必要がありました。

最終的な実装は以下の通りです。

src/App.tsx
 const handleDelta = useCallback(() => {
 if (!selectedId || !responseText.trim()) return
 send({ type: 'delta', requestId: selectedId, content: responseText.trim() + '\n' })
 setResponseText('')
 }, [selectedId, responseText, send])

コマンド実行

コマンド実行にはまた別のタイプが必要です。Codexではタイプ function_call を使用します。
実行したいコマンドを、arguments"{\"command\": \"{コマンド}\"}" という形式で指定します。

おわりに

以上、humanllmの紹介でした。

あなたもLLMになって無料でエージェントをぶん回しましょう👁 :grin:

関連記事

  1. ちなみにClaude Codeを普段使いしているのにCodexで検証したのは、 クローズドソースのプロンプトを覗いていいのか微妙だったからです。

201

Go to list of users who liked

33
3

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
201

Go to list of users who liked

33