diff --git a/CHANGELOG.md b/CHANGELOG.md index 70767958..d73e14da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog ## [Unreleased] +### Changed + +- **RLM sandbox**: Bumped pydantic-monty to 0.0.8. Removed `regex_*` external functions — the sandbox now has native `re` and `math` modules via `import`. Also adds `filter()` and `getattr()` builtins. + ## [0.33.3] - 2026-03-12 ### Added diff --git a/docs/agents/rlm.md b/docs/agents/rlm.md index c339a7c0..87418538 100644 --- a/docs/agents/rlm.md +++ b/docs/agents/rlm.md @@ -64,15 +64,14 @@ The agent's code runs in a sandboxed Python interpreter ([pydantic-monty](https: | `get_chunk(chunk_id)` | Get a chunk with metadata (headings, page numbers, labels) for citations | | `get_docling_document(document_id)` | Get the full DoclingDocument structure as a dict (texts, tables, pictures, pages) | | `llm(prompt)` | Call an LLM for classification, summarization, or extraction | -| `regex_findall(pattern, text)`, `regex_sub(pattern, repl, text)`, `regex_search(pattern, text)`, `regex_split(pattern, text)` | Regular expression matching via Python's `re` module | When documents are pre-loaded via the `documents` parameter, they are injected as a `documents` variable accessible in the sandbox code. ### Python Features -The interpreter supports a subset of Python: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, try/except, and the `json` module. +The interpreter supports a subset of Python: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `filter()`, `getattr()`, try/except, and the `json`, `re`, `math` modules. -Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. For pattern matching, the agent can use the `regex_*` functions, string methods, or the `llm()` function. +Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. For pattern matching, the agent can use `import re`, string methods, or the `llm()` function. ### Security @@ -80,7 +79,7 @@ Code executes in an isolated interpreter with: - **No filesystem access**: Code cannot read or write files - **No network access**: Code cannot make HTTP requests or open sockets -- **No imports**: Only the `json` module is available +- **No imports**: Only `json`, `re`, and `math` modules are available - **Execution timeout**: Configurable limit (default 60s) - **Output truncation**: Large outputs are truncated to prevent memory issues diff --git a/haiku_rag_slim/haiku/rag/agents/rlm/prompts.py b/haiku_rag_slim/haiku/rag/agents/rlm/prompts.py index cc980ddc..7608a6f1 100644 --- a/haiku_rag_slim/haiku/rag/agents/rlm/prompts.py +++ b/haiku_rag_slim/haiku/rag/agents/rlm/prompts.py @@ -34,18 +34,6 @@ Use `list_documents()` or search results to get document IDs first. - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata -### await regex_findall(pattern, text) -> list[str] -Find all non-overlapping matches of a regular expression pattern in text. - -### await regex_sub(pattern, repl, text) -> str -Replace all occurrences of a regular expression pattern with a replacement string. - -### await regex_search(pattern, text) -> dict | None -Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - -### await regex_split(pattern, text) -> list[str] -Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -63,11 +51,11 @@ Check if it exists with: `try: documents ... except NameError: ...` ## Available Python Features -The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. +The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. -Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. +Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. -For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. +For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -93,10 +81,11 @@ print(f"Total: {count}") ### Extracting data with regex ```python +import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\\$([\\d,]+)', r['content']) + amounts = re.findall(r'\\$([\\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: diff --git a/haiku_rag_slim/haiku/rag/agents/rlm/sandbox.py b/haiku_rag_slim/haiku/rag/agents/rlm/sandbox.py index 8f13f5b1..bf6880a4 100644 --- a/haiku_rag_slim/haiku/rag/agents/rlm/sandbox.py +++ b/haiku_rag_slim/haiku/rag/agents/rlm/sandbox.py @@ -1,5 +1,4 @@ import json -import re from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Literal @@ -128,26 +127,6 @@ class Sandbox: result = await agent.run(prompt) return result.output - async def regex_findall(pattern: str, text: str) -> list[str]: - return re.findall(pattern, text) - - async def regex_sub(pattern: str, repl: str, text: str) -> str: - return re.sub(pattern, repl, text) - - async def regex_search(pattern: str, text: str) -> dict[str, Any] | None: - m = re.search(pattern, text) - if m is None: - return None - return { - "group": m.group(), - "groups": list(m.groups()), - "start": m.start(), - "end": m.end(), - } - - async def regex_split(pattern: str, text: str) -> list[str]: - return re.split(pattern, text) - return { "search": search, "list_documents": list_documents, @@ -155,10 +134,6 @@ class Sandbox: "get_chunk": get_chunk, "get_docling_document": get_docling_document, "llm": llm, - "regex_findall": regex_findall, - "regex_sub": regex_sub, - "regex_search": regex_search, - "regex_split": regex_split, } async def execute(self, code: str) -> SandboxResult: @@ -185,7 +160,6 @@ class Sandbox: monty = pydantic_monty.Monty( code, inputs=input_names, - external_functions=list(external_fns.keys()), ) except ( pydantic_monty.MontySyntaxError, diff --git a/haiku_rag_slim/pyproject.toml b/haiku_rag_slim/pyproject.toml index 2393bb1c..938ffa45 100644 --- a/haiku_rag_slim/pyproject.toml +++ b/haiku_rag_slim/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "pathspec>=1.0.4", "pydantic>=2.12.5", "pydantic-ai-slim[openai,fastmcp,logfire,ag-ui]>=1.66.0", - "pydantic-monty>=0.0.7", + "pydantic-monty>=0.0.8", "python-dotenv>=1.2.2", "pyyaml>=6.0.3", "rich>=14.3.3", diff --git a/tests/agents/rlm/test_sandbox.py b/tests/agents/rlm/test_sandbox.py index 8ab1c62d..adc34daa 100644 --- a/tests/agents/rlm/test_sandbox.py +++ b/tests/agents/rlm/test_sandbox.py @@ -381,70 +381,6 @@ class TestSandboxDoclingDocument: assert "True" in result.stdout -class TestSandboxRegex: - """Test regex external functions.""" - - @pytest.mark.asyncio - async def test_regex_findall(self, sandbox): - """regex_findall extracts all matches.""" - result = await sandbox.execute( - r"matches = await regex_findall(r'\d+', 'abc 123 def 456')" - "\nprint(matches)" - ) - assert result.success - assert "['123', '456']" in result.stdout - - @pytest.mark.asyncio - async def test_regex_sub(self, sandbox): - """regex_sub replaces matches.""" - result = await sandbox.execute( - r"out = await regex_sub(r'\d+', 'X', 'abc 123 def 456')" - "\nprint(out)" - ) - assert result.success - assert "abc X def X" in result.stdout - - @pytest.mark.asyncio - async def test_regex_search_match(self, sandbox): - """regex_search returns match dict when pattern matches.""" - result = await sandbox.execute( - r"m = await regex_search(r'(\d+)', 'abc 123')" - "\nprint(m['group'])" - "\nprint(m['start'])" - "\nprint(m['end'])" - ) - assert result.success - assert "123" in result.stdout - assert "4" in result.stdout - assert "7" in result.stdout - - @pytest.mark.asyncio - async def test_regex_search_no_match(self, sandbox): - """regex_search returns None when pattern doesn't match.""" - result = await sandbox.execute( - r"m = await regex_search(r'\d+', 'abc')" - "\nprint(m is None)" - ) - assert result.success - assert "True" in result.stdout - - @pytest.mark.asyncio - async def test_regex_split(self, sandbox): - """regex_split splits on pattern.""" - result = await sandbox.execute( - "out = await regex_split(',', 'a,b,,c')\nprint(out)" - ) - assert result.success - assert "['a', 'b', '', 'c']" in result.stdout - - @pytest.mark.asyncio - async def test_regex_invalid_pattern(self, sandbox): - """Invalid regex pattern surfaces as an error.""" - result = await sandbox.execute("await regex_findall('[invalid', 'text')") - assert not result.success - assert result.stderr != "" - - class TestSandboxLLM: """Test llm() external function.""" diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_aggregation.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_aggregation.yaml index a0a7d82e..879a373b 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_aggregation.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_aggregation.yaml @@ -128,7 +128,7 @@ interactions: connection: - keep-alive content-length: - - '7737' + - '7274' content-type: - application/json host: @@ -173,18 +173,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -202,11 +190,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -232,10 +220,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -296,6 +285,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -325,7 +315,7 @@ interactions: response: headers: content-length: - - '690' + - '699' content-type: - application/json parsed_body: @@ -334,25 +324,26 @@ interactions: index: 0 message: content: '' - reasoning: Need revenue from quarterly reports. Search for "quarterly report revenue". + reasoning: Need to search for quarterly reports revenue. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''document_title''], r[''score''], r[''content''][:200])"}' + arguments: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly + report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], + r[''score''])\n"}' name: execute_code - id: call_no1egdsi + id: call_exbbulxp index: 0 type: function - created: 1772626955 - id: chatcmpl-2 + created: 1773329130 + id: chatcmpl-407 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: completion_tokens: 85 - prompt_tokens: 1688 - total_tokens: 1773 + prompt_tokens: 1594 + total_tokens: 1679 status: code: 200 message: OK @@ -405,7 +396,7 @@ interactions: connection: - keep-alive content-length: - - '8682' + - '8148' content-type: - application/json host: @@ -450,18 +441,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -479,11 +458,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -509,10 +488,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -552,21 +532,20 @@ interactions: - content: What is the total revenue across all quarterly reports? role: user - content: null - reasoning: Need revenue from quarterly reports. Search for "quarterly report revenue". + reasoning: Need to search for quarterly reports revenue. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''document_title''], r[''score''], r[''content''][:200])"}' + arguments: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly + report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_no1egdsi + id: call_exbbulxp type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], - r[''score''], r[''content''][:200])","stdout":"3\nQ1 Report 0.03226645663380623 Sales report Q1: Revenue was $100,000.\nQ2 - Report 0.03226645663380623 Sales report Q2: Revenue was $150,000.\nQ3 Report 0.032258063554763794 Sales report Q3: - Revenue was $200,000.\n","stderr":"","success":true}' + - content: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly report + revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n","stdout":"3\nQ1 + Report 0.03226645663380623\nQ2 Report 0.03226645663380623\nQ3 Report 0.032258063554763794\n","stderr":"","success":true}' role: tool - tool_call_id: call_no1egdsi + tool_call_id: call_exbbulxp model: gpt-oss reasoning_effort: low response_format: @@ -589,6 +568,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -618,7 +598,7 @@ interactions: response: headers: content-length: - - '689' + - '680' content-type: - application/json parsed_body: @@ -627,25 +607,25 @@ interactions: index: 0 message: content: '' - reasoning: Three reports with revenue numbers. Sum = 450k. Need citation chunks. Retrieve chunks. + reasoning: We need revenue numbers. Let's fetch chunks. role: assistant tool_calls: - function: - arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())"}' + arguments: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n"}' name: execute_code - id: call_sg5vtxpb + id: call_2hd3mgon index: 0 type: function - created: 1772626957 - id: chatcmpl-37 + created: 1773329146 + id: chatcmpl-173 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: completion_tokens: 85 - prompt_tokens: 1922 - total_tokens: 2007 + prompt_tokens: 1798 + total_tokens: 1883 status: code: 200 message: OK @@ -658,7 +638,7 @@ interactions: connection: - keep-alive content-length: - - '9437' + - '8925' content-type: - application/json host: @@ -703,18 +683,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -732,11 +700,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -762,10 +730,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -805,35 +774,34 @@ interactions: - content: What is the total revenue across all quarterly reports? role: user - content: null - reasoning: Need revenue from quarterly reports. Search for "quarterly report revenue". + reasoning: Need to search for quarterly reports revenue. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''document_title''], r[''score''], r[''content''][:200])"}' + arguments: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly + report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_no1egdsi + id: call_exbbulxp type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], - r[''score''], r[''content''][:200])","stdout":"3\nQ1 Report 0.03226645663380623 Sales report Q1: Revenue was $100,000.\nQ2 - Report 0.03226645663380623 Sales report Q2: Revenue was $150,000.\nQ3 Report 0.032258063554763794 Sales report Q3: - Revenue was $200,000.\n","stderr":"","success":true}' + - content: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly report + revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n","stdout":"3\nQ1 + Report 0.03226645663380623\nQ2 Report 0.03226645663380623\nQ3 Report 0.032258063554763794\n","stderr":"","success":true}' role: tool - tool_call_id: call_no1egdsi + tool_call_id: call_exbbulxp - content: null - reasoning: Three reports with revenue numbers. Sum = 450k. Need citation chunks. Retrieve chunks. + reasoning: We need revenue numbers. Let's fetch chunks. role: assistant tool_calls: - function: - arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())"}' + arguments: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n"}' name: execute_code - id: call_sg5vtxpb + id: call_2hd3mgon type: function - - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' + - content: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' role: tool - tool_call_id: call_sg5vtxpb + tool_call_id: call_2hd3mgon model: gpt-oss reasoning_effort: low response_format: @@ -856,6 +824,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -885,7 +854,7 @@ interactions: response: headers: content-length: - - '737' + - '713' content-type: - application/json parsed_body: @@ -894,25 +863,25 @@ interactions: index: 0 message: content: '' - reasoning: Need to keep results variable. Use same scope. Let's re-run with storing results. + reasoning: Need to re-run search inside same code. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())"}' + arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n"}' name: execute_code - id: call_h6pfbenb + id: call_10n40kz9 index: 0 type: function - created: 1772626960 - id: chatcmpl-20 + created: 1773329159 + id: chatcmpl-749 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 98 - prompt_tokens: 2084 - total_tokens: 2182 + completion_tokens: 93 + prompt_tokens: 1970 + total_tokens: 2063 status: code: 200 message: OK @@ -965,7 +934,7 @@ interactions: connection: - keep-alive content-length: - - '10405' + - '9885' content-type: - application/json host: @@ -1010,18 +979,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -1039,11 +996,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -1069,10 +1026,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -1112,51 +1070,50 @@ interactions: - content: What is the total revenue across all quarterly reports? role: user - content: null - reasoning: Need revenue from quarterly reports. Search for "quarterly report revenue". + reasoning: Need to search for quarterly reports revenue. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''document_title''], r[''score''], r[''content''][:200])"}' + arguments: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly + report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_no1egdsi + id: call_exbbulxp type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], - r[''score''], r[''content''][:200])","stdout":"3\nQ1 Report 0.03226645663380623 Sales report Q1: Revenue was $100,000.\nQ2 - Report 0.03226645663380623 Sales report Q2: Revenue was $150,000.\nQ3 Report 0.032258063554763794 Sales report Q3: - Revenue was $200,000.\n","stderr":"","success":true}' + - content: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly report + revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n","stdout":"3\nQ1 + Report 0.03226645663380623\nQ2 Report 0.03226645663380623\nQ3 Report 0.032258063554763794\n","stderr":"","success":true}' role: tool - tool_call_id: call_no1egdsi + tool_call_id: call_exbbulxp - content: null - reasoning: Three reports with revenue numbers. Sum = 450k. Need citation chunks. Retrieve chunks. + reasoning: We need revenue numbers. Let's fetch chunks. role: assistant tool_calls: - function: - arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())"}' + arguments: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n"}' name: execute_code - id: call_sg5vtxpb + id: call_2hd3mgon type: function - - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' + - content: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' role: tool - tool_call_id: call_sg5vtxpb + tool_call_id: call_2hd3mgon - content: null - reasoning: Need to keep results variable. Use same scope. Let's re-run with storing results. + reasoning: Need to re-run search inside same code. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())"}' + arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n"}' name: execute_code - id: call_h6pfbenb + id: call_10n40kz9 type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())","stdout":"Q1 + - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n","stdout":"Q1 Report Sales report Q1: Revenue was $100,000.\nQ2 Report Sales report Q2: Revenue was $150,000.\nQ3 Report Sales report Q3: Revenue was $200,000.\n","stderr":"","success":true}' role: tool - tool_call_id: call_h6pfbenb + tool_call_id: call_10n40kz9 model: gpt-oss reasoning_effort: low response_format: @@ -1179,6 +1136,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -1208,7 +1166,7 @@ interactions: response: headers: content-length: - - '614' + - '643' content-type: - application/json parsed_body: @@ -1216,25 +1174,26 @@ interactions: - finish_reason: tool_calls index: 0 message: - content: Now compute sum. + content: '' + reasoning: Sum revenues. role: assistant tool_calls: - function: - arguments: '{"code":"total = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for - n in nums:\n total += int(n.replace('','', ''''))\nprint(total)"}' + arguments: '{"code":"total=0\nfor c in chunks:\n import re\n m=re.search(r''\\$([\\d,]+)'', c[''content''])\n if + m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n"}' name: execute_code - id: call_rlqh271l + id: call_51jmnwfv index: 0 type: function - created: 1772626962 - id: chatcmpl-924 + created: 1773329170 + id: chatcmpl-461 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 83 - prompt_tokens: 2312 - total_tokens: 2395 + completion_tokens: 88 + prompt_tokens: 2196 + total_tokens: 2284 status: code: 200 message: OK @@ -1247,7 +1206,7 @@ interactions: connection: - keep-alive content-length: - - '11090' + - '10618' content-type: - application/json host: @@ -1292,18 +1251,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -1321,11 +1268,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -1351,10 +1298,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -1394,65 +1342,65 @@ interactions: - content: What is the total revenue across all quarterly reports? role: user - content: null - reasoning: Need revenue from quarterly reports. Search for "quarterly report revenue". + reasoning: Need to search for quarterly reports revenue. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''document_title''], r[''score''], r[''content''][:200])"}' + arguments: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly + report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_no1egdsi + id: call_exbbulxp type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], - r[''score''], r[''content''][:200])","stdout":"3\nQ1 Report 0.03226645663380623 Sales report Q1: Revenue was $100,000.\nQ2 - Report 0.03226645663380623 Sales report Q2: Revenue was $150,000.\nQ3 Report 0.032258063554763794 Sales report Q3: - Revenue was $200,000.\n","stderr":"","success":true}' + - content: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly report + revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n","stdout":"3\nQ1 + Report 0.03226645663380623\nQ2 Report 0.03226645663380623\nQ3 Report 0.032258063554763794\n","stderr":"","success":true}' role: tool - tool_call_id: call_no1egdsi + tool_call_id: call_exbbulxp - content: null - reasoning: Three reports with revenue numbers. Sum = 450k. Need citation chunks. Retrieve chunks. + reasoning: We need revenue numbers. Let's fetch chunks. role: assistant tool_calls: - function: - arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())"}' + arguments: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n"}' name: execute_code - id: call_sg5vtxpb + id: call_2hd3mgon type: function - - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' + - content: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' role: tool - tool_call_id: call_sg5vtxpb + tool_call_id: call_2hd3mgon - content: null - reasoning: Need to keep results variable. Use same scope. Let's re-run with storing results. + reasoning: Need to re-run search inside same code. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())"}' + arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n"}' name: execute_code - id: call_h6pfbenb + id: call_10n40kz9 type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())","stdout":"Q1 + - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n","stdout":"Q1 Report Sales report Q1: Revenue was $100,000.\nQ2 Report Sales report Q2: Revenue was $150,000.\nQ3 Report Sales report Q3: Revenue was $200,000.\n","stderr":"","success":true}' role: tool - tool_call_id: call_h6pfbenb - - content: Now compute sum. + tool_call_id: call_10n40kz9 + - content: null + reasoning: Sum revenues. role: assistant tool_calls: - function: - arguments: '{"code":"total = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for - n in nums:\n total += int(n.replace('','', ''''))\nprint(total)"}' + arguments: '{"code":"total=0\nfor c in chunks:\n import re\n m=re.search(r''\\$([\\d,]+)'', c[''content''])\n if + m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n"}' name: execute_code - id: call_rlqh271l + id: call_51jmnwfv type: function - - content: '{"code":"total = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for - n in nums:\n total += int(n.replace('','', ''''))\nprint(total)","stdout":"","stderr":"NameError: name ''chunks'' - is not defined","success":false}' + - content: '{"code":"total=0\nfor c in chunks:\n import re\n m=re.search(r''\\$([\\d,]+)'', c[''content''])\n if + m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' role: tool - tool_call_id: call_rlqh271l + tool_call_id: call_51jmnwfv model: gpt-oss reasoning_effort: low response_format: @@ -1475,6 +1423,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -1504,7 +1453,7 @@ interactions: response: headers: content-length: - - '819' + - '848' content-type: - application/json parsed_body: @@ -1513,27 +1462,26 @@ interactions: index: 0 message: content: '' - reasoning: Variable scope lost. Let's combine. + reasoning: Need to keep chunks variable. Let's combine. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n\ntotal = 0\nfor c in chunks:\n nums = await - regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for n in nums:\n total += int(n.replace('','', - ''''))\nprint(total)"}' + arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n\ntotal=0\nimport re\nfor c in chunks:\n m=re.search(r''\\$([\\d,]+)'', + c[''content''])\n if m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n"}' name: execute_code - id: call_kbsx3dxm + id: call_axsiusi8 index: 0 type: function - created: 1772626965 - id: chatcmpl-319 + created: 1773329179 + id: chatcmpl-56 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 132 - prompt_tokens: 2483 - total_tokens: 2615 + completion_tokens: 140 + prompt_tokens: 2380 + total_tokens: 2520 status: code: 200 message: OK @@ -1586,7 +1534,7 @@ interactions: connection: - keep-alive content-length: - - '12120' + - '11699' content-type: - application/json host: @@ -1631,18 +1579,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -1660,11 +1596,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -1690,10 +1626,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -1733,81 +1670,81 @@ interactions: - content: What is the total revenue across all quarterly reports? role: user - content: null - reasoning: Need revenue from quarterly reports. Search for "quarterly report revenue". + reasoning: Need to search for quarterly reports revenue. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''document_title''], r[''score''], r[''content''][:200])"}' + arguments: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly + report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_no1egdsi + id: call_exbbulxp type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], - r[''score''], r[''content''][:200])","stdout":"3\nQ1 Report 0.03226645663380623 Sales report Q1: Revenue was $100,000.\nQ2 - Report 0.03226645663380623 Sales report Q2: Revenue was $150,000.\nQ3 Report 0.032258063554763794 Sales report Q3: - Revenue was $200,000.\n","stderr":"","success":true}' + - content: '{"code":"import re\n# search for revenue in quarterly reports\nresults = await search(\"quarterly report + revenue\", limit=20)\nprint(len(results))\nfor r in results[:5]:\n print(r[''document_title''], r[''score''])\n","stdout":"3\nQ1 + Report 0.03226645663380623\nQ2 Report 0.03226645663380623\nQ3 Report 0.032258063554763794\n","stderr":"","success":true}' role: tool - tool_call_id: call_no1egdsi + tool_call_id: call_exbbulxp - content: null - reasoning: Three reports with revenue numbers. Sum = 450k. Need citation chunks. Retrieve chunks. + reasoning: We need revenue numbers. Let's fetch chunks. role: assistant tool_calls: - function: - arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())"}' + arguments: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n"}' name: execute_code - id: call_sg5vtxpb + id: call_2hd3mgon type: function - - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], - chunk[''content''].strip())","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' + - content: '{"code":"# get chunks for each result\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], + chunk[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' is not defined","success":false}' role: tool - tool_call_id: call_sg5vtxpb + tool_call_id: call_2hd3mgon - content: null - reasoning: Need to keep results variable. Use same scope. Let's re-run with storing results. + reasoning: Need to re-run search inside same code. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())"}' + arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n"}' name: execute_code - id: call_h6pfbenb + id: call_10n40kz9 type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n print(c[''document_title''], c[''content''].strip())","stdout":"Q1 + - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n print(chunk[''document_title''], chunk[''content''][:200])\n","stdout":"Q1 Report Sales report Q1: Revenue was $100,000.\nQ2 Report Sales report Q2: Revenue was $150,000.\nQ3 Report Sales report Q3: Revenue was $200,000.\n","stderr":"","success":true}' role: tool - tool_call_id: call_h6pfbenb - - content: Now compute sum. - role: assistant - tool_calls: - - function: - arguments: '{"code":"total = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for - n in nums:\n total += int(n.replace('','', ''''))\nprint(total)"}' - name: execute_code - id: call_rlqh271l - type: function - - content: '{"code":"total = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for - n in nums:\n total += int(n.replace('','', ''''))\nprint(total)","stdout":"","stderr":"NameError: name ''chunks'' - is not defined","success":false}' - role: tool - tool_call_id: call_rlqh271l + tool_call_id: call_10n40kz9 - content: null - reasoning: Variable scope lost. Let's combine. + reasoning: Sum revenues. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n\ntotal = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', - c[''content''])\n for n in nums:\n total += int(n.replace('','', ''''))\nprint(total)"}' + arguments: '{"code":"total=0\nfor c in chunks:\n import re\n m=re.search(r''\\$([\\d,]+)'', c[''content''])\n if + m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n"}' name: execute_code - id: call_kbsx3dxm + id: call_51jmnwfv type: function - - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c - = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n\ntotal = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', - c[''content''])\n for n in nums:\n total += int(n.replace('','', ''''))\nprint(total)","stdout":"450000\n","stderr":"","success":true}' + - content: '{"code":"total=0\nfor c in chunks:\n import re\n m=re.search(r''\\$([\\d,]+)'', c[''content''])\n if + m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' role: tool - tool_call_id: call_kbsx3dxm + tool_call_id: call_51jmnwfv + - content: null + reasoning: Need to keep chunks variable. Let's combine. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n\ntotal=0\nimport re\nfor c in chunks:\n m=re.search(r''\\$([\\d,]+)'', + c[''content''])\n if m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n"}' + name: execute_code + id: call_axsiusi8 + type: function + - content: '{"code":"results = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n\ntotal=0\nimport re\nfor c in chunks:\n m=re.search(r''\\$([\\d,]+)'', + c[''content''])\n if m:\n val=int(m.group(1).replace('','',''''))\n total+=val\nprint(total)\n","stdout":"450000\n","stderr":"","success":true}' + role: tool + tool_call_id: call_axsiusi8 model: gpt-oss reasoning_effort: low response_format: @@ -1830,6 +1767,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -1859,7 +1797,7 @@ interactions: response: headers: content-length: - - '880' + - '980' content-type: - application/json parsed_body: @@ -1867,21 +1805,22 @@ interactions: - finish_reason: stop index: 0 message: - content: '{"answer":"The total revenue across all quarterly reports is $450,000. This figure comes from three reports:\n- - Q1 Report: $100,000\n- Q2 Report: $150,000\n- Q3 Report: $200,000\nSumming these gives the stated total.\n", "program":"results - = await search(\"quarterly report revenue\", limit=20)\nchunks = []\nfor r in results:\n c = await get_chunk(r[''chunk_id''])\n chunks.append(c)\n\ntotal - = 0\nfor c in chunks:\n nums = await regex_findall(r''\\$([\\d,]+)'', c[''content''])\n for n in nums:\n total - += int(n.replace('','', ''''))\nprint(total)"}' + content: '{"answer":"The total revenue reported across all quarterly reports is $450,000. This figure is the sum + of $100,000 from Q1, $150,000 from Q2, and $200,000 from Q3, as extracted from the respective quarterly report + documents.","program":"import re\n# Search for quarterly report revenue chunks\nresults = await search(\"quarterly + report revenue\", limit=20)\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n chunks.append(chunk)\n# + Sum revenue amounts\ntotal = 0\nfor c in chunks:\n m = re.search(r\"\\$([\\d,]+)\", c[''content''])\n if + m:\n val = int(m.group(1).replace('','', ''''))\n total += val\nprint(total)"}' role: assistant - created: 1772626970 - id: chatcmpl-772 + created: 1773329189 + id: chatcmpl-169 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 178 - prompt_tokens: 2744 - total_tokens: 2922 + completion_tokens: 186 + prompt_tokens: 2655 + total_tokens: 2841 status: code: 200 message: OK diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_count_documents.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_count_documents.yaml index 9ff42329..f35ee7dc 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_count_documents.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_count_documents.yaml @@ -128,7 +128,7 @@ interactions: connection: - keep-alive content-length: - - '7721' + - '7258' content-type: - application/json host: @@ -173,18 +173,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -202,11 +190,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -232,10 +220,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -296,6 +285,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -325,7 +315,7 @@ interactions: response: headers: content-length: - - '522' + - '525' content-type: - application/json parsed_body: @@ -338,20 +328,20 @@ interactions: role: assistant tool_calls: - function: - arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))"}' + arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\n"}' name: execute_code - id: call_cthflnpr + id: call_04viywlj index: 0 type: function - created: 1772626945 - id: chatcmpl-979 + created: 1773329125 + id: chatcmpl-653 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 45 - prompt_tokens: 1686 - total_tokens: 1731 + completion_tokens: 47 + prompt_tokens: 1592 + total_tokens: 1639 status: code: 200 message: OK @@ -364,7 +354,7 @@ interactions: connection: - keep-alive content-length: - - '8163' + - '7706' content-type: - application/json host: @@ -409,18 +399,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -438,11 +416,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -468,10 +446,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -515,13 +494,13 @@ interactions: role: assistant tool_calls: - function: - arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))"}' + arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\n"}' name: execute_code - id: call_cthflnpr + id: call_04viywlj type: function - - content: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))","stdout":"3\n","stderr":"","success":true}' + - content: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\n","stdout":"3\n","stderr":"","success":true}' role: tool - tool_call_id: call_cthflnpr + tool_call_id: call_04viywlj model: gpt-oss reasoning_effort: low response_format: @@ -544,6 +523,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -573,7 +553,7 @@ interactions: response: headers: content-length: - - '459' + - '416' content-type: - application/json parsed_body: @@ -581,18 +561,17 @@ interactions: - finish_reason: stop index: 0 message: - content: '{"answer":"There are 3 documents in the database.","program":"docs = await list_documents(limit=1000)\nprint(f''There - are {len(docs)} documents in the database.'')" }' + content: '{"answer":"There are 3 documents in the database.","program":"docs = await list_documents(limit=1000)\nprint(len(docs))"}' role: assistant - created: 1772626947 - id: chatcmpl-490 + created: 1773329134 + id: chatcmpl-151 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 49 - prompt_tokens: 1773 - total_tokens: 1822 + completion_tokens: 38 + prompt_tokens: 1683 + total_tokens: 1721 status: code: 200 message: OK diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_extract.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_extract.yaml index 99c5aa9d..5877872a 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_extract.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_extract.yaml @@ -8,7 +8,7 @@ interactions: connection: - keep-alive content-length: - - '10466' + - '10328' content-type: - application/json host: @@ -19,91 +19,84 @@ interactions: input: - |2- - Table 1: DocLayNet dataset overview. Along with the frequency of each class label, we present the relative occurrence (as % of row "Total") in the train, test and validation sets. The inter-annotator agreement is computed as the mAP@0.5-0.95 metric between pairwise annotations from the triple-annotated pages, from which we obtain accuracy ranges. + Table 1: DocLayNet dataset overview. Along with the frequency of each class label, we present the relative occurrence (as % of row 'Total') in the train, test and validation sets. The inter-annotator agreement is computed as the mAP@0.5-0.95 metric between pairwise annotations from the triple-annotated pages, from which we obtain accuracy ranges. - Caption, Count = 22524. Caption, % of Total.Train = 2.04. Caption, % of Total.Test = 1.77. Caption, % of Total.Val - = 2.32. Caption, triple inter-annotator mAP @ 0.5-0.95 (%).All = 84-89. Caption, triple inter-annotator mAP @ 0.5-0.95 - (%).Fin = 40-61. Caption, triple inter-annotator mAP @ 0.5-0.95 (%).Man = 86-92. Caption, triple inter-annotator mAP - @ 0.5-0.95 (%).Sci = 94-99. Caption, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 95-99. Caption, triple inter-annotator - mAP @ 0.5-0.95 (%).Pat = 69-78. Caption, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = - - n/a. Footnote, Count = 6318. Footnote, % of Total.Train = 0.60. Footnote, % of Total.Test = 0.31. Footnote, % of Total.Val - = 0.58. Footnote, triple inter-annotator mAP @ 0.5-0.95 (%).All = 83-91. Footnote, triple inter-annotator mAP @ 0.5-0.95 - (%).Fin = n/a. Footnote, triple inter-annotator mAP @ 0.5-0.95 (%).Man = 100. Footnote, triple inter-annotator mAP - @ 0.5-0.95 (%).Sci = 62-88. Footnote, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 85-94. Footnote, triple inter-annotator - mAP @ 0.5-0.95 (%).Pat = n/a. Footnote, triple inter-annotator mAP @ 0.5-0.95 (%).Ten - - = 82-97. Formula, Count = 25027. Formula, % of Total.Train = 2.25. Formula, % of Total.Test = 1.90. Formula, % of - Total.Val = 2.96. Formula, triple inter-annotator mAP @ 0.5-0.95 (%).All = 83-85. Formula, triple inter-annotator - mAP @ 0.5-0.95 (%).Fin = . Formula, triple inter-annotator mAP @ 0.5-0.95 (%).Man = n/a. Formula, triple inter-annotator - mAP @ 0.5-0.95 (%).Sci = 84-87. Formula, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 86-96. Formula, triple inter-annotator - mAP @ 0.5-0.95 (%).Pat = . Formula, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = n/a. List-item, Count = - - 185660. List-item, % of Total.Train = 17.19. List-item, % of Total.Test = 13.34. List-item, % of Total.Val = 15.82. - List-item, triple inter-annotator mAP @ 0.5-0.95 (%).All = 87-88. List-item, triple inter-annotator mAP @ 0.5-0.95 - (%).Fin = 74-83. List-item, triple inter-annotator mAP @ 0.5-0.95 (%).Man = 90-92. List-item, triple inter-annotator - mAP @ 0.5-0.95 (%).Sci = 97-97. List-item, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 81-85. List-item, triple - inter-annotator mAP @ 0.5-0.95 (%).Pat = 75-88. List-item, triple inter-annotator mAP @ - - 0.5-0.95 (%).Ten = 93-95. Page-footer, Count = 70878. Page-footer, % of Total.Train = 6.51. Page-footer, % of Total.Test - = 5.58. Page-footer, % of Total.Val = 6.00. Page-footer, triple inter-annotator mAP @ 0.5-0.95 (%).All = 93-94. Page-footer, - triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 88-90. Page-footer, triple inter-annotator mAP @ 0.5-0.95 (%).Man - = 95-96. Page-footer, triple inter-annotator mAP @ 0.5-0.95 (%).Sci = 100. Page-footer, triple inter-annotator mAP - @ 0.5-0.95 (%).Law = 92-97. Page-footer, triple inter-annotator mAP @ 0.5-0.95 (%).Pat = 100. - - Page-footer, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 96-98. Page-header, Count = 58022. Page-header, % of - Total.Train = 5.10. Page-header, % of Total.Test = 6.70. Page-header, % of Total.Val = 5.06. Page-header, triple inter-annotator - mAP @ 0.5-0.95 (%).All = 85-89. Page-header, triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 66-76. Page-header, triple - inter-annotator mAP @ 0.5-0.95 (%).Man = 90-94. Page-header, triple inter-annotator mAP @ 0.5-0.95 (%).Sci = 98-100. - Page-header, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 91-92. Page-header, triple inter-annotator mAP @ - - 0.5-0.95 (%).Pat = 97-99. Page-header, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 81-86. Picture, Count = 45976. - Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of Total.Val = 5.31. Picture, triple - inter-annotator mAP @ 0.5-0.95 (%).All = 69-71. Picture, triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 56-59. Picture, - triple inter-annotator mAP @ 0.5-0.95 (%).Man = 82-86. Picture, triple inter-annotator mAP @ 0.5-0.95 (%).Sci = 69-82. - Picture, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 80-95. Picture, triple - - inter-annotator mAP @ 0.5-0.95 (%).Pat = 66-71. Picture, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 59-76. Section-header, - Count = 142884. Section-header, % of Total.Train = 12.60. Section-header, % of Total.Test = 15.77. Section-header, - % of Total.Val = 12.85. Section-header, triple inter-annotator mAP @ 0.5-0.95 (%).All = 83-84. Section-header, triple - inter-annotator mAP @ 0.5-0.95 (%).Fin = 76-81. Section-header, triple inter-annotator mAP @ 0.5-0.95 (%).Man = 90-92. - Section-header, triple inter-annotator mAP @ 0.5-0.95 (%).Sci = 94-95. Section-header, triple inter-annotator mAP - @ - - 0.5-0.95 (%).Law = 87-94. Section-header, triple inter-annotator mAP @ 0.5-0.95 (%).Pat = 69-73. Section-header, triple - inter-annotator mAP @ 0.5-0.95 (%).Ten = 78-86. Table, Count = 34733. Table, % of Total.Train = 3.20. Table, % of - Total.Test = 2.27. Table, % of Total.Val = 3.60. Table, triple inter-annotator mAP @ 0.5-0.95 (%).All = 77-81. Table, - triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 75-80. Table, triple inter-annotator mAP @ 0.5-0.95 (%).Man = 83-86. - Table, triple inter-annotator mAP @ 0.5-0.95 (%).Sci = 98-99. Table, triple - - inter-annotator mAP @ 0.5-0.95 (%).Law = 58-80. Table, triple inter-annotator mAP @ 0.5-0.95 (%).Pat = 79-84. Table, - triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 70-85. Text, Count = 510377. Text, % of Total.Train = 45.82. Text, - % of Total.Test = 49.28. Text, % of Total.Val = 45.00. Text, triple inter-annotator mAP @ 0.5-0.95 (%).All = 84-86. - Text, triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 81-86. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Man = - 88-93. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Sci = - - 89-93. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 87-92. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Pat - = 71-79. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 87-95. Title, Count = 5071. Title, % of Total.Train - = 0.47. Title, % of Total.Test = 0.30. Title, % of Total.Val = 0.50. Title, triple inter-annotator mAP @ 0.5-0.95 - (%).All = 60-72. Title, triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 24-63. Title, triple inter-annotator mAP @ - 0.5-0.95 (%).Man = 50-63. Title, triple inter-annotator mAP @ 0.5-0.95 - - (%).Sci = 94-100. Title, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 82-96. Title, triple inter-annotator mAP - @ 0.5-0.95 (%).Pat = 68-79. Title, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 24-56. Total, Count = 1107470. - Total, % of Total.Train = 941123. Total, % of Total.Test = 99816. Total, % of Total.Val = 66531. Total, triple inter-annotator - mAP @ 0.5-0.95 (%).All = 82-83. Total, triple inter-annotator mAP @ 0.5-0.95 (%).Fin = 71-74. Total, triple inter-annotator - mAP @ 0.5-0.95 (%).Man = 79-81. Total, triple inter-annotator + = 2.32. Caption, triple inter-annotator mAP @0.5-0.95 (%).All = 84-89. Caption, triple inter-annotator mAP @0.5-0.95 + (%).Fin = 40-61. Caption, triple inter-annotator mAP @0.5-0.95 (%).Man = 86-92. Caption, triple inter-annotator mAP + @0.5-0.95 (%).Sci = 94-99. Caption, triple inter-annotator mAP @0.5-0.95 (%).Law = 95-99. Caption, triple inter-annotator + mAP @0.5-0.95 (%).Pat = 69-78. Caption, triple inter-annotator mAP @0.5-0.95 (%).Ten = n/a. Footnote, Count = + - 6318. Footnote, % of Total.Train = 0.60. Footnote, % of Total.Test = 0.31. Footnote, % of Total.Val = 0.58. Footnote, + triple inter-annotator mAP @0.5-0.95 (%).All = 83-91. Footnote, triple inter-annotator mAP @0.5-0.95 (%).Fin = n/a. + Footnote, triple inter-annotator mAP @0.5-0.95 (%).Man = 100. Footnote, triple inter-annotator mAP @0.5-0.95 (%).Sci + = 62-88. Footnote, triple inter-annotator mAP @0.5-0.95 (%).Law = 85-94. Footnote, triple inter-annotator mAP @0.5-0.95 + (%).Pat = n/a. Footnote, triple inter-annotator mAP @0.5-0.95 (%).Ten = 82-97. Formula, Count = + - 25027. Formula, % of Total.Train = 2.25. Formula, % of Total.Test = 1.90. Formula, % of Total.Val = 2.96. Formula, + triple inter-annotator mAP @0.5-0.95 (%).All = 83-85. Formula, triple inter-annotator mAP @0.5-0.95 (%).Fin = n/a. + Formula, triple inter-annotator mAP @0.5-0.95 (%).Man = n/a. Formula, triple inter-annotator mAP @0.5-0.95 (%).Sci + = 84-87. Formula, triple inter-annotator mAP @0.5-0.95 (%).Law = 86-96. Formula, triple inter-annotator mAP @0.5-0.95 + (%).Pat = n/a. Formula, triple inter-annotator mAP @0.5-0.95 (%).Ten = n/a. List-item, Count = 185660. List-item, + % of Total.Train = + - 17.19. List-item, % of Total.Test = 13.34. List-item, % of Total.Val = 15.82. List-item, triple inter-annotator mAP + @0.5-0.95 (%).All = 87-88. List-item, triple inter-annotator mAP @0.5-0.95 (%).Fin = 74-83. List-item, triple inter-annotator + mAP @0.5-0.95 (%).Man = 90-92. List-item, triple inter-annotator mAP @0.5-0.95 (%).Sci = 97-97. List-item, triple + inter-annotator mAP @0.5-0.95 (%).Law = 81-85. List-item, triple inter-annotator mAP @0.5-0.95 (%).Pat = 75-88. List-item, + triple inter-annotator mAP @0.5-0.95 (%).Ten = 93-95. Page-footer, Count = + - 70878. Page-footer, % of Total.Train = 6.51. Page-footer, % of Total.Test = 5.58. Page-footer, % of Total.Val = 6.00. + Page-footer, triple inter-annotator mAP @0.5-0.95 (%).All = 93-94. Page-footer, triple inter-annotator mAP @0.5-0.95 + (%).Fin = 88-90. Page-footer, triple inter-annotator mAP @0.5-0.95 (%).Man = 95-96. Page-footer, triple inter-annotator + mAP @0.5-0.95 (%).Sci = 100. Page-footer, triple inter-annotator mAP @0.5-0.95 (%).Law = 92-97. Page-footer, triple + inter-annotator mAP @0.5-0.95 (%).Pat = 100. Page-footer, triple inter-annotator mAP @0.5-0.95 (%).Ten = 96-98. + - Page-header, Count = 58022. Page-header, % of Total.Train = 5.10. Page-header, % of Total.Test = 6.70. Page-header, + % of Total.Val = 5.06. Page-header, triple inter-annotator mAP @0.5-0.95 (%).All = 85-89. Page-header, triple inter-annotator + mAP @0.5-0.95 (%).Fin = 66-76. Page-header, triple inter-annotator mAP @0.5-0.95 (%).Man = 90-94. Page-header, triple + inter-annotator mAP @0.5-0.95 (%).Sci = 98-100. Page-header, triple inter-annotator mAP @0.5-0.95 (%).Law = 91-92. + Page-header, triple inter-annotator mAP @0.5-0.95 (%).Pat = 97-99. Page-header, triple inter-annotator mAP @0.5-0.95 + - (%).Ten = 81-86. Picture, Count = 45976. Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, + % of Total.Val = 5.31. Picture, triple inter-annotator mAP @0.5-0.95 (%).All = 69-71. Picture, triple inter-annotator + mAP @0.5-0.95 (%).Fin = 56-59. Picture, triple inter-annotator mAP @0.5-0.95 (%).Man = 82-86. Picture, triple inter-annotator + mAP @0.5-0.95 (%).Sci = 69-82. Picture, triple inter-annotator mAP @0.5-0.95 (%).Law = 80-95. Picture, triple inter-annotator + mAP @0.5-0.95 (%).Pat = 66-71. Picture, triple inter-annotator mAP @0.5-0.95 + - (%).Ten = 59-76. Section-header, Count = 142884. Section-header, % of Total.Train = 12.60. Section-header, % of Total.Test + = 15.77. Section-header, % of Total.Val = 12.85. Section-header, triple inter-annotator mAP @0.5-0.95 (%).All = 83-84. + Section-header, triple inter-annotator mAP @0.5-0.95 (%).Fin = 76-81. Section-header, triple inter-annotator mAP @0.5-0.95 + (%).Man = 90-92. Section-header, triple inter-annotator mAP @0.5-0.95 (%).Sci = 94-95. Section-header, triple inter-annotator + mAP @0.5-0.95 (%).Law = 87-94. Section-header, triple inter-annotator mAP @0.5-0.95 (%).Pat = 69-73. Section-header, + triple + - inter-annotator mAP @0.5-0.95 (%).Ten = 78-86. Table, Count = 34733. Table, % of Total.Train = 3.20. Table, % of Total.Test + = 2.27. Table, % of Total.Val = 3.60. Table, triple inter-annotator mAP @0.5-0.95 (%).All = 77-81. Table, triple inter-annotator + mAP @0.5-0.95 (%).Fin = 75-80. Table, triple inter-annotator mAP @0.5-0.95 (%).Man = 83-86. Table, triple inter-annotator + mAP @0.5-0.95 (%).Sci = 98-99. Table, triple inter-annotator mAP @0.5-0.95 (%).Law = 58-80. Table, triple inter-annotator + mAP @0.5-0.95 (%).Pat = 79-84. Table, triple + - inter-annotator mAP @0.5-0.95 (%).Ten = 70-85. Text, Count = 510377. Text, % of Total.Train = 45.82. Text, % of Total.Test + = 49.28. Text, % of Total.Val = 45.00. Text, triple inter-annotator mAP @0.5-0.95 (%).All = 84-86. Text, triple inter-annotator + mAP @0.5-0.95 (%).Fin = 81-86. Text, triple inter-annotator mAP @0.5-0.95 (%).Man = 88-93. Text, triple inter-annotator + mAP @0.5-0.95 (%).Sci = 89-93. Text, triple inter-annotator mAP @0.5-0.95 (%).Law = 87-92. Text, triple inter-annotator + mAP @0.5-0.95 (%).Pat = 71-79. + - Text, triple inter-annotator mAP @0.5-0.95 (%).Ten = 87-95. Title, Count = 5071. Title, % of Total.Train = 0.47. Title, + % of Total.Test = 0.30. Title, % of Total.Val = 0.50. Title, triple inter-annotator mAP @0.5-0.95 (%).All = 60-72. + Title, triple inter-annotator mAP @0.5-0.95 (%).Fin = 24-63. Title, triple inter-annotator mAP @0.5-0.95 (%).Man = + 50-63. Title, triple inter-annotator mAP @0.5-0.95 (%).Sci = 94-100. Title, triple inter-annotator mAP @0.5-0.95 (%).Law + = 82-96. Title, triple inter-annotator mAP @0.5-0.95 (%).Pat = 68-79. Title, + - triple inter-annotator mAP @0.5-0.95 (%).Ten = 24-56. Total, Count = 1107470. Total, % of Total.Train = 941123. Total, + % of Total.Test = 99816. Total, % of Total.Val = 66531. Total, triple inter-annotator mAP @0.5-0.95 (%).All = 82-83. + Total, triple inter-annotator mAP @0.5-0.95 (%).Fin = 71-74. Total, triple inter-annotator mAP @0.5-0.95 (%).Man = + 79-81. Total, triple inter-annotator mAP @0.5-0.95 (%).Sci = 89-94. Total, triple inter-annotator mAP @0.5-0.95 (%).Law + = 86-91. Total, triple inter-annotator mAP @0.5-0.95 (%).Pat = - |- - mAP @ 0.5-0.95 (%).Sci = 89-94. Total, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 86-91. Total, triple inter-annotator mAP @ 0.5-0.95 (%).Pat = 71-76. Total, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 68-85 + 71-76. Total, triple inter-annotator mAP @0.5-0.95 (%).Ten = 68-85 Figure 3: Corpus Conversion Service annotation user interface. The PDF page is shown in the background, with overlaid text-cells (in darker shades). The annotation boxes can be drawn by dragging a rectangle over each segment with the respective label from the palette on the right. we distributed the annotation workload and performed continuous quality controls. Phase one and two required a small team of experts only. For phases three and four, a group of 40 dedicated annotators were assembled and supervised. - - 'Phase 1: Data selection and preparation. Our inclusion criteria for documents were described in Section 3. A large - effort went into ensuring that all documents are free to use. The data sources include publication repositories such - as arXiv$^{3}$, government offices, company websites as well as data directory services for financial reports and - patents. Scanned documents were excluded wherever possible because they can be rotated or skewed. This would not allow - us to perform annotation with rectangular bounding-boxes and therefore complicate the annotation process.' - - 'Phase 2: Label selection and guideline. We reviewed the collected documents and identified the most common structural - features they exhibit. This was achieved by identifying recurrent layout elements and lead us to the definition of - 11 distinct class labels. These 11 class labels are $_{Caption}$, $_{Footnote}$, $_{Formula}$, $_{List-item}$, Page-$_{footer}$, - $_{Page-header}$, $_{Picture}$, $_{Section-header}$, $_{Table}$, $_{Text}$, and $_{Title}$. Critical factors that - were considered for the choice of these class labels were (1) the overall occurrence of the label, (2) the specificity - of the label, (3) recognisability on a single page (i.e. no need for context from previous or next page) and (4) overall - coverage of the page. Specificity ensures that the choice of label is not ambiguous, while coverage ensures that all - meaningful items on a page can be annotated. We refrained from class labels that are very specific to a document category, - such as Abstract in the Scientific Articles category. We also avoided class labels that are tightly linked to the - semantics of the text. Labels such as Author and' + Phase 1: Data selection and preparation. Our inclusion criteria for documents were described in Section 3. A large effort went into ensuring that all documents are free to use. The data sources include publication repositories such as arXiv 3 , government offices, company websites as well as data directory services for financial reports and patents. Scanned documents were excluded wherever possible because they can be rotated or skewed. This would not allow us to perform annotation with rectangular bounding-boxes and therefore complicate the annotation process. + - Preparation work included uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], + a cloud-native platform which provides a visual annotation interface and allows for dataset inspection and analysis. + The annotation interface of CCS is shown in Figure 3. The desired balance of pages between the different document + categories was achieved by selective subsampling of pages with certain desired properties. For example, we made sure + to include the title page of each document and bias the remaining page selection to those with figures or tables. + The latter was achieved by leveraging pre-trained object detection models from PubLayNet, which helped us estimate + how many figures and tables a given page contains. - |- - $_{Affiliation}$, as seen in DocBank, are often only distinguishable by discriminating on - Preparation work included uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], a cloud-native platform which provides a visual annotation interface and allows for dataset inspection and analysis. The annotation interface of CCS is shown in Figure 3. The desired balance of pages between the different document categories was achieved by selective subsampling of pages with certain desired properties. For example, we made sure to include the title page of each document and bias the remaining page selection to those with figures or tables. The latter was achieved by leveraging pre-trained object detection models from PubLayNet, which helped us estimate how many figures and tables a given page contains. - $^{3}$https://arxiv.org/ + Phase 2: Label selection and guideline. We reviewed the collected documents and identified the most common structural features they exhibit. This was achieved by identifying recurrent layout elements and lead us to the definition of 11 distinct class labels. These 11 class labels are Caption , Footnote , Formula , List-item , Pagefooter , Page-header , Picture , Section-header , Table , Text , and Title . Critical factors that were considered for the choice of these class labels were (1) the overall occurrence of the label, (2) the specificity of the label, (3) recognisability on a single page (i.e. no need for context from previous or next page) and (4) overall coverage of the page. Specificity ensures that the choice of label is not ambiguous, while coverage ensures that all meaningful items on a page can be annotated. We refrained from class labels that are very specific to a document category, such as Abstract in the Scientific Articles category. We also avoided class labels that are tightly linked to the semantics of the text. Labels such as Author and Affiliation , as seen in DocBank, are often only distinguishable by discriminating on + 3 https://arxiv.org/ model: qwen3-embedding:4b uri: http://localhost:11434/v1/embeddings response: @@ -114,62 +107,59 @@ interactions: - chunked parsed_body: data: - - embedding: 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 + - embedding: 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 index: 0 object: embedding - - embedding: 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 + - embedding: vjbBucCdJzxRgR89nK6nOxEI47qRXo8982YhPaDnarzYlBo8cZEUPDjdQD38r109DmHOOpElGL0rzB+9dN+SvZQ3Irvo6Ze8Nz1kPBE97zjXXqu71gPAPCMDGryoO+M8OXlsPK5guLxRe4+8o2GYvBcDpjyPerA68n/LPNdXQr3fqdw82ISqusmuI7t+y0+8BR+PvGlyG7v171i6AfgNvXwhkLwv0BW92j+nPLawBjx14vg8xJiGPOVIqDtZxr68aGFMvHiuFLvOj5g7JctSPPWpVr28/Fy8w88WPT4B/rtvPwU9QbCKu0jSfLwVEgI9MvY5PJY67TuOlGK75DPxOxUZD7wGU7S8IWVKOhJqzrwOop07uliHvF6yojwg5hW9c0cPvDbAZDxt6KY8EZjPvJCIebwC/Sk7hrF9u4XaoDvL/d+77FybO6uxXLwIhnO6okuqPMULq7xQnBo93nhTO65SO72Tioy8v36rPESL8jrOs5S8oikzPASPZrutbRY8bT5Su0ti5rtpaXC8n+NounNktbtvglC8Cdp9PRfKPrsybRU9gkafvOi6oLzfly68tL8NOoWjg7sx/YA7tMatPLbCU7zwXQ49FCqnPMXzMbxS0yE8Slg1PT2Xzzjdn1g8cxBnvEy/hzzNZgi8iZKpu52sojwNu5C9M5GJvIcNpLzEuQA96JI/Ol0S3DyJ2RC9S3YuPYADS7yq4NW80/aVPIa4GDsdsUK8yQgTvQtG0zxOAXO8kVeIOlGeKbrxHhs8k+KevAUjyrwnDXE76oNdO5RN27o3cvS7O6ugPN9Kb7wKgdQ7sH8PPAnymznNlhg9ujNFvKuYjzzp9z88HhfAPP3/Szu/Fak7rmyLvKWR8DuG+sA7MeZHPJ60sbv5Hi48HGHyujX34LxWBGo8HMczvFvaB7xtIXu8Wo6qvBnXBTyyCsi8hsMGvBHpqbzh40g7TF8Bu0wCET2QcW493XCfPNMAqDxSmVC84404vOl3BLy05Tw8QMETvGKz4LlMlpE75ntIvCLmgzyHeF27OOicvLGycbzW0JO8GH7mPMER+Dy6l5g7X3ukOqSp0LmPYSS84wRTvKPhm7rYMzY7+kczvPUGajrO9DC8oqO8PNIxUzyL4HU8fjXoPMfGMzo+zo48BNKjvDeF5Lvhp3o8Cg0FvTcWFjyqz0U7oluHvFFelrvUmZm8WBgLPGm3+TtWY+y75sSOu9nCkLxxSY88hp7/PPcPnjvQT6s7w0mqPK01+bz45om831pPPMG/dTzhwBW9C6NtvKfPwrzyYcO8JKf6O3yIoLzqsbK8uzLLOxspD72CAbu7wHTEvI7ncLyqJxE8EHwyPIy+GLzEFQm9E0qyO8C/JrzPzm69ifsVvPGH9TuvPtu7N0m2vLCAhLvupIS73noTvNolET1+Ui88kJ9BvTO1qTsOfSc70iPyPBF/57vSskg8GJosPK1+BD3vAMq8hikXvADbzrmp3ue6UMctPJlEpLvEDU88cujVvMzwQLp70JS8+dSDuRd3/zweE0O8zqrjvOJLMbsFrng8rFn/PGDOq7wWxCc8aKz2vC0uJTwkfLE6kgSWumA/nbiWgEm8EFGzOfQdsTpbHzM8JpdjPb5/OjqNFSI9/IVtOotqpDsrg7A8MTdQPIQxJbvOtcI7o3rcu/UxwTvebco8r/juvKxfWDstLvy6EgSRuwvii7zjdPo7I4Myvbt1CTsVfLi8HGwTu7dOozzP6+c8vTQIPUIgMroE2Vk6FaYxPIgukjwq2HW95LYXvEHkTDxBBxK8PqK4u3RCtDyxfiC89qjIu0Vua7zDNAE95uzEOulPUL1tm9289VpZO4P6ODzZzlo6cxeFPBFe8jtfp1C8r8AFvZ3yW7yn66e8gHm8PD8o2DsmX3c8VD9fvE4n2DytTRO97+55vK0SqruANYs7/WOzPHNTTr0JnwC9kolTvEsOrjwNAA88m8btvHT6Grx+p8o7tqQPPWpKsLzLiL+8Ki4KvMWZRTxYeX08bVgCvJYlczz38YA8lfkYPaplt7w3Rrk7R+WYu/lTfTtArhW86Loivc54OzoAFgO8sivHPCceMbwoaa47dVMSuwqj+LyfGaQ86zVGvK4fxztM14k9UlUCvZ9/1rzasZ68x7K+vA9XdrxgrTI8YucmvCMl47yN2BI7hvQEOzNDxbtrTB49n0e5vGNpiDyinji8wXdPvX8JBrwtepM8CDwdvFrjRzsDHBI8kqvDvJatOryyOLE8Q7oOPIb4VrzBpZw81QmsPGlWRDp/xNm8eh8ivXwq/rt0a6I8tvTaPGVwsjzDojI8/dSzO9m1uDvdU5k7K0bzulO6Q7z/MZA7MoWZu7DX9zm8Mws9A0Ezuc1nMLsUTPk7QyIIPFMoRDokiv07tA98O3oHvrzkMB48MgNqvNTa07zZX9k8TQmhvJU1XjvTKxi9LW6MuDP5Zr0faus8AJxHPDcwubztJTO8/bhEvNEM/boPZde82nE7u0NA1Tx1pvG7ZrW9vAfUFj0k4TE7D7MdO+hOmjwxTpC8ostsunoEJjxnW108py8au3/q+ruv4fo8VBohO1K4pTzoPK48WsOfPOU3ozyGH7+8YZzRvBlZEz3QAYK8CE9OvbI3UzkR2zW8Yj4XPaXvDD0lP6c8Kxk0POCNTjzNgSC8flXIvHocVTs97oq6XCKVOlkUlTyIKRE8ENDTvFGkPbyi9d47ltsZPKUKyDs5E2+8/zA1vN/qCzx26pm7HXxAvLkIPLxGG725mB8FPEzbxryivS68lznBvDh3s7yCx148LgezPP7FLzlEya+8ELu9vFg+37oC+MK7wToNu3f3njxq94C8fyM9vWXJdjotKMq72fMOPPtnFDyf0jk7i7SHPPtQFbwPZiG8zJSvu8mxrTzzZwc7WUcrO6wehTw0swC9Hv6MPKBN0DuFGRW8baaOu4gokbzBVZA8yRIau0fjubtOjwY9zBguPMCsgbwznga95TyLPGDrHj0pDQU99Ci4PPeTkrsfafE8Lj0OPDKjHb07vuu7/Sasu8sF7rtN3u07gx6cvDmZzzs/d988zpCZvP5CPbxBXIG8IfYOPAPi3TsDEb48IaJ1uuYbDb0Kuok7NUITvH+ibLyR5tG7mw+GOWMsujpqODG81UF7vLIikzwzrnq8Vz9LO809nLy/ahw870UivaxQJ72baww7HpPZPG9l27x46sq7GcoKPRrFObvzycy8ozzpPBwPjbu+KJM8PiucPJVPgTyUmxo7+Tmcu4/3qjvK8Z68aJuUvH63Hb1ewZK8S1+bvGxshjole427m7TYPBx7Lb16X/W7tnj0u/bcrLz6I4M8V96vvK8gwrynSYE8AYBPvF+fCTsYLmA6BY/3u/5Hubwh/Z68zn3rvIE5uDyWEiE7Kn4ZONIKnDwtjBm8zlSJPOFzsLvaIzY90acPOZqvu7w77om7nnz+O0QVC7q1CfG70EK7PI4T4DvO8gM9GrL8OgvhibyLnpA76PuSO65LpTsiyCg8xrpMPE4Asbwj7zo8FiSHPIFxury0Mda74MdpOu9llTyysF493UYRvVQvL7yE/cM87KyYO+swMDsBgYA7dPHIO5/dMbxfZz+7OlXGPBMj07tDghM85AZWPJvQXDz2gTm9O1OEPNHYm7wBCzG8URL9O6yoZTyhOSA9QbtUPBqMkLuRi5o86xkpPXewLLtuA408LsuHu27tN72pVyO9woDxvE920jt165C8yJ09vPI/irzCGY07VfGbu38SjLwIOtW8GZ1BPBvAnTyXek67FREMvVIUO7y+14Y89MaAvKs+Mb2vTdC8jkLjO8bl3jmNswM8MuaAOuwJ9DwDD327lvEquj1m/joMj6g8pbqAvGobqTwQO4a7kdt8PToE8rviFhk8pfbau3K0+jytu6G7kCMKvOWhNDx2l9y8LNQsvYmTHLoHY648VoWAvK9btjtzxoY862AzPMX+Cj0a0Wa9xP30u/7J7zztfoG6XVr2PFJCjrwwlnE9Sx2bvIZwJr2I8G08ekcDPIoBdjx11Do8siCNPBZkwbycULQ8HqhIvdEGQburupC857eIvBPEaz306Da635p+uyK8O7wD6Ei8nq/Iu49eGDxZaGk8QZHqPB1bvLovhQe9uRupvJrVpTxC4Ii8xF85vCIQHrlTELM8iZomvJpGcryQ/6E7XV2ivMETM7xOmco8kx0hPLz2kTxia8c5G/RkPI0xaDwpXi48NICFvEbbbTw+kdG7nUHmOuG4Njus0Zo8vAWuvMUjNry5fyE9ceFGO1wITbsy9b48RqsDPe0YAL2kyd88L++Ou1aFDLytwJw7zKa+PHbKLbxwCoy84n7UPL222TzvrIU7Zn/5O1aQ4zqzLWQ7yRVQu1KblTsqaFW8uHMzPZJhFD0k+z09T70APZwzED1Hd9Y8ygj3PECffrxT8qI88liCO7wfl7yOb948G/Y5vXwd2zzMwOO8BgSvu9Tw87uUMOk8TBiduwNioTxPTd27uv0DOx3lczs6F1o8BiDRvISYkTxofmA91Munuwfm6rtg9BY8ySR4OnO8PD3efIA73pMKPcDhaLzfj0I8bkcevBNafTwhjzO9UVckPEszlrx7jks7VDa9vBE1kTo+rY+8mp+aPEnGkzzKjFs9r8l+vPeKOD1FxkQ7PQAQveFT4DyyYG68pDSgvAvnZDx+qfO7xg5gvJ+ZbTubqVE8E6uLPJUC87uHZxs8wvauvBgWWru3G+G7ydPVOu6vGztaWxk8IkPGu3NqwTvZ1ra7O7EDvUKOKD0dkAO9mI3FuUhpOTwZtAy9wd/NO999GT1T5CG7M03DvFxIJrv9kp08WiiMu3KJHb35eqK8Kzd7O+VZ8jzixgy9o3bYvB7s1rttExI9o092vIuzeTwqYxq6JikRPOthtLxc27W8s9FMu8a7cLxWX4q8PIFtvKT0HL1wb1a8Ta0DPQjz3DxoqNO87231OoVQdjylenM6J2ANuNcqtjvTHPg87SKXuy+9STsIz648qakqPGnuHz24S2o8qpqrPKYOIT08Qau66RzzPCyL0rxEjx08Rx/QvB6V2Lx9Aby80TodvVs6B70cGgS8wUlLPGjN+Lp9bWo8zbwaPOJW4jwXdom7JdApPV2NzTu1LtU5tsrbPEDxk7yo+Cm8ob2hvCpIYDppYB68SgS2O+SPxLtRHEU8p5bju9aaebwOHoc8Rxv7uz00bzq075e70bwhvUxhHrztBXO8VNkbPKR1Ab3+P8K7NqHWO+nURjyLJy28g7F1vFtQerrSDjs823OpPGZuwzudK/A8Hrp1PHxp0zwUlKU6LMvQO2TJU73iPUs8JnwxPJs/Dbzb8+Q71kJ/vPEH9jvabM67xL0KPE8qkLqosTu8fRnovOt1ejxbcyI8JlYKvUigQ73pRhw8W/A9PKQXl7zAuR09FsyWvKFfTrxLOj08orWkPEEOpLt5dqs8iGB0u4S7ObweGKU8gNGlPDHJKjxGSRk9etknva7FBLoONB09/Jzeu8oppTwBBik7o/uFPCzmrzpn/Ly7GIHoOrAeRDyy3Ia8ZNHRu5X5hzxMhn88hSEgPFmr6DnhbhC7hyokPJO2Z7wwOBQ9TdM5Pc/VIzt4QuG8eQAUvLYs+Dzd/g09w7spPFyoVzq4ZpW7RkovvENjwrykevi8zbz/uT4YJDzlho28SSGcO1TojDzPlq68Iu+1PKWReLwyRZm8R3YbvD18oLzAuZq8te/8vCaA1byLog47K8+JvJnSTLvpDTK83iroO67xKDw3Okc7wXyxPDRIEzw/Eac7D8VXOzuc9Tg7XTI8RhEXPbm6krwrNhI91bf5vO4Z7rwTSrs8h0ILvLTkHbzfh2C63NkOvC/h1rzajuu7uBnFvGA5QLzSbZU8yqgKPZu6mLw6fy09qvPdvGBTGLw8Hvq7Mp6auxhfMjxe3OW8iQAfvYJ7C71KCFa8WCbhvOoViTwb/qQ8egMHve6cyjz5Pxg9uGBouxGw9DyZrR08yhuIO9c5WDzYG6q8f6mVPL0tXbyw7FM61htDPNbeOjwss7W7t81KPNShhDtqTae6+98tvIQQIzzPaw48hOz9vDypbTxr3GQ6yGhCvKg+sjyL8747CjbzPG7K0rt9cAe8p3ybvBgSGbuxjB08EXx7vCu9Bbyrv/k6Hs31O87hPTz0IHK8T6aBPOlIzLocTrq74qOpvBcBIDwZE1k80153vMW8B7yPdgI9H0qNuv/Z37xSG+I8LwPUuigh/bsKDSU9qnCEPH8lAr16i8a8dTG5vMMxqLzHvh87Pdn4PBoS9LxOSw+9hcnDvCxNL7xrgWk842Ujvb+KIbz+NMc83cI1ulEyOLwN7Vi8e8zEu559w7wLcZO8fWeWvCSJv7xhPXe8JmoPPI8gbrzcv827alUQvZm8Djzs6XM8hRIsvJLYXzxZr+o72aj4PNFQUj0fb8k8DVK7u1UMRzxKGCA8s5IzvF+7qzyBUwy8mHjiO5uMmLyqTpm5QogkvA2X0LvgReu7cjK1vIM3iLxE65o6mg1BPMbJD7vtYY27/BsjO+XuGTzY97o87OjmPLcAkjtadOM8M4EfO2wHHLwY/Dy82DffutDRxrs/LIk8dUATPBz+rbu/B2E8uD8rvAkKgLy4wyo87xnavEFnvrx6EQW9XIOqPLM9PrxNIoa7wYlUuy/v2Lv2hqs8rSrZvLgvAzzB5Cw9lTPlvE8UizwBjxu9mzjLvKiWMbxWEwA8UeY2PYSOdDrSAja8rT02PLneODx3VIm8ShScO8bPpzxWnzm8JyRVvFbsg7l2H7y7kGtIu4/eXjwJwP88Cq89O+1fULzQ8LE778wBvCTy4byTLj68U8KXuxY0mLyCoQS9PoDKuzWNhbsr0gW9ROAQvcAllryjjNg7LNPWuThYCTwKzuM5TS5RvILUN7taXhY9JbrxO7fgfbuLXZW7IDdYvXUL+jweri27+v+8PJNXnrzAvIQ7ClQ6vP/Gizy4IZ48DMswPWF8d7wzm7c8XRhwuxtNi7wEVUU7Hw7hvG+877qh9pi74iHiukoiSDva0eG82ieovI4qWbyfLZW7eonTvIucAjokmc481HO/O+nyqjzc+qy8ZYSCPPEN2DxILNi74KoLPW2Qbr2jwZa86TTDvDm4h7vLxq67ZMRXvPZ3DT0TJgG9l3h8u2lM0zuDlf28C8waPScDWLvD7YE8HhElPVvHB7ytR3S7N3AYPFfpyrzRKdW8r8rgO8J/1rqvS6G8MuPRPECurrxZApM8uwRFvJmlvTxxXWU8bVPVu956ujxcK1m84CIDPBL1Gby4qUI8uoX5O1k+hjlqKYO83FisPDLiHLyZ8tw8XyBYPDPmjDwLJsG8aefYPMog8TzVW0895G01vdesFDz/IaK8szqMPJi+U7u3tLG8UncVvfJ1njsvH/s8D+plvIOqJT2x2we8+5jhvL4yeTunn3C8PSELvGkLQrwAlu07xVuOPI6NL7wjXRs92+wDvHhWubztn/G8usZmu/dB0jw6+Fa8RW5nvEK2UDyPgg+98UtVPOwQcbzO3208feMqvJ3rkTvxnuC8XjRVvC1OWLx2Axg8uZ5qOyJdC7vGJKC8ftf4O6Kx/Dtkz7i7pt7lvDvMBr2bv4S62emZPJdAlTyavjk8bIMEPMOPjjwgL/s8XRVUOy+dBb0YzBY8Dc8IuwFudLsj3q28hpCFPAGxFLxOq+m8c1y+uyFrCTw8ySW7aaxZPFJsabwu+U09eOsLvCGP7jzPBDC8tI8SPaVT+TyXQ1Y7eTkCPY9W7bsxoJw8YxjePEM7RbxdqPe8nXI0vOuLvrqwB+O8QjlqPAB5SzzJfQ48s9OhO1WEiLzkrQk8wQhmu8JgdDwsBEs8SPx6vMMEvzuQIBs8DuuVPFGlrjzdwAm9/OyKO6L3PbsqCJm8gkddPJIuEbzN8pe8H4bvu+qK8Dvggp68CkMXPVDL9zr1cem805QGvfQSkru55wO9xghzPFY5M7ynxzO9Qi9Yu0M0SjwRkYu7PwptPCvKiDwFvJ48F3rwPPa0AjylZ5+7zUWBPIILO7zIf8y8SrMYvBnPIjwdhAU8aG06vP43O7yFboW6Iu6rvMMGKju57Bm9p1kYPYHy0zuS9KY8Qz5KvGEoUj1PMXA873MKPFAjHDrllQM9va4HPBVkSrte9BQ8GXT0uVl8Jrw6JgA9j2Y6On7trDwAKcm6GXQSu2PQDDzQAtk7a8+2vHVA9Dzm8uo6EGGAvMeU2zsDNwo8z1r5vMmrDDzImWO7wvUcvc4VPzwrmr08u94DPUue7zvH9JS73YSSPPl1Bz1Gjf257BbeO8me9rlVonq7hIYEOq38EDzM5qI70s5oPMzIlLtIS4Q85vuBPNrMBj1ZTY27d6TiO+hKLj1rDbW8lHOWOyTa/jyK7jU8keZcvB6SqToC/Oq8P1aSuzTodbzseFi7GWvzPIyiG7tLyRS8XornOwB8ozzcVCa8IHDnuUA32TzHw3y87vtZuzpiyrtAxxE6PlGBO16pjbzdyQe9DfP4vO4G0TwR1h+95oujPAcXx7u3uV657EkzvN2akDy3YBu8oJJVu2d997t3BOs8jB9VvAUzJ73VKtk7PxsdPEE7ITxkBNE8Bm+DPDisNT3zNvQ8NqzQvOM6DjzbKpq85cxjvM7ehrwD7km8dtH1OhDs6TysQ0a8KIaNvKQp6TuPw768UZOevAoT4rz29I88GhH0PMIENbz21ZE842O0Omq+NrtBWra80LOLvGpHQrx5VYA89lM9PEZzfzxTUBK9o9EhPU7lkbwzo6I80AugPC4wBbxTa/48/xSCvDYmIbwWEe07LNrWu5GhTDzbpSe9fyWCPEp7njxQ2Ui8plGCuR4f1boA2oi8IqR7vC2w9TqZV8O7qWUbvW8I3jy+yGq7oFCiuZauojxogrK8Z/9/vEk0Q7xne3u6h03hu+AeGr1wirG6/KO2PNN+8ryXbAu9TE29PHnC1Tx+40I8/XWsPHpECj0feTY8ZycOu0taAj3OQ6i6Uy7HO3Jq3Dz1DdG7lQucvPXqQj08GaS876SgO79RULwbPsy7uLQ7PCrWWbyltNO8VhXUu5rXgrxYKdm7gJjWPBOkXTwjquy8GKC9O8kBxrrXedc8CEdkvfOwTzxFpIE87LeivM0IiDwOlKs5grvnuoQylrl94tC7cY6gPO6CaDyDBti8H82SvKlHZ7ujB1m8pv8bPduOGDyL3X88T05uPCFKDbxltZY8qyGWvJIHOr1mtog8QR2ZuwCy+LtD79A6kcarPF/rkbwDNiO8f4HCOJ2MTLgJHAA9jsq4vBQpQrx49Yg8sWsHvBzA4TuaX686kMMaPL3yirzOIYo7hCiDOq2zb7z2Fq+8KTchPDURHrsg9Aw8sCcMu4q1PL2ZYQe9Vg6sPIpGZbuWOqq86aNEPGuwET0CEKi8ALO+PDM6tbo2w7O3t4M2PFdnmjwye/O8oevfvMNxQrz5DTk7wkVAu/FdrzwalCE9G6m3uxSqCrxkdL+7dUaUuzRh3bxVK7a8Y6SDO8LLAjwoqbK81yEhvHXClLwqGQ691KWLO2TTCLzV3ek8poXAOpgD9bxzQSq8X6WEvFPfhjxvTgw84L+dvNZTcrwjera8jYKMvMWvlTsvrUo8a2OWPNdVRTvmEU08bEZgPC7V/byIlqk7o7+zvNp7tbuHQYG8WPbkvJ+O67t0AgE8juhQvI7I3jziOhU87ybNOw1LabwsWFm8LulZvC5FxLktbfm8ffXDvCv2/7uNpQQ78K9evPEfDrzJ5BA9cY+du3THUbyilAi8pOlPvHnh4TvPfqa65tQZvd17MLy1Uxu82PhfvOflIryJjQI8sFQMvbURCz2Evji7i9uIvM5PAzz2oY27lwrBuxLzB7shMLG8J55Uuh2Vs7yGoAO98UQbPSMUSTxcnDW8WZf1O2GF5LyCa6S8LLIhvKzJKTwgevy7+5qpOqDI57znmiK7ET4cPWQYIz1pJm88GwDwOzlZ7Dt++ak8G/D9PEF5jTyuRQY9TXNbPIW9H7w/9KC69EVHPfvjXbzgKJK83EYYPNxOgbvpp8k8EeovPC2HhrzA5Wq8g6r+O7Xlnzx/P7o659Q1PDdeyLx35OO8XL0svSjtvDzTECm8XkIMPTvhsrxb6II8tN4sutcmYzs6Z0s8MTFavBuigzwS0907Cbo7uv8g2DwCO4E86XDxuqD1+bz5pdW8cQMsvG45TLrbkvI81pmLPIa+6jzhbxa8YOOXvORqkDz5nYy8EVMku+8yXzxH/Xi8zeeivC4bCTwdOxi8dq4AvN1DhzuKKiA9fSP6OsJ/Gb3haMa8yd5DPUgE7Ltif7M6AK1iu93maL1z5Cw8LEXgvAQ6j7xi/RC8NDirOtI/BLz0inW7690DPYoicLwaaty76yxWvCmfPbvJoWk7pVCuPKANujtYSR27K8xzvIdTNrzhiCK9R2auPNRUCruPxmS9ph7DuzqrVrzcibg8ix6Su0qVFTzQnIa7EMMLPFHHhrwCy9o7+lkgPFPzEjtSzRS9eYyNPBs5xby/FoM8yohEuwa2njx5ol68tJz5PEsC3rxlhKk8HQuOPGH5djxO0VC8ocIuvbQd/TtVxgg9wlk4O5f8Uj3vfq08Fc4EvMzs1bzF2gA8U6r/vEHiALkfLfw6MEJuO8P4wjxT5zG8elQDvJvFwbxuVPe8vJKsvGkFtLxxlZI8wJigvP4p7LxPlDw8xtukPEGmqzya5JS8Sil6vDdlfrvy/He7a0dKPG4KaTvnTUO9S9mbvFPMgzwBZFY8TuHDOz9mpDyF4JG6/r2KvOHsLrxS8FM8+b1nOwoQ3buOHfe8/SSfvCCBq7wD7Me8HyIcPSMTyTzmaR499VemOkSENjwKHvq7Wh8yvBx8drzFpxK8BC1gOvRaO7wMmCc9wiVlvP+4WryB4K68EB9ZvFyxwjxC+Yo8Iq6cPBl99TthexK9HHMvPahcZDxRbL+8/PO/uiMUpbwnuIq8hy5wPFtgbzx+O588uwKovIFgYLxE2EI8+5DBOwzwnTt9nMQ7sugfPPXjELmuPA69zzyfPIu1Y7zShRK9rUuxvOBvv7zvu8O8hi3WvGWaBDv/SpW8eLmovDYd/7x2xom8kCifvIpkkTyjfsu7xZjePLe7Pjxq7kG8QXcLvRIPITzDa7G8nE+ovJFJELwX5O48krOCPN+bmLzooDg7Wr/ePH71j7xDT4y8k6BTPKD+WbxNt3u8P/6pO3in5Lw7QaA7tra2u2T62Dyn1me9VGjSPNuLGzwVItg8D+feu9rpRzx8rzc89GMyO6KAHrwdrnS8PRxvvMianLpvxHA7Hlm4u6L9KjvaTXY7xydKO40RfrvIlM68sPTwPNUDB7zwhWg7nE6/PHhnIzwgc0C84i7vPMZL7Tp9Xha8nDyiPI3N9zyibZw8JbFUPS2hHjgakpk5zvgLPRT9irtO32E8YZFluqeSyrxvibU81/ujvLZHh7oJXW67/ui/PJ0sUbzejie9xrR3PDkJBD3XMKu70u/cvJRJnLy7xB+8tWlDPJjMRDwGM5O8KHDzuVW3LrwLU7o87kDhvCGpBz309SK89PcmPLToVLtDuLC8C/wavCLj/zqaUpk7TLuEvBXlKbwhCDC8VDgju1i5fTys+7I8wEuaO0/5YTw4Acc7H51pvZfyGTymNA87oi3TPMWzDr1S1eS6Y7gsOoWXA7zeFVU8IaibvBBRqTuN1ZY7llY0u9rzUDzgxg69gLjTPJPGZbw0m7i89dFMO2HKmbw1WEG64emnvGFAvrq+erM8JhK5vLEEHrrBXfM77xHBPFy4ELyw/js6sWtVvJ8qIDwjDEI8ebx4PMa38TwUX3s8hPyNvBmllLqUwWO86PYMPZYTGDyaFj49MA8gO4Ubz7y9swU8GXqdvMfsijy22xe8LeOmvKCdNb1a2YO8UdGrtx3WoTkjgBy8ZlgeudhWGD3xb9q6eJTdup1s4bxLv7u6OJI6PAelsjycU2y8CwB7vAIXCz3DBvU83pWFPJtLrjxqGOO6B/EnPMbsijxxmte8un+7O6TncDwWpMe5xavou7cGA73ooCa8xyI9PEavBTz9R0s8tXbuPPzyV7xF1Xa8TNWtOwzX3byu/za8cgkQPc2ZArxy7CY87vm/O7XShLy6yLi7/lbBt8CGp7oIVIU8eb+5PPZHFTwmxPI8myDoO3cUrbs/KHe80wp1ukD+R7zfWS68qbqMPLxuHD3jNEw8wbbHvLNP77z8Ugq96/PyPJk3FT2vtxq9U928O2oiIrxbFCI95tp2PMuA6ruy+7k8XkexvBw5drwx4wi8WbuEPKLerTxZIWQ8jG0IvCb3wDv3/5w8CEYFPKOjizz7HKo7ZV5ovONof7wfsBc88tYpPX8pmzsG0KO835i0ux85nLqlvqY7G6yFu4Yo+7vgfbK7hF7Iu1kgojz+Ccs83IT+PI7eErw2qvm7XPx4uoaHi7wMUES8bWK1vI5VAL04Lme7QFjQOwIBqrwvW2a8+w/tOwhJ57vwCGe9nRARPKGlTjxnvcC76tAjPGw5ZzxX8Ca81lm3PBlcNz04Xbe7wgApPM5pkLsbOdq83/HCO5RR9LxipLo7XETfPJ+WqDqxpD29xQtIPd2B/by/g8e8CkyMPBGjbryV2f48yqbRPPuGwDxNgD48RFszvD849zqB12W6wj3qu2ZB3DyILhC9/IwUuhw/YDxwIQG8l1ltPOhgobw5hRA7CNqHPJnNjTuw8Yo880rgtyobNbyB52g8gio2PCGQLzyV7he8+v7Pu81CQbhucBe9ZhhSvHtEpDxsSr88GjA7OooQK7qm4NS7Kg6EvOT7pDqwFIi8+SxAvFWzCzyg9qs8CNNnu673qLxPOGg64mVxvKMCuDy/Ov08EIpMub4f/bwuPNU8zdfRunI2LDyDRYS8jXQ3PAGSGjpe7pQ8k/N2uyk+Ijw8BKS7rxYfOwd7aDxthHI8AyH1PJRYd7xDvak8DQ2KOxFg1Tpuk4a7Nf0wPBdw8bxmjwk98j7NvPmQBz2uoii782ABPOEIZjsQSHm8BMziuvKIAr2VSLw7F3WZOu7F/DxwHuQ8lzaBO1TACDw0PTM7SPBcPFIvpLzBsAQ7fzMhPK2wO7yyno472JnwO1VVEj1ZDe47kA9kvKv9jLqAUCC9MJcdPM/xRzyy4zS8Cn8NvaAqujzM4xg8DNRDPfpAQ7yDzLy80edMvKQScbwp6w68SktsvElPQbydRxa9jUMrvKv5obxf0kY9HTZ6PIG017oPGgG9cV8LvN4RFDyRgxW8CqJUPH/5gTzynJ28jI+CvIxVqrzN5Cq804UvvMN4JbyRRpk76LkQvC+UmLxT2JE8SJudPCx6SjyDYni812cHveADGjywr8U7UlaBvPxuBjwYjX681RmZvCuAmzsCAIc8TQRxvAP8pjs0kCY7Tl3tvDdAZrzOkio9cr82vNvX6jutvME7Lnl9vOIkDjv97ZU8ThaeO056qzp1AfU7MYXruzFsMbyGoyO9KqNNvA3UaDwrHdi7n7cAu84TTLx/GZu8QuFkvCOJjzw+lYC8K8wkOaRDJLzoqeE8aJ0lPJdqsDxKoII7syaNvPDN8LuAY9k89nuRPA== index: 1 object: embedding - - embedding: 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 + - embedding: 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 index: 2 object: embedding - - embedding: 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 + - embedding: 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 index: 3 object: embedding - - embedding: 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 + - embedding: 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 index: 4 object: embedding - - embedding: 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 + - embedding: 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 index: 5 object: embedding - - embedding: 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 + - embedding: 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 index: 6 object: embedding - - embedding: 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 + - embedding: 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 index: 7 object: embedding - - embedding: 2ruxuf3sGzybfC09T98QPIw8yLppxXs9bRw+PZqPB7zb6jU8ZZwWPOHTYz2GHEk974N0O4NCQb3a1xK9BhKEvagpiLy6zEK8i+6/O55mDbphEIu7spzDPJWzu7yjPus82bsjPFX7/bwq7KW8iOHzvBZRmzwaOgk8FVEiPDR+BL0KZKk7p1hzu20h+jeTM2u8puapvMPc3bryDU681DYKvafYk7wBaQ29yp5ePNIOyjztOz88RZxZO+rs3ztr46S82EGNvDM2Wrq0GrI7qzojPKzOgL1xcYC8+3JdPYAbjrulmd88KHHku+Apd7xCc/O6xJVXPJZQ7zsrZ586J4IbupRzl7slZL28A0C0PE8y1bwPbe47udcyu4gvdzzTcfu8b1dTvLBA0TrSA7M8fGKavJJOe7yvBuU6WSg8POszCDtK1Y28V42rPBid0LrvFA89Eky/PBQ8zLt0uRc9fx8uuriBFb3QO328Z/LAPOYwE7xvC1m80SVnPEmKELo9Zxk8b6QcO/1PYbwHbDK8lPT9O5gvXLxqIam8YJIgPYzjhrxH3SY92T0OvBqOt7v/kWi7aGTNOTdE0Dpac3s6oH6CPKC+uLy28AQ9h4rDPAV+UjtVtyE9lYALPZt0+DoU3FQ8xo8nvBoBtTxzQzu8iaNtu54N+jybLIG9UsuCvEjqFrtAShA9VyumOk8XvTwajRO9Thz3PFBNm7ylPcK8mIhpPNkyw7q1omK7UqrvvJe1sTybr7C7KcEYvBsBirsw5va7Uv+KvICxCr1eCJU7Yz9UPMsLQbpMhZe6XpL3O2cDmby1Eio8Q6KyPFMnIDwr89o8zpHGu5Dn4TwVetw7uLqiPGaNUbyqL1W7lfaMvEXtITvtK/s6RuhkPHqmu7vBxGE8BsCMu1fTdbyDB5c8vQ25uyT88LseAJO87NNKvEGwy7uhIgK9wNrMOhBprLw87si5CHLMO/XILT11WV49cc51PJM08jwVHEK7FqgZu8pYOrxsLSI8KdOCu9rqRzyNJEs7VeY5u4jonDw+BfS6h50UvFuzRbyJD9y6jr51PM1+BT3jbRI7P+KdOzaUo7wWrQ68pJlnvC3LQTzl6lc8Aczuu1JKsDtKRGG7Cu/PPJKxPzyHZw48l0kFPDgCuzpDAZM8IkTJvHi4w7qIkaQ8tn2nuxzUhbu+75G7tomZvH+Tr7vtSd683m+9u/qXKzxiDni8w/hauyOSE7xF36c8daUMPRlHCLsjYAY8cGtCPOk2uLym3Rq8+j+lO+HdpTz5hS69qOZvvNAq3LzUCYy8C07nOyOGzbzexVG8WxQqPEjTA702lsa7+3FNvEjX0zqTrX08veU+PGHRgLwP8fe8OyoUPLWlzLu4pDi9CBaDvEEJZbshBna5lT0VvfHpLrwX5Uy8r+4auz/FpDwlqok7FChNvbT8m7v0IpG8FNAXPaU/gLy3WjA7giUQPISUgzzGGqq8hSLfu2G5OLxxtog7NBvBO+ajwDstXUA8Uj2EvDcrMTtX/U28u8ImPF8BHj1ZD9e8vqPcvH0QjDpEPyc8Xj7DPJ3MZLzTqkY8e7u+vDVMcTz3lco7ClbjuRBPCrwhs6K7uayOvK8/kDo93M07M9hePdzoirmTdQk9kUZUO9BBhzsh1iA8BeYVvJd3BruaQsI7N8OdO9t5Xjq79mw8OvYgvGKcpLtlV7s7M+4YvMMhUrw5pqw67sl4vbYTY7vGAmO8e5hMvNawJDuFD8c8Q7uGPChsy7qZjE08eeUWOqxnNzyXNZC95R0evALbCTwzkU+8yLJ1Ozu2gDzSaaK8VFG7u6V5A70+mQA9ryjjOyEUIr13lzm8W/L6uB+bO7v8xCs891UYPInOqDsudAO96tsxvUnHqbzf8ZG8Jz6rPFGtNbsmmHk8YSCHvDy0hTyQFwu9dMSavDYyC7xM0Ds8+MI2O7AuO71BgNm8YDI+vCqxwjzjr188yVLWvA7k8buqd6o7+BsjPQBj2LzJR7M6quxHvL+HtTzfGbs76lgmvKBt2Tw3O4U8kyq/PM/25bzSr8C7SxeDvA5eILs978i73+mqvFBBFjyc6CC86IKaPIRxtDu36dQ7YvYoPFzI27zyT8I8oRO1uz/OWLqiQrA9WHsGvShCFL2q7pq85P4HvXkTArxixKE8W9Y3vML7nrwG46k74DK5u0+JWzsYTw89TbhRvHDMGDvvlM68IzNmvb36bry0hT88tvatuzNOXjuzqga4HZgWvY7hL7xcCtc8OniSO/Pwjry0oPE8yIkYPDG4CTyaTd28BrhQvdkNdbtN5fk8jafDPHlewjxs7FM8XmMlO0QlqDnmovq6IjGIuq8ESbsTttw7hFCKO7F3BTzkrdo8sm84vEP/Mju79mW7Huy9u5g10LpRpgM8GZvSO5DAyLwFFLA7fNvcO4R5uLewq5U84FJJvK7n2LsVZAK9CNslPN12b70kZhA9/wQNPCGEG73gPF28xebvu7eagrs/CIG8RhSeuWn9tTzm3Ai7Gu6FvDF03DxEkby8EMSDu/G13Lt2+fm8hilju1yEPruPHUk8XzCdOSj6hrzkhMw8Ec7TOlWiPjyPDbE8DVfbO3KnjzwyxDe8vJGQuxfozDwZLS28uwH5vLiFZjuqknG8XDkJPc9vIz0L8Lw8wBf3PMMxzzqo1Zq8L5+bvHD0iLxHESE8IPHmO39vPjxTN+08cxCnvHWcRzsfTyI8ph9ZPEq5IzwMbea7bM5EvNuiFTw1Mca7RUPGvBFbebyha+y32RUMO3qKqrwOw328PohpvIumgrwcUjQ82hXcPLQzDTmveSG8wWq5u/WRUDzIFOC6tVe0uXBxG7x7s3q8eMi5vEFoCDxdJ6y8KEDBPNcjvjz7c7G7CdCAOo0Hobox2+U7IpEuuwuojTy4OAk8w4eBvNUu+DyZyxG9tfuzPPZYiLrRY6K6J1IDuy024bz/ES07mY6uO4a9CLsgmEM8CcKVPP49CLzuUmu9pJjhPE0iDD1dA+Q8PZy8POzQmbk2n788RjUWPD5PJr3wcou8qGKNO68zELw83Hc7JuKPvK+jkDys2848eieDuxSmrLu6wTq6pWWnum8XczzPhYg7Zzk8PFbVBr1PRgm8S5oOu74C27w4xHq8O+TYPPUJODzvjmg7Zpe5vD0ypDzadJC8FnJzO+tFjryp0UE8YPQAvVtUT71q2Je7Lg2LPMdkxbzQFb+8rpsPPVGH0btXrPG80FXPPMfDfjwHoLk8FhnrPNxye7pZdbM6yCTiutMMpzoj0em8r2Z3uxl8Er0eDYC8IjTDvAzdHDx0m0G8+dQJPEaMWL31kg+7D8AUPM224LyWXnc8imzvvGXjKb1BAgW7Mh/IO734QjwV6M27Al50PBlHkLwWmfu8V9cBvSAfGj238TE72BB2u/zNDD2/xv45uGt4PHAL4bzDZOg8Znc2PCHWRrtCE0K8mH+KO8Z1xDw59aa7gWnrPPX/4zuqVxg9mT5Iu0WiwryMqJg7KQ/AO/jnZzzep/A7TchlPJypGr3T9Bw7zl/3O117pLzAvwu6LHRpvPnygLs2cgo9/1mKvKo9j7zkj1M5QheEvMk7L7t32KW73VK8ujQ81LwD9ti5mB6BPOKCA7zq26K7HFDXO5wnXzwzliO9HBQ7PKQp4LqrGZe8fTbnO7QsMzxjhfI8joExPKgmmrshvYY8LKYKPQsG0bt+5Sc8BI4dO2M6/7xFvQW9bpD9vFvqBLx+V6+8GKtou+o8zrzpnZM8SZs1vKt4NTyDfKi8T5T1O0CrzDtDdGG7+fgnvY1QkLx/VAg9lmjSvAE8sryEDCG9pPUDPEGC5roMYp87UhqxvK9p3TywUnq8480ju+eM6bkWwMc8Jd1YvG6OfzzHoOQ7QhIvPR9aejmwNKI6BZPPu6/mJz3pCKe8IRU7uuSOqzvOYiy8ZqTAvP6TF7uU7Xw82hMmvQBCnjtwS2k8S6saPEUyujwYT4a9bJF1vCfB5Tw+U5c78zTNPOzMAr2q+Ck9gkQKvCW2Fb2o3Sq8mrCpu29/yTu/z/w6ydfIPNGqorwu1ZY8YpN1vKEcw7sYlbq8AKn1u+vTJz1HSFO8QptMvE0WMTy+eX+8Su7puvM3PTy/ZYA8Cq0fPYET0Tu6/iO90gq6vBKm6DxHpA68767jux9/WbtI0LK6XxkOOubxwLzU8IO7B2HvvHNZJrzuOKo8n+ntO5RFyzwDm648bQucu46UbbttHaQ857Xeu+ieDzyc1Hi8BAW/u7jbmrq6B448CBmmvKLp7jv+zig8g/wju4g0K7x1I9s8WcEaPc9k1LyLlwA9ILs6uyT6NrdFvm87kYhYPPo2D7xfnZa8MdmrPDYkljxAtMS5EMoSO1ZxzbvPXL07NQr3vJdS+rvhQIG7g5jwPOOgnDzdaC89ueeXPJOKWD0gem48v5cjPPs9L7sKfcE8QiZtu2k91LvYJ8E8QZb4vId3+zzjc5G87eexvGFpYLw+x7c8etCdOiffwDvhZAI7R+j8O5yhdLyXxZQ86Q3tvMfOPD1/snQ9WvSUvDXPHbw8mB89V121OnVWXj3fT4Q7VDH3PJ5rprxcvBg826H1u6PxYzzjCXi9BP2vPHrXZbw7ne+7Qwufup5LU7z6HAi9FqjqPCIsmzoCxWk9KL5CvNHoET0Qk7w7rjotvaOE2zzGR7i8R/qbvMH57DzCMgi8tfYqvCNCCTw+ONU8Ck/wOsqNR7t/DcU78G4DvSGZjjotYdO8YGl8PH0nqTuCGpU76rNru2ghOrlbNeM76ZMavfadDT06W1e8LR0uu6dDLzp4I4a8K028OpeMzDwC8KG73fR1vH/81bsBP088HWMjvF7QB71GENe8Z3ATOm8BhjywfxC9wQ+evG6gGrv5paw8ZPKEvEs5xjylH348q+2PulPChrxrm928mEwRvMNZe7wNeCO8YbEZvJv2Db1zQpq8j/jWPAG1yTxBt+W8/I9IO3J4lTss3CO8hBcWvKIuHDytQgI91iCoPLkKMryXEd48pDGyPMUaIj2zN9Q8IsyqPFVj6DxWZJu8ocwVPb+vyLwrFpU42UPUvNHKGr0MqaW83O6fvGF9Ob1/gcS8Ph5wO2fwVryCGds8A7xnPLt8ljyX+H88qxX4PIs3QjyGj8c7l+HBOlUaFL11b046gAvpu8v5JDwGp+q71zQDu9Hdk7zSrfs55dfYvNPxgjtjmzc8akU5O12uxjwWdYG8CDzNvFTzKrzOHDO9dilIvJSwhbwRXP06S7WpOnj+vDwP12a8mjGrvI7BJDyyZRU8JDmkPNGV47uo18o8Irf7O7z8pDzCju07XHWRPEdmFr2X6pQ8CzNQu1dP0TpQyDY8ubeqvMZ8LDwAZLa8eLTzPLSDQjoAkXK8O4zDvPNhqzw/FeU6taK/vKiCAb1ws3w8XNC7POdij7wA1dg8iCq8vGvRtjp/Rno7BaLQPA2fmbsUVT88ypQOvPVSGjz27RE8zRX6urFcLjtA7B8551ElvcmgDzwdOhs9HKd9OeFHsDyo09o6DntxPLl/FLw/7NG7lplFu2RJKTxBqBW8NHu6u0muHzyWNVc8DX2YO6eDCLyNONs7wR22PPDUqDs7FPA8KdZEPSvpITwVlQW9oy1JvIpzsjzZW9g8xGeDPIvpoLrnjxm61OSHvLkQDL2BmXC8ApHTO1TRCDySdOG7MpptPD28FT3XTvC8LcHoPPe3krwyqx29y86yvAq+AL3z/Xm5NsQyvWg4Krx6XWe8DnmWvIZnlDuK+Ps5ZilVPJzjpzz/B9u7Uae7O9Pl7Dr9Jac5g1+2PEezOrsuFoC7VKSMPJFASrxHqSI9+sMNvX8vEL0uXa88ehu7umbt9bwNPL28z1CfvP6FgLy82a67jMqlu4Yz+7s7fwo9S++wPGCyHry+zg89pZlIvOu7k7z1fy87X4GAOxsFtDv1xQ69cSL+vH6GhLz3nHe8R3jSvCH7wzzHn1482o+fvPLoszytqio9uKvduC8PlzwdyLY8WFwgO2mfJDy9S7W8dAorPC+gXLu5BLS6sGx5PEx6jLoBiJY6NGW5PDXAlTz1C3I8PoeNu7C4dDyl9HU5ckyAvD7BszsyoQc8oFlVvNhSzTw8cRM8HEDCPIQqtbzsxb+7sbWtvIOfOLw6NFA8eYRIvB30kLzaBLi6yGOWu3hBYzzdbVO8eUSnPO6UrLs97Ys8iYUjvCd0m7tHaYs8cD4FvO9oFjyVZhM9iYWwu2S0g7zMxn48vBaHu3+lorx0jzA9jrePO2P1u7whWsW80zXQuvePprx+X5E8C3/+PIHaA70OhCK98iwUvc3ET7wYoAO7TuyxvNdzzbvgdgk9p8zoOyZvXjn4OMK8iVTZu4a70LzfT4+8A2mlvI5QHb1P+8C7Vu6mPFNyYby/bj+6SzwIvQulCTvoQLM7bIoAvOs3XTy3qJq6uMIPPQrrIj1KsgY9SuulvEpW9LuiZwQ8yn6QvF7V0DwUViU8gdXfuwJhbby2cZi8wVIbuwU7CzyCKye7BufZvKtvfbyrnFa82g+1PDTko7pjLc85hcAfvAOBxDyAyDI8wBXjPOH8WLzNg+Y8xJQpvCFem7z27gK8KcEGuwcqAb3NXBM8rnRbO3vPIDytYbI8vhJyvNFYBryhZkc61kkkvVfk6LxB3Ce9uj+WPGCLfby8Yp289hlLPOnUErzRLRI9en/hvCtpDDwRnwc90nkIvSTsUDzi5Sm9UwuQvHeAiLta3oc8vnoaPZjRuTvn/La7Ig6gPP2DQjqj0wq84cNUPPQIrzzTNpO8fvD7u7v42bsuWN28f9HtO4mPTjyyDrk8JZsoO54EKzo93l48wcgrO5rmhLz0g9W7J1epPHrp8LuFN9+8EzvtOrpJ6zpyOAO9MTANvcFerDtbUI87JdLfO/qdq7uJlL27cDe1vMcry7uVguE8+hqROhbTCjoR3tm611j5vGazjzxlLFK8WnuZPPtQ2LxcOqI7rhLgurzBwzzGyVg8tsGcPDmE07yvsv48bDw8vFlPsLyEQy8677xXvD2fXDcpm0Q4ifrMu8tQSTuQ/AW9zP4ovMvzqLwyQh47OdjYvO1GiTwchr48IITAO7sWcjyaxoa8c0KbPOFBYjwTc028OPUqPZmuSb26Lsq8sGkxvZFfYby4Eki8+iCOvPbx5zx4bb68UkF/O7cLXDxq1hK9PN33PPx3N7wGPla6WfcyPUiS0zuidb67GmZxPH8M0rwQlQy9yOzGurtWDjtQVJ+8oGkXPXzsJLxNYks8JI+duwrL2zwyBGk7ogmRu+BqezynHVC8rJX3PLf/ErvxIcC6+QB3PG7i87thdA69sC5mOyVAlLwnqaI8ODuePMz1r7tk1Ie7gwgavNEAUTxp3vw8/b4fvXHaszz3/cG8rpbFPCKoDbr3Nuu8pKB5vK+wkDxyz9U8iTpTO+ZsBD0oRpC7X14uvYrvALuqcFi7QXsruz0q3LzOdqW5r1oRPG53aLxMp3Q886URO/Usury2Kty85pJGPKlmlDxuJDK8SG7bvN/I8DsvuC29QwqEuqR9abo/Y+s8TA6mvE1cnDtyktC8/6ADvV+SUbywvH88nW+MPKk6R7n9T/m88pMSPNDWgjrMoG+7ZUAdvbP7Ar01KaU7QnsSu4e8yzzjKg88MQrfO5P6uzxP8wI9blgKPJB49LzaWa08cJ5DPNjnSDyo3a68sdJ0PDxHIbwJNNa8PWGXu04wWbvIFza8EP4SPOr5gjteux49yD7/u7cCMD1u3ae8GBwuPWKxuTyWhn87CYgiPY86Mbr5Zoc8T+mrPIP1oDt34RK97b+lOr7L9rvwL2a88bWbPMltBLwHvJK7h98WPN4Wmrxz9lk897oXvOct6Tn8N6g7YZKDvL4FqDsGwM48LY++PCovvTw9+vi8jtvZu5G5VLrdQnO8cI3bPFIvOLoPIJy8hhqOvK0DMzzKIZW8nBntPCvvujtslZu8i+PtvEfN+LtKZRi9LOmkPGJ5nbzbPce8lCp0vEtV7DxtSqy8xOnFO6GEtjrhSD08JH6dPIaQgjvJ8S88PqrXPEi+aLyMpCK9Ch6KO5QonTy++9Q7vr/dvJF0tbu+6Qm8u84YvSXCczy2pcO8qf/3PNzWh7pFcgo8GRHiu/cdKj2J1hU7RGf3OzKfNDxRlaY7FUiPu/kIJjvuWYc8zdYAPAWpE7pru8s8hxK3OxtxEj0Xx1K73D7rOzKbejzZn0c8io13vP+r+Tz0M867kJZSvE5brzxBnsQ85ckfvR1i+znmAjW7FWPzvPOukDu1Agc9vhMRPWpWm7vcDvO7mHeGPDUlQT0up667I4yBuzrBFjwaVz08AkqjOywDIDyhF3a7LNWrPAoFMLwGDt87rvAlPJ1JljyHUiO88KoAPGUnDT2Tj7282D7ou4MAljyjNLo8ABl1vI85H7xUBJS815h1Or4NtLygFC+6zmftPPBoGby4vk66WEELPXxDijyKMGo8Il1aOH+gJj1cXyC8RU2pvBa+nLw6P188q1H0ut55yrvX6gm9BV6bvBW87DxTTz+9O+cPPC2lGTyTbnY7bARbuW1BITvYOaS8WKzNu9Bvb7wAZ9A8LH61Oh5oKr1SGS086kzvPMt7ZjzbQag8fJqKOq6rcD2hftA8wd7SvMhcmrq305a8O2qtvLm71rw/zu+7YDSPvJw64zwm3lE7S06GvB5Ezjqfm9i8jkPQvI07mryfLbQ83rfePPT3FjvfXg47sYb+OnmJzjuqpGW9I1GsvFK9JrzzTDW8CPprPOhwjzxVIQm90xz7PI2FhLyjsnY8rgHHPL0jGTnHxBg9M8gLvBEOzLyinI08QYFPvOyUljzntxu9Ra3yO7wdnjxtzai7e3DJO2lEH7wc+lC8ozOOvK8KczymbvE7vb7gvLEH3zyHEN04dFsdPG2yKjwUla68wAjWu1u9Y7y5xOe70ym4uwtFo7yjQHi7JhbPPEeYAL2R8s68alF8PHGn0zyvCQg8z4KpPGrfPD2dL2W7kFu5u1dZET0ZXbY7eO+RO/pg2jvdaVK8YPkQu1/O3zy7LyS9ryxXu2zhlrwxduC6qA29ufDLd7zlIN6879Z/vLZBvbx78Tm7V1YQOxLefjupbQ29cEM9PHLnIbwmzhs9Hd0/vUqJpTsX2ZM8thoyu+pPkLhAAb47zOrNuw8VbTwgGvs5F74fuwmYsDxuAYi8mtVMvL0uVbvoNq27KGgQPZYsqzwf5To8Ooj/OwKWJLtAiKU83Jt9vNWS+7xLSoK5AincvOZsJDxfwp+8bOCiPOsjybzV3xS86eg7u9Vt8ztgheM85QTPvDfq5DsFd5E83yMrurfUjzwCJzu8pUPXPPtToLxGoI+67Gj5u0zzp7wuhyC9V74EPPlmZrtw9Dg6sP8DvKCpxbx46gK9W4drPI2+hryhPbi8IVGFPGnRrjyibwi7du2hPADgiLw0zYO8KfvhOv6xwzyl1QK9SA3avOogA7yZ3B48WZP3u+5YXDv/Rvk8OV4ePKMaXjt3vqK8Pk7OOxJ0lLzYKny8Vu1rO3CDDrqgU6G83wQFvLTctbygs+G8l1tLu8OlT7yYPZU8H9FOvAQk37yAlOW7Ur1EvLMeOjwV5Mw78Dq2vMqCUbvFIja8RRD+vATgvLsCfVA7zGCyPMOpZzx6PGc7m+8PPCXP6bxLPyw8smtfvDSTz7k96vu85BtNvQIYKTsa9l+7wj1uvP49IT1hEJI8I+M/Ox3f5buPMvG8Xb/9vMUYjDu8Nyu9kI2RvHsb7Durozo8W/9DvIGrCbmixys9A1E7PI90l7ym9mY6X7CAvDeRgDyxvNc6RCKnvKleO7xpk7y8u5ZuvLRcgLtrlEs8x4v1vGt7DT0CbyG8jfNzvL8TxDpiIoO7On2KO0kJtzx/zpi8ca+mO29WmbzQGfi8BkoGPQnpNTxWka46mWtrPCl+orxD8wG9IhZtvBV4nzvc9ta7nsGHPFoiAb30EoC8i/mFOzG4Mj0Mook8qEdJPKrSyrsTvrc87Y4bPV4p4Du5NNw8dRGcOtdW8LzWsUw83gQjPUe8GLw/66y8ma34OeeMJTlv7l88pzU+u4w1TLuXD/07XAApO9ystjyLcYy7/o0VPE+YuLxhDCS9WQUUvW+bFj3NrW66wlMOPd40Hb2VIXC4F321vB3enTy8Wrk76jfbO4CeTzzfB+06nR6wu4OfujxrtOE7M0CVPOwgpbyMjh864fB/O3e4HzuC4Do9Y1q/PFkaoTwnjLW7SfPKvJTguzxj2hC86RFYvHHYlzveflW8MW7GvOt4gTyyN/q7PGYLu7nxvTvkbNM81aewOyUAk7z+CqC8YoRCPXpe0LpSPQI8gXiTvH/mPL0hqEO7a6e6vAeTmbztqUk7wioQPKQF5Lz7l0i8BPCMPCQdR7yGvle81RA6vJl1KbyjevM7aCLjPJk21TxAyws7Fu4zvTHCx7v0yyG92pgdPXjY9jpb81e9P+U0vI8qILwUr9U8jd4dvAuhqzvkgZG7G2lRux+ymjsRBdE77gOVOP2gizzjFi+9NnWNOw/furz+spY8blKWOc9NPjw15b+8f93APA1r27wTjbc8T0vdPBWA0jtG6XC7A55NvX/MnTsIIcI8n+slPFRURD0TUvE8XdpYvENTgbyEKb+8k3PXvIsVFLxx9rY7LMg9u+Jq+zzkeAM7Daf7O3JmD70IW6y8s8CBvI6L+rpbUJ480n6gu/wuqrw4GpE7QPsWPIibsDzwUvO85C+vu5KZ8bwsTBG94Kgmu3S3HDwciRS9EajuvKrpozyM1Hc8FbAXPFzH+jtAiDo6KYNpvB3qPLxjxBY8cmFFvOw3jLyWHa28A+anvJuMuLz6GAG9FHcxPVnw0Tx/mv88xxfbOe8r3rkCkwK8RcWXu/4tCrwU8647XGiRPLuAt7x05+Q82leTvF4IHLxanvu7W44tvAiV0jxmYas7MHS8PA++q7z5Plu882gKPctpxDxZrB68R1hivKfEOjthGS68b7+/PJdOwjseBb47x9mMu1q8nbsg9FY8TAt3u0PcKLoG4GI8xERWO6Sxq7rp1Ra9afJQPI5b97z1/Ri9GlAvvNCaY7wxpZe8f+HvvMTgCjuuq+e8+9EjveaaAr0G9Na8mTo/vN1NEzzTPf47x6vUPFKCuzyyb7K7VkxHvf42ljykv467jSxgvAekGrvvpfg8ZMi+POyHsLxW0fU5qj3DPD4t+ruhgby8x7t8PAPJCbvB5Ri8RPXRvEJ64byFIos8ouoKPJSI9zzra129tHuVPL1jaTz3MB49TtTiu3gkhTv6Iro8THuZOxK+rLtPai66BrV2vDvgDzvE0jy8bVqxu0SMijv4hy08aBK2u+C0k7lwcj68L47fPNgReLwgPv67VrOiPCfEXjycyHq8hXDNPNy3zDxMKlm7pyiAPCoA+zyvsdQ7agsnPZwcpbyQSwC7YHQjPe3+4LtaboU8svPau6atsbwybIg80xmevGmP4Dua7Bu8oX+MPGDNirzv2SK9WZXqPG7IOzxYG4w89vDlvGJRdrx7ZYu8XEq1u4APyTsMaW+8dsTxu8D/Hjsvyk08bICDvA7w5Dx47PW74M6rPAhpgbw0KeW8lhgGvI+aSbtKrLw7IzwpvC6Rhbz+4Q+6NukIvPfDhTxsx3E8XBKePOvf4zrH3f67SJ1PvcHFszzmOJ48i72yPCcdsbzNIhU8L1vXuhs/B7r0nEg8Q7MzvJm2yjvWDuw8nF2AOgxqLTxZugm9BuXxugJYIrx7gq+8S23FO+t0T7yiysE8KygXvAuJmLy9xZ88uV0svVECa7z7D7E6IvW5PCbiO7wKLw278GrnvDdLhTx4fLQ8uz6DPAVb0zxDk+k8FfXAu3GEkztq1XW7RzURPdtZQryn2Cw96cCzu/1rsrzXa+07rcxXvFLO6Dxjopa8WWAMvIA977ysBby8zG33u5KLsDyOPYE8GbMxvJ1TgTySam67T+aFOkt1MbxhL6I8zg0OvFTznDxV0kG8QXa5vIJiIz0EG888OywqPI3DZDz+Gxk8BwzjO1767TybEA29smVdPMaIO7szZxq8D90OvHCKibz53HK8c/nqO4Ccnrq40Uk8Uh0APZAN/rpdb+67cLOFPHAj/7xRIpe8Zlg1PWgsrTsbr9U7cjiBu2u0j7zgULm83X0HvAWulbv1xYk8WnMBPF40VjzP99k8Nx1hvNc44TrBapK8Vdg9uc20ELwp3++8ga8VPDW3CD3HBeG7+yVAvKiwnbw/spK8dZYGPRBO4zzyqAO9I5RVvIUkjLwmpK88+XuwuxRxGLxCO8U8Y+7ivJ3Bv7y69fi6t1WWO9brtTzdvyE8NCvivAetUDycSR67aBaQPAi5D7wCpxW89TqYu3xwuby/pCO8qoIrPRKNCDx5pI47T/tJvM/IPDsc+UO6MpAevJ2qUTwAz8c7tITAO8OHkzxFCUk7wxDdPF85p7uulSW7YbEQO8T3F71hwE07lGjquwRdtby0Bkq85U5vO0zdn7uPqqm8/BUfPAABcboqOTO9liX6O1/VDTyenDI8cwJZO68IqDsF6ym7nUONPJ42BT2m+q+6alaWu0kXHrwamaC82eERvP+hjLztmjY8AFOJPMzXt7qJSye91vJpPU3s/7wFuqe8a7/wPF6N77tn3Qg9cKoBPZnZzzzIIUY85yoMvG90SjzRBQI889Awu+Hi3zr0Q/q85X4jvEeJDD0B6e26CppmPFQqfLz53Ys7CqcVPW3T7juy4t06QvNDPEAM0zrwoEI8XcjHOo5mmDuBo1M76LAtvOk5MLzrdxu9J3FtvDBfAzxUpro8/VB6O+ORETx1jpW6XCA2uyg0RDrk9ca8hT3POf4gDzwNYDo8mg2QuxvH9bybEB088yumvCW4zjzq5+88Q6Iju1Do8by8Jm48Jy7ku/G7zLuEuMy8xK3LPGYgULxaSTM8T4RZvBN1kDxndFQ8aEgrPHw5izw8NUq7f4QPPR+SlrwQOFM8os2rPBD0gjx1hCK9LSxrPBDsBL1lNes899Z5vAVBpjx/pzy6ObE/vA2uvrsrnTG8Zg8BOrgYwrwq5Yk8NJEDvMYtDD0n0d48zqjjOyZt7jveLAk8Vbzkux/hc7xFl9w8Gw95O7p1y7z8UUu7cFdMOnsHNj3rPrS7PCakvBjWMTttxsO8ljJoO7JXyTwPw++7LQSgvLevrjxkewY7wRYqPXEKlry6q6m8lkVYvPJ8krzi2VS8XqKgOgHR0bvqt8O8SJmsuxc/3bypXQM9QGWOvNHqgbrKURG9ejQJvGkO5DyXbpu8aT/gO+zPAj3Hh1682nNqusM4V7wjo/28u5B0vKtm+DrfwD081LJJvAxC4byRT/Q6+FGDPLljhzzsbVW8TdECvS5UOTwkI788c/ipu4RBArwg3qi83y+RvO7HDTxR2VM8Lynwu1pYozyuWim8a/K4vLZetbyVNB89BlDZvNoI87n4eqk8BcqPvB2tDLugeqw7YWdHvBhPabxzIoq8HXDEOmTDjrzj3pW8MaGSOz5FjbmJljy8eD5nvC88sjpucdk6krAUvLViLTwYDq+868XOugK/KDpG+RU8E+dMPA0/pzzBtYk8sTJgvBRYFjsOTcM8zSy0PA== + - embedding: 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 index: 8 object: embedding - - embedding: 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 + - embedding: +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 index: 9 object: embedding - - embedding: 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 + - embedding: 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 index: 10 object: embedding - - embedding: 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 + - embedding: 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 index: 11 object: embedding - - embedding: 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 + - embedding: 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 index: 12 object: embedding - - embedding: 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 + - embedding: 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 index: 13 object: embedding - - embedding: 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 + - embedding: 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 index: 14 object: embedding - - embedding: 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 + - embedding: 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 index: 15 object: embedding - - embedding: 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 - index: 16 - object: embedding model: qwen3-embedding:4b object: list usage: - prompt_tokens: 3883 - total_tokens: 3883 + prompt_tokens: 3761 + total_tokens: 3761 status: code: 200 message: OK @@ -182,7 +172,7 @@ interactions: connection: - keep-alive content-length: - - '7816' + - '7353' content-type: - application/json host: @@ -227,18 +217,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -256,11 +234,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -286,10 +264,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -351,6 +330,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -380,7 +360,7 @@ interactions: response: headers: content-length: - - '573' + - '717' content-type: - application/json parsed_body: @@ -389,25 +369,25 @@ interactions: index: 0 message: content: '' - reasoning: We need to search. + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. role: assistant tool_calls: - function: - arguments: '{"code":"import json\nresults = await search(\"document element types\", limit=20)\nprint(json.dumps(results, - indent=2))"}' + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' name: execute_code - id: call_asxbylxn + id: call_nakznbjt index: 0 type: function - created: 1772628395 - id: chatcmpl-532 + created: 1773329394 + id: chatcmpl-992 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 54 - prompt_tokens: 1702 - total_tokens: 1756 + completion_tokens: 92 + prompt_tokens: 1608 + total_tokens: 1700 status: code: 200 message: OK @@ -420,259 +400,7 @@ interactions: connection: - keep-alive content-length: - - '8408' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Search for content about document element types or labels. What are all the different document element types - mentioned? List them all. - role: user - - content: null - reasoning: We need to search. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nresults = await search(\"document element types\", limit=20)\nprint(json.dumps(results, - indent=2))"}' - name: execute_code - id: call_asxbylxn - type: function - - content: '{"code":"import json\nresults = await search(\"document element types\", limit=20)\nprint(json.dumps(results, - indent=2))","stdout":"","stderr":"ModuleNotFoundError: No module named ''json''","success":false}' - role: tool - tool_call_id: call_asxbylxn - model: gpt-oss - reasoning_effort: low - response_format: - json_schema: - description: Result from RLM agent execution. - name: RLMResult - schema: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: json_schema - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '648' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: We cannot import json. But we can print. Use simple print. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"document element types\", limit=20)\nfor r in results:\n print(r[''document_title''], - r[''chunk_id''], r[''content''][:200])"}' - name: execute_code - id: call_tnybh8wo - index: 0 - type: function - created: 1772628397 - id: chatcmpl-481 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 76 - prompt_tokens: 1817 - total_tokens: 1893 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '92' + - '99' content-type: - application/json host: @@ -681,7 +409,7 @@ interactions: parsed_body: encoding_format: base64 input: - - document element types + - document element types labels model: qwen3-embedding:4b uri: http://localhost:11434/v1/embeddings response: @@ -692,14 +420,14 @@ interactions: - chunked parsed_body: data: - - embedding: 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 + - embedding: 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 index: 0 object: embedding model: qwen3-embedding:4b object: list usage: - prompt_tokens: 4 - total_tokens: 4 + prompt_tokens: 5 + total_tokens: 5 status: code: 200 message: OK @@ -712,7 +440,7 @@ interactions: connection: - keep-alive content-length: - - '13241' + - '8434' content-type: - application/json host: @@ -757,18 +485,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -786,11 +502,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -816,10 +532,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -860,67 +577,22 @@ interactions: mentioned? List them all. role: user - content: null - reasoning: We need to search. + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. role: assistant tool_calls: - function: - arguments: '{"code":"import json\nresults = await search(\"document element types\", limit=20)\nprint(json.dumps(results, - indent=2))"}' + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' name: execute_code - id: call_asxbylxn + id: call_nakznbjt type: function - - content: '{"code":"import json\nresults = await search(\"document element types\", limit=20)\nprint(json.dumps(results, - indent=2))","stdout":"","stderr":"ModuleNotFoundError: No module named ''json''","success":false}' + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' role: tool - tool_call_id: call_asxbylxn - - content: null - reasoning: We cannot import json. But we can print. Use simple print. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"document element types\", limit=20)\nfor r in results:\n print(r[''document_title''], - r[''chunk_id''], r[''content''][:200])"}' - name: execute_code - id: call_tnybh8wo - type: function - - content: '{"code":"results = await search(\"document element types\", limit=20)\nfor r in results:\n print(r[''document_title''], - r[''chunk_id''], r[''content''][:200])","stdout":"None d5720da3-0a74-4750-ba03-3db361e81173 Phase 2: Label selection - and guideline. We reviewed the collected documents and identified the most common structural features they exhibit. - This was achieved by identifying recurrent layout elements \nNone e0d09a22-db60-4997-9b6d-fe941955779e Phase 1: - Data selection and preparation. Our inclusion criteria for documents were described in Section 3. A large effort - went into ensuring that all documents are free to use. The data sources includ\nNone d08ece43-ef73-43dc-bcc4-98aaa669cfa1 - $_{Affiliation}$, as seen in DocBank, are often only distinguishable by discriminating on\nPreparation work included - uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CC\nNone c30bbfbf-6626-417c-a67e-c1396693e987 - \nTable 1: DocLayNet dataset overview. Along with the frequency of each class label, we present the relative occurrence - (as % of row \"Total\") in the train, test and validation sets. The inter-annotator\nNone 6f6b4653-20f8-4907-bf49-8b3aed8027df - Page-footer, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 96-98. Page-header, Count = 58022. Page-header, % of - Total.Train = 5.10. Page-header, % of Total.Test = 6.70. Page-header, % of Total.Val =\nNone f23f85c0-169d-43db-a1ed-de049b9ff73e - 0.5-0.95 (%).Law = 87-94. Section-header, triple inter-annotator mAP @ 0.5-0.95 (%).Pat = 69-73. Section-header, - triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 78-86. Table, Count = 34733. Table, % o\nNone 1e1a7caf-ce36-40f9-8a0d-d6fc3ce5c8aa - Caption, Count = 22524. Caption, % of Total.Train = 2.04. Caption, % of Total.Test = 1.77. Caption, % of Total.Val - = 2.32. Caption, triple inter-annotator mAP @ 0.5-0.95 (%).All = 84-89. Caption, trip\nNone 7079c771-a705-4188-b183-639f38e9e41d - inter-annotator mAP @ 0.5-0.95 (%).Pat = 66-71. Picture, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 59-76. - Section-header, Count = 142884. Section-header, % of Total.Train = 12.60. Section-header\nNone 3387ce95-57b9-44c3-8187-0c5039ab8d3e - n/a. Footnote, Count = 6318. Footnote, % of Total.Train = 0.60. Footnote, % of Total.Test = 0.31. Footnote, % of - Total.Val = 0.58. Footnote, triple inter-annotator mAP @ 0.5-0.95 (%).All = 83-91. Foot\nNone 6652c53a-5654-4db8-ab6a-28ec5ea42534 - 185660. List-item, % of Total.Train = 17.19. List-item, % of Total.Test = 13.34. List-item, % of Total.Val = 15.82. - List-item, triple inter-annotator mAP @ 0.5-0.95 (%).All = 87-88. List-item, triple \nNone 89a3d27b-070c-45e8-95be-a3d9670f1f9f - 0.5-0.95 (%).Ten = 93-95. Page-footer, Count = 70878. Page-footer, % of Total.Train = 6.51. Page-footer, % of Total.Test - = 5.58. Page-footer, % of Total.Val = 6.00. Page-footer, triple inter-annotator\nNone 33c86a46-b88b-4492-bc22-c049b6be6712 - 89-93. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 87-92. Text, triple inter-annotator mAP @ 0.5-0.95 - (%).Pat = 71-79. Text, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 87-95. Title, Cou\nNone 9101a029-0c92-4e1c-b427-53a69afaa2a3 - 0.5-0.95 (%).Pat = 97-99. Page-header, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 81-86. Picture, Count = 45976. - Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of T\nNone b7284b9f-3ec7-405c-b6a1-0a01c08bd29c - (%).Sci = 94-100. Title, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 82-96. Title, triple inter-annotator mAP - @ 0.5-0.95 (%).Pat = 68-79. Title, triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 24-\nNone 646b0b0b-625f-44dc-a3af-98ef180fbd35 - inter-annotator mAP @ 0.5-0.95 (%).Law = 58-80. Table, triple inter-annotator mAP @ 0.5-0.95 (%).Pat = 79-84. Table, - triple inter-annotator mAP @ 0.5-0.95 (%).Ten = 70-85. Text, Count = 510377. Text, \nNone 7e518b7d-7418-4b46-a879-acd3217151dc - = 82-97. Formula, Count = 25027. Formula, % of Total.Train = 2.25. Formula, % of Total.Test = 1.90. Formula, % of - Total.Val = 2.96. Formula, triple inter-annotator mAP @ 0.5-0.95 (%).All = 83-85. Form\nNone f2c88b81-fc96-42a8-93bc-27fbaae2db5d - mAP @ 0.5-0.95 (%).Sci = 89-94. Total, triple inter-annotator mAP @ 0.5-0.95 (%).Law = 86-91. Total, triple inter-annotator - mAP @ 0.5-0.95 (%).Pat = 71-76. Total, triple inter-annotator mAP @ 0.5-0.95\n","stderr":"","success":true}' - role: tool - tool_call_id: call_tnybh8wo + tool_call_id: call_nakznbjt model: gpt-oss reasoning_effort: low response_format: @@ -943,6 +615,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -972,35 +645,2032 @@ interactions: response: headers: content-length: - - '1552' + - '672' content-type: - application/json + parsed_body: + choices: + - finish_reason: tool_calls + index: 0 + message: + content: '' + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + index: 0 + type: function + created: 1773329396 + id: chatcmpl-128 + model: gpt-oss + object: chat.completion + system_fingerprint: fp_ollama + usage: + completion_tokens: 94 + prompt_tokens: 1947 + total_tokens: 2041 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '9222' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + messages: + - content: |- + You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. + + You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. + + Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: + - results = await search("query") ✓ CORRECT + - import search ✗ WRONG - will fail + - results = search("query") ✗ WRONG - must use await + + ## Available Functions + + ### await search(query, limit=10) -> list[dict] + Search the knowledge base using hybrid search (vector + full-text). + Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings + + ### await list_documents(limit=10, offset=0) -> list[dict] + List available documents in the knowledge base. + Returns list of dicts with keys: id, title, uri, created_at + + ### await get_document(id_or_title) -> str | None + Get the full text content of a document by ID, title, or URI. + Returns the document content as a string, or None if not found. + + ### await get_chunk(chunk_id) -> dict | None + Get a specific chunk by its ID (from search results). + Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels + Use this to retrieve full chunk details and metadata for citation. + + ### await get_docling_document(document_id) -> dict | None + Get the full document structure as a dict (DoclingDocument format). + Use `list_documents()` or search results to get document IDs first. + - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) + - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` + - `pictures`: list of figures/images with metadata + - `pages`: page dimensions and metadata + + ### await llm(prompt) -> str + Call an LLM directly with the given prompt. Returns the response as a string. + Use this for classification, summarization, extraction, or any task where you + already have the content and just need LLM reasoning. + + ## Pre-loaded Documents Variable + + If documents were pre-loaded for this session, a `documents` variable is available: + ```python + # documents is a list of dicts with keys: id, title, uri, content + for doc in documents: + print(doc['title'], len(doc['content'])) + ``` + Check if it exists with: `try: documents ... except NameError: ...` + + ## Available Python Features + + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. + + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. + + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + + ## Strategy Guide + + 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. + 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. + 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. + 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. + 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. + + ## Example Patterns + + ### Counting documents matching a condition + ```python + docs = await list_documents(limit=100) + count = 0 + for doc in docs: + content = await get_document(doc['id']) + if content and 'keyword' in content.lower(): + count += 1 + print(f"Found in: {doc['title']}") + print(f"Total: {count}") + ``` + + ### Extracting data with regex + ```python + import re + numbers = [] + results = await search("financial data", limit=20) + for r in results: + amounts = re.findall(r'\$([\d,]+)', r['content']) + for a in amounts: + numbers.append(int(a.replace(',', ''))) + if numbers: + print(f"Average: {sum(numbers) / len(numbers)}") + ``` + + ### Extracting tables from a document + ```python + docs = await list_documents(limit=10) + for d in docs: + doc = await get_docling_document(d['id']) + if doc: + tables = doc.get('tables', []) + if tables: + print(f"{d['title']}: {len(tables)} table(s)") + for i, table in enumerate(tables): + grid = table.get('data', {}).get('grid', []) + for row in grid: + cells = [cell.get('text', '') for cell in row] + print(f" Table {i}: {cells}") + ``` + + ## Output Format + + Your final response MUST be valid JSON matching this exact schema: + ```json + {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} + ``` + + - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. + - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. + + Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} + + You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. + role: system + - content: Search for content about document element types or labels. What are all the different document element types + mentioned? List them all. + role: user + - content: null + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' + name: execute_code + id: call_nakznbjt + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' + role: tool + tool_call_id: call_nakznbjt + - content: null + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + type: function + - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' + is not defined","success":false}' + role: tool + tool_call_id: call_aybmoc41 + model: gpt-oss + reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema + stream: false + temperature: 0.0 + tool_choice: auto + tools: + - function: + description: |- + Execute Python code in a sandboxed interpreter. + + The code has access to haiku.rag functions (search, list_documents, + get_document, get_chunk, llm). + + Use print() to output results. + + Structured result with success status, stdout, and stderr. + + name: execute_code + parameters: + additionalProperties: false + properties: + code: + description: Python code to execute. + type: string + required: + - code + type: object + strict: true + type: function + uri: http://localhost:11434/v1/chat/completions + response: + headers: + content-length: + - '832' + content-type: + - application/json + parsed_body: + choices: + - finish_reason: tool_calls + index: 0 + message: + content: '' + reasoning: We lost results variable due to separate execution. Need to re-run search and get chunks in same code. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r + in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_243jvzlw + index: 0 + type: function + created: 1773329399 + id: chatcmpl-144 + model: gpt-oss + object: chat.completion + system_fingerprint: fp_ollama + usage: + completion_tokens: 126 + prompt_tokens: 2142 + total_tokens: 2268 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '99' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - document element types labels + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 5 + total_tokens: 5 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '11411' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + messages: + - content: |- + You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. + + You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. + + Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: + - results = await search("query") ✓ CORRECT + - import search ✗ WRONG - will fail + - results = search("query") ✗ WRONG - must use await + + ## Available Functions + + ### await search(query, limit=10) -> list[dict] + Search the knowledge base using hybrid search (vector + full-text). + Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings + + ### await list_documents(limit=10, offset=0) -> list[dict] + List available documents in the knowledge base. + Returns list of dicts with keys: id, title, uri, created_at + + ### await get_document(id_or_title) -> str | None + Get the full text content of a document by ID, title, or URI. + Returns the document content as a string, or None if not found. + + ### await get_chunk(chunk_id) -> dict | None + Get a specific chunk by its ID (from search results). + Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels + Use this to retrieve full chunk details and metadata for citation. + + ### await get_docling_document(document_id) -> dict | None + Get the full document structure as a dict (DoclingDocument format). + Use `list_documents()` or search results to get document IDs first. + - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) + - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` + - `pictures`: list of figures/images with metadata + - `pages`: page dimensions and metadata + + ### await llm(prompt) -> str + Call an LLM directly with the given prompt. Returns the response as a string. + Use this for classification, summarization, extraction, or any task where you + already have the content and just need LLM reasoning. + + ## Pre-loaded Documents Variable + + If documents were pre-loaded for this session, a `documents` variable is available: + ```python + # documents is a list of dicts with keys: id, title, uri, content + for doc in documents: + print(doc['title'], len(doc['content'])) + ``` + Check if it exists with: `try: documents ... except NameError: ...` + + ## Available Python Features + + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. + + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. + + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + + ## Strategy Guide + + 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. + 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. + 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. + 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. + 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. + + ## Example Patterns + + ### Counting documents matching a condition + ```python + docs = await list_documents(limit=100) + count = 0 + for doc in docs: + content = await get_document(doc['id']) + if content and 'keyword' in content.lower(): + count += 1 + print(f"Found in: {doc['title']}") + print(f"Total: {count}") + ``` + + ### Extracting data with regex + ```python + import re + numbers = [] + results = await search("financial data", limit=20) + for r in results: + amounts = re.findall(r'\$([\d,]+)', r['content']) + for a in amounts: + numbers.append(int(a.replace(',', ''))) + if numbers: + print(f"Average: {sum(numbers) / len(numbers)}") + ``` + + ### Extracting tables from a document + ```python + docs = await list_documents(limit=10) + for d in docs: + doc = await get_docling_document(d['id']) + if doc: + tables = doc.get('tables', []) + if tables: + print(f"{d['title']}: {len(tables)} table(s)") + for i, table in enumerate(tables): + grid = table.get('data', {}).get('grid', []) + for row in grid: + cells = [cell.get('text', '') for cell in row] + print(f" Table {i}: {cells}") + ``` + + ## Output Format + + Your final response MUST be valid JSON matching this exact schema: + ```json + {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} + ``` + + - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. + - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. + + Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} + + You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. + role: system + - content: Search for content about document element types or labels. What are all the different document element types + mentioned? List them all. + role: user + - content: null + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' + name: execute_code + id: call_nakznbjt + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' + role: tool + tool_call_id: call_nakznbjt + - content: null + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + type: function + - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' + is not defined","success":false}' + role: tool + tool_call_id: call_aybmoc41 + - content: null + reasoning: We lost results variable due to separate execution. Need to re-run search and get chunks in same code. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_243jvzlw + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor c in chunks[:5]:\n print(c[''chunk_id''], + c[''content''][:200])\n","stdout":"16\ncf9b6d33-34d4-487c-ae6b-a174592dc101 Phase 2: Label selection and guideline. + We reviewed the collected documents and identified the most common structural features they exhibit. This was achieved + by identifying recurrent layout elements \nca706a97-3e18-4cd5-af2b-6b5a9afa5d36 \nTable 1: DocLayNet dataset overview. + Along with the frequency of each class label, we present the relative occurrence (as % of row ''Total'') in the + train, test and validation sets. The inter-annotator\n1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 Preparation work included + uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], a cloud-native platform + which provides a visual annotation interface and allows f\nb18d8ada-e999-4561-87c0-266e6899e3d0 71-76. Total, triple + inter-annotator mAP @0.5-0.95 (%).Ten = 68-85\nFigure 3: Corpus Conversion Service annotation user interface. The + PDF page is shown in the background, with overlaid text-cells (in \n794e795c-c914-4dd4-baf4-4ada9083be9f (%).Ten + = 81-86. Picture, Count = 45976. Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of + Total.Val = 5.31. Picture, triple inter-annotator mAP @0.5-0.95 (%).All = 69-7\n","stderr":"","success":true}' + role: tool + tool_call_id: call_243jvzlw + model: gpt-oss + reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema + stream: false + temperature: 0.0 + tool_choice: auto + tools: + - function: + description: |- + Execute Python code in a sandboxed interpreter. + + The code has access to haiku.rag functions (search, list_documents, + get_document, get_chunk, llm). + + Use print() to output results. + + Structured result with success status, stdout, and stderr. + + name: execute_code + parameters: + additionalProperties: false + properties: + code: + description: Python code to execute. + type: string + required: + - code + type: object + strict: true + type: function + uri: http://localhost:11434/v1/chat/completions + response: + headers: + content-length: + - '856' + content-type: + - application/json + parsed_body: + choices: + - finish_reason: tool_calls + index: 0 + message: + content: '' + reasoning: We need list of element types or labels. Likely labels like "title", "section_header", "list_item", "text", + "table", "picture". Let's search for "label" in chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_9ntwuhmm + index: 0 + type: function + created: 1773329403 + id: chatcmpl-249 + model: gpt-oss + object: chat.completion + system_fingerprint: fp_ollama + usage: + completion_tokens: 135 + prompt_tokens: 2752 + total_tokens: 2887 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '12404' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + messages: + - content: |- + You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. + + You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. + + Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: + - results = await search("query") ✓ CORRECT + - import search ✗ WRONG - will fail + - results = search("query") ✗ WRONG - must use await + + ## Available Functions + + ### await search(query, limit=10) -> list[dict] + Search the knowledge base using hybrid search (vector + full-text). + Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings + + ### await list_documents(limit=10, offset=0) -> list[dict] + List available documents in the knowledge base. + Returns list of dicts with keys: id, title, uri, created_at + + ### await get_document(id_or_title) -> str | None + Get the full text content of a document by ID, title, or URI. + Returns the document content as a string, or None if not found. + + ### await get_chunk(chunk_id) -> dict | None + Get a specific chunk by its ID (from search results). + Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels + Use this to retrieve full chunk details and metadata for citation. + + ### await get_docling_document(document_id) -> dict | None + Get the full document structure as a dict (DoclingDocument format). + Use `list_documents()` or search results to get document IDs first. + - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) + - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` + - `pictures`: list of figures/images with metadata + - `pages`: page dimensions and metadata + + ### await llm(prompt) -> str + Call an LLM directly with the given prompt. Returns the response as a string. + Use this for classification, summarization, extraction, or any task where you + already have the content and just need LLM reasoning. + + ## Pre-loaded Documents Variable + + If documents were pre-loaded for this session, a `documents` variable is available: + ```python + # documents is a list of dicts with keys: id, title, uri, content + for doc in documents: + print(doc['title'], len(doc['content'])) + ``` + Check if it exists with: `try: documents ... except NameError: ...` + + ## Available Python Features + + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. + + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. + + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + + ## Strategy Guide + + 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. + 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. + 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. + 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. + 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. + + ## Example Patterns + + ### Counting documents matching a condition + ```python + docs = await list_documents(limit=100) + count = 0 + for doc in docs: + content = await get_document(doc['id']) + if content and 'keyword' in content.lower(): + count += 1 + print(f"Found in: {doc['title']}") + print(f"Total: {count}") + ``` + + ### Extracting data with regex + ```python + import re + numbers = [] + results = await search("financial data", limit=20) + for r in results: + amounts = re.findall(r'\$([\d,]+)', r['content']) + for a in amounts: + numbers.append(int(a.replace(',', ''))) + if numbers: + print(f"Average: {sum(numbers) / len(numbers)}") + ``` + + ### Extracting tables from a document + ```python + docs = await list_documents(limit=10) + for d in docs: + doc = await get_docling_document(d['id']) + if doc: + tables = doc.get('tables', []) + if tables: + print(f"{d['title']}: {len(tables)} table(s)") + for i, table in enumerate(tables): + grid = table.get('data', {}).get('grid', []) + for row in grid: + cells = [cell.get('text', '') for cell in row] + print(f" Table {i}: {cells}") + ``` + + ## Output Format + + Your final response MUST be valid JSON matching this exact schema: + ```json + {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} + ``` + + - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. + - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. + + Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} + + You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. + role: system + - content: Search for content about document element types or labels. What are all the different document element types + mentioned? List them all. + role: user + - content: null + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' + name: execute_code + id: call_nakznbjt + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' + role: tool + tool_call_id: call_nakznbjt + - content: null + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + type: function + - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' + is not defined","success":false}' + role: tool + tool_call_id: call_aybmoc41 + - content: null + reasoning: We lost results variable due to separate execution. Need to re-run search and get chunks in same code. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_243jvzlw + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor c in chunks[:5]:\n print(c[''chunk_id''], + c[''content''][:200])\n","stdout":"16\ncf9b6d33-34d4-487c-ae6b-a174592dc101 Phase 2: Label selection and guideline. + We reviewed the collected documents and identified the most common structural features they exhibit. This was achieved + by identifying recurrent layout elements \nca706a97-3e18-4cd5-af2b-6b5a9afa5d36 \nTable 1: DocLayNet dataset overview. + Along with the frequency of each class label, we present the relative occurrence (as % of row ''Total'') in the + train, test and validation sets. The inter-annotator\n1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 Preparation work included + uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], a cloud-native platform + which provides a visual annotation interface and allows f\nb18d8ada-e999-4561-87c0-266e6899e3d0 71-76. Total, triple + inter-annotator mAP @0.5-0.95 (%).Ten = 68-85\nFigure 3: Corpus Conversion Service annotation user interface. The + PDF page is shown in the background, with overlaid text-cells (in \n794e795c-c914-4dd4-baf4-4ada9083be9f (%).Ten + = 81-86. Picture, Count = 45976. Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of + Total.Val = 5.31. Picture, triple inter-annotator mAP @0.5-0.95 (%).All = 69-7\n","stderr":"","success":true}' + role: tool + tool_call_id: call_243jvzlw + - content: null + reasoning: We need list of element types or labels. Likely labels like "title", "section_header", "list_item", "text", + "table", "picture". Let's search for "label" in chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_9ntwuhmm + type: function + - content: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' + role: tool + tool_call_id: call_9ntwuhmm + model: gpt-oss + reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema + stream: false + temperature: 0.0 + tool_choice: auto + tools: + - function: + description: |- + Execute Python code in a sandboxed interpreter. + + The code has access to haiku.rag functions (search, list_documents, + get_document, get_chunk, llm). + + Use print() to output results. + + Structured result with success status, stdout, and stderr. + + name: execute_code + parameters: + additionalProperties: false + properties: + code: + description: Python code to execute. + type: string + required: + - code + type: object + strict: true + type: function + uri: http://localhost:11434/v1/chat/completions + response: + headers: + content-length: + - '860' + content-type: + - application/json + parsed_body: + choices: + - finish_reason: tool_calls + index: 0 + message: + content: '' + reasoning: Need to keep chunks. Let's combine. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r + in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels + = set()\nimport re\nfor c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], + re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_8u1f7ds9 + index: 0 + type: function + created: 1773329406 + id: chatcmpl-13 + model: gpt-oss + object: chat.completion + system_fingerprint: fp_ollama + usage: + completion_tokens: 136 + prompt_tokens: 2991 + total_tokens: 3127 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '99' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - document element types labels + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 5 + total_tokens: 5 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '13517' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + messages: + - content: |- + You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. + + You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. + + Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: + - results = await search("query") ✓ CORRECT + - import search ✗ WRONG - will fail + - results = search("query") ✗ WRONG - must use await + + ## Available Functions + + ### await search(query, limit=10) -> list[dict] + Search the knowledge base using hybrid search (vector + full-text). + Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings + + ### await list_documents(limit=10, offset=0) -> list[dict] + List available documents in the knowledge base. + Returns list of dicts with keys: id, title, uri, created_at + + ### await get_document(id_or_title) -> str | None + Get the full text content of a document by ID, title, or URI. + Returns the document content as a string, or None if not found. + + ### await get_chunk(chunk_id) -> dict | None + Get a specific chunk by its ID (from search results). + Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels + Use this to retrieve full chunk details and metadata for citation. + + ### await get_docling_document(document_id) -> dict | None + Get the full document structure as a dict (DoclingDocument format). + Use `list_documents()` or search results to get document IDs first. + - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) + - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` + - `pictures`: list of figures/images with metadata + - `pages`: page dimensions and metadata + + ### await llm(prompt) -> str + Call an LLM directly with the given prompt. Returns the response as a string. + Use this for classification, summarization, extraction, or any task where you + already have the content and just need LLM reasoning. + + ## Pre-loaded Documents Variable + + If documents were pre-loaded for this session, a `documents` variable is available: + ```python + # documents is a list of dicts with keys: id, title, uri, content + for doc in documents: + print(doc['title'], len(doc['content'])) + ``` + Check if it exists with: `try: documents ... except NameError: ...` + + ## Available Python Features + + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. + + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. + + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + + ## Strategy Guide + + 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. + 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. + 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. + 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. + 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. + + ## Example Patterns + + ### Counting documents matching a condition + ```python + docs = await list_documents(limit=100) + count = 0 + for doc in docs: + content = await get_document(doc['id']) + if content and 'keyword' in content.lower(): + count += 1 + print(f"Found in: {doc['title']}") + print(f"Total: {count}") + ``` + + ### Extracting data with regex + ```python + import re + numbers = [] + results = await search("financial data", limit=20) + for r in results: + amounts = re.findall(r'\$([\d,]+)', r['content']) + for a in amounts: + numbers.append(int(a.replace(',', ''))) + if numbers: + print(f"Average: {sum(numbers) / len(numbers)}") + ``` + + ### Extracting tables from a document + ```python + docs = await list_documents(limit=10) + for d in docs: + doc = await get_docling_document(d['id']) + if doc: + tables = doc.get('tables', []) + if tables: + print(f"{d['title']}: {len(tables)} table(s)") + for i, table in enumerate(tables): + grid = table.get('data', {}).get('grid', []) + for row in grid: + cells = [cell.get('text', '') for cell in row] + print(f" Table {i}: {cells}") + ``` + + ## Output Format + + Your final response MUST be valid JSON matching this exact schema: + ```json + {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} + ``` + + - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. + - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. + + Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} + + You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. + role: system + - content: Search for content about document element types or labels. What are all the different document element types + mentioned? List them all. + role: user + - content: null + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' + name: execute_code + id: call_nakznbjt + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' + role: tool + tool_call_id: call_nakznbjt + - content: null + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + type: function + - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' + is not defined","success":false}' + role: tool + tool_call_id: call_aybmoc41 + - content: null + reasoning: We lost results variable due to separate execution. Need to re-run search and get chunks in same code. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_243jvzlw + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor c in chunks[:5]:\n print(c[''chunk_id''], + c[''content''][:200])\n","stdout":"16\ncf9b6d33-34d4-487c-ae6b-a174592dc101 Phase 2: Label selection and guideline. + We reviewed the collected documents and identified the most common structural features they exhibit. This was achieved + by identifying recurrent layout elements \nca706a97-3e18-4cd5-af2b-6b5a9afa5d36 \nTable 1: DocLayNet dataset overview. + Along with the frequency of each class label, we present the relative occurrence (as % of row ''Total'') in the + train, test and validation sets. The inter-annotator\n1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 Preparation work included + uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], a cloud-native platform + which provides a visual annotation interface and allows f\nb18d8ada-e999-4561-87c0-266e6899e3d0 71-76. Total, triple + inter-annotator mAP @0.5-0.95 (%).Ten = 68-85\nFigure 3: Corpus Conversion Service annotation user interface. The + PDF page is shown in the background, with overlaid text-cells (in \n794e795c-c914-4dd4-baf4-4ada9083be9f (%).Ten + = 81-86. Picture, Count = 45976. Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of + Total.Val = 5.31. Picture, triple inter-annotator mAP @0.5-0.95 (%).All = 69-7\n","stderr":"","success":true}' + role: tool + tool_call_id: call_243jvzlw + - content: null + reasoning: We need list of element types or labels. Likely labels like "title", "section_header", "list_item", "text", + "table", "picture". Let's search for "label" in chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_9ntwuhmm + type: function + - content: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' + role: tool + tool_call_id: call_9ntwuhmm + - content: null + reasoning: Need to keep chunks. Let's combine. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels + = set()\nimport re\nfor c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], + re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_8u1f7ds9 + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels = set()\nimport re\nfor + c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"set()\n","stderr":"","success":true}' + role: tool + tool_call_id: call_8u1f7ds9 + model: gpt-oss + reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema + stream: false + temperature: 0.0 + tool_choice: auto + tools: + - function: + description: |- + Execute Python code in a sandboxed interpreter. + + The code has access to haiku.rag functions (search, list_documents, + get_document, get_chunk, llm). + + Use print() to output results. + + Structured result with success status, stdout, and stderr. + + name: execute_code + parameters: + additionalProperties: false + properties: + code: + description: Python code to execute. + type: string + required: + - code + type: object + strict: true + type: function + uri: http://localhost:11434/v1/chat/completions + response: + headers: + content-length: + - '576' + content-type: + - application/json + parsed_body: + choices: + - finish_reason: tool_calls + index: 0 + message: + content: '' + reasoning: No matches. Maybe labels are in metadata. Let's inspect chunk metadata. + role: assistant + tool_calls: + - function: + arguments: '{"code":"for c in chunks[:5]:\n print(c[''chunk_id''], c.get(''labels''))\n"}' + name: execute_code + id: call_787nz5pi + index: 0 + type: function + created: 1773329408 + id: chatcmpl-639 + model: gpt-oss + object: chat.completion + system_fingerprint: fp_ollama + usage: + completion_tokens: 60 + prompt_tokens: 3259 + total_tokens: 3319 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '14058' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + messages: + - content: |- + You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. + + You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. + + Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: + - results = await search("query") ✓ CORRECT + - import search ✗ WRONG - will fail + - results = search("query") ✗ WRONG - must use await + + ## Available Functions + + ### await search(query, limit=10) -> list[dict] + Search the knowledge base using hybrid search (vector + full-text). + Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings + + ### await list_documents(limit=10, offset=0) -> list[dict] + List available documents in the knowledge base. + Returns list of dicts with keys: id, title, uri, created_at + + ### await get_document(id_or_title) -> str | None + Get the full text content of a document by ID, title, or URI. + Returns the document content as a string, or None if not found. + + ### await get_chunk(chunk_id) -> dict | None + Get a specific chunk by its ID (from search results). + Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels + Use this to retrieve full chunk details and metadata for citation. + + ### await get_docling_document(document_id) -> dict | None + Get the full document structure as a dict (DoclingDocument format). + Use `list_documents()` or search results to get document IDs first. + - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) + - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` + - `pictures`: list of figures/images with metadata + - `pages`: page dimensions and metadata + + ### await llm(prompt) -> str + Call an LLM directly with the given prompt. Returns the response as a string. + Use this for classification, summarization, extraction, or any task where you + already have the content and just need LLM reasoning. + + ## Pre-loaded Documents Variable + + If documents were pre-loaded for this session, a `documents` variable is available: + ```python + # documents is a list of dicts with keys: id, title, uri, content + for doc in documents: + print(doc['title'], len(doc['content'])) + ``` + Check if it exists with: `try: documents ... except NameError: ...` + + ## Available Python Features + + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. + + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. + + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + + ## Strategy Guide + + 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. + 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. + 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. + 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. + 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. + + ## Example Patterns + + ### Counting documents matching a condition + ```python + docs = await list_documents(limit=100) + count = 0 + for doc in docs: + content = await get_document(doc['id']) + if content and 'keyword' in content.lower(): + count += 1 + print(f"Found in: {doc['title']}") + print(f"Total: {count}") + ``` + + ### Extracting data with regex + ```python + import re + numbers = [] + results = await search("financial data", limit=20) + for r in results: + amounts = re.findall(r'\$([\d,]+)', r['content']) + for a in amounts: + numbers.append(int(a.replace(',', ''))) + if numbers: + print(f"Average: {sum(numbers) / len(numbers)}") + ``` + + ### Extracting tables from a document + ```python + docs = await list_documents(limit=10) + for d in docs: + doc = await get_docling_document(d['id']) + if doc: + tables = doc.get('tables', []) + if tables: + print(f"{d['title']}: {len(tables)} table(s)") + for i, table in enumerate(tables): + grid = table.get('data', {}).get('grid', []) + for row in grid: + cells = [cell.get('text', '') for cell in row] + print(f" Table {i}: {cells}") + ``` + + ## Output Format + + Your final response MUST be valid JSON matching this exact schema: + ```json + {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} + ``` + + - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. + - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. + + Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} + + You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. + role: system + - content: Search for content about document element types or labels. What are all the different document element types + mentioned? List them all. + role: user + - content: null + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' + name: execute_code + id: call_nakznbjt + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' + role: tool + tool_call_id: call_nakznbjt + - content: null + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + type: function + - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' + is not defined","success":false}' + role: tool + tool_call_id: call_aybmoc41 + - content: null + reasoning: We lost results variable due to separate execution. Need to re-run search and get chunks in same code. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_243jvzlw + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor c in chunks[:5]:\n print(c[''chunk_id''], + c[''content''][:200])\n","stdout":"16\ncf9b6d33-34d4-487c-ae6b-a174592dc101 Phase 2: Label selection and guideline. + We reviewed the collected documents and identified the most common structural features they exhibit. This was achieved + by identifying recurrent layout elements \nca706a97-3e18-4cd5-af2b-6b5a9afa5d36 \nTable 1: DocLayNet dataset overview. + Along with the frequency of each class label, we present the relative occurrence (as % of row ''Total'') in the + train, test and validation sets. The inter-annotator\n1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 Preparation work included + uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], a cloud-native platform + which provides a visual annotation interface and allows f\nb18d8ada-e999-4561-87c0-266e6899e3d0 71-76. Total, triple + inter-annotator mAP @0.5-0.95 (%).Ten = 68-85\nFigure 3: Corpus Conversion Service annotation user interface. The + PDF page is shown in the background, with overlaid text-cells (in \n794e795c-c914-4dd4-baf4-4ada9083be9f (%).Ten + = 81-86. Picture, Count = 45976. Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of + Total.Val = 5.31. Picture, triple inter-annotator mAP @0.5-0.95 (%).All = 69-7\n","stderr":"","success":true}' + role: tool + tool_call_id: call_243jvzlw + - content: null + reasoning: We need list of element types or labels. Likely labels like "title", "section_header", "list_item", "text", + "table", "picture". Let's search for "label" in chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_9ntwuhmm + type: function + - content: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' + role: tool + tool_call_id: call_9ntwuhmm + - content: null + reasoning: Need to keep chunks. Let's combine. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels + = set()\nimport re\nfor c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], + re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_8u1f7ds9 + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels = set()\nimport re\nfor + c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"set()\n","stderr":"","success":true}' + role: tool + tool_call_id: call_8u1f7ds9 + - content: null + reasoning: No matches. Maybe labels are in metadata. Let's inspect chunk metadata. + role: assistant + tool_calls: + - function: + arguments: '{"code":"for c in chunks[:5]:\n print(c[''chunk_id''], c.get(''labels''))\n"}' + name: execute_code + id: call_787nz5pi + type: function + - content: '{"code":"for c in chunks[:5]:\n print(c[''chunk_id''], c.get(''labels''))\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' + role: tool + tool_call_id: call_787nz5pi + model: gpt-oss + reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema + stream: false + temperature: 0.0 + tool_choice: auto + tools: + - function: + description: |- + Execute Python code in a sandboxed interpreter. + + The code has access to haiku.rag functions (search, list_documents, + get_document, get_chunk, llm). + + Use print() to output results. + + Structured result with success status, stdout, and stderr. + + name: execute_code + parameters: + additionalProperties: false + properties: + code: + description: Python code to execute. + type: string + required: + - code + type: object + strict: true + type: function + uri: http://localhost:11434/v1/chat/completions + response: + headers: + content-length: + - '1193' + content-type: + - application/json + parsed_body: + choices: + - finish_reason: tool_calls + index: 0 + message: + content: '' + reasoning: We lost chunks again. Let's run full script and capture labels. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r + in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\n# + collect labels from metadata\nlabels_meta = set()\nfor c in chunks:\n if c.get(''labels''):\n labels_meta.update(c[''labels''])\nprint(''meta + labels'', labels_meta)\n# also search content for common types\nimport re\nlabels_content = set()\nfor c in + chunks:\n for t in [''title'',''section_header'',''list_item'',''text'',''table'',''picture'',''figure'',''caption'']:\n if + t in c[''content''].lower():\n labels_content.add(t)\nprint(''content types'', labels_content)\n"}' + name: execute_code + id: call_ugofsj7a + index: 0 + type: function + created: 1773329412 + id: chatcmpl-727 + model: gpt-oss + object: chat.completion + system_fingerprint: fp_ollama + usage: + completion_tokens: 208 + prompt_tokens: 3376 + total_tokens: 3584 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '99' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - document element types labels + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 5 + total_tokens: 5 + status: + code: 200 + message: OK +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '15929' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + messages: + - content: |- + You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. + + You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. + + Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: + - results = await search("query") ✓ CORRECT + - import search ✗ WRONG - will fail + - results = search("query") ✗ WRONG - must use await + + ## Available Functions + + ### await search(query, limit=10) -> list[dict] + Search the knowledge base using hybrid search (vector + full-text). + Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings + + ### await list_documents(limit=10, offset=0) -> list[dict] + List available documents in the knowledge base. + Returns list of dicts with keys: id, title, uri, created_at + + ### await get_document(id_or_title) -> str | None + Get the full text content of a document by ID, title, or URI. + Returns the document content as a string, or None if not found. + + ### await get_chunk(chunk_id) -> dict | None + Get a specific chunk by its ID (from search results). + Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels + Use this to retrieve full chunk details and metadata for citation. + + ### await get_docling_document(document_id) -> dict | None + Get the full document structure as a dict (DoclingDocument format). + Use `list_documents()` or search results to get document IDs first. + - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) + - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` + - `pictures`: list of figures/images with metadata + - `pages`: page dimensions and metadata + + ### await llm(prompt) -> str + Call an LLM directly with the given prompt. Returns the response as a string. + Use this for classification, summarization, extraction, or any task where you + already have the content and just need LLM reasoning. + + ## Pre-loaded Documents Variable + + If documents were pre-loaded for this session, a `documents` variable is available: + ```python + # documents is a list of dicts with keys: id, title, uri, content + for doc in documents: + print(doc['title'], len(doc['content'])) + ``` + Check if it exists with: `try: documents ... except NameError: ...` + + ## Available Python Features + + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. + + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. + + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + + ## Strategy Guide + + 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. + 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. + 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. + 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. + 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. + + ## Example Patterns + + ### Counting documents matching a condition + ```python + docs = await list_documents(limit=100) + count = 0 + for doc in docs: + content = await get_document(doc['id']) + if content and 'keyword' in content.lower(): + count += 1 + print(f"Found in: {doc['title']}") + print(f"Total: {count}") + ``` + + ### Extracting data with regex + ```python + import re + numbers = [] + results = await search("financial data", limit=20) + for r in results: + amounts = re.findall(r'\$([\d,]+)', r['content']) + for a in amounts: + numbers.append(int(a.replace(',', ''))) + if numbers: + print(f"Average: {sum(numbers) / len(numbers)}") + ``` + + ### Extracting tables from a document + ```python + docs = await list_documents(limit=10) + for d in docs: + doc = await get_docling_document(d['id']) + if doc: + tables = doc.get('tables', []) + if tables: + print(f"{d['title']}: {len(tables)} table(s)") + for i, table in enumerate(tables): + grid = table.get('data', {}).get('grid', []) + for row in grid: + cells = [cell.get('text', '') for cell in row] + print(f" Table {i}: {cells}") + ``` + + ## Output Format + + Your final response MUST be valid JSON matching this exact schema: + ```json + {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} + ``` + + - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. + - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. + + Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} + + You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. + role: system + - content: Search for content about document element types or labels. What are all the different document element types + mentioned? List them all. + role: user + - content: null + reasoning: We need to search for content about document element types or labels. Likely in docs. Let's search. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n"}' + name: execute_code + id: call_nakznbjt + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nprint(len(results))\nfor r + in results[:5]:\n print(r[''document_title''], r[''chunk_id''], r[''score''])\n","stdout":"16\nNone cf9b6d33-34d4-487c-ae6b-a174592dc101 + 0.032786883413791656\nNone ca706a97-3e18-4cd5-af2b-6b5a9afa5d36 0.0317540317773819\nNone 1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 + 0.03036576882004738\nNone b18d8ada-e999-4561-87c0-266e6899e3d0 0.029286926612257957\nNone 794e795c-c914-4dd4-baf4-4ada9083be9f + 0.01587301678955555\n","stderr":"","success":true}' + role: tool + tool_call_id: call_nakznbjt + - content: null + reasoning: Let's get chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_aybmoc41 + type: function + - content: '{"code":"chunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n","stdout":"","stderr":"NameError: name ''results'' + is not defined","success":false}' + role: tool + tool_call_id: call_aybmoc41 + - content: null + reasoning: We lost results variable due to separate execution. Need to re-run search and get chunks in same code. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor + c in chunks[:5]:\n print(c[''chunk_id''], c[''content''][:200])\n"}' + name: execute_code + id: call_243jvzlw + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nprint(len(chunks))\nfor c in chunks[:5]:\n print(c[''chunk_id''], + c[''content''][:200])\n","stdout":"16\ncf9b6d33-34d4-487c-ae6b-a174592dc101 Phase 2: Label selection and guideline. + We reviewed the collected documents and identified the most common structural features they exhibit. This was achieved + by identifying recurrent layout elements \nca706a97-3e18-4cd5-af2b-6b5a9afa5d36 \nTable 1: DocLayNet dataset overview. + Along with the frequency of each class label, we present the relative occurrence (as % of row ''Total'') in the + train, test and validation sets. The inter-annotator\n1f944bfa-d1f5-47ca-b96d-982fe0e2c2d9 Preparation work included + uploading and parsing the sourced PDF documents in the Corpus Conversion Service (CCS) [22], a cloud-native platform + which provides a visual annotation interface and allows f\nb18d8ada-e999-4561-87c0-266e6899e3d0 71-76. Total, triple + inter-annotator mAP @0.5-0.95 (%).Ten = 68-85\nFigure 3: Corpus Conversion Service annotation user interface. The + PDF page is shown in the background, with overlaid text-cells (in \n794e795c-c914-4dd4-baf4-4ada9083be9f (%).Ten + = 81-86. Picture, Count = 45976. Picture, % of Total.Train = 4.21. Picture, % of Total.Test = 2.78. Picture, % of + Total.Val = 5.31. Picture, triple inter-annotator mAP @0.5-0.95 (%).All = 69-7\n","stderr":"","success":true}' + role: tool + tool_call_id: call_243jvzlw + - content: null + reasoning: We need list of element types or labels. Likely labels like "title", "section_header", "list_item", "text", + "table", "picture". Let's search for "label" in chunks. + role: assistant + tool_calls: + - function: + arguments: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_9ntwuhmm + type: function + - content: '{"code":"labels = set()\nfor c in chunks:\n # look for words after ''label'' or ''labels''\n import + re\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' + role: tool + tool_call_id: call_9ntwuhmm + - content: null + reasoning: Need to keep chunks. Let's combine. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels + = set()\nimport re\nfor c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], + re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n"}' + name: execute_code + id: call_8u1f7ds9 + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\nlabels = set()\nimport re\nfor + c in chunks:\n matches = re.findall(r''label[s]?\\s*:\\s*([\\w_]+)'', c[''content''], re.IGNORECASE)\n labels.update(matches)\nprint(labels)\n","stdout":"set()\n","stderr":"","success":true}' + role: tool + tool_call_id: call_8u1f7ds9 + - content: null + reasoning: No matches. Maybe labels are in metadata. Let's inspect chunk metadata. + role: assistant + tool_calls: + - function: + arguments: '{"code":"for c in chunks[:5]:\n print(c[''chunk_id''], c.get(''labels''))\n"}' + name: execute_code + id: call_787nz5pi + type: function + - content: '{"code":"for c in chunks[:5]:\n print(c[''chunk_id''], c.get(''labels''))\n","stdout":"","stderr":"NameError: + name ''chunks'' is not defined","success":false}' + role: tool + tool_call_id: call_787nz5pi + - content: null + reasoning: We lost chunks again. Let's run full script and capture labels. + role: assistant + tool_calls: + - function: + arguments: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\n# collect + labels from metadata\nlabels_meta = set()\nfor c in chunks:\n if c.get(''labels''):\n labels_meta.update(c[''labels''])\nprint(''meta + labels'', labels_meta)\n# also search content for common types\nimport re\nlabels_content = set()\nfor c in + chunks:\n for t in [''title'',''section_header'',''list_item'',''text'',''table'',''picture'',''figure'',''caption'']:\n if + t in c[''content''].lower():\n labels_content.add(t)\nprint(''content types'', labels_content)\n"}' + name: execute_code + id: call_ugofsj7a + type: function + - content: '{"code":"results = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk + = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\n# collect labels from metadata\nlabels_meta + = set()\nfor c in chunks:\n if c.get(''labels''):\n labels_meta.update(c[''labels''])\nprint(''meta labels'', + labels_meta)\n# also search content for common types\nimport re\nlabels_content = set()\nfor c in chunks:\n for + t in [''title'',''section_header'',''list_item'',''text'',''table'',''picture'',''figure'',''caption'']:\n if + t in c[''content''].lower():\n labels_content.add(t)\nprint(''content types'', labels_content)\n","stdout":"meta + labels {''text'', ''footnote'', ''caption'', ''table''}\ncontent types {''title'', ''text'', ''table'', ''picture'', + ''caption'', ''figure''}\n","stderr":"","success":true}' + role: tool + tool_call_id: call_ugofsj7a + model: gpt-oss + reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema + stream: false + temperature: 0.0 + tool_choice: auto + tools: + - function: + description: |- + Execute Python code in a sandboxed interpreter. + + The code has access to haiku.rag functions (search, list_documents, + get_document, get_chunk, llm). + + Use print() to output results. + + Structured result with success status, stdout, and stderr. + + name: execute_code + parameters: + additionalProperties: false + properties: + code: + description: Python code to execute. + type: string + required: + - code + type: object + strict: true + type: function + uri: http://localhost:11434/v1/chat/completions + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked parsed_body: choices: - finish_reason: stop index: 0 message: - content: '{"answer":"The document element types (labels) mentioned across the retrieved documents are:\n- Title\n- - Text\n- Page-header\n- Page-footer\n- Section-header\n- Footnote\n- List-item\n- Table\n- Caption\n- Formula\n- - Picture\n\nThese are the distinct element types that appear in the search results.","program":"results = await - search(\"document element types\", limit=50)\nlabels = set()\nfor r in results:\n txt = r.get(''content'', - '''')\n # Find labels of form \"Label,\"\n for match in await regex_findall(r\"([A-Za-z-]+),\", txt):\n labels.add(match)\nif - labels:\n print(\"Detected labels:\")\n for lbl in sorted(labels):\n print(lbl)\n# Return JSON answer\nans - = {\n \"answer\": \"The document element types (labels) mentioned across the retrieved documents are:\\n- \" - + \"\\n- \".join(sorted(labels)) + \"\\n\",\n \"program\": \"\"\"\n# The code above prints the labels and constructs - the answer string.\n\"\"\"\n}\nprint(ans)"}' - reasoning: 'We saw labels: Page-header, Page-footer, Section-header, Table, Caption, Picture, Footnote, List-item, - Text, Title, Formula. Also maybe List-item. Also maybe Section-header. So list unique.' + content: '{"answer":"The documents contain the following distinct document element types (labels) that are referenced + either in the metadata or explicitly in the text:\n\n1. **text** – the main body text of the document.\n2. **footnote** + – annotations at the bottom of pages.\n3. **caption** – descriptive text for tables or figures.\n4. **table** + – tabular data structures.\n5. **title** – the document’s title or section headings.\n6. **picture** – images + embedded in the document.\n7. **figure** – graphical illustrations (often used interchangeably with picture).\n\nThese + are the only element types that appear in the retrieved chunks for the query \"document element types labels\".\n\n**Program**\nThe + following Python program searches the knowledge base for the query, extracts the chunks, and compiles a list of + unique element types found in both the chunk metadata and the chunk content.\n\n```python\nimport re\n\n# Search + for relevant chunks\nresults = await search(\"document element types labels\", limit=20)\nchunks = []\nfor r in + results:\n chunk = await get_chunk(r[''chunk_id''])\n if chunk:\n chunks.append(chunk)\n\n# Collect + labels from metadata\nlabels_meta = set()\nfor c in chunks:\n if c.get(''labels''):\n labels_meta.update(c[''labels''])\n\n# + Collect common element types mentioned in the content\ncommon_terms = [\n ''title'',\n ''section_header'',\n ''list_item'',\n ''text'',\n ''table'',\n ''picture'',\n ''figure'',\n ''caption'',\n ''footnote'',\n]\nlabels_content + = set()\nfor c in chunks:\n content_lower = c[''content''].lower()\n for term in common_terms:\n if + term in content_lower:\n labels_content.add(term)\n\n# Combine and output\nall_labels = sorted(labels_meta.union(labels_content))\nprint(\"Document + element types found:\")\nfor label in all_labels:\n print(f\"- {label}\")\n```\n\nRunning this program will + print the list of element types identified in the retrieved documents. The output matches the seven types listed + in the answer above." , "program":"import re\n\n# Search for relevant chunks\nresults = await search(\"document + element types labels\", limit=20)\nchunks = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n if + chunk:\n chunks.append(chunk)\n\n# Collect labels from metadata\nlabels_meta = set()\nfor c in chunks:\n if + c.get(''labels''):\n labels_meta.update(c[''labels''])\n\n# Collect common element types mentioned in the + content\ncommon_terms = [\n ''title'',\n ''section_header'',\n ''list_item'',\n ''text'',\n ''table'',\n ''picture'',\n ''figure'',\n ''caption'',\n ''footnote'',\n]\nlabels_content + = set()\nfor c in chunks:\n content_lower = c[''content''].lower()\n for term in common_terms:\n if + term in content_lower:\n labels_content.add(term)\n\n# Combine and output\nall_labels = sorted(labels_meta.union(labels_content))\nprint(\"Document + element types found:\")\nfor label in all_labels:\n print(f\"- {label}\")"}' + reasoning: 'So element types: text, footnote, caption, table, title, picture, figure. Also maybe section_header, + list_item not found. We''ll list these.' role: assistant - created: 1772628408 + created: 1773329434 id: chatcmpl-687 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 255 - prompt_tokens: 3658 - total_tokens: 3913 + completion_tokens: 770 + prompt_tokens: 3854 + total_tokens: 4624 status: code: 200 message: OK diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_get_chunk.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_get_chunk.yaml index d3e714ed..8ba43534 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_get_chunk.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_search_and_get_chunk.yaml @@ -48,7 +48,7 @@ interactions: connection: - keep-alive content-length: - - '7755' + - '7292' content-type: - application/json host: @@ -93,18 +93,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -122,11 +110,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -152,10 +140,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -216,6 +205,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -245,7 +235,7 @@ interactions: response: headers: content-length: - - '574' + - '537' content-type: - application/json parsed_body: @@ -254,24 +244,24 @@ interactions: index: 0 message: content: '' - reasoning: We need to search for "animals". + reasoning: We need to search for animals. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"animals\", limit=10)\nimport json\nprint(json.dumps(results, indent=2))"}' + arguments: '{"code":"results = await search(\"animals\", limit=10)\nprint(results)\n"}' name: execute_code - id: call_1b91tqi2 + id: call_po88tthj index: 0 type: function - created: 1772626980 - id: chatcmpl-326 + created: 1773329128 + id: chatcmpl-923 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 55 - prompt_tokens: 1692 - total_tokens: 1747 + completion_tokens: 46 + prompt_tokens: 1598 + total_tokens: 1644 status: code: 200 message: OK @@ -324,7 +314,7 @@ interactions: connection: - keep-alive content-length: - - '8333' + - '8052' content-type: - application/json host: @@ -369,18 +359,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -398,11 +376,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -428,10 +406,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -471,322 +450,20 @@ interactions: - content: Search for content about animals and tell me which document it came from. role: user - content: null - reasoning: We need to search for "animals". + reasoning: We need to search for animals. role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"animals\", limit=10)\nimport json\nprint(json.dumps(results, indent=2))"}' + arguments: '{"code":"results = await search(\"animals\", limit=10)\nprint(results)\n"}' name: execute_code - id: call_1b91tqi2 + id: call_po88tthj type: function - - content: '{"code":"results = await search(\"animals\", limit=10)\nimport json\nprint(json.dumps(results, indent=2))","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_1b91tqi2 - model: gpt-oss - reasoning_effort: low - response_format: - json_schema: - description: Result from RLM agent execution. - name: RLMResult - schema: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: json_schema - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '577' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: We can't import json. Need to use print with default. Just print results. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"animals\", limit=10)\nprint(results)"}' - name: execute_code - id: call_v8mqb6kj - index: 0 - type: function - created: 1772626981 - id: chatcmpl-834 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 54 - prompt_tokens: 1806 - total_tokens: 1860 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '77' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - animals - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 2 - total_tokens: 2 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '9130' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Search for content about animals and tell me which document it came from. - role: user - - content: null - reasoning: We need to search for "animals". - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"animals\", limit=10)\nimport json\nprint(json.dumps(results, indent=2))"}' - name: execute_code - id: call_1b91tqi2 - type: function - - content: '{"code":"results = await search(\"animals\", limit=10)\nimport json\nprint(json.dumps(results, indent=2))","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_1b91tqi2 - - content: null - reasoning: We can't import json. Need to use print with default. Just print results. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"animals\", limit=10)\nprint(results)"}' - name: execute_code - id: call_v8mqb6kj - type: function - - content: '{"code":"results = await search(\"animals\", limit=10)\nprint(results)","stdout":"[{''chunk_id'': ''38a21aa0-bc2b-42a1-8b7e-3b3b58c400bc'', - ''content'': ''The quick brown fox jumps over the lazy dog.'', ''document_id'': ''3c76c7ee-2ff3-4344-9dad-f8dd7d0176f2'', + - content: '{"code":"results = await search(\"animals\", limit=10)\nprint(results)\n","stdout":"[{''chunk_id'': ''e99a37f0-e774-4ba3-8136-d96d4eccfb5b'', + ''content'': ''The quick brown fox jumps over the lazy dog.'', ''document_id'': ''60587523-1041-4555-953a-999e36a5ac89'', ''document_title'': ''Animal Facts'', ''document_uri'': None, ''score'': 0.016393441706895828, ''page_numbers'': [], ''headings'': None}]\n","stderr":"","success":true}' role: tool - tool_call_id: call_v8mqb6kj + tool_call_id: call_po88tthj model: gpt-oss reasoning_effort: low response_format: @@ -809,6 +486,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -838,7 +516,7 @@ interactions: response: headers: content-length: - - '795' + - '1413' content-type: - application/json parsed_body: @@ -846,21 +524,26 @@ interactions: - finish_reason: stop index: 0 message: - content: '{"answer":"The content about animals was retrieved from the document titled \"Animal Facts\" (document_id: - 3c76c7ee-2ff3-4344-9dad-f8dd7d0176f2).","program":"results = await search(\"animals\", limit=10)\nfor res in results:\n doc_title - = res.get(''document_title'', ''Unknown Title'')\n doc_id = res.get(''document_id'')\n chunk_id = res.get(''chunk_id'')\n print(f\"Chunk - {chunk_id} from document ''{doc_title}'' (ID: {doc_id})\")"}' - reasoning: We got one. Let's output answer. + content: '{"answer":"The search returned a chunk from the document titled **\"Animal Facts\"** (document ID: 60587523-1041-4555-953a-999e36a5ac89). + The chunk contains the sentence: \"The quick brown fox jumps over the lazy dog.\"","program":"import json\n\nasync + def main():\n # Search for content about animals\n results = await search(\"animals\", limit=10)\n # + Prepare answer string\n if results:\n chunk = results[0]\n doc_title = chunk.get(''document_title'') + or \"Unknown Title\"\n doc_id = chunk.get(''document_id'')\n content = chunk.get(''content'')\n answer + = f\"The search returned a chunk from the document titled **\\\"{doc_title}\\\"** (document ID: {doc_id}). The + chunk contains the sentence: \\\"{content}\\\"\"\n else:\n answer = \"No relevant content found.\"\n # + Output JSON\n print(json.dumps({\"answer\": answer, \"program\": \"\"}))\n\n# Run the async main function\nimport + asyncio\nasyncio.run(main())"}' + reasoning: We got one chunk. Need to cite. Provide answer and program. role: assistant - created: 1772626985 - id: chatcmpl-701 + created: 1773329157 + id: chatcmpl-834 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 134 - prompt_tokens: 2033 - total_tokens: 2167 + completion_tokens: 253 + prompt_tokens: 1816 + total_tokens: 2069 status: code: 200 message: OK diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_semantic_analysis_with_llm.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_semantic_analysis_with_llm.yaml index 0d6235f8..95e55484 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_semantic_analysis_with_llm.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_semantic_analysis_with_llm.yaml @@ -131,7 +131,7 @@ interactions: connection: - keep-alive content-length: - - '7783' + - '7320' content-type: - application/json host: @@ -176,18 +176,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -205,11 +193,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -235,10 +223,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -299,6 +288,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -328,7 +318,7 @@ interactions: response: headers: content-length: - - '692' + - '725' content-type: - application/json parsed_body: @@ -337,25 +327,25 @@ interactions: index: 0 message: content: '' - reasoning: Need to search for quarterly update documents. + reasoning: We need quarterly updates. Likely documents contain quarterly updates. Search for "quarterly update". role: assistant tool_calls: - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' + arguments: '{"code":"import asyncio\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''chunk_id''], r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_uumnbbu0 + id: call_gt6nr456 index: 0 type: function - created: 1772626991 - id: chatcmpl-380 + created: 1773329127 + id: chatcmpl-207 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 87 - prompt_tokens: 1697 - total_tokens: 1784 + completion_tokens: 92 + prompt_tokens: 1603 + total_tokens: 1695 status: code: 200 message: OK @@ -408,7 +398,7 @@ interactions: connection: - keep-alive content-length: - - '8754' + - '8300' content-type: - application/json host: @@ -453,18 +443,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -482,11 +460,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -512,10 +490,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -555,21 +534,21 @@ interactions: - content: Analyze the sentiment of each quarterly update. How many quarters were positive, negative, and mixed? role: user - content: null - reasoning: Need to search for quarterly update documents. + reasoning: We need quarterly updates. Likely documents contain quarterly updates. Search for "quarterly update". role: assistant tool_calls: - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' + arguments: '{"code":"import asyncio\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''chunk_id''], r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_uumnbbu0 + id: call_gt6nr456 type: function - - content: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n","stdout":"3\n0.032786883413791656 - 427522ed-8eeb-49cb-aa42-7ff86e19b1ec Q3 Update\n0.032258063554763794 1fb9ca16-a348-43cb-ba36-b421b2326826 Q2 Update\n0.01587301678955555 - b991414f-77c4-4101-bafc-1ed09376d7c4 Q1 Update\n","stderr":"","success":true}' + - content: '{"code":"import asyncio\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''chunk_id''], r[''document_title''], r[''score''])\n","stdout":"3\n4633d592-5df2-4e33-8810-0836f5de1781 + Q3 Update 0.032786883413791656\n3be7131b-6ac5-4eb8-8c4b-af4826a84c29 Q2 Update 0.032258063554763794\n58bde75b-5c9c-4f6f-b76e-88844b0ce6ac + Q1 Update 0.01587301678955555\n","stderr":"","success":true}' role: tool - tool_call_id: call_uumnbbu0 + tool_call_id: call_gt6nr456 model: gpt-oss reasoning_effort: low response_format: @@ -592,6 +571,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -621,7 +601,7 @@ interactions: response: headers: content-length: - - '1255' + - '938' content-type: - application/json parsed_body: @@ -630,30 +610,26 @@ interactions: index: 0 message: content: '' - reasoning: So 3 updates. We need sentiment of each. We can get chunk content then use llm to classify sentiment - or simple regex. Use llm to classify. + reasoning: 'We have 3 chunks: Q3, Q2, Q1. Need sentiment of each. Use llm on content. Get chunks.' role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = - chunk[''content'']\n prompt = f\"Classify the sentiment of the following quarterly update as ''positive'', - ''negative'', or ''mixed''.\\nUpdate: {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if - sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], - sentiment))\nprint(sentiment_counts)\nprint(answers)\n"}' + arguments: '{"code":"import asyncio\nchunks = [\"4633d592-5df2-4e33-8810-0836f5de1781\",\"3be7131b-6ac5-4eb8-8c4b-af4826a84c29\",\"58bde75b-5c9c-4f6f-b76e-88844b0ce6ac\"]\nfor + cid in chunks:\n chunk = await get_chunk(cid)\n print(cid, chunk[''document_title''])\n sentiment + = await llm(f\"Determine if the following text is positive, negative, or mixed. Text: {chunk[''content'']}\")\n print(sentiment)\n"}' name: execute_code - id: call_ufxsa9nq + id: call_b65254bz index: 0 type: function - created: 1772626995 - id: chatcmpl-477 + created: 1773329139 + id: chatcmpl-759 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 221 - prompt_tokens: 1966 - total_tokens: 2187 + completion_tokens: 202 + prompt_tokens: 1884 + total_tokens: 2086 status: code: 200 message: OK @@ -666,7 +642,7 @@ interactions: connection: - keep-alive content-length: - - '10880' + - '358' content-type: - application/json host: @@ -674,268 +650,39 @@ interactions: method: POST parsed_body: messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Analyze the sentiment of each quarterly update. How many quarters were positive, negative, and mixed? + - content: 'Determine if the following text is positive, negative, or mixed. Text: Mixed results this quarter. While + product quality improved, marketing campaigns underperformed. Revenue was flat compared to last year but customer + retention increased.' role: user - - content: null - reasoning: Need to search for quarterly update documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' - name: execute_code - id: call_uumnbbu0 - type: function - - content: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n","stdout":"3\n0.032786883413791656 - 427522ed-8eeb-49cb-aa42-7ff86e19b1ec Q3 Update\n0.032258063554763794 1fb9ca16-a348-43cb-ba36-b421b2326826 Q2 Update\n0.01587301678955555 - b991414f-77c4-4101-bafc-1ed09376d7c4 Q1 Update\n","stderr":"","success":true}' - role: tool - tool_call_id: call_uumnbbu0 - - content: null - reasoning: So 3 updates. We need sentiment of each. We can get chunk content then use llm to classify sentiment or - simple regex. Use llm to classify. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n"}' - name: execute_code - id: call_ufxsa9nq - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n","stdout":"","stderr":"Expected - name, got Subscript(ExprSubscript { node_index: NodeIndex(None), range: 503..530, value: Name(ExprName { node_index: - NodeIndex(None), range: 503..519, id: Name(\"sentiment_counts\"), ctx: Load }), slice: Name(ExprName { node_index: - NodeIndex(None), range: 520..529, id: Name(\"sentiment\"), ctx: Load }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_ufxsa9nq model: gpt-oss reasoning_effort: low - response_format: - json_schema: - description: Result from RLM agent execution. - name: RLMResult - schema: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: json_schema stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function + temperature: 0.0 uri: http://localhost:11434/v1/chat/completions response: headers: content-length: - - '1254' + - '424' content-type: - application/json parsed_body: choices: - - finish_reason: tool_calls + - finish_reason: stop index: 0 message: - content: '' - reasoning: 'Syntax error: can''t subscript sentiment_counts with variable. Use getattr? Actually Counter supports - update. Just do sentiment_counts[sentiment] +=1 works. The error shows misuse of attribute? maybe sentiment variable - name conflict. Let''s rename var.' + content: Mixed. + reasoning: 'We need to classify sentiment: positive, negative, or mixed. The text has both positive and negative + aspects. So mixed.' role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_w58ovnlw - index: 0 - type: function - created: 1772627001 - id: chatcmpl-945 + created: 1773329150 + id: chatcmpl-678 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 225 - prompt_tokens: 2472 - total_tokens: 2697 + completion_tokens: 37 + prompt_tokens: 109 + total_tokens: 146 status: code: 200 message: OK @@ -948,7 +695,7 @@ interactions: connection: - keep-alive content-length: - - '12881' + - '351' content-type: - application/json host: @@ -956,292 +703,38 @@ interactions: method: POST parsed_body: messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Analyze the sentiment of each quarterly update. How many quarters were positive, negative, and mixed? + - content: 'Determine if the following text is positive, negative, or mixed. Text: We faced significant challenges this + quarter. Supply chain issues caused delays, and we missed our revenue target by 15%. Several key employees left + the company.' role: user - - content: null - reasoning: Need to search for quarterly update documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' - name: execute_code - id: call_uumnbbu0 - type: function - - content: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n","stdout":"3\n0.032786883413791656 - 427522ed-8eeb-49cb-aa42-7ff86e19b1ec Q3 Update\n0.032258063554763794 1fb9ca16-a348-43cb-ba36-b421b2326826 Q2 Update\n0.01587301678955555 - b991414f-77c4-4101-bafc-1ed09376d7c4 Q1 Update\n","stderr":"","success":true}' - role: tool - tool_call_id: call_uumnbbu0 - - content: null - reasoning: So 3 updates. We need sentiment of each. We can get chunk content then use llm to classify sentiment or - simple regex. Use llm to classify. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n"}' - name: execute_code - id: call_ufxsa9nq - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n","stdout":"","stderr":"Expected - name, got Subscript(ExprSubscript { node_index: NodeIndex(None), range: 503..530, value: Name(ExprName { node_index: - NodeIndex(None), range: 503..519, id: Name(\"sentiment_counts\"), ctx: Load }), slice: Name(ExprName { node_index: - NodeIndex(None), range: 520..529, id: Name(\"sentiment\"), ctx: Load }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_ufxsa9nq - - content: null - reasoning: 'Syntax error: can''t subscript sentiment_counts with variable. Use getattr? Actually Counter supports - update. Just do sentiment_counts[sentiment] +=1 works. The error shows misuse of attribute? maybe sentiment variable - name conflict. Let''s rename var.' - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_w58ovnlw - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"Expected name, got Subscript(ExprSubscript { node_index: - NodeIndex(None), range: 420..436, value: Name(ExprName { node_index: NodeIndex(None), range: 420..431, id: Name(\"sent_counts\"), - ctx: Load }), slice: Name(ExprName { node_index: NodeIndex(None), range: 432..435, id: Name(\"sen\"), ctx: Load - }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_w58ovnlw model: gpt-oss reasoning_effort: low - response_format: - json_schema: - description: Result from RLM agent execution. - name: RLMResult - schema: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: json_schema stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function + temperature: 0.0 uri: http://localhost:11434/v1/chat/completions response: headers: content-length: - - '1196' + - '339' content-type: - application/json parsed_body: choices: - - finish_reason: tool_calls + - finish_reason: stop index: 0 message: - content: '' - reasoning: It appears the sandbox forbids subscript assignment? maybe need to use sent_counts.update? Instead of - bracket. Use sent_counts.update([sen]). Also to count, use add. Let's just use dict. + content: '**Negative**' + reasoning: 'We need sentiment: negative.' role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_bnpwbfo4 - index: 0 - type: function - created: 1772627006 - id: chatcmpl-676 + created: 1773329166 + id: chatcmpl-974 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 219 - prompt_tokens: 2969 - total_tokens: 3188 + completion_tokens: 19 + prompt_tokens: 112 + total_tokens: 131 status: code: 200 message: OK @@ -1254,47 +747,7 @@ interactions: connection: - keep-alive content-length: - - '86' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - quarterly update - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 4 - total_tokens: 4 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '14556' + - '342' content-type: - application/json host: @@ -1302,795 +755,37 @@ interactions: method: POST parsed_body: messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Analyze the sentiment of each quarterly update. How many quarters were positive, negative, and mixed? + - content: 'Determine if the following text is positive, negative, or mixed. Text: The new product launch exceeded expectations. + Sales grew 40% and customer feedback has been overwhelmingly positive. Team morale is at an all-time high.' role: user - - content: null - reasoning: Need to search for quarterly update documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' - name: execute_code - id: call_uumnbbu0 - type: function - - content: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n","stdout":"3\n0.032786883413791656 - 427522ed-8eeb-49cb-aa42-7ff86e19b1ec Q3 Update\n0.032258063554763794 1fb9ca16-a348-43cb-ba36-b421b2326826 Q2 Update\n0.01587301678955555 - b991414f-77c4-4101-bafc-1ed09376d7c4 Q1 Update\n","stderr":"","success":true}' - role: tool - tool_call_id: call_uumnbbu0 - - content: null - reasoning: So 3 updates. We need sentiment of each. We can get chunk content then use llm to classify sentiment or - simple regex. Use llm to classify. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n"}' - name: execute_code - id: call_ufxsa9nq - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n","stdout":"","stderr":"Expected - name, got Subscript(ExprSubscript { node_index: NodeIndex(None), range: 503..530, value: Name(ExprName { node_index: - NodeIndex(None), range: 503..519, id: Name(\"sentiment_counts\"), ctx: Load }), slice: Name(ExprName { node_index: - NodeIndex(None), range: 520..529, id: Name(\"sentiment\"), ctx: Load }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_ufxsa9nq - - content: null - reasoning: 'Syntax error: can''t subscript sentiment_counts with variable. Use getattr? Actually Counter supports - update. Just do sentiment_counts[sentiment] +=1 works. The error shows misuse of attribute? maybe sentiment variable - name conflict. Let''s rename var.' - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_w58ovnlw - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"Expected name, got Subscript(ExprSubscript { node_index: - NodeIndex(None), range: 420..436, value: Name(ExprName { node_index: NodeIndex(None), range: 420..431, id: Name(\"sent_counts\"), - ctx: Load }), slice: Name(ExprName { node_index: NodeIndex(None), range: 432..435, id: Name(\"sen\"), ctx: Load - }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_w58ovnlw - - content: null - reasoning: It appears the sandbox forbids subscript assignment? maybe need to use sent_counts.update? Instead of bracket. - Use sent_counts.update([sen]). Also to count, use add. Let's just use dict. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_bnpwbfo4 - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"ModuleNotFoundError: No module named ''collections''","success":false}' - role: tool - tool_call_id: call_bnpwbfo4 model: gpt-oss reasoning_effort: low - response_format: - json_schema: - description: Result from RLM agent execution. - name: RLMResult - schema: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: json_schema stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function + temperature: 0.0 uri: http://localhost:11434/v1/chat/completions response: headers: - content-length: - - '1048' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: collections not available? maybe only json. Use dict manually. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor - r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify - sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = await llm(pr).strip().lower()\n if - sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_hcn1qab7 - index: 0 - type: function - created: 1772627011 - id: chatcmpl-88 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 192 - prompt_tokens: 3378 - total_tokens: 3570 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '86' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - quarterly update - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 4 - total_tokens: 4 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '16070' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Analyze the sentiment of each quarterly update. How many quarters were positive, negative, and mixed? - role: user - - content: null - reasoning: Need to search for quarterly update documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' - name: execute_code - id: call_uumnbbu0 - type: function - - content: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n","stdout":"3\n0.032786883413791656 - 427522ed-8eeb-49cb-aa42-7ff86e19b1ec Q3 Update\n0.032258063554763794 1fb9ca16-a348-43cb-ba36-b421b2326826 Q2 Update\n0.01587301678955555 - b991414f-77c4-4101-bafc-1ed09376d7c4 Q1 Update\n","stderr":"","success":true}' - role: tool - tool_call_id: call_uumnbbu0 - - content: null - reasoning: So 3 updates. We need sentiment of each. We can get chunk content then use llm to classify sentiment or - simple regex. Use llm to classify. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n"}' - name: execute_code - id: call_ufxsa9nq - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n","stdout":"","stderr":"Expected - name, got Subscript(ExprSubscript { node_index: NodeIndex(None), range: 503..530, value: Name(ExprName { node_index: - NodeIndex(None), range: 503..519, id: Name(\"sentiment_counts\"), ctx: Load }), slice: Name(ExprName { node_index: - NodeIndex(None), range: 520..529, id: Name(\"sentiment\"), ctx: Load }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_ufxsa9nq - - content: null - reasoning: 'Syntax error: can''t subscript sentiment_counts with variable. Use getattr? Actually Counter supports - update. Just do sentiment_counts[sentiment] +=1 works. The error shows misuse of attribute? maybe sentiment variable - name conflict. Let''s rename var.' - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_w58ovnlw - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"Expected name, got Subscript(ExprSubscript { node_index: - NodeIndex(None), range: 420..436, value: Name(ExprName { node_index: NodeIndex(None), range: 420..431, id: Name(\"sent_counts\"), - ctx: Load }), slice: Name(ExprName { node_index: NodeIndex(None), range: 432..435, id: Name(\"sen\"), ctx: Load - }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_w58ovnlw - - content: null - reasoning: It appears the sandbox forbids subscript assignment? maybe need to use sent_counts.update? Instead of bracket. - Use sent_counts.update([sen]). Also to count, use add. Let's just use dict. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_bnpwbfo4 - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"ModuleNotFoundError: No module named ''collections''","success":false}' - role: tool - tool_call_id: call_bnpwbfo4 - - content: null - reasoning: collections not available? maybe only json. Use dict manually. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor r - in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify - sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = await llm(pr).strip().lower()\n if - sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_hcn1qab7 - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor r in results:\n chunk - = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify sentiment as ''positive'', - ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = await llm(pr).strip().lower()\n if sen - not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"AttributeError: ''coroutine'' object has no attribute - ''strip''","success":false}' - role: tool - tool_call_id: call_hcn1qab7 - model: gpt-oss - reasoning_effort: low - response_format: - json_schema: - description: Result from RLM agent execution. - name: RLMResult - schema: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: json_schema - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '1400' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: 'await llm returns coroutine? need await llm? I used await correctly. The result is coroutine? maybe - llm returns str directly. Mist: need to use await llm(pr) but it''s inside for; correct. But error says coroutine - object has no attribute strip implying await not used. I wrote await llm(pr).strip() - but due to precedence, - await applies to llm(pr).strip() incorrectly. Need parentheses: (await llm(pr)).strip().' - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor - r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify - sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = (await - llm(pr)).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] - = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_22vyxlej - index: 0 - type: function - created: 1772627017 - id: chatcmpl-559 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 277 - prompt_tokens: 3765 - total_tokens: 4042 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '86' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - encoding_format: base64 - input: - - quarterly update - model: qwen3-embedding:4b - uri: http://localhost:11434/v1/embeddings - response: - headers: - content-type: - - application/json - transfer-encoding: - - chunked - parsed_body: - data: - - embedding: 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 - index: 0 - object: embedding - model: qwen3-embedding:4b - object: list - usage: - prompt_tokens: 4 - total_tokens: 4 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive content-length: - '348' content-type: - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - Classify sentiment as 'positive', 'negative', or 'mixed'. - Update: Mixed results this quarter. While product quality improved, marketing campaigns underperformed. Revenue was flat compared to last year but customer retention increased. - Sentiment: - role: user - model: gpt-oss - reasoning_effort: low - stream: false - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '482' - content-type: - - application/json parsed_body: choices: - finish_reason: stop index: 0 message: - content: 'Sentiment: mixed' - reasoning: 'We classify overall sentiment: product quality improved (positive), marketing underperformed (negative), - revenue flat (neutral), retention increased (positive). Mixed.' + content: Positive. + reasoning: 'We need to classify sentiment: positive.' role: assistant - created: 1772627018 - id: chatcmpl-301 + created: 1773329173 + id: chatcmpl-656 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 43 - prompt_tokens: 113 - total_tokens: 156 + completion_tokens: 20 + prompt_tokens: 111 + total_tokens: 131 status: code: 200 message: OK @@ -2103,111 +798,7 @@ interactions: connection: - keep-alive content-length: - - '341' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - Classify sentiment as 'positive', 'negative', or 'mixed'. - Update: We faced significant challenges this quarter. Supply chain issues caused delays, and we missed our revenue target by 15%. Several key employees left the company. - Sentiment: - role: user - model: gpt-oss - reasoning_effort: low - stream: false - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '388' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: stop - index: 0 - message: - content: 'Sentiment: negative' - reasoning: We need to classify sentiment. The passage is negative. So 'negative'. - role: assistant - created: 1772627019 - id: chatcmpl-565 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 29 - prompt_tokens: 116 - total_tokens: 145 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '332' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - Classify sentiment as 'positive', 'negative', or 'mixed'. - Update: The new product launch exceeded expectations. Sales grew 40% and customer feedback has been overwhelmingly positive. Team morale is at an all-time high. - Sentiment: - role: user - model: gpt-oss - reasoning_effort: low - stream: false - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '376' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: stop - index: 0 - message: - content: 'Sentiment: **positive**' - reasoning: We need to label overall sentiment. It's all positive. - role: assistant - created: 1772627020 - id: chatcmpl-206 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 27 - prompt_tokens: 115 - total_tokens: 142 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '17967' + - '9692' content-type: - application/json host: @@ -2252,18 +843,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -2281,11 +860,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -2311,10 +890,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -2354,136 +934,39 @@ interactions: - content: Analyze the sentiment of each quarterly update. How many quarters were positive, negative, and mixed? role: user - content: null - reasoning: Need to search for quarterly update documents. + reasoning: We need quarterly updates. Likely documents contain quarterly updates. Search for "quarterly update". role: assistant tool_calls: - function: - arguments: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n"}' + arguments: '{"code":"import asyncio\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''chunk_id''], r[''document_title''], r[''score''])\n"}' name: execute_code - id: call_uumnbbu0 + id: call_gt6nr456 type: function - - content: '{"code":"# Search for quarterly updates\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor - r in results[:5]:\n print(r[''score''], r[''chunk_id''], r.get(''document_title'', ''''))\n","stdout":"3\n0.032786883413791656 - 427522ed-8eeb-49cb-aa42-7ff86e19b1ec Q3 Update\n0.032258063554763794 1fb9ca16-a348-43cb-ba36-b421b2326826 Q2 Update\n0.01587301678955555 - b991414f-77c4-4101-bafc-1ed09376d7c4 Q1 Update\n","stderr":"","success":true}' + - content: '{"code":"import asyncio\nresults = await search(\"quarterly update\", limit=20)\nprint(len(results))\nfor + r in results[:5]:\n print(r[''chunk_id''], r[''document_title''], r[''score''])\n","stdout":"3\n4633d592-5df2-4e33-8810-0836f5de1781 + Q3 Update 0.032786883413791656\n3be7131b-6ac5-4eb8-8c4b-af4826a84c29 Q2 Update 0.032258063554763794\n58bde75b-5c9c-4f6f-b76e-88844b0ce6ac + Q1 Update 0.01587301678955555\n","stderr":"","success":true}' role: tool - tool_call_id: call_uumnbbu0 + tool_call_id: call_gt6nr456 - content: null - reasoning: So 3 updates. We need sentiment of each. We can get chunk content then use llm to classify sentiment or - simple regex. Use llm to classify. + reasoning: 'We have 3 chunks: Q3, Q2, Q1. Need sentiment of each. Use llm on content. Get chunks.' role: assistant tool_calls: - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n"}' + arguments: '{"code":"import asyncio\nchunks = [\"4633d592-5df2-4e33-8810-0836f5de1781\",\"3be7131b-6ac5-4eb8-8c4b-af4826a84c29\",\"58bde75b-5c9c-4f6f-b76e-88844b0ce6ac\"]\nfor + cid in chunks:\n chunk = await get_chunk(cid)\n print(cid, chunk[''document_title''])\n sentiment = + await llm(f\"Determine if the following text is positive, negative, or mixed. Text: {chunk[''content'']}\")\n print(sentiment)\n"}' name: execute_code - id: call_ufxsa9nq + id: call_b65254bz type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsentiment_counts - = Counter()\nanswers = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n content = chunk[''content'']\n prompt - = f\"Classify the sentiment of the following quarterly update as ''positive'', ''negative'', or ''mixed''.\\nUpdate: - {content}\\nSentiment:\" \n sentiment = await llm(prompt).strip().lower()\n if sentiment not in [''positive'',''negative'',''mixed'']:\n sentiment - = ''mixed''\n sentiment_counts[sentiment]+=1\n answers.append((chunk[''document_title''], sentiment))\nprint(sentiment_counts)\nprint(answers)\n","stdout":"","stderr":"Expected - name, got Subscript(ExprSubscript { node_index: NodeIndex(None), range: 503..530, value: Name(ExprName { node_index: - NodeIndex(None), range: 503..519, id: Name(\"sentiment_counts\"), ctx: Load }), slice: Name(ExprName { node_index: - NodeIndex(None), range: 520..529, id: Name(\"sentiment\"), ctx: Load }), ctx: Store })","success":false}' + - content: '{"code":"import asyncio\nchunks = [\"4633d592-5df2-4e33-8810-0836f5de1781\",\"3be7131b-6ac5-4eb8-8c4b-af4826a84c29\",\"58bde75b-5c9c-4f6f-b76e-88844b0ce6ac\"]\nfor + cid in chunks:\n chunk = await get_chunk(cid)\n print(cid, chunk[''document_title''])\n sentiment = await + llm(f\"Determine if the following text is positive, negative, or mixed. Text: {chunk[''content'']}\")\n print(sentiment)\n","stdout":"4633d592-5df2-4e33-8810-0836f5de1781 + Q3 Update\nMixed.\n3be7131b-6ac5-4eb8-8c4b-af4826a84c29 Q2 Update\n**Negative**\n58bde75b-5c9c-4f6f-b76e-88844b0ce6ac + Q1 Update\nPositive.\n","stderr":"","success":true}' role: tool - tool_call_id: call_ufxsa9nq - - content: null - reasoning: 'Syntax error: can''t subscript sentiment_counts with variable. Use getattr? Actually Counter supports - update. Just do sentiment_counts[sentiment] +=1 works. The error shows misuse of attribute? maybe sentiment variable - name conflict. Let''s rename var.' - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_w58ovnlw - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen]+=1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"Expected name, got Subscript(ExprSubscript { node_index: - NodeIndex(None), range: 420..436, value: Name(ExprName { node_index: NodeIndex(None), range: 420..431, id: Name(\"sent_counts\"), - ctx: Load }), slice: Name(ExprName { node_index: NodeIndex(None), range: 432..435, id: Name(\"sen\"), ctx: Load - }), ctx: Store })","success":false}' - role: tool - tool_call_id: call_w58ovnlw - - content: null - reasoning: It appears the sandbox forbids subscript assignment? maybe need to use sent_counts.update? Instead of bracket. - Use sent_counts.update([sen]). Also to count, use add. Let's just use dict. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen - = await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_bnpwbfo4 - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nfrom collections import Counter\nsent_counts - = Counter()\nans = []\nfor r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr - = f\"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = - await llm(pr).strip().lower()\n if sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts.update([sen])\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"ModuleNotFoundError: No module named ''collections''","success":false}' - role: tool - tool_call_id: call_bnpwbfo4 - - content: null - reasoning: collections not available? maybe only json. Use dict manually. - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor r - in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify - sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = await llm(pr).strip().lower()\n if - sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_hcn1qab7 - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor r in results:\n chunk - = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify sentiment as ''positive'', - ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = await llm(pr).strip().lower()\n if sen - not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"","stderr":"AttributeError: ''coroutine'' object has no attribute - ''strip''","success":false}' - role: tool - tool_call_id: call_hcn1qab7 - - content: null - reasoning: 'await llm returns coroutine? need await llm? I used await correctly. The result is coroutine? maybe llm - returns str directly. Mist: need to use await llm(pr) but it''s inside for; correct. But error says coroutine object - has no attribute strip implying await not used. I wrote await llm(pr).strip() - but due to precedence, await applies - to llm(pr).strip() incorrectly. Need parentheses: (await llm(pr)).strip().' - role: assistant - tool_calls: - - function: - arguments: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor r - in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify - sentiment as ''positive'', ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = (await llm(pr)).strip().lower()\n if - sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n"}' - name: execute_code - id: call_22vyxlej - type: function - - content: '{"code":"results = await search(\"quarterly update\", limit=20)\nsent_counts = {}\nans = []\nfor r in results:\n chunk - = await get_chunk(r[''chunk_id''])\n txt = chunk[''content'']\n pr = f\"Classify sentiment as ''positive'', - ''negative'', or ''mixed''.\\nUpdate: {txt}\\nSentiment:\" \n sen = (await llm(pr)).strip().lower()\n if - sen not in [''positive'',''negative'',''mixed'']:\n sen=''mixed''\n sent_counts[sen] = sent_counts.get(sen,0)+1\n ans.append((chunk[''document_title''], - sen))\nprint(sent_counts)\nprint(ans)\n","stdout":"{''mixed'': 3}\n[(''Q3 Update'', ''mixed''), (''Q2 Update'', - ''mixed''), (''Q1 Update'', ''mixed'')]\n","stderr":"","success":true}' - role: tool - tool_call_id: call_22vyxlej + tool_call_id: call_b65254bz model: gpt-oss reasoning_effort: low response_format: @@ -2506,6 +989,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -2535,7 +1019,7 @@ interactions: response: headers: content-length: - - '1385' + - '1730' content-type: - application/json parsed_body: @@ -2543,25 +1027,28 @@ interactions: - finish_reason: stop index: 0 message: - content: '{"answer":"All three quarterly updates (Q1, Q2, Q3) were classified as ''mixed'' sentiment by the LLM. - Therefore, 0 quarters were positive, 0 negative, and 3 quarters were mixed.","program":"# Analyze sentiment of - quarterly updates\nasync def analyze_qtr_sentiments():\n results = await search(\"quarterly update\", limit=20)\n sent_counts - = {}\n answers = []\n for r in results:\n chunk = await get_chunk(r[''chunk_id''])\n txt = - chunk[''content'']\n prompt = (\n \"Classify sentiment as ''positive'', ''negative'', or ''mixed''.\\n\"\n f\"Update: - {txt}\\n\"\n \"Sentiment:\"\n )\n sen = (await llm(prompt)).strip().lower()\n if - sen not in [''positive'', ''negative'', ''mixed'']:\n sen = ''mixed''\n sent_counts[sen] = sent_counts.get(sen, - 0) + 1\n answers.append((chunk[''document_title''], sen))\n print(\"Sentiment counts: \", sent_counts)\n print(\"Detailed - results: \", answers)\n\n# Run the analysis\nawait analyze_qtr_sentiments()\n"}' + content: '{"answer":"There were three quarterly updates. The sentiment analysis shows: 1 positive quarter (Q1), + 1 negative quarter (Q2), and 1 mixed quarter (Q3).","program":"import asyncio\n\n# Define the chunk IDs for the + quarterly updates\nchunk_ids = [\n \"4633d592-5df2-4e33-8810-0836f5de1781\", # Q3 Update\n \"3be7131b-6ac5-4eb8-8c4b-af4826a84c29\", # + Q2 Update\n \"58bde75b-5c9c-4f6f-b76e-88844b0ce6ac\" # Q1 Update\n]\n\n# Function to get sentiment for a + chunk\nasync def get_sentiment(chunk_id):\n chunk = await get_chunk(chunk_id)\n prompt = f\"Determine if + the following text is positive, negative, or mixed. Text: {chunk[''content'']}\"\n sentiment = await llm(prompt)\n return + chunk[''document_title''], sentiment.strip()\n\n# Main async routine\nasync def main():\n results = []\n for + cid in chunk_ids:\n title, sentiment = await get_sentiment(cid)\n results.append((title, sentiment))\n # + Count sentiments\n counts = {\"Positive\":0, \"Negative\":0, \"Mixed\":0}\n for _, s in results:\n key + = s.split()[0] # first word (Positive, Negative, Mixed)\n counts[key] += 1\n # Print summary\n print(\"Sentiment + counts:\")\n for k, v in counts.items():\n print(f\"{k}: {v}\")\n\n# Run the async main function\nasyncio.run(main())"}' + reasoning: 'Counts: positive 1, negative 1, mixed 1.' role: assistant - created: 1772627032 - id: chatcmpl-852 + created: 1773329203 + id: chatcmpl-158 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 283 - prompt_tokens: 4258 - total_tokens: 4541 + completion_tokens: 405 + prompt_tokens: 2378 + total_tokens: 2783 status: code: 200 message: OK diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_filter.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_filter.yaml index e409ef10..f7c86069 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_filter.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_filter.yaml @@ -128,7 +128,7 @@ interactions: connection: - keep-alive content-length: - - '7715' + - '7252' content-type: - application/json host: @@ -173,18 +173,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -202,11 +190,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -232,10 +220,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -296,6 +285,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -325,7 +315,7 @@ interactions: response: headers: content-length: - - '522' + - '576' content-type: - application/json parsed_body: @@ -334,24 +324,25 @@ interactions: index: 0 message: content: '' - reasoning: Need to list documents. + reasoning: We need to list documents. role: assistant tool_calls: - function: - arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\n"}' + arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\nfor d in docs:\n print(d[''id''], + d.get(''title''))"}' name: execute_code - id: call_jsd3hga7 + id: call_nap68rkx index: 0 type: function - created: 1772626976 - id: chatcmpl-987 + created: 1773329124 + id: chatcmpl-461 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 46 - prompt_tokens: 1684 - total_tokens: 1730 + completion_tokens: 64 + prompt_tokens: 1590 + total_tokens: 1654 status: code: 200 message: OK @@ -364,7 +355,7 @@ interactions: connection: - keep-alive content-length: - - '8160' + - '7846' content-type: - application/json host: @@ -409,18 +400,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -438,11 +417,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -468,10 +447,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -511,17 +491,19 @@ interactions: - content: How many documents are available? role: user - content: null - reasoning: Need to list documents. + reasoning: We need to list documents. role: assistant tool_calls: - function: - arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\n"}' + arguments: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\nfor d in docs:\n print(d[''id''], + d.get(''title''))"}' name: execute_code - id: call_jsd3hga7 + id: call_nap68rkx type: function - - content: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\n","stdout":"1\n","stderr":"","success":true}' + - content: '{"code":"docs = await list_documents(limit=1000)\nprint(len(docs))\nfor d in docs:\n print(d[''id''], + d.get(''title''))","stdout":"1\n7b1434a1-bbe5-4ae1-bb3e-5400eed94d72 Cats\n","stderr":"","success":true}' role: tool - tool_call_id: call_jsd3hga7 + tool_call_id: call_nap68rkx model: gpt-oss reasoning_effort: low response_format: @@ -544,6 +526,7 @@ interactions: strict: true type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -573,7 +556,7 @@ interactions: response: headers: content-length: - - '430' + - '484' content-type: - application/json parsed_body: @@ -581,17 +564,18 @@ interactions: - finish_reason: stop index: 0 message: - content: '{"answer":"There is 1 document available in the knowledge base.","program":"docs = await list_documents(limit=1000)\nprint(len(docs))"}' + content: '{"answer":"There is 1 document available in the knowledge base.","program":"docs = await list_documents(limit=1000)\nprint(len(docs))\nfor + d in docs:\n print(d[''id''], d.get(''title''))"}' role: assistant - created: 1772626977 - id: chatcmpl-959 + created: 1773329133 + id: chatcmpl-985 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 37 - prompt_tokens: 1774 - total_tokens: 1811 + completion_tokens: 59 + prompt_tokens: 1741 + total_tokens: 1800 status: code: 200 message: OK diff --git a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_preloaded_documents.yaml b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_preloaded_documents.yaml index 34bce792..0109e3f9 100644 --- a/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_preloaded_documents.yaml +++ b/tests/cassettes/test_rlm/TestClientRLMIntegration.test_rlm_with_preloaded_documents.yaml @@ -88,7 +88,7 @@ interactions: connection: - keep-alive content-length: - - '7769' + - '7323' content-type: - application/json host: @@ -133,18 +133,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -162,11 +150,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -192,10 +180,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -236,7 +225,27 @@ interactions: role: user model: gpt-oss reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -262,29 +271,11 @@ interactions: type: object strict: true type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function uri: http://localhost:11434/v1/chat/completions response: headers: content-length: - - '532' + - '652' content-type: - application/json parsed_body: @@ -293,24 +284,25 @@ interactions: index: 0 message: content: '' - reasoning: Need to inspect documents. + reasoning: We need to inspect preloaded documents. role: assistant tool_calls: - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' + arguments: '{"code":"try:\n print(''documents exists'')\n for doc in documents:\n print(doc[''title''], + len(doc[''content'']))\nexcept NameError:\n print(''documents not defined'')\n"}' name: execute_code - id: call_c10kdj1q + id: call_uyvztwcq index: 0 type: function - created: 1772549571 - id: chatcmpl-647 + created: 1773329132 + id: chatcmpl-338 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 45 - prompt_tokens: 1742 - total_tokens: 1787 + completion_tokens: 76 + prompt_tokens: 1604 + total_tokens: 1680 status: code: 200 message: OK @@ -323,7 +315,7 @@ interactions: connection: - keep-alive content-length: - - '8227' + - '8071' content-type: - application/json host: @@ -368,18 +360,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -397,11 +377,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -427,10 +407,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -470,20 +451,43 @@ interactions: - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? role: user - content: null - reasoning: Need to inspect documents. + reasoning: We need to inspect preloaded documents. role: assistant tool_calls: - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' + arguments: '{"code":"try:\n print(''documents exists'')\n for doc in documents:\n print(doc[''title''], + len(doc[''content'']))\nexcept NameError:\n print(''documents not defined'')\n"}' name: execute_code - id: call_c10kdj1q + id: call_uyvztwcq type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' + - content: '{"code":"try:\n print(''documents exists'')\n for doc in documents:\n print(doc[''title''], + len(doc[''content'']))\nexcept NameError:\n print(''documents not defined'')\n","stdout":"documents exists\nCompany + History 46\nMission Statement 57\n","stderr":"","success":true}' role: tool - tool_call_id: call_c10kdj1q + tool_call_id: call_uyvztwcq model: gpt-oss reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -509,29 +513,11 @@ interactions: type: object strict: true type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function uri: http://localhost:11434/v1/chat/completions response: headers: content-length: - - '523' + - '727' content-type: - application/json parsed_body: @@ -540,24 +526,26 @@ interactions: index: 0 message: content: '' - reasoning: No preloaded? Let's list documents. + reasoning: 'We have two docs: "Company History" and "Mission Statement". Need founding year and mission. Let''s + get content.' role: assistant tool_calls: - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' + arguments: '{"code":"for doc in documents:\n if doc[''title'']==''Company History'':\n print(doc[''content''])\n if + doc[''title'']==''Mission Statement'':\n print(doc[''content''])\n"}' name: execute_code - id: call_2jgdkdf1 + id: call_hd2xgd83 index: 0 type: function - created: 1772549572 - id: chatcmpl-95 + created: 1773329149 + id: chatcmpl-708 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 45 - prompt_tokens: 1827 - total_tokens: 1872 + completion_tokens: 91 + prompt_tokens: 1762 + total_tokens: 1853 status: code: 200 message: OK @@ -570,7 +558,7 @@ interactions: connection: - keep-alive content-length: - - '8931' + - '8939' content-type: - application/json host: @@ -615,18 +603,6 @@ interactions: - `pictures`: list of figures/images with metadata - `pages`: page dimensions and metadata - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - ### await llm(prompt) -> str Call an LLM directly with the given prompt. Returns the response as a string. Use this for classification, summarization, extraction, or any task where you @@ -644,11 +620,11 @@ interactions: ## Available Python Features - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. + The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `filter()`, `getattr()`, `sorted()`/`.sort(key=...)`, try/except, and the `json`, `re`, `math` modules. - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. + Not supported: most imports (only `json`, `re`, `math` are available), class definitions, generators/yield, match statements, decorators, `with` statements. - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. + For pattern matching or text extraction, use `import re`, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. ## Strategy Guide @@ -674,10 +650,11 @@ interactions: ### Extracting data with regex ```python + import re numbers = [] results = await search("financial data", limit=20) for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) + amounts = re.findall(r'\$([\d,]+)', r['content']) for a in amounts: numbers.append(int(a.replace(',', ''))) if numbers: @@ -717,34 +694,59 @@ interactions: - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? role: user - content: null - reasoning: Need to inspect documents. + reasoning: We need to inspect preloaded documents. role: assistant tool_calls: - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' + arguments: '{"code":"try:\n print(''documents exists'')\n for doc in documents:\n print(doc[''title''], + len(doc[''content'']))\nexcept NameError:\n print(''documents not defined'')\n"}' name: execute_code - id: call_c10kdj1q + id: call_uyvztwcq type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' + - content: '{"code":"try:\n print(''documents exists'')\n for doc in documents:\n print(doc[''title''], + len(doc[''content'']))\nexcept NameError:\n print(''documents not defined'')\n","stdout":"documents exists\nCompany + History 46\nMission Statement 57\n","stderr":"","success":true}' role: tool - tool_call_id: call_c10kdj1q + tool_call_id: call_uyvztwcq - content: null - reasoning: No preloaded? Let's list documents. + reasoning: 'We have two docs: "Company History" and "Mission Statement". Need founding year and mission. Let''s get + content.' role: assistant tool_calls: - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' + arguments: '{"code":"for doc in documents:\n if doc[''title'']==''Company History'':\n print(doc[''content''])\n if + doc[''title'']==''Mission Statement'':\n print(doc[''content''])\n"}' name: execute_code - id: call_2jgdkdf1 + id: call_hd2xgd83 type: function - - content: '{"code":"docs = await list_documents(limit=20)\nprint(docs)","stdout":"[{''id'': ''c59247d8-8db5-45d9-9cf4-12841241dbc7'', - ''title'': ''Company History'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:48.188978''}, {''id'': ''b1843b4d-5e41-4c91-86e0-7eb6040ac5c5'', - ''title'': ''Mission Statement'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:49.871504''}]\n","stderr":"","success":true}' + - content: '{"code":"for doc in documents:\n if doc[''title'']==''Company History'':\n print(doc[''content''])\n if + doc[''title'']==''Mission Statement'':\n print(doc[''content''])\n","stdout":"The company was founded in + 1985 by Jane Smith.\nOur mission is to make technology accessible to everyone.\n","stderr":"","success":true}' role: tool - tool_call_id: call_2jgdkdf1 + tool_call_id: call_hd2xgd83 model: gpt-oss reasoning_effort: low + response_format: + json_schema: + description: Result from RLM agent execution. + name: RLMResult + schema: + additionalProperties: false + properties: + answer: + description: The answer to the user's question + type: string + program: + description: The final consolidated program + type: string + required: + - answer + - program + type: object + strict: true + type: json_schema stream: false + temperature: 0.0 tool_choice: auto tools: - function: @@ -770,1211 +772,11 @@ interactions: type: object strict: true type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function uri: http://localhost:11434/v1/chat/completions response: headers: content-length: - - '593' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: Let's get documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_0mpn1a7r - index: 0 - type: function - created: 1772549573 - id: chatcmpl-587 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 65 - prompt_tokens: 2039 - total_tokens: 2104 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '9561' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? - role: user - - content: null - reasoning: Need to inspect documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' - name: execute_code - id: call_c10kdj1q - type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' - role: tool - tool_call_id: call_c10kdj1q - - content: null - reasoning: No preloaded? Let's list documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' - name: execute_code - id: call_2jgdkdf1 - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nprint(docs)","stdout":"[{''id'': ''c59247d8-8db5-45d9-9cf4-12841241dbc7'', - ''title'': ''Company History'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:48.188978''}, {''id'': ''b1843b4d-5e41-4c91-86e0-7eb6040ac5c5'', - ''title'': ''Mission Statement'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:49.871504''}]\n","stderr":"","success":true}' - role: tool - tool_call_id: call_2jgdkdf1 - - content: null - reasoning: Let's get documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_0mpn1a7r - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_0mpn1a7r - model: gpt-oss - reasoning_effort: low - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '703' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: json module not allowed? It says only import json allowed. Actually imports allowed only for json. But - not imported. Let's import. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_x6xxq7h0 - index: 0 - type: function - created: 1772549575 - id: chatcmpl-348 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 87 - prompt_tokens: 2177 - total_tokens: 2264 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '10301' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? - role: user - - content: null - reasoning: Need to inspect documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' - name: execute_code - id: call_c10kdj1q - type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' - role: tool - tool_call_id: call_c10kdj1q - - content: null - reasoning: No preloaded? Let's list documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' - name: execute_code - id: call_2jgdkdf1 - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nprint(docs)","stdout":"[{''id'': ''c59247d8-8db5-45d9-9cf4-12841241dbc7'', - ''title'': ''Company History'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:48.188978''}, {''id'': ''b1843b4d-5e41-4c91-86e0-7eb6040ac5c5'', - ''title'': ''Mission Statement'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:49.871504''}]\n","stderr":"","success":true}' - role: tool - tool_call_id: call_2jgdkdf1 - - content: null - reasoning: Let's get documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_0mpn1a7r - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_0mpn1a7r - - content: null - reasoning: json module not allowed? It says only import json allowed. Actually imports allowed only for json. But - not imported. Let's import. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_x6xxq7h0 - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_x6xxq7h0 - model: gpt-oss - reasoning_effort: low - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '707' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: Seems import json not allowed? But spec says only import json allowed. Maybe environment disallow imports. - I'll just not import. No need. Use print. - role: assistant - tool_calls: - - function: - arguments: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_a12792ao - index: 0 - type: function - created: 1772549578 - id: chatcmpl-777 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 89 - prompt_tokens: 2337 - total_tokens: 2426 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '11025' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? - role: user - - content: null - reasoning: Need to inspect documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' - name: execute_code - id: call_c10kdj1q - type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' - role: tool - tool_call_id: call_c10kdj1q - - content: null - reasoning: No preloaded? Let's list documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' - name: execute_code - id: call_2jgdkdf1 - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nprint(docs)","stdout":"[{''id'': ''c59247d8-8db5-45d9-9cf4-12841241dbc7'', - ''title'': ''Company History'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:48.188978''}, {''id'': ''b1843b4d-5e41-4c91-86e0-7eb6040ac5c5'', - ''title'': ''Mission Statement'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:49.871504''}]\n","stderr":"","success":true}' - role: tool - tool_call_id: call_2jgdkdf1 - - content: null - reasoning: Let's get documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_0mpn1a7r - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_0mpn1a7r - - content: null - reasoning: json module not allowed? It says only import json allowed. Actually imports allowed only for json. But - not imported. Let's import. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_x6xxq7h0 - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_x6xxq7h0 - - content: null - reasoning: Seems import json not allowed? But spec says only import json allowed. Maybe environment disallow imports. - I'll just not import. No need. Use print. - role: assistant - tool_calls: - - function: - arguments: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_a12792ao - type: function - - content: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"NameError: - name ''docs'' is not defined","success":false}' - role: tool - tool_call_id: call_a12792ao - model: gpt-oss - reasoning_effort: low - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '672' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: We lost docs variable due to separate execution. Need to run in same call. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_qpt2msnm - index: 0 - type: function - created: 1772549580 - id: chatcmpl-40 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 84 - prompt_tokens: 2495 - total_tokens: 2579 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '11872' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? - role: user - - content: null - reasoning: Need to inspect documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' - name: execute_code - id: call_c10kdj1q - type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' - role: tool - tool_call_id: call_c10kdj1q - - content: null - reasoning: No preloaded? Let's list documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' - name: execute_code - id: call_2jgdkdf1 - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nprint(docs)","stdout":"[{''id'': ''c59247d8-8db5-45d9-9cf4-12841241dbc7'', - ''title'': ''Company History'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:48.188978''}, {''id'': ''b1843b4d-5e41-4c91-86e0-7eb6040ac5c5'', - ''title'': ''Mission Statement'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:49.871504''}]\n","stderr":"","success":true}' - role: tool - tool_call_id: call_2jgdkdf1 - - content: null - reasoning: Let's get documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_0mpn1a7r - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_0mpn1a7r - - content: null - reasoning: json module not allowed? It says only import json allowed. Actually imports allowed only for json. But - not imported. Let's import. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_x6xxq7h0 - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_x6xxq7h0 - - content: null - reasoning: Seems import json not allowed? But spec says only import json allowed. Maybe environment disallow imports. - I'll just not import. No need. Use print. - role: assistant - tool_calls: - - function: - arguments: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_a12792ao - type: function - - content: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"NameError: - name ''docs'' is not defined","success":false}' - role: tool - tool_call_id: call_a12792ao - - content: null - reasoning: We lost docs variable due to separate execution. Need to run in same call. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_qpt2msnm - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"--- - Company History\nThe company was founded in 1985 by Jane Smith.\n--- Mission Statement\nOur mission is to make technology - accessible to everyone.\n","stderr":"","success":true}' - role: tool - tool_call_id: call_qpt2msnm - model: gpt-oss - reasoning_effort: low - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '867' + - '943' content-type: - application/json parsed_body: @@ -1982,353 +784,22 @@ interactions: - finish_reason: stop index: 0 message: - content: '{"answer":"The company was founded in 1985. Its mission is to make technology accessible to everyone.","program":"docs - = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n if content:\n if - \"founded\" in content.lower():\n print(''Founded year:'', content.split(\"founded in\")[1].split(\"\\n\")[0].strip())\n if - \"mission\" in content.lower():\n print(''Mission:'', content.split(\"Mission is to\")[1].split(\"\\n\")[0].strip())"}' - reasoning: Found info. + content: '{"answer":"The company was founded in 1985. Its mission is to make technology accessible to everyone.","program":"# + Retrieve founding year and mission from preloaded documents\nfounding_year = None\nmission = None\nfor doc in + documents:\n if doc[''title''] == ''Company History'':\n # Extract year from content\n import + re\n match = re.search(r''founded in (\\d{4})'', doc[''content''])\n if match:\n founding_year + = match.group(1)\n if doc[''title''] == ''Mission Statement'':\n mission = doc[''content'']\n\nprint(f\"Founding + year: {founding_year}\")\nprint(f\"Mission: {mission}\")"}' role: assistant - created: 1772549583 - id: chatcmpl-237 + created: 1773329165 + id: chatcmpl-853 model: gpt-oss object: chat.completion system_fingerprint: fp_ollama usage: - completion_tokens: 150 - prompt_tokens: 2680 - total_tokens: 2830 - status: - code: 200 - message: OK -- request: - headers: - accept: - - application/json - accept-encoding: - - gzip, deflate, zstd - connection: - - keep-alive - content-length: - - '12614' - content-type: - - application/json - host: - - localhost:11434 - method: POST - parsed_body: - messages: - - content: |- - You are a Recursive Language Model (RLM) agent that solves complex research questions by writing and executing Python code. - - You MUST use the `execute_code` tool to run Python code. The functions described below are ONLY available inside execute_code. Always execute code to answer questions; do not just describe what code would do. - - Inside execute_code, these functions are ALREADY available in the namespace. Do NOT import them - just call them with `await`: - - results = await search("query") ✓ CORRECT - - import search ✗ WRONG - will fail - - results = search("query") ✗ WRONG - must use await - - ## Available Functions - - ### await search(query, limit=10) -> list[dict] - Search the knowledge base using hybrid search (vector + full-text). - Returns list of dicts with keys: chunk_id, content, document_id, document_title, document_uri, score, page_numbers, headings - - ### await list_documents(limit=10, offset=0) -> list[dict] - List available documents in the knowledge base. - Returns list of dicts with keys: id, title, uri, created_at - - ### await get_document(id_or_title) -> str | None - Get the full text content of a document by ID, title, or URI. - Returns the document content as a string, or None if not found. - - ### await get_chunk(chunk_id) -> dict | None - Get a specific chunk by its ID (from search results). - Returns dict with keys: chunk_id, content, document_id, document_title, headings, page_numbers, labels - Use this to retrieve full chunk details and metadata for citation. - - ### await get_docling_document(document_id) -> dict | None - Get the full document structure as a dict (DoclingDocument format). - Use `list_documents()` or search results to get document IDs first. - - `texts`: list of text items, each with `text`, `label` (e.g. "title", "text", "section_header", "list_item"), and `prov` (provenance with page/bounding box) - - `tables`: list of tables, each with `data` containing `grid` (list of rows, each row a list of cells with `text`), `num_rows`, `num_cols` - - `pictures`: list of figures/images with metadata - - `pages`: page dimensions and metadata - - ### await regex_findall(pattern, text) -> list[str] - Find all non-overlapping matches of a regular expression pattern in text. - - ### await regex_sub(pattern, repl, text) -> str - Replace all occurrences of a regular expression pattern with a replacement string. - - ### await regex_search(pattern, text) -> dict | None - Search for the first match of a pattern. Returns a dict with keys: group, groups, start, end — or None if no match. - - ### await regex_split(pattern, text) -> list[str] - Split text by a regular expression pattern. - - ### await llm(prompt) -> str - Call an LLM directly with the given prompt. Returns the response as a string. - Use this for classification, summarization, extraction, or any task where you - already have the content and just need LLM reasoning. - - ## Pre-loaded Documents Variable - - If documents were pre-loaded for this session, a `documents` variable is available: - ```python - # documents is a list of dicts with keys: id, title, uri, content - for doc in documents: - print(doc['title'], len(doc['content'])) - ``` - Check if it exists with: `try: documents ... except NameError: ...` - - ## Available Python Features - - The interpreter supports: variables, arithmetic, strings, f-strings, lists, dicts, tuples, sets, loops, conditionals, comprehensions, functions, async/await, `map()`, `sorted()`/`.sort(key=...)`, try/except, and the `json` module. - - Not supported: imports (other than `json`), class definitions, generators/yield, match statements, decorators, `with` statements. - - For pattern matching or text extraction, use the `regex_*` functions, string methods (`str.split`, `str.find`, `str.startswith`, `in` operator), or the `llm()` function. - - ## Strategy Guide - - 1. **Explore First**: Start by listing documents or searching to understand what's available. Document `title` is often None — use `uri` or `id` to identify documents instead. - 2. **If get_document returns None**: Use `await list_documents()` to see available documents (check `uri` and `id`), or `await search()` to find relevant content. - 3. **Iterative Refinement**: Run code, examine results, adjust your approach based on what you find. - 4. **Use llm() for Classification/Extraction**: When you need to classify, summarize, or extract structured data from content you already have, use `await llm()`. - 5. **Cite Your Sources**: Use get_chunk() to retrieve chunk metadata for citations. Track which documents/chunks informed your answer. - - ## Example Patterns - - ### Counting documents matching a condition - ```python - docs = await list_documents(limit=100) - count = 0 - for doc in docs: - content = await get_document(doc['id']) - if content and 'keyword' in content.lower(): - count += 1 - print(f"Found in: {doc['title']}") - print(f"Total: {count}") - ``` - - ### Extracting data with regex - ```python - numbers = [] - results = await search("financial data", limit=20) - for r in results: - amounts = await regex_findall(r'\$([\d,]+)', r['content']) - for a in amounts: - numbers.append(int(a.replace(',', ''))) - if numbers: - print(f"Average: {sum(numbers) / len(numbers)}") - ``` - - ### Extracting tables from a document - ```python - docs = await list_documents(limit=10) - for d in docs: - doc = await get_docling_document(d['id']) - if doc: - tables = doc.get('tables', []) - if tables: - print(f"{d['title']}: {len(tables)} table(s)") - for i, table in enumerate(tables): - grid = table.get('data', {}).get('grid', []) - for row in grid: - cells = [cell.get('text', '') for cell in row] - print(f" Table {i}: {cells}") - ``` - - ## Output Format - - Your final response MUST be valid JSON matching this exact schema: - ```json - {"answer": "Your complete answer here as a string", "program": "Your final consolidated program here as a string"} - ``` - - - `answer`: A clear answer to the user's question with key findings and references to specific documents/chunks. - - `program`: A single, self-contained Python program that produces the answer. Consolidate your exploratory code executions into one clean script. - - Do NOT return arbitrary JSON structures. Always use the exact format: {"answer": "...", "program": "..."} - - You MUST call execute_code at least once before providing your answer. Never give up without trying to execute code first. - role: system - - content: Using the pre-loaded documents variable, tell me when was the company founded and what is their mission? - role: user - - content: null - reasoning: Need to inspect documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')"}' - name: execute_code - id: call_c10kdj1q - type: function - - content: '{"code":"try:\n documents\nexcept NameError:\n print(''no documents'')","stdout":"","stderr":"","success":true}' - role: tool - tool_call_id: call_c10kdj1q - - content: null - reasoning: No preloaded? Let's list documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nprint(docs)"}' - name: execute_code - id: call_2jgdkdf1 - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nprint(docs)","stdout":"[{''id'': ''c59247d8-8db5-45d9-9cf4-12841241dbc7'', - ''title'': ''Company History'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:48.188978''}, {''id'': ''b1843b4d-5e41-4c91-86e0-7eb6040ac5c5'', - ''title'': ''Mission Statement'', ''uri'': None, ''created_at'': ''2026-03-03 16:52:49.871504''}]\n","stderr":"","success":true}' - role: tool - tool_call_id: call_2jgdkdf1 - - content: null - reasoning: Let's get documents. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_0mpn1a7r - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_0mpn1a7r - - content: null - reasoning: json module not allowed? It says only import json allowed. Actually imports allowed only for json. But - not imported. Let's import. - role: assistant - tool_calls: - - function: - arguments: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_x6xxq7h0 - type: function - - content: '{"code":"import json\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"ModuleNotFoundError: - No module named ''json''","success":false}' - role: tool - tool_call_id: call_x6xxq7h0 - - content: null - reasoning: Seems import json not allowed? But spec says only import json allowed. Maybe environment disallow imports. - I'll just not import. No need. Use print. - role: assistant - tool_calls: - - function: - arguments: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_a12792ao - type: function - - content: '{"code":"for doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"","stderr":"NameError: - name ''docs'' is not defined","success":false}' - role: tool - tool_call_id: call_a12792ao - - content: null - reasoning: We lost docs variable due to separate execution. Need to run in same call. - role: assistant - tool_calls: - - function: - arguments: '{"code":"docs = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])"}' - name: execute_code - id: call_qpt2msnm - type: function - - content: '{"code":"docs = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n print(''---'',doc[''title''])\n print(content[:200])","stdout":"--- - Company History\nThe company was founded in 1985 by Jane Smith.\n--- Mission Statement\nOur mission is to make technology - accessible to everyone.\n","stderr":"","success":true}' - role: tool - tool_call_id: call_qpt2msnm - - content: '{"answer":"The company was founded in 1985. Its mission is to make technology accessible to everyone.","program":"docs - = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n if content:\n if - \"founded\" in content.lower():\n print(''Founded year:'', content.split(\"founded in\")[1].split(\"\\n\")[0].strip())\n if - \"mission\" in content.lower():\n print(''Mission:'', content.split(\"Mission is to\")[1].split(\"\\n\")[0].strip())"}' - reasoning: Found info. - role: assistant - - content: |- - Validation feedback: - Please include your response in a tool call. - - Fix the errors and try again. - role: user - model: gpt-oss - reasoning_effort: low - stream: false - tool_choice: auto - tools: - - function: - description: |- - Execute Python code in a sandboxed interpreter. - - The code has access to haiku.rag functions (search, list_documents, - get_document, get_chunk, llm). - - Use print() to output results. - - Structured result with success status, stdout, and stderr. - - name: execute_code - parameters: - additionalProperties: false - properties: - code: - description: Python code to execute. - type: string - required: - - code - type: object - strict: true - type: function - - function: - description: Result from RLM agent execution. - name: final_result - parameters: - additionalProperties: false - properties: - answer: - description: The answer to the user's question - type: string - program: - description: The final consolidated program - type: string - required: - - answer - - program - type: object - strict: true - type: function - uri: http://localhost:11434/v1/chat/completions - response: - headers: - content-length: - - '1108' - content-type: - - application/json - parsed_body: - choices: - - finish_reason: tool_calls - index: 0 - message: - content: '' - reasoning: Need to wrap answer in final_result tool call. - role: assistant - tool_calls: - - function: - arguments: '{"answer":"The company was founded in 1985. Its mission is to make technology accessible to everyone.","program":"docs - = await list_documents(limit=20)\nfor doc in docs:\n content = await get_document(doc[''id''])\n if - content:\n if \"founded\" in content.lower():\n founded_year = content.split(\"founded in\")[1].split(\"\\n\")[0].strip()\n print(''Founded - year:'', founded_year)\n if \"mission\" in content.lower():\n mission_text = content.split(\"mission - is to\")[1].split(\"\\n\")[0].strip()\n print(''Mission:'', mission_text)"}' - name: final_result - id: call_b25e3tdq - index: 0 - type: function - created: 1772549589 - id: chatcmpl-799 - model: gpt-oss - object: chat.completion - system_fingerprint: fp_ollama - usage: - completion_tokens: 178 - prompt_tokens: 2717 - total_tokens: 2895 + completion_tokens: 168 + prompt_tokens: 1945 + total_tokens: 2113 status: code: 200 message: OK diff --git a/uv.lock b/uv.lock index cd71c1c8..dc975744 100644 --- a/uv.lock +++ b/uv.lock @@ -1529,7 +1529,7 @@ requires-dist = [ { name = "pydantic-ai-slim", extras = ["openai", "fastmcp", "logfire", "ag-ui"], specifier = ">=1.66.0" }, { name = "pydantic-ai-slim", extras = ["vertexai"], marker = "extra == 'vertexai'" }, { name = "pydantic-ai-slim", extras = ["voyageai"], marker = "extra == 'voyageai'" }, - { name = "pydantic-monty", specifier = ">=0.0.7" }, + { name = "pydantic-monty", specifier = ">=0.0.8" }, { name = "python-dotenv", specifier = ">=1.2.2" }, { name = "pyyaml", specifier = ">=6.0.3" }, { name = "rich", specifier = ">=14.3.3" }, @@ -3790,46 +3790,46 @@ wheels = [ [[package]] name = "pydantic-monty" -version = "0.0.7" +version = "0.0.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/e3/0d8b2b025628477c839f894e632f5197872b19df0a86b2ec30fac3b5960a/pydantic_monty-0.0.7.tar.gz", hash = "sha256:2189ea1d7aadab2f95374733d692f51d1206379a4fc7ce18ab46895512e88f92", size = 684705, upload-time = "2026-02-19T14:12:47.235Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/bf/e9794b562c207406d8fda0cf4fea810943a5e8a85fe69e5505046179df16/pydantic_monty-0.0.8.tar.gz", hash = "sha256:8135e781a184f971825c1d2eb6d621598103e900f6e0d34291ff0bf35df6142f", size = 802646, upload-time = "2026-03-10T14:46:51.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/7e/ca0884108c3237bb15bb2a1b3f24ddd957b9c750f1ed3211801497941999/pydantic_monty-0.0.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f35e18f284524d26d5f27084e2b93eb40139055bbf0cab6221a043eb5e9ce2dc", size = 6264252, upload-time = "2026-02-19T14:13:59.317Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5b/31f70c7792a857bacbdce90b8aae4629c31a9fec35f0116d91a2fb53241b/pydantic_monty-0.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e5d8924c65bb1ced60785a156e28c73f7f79f164b4f090dc26312c3917ffff7", size = 6133285, upload-time = "2026-02-19T14:14:46.577Z" }, - { url = "https://files.pythonhosted.org/packages/42/56/c92216c0427e8a10a01fa98f29252f6fabd8ca80ca193e0fd30fe28e65c1/pydantic_monty-0.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6279a468469d5a3b80d94dd0ab6110cd291a1dfbb057fa7d6dbad1f499be855d", size = 6059856, upload-time = "2026-02-19T14:13:02.594Z" }, - { url = "https://files.pythonhosted.org/packages/b5/a7/bc3e67b12d8a9da65f2677d9a48bc1e055a1d853d48572ba4845a64075cf/pydantic_monty-0.0.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb5feb69a5902d059db5dab269f90423b85a22163668422be47ccac8d7f7c44a", size = 6313780, upload-time = "2026-02-19T14:13:46.45Z" }, - { url = "https://files.pythonhosted.org/packages/c8/97/a9b856b17ee1e54892dafbb7ea29305520cae2dcd8aafe82a26a0edbc33c/pydantic_monty-0.0.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f1913e9729aa6711092ecbfce764df199a4787fe3e23a7ed74c78bf846579e", size = 6856827, upload-time = "2026-02-19T14:13:40.836Z" }, - { url = "https://files.pythonhosted.org/packages/98/57/2d8184b9f5a0b2b3bb47fdad7061c6a182699824efe6de9d8dd19ee68c0a/pydantic_monty-0.0.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec528f9f4194e6298757ad99e25da47f06f49ae2bc176ee26f49da5eb1dd7849", size = 6870737, upload-time = "2026-02-19T14:13:53.602Z" }, - { url = "https://files.pythonhosted.org/packages/6b/b3/fe3d3eff82b41e517739841a492d7a48ea2daf8e7b822299b848b5d4c0aa/pydantic_monty-0.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75405b9186a9acfa49cd66aa339b5a2450d733a2d59fae20cc8be45e45204d5f", size = 6611843, upload-time = "2026-02-19T14:13:49.957Z" }, - { url = "https://files.pythonhosted.org/packages/ff/d2/fdd8fe135ea14e30b40adadc896dda6c805596688998c9bcdfd8d85a16cf/pydantic_monty-0.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1917e42fce4733f92f5f6ad64ae4d0e87abbf9fb284ef52589ac3e292e928bfe", size = 6692856, upload-time = "2026-02-19T14:13:00.635Z" }, - { url = "https://files.pythonhosted.org/packages/0d/a6/fdde6f8d76aa0cff4b53060b63d7f09dbb19da61a967cb4b3dfd972acf1c/pydantic_monty-0.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d72a5d4f3ee7f9d2630b0379e4cfb397e181eb0b16e8c49a03f80ba6471edb89", size = 6236587, upload-time = "2026-02-19T14:14:32.602Z" }, - { url = "https://files.pythonhosted.org/packages/1b/7e/0580bbc001a39252b2f7da4b7504ac10572e4ca0ec967aebc5a9d752b6f7/pydantic_monty-0.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20028220981516912f130986354ef6c926b98778146ca349560cb852e44d9ca6", size = 6672260, upload-time = "2026-02-19T14:13:26.527Z" }, - { url = "https://files.pythonhosted.org/packages/d8/53/578a7b781a5714db5c4b1989c6e876d30caa0adf8a5a4caad89abc306667/pydantic_monty-0.0.7-cp312-cp312-win32.whl", hash = "sha256:e28b1c3ed52892f8ac12ee0f2b535402dfe1cb1e5c18128f1cb69eb8b66c285a", size = 6131085, upload-time = "2026-02-19T14:14:13.296Z" }, - { url = "https://files.pythonhosted.org/packages/56/98/20bd45fcd472937b1b3438b7587e209e3cfd447c30d02f654b86b44adaad/pydantic_monty-0.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:031dfab63ff9d7acdc641852e0d822603038cef1c27c5060900b9fd51cc853d0", size = 6664431, upload-time = "2026-02-19T14:13:29.968Z" }, - { url = "https://files.pythonhosted.org/packages/ec/fe/d8cb6c30d9d7bcc7d3c8d2c349a227e2a83cd1fbe7182f4941896eb35443/pydantic_monty-0.0.7-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:55d36818f8e35872ed35e395b41df8acc460bcdbbfd471fe0c39e293a1d50db5", size = 6262596, upload-time = "2026-02-19T14:14:15.2Z" }, - { url = "https://files.pythonhosted.org/packages/81/7a/f6b4881ca9779bd87eb8d8c0823133b56c232cf09d765c07a7f91d641490/pydantic_monty-0.0.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acb437458d93d54a9658656545fb6c9b396dbe66f68633b3c57bfd2f4aa1d400", size = 6133793, upload-time = "2026-02-19T14:14:06.498Z" }, - { url = "https://files.pythonhosted.org/packages/39/b9/dfcffd95ff233b8c98db9254242d9c10190989762016d18509aa04d43b1b/pydantic_monty-0.0.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b196345ffa1997041cb870ea693148feafe270575e2c2963532eedde0e84dedf", size = 6059400, upload-time = "2026-02-19T14:13:38.953Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2e/d6ecef842024267ddf4128613342b8985a7444e74f3a4a312713c913a91a/pydantic_monty-0.0.7-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d471e3cfe77d62edaf43b7f0962b95270ee4243abea12cb8e8cf1ad972dc3612", size = 6312625, upload-time = "2026-02-19T14:13:36.901Z" }, - { url = "https://files.pythonhosted.org/packages/75/2e/e4a2a9fbc3640bcee15b80c2f8ba0f97bf989c58c01d6da187524f71d12b/pydantic_monty-0.0.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a67771afd385579bf3f894ce933fb9e467fba9a632ccf27246e271d448f6f5f", size = 6859902, upload-time = "2026-02-19T14:14:26.67Z" }, - { url = "https://files.pythonhosted.org/packages/d2/4a/7aaf5c793f52e3403892a2de1f5dd18ae38234d82111cc9b7d92443e5b0d/pydantic_monty-0.0.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf662e1bbee4ddd318d5b8bfa9233173045029be0f67f15f816955b246bb7ec0", size = 6870524, upload-time = "2026-02-19T14:13:28.208Z" }, - { url = "https://files.pythonhosted.org/packages/c3/a9/c16f078864a273460923f1371b769c2719e1ce1ad86bc9031e3ed7fb3eae/pydantic_monty-0.0.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0151ff59a8a0d9e29ddb448affa33943108121e6e324795646a2f5facaf1a5d8", size = 6611960, upload-time = "2026-02-19T14:14:38.812Z" }, - { url = "https://files.pythonhosted.org/packages/20/d3/b3ef3432558a8cc9551d8b80a028a0f51cd2a518275932e03359eac3dc39/pydantic_monty-0.0.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:45f17a65134d3a0031e1f54d143770699f6a0ce92a1e74f0ae4914e52370f058", size = 6691834, upload-time = "2026-02-19T14:13:34.661Z" }, - { url = "https://files.pythonhosted.org/packages/ef/56/1ab5d1cbc0edfb522f0c28c9f5a7fc74eea6355234f73833087524d034bf/pydantic_monty-0.0.7-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ede6e68cb8a1f7216e26b0b2fb6cd0eae7a92104be8a49d1042e9e428de9262b", size = 6235704, upload-time = "2026-02-19T14:13:48.276Z" }, - { url = "https://files.pythonhosted.org/packages/c4/d1/cdebae67b0543f696ed7daff8587dc8a458e6552b52d5877cb8e55be74b4/pydantic_monty-0.0.7-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:4b2fd51eea05a0cc37bb91f326efdb1acbcd4b8262dac1c55aeb208e51254978", size = 6671530, upload-time = "2026-02-19T14:12:56.96Z" }, - { url = "https://files.pythonhosted.org/packages/9f/53/c0dacaec260b71050fd6b31d09570f9d74bbb2a2e9586032694e92b9fa59/pydantic_monty-0.0.7-cp313-cp313-win32.whl", hash = "sha256:40f2092970c5899ac2a2784d712a4c7e194b33cd0133315254e4baf141cd6c93", size = 6130341, upload-time = "2026-02-19T14:14:09.701Z" }, - { url = "https://files.pythonhosted.org/packages/3e/05/31490a7a899d8bbb2e513630ea6f591ceb8a111c91fe7573a96c9f6b6327/pydantic_monty-0.0.7-cp313-cp313-win_amd64.whl", hash = "sha256:42cee2646415bb9bd7da428d169783203618a418f960c6f75c7a74d6946d6b31", size = 6664341, upload-time = "2026-02-19T14:14:19.008Z" }, - { url = "https://files.pythonhosted.org/packages/99/15/64aff358df0b822dd22f212fec501e3944edffe978a4ab05530ea641dc68/pydantic_monty-0.0.7-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c97b2e1dcd0126417892595c1da724a8c4348f7dcec26ba774117bd51bde46f8", size = 6266090, upload-time = "2026-02-19T14:13:12.364Z" }, - { url = "https://files.pythonhosted.org/packages/64/90/7b5a4292eb9993eb8be9d958b5a57764818eeda471e3e79be7da4e9b49ba/pydantic_monty-0.0.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6f40e6e133b309ba733874f5980ab6cf867ec8cea2a6a389a641819cd8dcb7cd", size = 6152219, upload-time = "2026-02-19T14:13:20.734Z" }, - { url = "https://files.pythonhosted.org/packages/43/e4/2740af0157eb3c6f10c16b0d8376b8c9cf0b910720fe90229885bccb4a91/pydantic_monty-0.0.7-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57f2a327b6aa7402a2b2c3ddb3964bd45f12597f8f950dd4c5905b843b353b73", size = 6060942, upload-time = "2026-02-19T14:12:45.601Z" }, - { url = "https://files.pythonhosted.org/packages/f6/26/1cf235c2cc8e219a94ed8b11151280ba89e8020a475b6280c89e62f7275f/pydantic_monty-0.0.7-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:771f1f158af0de2480ea2a8862e4c0c7f79e9a13cc3e17529002e1abfc077f95", size = 6315477, upload-time = "2026-02-19T14:14:11.314Z" }, - { url = "https://files.pythonhosted.org/packages/b8/41/0faca7b9d8868822b7177ae941f193f397479bb114d3a6396466167a3198/pydantic_monty-0.0.7-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4182312ee8c26d8834e76375b2b5c766cb5d86d1dcf1515aa95e02704fcad83", size = 6862130, upload-time = "2026-02-19T14:13:22.375Z" }, - { url = "https://files.pythonhosted.org/packages/34/7b/0f2bd4105a285f50f17af721e83a76ebc1186a9f07a2a29d6d576490a232/pydantic_monty-0.0.7-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8751696fe66fb1bdd429d98fde3a7f4b7dce9cb45f22095e28b96b690a422a2c", size = 6872292, upload-time = "2026-02-19T14:14:08.078Z" }, - { url = "https://files.pythonhosted.org/packages/c9/18/4380820d62d348afb1355814ea674788e28db7a73108a486e0b8898987de/pydantic_monty-0.0.7-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b73cd1137bb4fd9bf95ed5f87e48d960f7d556c30eeafde6996f908abbf183", size = 6636567, upload-time = "2026-02-19T14:14:01.464Z" }, - { url = "https://files.pythonhosted.org/packages/3e/57/29e5f89a558a6409d514bb2790c72442ec65804cbf1df6a870bbc0038673/pydantic_monty-0.0.7-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1fa45a66757de5ea45c0809e15643bc2521959dbe2bc231694b22fa189decc9", size = 6693896, upload-time = "2026-02-19T14:14:34.128Z" }, - { url = "https://files.pythonhosted.org/packages/f6/26/5886d0f57ddb5ddf766ee2d0a4b3032267be9efd49a7c95c4d87a0b4b6a9/pydantic_monty-0.0.7-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ffe8122db9f0f64619a66f4cee2f577245ba59158b7d651a2eae08df691d34f9", size = 6236867, upload-time = "2026-02-19T14:14:20.704Z" }, - { url = "https://files.pythonhosted.org/packages/b5/72/1bb8741baf84f217d92291b862f8a8cb64d735fe4be20be2827fdf787593/pydantic_monty-0.0.7-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2122a5b6df53843329af01f6671300747449608d9cdf88ae5f9cf9977794e7a2", size = 6673504, upload-time = "2026-02-19T14:14:24.517Z" }, - { url = "https://files.pythonhosted.org/packages/d1/14/a4ff2bfe46350ffde4b5edc1f293b252cff90063f1f4cece49affe5a6462/pydantic_monty-0.0.7-cp314-cp314-win32.whl", hash = "sha256:bfbea2eddb9eef186326a6dfb27d79f8de434d7a3979f36f03b04216234a0275", size = 6131872, upload-time = "2026-02-19T14:13:14.437Z" }, - { url = "https://files.pythonhosted.org/packages/60/1f/d873f280aae5cbd27021189843fbd5f77be4262a7654ef30445d984518ab/pydantic_monty-0.0.7-cp314-cp314-win_amd64.whl", hash = "sha256:1b750afceef78f5c5d3e3e3c32a8060b3a7e1b97e3a00ac2bede5bc5e87cde8f", size = 6687125, upload-time = "2026-02-19T14:13:04.317Z" }, + { url = "https://files.pythonhosted.org/packages/f4/4f/7d7c7531be850469bccfbbf3cfede9e95d92b1d8e7b245d9dc77a599d6e4/pydantic_monty-0.0.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:025b380c0ed728bdf88e3ed60d5977498d4bb9da61cd81d9cabdaecce16f5755", size = 6699454, upload-time = "2026-03-10T14:46:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/c0/35/074daa5fd92e4a5c1e49c8fae06036e194139feef9a51b4db82d0fee7e54/pydantic_monty-0.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76846d77ebda3414beb8c9e5da9eaef722e06606dc0307613186d888e775dc51", size = 6743273, upload-time = "2026-03-10T14:46:16.184Z" }, + { url = "https://files.pythonhosted.org/packages/55/0d/e6cb1e9e1c2e51501d8f7848c18803780164948e338350ab94769690f207/pydantic_monty-0.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b58149d6a8998ffed80f626c10bf0de7e65964aae1dfad80db8ecb00968fb1a", size = 6503552, upload-time = "2026-03-10T14:45:26.083Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a9/286f7eb6c95d7877f6f8b9bcbe26e2d988fa142cd77509e48e67302478bf/pydantic_monty-0.0.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b99bb030ff8e95b160c11702b9a6823705b7dcc1a49a2c1dccc43c2538bfe27", size = 6765377, upload-time = "2026-03-10T14:45:14.472Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/85268f6305bc5b153be7c0860e69ce3b9ba916daa4a419f53d8a777e9a39/pydantic_monty-0.0.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b05b17fc2b8875e0efea047416fc0cd28a8018c040b25387454996b98540ccfc", size = 7324571, upload-time = "2026-03-10T14:45:48.786Z" }, + { url = "https://files.pythonhosted.org/packages/11/6a/2855c6149f6ba3138c7bfb009c07d528e2df12802e3216928b1289bbf233/pydantic_monty-0.0.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97fa5deef4d8cdcf60a4d8a4e7a34099deae1ad4b33acc1c33ac2e1cc348a1c2", size = 7533828, upload-time = "2026-03-10T14:46:55.386Z" }, + { url = "https://files.pythonhosted.org/packages/31/63/44b5bb5798323f7f735f5855a0d3f478d6852d9d1774427d77e31b5dbffb/pydantic_monty-0.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1aabd56af5db51c4af512142fe7ffc866b6a20dcd039a4aad5245ef42768f21", size = 7271978, upload-time = "2026-03-10T14:45:33.903Z" }, + { url = "https://files.pythonhosted.org/packages/4b/68/ce82eb571e45afbe3c0b9544fe3ebf93f841ec895fea0d39c9604a0a421f/pydantic_monty-0.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9782e58da29176a3fb0ce8ec808571d0be99c1e2ad167637225246e594e85f13", size = 7187140, upload-time = "2026-03-10T14:46:41.784Z" }, + { url = "https://files.pythonhosted.org/packages/5b/45/778bc260195ddb892f284c3cb8ab8cbcb0542e6a18f11b7e50a592b507ba/pydantic_monty-0.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ff7fb7ff3f4e830ef9b28a76e634219195b552c0dfed3471fb4910708db56221", size = 6677996, upload-time = "2026-03-10T14:46:03.163Z" }, + { url = "https://files.pythonhosted.org/packages/1e/02/8e8396b83d19ec70a09c24b0245177a595c2b7d6d092c6f6c7d3310b191c/pydantic_monty-0.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7222d923676900827e3951e65f854d65f50b65ed8c7a84011d3472773d51bf", size = 7136513, upload-time = "2026-03-10T14:45:52.179Z" }, + { url = "https://files.pythonhosted.org/packages/fd/24/53d06af74b82043be9c4960c38bbc255eeb3de9f2a4d450f942912630bb3/pydantic_monty-0.0.8-cp312-cp312-win32.whl", hash = "sha256:4cb59e1e7b1a3d573247a871a87c88506ce9fb68bbd7648598e171cf2f04747e", size = 6582168, upload-time = "2026-03-10T14:45:58.197Z" }, + { url = "https://files.pythonhosted.org/packages/25/0f/55a16faf379139263ad852421734cb096390777d299ef7f185ec10404656/pydantic_monty-0.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:45bf11e3b795cc470a91cbd7cfeb9d96f7a60387e8da146a11bf952b4371aba7", size = 7335422, upload-time = "2026-03-10T14:45:28.301Z" }, + { url = "https://files.pythonhosted.org/packages/27/46/3268001a639052515d5a55ea2f1e087ae1e5f7aa9d7bc62c4808d731fff1/pydantic_monty-0.0.8-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f303f1d979213dcb365c69de3912daa70a32af019bb5ee86e086f584638974f2", size = 6698529, upload-time = "2026-03-10T14:45:39.712Z" }, + { url = "https://files.pythonhosted.org/packages/f4/22/28d6b7f8f7a1e0881c449310a6f2c8ee0cf85dc4434ae0f7e633dfcf5bcf/pydantic_monty-0.0.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8cc698da6f7f11743df7c48b959eea000e8e30511c7e1318b67543e25985062", size = 6743849, upload-time = "2026-03-10T14:46:48.023Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ab/e3dfe057af472e4065297d69aea0cf30616d01366a29e02d0a2739f22b93/pydantic_monty-0.0.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f6da093164e99012b49b39ba1e64c166ccd126128d114f9e2c66df6fb695c4", size = 6503266, upload-time = "2026-03-10T14:46:19.594Z" }, + { url = "https://files.pythonhosted.org/packages/0a/82/d3e9aa9bd9ac69b3584216166a189e11370913ffcbd2a57a5cac6ce2d4ba/pydantic_monty-0.0.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2432ef62140554f5970991b7df41e064824741a807515658f91283c75669086", size = 6765032, upload-time = "2026-03-10T14:45:20.571Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9d/7ab11be8eff998bf9283c7bf444254cff5212f87fe3f2a9a2f7436cce6d7/pydantic_monty-0.0.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99951afb4d722212c2ce85c303b5e87d50756adaff46817ad0e60e95eb1e5141", size = 7324673, upload-time = "2026-03-10T14:45:37.957Z" }, + { url = "https://files.pythonhosted.org/packages/39/a0/7f026ece228cc990e58aa27f2ce5af26d042baaa0186cb451f3e04ff0abe/pydantic_monty-0.0.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdef70921b408378f9bc38bce4952d3c176b3f7833aa782068b310390901c516", size = 7533774, upload-time = "2026-03-10T14:46:24.265Z" }, + { url = "https://files.pythonhosted.org/packages/07/e7/72f250ffd005520ad8cdffb387241a9dd92fc70bcbdd769720918bd34495/pydantic_monty-0.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b5dee7bef619e7661f77bef765f483605bcd2a79c6b8bf5c910afa1c93fc40", size = 7272179, upload-time = "2026-03-10T14:45:08.085Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/97c87c2a315ba4376bfb83197586365003005e01d6547df7f6d77b80d13f/pydantic_monty-0.0.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f4c6f6fb2ebae0bc80520af71e1057055413ca96fd33f13f3c612a085e50fb8", size = 7186684, upload-time = "2026-03-10T14:46:49.833Z" }, + { url = "https://files.pythonhosted.org/packages/09/42/2eea55906fee8bef7c1024bf2d35e2c301b15b562934731bdae25db448cb/pydantic_monty-0.0.8-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3ab3c558a648942d4d31e7f668d60d2a2e129751a3e8e9dc27b1e6d635e9e627", size = 6677272, upload-time = "2026-03-10T14:45:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/40/0a/066e53d4693b680e39080d3af4f234c1ff9976f7621b8a49dd2a41710431/pydantic_monty-0.0.8-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:782d686d217b537e6fa9047aa3444d67b3b7cc69bf6faf34078c992ceaeb1e9e", size = 7136493, upload-time = "2026-03-10T14:45:30.014Z" }, + { url = "https://files.pythonhosted.org/packages/81/c1/46dc300f87314aef883a57ae5a35ba45a463c09f64d3d9c9f0b620672734/pydantic_monty-0.0.8-cp313-cp313-win32.whl", hash = "sha256:ef0db454757cb92974890b11c7b0969d8c0d95944c821f6fc6cd23846d1d2aa4", size = 6581014, upload-time = "2026-03-10T14:46:07.886Z" }, + { url = "https://files.pythonhosted.org/packages/b0/2a/cf156df19a1612ca5ddcbd982645e54c5485e83215d9532cc9aff791f854/pydantic_monty-0.0.8-cp313-cp313-win_amd64.whl", hash = "sha256:dbf8c7cfaff2b345f8c1bfba98fdc282e790fef5c601f37c8d5355ccd45073de", size = 7335041, upload-time = "2026-03-10T14:46:21.371Z" }, + { url = "https://files.pythonhosted.org/packages/a5/69/5bedc7ad67fdd9e4f04007477f5c414b54c51d47c5dfdd7abad4c78663aa/pydantic_monty-0.0.8-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:47990770ed74af1e8e2160a7dd925aa1e4fd1bf4ae9658ffd1cdc32eb5c8c6e8", size = 6700454, upload-time = "2026-03-10T14:45:56.247Z" }, + { url = "https://files.pythonhosted.org/packages/bf/35/06aaa9c766a83e7e95219bfb6cb88bd0a87803f85eb3f596b82da0cb3009/pydantic_monty-0.0.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9534f6236b3ebdd09f0f7d71e508e68736733d24cdda2a6c0a758914261c75e5", size = 6760180, upload-time = "2026-03-10T14:45:22.982Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b8/eaa4a4f0b3a1c343773317027bb5d1e11a1b0c1ad01d3f0921a7f547d346/pydantic_monty-0.0.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c4ffd8275d520628732d82e7410e5f1f69ef5af274d676f1f2f9221fd85a34", size = 6504414, upload-time = "2026-03-10T14:45:12.984Z" }, + { url = "https://files.pythonhosted.org/packages/9d/79/dbb0875ad2b565d7ef1981feda4438ab743130f4031107aaadc9212488dd/pydantic_monty-0.0.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:badaa22749fa7a22ee2cb88f6deb48fc191cb2f41237dd630593259ed9f30b67", size = 6766768, upload-time = "2026-03-10T14:46:29.12Z" }, + { url = "https://files.pythonhosted.org/packages/25/cb/bd6bef8fa2cfe807dd5ef36ab8ce6d094ecdad0050cf57dec4c8a438d413/pydantic_monty-0.0.8-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e39104684eda1ae3c290e3a4369bef9d00f9b637be8515802bc1523fecb5160d", size = 7326073, upload-time = "2026-03-10T14:45:50.679Z" }, + { url = "https://files.pythonhosted.org/packages/aa/44/b64b6e2857519d5fdc66f74998019e585e5c3bf2cf8deb7b77419d29db2a/pydantic_monty-0.0.8-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2e5b3b11b794f82504bb6929f4101f0db84933986aee9b46ce7561add152e9", size = 7535251, upload-time = "2026-03-10T14:46:04.645Z" }, + { url = "https://files.pythonhosted.org/packages/da/11/4e1524d94e33427990cffd74eaf94a023724c872f11d42ac90eebd74ccc0/pydantic_monty-0.0.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a94fc87b2a9b1b66a09f35b819b1c7e7da7702b21c923cdca21fa13129486b45", size = 7288739, upload-time = "2026-03-10T14:45:35.609Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7d/7e667c72c9742a6725b04d21faf50e8f552a0e23da9ca1cbeba891961c9a/pydantic_monty-0.0.8-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70b7479e7bd47d274fbd6278a625289e71b1a4aad400f40c7a4a89fe9a50952c", size = 7189195, upload-time = "2026-03-10T14:46:09.399Z" }, + { url = "https://files.pythonhosted.org/packages/7b/3f/3243277e2c6bf4c3e4684fbc78c316a8965dbbb012b573b38978d8628bfc/pydantic_monty-0.0.8-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:48b8c9cb9a96a5f28b03669771368a444c8b50c758b6a5bd0d148fa02db3f65b", size = 6679333, upload-time = "2026-03-10T14:45:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/0c/51/88152b89f5288e9d3cd28e71f79a6567421e20d8f00b0514b7819a29a8bb/pydantic_monty-0.0.8-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b005f10798a1b58a12b5643f69a7b54208bd4965d16ca2bd21d13fca4d1a4f67", size = 7137771, upload-time = "2026-03-10T14:46:33.043Z" }, + { url = "https://files.pythonhosted.org/packages/d8/38/baf5a66ed72b931de7ce92251822d6ffb752582389ff4f4c853742cee029/pydantic_monty-0.0.8-cp314-cp314-win32.whl", hash = "sha256:b143bba29c274e15424a097af6ae85a1e81e6c2fb7184ee7a93fbf10997dbbd3", size = 6584038, upload-time = "2026-03-10T14:46:34.53Z" }, + { url = "https://files.pythonhosted.org/packages/71/80/bfda690914fa15c68f8be9e824e62c4054118a9a72304735221446a89014/pydantic_monty-0.0.8-cp314-cp314-win_amd64.whl", hash = "sha256:f4bc9185bb5f37f3220a978889b4bc6f822a41ee4d5523c17eef4d869aca66e8", size = 7351170, upload-time = "2026-03-10T14:46:57.025Z" }, ] [[package]]