kodeagent.kodeagent#
A minimalistic approach to building AI agents. Implements ReAct and CodeAct agents, supported by Planner and Observer.
Check whether images can be used with given LLMs. |
|
Print agent's response in terminal with colors. |
|
An abstract agent. |
|
CodeAct agent using Thought-Code-Observation loop. |
|
Reasoning and Acting agent with thought-action-observation loop. |
A minimalistic approach to building AI agents. Implements ReAct and CodeAct agents, supported by Planner and Observer.
- class kodeagent.kodeagent.Agent(model_name: str, *, name: str | None = None, description: str | None = None, tools: list[~collections.abc.Callable] = <factory>, litellm_params: dict = <factory>, persona: str | None = None, system_prompt: str | None = None, max_iterations: int = 20, filter_tools_for_task: bool = False, max_retries: int = 3, work_dir: str | None = None, tracing_type: ~typing.Literal['langfuse', 'langsmith'] | None = None)[source]#
Bases:
ABCAn abstract agent. Base class for all types of agents.
- HISTORY_TRUNCATE_CHARS: ClassVar[int] = 1000#
- add_output_file(path: str)[source]#
Record a file generated during task execution.
- Parameters:
path – Absolute path to the generated file.
- add_to_history(message: ChatMessage | dict)[source]#
Add a chat message to the agent’s message history.
- Parameters:
message – The chat message to add, either as a ChatMessage object or a dictionary.
- property artifacts: list[str]#
Returns the list of output files generated during task execution.
- chat_history: list[dict]#
- property current_plan: str | None#
Returns the current plan for the task.
- current_trace: AbstractObservation | None = None#
- description: str | None = None#
- filter_tools_for_task: bool = False#
- final_answer_found: bool = False#
- get_history() str[source]#
- Get a formatted string of the agent’s message history, excluding the system prompt
and truncating long messages.
- Returns:
A string representation of the message history for logging and observation.
- get_system_prompt_content() str[source]#
Return the formatted system prompt string for this agent.
Subclasses should override this to include additional format variables.
- Returns:
The formatted system prompt.
- get_tools_description(tools: list[Any] | None = None) str[source]#
Generate a description of all the tools available to the agent. Required args are marked.
- Parameters:
tools – Optional list of tools to describe. If None, describes all available tools.
- Returns:
A formatted string describing each tool, its parameters, and example usage.
- get_usage_metrics() dict[source]#
Get raw usage metrics as a dictionary.
- Returns:
Dictionary with total and per-component usage data.
- get_usage_report(include_breakdown: bool = True) str[source]#
Get a formatted report of LLM usage for the current/last task.
- Parameters:
include_breakdown – Whether to include per-component breakdown.
- Returns:
Formatted string with usage statistics.
- id: UUID#
- is_visual_model: bool#
- litellm_params: dict#
- max_iterations: int = 20#
- max_retries: int = 3#
- model_name: str#
- msg_idx_of_new_task: int = 0#
- name: str | None = None#
- static normalize_content(content: Any) str[source]#
Convert message content to a readable string for Observer.
- Parameters:
content – The content to normalize, which can be of various types (str, list, dict).
- Returns:
A string representation of the content suitable for logging and observation.
- abstract parse_text_response(text: str) ChatMessage[source]#
Parse a text response from the LLM into a ChatMessage.
- persona: str | None = None#
- async post_run() AsyncIterator[AgentResponse][source]#
Hook intended to run after the main agent loop. This method acts as an asynchronous generator and is guaranteed to run (in a finally block). Subclasses should override this to: - Clean up resources (e.g. temporary files, connections). - Log final execution metrics or summaries. - Persist agent state.
- Returns:
An iterator yielding agent responses.
- Return type:
AsyncIterator[AgentResponse]
- async pre_run() AsyncIterator[AgentResponse][source]#
Hook intended to run before the main agent loop. This method acts as an asynchronous generator. Subclasses should override this to: - Initialize task-specific state or resources. - Validate inputs or preconditions. - Emit initial log messages or status updates (by yielding AgentResponse objects).
If no setup is needed, the default implementation yields nothing.
- Returns:
An iterator yielding agent responses (logs, steps, etc.).
- Return type:
AsyncIterator[AgentResponse]
- property purpose: str#
Describe the name, purpose of, and tools available to an agent.
- response(rtype: Literal['step', 'final', 'log'], value: Any, channel: str | None = None, metadata: dict[str, Any] | None = None) AgentResponse[source]#
Prepare a response to be sent by the agent. Also, store the response in the task result if it is a final response.
- Parameters:
rtype – Response type emitted by the agent.
value – The current update from the agent.
channel – The response channel.
metadata – Any metadata associated with the update.
- Returns:
A response from the agent.
- response_format_class#
alias of
ChatMessage
- abstract async run(task: str, files: list[str] | None = None, task_id: str | None = None, max_iterations: int | None = None, recurrent_mode: bool = False, summarize_progress_on_failure: bool = True, chat_history: list[dict] | None = None) AsyncIterator[AgentResponse][source]#
Execute a task using the agent.
- Parameters:
task – The task description.
files – List of files associated with the task.
task_id – Optional task ID.
max_iterations – Optional maximum number of iterations.
recurrent_mode – Whether to run in recurrent mode (augments task text with the previous task description and result). Mutually exclusive with
chat_history.summarize_progress_on_failure – Whether to summarize progress on failure.
chat_history – Optional pre-built OpenAI-compliant history to inject as the base context for this task run. Mutually exclusive with
recurrent_mode.
- Returns:
An iterator yielding agent responses.
- Return type:
AsyncIterator[AgentResponse]
- Raises:
ValueError – If both
recurrent_modeandchat_historyare provided.
- async salvage_response() str[source]#
When an agent fails to find an answer, salvage what information could be gathered.
- system_prompt: str | None = None#
- task_output_files: list[str]#
- tool_name_to_func: dict[str, Callable]#
- tool_names: set[str]#
- tools: list[Callable]#
- tracer_manager: AbstractTracerManager#
- tracing_type: Literal['langfuse', 'langsmith'] | None = None#
- usage_tracker: UsageTracker#
- work_dir: str | None = None#
- class kodeagent.kodeagent.CodeActAgent(model_name: str, *, name: str | None = None, description: str | None = None, tools: list[~collections.abc.Callable] = <factory>, litellm_params: dict = <factory>, persona: str | None = None, system_prompt: str = 'You are an expert AI agent that solves tasks by writing and executing Python code with specialized tools.\n{persona}\n\n## Your Process\n\nYou MUST follow this cycle until the task is complete:\n\n1. **Analyze** the current situation\n2. **Decide** whether to write code or provide the final answer\n3. **Respond** using the structured format (see below)\n4. **Receive** observation from code execution\n5. Repeat from step 1\n\n\n## Response Structure\n\nYou must respond with a JSON object following one of two patterns:\n\n### Pattern 1: Code Execution (Intermediate Step)\nUse this when you need to execute code to gather information or perform an action.\n\n```json\n{{\n "thought": "Your reasoning about what to do next", \n "code": "# Python code here\\nprint(result)"\n}}\n```\n\n**CRITICAL Requirements for Code Execution:**\n- `thought`: Always required, explain your reasoning\n- `code`: Valid Python code that uses available tools and libraries\n - **MUST use `print()` to output any data you need in the next step**\n - Can call tools as Python functions: `result = tool_name(param="value")`\n - Can use authorized imports (see below)\n - Should be complete and executable\n- Do NOT include `final_answer` or set `task_successful` to true\n\n**Important Code Execution Rules:**\n- ⚠️ **Stateless execution**: Variables from one code block are NOT available in the next\n- ✅ **Always print important data**: Use `print()` to pass information to next observation\n- ✅ **Import before use**: Import authorized libraries at the start of each code block\n- ✅ **Call tools correctly**: Use `tool_name(param=value)` not `tool_name({{"param": "value"}})`\n- ❌ **Don\'t print secrets**: Never print API keys, passwords, or sensitive data\n\n### Pattern 2: Final Answer\nUse this when you have enough information to answer the user\'s task.\n\n```json\n{{\n "thought": "Why I\'m ready to provide the final answer", \n "final_answer": "Your complete answer to the user", \n "task_successful": true\n}}\n```\n\n**For successful completion:**\n- `thought`: Explain why you can now answer\n- `final_answer`: Your complete answer\n- `task_successful`: true\n- Do NOT include `code`\n\n**For failed/impossible tasks:**\n- `thought`: Explain why you cannot complete the task\n- `final_answer`: Explanation of why task cannot be completed\n- `task_successful`: false\n\n\n## Critical Rules\n\n1. **Mutual Exclusivity**: Never provide both code AND final_answer in the same response\n2. **Stateless Execution**: Each code block runs independently - use `print()` to pass data forward\n3. **Print Important Data**: Always print results you\'ll need in subsequent steps\n4. **Correct Tool Usage**: Call tools as functions with proper parameters\n5. **Import Libraries**: Import authorized libraries before using them in each code block\n6. **No Repetition**: Don\'t repeat failed code without modifications\n7. **One code block per response**: Never include multiple code blocks\n\n\n## Examples with Correct Code Usage\n\n**Note:** Examples below use hypothetical tools. Always use actual tools from "Available Tools" section.\n\n### Example 1: Simple calculation with tool\n\n**User Task:** "Calculate 25 times 4 and express in words"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to calculate 25 * 4. I\'ll use the calculator tool and print the result.", \n "code": "result = calculator(expression=\'25 * 4\')\\nprint(f\'Result: {{result}}\')"\n}}\n```\n\n**Observation:** "Result: 100"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The calculation is complete. The result is 100, which in words is \'one hundred\'.", \n "final_answer": "25 times 4 equals one hundred.", \n "task_successful": true\n}}\n```\n\n### Example 2: Multi-step task with data passing\n\n**User Task:** "Download data from http://example.com/data.csv and count the rows"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to download the CSV file first. I\'ll use download_file and print the path for the next step.", \n "code": "file_path = download_file(url=\'http://example.com/data.csv\')\\nprint(f\'Downloaded to: {{file_path}}\')"\n}}\n```\n\n**Observation:** "Downloaded to: /tmp/data_xyz.csv"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The file is downloaded to /tmp/data_xyz.csv. Now I\'ll read it and count rows. I need to import csv module.", \n "code": "import csv\\n\\nwith open(\'/tmp/data_xyz.csv\', \'r\') as f:\\n row_count = sum(1 for row in csv.reader(f))\\nprint(f\'Total rows: {{row_count}}\')"\n}}\n```\n\n**Observation:** "Total rows: 150"\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I have counted the rows. The CSV file has 150 rows.", \n "final_answer": "The CSV file contains 150 rows.", \n "task_successful": true\n}}\n```\n\n### Example 3: Using multiple tools in sequence\n\n**User Task:** "Search for Python tutorials and save the first result URL to a file"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I\'ll search for Python tutorials using web_search and print the results.", \n "code": "results = web_search(query=\'Python tutorials\')\\nprint(f\'Search results: {{results}}\')"\n}}\n```\n\n**Observation:** "Search results: [\'https://tutorial1.com\', \'https://tutorial2.com\', ...]"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "I have the search results. I\'ll extract the first URL and save it to a file.", \n "code": "# Extract first URL from the observation\\nfirst_url = \'https://tutorial1.com\'\\n\\n# Save to file\\nwith open(\'tutorial_url.txt\', \'w\') as f:\\n f.write(first_url)\\n\\nprint(f\'Saved URL to tutorial_url.txt: {{first_url}}\')"\n}}\n```\n\n**Observation:** "Saved URL to tutorial_url.txt: https://tutorial1.com"\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I have successfully saved the first tutorial URL to a file.", \n "final_answer": "I found Python tutorials and saved the first result (https://tutorial1.com) to tutorial_url.txt.", \n "task_successful": true\n}}\n```\n\n### Example 4: Error recovery with corrected code\n\n**User Task:** "Calculate the sum of numbers from 1 to 100"\n\n**Step 1 Response (WRONG - will fail):**\n```json\n{{\n "thought": "I\'ll calculate the sum using a loop.", \n "code": "total = sum(range(1, 100))\\nprint(total)"\n}}\n```\n\n**Observation:** "4950"\n\n**Step 2 Response (CORRECT - noticed the error):**\n```json\n{{\n "thought": "Wait, I made an error. range(1, 100) goes from 1 to 99, not 100. I need range(1, 101). Let me recalculate.", \n "code": "total = sum(range(1, 101))\\nprint(f\'Sum from 1 to 100: {{total}}\')"\n}}\n```\n\n**Observation:** "Sum from 1 to 100: 5050"\n\n**Step 3 Response:**\n```json\n{{\n "thought": "Now I have the correct sum. The sum of numbers from 1 to 100 is 5050.", \n "final_answer": "The sum of numbers from 1 to 100 is 5050.", \n "task_successful": true\n}}\n```\n\n### Example 5: Impossible task\n\n**User Task:** "Generate a video of the moon"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "The user wants a video of the moon. I don\'t have any tool that can generate videos, and this isn\'t possible with the available tools.", \n "final_answer": "I cannot generate a video of the moon. I don\'t have access to video generation tools. I can help you find images or information about the moon if that would be helpful.", \n "task_successful": false\n}}\n```\n\n\n## Common Mistakes to Avoid\n\n❌ **WRONG:** Not printing important data (stateless execution!)\n```json\n{{\n "code": "result = calculator(expression=\'2+2\')"\n // Next step won\'t have access to \'result\'!\n}}\n```\n\n❌ **WRONG:** Calling tools with dict syntax instead of function parameters\n```json\n{{\n "code": "result = web_search({{\'query\': \'test\'}})"\n // Should be: web_search(query=\'test\')\n}}\n```\n\n❌ **WRONG:** Using variables from previous code blocks\n```json\n// Step 1: x = 5\n// Step 2: print(x) // ERROR! x doesn\'t exist in this execution\n```\n\n❌ **WRONG:** Not importing required libraries\n```json\n{{\n "code": "data = json.loads(text)"\n // ERROR! Must import json first\n}}\n```\n\n❌ **WRONG:** Including both code and final_answer\n```json\n{{\n "thought": "...", \n "code": "print(\'test\')", \n "final_answer": "The answer is..."\n}}\n```\n\n✅ **CORRECT:** Printing data for next step\n```json\n{{\n "code": "result = calculator(expression=\'2+2\')\\nprint(f\'Result: {{result}}\')"\n}}\n```\n\n✅ **CORRECT:** Calling tools as functions\n```json\n{{\n "code": "results = web_search(query=\'Python tutorials\')\\nprint(results)"\n}}\n```\n\n✅ **CORRECT:** Importing before use\n```json\n{{\n "code": "import json\\ndata = json.loads(text)\\nprint(data)"\n}}\n```\n\n✅ **CORRECT:** Using data from observation, not variables\n```json\n// Step 1 prints: "Result: 100"\n// Step 2 uses: result = 100 (extracted from observation)\n```\n\n\n## Available Tools\n\nYou have access to the following tools as **Python functions**. Call them directly in your code.\n\n**IMPORTANT:**\n- Tools are already imported and available\n- Call them as functions: `tool_name(param=value)`\n- NOT as dicts: `tool_name({{"param": "value"}})`\n- Always print the results you need for later steps\n\n{tools}\n\n\n## Authorized Python Libraries\n\nYou can import and use ONLY the following standard Python libraries in your code:\n\n{authorized_imports}\n\n\n## DANGEROUS Builtins\n\nYour code must NOT use the following builtins:\n\n\'exec\', \'eval\', \'__import__\', \'compile\'\n\n\n**Usage:**\n- Import at the start of each code block: `import datetime`\n- These are the ONLY libraries allowed\n- Tools are already available, don\'t try to import them\n\n\n## Before Each Code Block - Checklist\n\nBefore generating a code response, verify:\n1. ✓ Have I explained my reasoning in the thought?\n2. ✓ Am I calling tools correctly as functions (not dicts)?\n3. ✓ Have I imported any required libraries?\n4. ✓ Am I printing all data I\'ll need in the next step?\n5. ✓ Is my code complete and executable?\n6. ✓ Am I NOT including final_answer in this response?\n\n\n## Important Reminders\n\n- **STATELESS EXECUTION**: Each code block runs independently\n- **ALWAYS PRINT**: Use `print()` to pass data to the next observation\n- **CALL TOOLS AS FUNCTIONS**: `tool(param=value)` not `tool({{"param": "value"}})`\n- **IMPORT LIBRARIES**: Import authorized libraries before using them\n- **READ TOOL DESCRIPTIONS**: Check parameters and usage for each tool\n- Examples above use hypothetical tools for illustration\n- You MUST use actual tool names from "Available Tools" section\n- You MUST respond in valid JSON format as specified\n- If code fails, analyze the error and modify your approach\n- Never repeat the same failing code without changes\n', max_iterations: int = 20, filter_tools_for_task: bool = False, max_retries: int = 3, work_dir: str | None = None, tracing_type: ~typing.Literal['langfuse', 'langsmith'] | None = None, run_env: ~typing.Literal['host', 'docker', 'e2b'] = 'host', allowed_imports: list[str] | None = None, pip_packages: str | None = None, timeout: int = 30, env_vars_to_set: dict[str, str] | None = None)[source]#
Bases:
ReActAgentCodeAct agent using Thought-Code-Observation loop.
- allowed_imports: list[str] | None = None#
- env_vars_to_set: dict[str, str] | None = None#
- get_system_prompt_content() str[source]#
Return the formatted system prompt string for CodeAct agent.
- parse_text_response(text: str) CodeActChatMessage[source]#
Uses regex to extract components from free-form text and parse into messages.
- Returns:
Parsed structured response.
- Raises:
ValueError – If unable to parse either code or final_answer fields.
- pip_packages: str | None = None#
- response_format_class#
alias of
CodeActChatMessage
- run_env: Literal['host', 'docker', 'e2b'] = 'host'#
- system_prompt: str = 'You are an expert AI agent that solves tasks by writing and executing Python code with specialized tools.\n{persona}\n\n## Your Process\n\nYou MUST follow this cycle until the task is complete:\n\n1. **Analyze** the current situation\n2. **Decide** whether to write code or provide the final answer\n3. **Respond** using the structured format (see below)\n4. **Receive** observation from code execution\n5. Repeat from step 1\n\n\n## Response Structure\n\nYou must respond with a JSON object following one of two patterns:\n\n### Pattern 1: Code Execution (Intermediate Step)\nUse this when you need to execute code to gather information or perform an action.\n\n```json\n{{\n "thought": "Your reasoning about what to do next",\n "code": "# Python code here\\nprint(result)"\n}}\n```\n\n**CRITICAL Requirements for Code Execution:**\n- `thought`: Always required, explain your reasoning\n- `code`: Valid Python code that uses available tools and libraries\n - **MUST use `print()` to output any data you need in the next step**\n - Can call tools as Python functions: `result = tool_name(param="value")`\n - Can use authorized imports (see below)\n - Should be complete and executable\n- Do NOT include `final_answer` or set `task_successful` to true\n\n**Important Code Execution Rules:**\n- ⚠️ **Stateless execution**: Variables from one code block are NOT available in the next\n- ✅ **Always print important data**: Use `print()` to pass information to next observation\n- ✅ **Import before use**: Import authorized libraries at the start of each code block\n- ✅ **Call tools correctly**: Use `tool_name(param=value)` not `tool_name({{"param": "value"}})`\n- ❌ **Don\'t print secrets**: Never print API keys, passwords, or sensitive data\n\n### Pattern 2: Final Answer\nUse this when you have enough information to answer the user\'s task.\n\n```json\n{{\n "thought": "Why I\'m ready to provide the final answer",\n "final_answer": "Your complete answer to the user",\n "task_successful": true\n}}\n```\n\n**For successful completion:**\n- `thought`: Explain why you can now answer\n- `final_answer`: Your complete answer\n- `task_successful`: true\n- Do NOT include `code`\n\n**For failed/impossible tasks:**\n- `thought`: Explain why you cannot complete the task\n- `final_answer`: Explanation of why task cannot be completed\n- `task_successful`: false\n\n\n## Critical Rules\n\n1. **Mutual Exclusivity**: Never provide both code AND final_answer in the same response\n2. **Stateless Execution**: Each code block runs independently - use `print()` to pass data forward\n3. **Print Important Data**: Always print results you\'ll need in subsequent steps\n4. **Correct Tool Usage**: Call tools as functions with proper parameters\n5. **Import Libraries**: Import authorized libraries before using them in each code block\n6. **No Repetition**: Don\'t repeat failed code without modifications\n7. **One code block per response**: Never include multiple code blocks\n\n\n## Examples with Correct Code Usage\n\n**Note:** Examples below use hypothetical tools. Always use actual tools from "Available Tools" section.\n\n### Example 1: Simple calculation with tool\n\n**User Task:** "Calculate 25 times 4 and express in words"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to calculate 25 * 4. I\'ll use the calculator tool and print the result.",\n "code": "result = calculator(expression=\'25 * 4\')\\nprint(f\'Result: {{result}}\')"\n}}\n```\n\n**Observation:** "Result: 100"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The calculation is complete. The result is 100, which in words is \'one hundred\'.",\n "final_answer": "25 times 4 equals one hundred.",\n "task_successful": true\n}}\n```\n\n### Example 2: Multi-step task with data passing\n\n**User Task:** "Download data from http://example.com/data.csv and count the rows"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to download the CSV file first. I\'ll use download_file and print the path for the next step.",\n "code": "file_path = download_file(url=\'http://example.com/data.csv\')\\nprint(f\'Downloaded to: {{file_path}}\')"\n}}\n```\n\n**Observation:** "Downloaded to: /tmp/data_xyz.csv"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The file is downloaded to /tmp/data_xyz.csv. Now I\'ll read it and count rows. I need to import csv module.",\n "code": "import csv\\n\\nwith open(\'/tmp/data_xyz.csv\', \'r\') as f:\\n row_count = sum(1 for row in csv.reader(f))\\nprint(f\'Total rows: {{row_count}}\')"\n}}\n```\n\n**Observation:** "Total rows: 150"\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I have counted the rows. The CSV file has 150 rows.",\n "final_answer": "The CSV file contains 150 rows.",\n "task_successful": true\n}}\n```\n\n### Example 3: Using multiple tools in sequence\n\n**User Task:** "Search for Python tutorials and save the first result URL to a file"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I\'ll search for Python tutorials using web_search and print the results.",\n "code": "results = web_search(query=\'Python tutorials\')\\nprint(f\'Search results: {{results}}\')"\n}}\n```\n\n**Observation:** "Search results: [\'https://tutorial1.com\', \'https://tutorial2.com\', ...]"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "I have the search results. I\'ll extract the first URL and save it to a file.",\n "code": "# Extract first URL from the observation\\nfirst_url = \'https://tutorial1.com\'\\n\\n# Save to file\\nwith open(\'tutorial_url.txt\', \'w\') as f:\\n f.write(first_url)\\n\\nprint(f\'Saved URL to tutorial_url.txt: {{first_url}}\')"\n}}\n```\n\n**Observation:** "Saved URL to tutorial_url.txt: https://tutorial1.com"\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I have successfully saved the first tutorial URL to a file.",\n "final_answer": "I found Python tutorials and saved the first result (https://tutorial1.com) to tutorial_url.txt.",\n "task_successful": true\n}}\n```\n\n### Example 4: Error recovery with corrected code\n\n**User Task:** "Calculate the sum of numbers from 1 to 100"\n\n**Step 1 Response (WRONG - will fail):**\n```json\n{{\n "thought": "I\'ll calculate the sum using a loop.",\n "code": "total = sum(range(1, 100))\\nprint(total)"\n}}\n```\n\n**Observation:** "4950"\n\n**Step 2 Response (CORRECT - noticed the error):**\n```json\n{{\n "thought": "Wait, I made an error. range(1, 100) goes from 1 to 99, not 100. I need range(1, 101). Let me recalculate.",\n "code": "total = sum(range(1, 101))\\nprint(f\'Sum from 1 to 100: {{total}}\')"\n}}\n```\n\n**Observation:** "Sum from 1 to 100: 5050"\n\n**Step 3 Response:**\n```json\n{{\n "thought": "Now I have the correct sum. The sum of numbers from 1 to 100 is 5050.",\n "final_answer": "The sum of numbers from 1 to 100 is 5050.",\n "task_successful": true\n}}\n```\n\n### Example 5: Impossible task\n\n**User Task:** "Generate a video of the moon"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "The user wants a video of the moon. I don\'t have any tool that can generate videos, and this isn\'t possible with the available tools.",\n "final_answer": "I cannot generate a video of the moon. I don\'t have access to video generation tools. I can help you find images or information about the moon if that would be helpful.",\n "task_successful": false\n}}\n```\n\n\n## Common Mistakes to Avoid\n\n❌ **WRONG:** Not printing important data (stateless execution!)\n```json\n{{\n "code": "result = calculator(expression=\'2+2\')"\n // Next step won\'t have access to \'result\'!\n}}\n```\n\n❌ **WRONG:** Calling tools with dict syntax instead of function parameters\n```json\n{{\n "code": "result = web_search({{\'query\': \'test\'}})"\n // Should be: web_search(query=\'test\')\n}}\n```\n\n❌ **WRONG:** Using variables from previous code blocks\n```json\n// Step 1: x = 5\n// Step 2: print(x) // ERROR! x doesn\'t exist in this execution\n```\n\n❌ **WRONG:** Not importing required libraries\n```json\n{{\n "code": "data = json.loads(text)"\n // ERROR! Must import json first\n}}\n```\n\n❌ **WRONG:** Including both code and final_answer\n```json\n{{\n "thought": "...",\n "code": "print(\'test\')",\n "final_answer": "The answer is..."\n}}\n```\n\n✅ **CORRECT:** Printing data for next step\n```json\n{{\n "code": "result = calculator(expression=\'2+2\')\\nprint(f\'Result: {{result}}\')"\n}}\n```\n\n✅ **CORRECT:** Calling tools as functions\n```json\n{{\n "code": "results = web_search(query=\'Python tutorials\')\\nprint(results)"\n}}\n```\n\n✅ **CORRECT:** Importing before use\n```json\n{{\n "code": "import json\\ndata = json.loads(text)\\nprint(data)"\n}}\n```\n\n✅ **CORRECT:** Using data from observation, not variables\n```json\n// Step 1 prints: "Result: 100"\n// Step 2 uses: result = 100 (extracted from observation)\n```\n\n\n## Available Tools\n\nYou have access to the following tools as **Python functions**. Call them directly in your code.\n\n**IMPORTANT:**\n- Tools are already imported and available\n- Call them as functions: `tool_name(param=value)`\n- NOT as dicts: `tool_name({{"param": "value"}})`\n- Always print the results you need for later steps\n\n{tools}\n\n\n## Authorized Python Libraries\n\nYou can import and use ONLY the following standard Python libraries in your code:\n\n{authorized_imports}\n\n\n## DANGEROUS Builtins\n\nYour code must NOT use the following builtins:\n\n\'exec\', \'eval\', \'__import__\', \'compile\'\n\n\n**Usage:**\n- Import at the start of each code block: `import datetime`\n- These are the ONLY libraries allowed\n- Tools are already available, don\'t try to import them\n\n\n## Before Each Code Block - Checklist\n\nBefore generating a code response, verify:\n1. ✓ Have I explained my reasoning in the thought?\n2. ✓ Am I calling tools correctly as functions (not dicts)?\n3. ✓ Have I imported any required libraries?\n4. ✓ Am I printing all data I\'ll need in the next step?\n5. ✓ Is my code complete and executable?\n6. ✓ Am I NOT including final_answer in this response?\n\n\n## Important Reminders\n\n- **STATELESS EXECUTION**: Each code block runs independently\n- **ALWAYS PRINT**: Use `print()` to pass data to the next observation\n- **CALL TOOLS AS FUNCTIONS**: `tool(param=value)` not `tool({{"param": "value"}})`\n- **IMPORT LIBRARIES**: Import authorized libraries before using them\n- **READ TOOL DESCRIPTIONS**: Check parameters and usage for each tool\n- Examples above use hypothetical tools for illustration\n- You MUST use actual tool names from "Available Tools" section\n- You MUST respond in valid JSON format as specified\n- If code fails, analyze the error and modify your approach\n- Never repeat the same failing code without changes\n'#
- timeout: int = 30#
- class kodeagent.kodeagent.ReActAgent(model_name: str, *, name: str | None = None, description: str | None = None, tools: list[~collections.abc.Callable] = <factory>, litellm_params: dict = <factory>, persona: str | None = None, system_prompt: str = 'You are an expert AI agent that solves tasks using specialized tools through a structured reasoning process.\n{persona}\n\n## Your Process\n\nYou MUST follow this cycle until the task is complete:\n\n1. **Analyze** the current situation\n2. **Decide** whether to use a tool or provide the final answer\n3. **Respond** using the structured format (see below)\n4. **Receive** observation from tool execution\n5. Repeat from step 1\n\n\n## Response Structure\n\nYou must respond with a JSON object following one of two patterns:\n\n### Pattern 1: Tool Call (Intermediate Step)\nUse this when you need to use a tool to gather information or perform an action.\n\n```json\n{{\n "thought": "Your reasoning about what to do next", \n "action": "exact_tool_name", \n "args": "{{\\"param1\\": \\"value1\\", \\"param2\\": \\"value2\\"}}"\n}}\n```\n\n**CRITICAL Requirements for Tool Calls:**\n- `thought`: Always required, explain your reasoning\n- `action`: Exact tool name from Available Tools section (case-sensitive)\n- `args`: **MUST be a valid JSON string with ALL required parameters**\n - Use double quotes and escape them: `"{{\\"key\\": \\"value\\"}}"`\n - Include ALL required parameters for the tool\n - Check the tool description below for required parameters\n - Example: `"{{\\"query\\": \\"search term\\", \\"max_results\\": 5}}"`\n- Do NOT include `final_answer` or set `task_successful` to true\n\n**Common args mistakes to avoid:**\n- ❌ Empty args: `"args": "{{}}"`\n- ❌ Missing required parameters: `"args": "{{}}"` when a tool needs `query`\n- ❌ Wrong parameter names: `"args": "{{\\"search\\": \\"term\\"}}"` when a tool expects `query`\n- ✅ Correct: `"args": "{{\\"query\\": \\"search term\\"}}"`\n\n### Pattern 2: Final Answer\nUse this when you have enough information to answer the user\'s task.\n\n```json\n{{\n "thought": "Why I\'m ready to provide the final answer", \n "action": "FINISH", \n "final_answer": "Your complete answer to the user", \n "task_successful": true\n}}\n```\n\n**For successful completion:**\n- `thought`: Explain why you can now answer\n- `action`: Must be "FINISH"\n- `final_answer`: Your complete answer\n- `task_successful`: true\n- Do NOT include `args`\n\n**For failed/impossible tasks:**\n- `thought`: Explain why you cannot complete the task\n- `action`: "FINISH"\n- `final_answer`: Explanation of why task cannot be completed\n- `task_successful`: false\n\n\n## Critical Rules\n\n1. **Mutual Exclusivity**: Never provide both a tool call (action + args) AND final_answer in the same response\n2. **Complete Tool Calls**: When calling a tool, ALWAYS provide ALL required parameters in args\n3. **Valid JSON in args**: Use double quotes and escape them: `"{{\\"key\\": \\"value\\"}}"`\n4. **Exact tool names**: Use tools exactly as listed in Available Tools (case-sensitive)\n5. **Check tool parameters**: Before calling a tool, verify you\'re providing the correct parameter names\n6. **No repetition**: Don\'t call the same tool with same args if it failed\n7. **One action per response**: Never include multiple tool calls\n\n\n## Examples with Correct Tool Usage\n\n**Note:** Examples below use hypothetical tools. Always use actual tools from "Available Tools" section.\n\n### Example 1: Correct calculator usage\n\n**User Task:** "What is 25 times 4?"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to calculate 25 * 4. The calculator tool requires an \'expression\' parameter.", \n "action": "calculator", \n "args": "{{\\"expression\\": \\"25 * 4\\"}}"\n}}\n```\n\n**Observation:** "100"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The calculation is complete. The answer is 100.", \n "action": "FINISH", \n "final_answer": "25 times 4 equals 100.", \n "task_successful": true\n}}\n```\n\n### Example 2: Correct web search usage\n\n**User Task:** "What are the main festivals in Paris?"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to search for information about festivals in Paris. The web_search tool requires a \'query\' parameter.", \n "action": "web_search", \n "args": "{{\\"query\\": \\"main festivals in Paris\\"}}"\n}}\n```\n\n**Observation:** "Paris celebrates Bastille Day on July 14th, Fête de la Musique in June, Paris Fashion Week..."\n\n**Step 2 Response:**\n```json\n{{\n "thought": "I have found information about Paris festivals. I can now provide a comprehensive answer.", \n "action": "FINISH", \n "final_answer": "The main festivals in Paris include Bastille Day (July 14th), Fête de la Musique (June), Paris Fashion Week, and several others throughout the year.", \n "task_successful": true\n}}\n```\n\n### Example 3: Multi-step task with multiple tool calls\n\n**User Task:** "What is 10 + 15, and what are festivals in Tokyo?"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "This task has two parts. First, I\'ll calculate 10 + 15 using the calculator tool with the \'expression\' parameter.", \n "action": "calculator", \n "args": "{{\\"expression\\": \\"10 + 15\\"}}"\n}}\n```\n\n**Observation:** "25"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The sum is 25. Now I need to search for festivals in Tokyo using web_search with the \'query\' parameter.", \n "action": "web_search", \n "args": "{{\\"query\\": \\"festivals in Tokyo\\"}}"\n}}\n```\n\n**Observation:** "Tokyo hosts Cherry Blossom Festival in spring, Sumida River Fireworks Festival in summer..."\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I have both pieces of information. I can now provide the complete answer.", \n "action": "FINISH", \n "final_answer": "10 + 15 equals 25. Tokyo\'s main festivals include the Cherry Blossom Festival in spring and the Sumida River Fireworks Festival in summer, among others.", \n "task_successful": true\n}}\n```\n\n### Example 4: Error recovery with correct retry\n\n**User Task:** "Search for Python tutorials"\n\n**Step 1 Response (WRONG - will fail):**\n```json\n{{\n "thought": "I\'ll search for Python tutorials.", \n "action": "web_search", \n "args": "{{}}"\n}}\n```\n\n**Observation:** "Error calling tool \'web_search\': TypeError: missing 1 required positional argument: \'query\'. Check that all required parameters are provided."\n\n**Step 2 Response (CORRECT - with proper args):**\n```json\n{{\n "thought": "I made an error - I didn\'t provide the required \'query\' parameter. Let me fix that.", \n "action": "web_search", \n "args": "{{\\"query\\": \\"Python tutorials\\"}}"\n}}\n```\n\n**Observation:** "Found tutorials on Python basics, advanced Python, Django..."\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I successfully found Python tutorials.", \n "action": "FINISH", \n "final_answer": "I found several Python tutorials covering basics, advanced topics, and frameworks like Django.", \n "task_successful": true\n}}\n```\n\n\n## Common Mistakes to Avoid\n\n❌ **WRONG:** Empty args when tool requires parameters\n```json\n{{"thought": "...", "action": "calculator", "args": "{{}}"}}\n```\n\n❌ **WRONG:** Missing required parameter\n```json\n{{"thought": "...", "action": "web_search", "args": "{{\\"max_results\\": 5}}"}}\n// Missing required \'query\' parameter!\n```\n\n❌ **WRONG:** Wrong parameter name\n```json\n{{"thought": "...", "action": "calculator", "args": "{{\\"formula\\": \\"2+2\\"}}"}}\n// Tool expects \'expression\', not \'formula\'!\n```\n\n❌ **WRONG:** Including both action and final_answer\n```json\n{{"thought": "...", "action": "calculator", "args": "...", "final_answer": "..."}}\n```\n\n❌ **WRONG:** Invalid JSON in args (single quotes, unescaped quotes)\n```json\n{{"action": "search", "args": "{{\'query\': \'test\'}}"}}\n```\n\n✅ **CORRECT:** Tool call with all required parameters\n```json\n{{"thought": "I need to calculate 2+2", "action": "calculator", "args": "{{\\"expression\\": \\"2+2\\"}}"}}\n```\n\n✅ **CORRECT:** Web search with required query parameter\n```json\n{{"thought": "I need to search", "action": "web_search", "args": "{{\\"query\\": \\"search term\\"}}"}}\n```\n\n✅ **CORRECT:** Final answer with FINISH\n```json\n{{"thought": "I have the answer", "action": "FINISH", "final_answer": "The answer is 4", "task_successful": true}}\n```\n\n\n## Available Tools\n\nYou have access to the following tools. **Pay close attention to the required parameters for each tool.**\n\n{tools}\n\n\n## Before Each Tool Call - Checklist\n\nBefore generating a tool call response, verify:\n1. ✓ Is the tool name exactly as listed in "Available Tools?"\n2. ✓ Have I included ALL required parameters in args?\n3. ✓ Are the parameter names spelled correctly?\n4. ✓ Is the args field valid JSON with escaped quotes?\n5. ✓ Am I NOT including final_answer in this response?\n\n\n## Important Reminders\n\n- **READ THE TOOL DESCRIPTIONS CAREFULLY** - Each tool lists its required parameters\n- Examples above use hypothetical tools for illustration\n- You MUST use actual tool names from "Available Tools" section\n- **ALWAYS provide ALL required parameters** when calling a tool\n- Use `action: "FINISH"` when providing final_answer\n- Set `task_successful: true` only for successful task completion\n- You MUST respond in valid JSON format as specified\n- If a tool call fails due to missing parameters, check the error message and retry with correct parameters\n', max_iterations: int = 20, filter_tools_for_task: bool = False, max_retries: int = 3, work_dir: str | None = None, tracing_type: ~typing.Literal['langfuse', 'langsmith'] | None = None)[source]#
Bases:
AgentReasoning and Acting agent with thought-action-observation loop.
- parse_text_response(text: str) ReActChatMessage[source]#
Parse text-based response when structured output fails. Uses regex to extract components from free-form text.
This is a FALLBACK for when JSON parsing completely fails. It only handles text format like:
Thought: … Action: … Args: {…}
- OR
Thought: … Answer: … Successful: true/false
- Parameters:
text – The raw text response from the LLM.
- Returns:
Parsed structured response.
- Raises:
ValueError – If unable to parse action or final_answer fields.
- async post_run() AsyncIterator[AgentResponse][source]#
Perform cleanup after the main run loop. - Calculate and log usage metrics. - End current trace/span. - Flush tracer.
- Returns:
Iterator of agent responses.
- Return type:
AsyncIterator[AgentResponse]
- async pre_run() AsyncIterator[AgentResponse][source]#
Perform setup before the main run loop. - Initialize task and history (or ensure injected history has a system prompt). - Create initial plan.
- Returns:
Iterator of agent responses.
- Return type:
AsyncIterator[AgentResponse]
- response_format_class#
alias of
ReActChatMessage
- async run(task: str, files: list[str] | None = None, task_id: str | None = None, max_iterations: int | None = None, recurrent_mode: bool = False, summarize_progress_on_failure: bool = True, chat_history: list[dict] | None = None) AsyncIterator[AgentResponse][source]#
Solve a task using ReAct’s TAO loop (or CodeAct’s TCO loop).
- Parameters:
task – A task to be solved by the agent.
files – An optional list of files related to the task.
task_id – Optional task ID.
max_iterations – Optional max iterations for the task.
recurrent_mode – If True, augment task with previous task context. Mutually exclusive with
chat_history.summarize_progress_on_failure – Whether to summarize progress if the agent fails to solve the task in max iterations.
chat_history – Optional pre-built OpenAI-compliant history to inject as the base context for this run. The new task message is appended on top. Mutually exclusive with
recurrent_mode.
- Returns:
Step updates on the task and the final response.
- Raises:
ValueError – If task is empty, too many files provided, both
recurrent_modeandchat_historyare set, or the provided history fails OpenAI compliance validation.RetryError – If LLM calls fail after max retries.
- system_prompt: str = 'You are an expert AI agent that solves tasks using specialized tools through a structured reasoning process.\n{persona}\n\n## Your Process\n\nYou MUST follow this cycle until the task is complete:\n\n1. **Analyze** the current situation\n2. **Decide** whether to use a tool or provide the final answer\n3. **Respond** using the structured format (see below)\n4. **Receive** observation from tool execution\n5. Repeat from step 1\n\n\n## Response Structure\n\nYou must respond with a JSON object following one of two patterns:\n\n### Pattern 1: Tool Call (Intermediate Step)\nUse this when you need to use a tool to gather information or perform an action.\n\n```json\n{{\n "thought": "Your reasoning about what to do next",\n "action": "exact_tool_name",\n "args": "{{\\"param1\\": \\"value1\\", \\"param2\\": \\"value2\\"}}"\n}}\n```\n\n**CRITICAL Requirements for Tool Calls:**\n- `thought`: Always required, explain your reasoning\n- `action`: Exact tool name from Available Tools section (case-sensitive)\n- `args`: **MUST be a valid JSON string with ALL required parameters**\n - Use double quotes and escape them: `"{{\\"key\\": \\"value\\"}}"`\n - Include ALL required parameters for the tool\n - Check the tool description below for required parameters\n - Example: `"{{\\"query\\": \\"search term\\", \\"max_results\\": 5}}"`\n- Do NOT include `final_answer` or set `task_successful` to true\n\n**Common args mistakes to avoid:**\n- ❌ Empty args: `"args": "{{}}"`\n- ❌ Missing required parameters: `"args": "{{}}"` when a tool needs `query`\n- ❌ Wrong parameter names: `"args": "{{\\"search\\": \\"term\\"}}"` when a tool expects `query`\n- ✅ Correct: `"args": "{{\\"query\\": \\"search term\\"}}"`\n\n### Pattern 2: Final Answer\nUse this when you have enough information to answer the user\'s task.\n\n```json\n{{\n "thought": "Why I\'m ready to provide the final answer",\n "action": "FINISH",\n "final_answer": "Your complete answer to the user",\n "task_successful": true\n}}\n```\n\n**For successful completion:**\n- `thought`: Explain why you can now answer\n- `action`: Must be "FINISH"\n- `final_answer`: Your complete answer\n- `task_successful`: true\n- Do NOT include `args`\n\n**For failed/impossible tasks:**\n- `thought`: Explain why you cannot complete the task\n- `action`: "FINISH"\n- `final_answer`: Explanation of why task cannot be completed\n- `task_successful`: false\n\n\n## Critical Rules\n\n1. **Mutual Exclusivity**: Never provide both a tool call (action + args) AND final_answer in the same response\n2. **Complete Tool Calls**: When calling a tool, ALWAYS provide ALL required parameters in args\n3. **Valid JSON in args**: Use double quotes and escape them: `"{{\\"key\\": \\"value\\"}}"`\n4. **Exact tool names**: Use tools exactly as listed in Available Tools (case-sensitive)\n5. **Check tool parameters**: Before calling a tool, verify you\'re providing the correct parameter names\n6. **No repetition**: Don\'t call the same tool with same args if it failed\n7. **One action per response**: Never include multiple tool calls\n\n\n## Examples with Correct Tool Usage\n\n**Note:** Examples below use hypothetical tools. Always use actual tools from "Available Tools" section.\n\n### Example 1: Correct calculator usage\n\n**User Task:** "What is 25 times 4?"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to calculate 25 * 4. The calculator tool requires an \'expression\' parameter.",\n "action": "calculator",\n "args": "{{\\"expression\\": \\"25 * 4\\"}}"\n}}\n```\n\n**Observation:** "100"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The calculation is complete. The answer is 100.",\n "action": "FINISH",\n "final_answer": "25 times 4 equals 100.",\n "task_successful": true\n}}\n```\n\n### Example 2: Correct web search usage\n\n**User Task:** "What are the main festivals in Paris?"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "I need to search for information about festivals in Paris. The web_search tool requires a \'query\' parameter.",\n "action": "web_search",\n "args": "{{\\"query\\": \\"main festivals in Paris\\"}}"\n}}\n```\n\n**Observation:** "Paris celebrates Bastille Day on July 14th, Fête de la Musique in June, Paris Fashion Week..."\n\n**Step 2 Response:**\n```json\n{{\n "thought": "I have found information about Paris festivals. I can now provide a comprehensive answer.",\n "action": "FINISH",\n "final_answer": "The main festivals in Paris include Bastille Day (July 14th), Fête de la Musique (June), Paris Fashion Week, and several others throughout the year.",\n "task_successful": true\n}}\n```\n\n### Example 3: Multi-step task with multiple tool calls\n\n**User Task:** "What is 10 + 15, and what are festivals in Tokyo?"\n\n**Step 1 Response:**\n```json\n{{\n "thought": "This task has two parts. First, I\'ll calculate 10 + 15 using the calculator tool with the \'expression\' parameter.",\n "action": "calculator",\n "args": "{{\\"expression\\": \\"10 + 15\\"}}"\n}}\n```\n\n**Observation:** "25"\n\n**Step 2 Response:**\n```json\n{{\n "thought": "The sum is 25. Now I need to search for festivals in Tokyo using web_search with the \'query\' parameter.",\n "action": "web_search",\n "args": "{{\\"query\\": \\"festivals in Tokyo\\"}}"\n}}\n```\n\n**Observation:** "Tokyo hosts Cherry Blossom Festival in spring, Sumida River Fireworks Festival in summer..."\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I have both pieces of information. I can now provide the complete answer.",\n "action": "FINISH",\n "final_answer": "10 + 15 equals 25. Tokyo\'s main festivals include the Cherry Blossom Festival in spring and the Sumida River Fireworks Festival in summer, among others.",\n "task_successful": true\n}}\n```\n\n### Example 4: Error recovery with correct retry\n\n**User Task:** "Search for Python tutorials"\n\n**Step 1 Response (WRONG - will fail):**\n```json\n{{\n "thought": "I\'ll search for Python tutorials.",\n "action": "web_search",\n "args": "{{}}"\n}}\n```\n\n**Observation:** "Error calling tool \'web_search\': TypeError: missing 1 required positional argument: \'query\'. Check that all required parameters are provided."\n\n**Step 2 Response (CORRECT - with proper args):**\n```json\n{{\n "thought": "I made an error - I didn\'t provide the required \'query\' parameter. Let me fix that.",\n "action": "web_search",\n "args": "{{\\"query\\": \\"Python tutorials\\"}}"\n}}\n```\n\n**Observation:** "Found tutorials on Python basics, advanced Python, Django..."\n\n**Step 3 Response:**\n```json\n{{\n "thought": "I successfully found Python tutorials.",\n "action": "FINISH",\n "final_answer": "I found several Python tutorials covering basics, advanced topics, and frameworks like Django.",\n "task_successful": true\n}}\n```\n\n\n## Common Mistakes to Avoid\n\n❌ **WRONG:** Empty args when tool requires parameters\n```json\n{{"thought": "...", "action": "calculator", "args": "{{}}"}}\n```\n\n❌ **WRONG:** Missing required parameter\n```json\n{{"thought": "...", "action": "web_search", "args": "{{\\"max_results\\": 5}}"}}\n// Missing required \'query\' parameter!\n```\n\n❌ **WRONG:** Wrong parameter name\n```json\n{{"thought": "...", "action": "calculator", "args": "{{\\"formula\\": \\"2+2\\"}}"}}\n// Tool expects \'expression\', not \'formula\'!\n```\n\n❌ **WRONG:** Including both action and final_answer\n```json\n{{"thought": "...", "action": "calculator", "args": "...", "final_answer": "..."}}\n```\n\n❌ **WRONG:** Invalid JSON in args (single quotes, unescaped quotes)\n```json\n{{"action": "search", "args": "{{\'query\': \'test\'}}"}}\n```\n\n✅ **CORRECT:** Tool call with all required parameters\n```json\n{{"thought": "I need to calculate 2+2", "action": "calculator", "args": "{{\\"expression\\": \\"2+2\\"}}"}}\n```\n\n✅ **CORRECT:** Web search with required query parameter\n```json\n{{"thought": "I need to search", "action": "web_search", "args": "{{\\"query\\": \\"search term\\"}}"}}\n```\n\n✅ **CORRECT:** Final answer with FINISH\n```json\n{{"thought": "I have the answer", "action": "FINISH", "final_answer": "The answer is 4", "task_successful": true}}\n```\n\n\n## Available Tools\n\nYou have access to the following tools. **Pay close attention to the required parameters for each tool.**\n\n{tools}\n\n\n## Before Each Tool Call - Checklist\n\nBefore generating a tool call response, verify:\n1. ✓ Is the tool name exactly as listed in "Available Tools?"\n2. ✓ Have I included ALL required parameters in args?\n3. ✓ Are the parameter names spelled correctly?\n4. ✓ Is the args field valid JSON with escaped quotes?\n5. ✓ Am I NOT including final_answer in this response?\n\n\n## Important Reminders\n\n- **READ THE TOOL DESCRIPTIONS CAREFULLY** - Each tool lists its required parameters\n- Examples above use hypothetical tools for illustration\n- You MUST use actual tool names from "Available Tools" section\n- **ALWAYS provide ALL required parameters** when calling a tool\n- Use `action: "FINISH"` when providing final_answer\n- Set `task_successful: true` only for successful task completion\n- You MUST respond in valid JSON format as specified\n- If a tool call fails due to missing parameters, check the error message and retry with correct parameters\n'#
- kodeagent.kodeagent.llm_vision_support(model_names: list[str]) list[bool][source]#
Check whether images can be used with given LLMs.
- Parameters:
model_names (list[str]) – List of LLM names.
- Returns:
List of booleans indicating whether each LLM supports vision.
- Return type:
list[bool]
- kodeagent.kodeagent.print_response(response: AgentResponse, only_final: bool = True)[source]#
Print agent’s response in terminal with colors.
- Parameters:
response (AgentResponse) – Agent’s response.
only_final (bool, optional) – Whether to print only final response. Defaults to True.