JSON Mode¶
JSON Mode is a feature in Mirascope that allows you to request structured JSON output from Large Language Models (LLMs). This mode is particularly useful when you need to extract structured information from the model's responses, making it easier to parse and use the data in your applications.
Not all providers have an official JSON Mode
For providers with explicit support, Mirascope uses the native JSON Mode feature of the API. For providers without explicit support (Anthropic and Cohere), Mirascope implements a pseudo JSON Mode by instructing the model in the prompt to output JSON.
Provider | Support Type | Implementation |
---|---|---|
OpenAI | Explicit | Native API feature |
Anthropic | Pseudo | Prompt engineering |
Mistral | Explicit | Native API feature |
Gemini | Explicit | Native API feature |
Groq | Explicit | Native API feature |
Cohere | Pseudo | Prompt engineering |
If you'd prefer not to have any internal updates made to your prompt, you can always set JSON mode yourself through call_params
rather than using the json_mode
argument, which provides provider-agnostic support but is certainly not required to use JSON mode.
Basic Usage and Syntax¶
Let's take a look at a basic example using JSON Mode:
import json
from mirascope.core import openai
@openai.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import anthropic
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import mistral
@mistral.call("mistral-large-latest", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import gemini
@gemini.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import groq
@groq.call("llama-3.1-70b-versatile", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import cohere
@cohere.call("command-r-plus", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import litellm
@litellm.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import azure
@azure.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import bedrock
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, openai
@openai.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, anthropic
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, mistral
@mistral.call("mistral-large-latest", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, gemini
@gemini.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, groq
@groq.call("llama-3.1-70b-versatile", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, cohere
@cohere.call("command-r-plus", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, litellm
@litellm.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, azure
@azure.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import Messages, bedrock
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import openai, prompt_template
@openai.call("gpt-4o-mini", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import anthropic, prompt_template
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import mistral, prompt_template
@mistral.call("mistral-large-latest", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import gemini, prompt_template
@gemini.call("gemini-1.5-flash", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import groq, prompt_template
@groq.call("llama-3.1-70b-versatile", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import cohere, prompt_template
@cohere.call("command-r-plus", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import litellm, prompt_template
@litellm.call("gpt-4o-mini", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import azure, prompt_template
@azure.call("gpt-4o-mini", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import prompt_template, vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import bedrock, prompt_template
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, openai
@openai.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, anthropic
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, mistral
@mistral.call("mistral-large-latest", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, gemini
@gemini.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, groq
@groq.call("llama-3.1-70b-versatile", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, cohere
@cohere.call("command-r-plus", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, litellm
@litellm.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, azure
@azure.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
import json
from mirascope.core import BaseMessageParam, bedrock
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
# Output: {'author': 'Patrick Rothfuss', 'genre': 'Fantasy'}
In this example we
- Enable JSON Mode with
json_mode=True
in thecall
decorator - Instruct the model what fields to include in our prompt
- Load the JSON string response into a Python object and print it
Error Handling and Validation¶
While JSON Mode can signifanctly improve the structure of model outputs, it's important to note that it's far from infallible. LLMs often produce invalid JSON or deviate from the expected structure, so it's crucial to implement proper error handling and validation in your code:
import json
from mirascope.core import openai
@openai.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import anthropic
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import mistral
@mistral.call("mistral-large-latest", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import gemini
@gemini.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import groq
@groq.call("llama-3.1-70b-versatile", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import cohere
@cohere.call("command-r-plus", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import litellm
@litellm.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import azure
@azure.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import bedrock
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
def get_book_info(book_title: str) -> str:
return f"Provide the author and genre of {book_title}"
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, openai
@openai.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, anthropic
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, mistral
@mistral.call("mistral-large-latest", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, gemini
@gemini.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, groq
@groq.call("llama-3.1-70b-versatile", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, cohere
@cohere.call("command-r-plus", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, litellm
@litellm.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, azure
@azure.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import Messages, bedrock
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
def get_book_info(book_title: str) -> Messages.Type:
return Messages.User(f"Provide the author and genre of {book_title}")
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import openai, prompt_template
@openai.call("gpt-4o-mini", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import anthropic, prompt_template
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import mistral, prompt_template
@mistral.call("mistral-large-latest", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import gemini, prompt_template
@gemini.call("gemini-1.5-flash", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import groq, prompt_template
@groq.call("llama-3.1-70b-versatile", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import cohere, prompt_template
@cohere.call("command-r-plus", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import litellm, prompt_template
@litellm.call("gpt-4o-mini", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import azure, prompt_template
@azure.call("gpt-4o-mini", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import prompt_template, vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import bedrock, prompt_template
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
@prompt_template("Provide the author and genre of {book_title}")
def get_book_info(book_title: str): ...
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, openai
@openai.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, anthropic
@anthropic.call("claude-3-5-sonnet-20240620", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, mistral
@mistral.call("mistral-large-latest", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, gemini
@gemini.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, groq
@groq.call("llama-3.1-70b-versatile", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, cohere
@cohere.call("command-r-plus", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, litellm
@litellm.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, azure
@azure.call("gpt-4o-mini", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, vertex
@vertex.call("gemini-1.5-flash", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
import json
from mirascope.core import BaseMessageParam, bedrock
@bedrock.call("anthropic.claude-3-haiku-20240307-v1:0", json_mode=True)
def get_book_info(book_title: str) -> list[BaseMessageParam]:
return [
BaseMessageParam(
role="user", content=f"Provide the author and genre of {book_title}"
)
]
try:
response = get_book_info("The Name of the Wind")
print(json.loads(response.content))
except json.JSONDecodeError:
print("The model produced invalid JSON")
Beyond JSON Validation
While this example catches errors for invalid JSON, there's always a chance that the LLM returns valid JSON that doesn't conform to your expected schema (such as missing fields or incorrect types).
For more robust validation, we recommend using Response Models for easier structuring and validation of LLM outputs.
Next Steps¶
By leveraging JSON Mode, you can create more robust and data-driven applications that efficiently process and utilize LLM outputs. This approach allows for easy integration with databases, APIs, or user interfaces, demonstrating the power of JSON Mode in creating robust, data-driven applications.
Next, we recommend reading the section on Output Parsers to see how to engineer prompts with specific output structures and parse the outputs automatically on every call.