Tool reply meta (#6074)

Co-authored-by: Douwe Osinga <douwe@squareup.com>
This commit is contained in:
Douwe Osinga
2025-12-11 19:43:36 -05:00
committed by GitHub
parent 7dd244eff6
commit cdab2fc3a6
52 changed files with 1852 additions and 1083 deletions
+6 -5
View File
@@ -11,7 +11,7 @@ use goose::mcp_utils::ToolResult;
use goose::providers::create;
use goose::session::session_manager::SessionType;
use goose::session::SessionManager;
use rmcp::model::{Content, RawContent, ResourceContents, Role};
use rmcp::model::{CallToolResult, RawContent, ResourceContents, Role};
use std::collections::{HashMap, HashSet};
use std::fs;
use std::sync::Arc;
@@ -74,8 +74,8 @@ fn extract_tool_locations(
.and_then(|c| c.as_str());
// Extract line numbers from the response content
if let Ok(content_items) = &tool_response.tool_result {
for content in content_items {
if let Ok(result) = &tool_response.tool_result {
for content in &result.content {
if let RawContent::Text(text_content) = &content.raw {
let text = &text_content.text;
@@ -491,9 +491,10 @@ impl GooseAcpAgent {
}
/// Build tool call content from tool result
fn build_tool_call_content(tool_result: &ToolResult<Vec<Content>>) -> Vec<ToolCallContent> {
fn build_tool_call_content(tool_result: &ToolResult<CallToolResult>) -> Vec<ToolCallContent> {
match tool_result {
Ok(content_items) => content_items
Ok(result) => result
.content
.iter()
.filter_map(|content| match &content.raw {
RawContent::Text(val) => Some(ToolCallContent::Content {
@@ -1,12 +1,12 @@
{
"74a3cc715c4c65dcae4ecec084d962947e4ce3cf02a8b639ee23b080e88bf6ec": {
"1b90ffd4b16eab7aef1c24e9b61f6b6cc6f0d9b04e8a4f4344454a45b0793284": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_8_0",
"id": "msg_20251211_27_0",
"role": "user",
"created": 1763989805,
"created": 1765495263,
"content": [
{
"type": "text",
@@ -19,13 +19,13 @@
}
},
{
"id": "msg_b4135f6c-9a29-4904-a59f-632ea849ef5a",
"id": "msg_9076da8a-a3b1-4cfc-b5d9-0ffc2a7879c9",
"role": "assistant",
"created": 1763989808,
"created": 1765495266,
"content": [
{
"type": "toolRequest",
"id": "toolu_01VxSzmLcPK7UNNE4ms8XRa6",
"id": "toolu_01CDkt9pjh8oC9C1984uhvuG",
"toolCall": {
"status": "success",
"value": {
@@ -43,21 +43,23 @@
}
},
{
"id": "msg_253b4067-0c08-4807-8b36-23b576f138b5",
"id": "msg_d7b3db5e-0402-42a8-937c-2ccf68a3e4e0",
"role": "user",
"created": 1763989808,
"created": 1765495266,
"content": [
{
"type": "toolResponse",
"id": "toolu_01VxSzmLcPK7UNNE4ms8XRa6",
"id": "toolu_01CDkt9pjh8oC9C1984uhvuG",
"toolResult": {
"status": "success",
"value": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
"value": {
"content": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
}
}
}
],
@@ -305,11 +307,11 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989811,
"created": 1765495269,
"content": [
{
"type": "text",
"text": "The weather in Berlin, Germany is currently **cloudy** with a temperature of **18°C** (64°F)."
"text": "# Weather in Berlin, Germany\n\nThe current weather in Berlin, Germany is:\n- **Conditions**: Cloudy\n- **Temperature**: 18°C (64°F)\n\nIt's a mild day with overcast conditions in Berlin!"
}
],
"metadata": {
@@ -321,301 +323,8 @@
"model": "claude-sonnet-4-20250514",
"usage": {
"input_tokens": 2406,
"output_tokens": 29,
"total_tokens": 2435
}
}
}
},
"1bc400a528c54b25f4f1f609481e98e44222b3deaf7eee2c9e640e6345c73861": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_8_0",
"role": "user",
"created": 1763989805,
"content": [
{
"type": "text",
"text": "tell me what the weather is in Berlin, Germany"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": [
{
"name": "dynamic_task__create_task",
"description": "Create tasks with instructions or prompt. For simple tasks, only include the instructions field. Extensions control: omit field = use all current extensions; empty array [] = no extensions; array with names = only those extensions. Specify extensions as shortnames (the prefixes for your tools). Specify return_last_only as true and have your subagent summarize its work in its last message to conserve your own context. Optional: title, description, extensions, settings, retry, response schema, activities. Arrays for multiple tasks.",
"inputSchema": {
"$defs": {
"TaskParameter": {
"description": "Parameters for a single task",
"properties": {
"activities": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"extensions": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"instructions": {
"type": [
"string",
"null"
]
},
"parameters": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"prompt": {
"type": [
"string",
"null"
]
},
"response": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"retry": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"return_last_only": {
"description": "If true, return only the last message from the subagent (default: false, returns full conversation)",
"type": [
"boolean",
"null"
]
},
"settings": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"title": {
"type": [
"string",
"null"
]
}
},
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"execution_mode": {
"description": "How to execute multiple tasks (default: parallel for multiple tasks, sequential for single task)",
"type": [
"string",
"null"
]
},
"task_parameters": {
"description": "Array of tasks. Each task must have either 'instructions' OR 'prompt' field (at least one is required).",
"items": {
"$ref": "#/$defs/TaskParameter"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"task_parameters"
],
"title": "CreateDynamicTaskParams",
"type": "object"
},
"annotations": {
"title": "Create Dynamic Tasks",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "platform__manage_schedule",
"description": "Manage scheduled recipe execution for this goose instance.\n\nActions:\n- \"list\": List all scheduled jobs\n- \"create\": Create a new scheduled job from a recipe file\n- \"run_now\": Execute a scheduled job immediately \n- \"pause\": Pause a scheduled job\n- \"unpause\": Resume a paused job\n- \"delete\": Remove a scheduled job\n- \"kill\": Terminate a currently running job\n- \"inspect\": Get details about a running job\n- \"sessions\": List execution history for a job\n- \"session_content\": Get the full content (messages) of a specific session\n",
"inputSchema": {
"properties": {
"action": {
"enum": [
"list",
"create",
"run_now",
"pause",
"unpause",
"delete",
"kill",
"inspect",
"sessions",
"session_content"
],
"type": "string"
},
"cron_expression": {
"description": "A cron expression for create action. Supports both 5-field (minute hour day month weekday) and 6-field (second minute hour day month weekday) formats. 5-field expressions are automatically converted to 6-field by prepending '0' for seconds.",
"type": "string"
},
"job_id": {
"description": "Job identifier for operations on existing jobs",
"type": "string"
},
"limit": {
"default": 50,
"description": "Limit for sessions list",
"type": "integer"
},
"recipe_path": {
"description": "Path to recipe file for create action",
"type": "string"
},
"session_id": {
"description": "Session identifier for session_content action",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"annotations": {
"title": "Manage scheduled recipes",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
},
{
"name": "subagent__execute_task",
"description": "Only use the subagent__execute_task tool when you execute sub recipe task or dynamic task.\n EXECUTION STRATEGY DECISION:\n 1. If the tasks are created with execution_mode, use the execution_mode.\n 2. Execute tasks sequentially unless user explicitly requests parallel execution. PARALLEL: User uses keywords like 'parallel', 'simultaneously', 'at the same time', 'concurrently'\n\n IMPLEMENTATION:\n - Sequential execution: Call this tool multiple times, passing exactly ONE task per call\n - Parallel execution: Call this tool once, passing an ARRAY of all tasks\n\n EXAMPLES:\n User Intent Based:\n - User: 'get weather and tell me a joke' → Sequential (2 separate tool calls, 1 task each)\n - User: 'get weather and joke in parallel' → Parallel (1 tool call with array of 2 tasks)\n - User: 'run these simultaneously' → Parallel (1 tool call with task array)\n - User: 'do task A then task B' → Sequential (2 separate tool calls)",
"inputSchema": {
"properties": {
"execution_mode": {
"default": "sequential",
"description": "Execution strategy for multiple tasks. Use 'sequential' (default) unless user explicitly requests parallel execution with words like 'parallel', 'simultaneously', 'at the same time', or 'concurrently'.",
"enum": [
"sequential",
"parallel"
],
"type": "string"
},
"task_ids": {
"items": {
"description": "Unique identifier for the task",
"type": "string"
},
"type": "array"
}
},
"required": [
"task_ids"
],
"type": "object"
},
"annotations": {
"title": "Run tasks in parallel",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "weather_extension__get_weather",
"description": "Get the weather for a location",
"inputSchema": {
"properties": {
"location": {
"description": "The city and state, e.g. San Francisco, CA",
"type": "string"
}
},
"required": [
"location"
],
"type": "object"
}
}
]
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1763989808,
"content": [
{
"type": "text",
"text": "I'll get the current weather information for Berlin, Germany."
},
{
"type": "toolRequest",
"id": "toolu_01VxSzmLcPK7UNNE4ms8XRa6",
"toolCall": {
"status": "success",
"value": {
"name": "weather_extension__get_weather",
"arguments": {
"location": "Berlin, Germany"
}
}
}
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "claude-sonnet-4-20250514",
"usage": {
"input_tokens": 2320,
"output_tokens": 72,
"total_tokens": 2392
"output_tokens": 55,
"total_tokens": 2461
}
}
}
@@ -627,7 +336,7 @@
{
"id": null,
"role": "user",
"created": 1763989805,
"created": 1765495263,
"content": [
{
"type": "text",
@@ -646,7 +355,7 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989810,
"created": 1765495265,
"content": [
{
"type": "text",
@@ -667,5 +376,298 @@
}
}
}
},
"1bc400a528c54b25f4f1f609481e98e44222b3deaf7eee2c9e640e6345c73861": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251211_27_0",
"role": "user",
"created": 1765495263,
"content": [
{
"type": "text",
"text": "tell me what the weather is in Berlin, Germany"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": [
{
"name": "dynamic_task__create_task",
"description": "Create tasks with instructions or prompt. For simple tasks, only include the instructions field. Extensions control: omit field = use all current extensions; empty array [] = no extensions; array with names = only those extensions. Specify extensions as shortnames (the prefixes for your tools). Specify return_last_only as true and have your subagent summarize its work in its last message to conserve your own context. Optional: title, description, extensions, settings, retry, response schema, activities. Arrays for multiple tasks.",
"inputSchema": {
"$defs": {
"TaskParameter": {
"description": "Parameters for a single task",
"properties": {
"activities": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"extensions": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"instructions": {
"type": [
"string",
"null"
]
},
"parameters": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"prompt": {
"type": [
"string",
"null"
]
},
"response": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"retry": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"return_last_only": {
"description": "If true, return only the last message from the subagent (default: false, returns full conversation)",
"type": [
"boolean",
"null"
]
},
"settings": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"title": {
"type": [
"string",
"null"
]
}
},
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"execution_mode": {
"description": "How to execute multiple tasks (default: parallel for multiple tasks, sequential for single task)",
"type": [
"string",
"null"
]
},
"task_parameters": {
"description": "Array of tasks. Each task must have either 'instructions' OR 'prompt' field (at least one is required).",
"items": {
"$ref": "#/$defs/TaskParameter"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"task_parameters"
],
"title": "CreateDynamicTaskParams",
"type": "object"
},
"annotations": {
"title": "Create Dynamic Tasks",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "platform__manage_schedule",
"description": "Manage scheduled recipe execution for this goose instance.\n\nActions:\n- \"list\": List all scheduled jobs\n- \"create\": Create a new scheduled job from a recipe file\n- \"run_now\": Execute a scheduled job immediately \n- \"pause\": Pause a scheduled job\n- \"unpause\": Resume a paused job\n- \"delete\": Remove a scheduled job\n- \"kill\": Terminate a currently running job\n- \"inspect\": Get details about a running job\n- \"sessions\": List execution history for a job\n- \"session_content\": Get the full content (messages) of a specific session\n",
"inputSchema": {
"properties": {
"action": {
"enum": [
"list",
"create",
"run_now",
"pause",
"unpause",
"delete",
"kill",
"inspect",
"sessions",
"session_content"
],
"type": "string"
},
"cron_expression": {
"description": "A cron expression for create action. Supports both 5-field (minute hour day month weekday) and 6-field (second minute hour day month weekday) formats. 5-field expressions are automatically converted to 6-field by prepending '0' for seconds.",
"type": "string"
},
"job_id": {
"description": "Job identifier for operations on existing jobs",
"type": "string"
},
"limit": {
"default": 50,
"description": "Limit for sessions list",
"type": "integer"
},
"recipe_path": {
"description": "Path to recipe file for create action",
"type": "string"
},
"session_id": {
"description": "Session identifier for session_content action",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"annotations": {
"title": "Manage scheduled recipes",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
},
{
"name": "subagent__execute_task",
"description": "Only use the subagent__execute_task tool when you execute sub recipe task or dynamic task.\n EXECUTION STRATEGY DECISION:\n 1. If the tasks are created with execution_mode, use the execution_mode.\n 2. Execute tasks sequentially unless user explicitly requests parallel execution. PARALLEL: User uses keywords like 'parallel', 'simultaneously', 'at the same time', 'concurrently'\n\n IMPLEMENTATION:\n - Sequential execution: Call this tool multiple times, passing exactly ONE task per call\n - Parallel execution: Call this tool once, passing an ARRAY of all tasks\n\n EXAMPLES:\n User Intent Based:\n - User: 'get weather and tell me a joke' → Sequential (2 separate tool calls, 1 task each)\n - User: 'get weather and joke in parallel' → Parallel (1 tool call with array of 2 tasks)\n - User: 'run these simultaneously' → Parallel (1 tool call with task array)\n - User: 'do task A then task B' → Sequential (2 separate tool calls)",
"inputSchema": {
"properties": {
"execution_mode": {
"default": "sequential",
"description": "Execution strategy for multiple tasks. Use 'sequential' (default) unless user explicitly requests parallel execution with words like 'parallel', 'simultaneously', 'at the same time', or 'concurrently'.",
"enum": [
"sequential",
"parallel"
],
"type": "string"
},
"task_ids": {
"items": {
"description": "Unique identifier for the task",
"type": "string"
},
"type": "array"
}
},
"required": [
"task_ids"
],
"type": "object"
},
"annotations": {
"title": "Run tasks in parallel",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "weather_extension__get_weather",
"description": "Get the weather for a location",
"inputSchema": {
"properties": {
"location": {
"description": "The city and state, e.g. San Francisco, CA",
"type": "string"
}
},
"required": [
"location"
],
"type": "object"
}
}
]
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1765495266,
"content": [
{
"type": "text",
"text": "I'll get the current weather information for Berlin, Germany for you."
},
{
"type": "toolRequest",
"id": "toolu_01CDkt9pjh8oC9C1984uhvuG",
"toolCall": {
"status": "success",
"value": {
"name": "weather_extension__get_weather",
"arguments": {
"location": "Berlin, Germany"
}
}
}
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "claude-sonnet-4-20250514",
"usage": {
"input_tokens": 2320,
"output_tokens": 74,
"total_tokens": 2394
}
}
}
}
}
@@ -1,12 +1,60 @@
{
"8b1b8633232ca390cb3ff37a48daf74168b58f13e2943efcb17957129ee34d1a": {
"input": {
"system": "Reply with only a description in four words or less",
"messages": [
{
"id": null,
"role": "user",
"created": 1765495269,
"content": [
{
"type": "text",
"text": "Here are the first few user messages:\ntell me what the weather is in Berlin, Germany\n\nBased on the conversation so far, provide a concise description of this session in 4 words or less. This will be used for finding the session later in a UI with limited space - reply *ONLY* with the description"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": []
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1765495270,
"content": [
{
"type": "text",
"text": "Weather inquiry for Berlin"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "gpt-4o-mini-2024-07-18",
"usage": {
"input_tokens": 84,
"output_tokens": 5,
"total_tokens": 89
}
}
}
},
"1bc400a528c54b25f4f1f609481e98e44222b3deaf7eee2c9e640e6345c73861": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_9_0",
"id": "msg_20251211_28_0",
"role": "user",
"created": 1763989812,
"created": 1765495269,
"content": [
{
"type": "text",
@@ -257,11 +305,11 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989813,
"created": 1765495270,
"content": [
{
"type": "toolRequest",
"id": "call_5IgyNY33nTougqsNFhizypew",
"id": "call_JJok3ApyTL54ohjLX8tTYVHC",
"toolCall": {
"status": "success",
"value": {
@@ -288,14 +336,14 @@
}
}
},
"2c07b9a6570269fef4ae329889ce5a5243d7b09b52165580be701b67b8b95818": {
"e020c157caa13bad743162d7079a04ddafca2d075469124a0162c5562a2cf21b": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_9_0",
"id": "msg_20251211_28_0",
"role": "user",
"created": 1763989812,
"created": 1765495269,
"content": [
{
"type": "text",
@@ -308,13 +356,13 @@
}
},
{
"id": "msg_b87436fe-d710-4fcd-b912-a69ab4ccfe7e",
"id": "msg_1d08355f-6d2d-413e-a3b5-787d635f9c6e",
"role": "assistant",
"created": 1763989813,
"created": 1765495270,
"content": [
{
"type": "toolRequest",
"id": "call_5IgyNY33nTougqsNFhizypew",
"id": "call_JJok3ApyTL54ohjLX8tTYVHC",
"toolCall": {
"status": "success",
"value": {
@@ -332,21 +380,23 @@
}
},
{
"id": "msg_9cf859cf-4adc-4464-aba4-1d4ccf9d7d05",
"id": "msg_929b0769-72dd-46f8-9027-31d1c09d4f08",
"role": "user",
"created": 1763989813,
"created": 1765495270,
"content": [
{
"type": "toolResponse",
"id": "call_5IgyNY33nTougqsNFhizypew",
"id": "call_JJok3ApyTL54ohjLX8tTYVHC",
"toolResult": {
"status": "success",
"value": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
"value": {
"content": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
}
}
}
],
@@ -594,11 +644,11 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989814,
"created": 1765495271,
"content": [
{
"type": "text",
"text": "### Current Weather in Berlin, Germany\n\n- **Condition:** Cloudy\n- **Temperature:** 18°C"
"text": "### Current Weather in Berlin, Germany\n\n- **Condition:** Cloudy\n- **Temperature:** 18°C\n\nIf you need more information or a forecast, let me know!"
}
],
"metadata": {
@@ -610,56 +660,8 @@
"model": "gpt-4o-mini-2024-07-18",
"usage": {
"input_tokens": 1534,
"output_tokens": 24,
"total_tokens": 1558
}
}
}
},
"8b1b8633232ca390cb3ff37a48daf74168b58f13e2943efcb17957129ee34d1a": {
"input": {
"system": "Reply with only a description in four words or less",
"messages": [
{
"id": null,
"role": "user",
"created": 1763989812,
"content": [
{
"type": "text",
"text": "Here are the first few user messages:\ntell me what the weather is in Berlin, Germany\n\nBased on the conversation so far, provide a concise description of this session in 4 words or less. This will be used for finding the session later in a UI with limited space - reply *ONLY* with the description"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": []
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1763989813,
"content": [
{
"type": "text",
"text": "Berlin weather inquiry"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "gpt-4o-mini-2024-07-18",
"usage": {
"input_tokens": 84,
"output_tokens": 4,
"total_tokens": 88
"output_tokens": 38,
"total_tokens": 1572
}
}
}
@@ -1,301 +1,12 @@
{
"1bc400a528c54b25f4f1f609481e98e44222b3deaf7eee2c9e640e6345c73861": {
"075d1e65f3a25bbdfc21aee19a1119b43fd4241f8643e646c9eb928a431975d4": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_10_0",
"id": "msg_20251211_40_0",
"role": "user",
"created": 1763989814,
"content": [
{
"type": "text",
"text": "tell me what the weather is in Berlin, Germany"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": [
{
"name": "dynamic_task__create_task",
"description": "Create tasks with instructions or prompt. For simple tasks, only include the instructions field. Extensions control: omit field = use all current extensions; empty array [] = no extensions; array with names = only those extensions. Specify extensions as shortnames (the prefixes for your tools). Specify return_last_only as true and have your subagent summarize its work in its last message to conserve your own context. Optional: title, description, extensions, settings, retry, response schema, activities. Arrays for multiple tasks.",
"inputSchema": {
"$defs": {
"TaskParameter": {
"description": "Parameters for a single task",
"properties": {
"activities": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"extensions": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"instructions": {
"type": [
"string",
"null"
]
},
"parameters": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"prompt": {
"type": [
"string",
"null"
]
},
"response": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"retry": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"return_last_only": {
"description": "If true, return only the last message from the subagent (default: false, returns full conversation)",
"type": [
"boolean",
"null"
]
},
"settings": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"title": {
"type": [
"string",
"null"
]
}
},
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"execution_mode": {
"description": "How to execute multiple tasks (default: parallel for multiple tasks, sequential for single task)",
"type": [
"string",
"null"
]
},
"task_parameters": {
"description": "Array of tasks. Each task must have either 'instructions' OR 'prompt' field (at least one is required).",
"items": {
"$ref": "#/$defs/TaskParameter"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"task_parameters"
],
"title": "CreateDynamicTaskParams",
"type": "object"
},
"annotations": {
"title": "Create Dynamic Tasks",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "platform__manage_schedule",
"description": "Manage scheduled recipe execution for this goose instance.\n\nActions:\n- \"list\": List all scheduled jobs\n- \"create\": Create a new scheduled job from a recipe file\n- \"run_now\": Execute a scheduled job immediately \n- \"pause\": Pause a scheduled job\n- \"unpause\": Resume a paused job\n- \"delete\": Remove a scheduled job\n- \"kill\": Terminate a currently running job\n- \"inspect\": Get details about a running job\n- \"sessions\": List execution history for a job\n- \"session_content\": Get the full content (messages) of a specific session\n",
"inputSchema": {
"properties": {
"action": {
"enum": [
"list",
"create",
"run_now",
"pause",
"unpause",
"delete",
"kill",
"inspect",
"sessions",
"session_content"
],
"type": "string"
},
"cron_expression": {
"description": "A cron expression for create action. Supports both 5-field (minute hour day month weekday) and 6-field (second minute hour day month weekday) formats. 5-field expressions are automatically converted to 6-field by prepending '0' for seconds.",
"type": "string"
},
"job_id": {
"description": "Job identifier for operations on existing jobs",
"type": "string"
},
"limit": {
"default": 50,
"description": "Limit for sessions list",
"type": "integer"
},
"recipe_path": {
"description": "Path to recipe file for create action",
"type": "string"
},
"session_id": {
"description": "Session identifier for session_content action",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"annotations": {
"title": "Manage scheduled recipes",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
},
{
"name": "subagent__execute_task",
"description": "Only use the subagent__execute_task tool when you execute sub recipe task or dynamic task.\n EXECUTION STRATEGY DECISION:\n 1. If the tasks are created with execution_mode, use the execution_mode.\n 2. Execute tasks sequentially unless user explicitly requests parallel execution. PARALLEL: User uses keywords like 'parallel', 'simultaneously', 'at the same time', 'concurrently'\n\n IMPLEMENTATION:\n - Sequential execution: Call this tool multiple times, passing exactly ONE task per call\n - Parallel execution: Call this tool once, passing an ARRAY of all tasks\n\n EXAMPLES:\n User Intent Based:\n - User: 'get weather and tell me a joke' → Sequential (2 separate tool calls, 1 task each)\n - User: 'get weather and joke in parallel' → Parallel (1 tool call with array of 2 tasks)\n - User: 'run these simultaneously' → Parallel (1 tool call with task array)\n - User: 'do task A then task B' → Sequential (2 separate tool calls)",
"inputSchema": {
"properties": {
"execution_mode": {
"default": "sequential",
"description": "Execution strategy for multiple tasks. Use 'sequential' (default) unless user explicitly requests parallel execution with words like 'parallel', 'simultaneously', 'at the same time', or 'concurrently'.",
"enum": [
"sequential",
"parallel"
],
"type": "string"
},
"task_ids": {
"items": {
"description": "Unique identifier for the task",
"type": "string"
},
"type": "array"
}
},
"required": [
"task_ids"
],
"type": "object"
},
"annotations": {
"title": "Run tasks in parallel",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "weather_extension__get_weather",
"description": "Get the weather for a location",
"inputSchema": {
"properties": {
"location": {
"description": "The city and state, e.g. San Francisco, CA",
"type": "string"
}
},
"required": [
"location"
],
"type": "object"
}
}
]
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1763989814,
"content": [
{
"type": "toolRequest",
"id": "4kpg6v08d",
"toolCall": {
"status": "success",
"value": {
"name": "weather_extension__get_weather",
"arguments": {
"location": "Berlin, Germany"
}
}
}
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "llama-3.3-70b-versatile",
"usage": {
"input_tokens": 2258,
"output_tokens": 20,
"total_tokens": 2278
}
}
}
},
"165258e98e56cdcccdc49bd70ecd2b081b41d35ddb3559ed3bc7b1e420290bed": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_10_0",
"role": "user",
"created": 1763989814,
"created": 1765495334,
"content": [
{
"type": "text",
@@ -308,13 +19,13 @@
}
},
{
"id": "msg_9d25f6e9-6d02-4f41-8710-325795e87fbc",
"id": "msg_6147fd68-5a38-4528-9924-d4dbaf5e7f44",
"role": "assistant",
"created": 1763989814,
"created": 1765495335,
"content": [
{
"type": "toolRequest",
"id": "4kpg6v08d",
"id": "zemx6n94z",
"toolCall": {
"status": "success",
"value": {
@@ -332,21 +43,23 @@
}
},
{
"id": "msg_513af900-f4fe-4ed0-aed8-7ffb4c8c384d",
"id": "msg_0fac763c-62c3-4a33-a15b-27d605c5b81d",
"role": "user",
"created": 1763989814,
"created": 1765495335,
"content": [
{
"type": "toolResponse",
"id": "4kpg6v08d",
"id": "zemx6n94z",
"toolResult": {
"status": "success",
"value": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
"value": {
"content": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
}
}
}
],
@@ -594,7 +307,7 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989815,
"created": 1765495335,
"content": [
{
"type": "text",
@@ -623,7 +336,7 @@
{
"id": null,
"role": "user",
"created": 1763989814,
"created": 1765495334,
"content": [
{
"type": "text",
@@ -642,11 +355,11 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989814,
"created": 1765495334,
"content": [
{
"type": "text",
"text": "Berlin weather query"
"text": "Berlin weather"
}
],
"metadata": {
@@ -658,8 +371,297 @@
"model": "llama-3.3-70b-versatile",
"usage": {
"input_tokens": 108,
"output_tokens": 4,
"total_tokens": 112
"output_tokens": 3,
"total_tokens": 111
}
}
}
},
"1bc400a528c54b25f4f1f609481e98e44222b3deaf7eee2c9e640e6345c73861": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251211_40_0",
"role": "user",
"created": 1765495334,
"content": [
{
"type": "text",
"text": "tell me what the weather is in Berlin, Germany"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": [
{
"name": "dynamic_task__create_task",
"description": "Create tasks with instructions or prompt. For simple tasks, only include the instructions field. Extensions control: omit field = use all current extensions; empty array [] = no extensions; array with names = only those extensions. Specify extensions as shortnames (the prefixes for your tools). Specify return_last_only as true and have your subagent summarize its work in its last message to conserve your own context. Optional: title, description, extensions, settings, retry, response schema, activities. Arrays for multiple tasks.",
"inputSchema": {
"$defs": {
"TaskParameter": {
"description": "Parameters for a single task",
"properties": {
"activities": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"extensions": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"instructions": {
"type": [
"string",
"null"
]
},
"parameters": {
"items": {
"additionalProperties": true,
"type": "object"
},
"type": [
"array",
"null"
]
},
"prompt": {
"type": [
"string",
"null"
]
},
"response": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"retry": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"return_last_only": {
"description": "If true, return only the last message from the subagent (default: false, returns full conversation)",
"type": [
"boolean",
"null"
]
},
"settings": {
"additionalProperties": true,
"type": [
"object",
"null"
]
},
"title": {
"type": [
"string",
"null"
]
}
},
"type": "object"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"execution_mode": {
"description": "How to execute multiple tasks (default: parallel for multiple tasks, sequential for single task)",
"type": [
"string",
"null"
]
},
"task_parameters": {
"description": "Array of tasks. Each task must have either 'instructions' OR 'prompt' field (at least one is required).",
"items": {
"$ref": "#/$defs/TaskParameter"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"task_parameters"
],
"title": "CreateDynamicTaskParams",
"type": "object"
},
"annotations": {
"title": "Create Dynamic Tasks",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "platform__manage_schedule",
"description": "Manage scheduled recipe execution for this goose instance.\n\nActions:\n- \"list\": List all scheduled jobs\n- \"create\": Create a new scheduled job from a recipe file\n- \"run_now\": Execute a scheduled job immediately \n- \"pause\": Pause a scheduled job\n- \"unpause\": Resume a paused job\n- \"delete\": Remove a scheduled job\n- \"kill\": Terminate a currently running job\n- \"inspect\": Get details about a running job\n- \"sessions\": List execution history for a job\n- \"session_content\": Get the full content (messages) of a specific session\n",
"inputSchema": {
"properties": {
"action": {
"enum": [
"list",
"create",
"run_now",
"pause",
"unpause",
"delete",
"kill",
"inspect",
"sessions",
"session_content"
],
"type": "string"
},
"cron_expression": {
"description": "A cron expression for create action. Supports both 5-field (minute hour day month weekday) and 6-field (second minute hour day month weekday) formats. 5-field expressions are automatically converted to 6-field by prepending '0' for seconds.",
"type": "string"
},
"job_id": {
"description": "Job identifier for operations on existing jobs",
"type": "string"
},
"limit": {
"default": 50,
"description": "Limit for sessions list",
"type": "integer"
},
"recipe_path": {
"description": "Path to recipe file for create action",
"type": "string"
},
"session_id": {
"description": "Session identifier for session_content action",
"type": "string"
}
},
"required": [
"action"
],
"type": "object"
},
"annotations": {
"title": "Manage scheduled recipes",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
},
{
"name": "subagent__execute_task",
"description": "Only use the subagent__execute_task tool when you execute sub recipe task or dynamic task.\n EXECUTION STRATEGY DECISION:\n 1. If the tasks are created with execution_mode, use the execution_mode.\n 2. Execute tasks sequentially unless user explicitly requests parallel execution. PARALLEL: User uses keywords like 'parallel', 'simultaneously', 'at the same time', 'concurrently'\n\n IMPLEMENTATION:\n - Sequential execution: Call this tool multiple times, passing exactly ONE task per call\n - Parallel execution: Call this tool once, passing an ARRAY of all tasks\n\n EXAMPLES:\n User Intent Based:\n - User: 'get weather and tell me a joke' → Sequential (2 separate tool calls, 1 task each)\n - User: 'get weather and joke in parallel' → Parallel (1 tool call with array of 2 tasks)\n - User: 'run these simultaneously' → Parallel (1 tool call with task array)\n - User: 'do task A then task B' → Sequential (2 separate tool calls)",
"inputSchema": {
"properties": {
"execution_mode": {
"default": "sequential",
"description": "Execution strategy for multiple tasks. Use 'sequential' (default) unless user explicitly requests parallel execution with words like 'parallel', 'simultaneously', 'at the same time', or 'concurrently'.",
"enum": [
"sequential",
"parallel"
],
"type": "string"
},
"task_ids": {
"items": {
"description": "Unique identifier for the task",
"type": "string"
},
"type": "array"
}
},
"required": [
"task_ids"
],
"type": "object"
},
"annotations": {
"title": "Run tasks in parallel",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": true
}
},
{
"name": "weather_extension__get_weather",
"description": "Get the weather for a location",
"inputSchema": {
"properties": {
"location": {
"description": "The city and state, e.g. San Francisco, CA",
"type": "string"
}
},
"required": [
"location"
],
"type": "object"
}
}
]
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1765495335,
"content": [
{
"type": "toolRequest",
"id": "zemx6n94z",
"toolCall": {
"status": "success",
"value": {
"name": "weather_extension__get_weather",
"arguments": {
"location": "Berlin, Germany"
}
}
}
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "llama-3.3-70b-versatile",
"usage": {
"input_tokens": 2258,
"output_tokens": 20,
"total_tokens": 2278
}
}
}
@@ -4,9 +4,9 @@
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_7_0",
"id": "msg_20251211_26_0",
"role": "user",
"created": 1763989801,
"created": 1765495261,
"content": [
{
"type": "text",
@@ -257,11 +257,11 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989803,
"created": 1765495262,
"content": [
{
"type": "toolRequest",
"id": "call_GmIN2vOnjDg6MSVWWFuZ4FlV",
"id": "call_sVLij6GavUkUc5Ri4VeDdgmN",
"toolCall": {
"status": "success",
"value": {
@@ -288,62 +288,14 @@
}
}
},
"8b1b8633232ca390cb3ff37a48daf74168b58f13e2943efcb17957129ee34d1a": {
"input": {
"system": "Reply with only a description in four words or less",
"messages": [
{
"id": null,
"role": "user",
"created": 1763989801,
"content": [
{
"type": "text",
"text": "Here are the first few user messages:\ntell me what the weather is in Berlin, Germany\n\nBased on the conversation so far, provide a concise description of this session in 4 words or less. This will be used for finding the session later in a UI with limited space - reply *ONLY* with the description"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": []
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1763989804,
"content": [
{
"type": "text",
"text": "Berlin weather inquiry"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "gpt-4o-2024-08-06",
"usage": {
"input_tokens": 84,
"output_tokens": 3,
"total_tokens": 87
}
}
}
},
"98726e7698e93241dfcba182bdca3a7d0640f0f538f086f4981dca6689b7ab5a": {
"950a6b5ec929abdd9e7cd337d2ea80c07631c23c6d64edac31988e18c6207e92": {
"input": {
"system": "You are a general-purpose AI agent called goose, created by Block, the parent company of Square, CashApp, and Tidal.\ngoose is being developed as an open-source software project.\n\ngoose uses LLM providers with tool calling capability. You can be used with different language models (gpt-4o,\nclaude-sonnet-4, o1, llama-3.2, deepseek-r1, etc).\nThese models have varying knowledge cut-off dates depending on when they were trained, but typically it's between 5-10\nmonths prior to the current date.\n\n# Extensions\n\nExtensions allow other applications to provide context to goose. Extensions connect goose to different data sources and\ntools.\nYou are capable of dynamically plugging into new extensions and learning how to use them. You solve higher level\nproblems using the tools in these extensions, and can interact with multiple at once.\n\nIf the Extension Manager extension is enabled, you can use the search_available_extensions tool to discover additional\nextensions that can help with your task. To enable or disable extensions, use the manage_extensions tool with the\nextension_name. You should only enable extensions found from the search_available_extensions tool.\nIf Extension Manager is not available, you can only work with currently enabled extensions and cannot dynamically load\nnew ones.\n\nBecause you dynamically load extensions, your conversation history may refer\nto interactions with extensions that are not currently active. The currently\nactive extensions are below. Each of these extensions provides tools that are\nin your tool specification.\n\n\n## weather_extension\n\n\n\n\n\n\n# Response Guidelines\n\n- Use Markdown formatting for all responses.\n- Follow best practices for Markdown, including:\n - Using headers for organization.\n - Bullet points for lists.\n - Links formatted correctly, either as linked text (e.g., [this is linked text](https://example.com)) or automatic\n links using angle brackets (e.g., <http://example.com/>).\n- For code examples, use fenced code blocks by placing triple backticks (` ``` `) before and after the code. Include the\n language identifier after the opening backticks (e.g., ` ```python `) to enable syntax highlighting.\n- Ensure clarity, conciseness, and proper formatting to enhance readability and usability.",
"messages": [
{
"id": "msg_20251124_7_0",
"id": "msg_20251211_26_0",
"role": "user",
"created": 1763989801,
"created": 1765495261,
"content": [
{
"type": "text",
@@ -356,13 +308,13 @@
}
},
{
"id": "msg_9a0fb3d7-d681-40b9-ab58-bb1cbe03e4b0",
"id": "msg_899ef38b-1440-47f7-a942-1b2e58c8835c",
"role": "assistant",
"created": 1763989803,
"created": 1765495262,
"content": [
{
"type": "toolRequest",
"id": "call_GmIN2vOnjDg6MSVWWFuZ4FlV",
"id": "call_sVLij6GavUkUc5Ri4VeDdgmN",
"toolCall": {
"status": "success",
"value": {
@@ -380,21 +332,23 @@
}
},
{
"id": "msg_51ae1986-b095-4163-8d42-004ff1a28c59",
"id": "msg_2f8ddf2e-dedb-4b99-9549-826796292622",
"role": "user",
"created": 1763989803,
"created": 1765495262,
"content": [
{
"type": "toolResponse",
"id": "call_GmIN2vOnjDg6MSVWWFuZ4FlV",
"id": "call_sVLij6GavUkUc5Ri4VeDdgmN",
"toolResult": {
"status": "success",
"value": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
"value": {
"content": [
{
"type": "text",
"text": "The weather in Berlin, Germany is cloudy and 18°C"
}
]
}
}
}
],
@@ -642,7 +596,7 @@
"message": {
"id": null,
"role": "assistant",
"created": 1763989805,
"created": 1765495263,
"content": [
{
"type": "text",
@@ -663,5 +617,53 @@
}
}
}
},
"8b1b8633232ca390cb3ff37a48daf74168b58f13e2943efcb17957129ee34d1a": {
"input": {
"system": "Reply with only a description in four words or less",
"messages": [
{
"id": null,
"role": "user",
"created": 1765495261,
"content": [
{
"type": "text",
"text": "Here are the first few user messages:\ntell me what the weather is in Berlin, Germany\n\nBased on the conversation so far, provide a concise description of this session in 4 words or less. This will be used for finding the session later in a UI with limited space - reply *ONLY* with the description"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
}
],
"tools": []
},
"output": {
"message": {
"id": null,
"role": "assistant",
"created": 1765495262,
"content": [
{
"type": "text",
"text": "Berlin weather inquiry"
}
],
"metadata": {
"userVisible": true,
"agentVisible": true
}
},
"usage": {
"model": "gpt-4o-2024-08-06",
"usage": {
"input_tokens": 84,
"output_tokens": 3,
"total_tokens": 87
}
}
}
}
}
+87 -17
View File
@@ -221,12 +221,12 @@ pub fn tool_response_to_markdown(resp: &ToolResponse, export_all_content: bool)
md.push_str("#### Tool Response:\n");
match &resp.tool_result {
Ok(contents) => {
if contents.is_empty() {
Ok(result) => {
if result.content.is_empty() {
md.push_str("*No textual output from tool.*\n");
}
for content in contents {
for content in &result.content {
if !export_all_content {
if let Some(audience) = content.audience() {
if !audience.contains(&Role::Assistant) {
@@ -581,7 +581,12 @@ mod tests {
};
let tool_response = ToolResponse {
id: "test-id".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let result = tool_response_to_markdown(&tool_response, true);
@@ -601,7 +606,12 @@ mod tests {
};
let tool_response = ToolResponse {
id: "test-id".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let result = tool_response_to_markdown(&tool_response, true);
@@ -707,7 +717,12 @@ if __name__ == "__main__":
};
let tool_response = ToolResponse {
id: "shell-cat".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&tool_request, true);
@@ -748,7 +763,12 @@ if __name__ == "__main__":
};
let tool_response = ToolResponse {
id: "git-status".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&tool_request, true);
@@ -797,7 +817,12 @@ warning: unused variable `x`
};
let tool_response = ToolResponse {
id: "cargo-build".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let response_result = tool_response_to_markdown(&tool_response, true);
@@ -844,7 +869,12 @@ warning: unused variable `x`
};
let tool_response = ToolResponse {
id: "curl-api".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let response_result = tool_response_to_markdown(&tool_response, true);
@@ -880,7 +910,12 @@ warning: unused variable `x`
};
let tool_response = ToolResponse {
id: "editor-write".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&tool_request, true);
@@ -937,7 +972,12 @@ def process_data(data: List[Dict]) -> List[Dict]:
};
let tool_response = ToolResponse {
id: "editor-view".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let response_result = tool_response_to_markdown(&tool_response, true);
@@ -974,7 +1014,12 @@ Command failed with exit code 2"#;
};
let tool_response = ToolResponse {
id: "shell-error".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let response_result = tool_response_to_markdown(&tool_response, true);
@@ -1014,7 +1059,12 @@ Command failed with exit code 2"#;
};
let tool_response = ToolResponse {
id: "script-exec".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&tool_request, true);
@@ -1061,7 +1111,12 @@ drwx------ 3 user staff 96 Dec 6 16:20 com.apple.launchd.abc
};
let tool_response = ToolResponse {
id: "multi-cmd".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&_tool_request, true);
@@ -1104,7 +1159,12 @@ src/middleware.rs:12:async fn auth_middleware(req: Request, next: Next) -> Resul
};
let tool_response = ToolResponse {
id: "grep-search".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&tool_request, true);
@@ -1144,7 +1204,12 @@ src/middleware.rs:12:async fn auth_middleware(req: Request, next: Next) -> Resul
};
let tool_response = ToolResponse {
id: "json-test".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let response_result = tool_response_to_markdown(&tool_response, true);
@@ -1185,7 +1250,12 @@ found 0 vulnerabilities"#;
};
let tool_response = ToolResponse {
id: "npm-install".to_string(),
tool_result: Ok(vec![Content::text(text_content.raw.text)]),
tool_result: Ok(rmcp::model::CallToolResult {
content: vec![Content::text(text_content.raw.text)],
structured_content: None,
is_error: Some(false),
meta: None,
}),
};
let request_result = tool_request_to_markdown(&tool_request, true);
+2 -2
View File
@@ -285,8 +285,8 @@ fn render_tool_response(resp: &ToolResponse, theme: Theme, debug: bool) {
let config = Config::global();
match &resp.tool_result {
Ok(contents) => {
for content in contents {
Ok(result) => {
for content in &result.content {
if let Some(audience) = content.audience() {
if !audience.contains(&rmcp::model::Role::User) {
continue;