Releases: jackmpcollins/magentic
v0.19.0
What's Changed
- Publish docs on release or manually by @jackmpcollins in #162
- Bump pytest-cov from 4.1.0 to 5.0.0 by @dependabot in #165
- Add Structured Output docs by @jackmpcollins in #167
- Remove unneeded wrapper functions for openai and litellm completion by @jackmpcollins in #171
- Add AnthropicChatModel by @jackmpcollins in #174
Full Changelog: v0.18.1...v0.19.0
🎉 Native support for Anthropic using AnthropicChatModel
🎉
from magentic import prompt
from magentic.chat_model.anthropic_chat_model import AnthropicChatModel
@prompt(
"Name three fruits. Be sure to return this in correct JSON format matching the schema.",
model=AnthropicChatModel("claude-3-opus-20240229")
)
def say_fruit() -> list[str]: ...
say_fruit()
v0.19.0a0
v0.18.1
What's Changed
- Fix: LiteLLM Anthropic async tool calls by @jackmpcollins in #155
- Make dependabot ignore patch version updates by @jackmpcollins in #157
- Add github workflow options to run existing live tests by @jackmpcollins in #159
- Load .env file for tests. Fix flaky return_dict test. by @jackmpcollins in #160
- Remove tool_call.type check to fix LiteLLM Mistral tool calling by @jackmpcollins in #161
Full Changelog: v0.18.0...v0.18.1
v0.18.0
What's Changed
- Add docs and classes for formatting objects in prompts by @jackmpcollins in #126
- Upgrade ruff. Format ... on same line by @jackmpcollins in #134
- poetry update by @jackmpcollins in #133
- Switch from deprecated functions param to tools by @jackmpcollins in #144
- Docs: Fix bytes vision example by @mnicstruwig in #146
New Contributors
- @mnicstruwig made their first contribution in #146
Full Changelog: v0.17.0...v0.18.0
Now fully migrated to tool calls 🎉 Which enables using the new Claude-3 models via litellm, as well as parallel function calls. See more at https://magentic.dev/function-calling/
@prompt(
"Sum {a} and {b}. Also subtract {a} from {b}.",
functions=[plus, minus],
)
def plus_and_minus(a: int, b: int) -> ParallelFunctionCall[int]: ...
output = plus_and_minus(2, 3)
print(list(output))
# > [FunctionCall(<function plus at 0x106b8f010>, 2, 3), FunctionCall(<function minus at 0x106b8ef80>, 3, 2)]
output()
# (5, 1)
Warning
Breaking Change: FunctionResultMessage
now accepts FunctionCall
as argument instead of a function
FunctionResultMessage
now (again) takes a FunctionCall
instance as its second argument. Further, when constructing a chat message history, the same FunctionCall
instance must be passed to an AssistantMessage
and the corresponding FunctionResultMessage
. This so that the result can be correctly linked back to the function call that created it.
def plus(a: int, b: int) -> int:
return a + b
plus_1_2 = FunctionCall(plus, 1, 2)
@chatprompt(
UserMessage("Use the plus function to add 1 and 2."),
AssistantMessage(plus_1_2),
FunctionResultMessage(3, plus_1_2),
)
def do_math() -> str: ...
Example of using the new formatting classes to format a prompt. See more at https://magentic.dev/formatting/
from magentic import prompt
from magentic.formatting import NumberedList
@prompt("Continue the list:\n{items}")
def get_next_items(items: NumberedList[str]) -> list[str]: ...
items = NumberedList(["apple", "banana", "cherry"])
print(get_next_items.format(items=items))
# Continue the list:
# 1. apple
# 2. banana
# 3. cherry
v0.18.0a0
v0.17.0
What's Changed
- Add support for GPT4 vision by @jackmpcollins in #116
Full Changelog: v0.16.0...v0.17.0
Add support for GPT4 Vision with new UserImageMessage
message type. See https://magentic.dev/vision/
from magentic import chatprompt, OpenaiChatModel, Placeholder, UserMessage
from magentic.vision import UserImageMessage
IMAGE_URL_WOODEN_BOARDWALK = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
@chatprompt(
UserMessage("Describe the following image in one sentence."),
UserImageMessage(Placeholder(str, "image_url")),
model=OpenaiChatModel("gpt-4-vision-preview", max_tokens=2000),
)
def describe_image(image_url: str) -> str:
...
describe_image(IMAGE_URL_WOODEN_BOARDWALK)
# 'A wooden boardwalk meanders through lush green wetlands under a partly cloudy blue sky.'
v0.16.0
What's Changed
- Enable registration of new FunctionSchemas by @jackmpcollins in #119
- Update pre-commit hooks by @jackmpcollins in #120
- Add docs site by @jackmpcollins in #124
- Add Placeholder class for templating by @jackmpcollins in #118
- poetry update by @jackmpcollins in #125
Full Changelog: v0.15.0...v0.16.0
New docs site 🎉 https://magentic.dev
Custom types can now be registered to be used as return type annotations with @prompt
-decorated functions. For example, after registering a pandas DataFrame
the following example works. See the docs page for how to do this: https://magentic.dev/examples/registering_custom_type/
import pandas as pd
from magentic import prompt
@prompt(
"Create a table listing the ingredients needed to cook {dish}."
"Include a column for the quantity of each ingredient."
"Also include a column with alergy information."
)
def list_ingredients(dish: str) -> pd.DataFrame:
...
list_ingredients("lasagna")
# <DataFrame of ingredients>
The Placeholder
class has been added to enable better templating of AssistantMessage
and custom Message
subclasses. More info in docs https://magentic.dev/chat-prompting/#placeholder . Sample usage:
from magentic import chatprompt, AssistantMessage, Placeholder, UserMessage
from pydantic import BaseModel
class Quote(BaseModel):
quote: str
character: str
@chatprompt(
UserMessage("Tell me a quote from {movie}"),
AssistantMessage(Placeholder(Quote, "quote")),
UserMessage("What is a similar quote from the same movie?"),
)
def get_similar_quote(movie: str, quote: Quote) -> Quote:
...
get_similar_quote(
movie="Star Wars",
quote=Quote(quote="I am your father", character="Darth Vader"),
)
# Quote(quote='The Force will be with you, always.', character='Obi-Wan Kenobi')
v0.15.0
What's Changed
- Use Ellipses in functions with docstrings by @jackmpcollins in #109
- Use function instead of FunctionCall in FunctionResultMessage by @jackmpcollins in #110
- Add format method to Message. Allow registering new types with message_to_openai_message by @jackmpcollins in #114
- poetry update by @jackmpcollins in #115
- Add last_message property to Chat by @jackmpcollins in #117
Full Changelog: v0.14.1...v0.15.0
Message
subclasses now have a format
method to customize their value using the function arguments when used with the @chatprompt
decorator. This allows for more complex templating than just the string templating that is currently supported. For a real use case with GPT-4-vision see in-progress PR #116
from typing import Any
from magentic import chatprompt
from magentic.chat_model.message import Message
class UppercaseMessage(Message[str]):
def format(self, **kwargs: Any) -> "UppercaseMessage":
upper_kwargs = {k: str(v).upper() for k, v in kwargs.items()}
return UppercaseMessage(self.content.format(**upper_kwargs))
@chatprompt(
UppercaseMessage("hello {x}"),
)
def say_hello(x: str) -> str:
...
say_hello.format("world")
# [UppercaseMessage('hello WORLD')]
In addition, the openai JSON serialization for custom Message
subclasses can be added without modifying magentic
itself! This uses the functools.singledispatch decorator. Together, these changes will allow users to create Message
classes that they can template exactly as needed, which will be useful as the variety of types of inputs to LLMs increases.
from typing import Any
from magentic.chat_model.openai_chat_model import OpenaiMessageRole, message_to_openai_message
from magentic.chat_model.message import Message
from openai.types.chat import ChatCompletionMessageParam
class CustomMessage(Message[str]):
def format(self, **kwargs: Any) -> "CustomMessage":
return CustomMessage(self.content)
@message_to_openai_message.register
def _(message: CustomMessage) -> ChatCompletionMessageParam:
return {"role": OpenaiMessageRole.USER.value, "content": message.content}
message_to_openai_message(CustomMessage("hello"))
# {'role': 'user', 'content': 'hello'}
PR #114
Warning
Breaking Change: FunctionResultMessage
init param function_call: FunctionCall
replaced by function: Callable
Only the name of the function is needed when serializing the FunctionResultMessage
so we do not need the whole FunctionCall
. This simplifies creating @chatprompt
function where the chat contains a function call. e.g.
from magentic import (
chatprompt,
AssistantMessage,
UserMessage,
FunctionCall,
FunctionResultMessage,
)
def plus(a: int, b: int) -> int:
return a + b
@chatprompt(
UserMessage("Use the plus function to add 1 and 2."),
AssistantMessage(FunctionCall(plus, 1, 2)),
FunctionResultMessage(3, plus),
)
def do_math() -> str:
...
do_math()
# 'The sum of 1 and 2 is 3.'
PR #110
v0.14.1
What's Changed
- Add dependabot config by @jackmpcollins in #85
- Run poetry update by @jackmpcollins in #98
- Add ruff to pyproject.toml. Update ruff. by @jackmpcollins in #107
- Handle functions with *args and **kwargs by @jackmpcollins in #106
Dependabot
- Bump jinja2 from 3.1.2 to 3.1.3 by @dependabot in #81
- Bump jupyter-lsp from 2.2.0 to 2.2.2 by @dependabot in #82
- Bump notebook from 7.0.0 to 7.0.7 by @dependabot in #83
- Bump jupyterlab from 4.0.3 to 4.0.11 by @dependabot in #84
- Bump actions/checkout from 3 to 4 by @dependabot in #86
- Bump actions/setup-python from 4 to 5 by @dependabot in #87
- Bump pytest from 7.4.0 to 7.4.4 by @dependabot in #89
- Bump mypy from 1.4.1 to 1.8.0 by @dependabot in #92
- Bump openai from 1.1.1 to 1.9.0 by @dependabot in #88
- Bump litellm from 1.0.0 to 1.18.9 by @dependabot in #90
- Bump pytest from 7.4.4 to 8.0.0 by @dependabot in #93
- Bump pytest-asyncio from 0.21.1 to 0.23.4 by @dependabot in #94
- Bump openai from 1.10.0 to 1.12.0 by @dependabot in #105
- Bump pytest-asyncio from 0.23.3 to 0.23.5 by @dependabot in #103
- Bump litellm from 1.20.6 to 1.23.14 by @dependabot in #108
Full Changelog: v0.14.0...v0.14.1
v0.14.0
What's Changed
- Add stop param by @jackmpcollins and @mnicstruwig in #80
Full Changelog: v0.13.0...v0.14.0