From 65522c4d4b58fbbe7062e4a6075ccf8abd9ecc96 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 18 May 2026 12:24:10 -0500 Subject: [PATCH] fix: guard LLM response access in 39 cookbook examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit response.choices[0].message.content is Optional[str] — returns None when the provider applies content filtering or the response consists entirely of tool calls (finish_reason="tool_calls"). Accessing .content without a guard raises AttributeError or propagates None silently. Adds a uniform check before every unguarded .content access across all cookbook utility files: if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: raise ValueError("LLM returned empty or filtered response") Anthropic calls guarded analogously: len(response.content) == 0 or response.content[0].text is None. --- cookbook/pocketflow-a2a/utils.py | 2 ++ cookbook/pocketflow-agent-skills/utils.py | 3 +++ cookbook/pocketflow-agent/utils.py | 2 ++ cookbook/pocketflow-agentic-rag/utils.py | 4 ++++ cookbook/pocketflow-chat-guardrail/utils.py | 6 ++++++ cookbook/pocketflow-chat-memory/utils/call_llm.py | 6 ++++++ cookbook/pocketflow-chat/utils.py | 6 ++++++ cookbook/pocketflow-cli-hitl/utils/call_llm.py | 3 +++ cookbook/pocketflow-code-generator/utils/call_llm.py | 3 +++ cookbook/pocketflow-coding-agent/utils/call_llm.py | 4 ++++ cookbook/pocketflow-debate/utils.py | 4 ++++ cookbook/pocketflow-deep-research/utils.py | 4 ++++ cookbook/pocketflow-fastapi-background/utils/call_llm.py | 2 ++ cookbook/pocketflow-gradio-hitl/utils/call_llm.py | 3 +++ cookbook/pocketflow-heartbeat/utils.py | 4 ++++ cookbook/pocketflow-hello-world/utils/call_llm.py | 2 ++ cookbook/pocketflow-invoice/utils.py | 8 ++++++++ cookbook/pocketflow-judge/utils.py | 4 ++++ cookbook/pocketflow-lead-generation/utils.py | 4 ++++ cookbook/pocketflow-majority-vote/utils.py | 3 +++ cookbook/pocketflow-map-reduce/utils.py | 2 ++ cookbook/pocketflow-mcp/utils.py | 6 ++++++ cookbook/pocketflow-multi-agent/utils.py | 2 ++ cookbook/pocketflow-newsletter/utils.py | 4 ++++ cookbook/pocketflow-node/utils/call_llm.py | 2 ++ cookbook/pocketflow-notebook-lm/utils.py | 4 ++++ cookbook/pocketflow-rag/utils.py | 2 ++ cookbook/pocketflow-self-healing-mermaid/utils.py | 4 ++++ cookbook/pocketflow-structured-output/utils.py | 2 ++ cookbook/pocketflow-supervisor/utils.py | 2 ++ cookbook/pocketflow-tao/utils.py | 2 ++ cookbook/pocketflow-text2sql/utils/call_llm.py | 2 ++ cookbook/pocketflow-thinking/utils.py | 3 +++ cookbook/pocketflow-tool-crawler/utils/call_llm.py | 4 ++++ cookbook/pocketflow-tool-embeddings/utils/call_llm.py | 2 ++ cookbook/pocketflow-tool-pdf-vision/tools/vision.py | 6 ++++++ cookbook/pocketflow-tool-search/utils/call_llm.py | 4 ++++ cookbook/pocketflow-voice-chat/utils/call_llm.py | 6 ++++++ cookbook/pocketflow-workflow/utils/call_llm.py | 2 ++ 39 files changed, 138 insertions(+) diff --git a/cookbook/pocketflow-a2a/utils.py b/cookbook/pocketflow-a2a/utils.py index c56a1752..208a461c 100644 --- a/cookbook/pocketflow-a2a/utils.py +++ b/cookbook/pocketflow-a2a/utils.py @@ -8,6 +8,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content def search_web(query): diff --git a/cookbook/pocketflow-agent-skills/utils.py b/cookbook/pocketflow-agent-skills/utils.py index 037a3a8f..00e0987a 100644 --- a/cookbook/pocketflow-agent-skills/utils.py +++ b/cookbook/pocketflow-agent-skills/utils.py @@ -19,4 +19,7 @@ def call_llm(prompt: str) -> str: model="gpt-4o", messages=[{"role": "user", "content": prompt}], ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") return response.choices[0].message.content diff --git a/cookbook/pocketflow-agent/utils.py b/cookbook/pocketflow-agent/utils.py index f8f52bd0..bf10ff8a 100644 --- a/cookbook/pocketflow-agent/utils.py +++ b/cookbook/pocketflow-agent/utils.py @@ -9,6 +9,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content def search_web_duckduckgo(query): diff --git a/cookbook/pocketflow-agentic-rag/utils.py b/cookbook/pocketflow-agentic-rag/utils.py index 88f5ed78..4393c60e 100644 --- a/cookbook/pocketflow-agentic-rag/utils.py +++ b/cookbook/pocketflow-agentic-rag/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-chat-guardrail/utils.py b/cookbook/pocketflow-chat-guardrail/utils.py index 7009d662..00850abe 100644 --- a/cookbook/pocketflow-chat-guardrail/utils.py +++ b/cookbook/pocketflow-chat-guardrail/utils.py @@ -10,6 +10,12 @@ def call_llm(messages): temperature=0.7 ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + + raise ValueError("LLM returned empty or filtered response") + + return response.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-chat-memory/utils/call_llm.py b/cookbook/pocketflow-chat-memory/utils/call_llm.py index dc71d262..497e3ff1 100644 --- a/cookbook/pocketflow-chat-memory/utils/call_llm.py +++ b/cookbook/pocketflow-chat-memory/utils/call_llm.py @@ -10,6 +10,12 @@ def call_llm(messages): temperature=0.7 ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + + raise ValueError("LLM returned empty or filtered response") + + return response.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-chat/utils.py b/cookbook/pocketflow-chat/utils.py index ffced048..618b19fc 100644 --- a/cookbook/pocketflow-chat/utils.py +++ b/cookbook/pocketflow-chat/utils.py @@ -10,6 +10,12 @@ def call_llm(messages): temperature=0.7 ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + + raise ValueError("LLM returned empty or filtered response") + + return response.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-cli-hitl/utils/call_llm.py b/cookbook/pocketflow-cli-hitl/utils/call_llm.py index 5e3477ce..08171cff 100644 --- a/cookbook/pocketflow-cli-hitl/utils/call_llm.py +++ b/cookbook/pocketflow-cli-hitl/utils/call_llm.py @@ -10,6 +10,9 @@ def call_llm(prompt: str) -> str: {"role": "user", "content": prompt} ] ) + if not response.content or response.content[0].text is None: + + raise ValueError("LLM returned empty or filtered response") return response.content[0].text if __name__ == "__main__": diff --git a/cookbook/pocketflow-code-generator/utils/call_llm.py b/cookbook/pocketflow-code-generator/utils/call_llm.py index df57be20..f3898d86 100644 --- a/cookbook/pocketflow-code-generator/utils/call_llm.py +++ b/cookbook/pocketflow-code-generator/utils/call_llm.py @@ -10,6 +10,9 @@ def call_llm(prompt): {"role": "user", "content": prompt} ] ) + if not response.content or response.content[0].text is None: + + raise ValueError("LLM returned empty or filtered response") return response.content[0].text if __name__ == "__main__": diff --git a/cookbook/pocketflow-coding-agent/utils/call_llm.py b/cookbook/pocketflow-coding-agent/utils/call_llm.py index 4cefeb84..4bc96168 100644 --- a/cookbook/pocketflow-coding-agent/utils/call_llm.py +++ b/cookbook/pocketflow-coding-agent/utils/call_llm.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-debate/utils.py b/cookbook/pocketflow-debate/utils.py index 2454bbcc..300e878a 100644 --- a/cookbook/pocketflow-debate/utils.py +++ b/cookbook/pocketflow-debate/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-deep-research/utils.py b/cookbook/pocketflow-deep-research/utils.py index ff43e5a7..8a5350a2 100644 --- a/cookbook/pocketflow-deep-research/utils.py +++ b/cookbook/pocketflow-deep-research/utils.py @@ -10,6 +10,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-fastapi-background/utils/call_llm.py b/cookbook/pocketflow-fastapi-background/utils/call_llm.py index 37bf59f5..ae7c9070 100644 --- a/cookbook/pocketflow-fastapi-background/utils/call_llm.py +++ b/cookbook/pocketflow-fastapi-background/utils/call_llm.py @@ -7,6 +7,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-gradio-hitl/utils/call_llm.py b/cookbook/pocketflow-gradio-hitl/utils/call_llm.py index 56996b95..8972ac18 100644 --- a/cookbook/pocketflow-gradio-hitl/utils/call_llm.py +++ b/cookbook/pocketflow-gradio-hitl/utils/call_llm.py @@ -14,6 +14,9 @@ def call_llm(message: str): response: ChatCompletion = client.chat.completions.create( model=model, messages=[{"role": "user", "content": message}] ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") return response.choices[0].message.content diff --git a/cookbook/pocketflow-heartbeat/utils.py b/cookbook/pocketflow-heartbeat/utils.py index 65385754..0fb0a4fb 100644 --- a/cookbook/pocketflow-heartbeat/utils.py +++ b/cookbook/pocketflow-heartbeat/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-hello-world/utils/call_llm.py b/cookbook/pocketflow-hello-world/utils/call_llm.py index e6f7b588..7f4087b3 100644 --- a/cookbook/pocketflow-hello-world/utils/call_llm.py +++ b/cookbook/pocketflow-hello-world/utils/call_llm.py @@ -6,6 +6,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-invoice/utils.py b/cookbook/pocketflow-invoice/utils.py index a24484a1..3fb08a5d 100644 --- a/cookbook/pocketflow-invoice/utils.py +++ b/cookbook/pocketflow-invoice/utils.py @@ -10,6 +10,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai @@ -31,6 +35,10 @@ def call_llm_with_image(prompt, image_base64): {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_base64}"}} ]}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-judge/utils.py b/cookbook/pocketflow-judge/utils.py index 2454bbcc..300e878a 100644 --- a/cookbook/pocketflow-judge/utils.py +++ b/cookbook/pocketflow-judge/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-lead-generation/utils.py b/cookbook/pocketflow-lead-generation/utils.py index 0763f7e4..267b9598 100644 --- a/cookbook/pocketflow-lead-generation/utils.py +++ b/cookbook/pocketflow-lead-generation/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-majority-vote/utils.py b/cookbook/pocketflow-majority-vote/utils.py index afa1817f..6de50318 100644 --- a/cookbook/pocketflow-majority-vote/utils.py +++ b/cookbook/pocketflow-majority-vote/utils.py @@ -10,6 +10,9 @@ def call_llm(prompt): {"role": "user", "content": prompt} ] ) + if not response.content or response.content[0].text is None: + + raise ValueError("LLM returned empty or filtered response") return response.content[0].text if __name__ == "__main__": diff --git a/cookbook/pocketflow-map-reduce/utils.py b/cookbook/pocketflow-map-reduce/utils.py index 3427cbb6..bba0bc6b 100644 --- a/cookbook/pocketflow-map-reduce/utils.py +++ b/cookbook/pocketflow-map-reduce/utils.py @@ -7,6 +7,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content # Example usage diff --git a/cookbook/pocketflow-mcp/utils.py b/cookbook/pocketflow-mcp/utils.py index 3ee9f97f..40d56af9 100644 --- a/cookbook/pocketflow-mcp/utils.py +++ b/cookbook/pocketflow-mcp/utils.py @@ -13,6 +13,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content def get_tools(server_script_path=None): @@ -126,6 +128,10 @@ async def _call_tool(): async with ClientSession(read, write) as session: await session.initialize() result = await session.call_tool(tool_name, arguments) + if not result.content or result.content[0].text is None: + + raise ValueError("LLM returned empty or filtered response") + return result.content[0].text return asyncio.run(_call_tool()) diff --git a/cookbook/pocketflow-multi-agent/utils.py b/cookbook/pocketflow-multi-agent/utils.py index 5104b84d..09c25373 100644 --- a/cookbook/pocketflow-multi-agent/utils.py +++ b/cookbook/pocketflow-multi-agent/utils.py @@ -7,6 +7,8 @@ def call_llm(prompt): model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content # Example usage diff --git a/cookbook/pocketflow-newsletter/utils.py b/cookbook/pocketflow-newsletter/utils.py index ce3c0d55..13eea4aa 100644 --- a/cookbook/pocketflow-newsletter/utils.py +++ b/cookbook/pocketflow-newsletter/utils.py @@ -10,6 +10,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-node/utils/call_llm.py b/cookbook/pocketflow-node/utils/call_llm.py index e6f7b588..7f4087b3 100644 --- a/cookbook/pocketflow-node/utils/call_llm.py +++ b/cookbook/pocketflow-node/utils/call_llm.py @@ -6,6 +6,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-notebook-lm/utils.py b/cookbook/pocketflow-notebook-lm/utils.py index 4638ad9f..e34985c9 100644 --- a/cookbook/pocketflow-notebook-lm/utils.py +++ b/cookbook/pocketflow-notebook-lm/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-rag/utils.py b/cookbook/pocketflow-rag/utils.py index 0aae230b..41d557d4 100644 --- a/cookbook/pocketflow-rag/utils.py +++ b/cookbook/pocketflow-rag/utils.py @@ -8,6 +8,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content def get_embedding(text): diff --git a/cookbook/pocketflow-self-healing-mermaid/utils.py b/cookbook/pocketflow-self-healing-mermaid/utils.py index 2454bbcc..300e878a 100644 --- a/cookbook/pocketflow-self-healing-mermaid/utils.py +++ b/cookbook/pocketflow-self-healing-mermaid/utils.py @@ -9,6 +9,10 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return r.choices[0].message.content elif os.environ.get("GEMINI_API_KEY"): from google import genai diff --git a/cookbook/pocketflow-structured-output/utils.py b/cookbook/pocketflow-structured-output/utils.py index 3427cbb6..bba0bc6b 100644 --- a/cookbook/pocketflow-structured-output/utils.py +++ b/cookbook/pocketflow-structured-output/utils.py @@ -7,6 +7,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content # Example usage diff --git a/cookbook/pocketflow-supervisor/utils.py b/cookbook/pocketflow-supervisor/utils.py index c56a1752..208a461c 100644 --- a/cookbook/pocketflow-supervisor/utils.py +++ b/cookbook/pocketflow-supervisor/utils.py @@ -8,6 +8,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content def search_web(query): diff --git a/cookbook/pocketflow-tao/utils.py b/cookbook/pocketflow-tao/utils.py index 1402664a..d5760b4b 100644 --- a/cookbook/pocketflow-tao/utils.py +++ b/cookbook/pocketflow-tao/utils.py @@ -9,6 +9,8 @@ def call_llm(prompt): model=os.environ.get("OPENAI_MODEL", "openai/gpt-4.1-nano"), messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-text2sql/utils/call_llm.py b/cookbook/pocketflow-text2sql/utils/call_llm.py index 3427cbb6..bba0bc6b 100644 --- a/cookbook/pocketflow-text2sql/utils/call_llm.py +++ b/cookbook/pocketflow-text2sql/utils/call_llm.py @@ -7,6 +7,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content # Example usage diff --git a/cookbook/pocketflow-thinking/utils.py b/cookbook/pocketflow-thinking/utils.py index 468798c8..404d5fe1 100644 --- a/cookbook/pocketflow-thinking/utils.py +++ b/cookbook/pocketflow-thinking/utils.py @@ -10,6 +10,9 @@ def call_llm(prompt): {"role": "user", "content": prompt} ] ) + if not response.content or response.content[0].text is None: + + raise ValueError("LLM returned empty or filtered response") return response.content[0].text if __name__ == "__main__": diff --git a/cookbook/pocketflow-tool-crawler/utils/call_llm.py b/cookbook/pocketflow-tool-crawler/utils/call_llm.py index 8c72c82e..526d9787 100644 --- a/cookbook/pocketflow-tool-crawler/utils/call_llm.py +++ b/cookbook/pocketflow-tool-crawler/utils/call_llm.py @@ -18,6 +18,10 @@ def call_llm(prompt: str) -> str: model="gpt-4", messages=[{"role": "user", "content": prompt}] ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return response.choices[0].message.content except Exception as e: diff --git a/cookbook/pocketflow-tool-embeddings/utils/call_llm.py b/cookbook/pocketflow-tool-embeddings/utils/call_llm.py index fe5d04c1..03b5a929 100644 --- a/cookbook/pocketflow-tool-embeddings/utils/call_llm.py +++ b/cookbook/pocketflow-tool-embeddings/utils/call_llm.py @@ -9,6 +9,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-tool-pdf-vision/tools/vision.py b/cookbook/pocketflow-tool-pdf-vision/tools/vision.py index c5042bba..68ba9dee 100644 --- a/cookbook/pocketflow-tool-pdf-vision/tools/vision.py +++ b/cookbook/pocketflow-tool-pdf-vision/tools/vision.py @@ -31,6 +31,12 @@ def extract_text_from_image(image: Image.Image, prompt: str = None) -> str: }] ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + + raise ValueError("LLM returned empty or filtered response") + + return response.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-tool-search/utils/call_llm.py b/cookbook/pocketflow-tool-search/utils/call_llm.py index ddacef6c..9af0c07d 100644 --- a/cookbook/pocketflow-tool-search/utils/call_llm.py +++ b/cookbook/pocketflow-tool-search/utils/call_llm.py @@ -22,6 +22,10 @@ def call_llm(prompt: str) -> str: model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + raise ValueError("LLM returned empty or filtered response") + return response.choices[0].message.content except Exception as e: diff --git a/cookbook/pocketflow-voice-chat/utils/call_llm.py b/cookbook/pocketflow-voice-chat/utils/call_llm.py index 1b70b63b..c1e6c708 100644 --- a/cookbook/pocketflow-voice-chat/utils/call_llm.py +++ b/cookbook/pocketflow-voice-chat/utils/call_llm.py @@ -10,6 +10,12 @@ def call_llm(messages): temperature=0.7 ) + if not response.choices or response.choices[0].message is None or response.choices[0].message.content is None: + + + raise ValueError("LLM returned empty or filtered response") + + return response.choices[0].message.content if __name__ == "__main__": diff --git a/cookbook/pocketflow-workflow/utils/call_llm.py b/cookbook/pocketflow-workflow/utils/call_llm.py index 3427cbb6..bba0bc6b 100644 --- a/cookbook/pocketflow-workflow/utils/call_llm.py +++ b/cookbook/pocketflow-workflow/utils/call_llm.py @@ -7,6 +7,8 @@ def call_llm(prompt): model="gpt-4o", messages=[{"role": "user", "content": prompt}] ) + if not r.choices or r.choices[0].message is None or r.choices[0].message.content is None: + raise ValueError("LLM returned empty or filtered response") return r.choices[0].message.content # Example usage