Training adapter, it won't call my tool

Hi all.

My adapter model just won't invoke my tool.

The problem I am having is covered in an older post: https://developer.apple.com/forums/thread/794839?answerId=852262022#852262022

Sadly the thread dies there and no resolution is seen in that thread.

It's worth noting that I have developed an AI chatbot built around LanguageModelSession to which I feed the exact same system prompt that I feed to my training set (pasted further in this post). The AI chatbot works perfectly, the tool is invoked when needed. I am training the adapter model because the base model whilst capable doesn't produce the quality I'm looking for.

So here's the template of an item in my training set:

[
    {
        'role': 'system', 
        'content': systemPrompt,
        'tools': [TOOL_DEFINITION]
     },
     {
         'role': 'user', 
         'content': entry['prompt']
     },
     {
          'role': 'assistant',
          'content': entry['code']
     }
]

where TOOL_DEFINITION =

{
    'type': 'function',
    'function': {
        'name': 'WriteUbersichtWidgetToFileSystem',
        'description': 'Writes an Übersicht Widget to the file system. Call this tool as the last step in processing a prompt that generates a widget.',
        'parameters': {
            'type': 'object',
            'properties': {
                'jsxContent': {
                    'type': 'string',
                    'description': 'Complete JSX code for an Übersicht widget. This should include all required exports: command, refreshFrequency, render, and className. The JSX should be a complete, valid Übersicht widget file.'
                }
            },
            'required': ['jsxContent']
        }
    }


... and systemPrompt =

        A conversation between a user and a helpful assistant. You are an Übersicht widget designer. Create Übersicht widgets when requested by the user.

        IMPORTANT: You have access to a tool called WriteUbersichtWidgetToFileSystem. When asked to create a widget, you MUST call this tool.

        ### Tool Usage:
        Call WriteUbersichtWidgetToFileSystem with complete JSX code that implements the Übersicht Widget API. Generate custom JSX based on the user's specific request - do not copy the example below.

        ### Übersicht Widget API (REQUIRED):
        Every Übersicht widget MUST export these 4 items:
        - export const command: The bash command to execute (string)
        - export const refreshFrequency: Refresh rate in milliseconds (number)
        - export const render: React component function that receives {output} prop (function)
        - export const className: CSS positioning for absolute placement (string)

        Example format (customize for each request):
        WriteUbersichtWidgetToFileSystem({jsxContent: `export const command = "echo hello"; export const refreshFrequency = 1000; export const render = ({output}) => { return <div>{output}</div>; }; export const className = "top: 20px; left: 20px;"`})

        ### Rules:
        - The terms "ubersicht widget", "widget", "a widget", "the widget" must all be interpreted as "Übersicht widget"
        - Generate complete, valid JSX code that follows the Übersicht widget API
        - When you generate a widget, don't just show JSON or code - you MUST call the WriteUbersichtWidgetToFileSystem tool
        - Report the results to the user after calling the tool

        ### Examples:
        - "Generate a Übersicht widget" → Use WriteUbersichtWidgetToFileSystem tool
        - "Can you add a widget that shows the time" → Use WriteUbersichtWidgetToFileSystem tool
        - "Create a widget with a button" → Use WriteUbersichtWidgetToFileSystem tool

When the script that I use to compose the full training set is executed, entry['prompt'] and entry['code'] contain the prompt and the resulting JSX code for one of the examples I'm feeding to the training session. This is repeated for about 60 such examples that I have in my sample data collection.

Thanks for any help.

Michael

I have continued my research and have discovered that there must be a tool_calls assistant message. The tool gets called once now :-D It doesn't get called again after that. I'll continue testing;

{
    'role': 'assistant',
    'content': '',
    'tool_calls': [
        {
            'id': tool_call_id,
            'type': 'function',
            'function': {
                'name': 'WriteUbersichtWidgetToFileSystem',
                'arguments': arguments_json
            }
        }
    ]
}
Training adapter, it won't call my tool
 
 
Q