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 quotes: line 1 column 2 (char 1), token_info: {'input_tokens': 141, 'output_tokens': 121, 'total_tokens': 262} 問題が分かりました!token_info は文字列として渡されていますが、内容は辞書の文字列表現です。これは str(dict) の形式になっているため、JSONパースが失敗しています。ast.literal_eval を使用して修正しましょう:
まてまて突然 python の世界で eval するんじゃない。怖いぞ。と止めた。
ast.literal_eval
実際は、
ast.literal_eval("{'hello': 1 + 10}")
などとすると、
ValueError: malformed node or string on line 1: BinOp(left=Constant(value=1, kind=None), op=Add(), right=Constant(value=10, kind=None))
とエラーになる。
ast — Abstract syntax trees — Python 3.14.0 documentation
これは、Pythonの値を含む文字列を評価するために使用できます。値を自分で解析する必要はありません。ただし、演算子やインデックスを含むような、任意の複雑な式を評価することはできません。 この関数は以前、「安全」であると説明されていましたが、その意味が明確に定義されていませんでした。これは誤解を招くものでした。これは、より一般的な eval() とは異なり、Pythonコードを実行しないように特別に設計されています。名前空間、名前検索、呼び出し機能はありません。しかし、攻撃から完全に逃れられるわけではありません。比較的小さな入力でも、メモリ枯渇やCスタック枯渇を引き起こし、プロセスがクラッシュする可能性があります。また、入力によってはCPU消費が過剰になり、サービス拒否攻撃が発生する可能性もあります。したがって、信頼できないデータに対してこの関数を呼び出すことは推奨されません。
一応目的に対しては大丈夫そうだった。知らなかったっスよ literal_eval ...。