-
-
Notifications
You must be signed in to change notification settings - Fork 335
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Submit LLM to Homebrew #124
Comments
https://docs.brew.sh/Adding-Software-to-Homebrew I ran this: brew audit --strict --new-formula --online llm And got no errors. |
https://docs.brew.sh/How-To-Open-a-Homebrew-Pull-Request is complicated. |
I tried
So I'm upgrading now: brew upgrade llm
|
Tried this: brew install --build-from-source llm Got this error:
Here's the full content of Key snippets:
|
I'm using this to open the formula for editing: brew edit llm |
OK this should hopefully fix that: simonw/homebrew-llm@5a69a7c Now running this again: brew install --build-from-source llm |
Here's what "new formula" PRs to Homebrew look like: https://github.com/Homebrew/homebrew-core/pulls?q=is%3Apr+label%3A%22new+formula%22 Looks like you submit one without the bottle bits: Homebrew/homebrew-core@af9e6a4 And a bot then adds them for you: Homebrew/homebrew-core@477fd6f |
|
brew test llm That passed. brew audit --strict --online llm Got three failures:
|
Fixing that by editing the first few lines of class Llm < Formula
include Language::Python::Virtualenv
desc "Access large language models from the command-line"
homepage "https://github.com/simonw/llm"
url "https://files.pythonhosted.org/packages/64/a3/24218c5cdada7e9eac5425bb702d734605d2f16bf8450c3a81571dd34558/llm-0.6.tar.gz"
sha256 "6226bcbb4c79affd85870a69a09a5b47aec6bc549c65b620f086253424e3410a"
depends_on "rust" => :build
depends_on "[email protected]" |
|
I have a https://github.com/simonw/homebrew-core fork already but it's wildly out of date. I'm going to destroy and recreate it. |
One more audit: brew audit --new |
It failed!
|
Looks like I need to add |
That audit passes as well now. I force pushed that change to my |
Opened my PR against |
Sequence of commands: brew tap --force homebrew/core
cd "$(brew --repository homebrew/core)"\n
pwd
git remote add simonw https://github.com/simonw/homebrew-core.git
git checkout master
brew update
git checkout -b llm origin/master
git add Formula/llm.rb
git commit
git push https://github.com/simonw/homebrew-core/ llm
brew audit --new llm
brew edit llm
git status
git diff
git commit --amend -a
git push https://github.com/simonw/homebrew-core/ llm --force
brew audit --new llm |
Now blocked waiting to see if the PR gets accepted. |
Just spotted this in https://docs.brew.sh/Acceptable-Formulae#niche-or-self-submitted-stuff
Fingers crossed that doesn't block this. |
Got feedback that the test wasn't good enough, so I built a dummy server that can run a fake prompt like this: OPENAI_API_KEY='x' \
OPENAI_API_BASE='https://openai-canned-completion.vercel.app/v1' \
llm 'hello' Always outputs:
|
That Vercel app looks like this: import base64
import json
lines = """
{"type": "http.response.start", "status": 200, "headers": [[{"$base64": "ZGF0ZQ=="}, {"$base64": "U3VuLCAyMyBKdWwgMjAyMyAxOToyMzoxNiBHTVQ="}], [{"$base64": "Y29udGVudC10eXBl"}, {"$base64": "dGV4dC9ldmVudC1zdHJlYW0="}], [{"$base64": "dHJhbnNmZXItZW5jb2Rpbmc="}, {"$base64": "Y2h1bmtlZA=="}], [{"$base64": "Y29ubmVjdGlvbg=="}, {"$base64": "a2VlcC1hbGl2ZQ=="}], [{"$base64": "YWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2lu"}, {"$base64": "Kg=="}], [{"$base64": "Y2FjaGUtY29udHJvbA=="}, {"$base64": "bm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZQ=="}], [{"$base64": "b3BlbmFpLW9yZ2FuaXphdGlvbg=="}, {"$base64": "dXNlci1yM2U2MWZwYWswNGNiYW9rcDVidW9hZTQ="}], [{"$base64": "b3BlbmFpLXByb2Nlc3NpbmctbXM="}, {"$base64": "OQ=="}], [{"$base64": "b3BlbmFpLXZlcnNpb24="}, {"$base64": "MjAyMC0xMC0wMQ=="}], [{"$base64": "c3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eQ=="}, {"$base64": "bWF4LWFnZT0xNTcyNDgwMDsgaW5jbHVkZVN1YkRvbWFpbnM="}], [{"$base64": "eC1yYXRlbGltaXQtbGltaXQtcmVxdWVzdHM="}, {"$base64": "MzUwMA=="}], [{"$base64": "eC1yYXRlbGltaXQtbGltaXQtdG9rZW5z"}, {"$base64": "OTAwMDA="}], [{"$base64": "eC1yYXRlbGltaXQtcmVtYWluaW5nLXJlcXVlc3Rz"}, {"$base64": "MzQ5OQ=="}], [{"$base64": "eC1yYXRlbGltaXQtcmVtYWluaW5nLXRva2Vucw=="}, {"$base64": "ODk5ODA="}], [{"$base64": "eC1yYXRlbGltaXQtcmVzZXQtcmVxdWVzdHM="}, {"$base64": "MTdtcw=="}], [{"$base64": "eC1yYXRlbGltaXQtcmVzZXQtdG9rZW5z"}, {"$base64": "MTJtcw=="}], [{"$base64": "eC1yZXF1ZXN0LWlk"}, {"$base64": "NDhjZmI5MDI3ZDc2ZTYyYzczOTJkNTEyZjViMzAwNTY="}], [{"$base64": "Y2YtY2FjaGUtc3RhdHVz"}, {"$base64": "RFlOQU1JQw=="}], [{"$base64": "c2VydmVy"}, {"$base64": "Y2xvdWRmbGFyZQ=="}], [{"$base64": "Y2YtcmF5"}, {"$base64": "N2ViNjRiZmIxOTBmN2NjZS1MQVg="}], [{"$base64": "YWx0LXN2Yw=="}, {"$base64": "aDM9Ijo0NDMiOyBtYT04NjQwMA=="}]]}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsicm9sZSI6ImFzc2lzdGFudCIsImNvbnRlbnQiOiIifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IkhlbGxvIn0sImZpbmlzaF9yZWFzb24iOm51bGx9XX0KCg=="}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiEifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiBIb3cifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiBjYW4ifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiBJIn0sImZpbmlzaF9yZWFzb24iOm51bGx9XX0KCg=="}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiBhc3Npc3QifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiB5b3UifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6IiB0b2RheSJ9LCJmaW5pc2hfcmVhc29uIjpudWxsfV19Cgo="}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnsiY29udGVudCI6Ij8ifSwiZmluaXNoX3JlYXNvbiI6bnVsbH1dfQoK"}, "more_body": true}
{"type": "http.response.body", "body": {"$base64": "ZGF0YTogeyJpZCI6ImNoYXRjbXBsLTdmWXhneTZRaTJnMlltTjBPb2hDTXFjYkxibFpMIiwib2JqZWN0IjoiY2hhdC5jb21wbGV0aW9uLmNodW5rIiwiY3JlYXRlZCI6MTY5MDE0MDE5NiwibW9kZWwiOiJncHQtMy41LXR1cmJvLTA2MTMiLCJjaG9pY2VzIjpbeyJpbmRleCI6MCwiZGVsdGEiOnt9LCJmaW5pc2hfcmVhc29uIjoic3RvcCJ9XX0KCmRhdGE6IFtET05FXQoK"}, "more_body": true}
{"type": "http.response.body", "more_body": false}
""".strip().split("\n")
def as_base64(dct):
if '$base64' in dct:
return base64.b64decode(dct["$base64"])
return dct
messages = []
for line in lines:
messages.append(json.loads(line, object_hook=as_base64))
async def app(scope, receive, send):
if scope["type"] != "http":
return
for message in messages:
await send(message) |
Here's the code for that Vercel app: https://github.com/simonw/openai-canned-completion |
Getting it into
homebrew-core
would mean that they would build the Bottle files, which would hopefully resolve the issues withbrew install simonw/llm/llm
taking a long time and sometimes breaking.The text was updated successfully, but these errors were encountered: