0xf

日記だよ

python

ワークフロー処理の基本のつくりを再発明していた

ワークフローシステムの構成を考えてまして。 完了ノードが必要な上流ノードの処理をリクエストする構成が美しいんだけど、その形式だとワークフロー設計者の手続き的なイメージと乖離が生まれないか、と思うなどしていた。たとえば「10分待つ」というノード…

richでリッチなCUIを書く

codexでTextualize/richを使った少しややこしい画面を作らせてみたがおおむね期待通りに動いていてすごいなと思う。 markdownのレンダリングもビルトインされているのでコードシンタックスなども色分けされる。マウス対応のターミナルであれば画面内のテキス…

pythonの代入式

そーいや代入の式ができていたのを忘れていた。PEP-572で定義されている。 >>> while a:= input(): ... print("input:", a) ... hello input: hello foo input: foo bar input: bar こういう書き方ができるようになっている。:=は結合順が弱々しいので、a :=…

WSL2でローカルGPUを使った書き起こしをしてAIと対話する/書き起こしレスポンスがある程度早くなると音声入力も意外とイケた話

みなさんこんにちは。株式会社はてなで働いている id:ma2saka です。普段はクラウドサービスの利用状況の詳細データにSQLを書いたり、壊れたスプレッドシートを直したり、更新されたエンドユーザーライセンスのdiffを目grepする仕事をしています。 この記事…

コンテナにWhisperのモデルを焼き込む

諸事情によりコンテナでWhisperを実行したくなったと思いねえ。しかし初回ダウンロードにはとても時間がかかる。毎回ロードするのがわかっているならモデルファイルは焼いておきたい。 FROM python:3.13-trixie ENV DEBIAN_FRONTEND=noninteractive \ WHISPE…

strands-agents の slack 連携 - ブロック構文サポート

標準の slack_send_message ツールはブロックを受け付けてないので全てテキストモードで投稿される。 tools/src/strands_tools/slack.py at main · strands-agents/tools · GitHub まあでも小さいコードなので、以下のようなパッチをいれてしまえば自然な動…

strands-agents で簡単なチャット

GitHub - strands-agents/sdk-python: A model-driven approach to building AI agents in just a few lines of code. import readline # noqa: F401 from strands import Agent, tool from strands.models import BedrockModel @tool def word_count(text):…

with で関数をスコープの最後に呼ぶデコレータが作れる

デコレータで関数を返す以外のことができる、ということで試してみた。できる。使い道は...なんかある? import sys def closable(func): class _: def __enter__(self): print("enter") return self # exc_type は例外型、exc_value は例外に渡されたオブジ…

langchain_google_vertexai を使ってgrpcの警告が出るのを抑止できなくて python 3.12 / grpc 1.67.1 に落とした

google-crc32cの警告が鬱陶しいので抑制する - 0xf に関連して 以下のようにエラーが出てくるのが抑制のしようがなくて、 WARNING: All log messages before absl::InitializeLog() is called are written to STDERR E0000 00:00:1760337382.027649 10064653…

LangGraphの graph#steamの戻り値は dict[str,Any]より詳細にはできない

無念である。 def stream( self, input: InputT | Command | None, config: RunnableConfig | None = None, *, context: ContextT | None = None, stream_mode: StreamMode | Sequence[StreamMode] | None = None, print_mode: StreamMode | Sequence[Stream…

リスト内包表記で改行入れるとスマートじゃん(続き)

前回: リスト内包表記で改行入れるとスマートじゃん - 0xf ちょっとローカルで立てた gpt-oss とお話しするCUIを書いていた。で、LangGraph 経由で Ollama から戻ってくるメッセージを処理するところでどうしてもループが重なってインデントが深くなってしま…

AIがしれっとevalを埋め込もうとしてくるので慌てて見ていた(適切な利用だった)

OllamaのAPIからメタデータを取得しようとしたらうまくいかない、という場面。 DEBUG] token_info type: , value: {'input_tokens': 141, 'output_tokens': 121, 'total_tokens': 262} [DEBUG] Parse error: Expecting property name enclosed in double quo…

google-crc32cの警告が鬱陶しいので抑制する

書き方すぐわかんなくなるのでメモ。 # google-crc32c のC拡張がない環境では大量の警告が出るため抑制する warnings.filterwarnings( "ignore", category=RuntimeWarning, module="google_crc32c", ) from langchain_google_vertexai.model_garden import C…

リスト内包表記で改行入れるとスマートじゃん

こういう話。 fruit = ["apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew"] fruit_dict = { name: len(name) for name in fruit if name.endswith("e") } print(fruit_dict) #=> {'apple': 5, 'date': 4, 'grape': 5} 辞書を…

ParamSpecで任意のパラメータをジェネリクス指定できる(python 3.10〜)

LangChain本読んでて、@chain の作りがスマートだなー! と思った。 langchain/libs/core/langchain_core/runnables at master · langchain-ai/langchain · GitHub 実装はゴツい! ともあれ、デコレータで関数を返す以外の発想がなかった。こんな感じですよ。 …

pythonの async/await スタイル

3.5から導入されてたやつ。見慣れた感じだ。はい。 import asyncio async def greet(message: str): await asyncio.sleep(1) print(message) async def main(): await greet("Hello, world!") if __name__ == "__main__": asyncio.run(main())

pythonの型によるパターンマッチ

普通に match でいけるようになってた。便利。 import fire from typing import Union, Tuple def try_parse(value) -> Union[float, str]: try: return float(value) except (ValueError, TypeError): return str(value) def parse_input(a, b) -> Tuple[Un…

.cursor/rules .cursor/rules 以下は開発しようとする対象のタイプによってテンプレートを取り込み分けるみたいなイメージなんだなたぶん。 たとえば python でアプリケーションを作る際に、app/*.py についてはこう、scripts/*.py についてこう、みたいなル…

簡単なMCPサーバを作ってCursorから利用する

python の sdkがあるので眺めていこう。 GitHub - modelcontextprotocol/python-sdk: The official Python SDK for Model Context Protocol servers and clients まずは手元で動作を確かめる。python -m pip install mcp "mcp[cli]"して mcp モジュールをイ…

pylanceで strictモードを有効にしているとき、boto3-stubs を使っていても boto3.client が「部分的に不明です」と言われる

こうなるやつ 原因 boto3-stubsはそのままインストールしただけでは、個別のサービスについてのスタブがインストールされない。 python -m pip install "boto3-stubs[s3]" みたいにサービスごとにインストールしないといけない。 boto3.client() は渡された…

Parquetファイルのスキーマを参照する(謎の key_value フィールド編)

ちょっと Parquet ファイルのスキーマを確認したいことがあった。 こんな感じのスクリプトを書いた。 import argparse import pyarrow.parquet as pq from pyarrow.parquet import ParquetFile def main(input_file: str) -> None: try: parquet_file: Parqu…

load_table_from_json の第一引数が json でも jsonl でもない件について

google.cloud.bigquery.client.Clientのload_table_from_json について。 googleapis.dev BQにデータ突っ込むスクリプトで、一時ファイル作りたくなくて、load_table_from_json を使おうとして少しハマっていた。 第一引数は json_rows と仮引数名設定されて…