import marimo __generated_with = "0.11.9" app = marimo.App() @app.cell(hide_code=True) def _(): import marimo as mo import synalinks synalinks.backend.clear_session() return mo, synalinks @app.cell(hide_code=True) def _(mo): mo.md( r""" # First Steps First, install Synalinks, the easiest way is using pip: ```shell pip install synalinks ``` Or uv (recommended): ```shell uv pip install synalinks ``` If you want to install it from source (for contributors), then do: ```shell git clone https://github.com/SynaLinks/synalinks cd synalinks ./shell/uv.sh # Install uv ./shell/install.sh # Create the virtual env and install Synalinks ``` After this, open a python file or notebook and check the install: """ ) return @app.cell def _(synalinks): print(synalinks.__version__) return @app.cell(hide_code=True) def _(mo): mo.md( r""" Synalinks use a global context to ensure that each variable/module have a unique name. Clear it at the beginning of your scripts to ensure naming reproductability. """ ) return @app.cell def _(synalinks): synalinks.backend.clear_session() return @app.cell(hide_code=True) def _(mo): mo.md( r""" Addtionally, you can install Ollama [here](https://ollama.com/) to run Language Models (LMs) locally. In these notebooks, we are going to use OpenAI, because they are going to run on the cloud. But you can copy them locally and use Ollama instead without issue. ## Prompting You will notice that there is no traditional prompting involved in Synalinks, everything is described as data models in and out. However we use a prompt template, that will tell the system how to construct the prompt automatically. The prompt template is a jinja2 template that describe how to render the examples, hints and how to convert them into chat messages: """ ) return @app.cell def _(synalinks): print(synalinks.default_prompt_template()) return @app.cell(hide_code=True) def _(mo): mo.md( r""" If you are making a conversational application, we provide the following template to use. To use it, provide this template to the `prompt_template` argument of your `Generator` module. Note that this template only works if your module has a `ChatMessages` input. """ ) @app.cell def _(synalinks): print(synalinks.chat_prompt_template()) return @app.cell(hide_code=True) def _(mo): mo.md( r""" The template use the XML tags `...`, `...` and `...` to know how to convert the prompt template into messages. You can modify the default template used by using the `prompt_template` argument in Synalinks modules. You can notice also, that we send the inputs's and output's JSON schema to instruct the LMs how to answer, you can enable/disable that behavior by using `use_inputs_schema` and `use_outputs_schema` in Synalinks modules. Synalinks use constrained structured output ensuring that the LMs answer respect the data models specification (the JSON schema), and is ready to parse, so in theory we don't need it, except if you use it to provide additional information to the LMs. You can find more information in the [`Generator`](https://synalinks.github.io/synalinks/Synalinks%20API/Modules%20API/Core%20Modules/Generator%20module/) documentation. ## Data Models To provide additional information to the LMs, you can use the data models `Field`. You can notice that Synalinks use Pydantic as default data backend. Allowing Synalinks to be compatible out-of-the-box with structured output and FastAPI. """ ) return @app.cell def _(synalinks): class AnswerWithThinking(synalinks.DataModel): thinking: str = synalinks.Field( description="Your step by step thinking process", ) answer: str = synalinks.Field( description="The correct answer", ) return (AnswerWithThinking,) @app.cell(hide_code=True) def _(mo): mo.md( r""" ## Conclusion Usually that will be enough to instruct the LMs, you don't need to modify the prompt template. Just by adding additional descriptions to the data models fields you can instruct your system to behave as you want. If the system needs general instructions about how to behave, you can use the `hints` argument in Synalinks modules that will be formatted as presented in the prompt template. ### Key Takeaways - **Ease of Integration**: Synalinks seamlessly integrates with existing Python projects, making it easy to incorporate advanced language model capabilities without extensive modifications. - **Structured Outputs**: By using data models and JSON schemas, Synalinks ensures that the LMs responses are structured and ready for parsing, reducing the need for additional post-processing. - **Customizable Prompts**: The prompt templates in Synalinks are highly customizable, allowing you to tailor the instructions provided to the LMs based on your specific use case. - **Compatibility**: Synalinks use Pydantic as the default data backend ensures compatibility with structured output and FastAPI. """ ) return if __name__ == "__main__": app.run()