{
  "issues": [
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/119",
      "id": 4044425120,
      "node_id": "I_kwDOPnuGX87xEQeg",
      "number": 119,
      "title": "Typing issue: structured_response returns BaseModel instead of output_cls type",
      "user": {
        "login": "DavideCamp",
        "id": 101997688,
        "node_id": "U_kgDOBhRceA",
        "avatar_url": "https://avatars.githubusercontent.com/u/101997688?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DavideCamp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2026-03-09T09:26:45Z",
      "updated_at": "2026-03-09T09:26:45Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`Client.structured_response()` accepts an `output_cls` (a `BaseModel` subtype), but the returned object is typed in a way that loses that type.\n\n-   At runtime, the parsed object is correct.\n\n-   At type-check time, `response.structured_data[0]` is inferred as `BaseModel` instead of the specific model passed in `output_cls`.\n\n**Example**\n  ```python\n  from pydantic import BaseModel\n  from datapizza.clients.openai import OpenAIClient\n\n  class JobProposalSplit(BaseModel):\n      skill: str = \"\"\n      education: str = \"\"\n      experience: str = \"\"\n\n  client = OpenAIClient(api_key=\"***\")\n  response = client.structured_response(\n      input=\"Backend Python engineer, 3+ years, CS degree\",\n      output_cls=JobProposalSplit,\n  )\n  item = response.structured_data[0]  # inferred as BaseModel, expected JobProposalSplit\n  reveal_type(item)  # BaseModel\n```\n\n\n**Proposed fix (happy to open PR)**\n\n  - Introduce a generic type param for ClientResponse:\n      - class ClientResponse(Generic[TModel])\n      - structured_data: list[TModel]\n  - Make structured_response / a_structured_response generic on TModel:\n      - output_cls: type[TModel]\n      - return ClientResponse[TModel]\n  - Align abstract and concrete client implementations accordingly.\n  - Align tests\n\n I can submit a PR if this direction looks good,\nThanks\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/119/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/118",
      "id": 4039762345,
      "node_id": "I_kwDOPnuGX87wyeGp",
      "number": 118,
      "title": "Google client does not support ADC (Application Default Credentials) on Cloud Run",
      "user": {
        "login": "M-ballabio1",
        "id": 78934727,
        "node_id": "MDQ6VXNlcjc4OTM0NzI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/78934727?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/M-ballabio1",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-03-07T22:45:29Z",
      "updated_at": "2026-03-09T09:13:27Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Bug: Google client does not support ADC (Application Default Credentials) on Cloud Run\n\n### Description\n\nWhen running the application on **Google Cloud Run** with an attached service account, the `datapizza` Google client fails to authenticate using **Application Default Credentials (ADC)**.\n\nThe error is thrown in `text_generation_service.py` at line 109, inside the `generate_stream` function when calling `_build_client(provider)`.\n\n### Error message\n\n```\nTraceback (most recent call last):\n  File \"/app/app/services/text_generation_service.py\", line 109, in generate_stream\n    client = _build_client(provider)\n\nIf running on Cloud Run with an attached service account, ensure the datapizza Google client supports ADC or provide a service-account key as a workaround.\n```\n\n### Environment\n\n- **Platform:** Google Cloud Run\n- **Auth method:** Attached service account (ADC)\n- **Timestamp:** 2026-03-07T22:40:46Z\n\n### Expected behavior\n\nThe Google client should support ADC out of the box when running on Cloud Run with an attached service account, without requiring an explicit service account key file.\n\n### Actual behavior\n\nThe client fails to initialize and throws an error suggesting ADC is not supported. The only mentioned workaround is to provide a service account key manually, which is not recommended in Cloud Run environments for security reasons.\n\n### Proposed fix / request\n\nPlease add native ADC support to the `_build_client` method for the Google provider, so that the credentials are automatically picked up from the environment (as expected in Cloud Run, GKE, and other GCP-managed runtimes).\n\n### References\n- [Google ADC documentation](https://cloud.google.com/docs/authentication/application-default-credentials)\n\n<img width=\"1447\" height=\"349\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/d3ec0970-8784-46f4-8835-9f03b5aa88e7\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/118/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/111",
      "id": 3895817456,
      "node_id": "I_kwDOPnuGX87oNXTw",
      "number": 111,
      "title": "Proposal / Request for feedback: datapizza-ai-tools-mcptoolbox module (pre-PR discussion)",
      "user": {
        "login": "TommasoTerrin",
        "id": 38006450,
        "node_id": "MDQ6VXNlcjM4MDA2NDUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/38006450?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/TommasoTerrin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-02-04T10:30:53Z",
      "updated_at": "2026-02-23T10:59:03Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Short summary\n\nHi — I implemented a new module in my fork that integrates Google MCP Toolbox tools into Datapizza-AI as native `Tool` objects. Before opening a formal pull request, I’d like to describe the changes I made, explain how I tested them, and ask for guidance on whether and how to submit the PR (which branch to target, coding/style requirements, additional tests, etc.).\n\n**If you want to review the full code now, here is my fork:**\n[https://github.com/TommasoTerrin/datapizza-ai-fork/tree/feature/mcp-toolbox/datapizza-ai-tools/mcptoolbox](https://github.com/TommasoTerrin/datapizza-ai-fork/tree/feature/mcp-toolbox/datapizza-ai-tools/mcptoolbox)\n\n\n<img width=\"1248\" height=\"1056\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/c29319f4-9527-4ed0-9581-1c0c8843efd7\" />\n\n---\n\n## What I implemented (high level)\n\n> **Why this matters for the framework**\n> Many modern agent frameworks such as **LangChain**, **LlamaIndex**, and **Google ADK** already provide first-class integrations with MCP / Toolbox-style servers because they enable agents to reliably interact with *structured, authoritative data sources* (databases, APIs, internal services) rather than relying only on unstructured document retrieval.\n>\n> Adding this capability to Datapizza-AI would:\n>\n> * Align the framework with the current ecosystem standard for **tool-based agent architectures**\n> * Enable agents to safely operate on **live, structured data** (SQL/graph DBs, internal services, analytics endpoints) instead of only RAG-style document contexts\n> * Provide a **single, consistent abstraction layer** for connecting to heterogeneous backends through MCP Toolbox servers\n> * Reduce long-term maintenance by avoiding one-off, custom tool wrappers for each data source or service\n\nI added a new module: `datapizza-ai-tools-mcptoolbox` which:\n\nI added a new module: `datapizza-ai-tools-mcptoolbox` which:\n\n* Provides `MCPToolBoxTool`, a factory that connects to an MCP Toolbox server and dynamically loads remote tools (single tools and toolsets).\n* Wraps remote Toolbox tools into Datapizza-AI `Tool` objects (preserving name, description, parameter schema and signature).\n* Supports:\n\n  * Auto-discovery (loads all available tools when no specific tools are requested)\n  * Loading a specific tool on demand\n  * Loading toolsets\n  * Authentication via `auth_token_getters`\n  * Custom client headers\n  * Bound (pre-configured) parameters that are automatically passed to tools\n* Implements robust error handling and graceful degradation (missing tools generate warnings; loading continues for other tools).\n* Includes a placeholder `AsyncMCPToolBoxTool` for future async support.\n\nModule layout (in the fork):\n\n```\ndatapizza-ai-tools/mcptoolbox/\n├── datapizza/\n│   └── tools/\n│       └── mcptoolbox/\n│           ├── __init__.py\n│           └── base.py\n├── tests/\n│   └── test.py\n├── pyproject.toml\n└── README.md   # TODO: expand with usage examples\n```\n\n---\n\n## Tests & how I ran them\n\n* The tests in `tests/test.py` are **integration tests** that exercise:\n\n  * Creating multiple clients with different configurations\n  * `load_single_tool()` behavior\n  * `load_tools()` auto-discovery and selective loading\n  * `list_tools()` metadata correctness\n  * Proper cleanup (`close()`)\n\n* **Important:** tests are designed to run against a *live* MCP Toolbox server reachable at `http://localhost:5000`.\n\n### Quick local test server (recommended)\n\nFor fast local testing I created a small repo that bundles everything needed to run a Toolbox server and two test databases in containers:\n\n* **ToolboxTest (quick local test stack, created by me):**\n  [https://github.com/TommasoTerrin/ToolboxTest](https://github.com/TommasoTerrin/ToolboxTest)\n\n`ToolboxTest` is specifically built to be fast and convenient: it provides a single `docker-compose` that starts the MCP Toolbox server plus **two containerized test databases** (with Docker volumes) and immediately seeds both DBs with test data. This is ideal for running the integration tests in `datapizza-ai-tools-mcptoolbox` without extra setup.\n\nTypical quickstart (from the ToolboxTest repo):\n\n```bash\ngit clone https://github.com/TommasoTerrin/ToolboxTest\ncd ToolboxTest\n# start server + two DBs + seed (see repo README for exact command; typically `docker compose up -d`)\ndocker compose up -d\n# confirm Toolbox API is available at http://localhost:5000\n```\n\n(If maintainers prefer the official Toolbox server, the tests can also be run against the upstream genai-toolbox server — see notes below.)\n\n### Official MCP Toolbox server (alternative)\n\nIf you prefer to use the official upstream server artifacts, they are available here:\n[https://github.com/googleapis/genai-toolbox](https://github.com/googleapis/genai-toolbox)\n\nYou can also find the official Google MCP Toolbox documentation here:\n[https://googleapis.github.io/genai-toolbox/getting-started/introduction/](https://googleapis.github.io/genai-toolbox/getting-started/introduction/)\n\nFollow that repo’s README to start the server (e.g. with Docker Compose) so it is reachable at `http://localhost:5000`.\n\n### Running the tests after the server is up\n\n> Note: I did **not** add a separate `requirements.txt` file. The module uses the existing `pyproject.toml` and `uv.lock` already present in the Datapizza-AI workspace for dependency management.\n\n```bash\n# install dependencies using the workspace pyproject + uv.lock\nuv sync  # or your preferred uv/pip workflow based on the repo guidelines\n\n# ensure tests point to http://localhost:5000 (env var or edit tests)\npython datapizza-ai-tools/mcptoolbox/tests/test.py\n```\n\n---\n\n## Dependencies\n\n* `datapizza-ai-core`\n* `toolbox-core>=0.5.8` (official MCP Toolbox client)\n\n---\n\n## Why I think this is useful\n\n* Eliminates manual wrapper code for each remote tool (zero boilerplate).\n* Unifies access to remote tools and toolsets via a single, configurable factory.\n* Enables Datapizza agents to call parametrized, authorized, audited tools instead of accessing DBs or services directly.\n* Supports both selective loading and auto-discovery workflows, which helps in both development and production scenarios.\n\n---\n\n## Open questions / requests to maintainers\n\nBefore I open a PR, I’d appreciate guidance on the following:\n\n1. **Do you want me to open a PR for these changes?**\n   I’m happy to open one — just want to confirm you want this functionality in the repo.\n\n2. **Which branch should the PR target?**\n\n   * `main` or another branch (e.g. `dev` / `integration`)?\n     Please tell me the preferred target branch and any branch naming conventions you use for new features.\n\n3. **Code style / CI expectations**\n\n   * Are there linters, formatting, or pre-commit hooks I should run before creating the PR?\n   * Any test/coverage thresholds to meet?\n\n4. **Additional tests / quality gates**\n\n   * Would you like more unit tests in addition to the integration tests?\n   * Do you have CI runners with a running MCP Toolbox server available, or should I add a test matrix that spins up the server in CI?\n\n5. **Documentation**\n\n   * I left `README.md` as a TODO. Would you prefer the PR to include a complete README with usage examples (quickstart, auth token examples, `tools.yaml` example) before review, or is a TODO acceptable for an initial PR?\n\n6. **Security / secrets**\n\n   * Any guidelines on how to handle `auth_token_getters` patterns for the repo (secrets management in tests, mocks, etc.)?\n\n7. **Other suggestions**\n\n   * If you have suggestions about API design (method names, return types, exceptions), or additional capabilities (caching, hot-reload, async client), I’m ready to adapt.\n\n---\n\n## Proposed PR metadata (if you want me to open it)\n\n* **PR title:** `feat(mcptoolbox): add MCP Toolbox integration module`\n* **Description:** (I will paste the PR body I prepared, summarizing implementation, tests, and how to run them)\n* **Labels:** `feature`, `integration-tests`, `needs-review` (please adjust if you use different labels)\n\n---\n\n## Notes & personal context\n\n* This is my **first open-source contribution** to a project like this. I greatly appreciate thorough review — please be extra attentive to edge cases, error handling, typing, and test coverage.\n* I welcome style corrections, critique, and suggestions. If you prefer specific changes before I open the PR, tell me and I’ll update the branch in my fork accordingly.\n\n---\n\n## Next steps I’m ready to take\n\n* Open a PR targeting the branch you prefer (once you confirm) with the full code + tests + a minimal README, OR\n* Make changes requested by maintainers in my fork before opening the PR.\n\nThanks for taking the time to read this — I appreciate any feedback. If it helps, I can also paste a direct diff or provide a link to a specific branch/commit in my fork right away.\n\n— Tommaso\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/111/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/100",
      "id": 3757540208,
      "node_id": "I_kwDOPnuGX87f94Nw",
      "number": 100,
      "title": "Problems with non OpenAI agent with stream and tools",
      "user": {
        "login": "luca-martinelli-09",
        "id": 9303116,
        "node_id": "MDQ6VXNlcjkzMDMxMTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9303116?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/luca-martinelli-09",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-23T14:20:06Z",
      "updated_at": "2025-12-23T14:20:06Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "**Describe the bug**\nFor agents, when using the \"stream = True\" setting in conjunction with tools, streaming fails and the agent creates countless \"empty\" steps (with no content, deltas, or anything else) until it reaches \"max_steps\" and then stops generating without producing any output. This happens with all clients (Google, Anthropic, OpenAILike, etc.) except OpenAI clients or OpenAI clients with Ollama or LM Studio's base_url.\n\n**Environment**\n- OS: Ubuntu 25.10\n- Python version: Python 3.13\n- datapizza-ai version: latest (0.0.9)\n\n**To Reproduce**\n```py\nclient = AnthropicClient(\n            api_key=\"***\",\n            model=\"claude-haiku-4-5\",\n        )\n\n agent = Agent(\n            name=\"test\",\n            client=client,\n            tools=[DuckDuckGoSearchTool()],\n            stream=True,\n            system_prompt=\"Answer the user question\",\n            max_steps=10,\n        )\n\nasync for event in agent.a_stream_invoke(task_input=\"search on the web the main cities of Italy\"):\n   pass\n```\n\n**Expected behavior**\nAs for OpenAI client, I should see the step with function calling, the result, and then the client answer to the user question\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/100/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/98",
      "id": 3695707992,
      "node_id": "I_kwDOPnuGX87cSAdY",
      "number": 98,
      "title": "Mistral client trigger exception after a tool call",
      "user": {
        "login": "bicf",
        "id": 478974,
        "node_id": "MDQ6VXNlcjQ3ODk3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/478974?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bicf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-12-04T17:35:48Z",
      "updated_at": "2026-01-26T07:03:55Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "**Describe the bug**\nSDK Mistral client raise an error if a new message with role USER comes after a message of role TOOL\n\n\n**Expected behavior**\nno exception raised\n\n**Logs**\n```txt\nDEBUG    [2025-12-04 16:05:49 - datapizza.clients.mistral.mistral_client:148] MistralClient input = [TextBlock(content=Elenca quali sono bandi che danno finanziamento?)]\n2025-12-04 16:05:49 [3923909] [INFO] HTTP Request: POST https://api.mistral.ai/v1/chat/completions \"HTTP/1.1 400 Bad Request\"\nERROR    [2025-12-04 16:05:49 - datapizza.pipeline.dag_pipeline:166] Error running node generator: API error occurred: Status 400. Body: {\"object\":\"error\",\"message\":\"Unexpected role 'user' after role 'tool'\",\"type\":\"invalid_request_message_order\",\"param\":null,\"code\":\"3230\"}\n2025-12-04 16:05:49 [3923909] [ERROR] Error in retrieve_pdf: API error occurred: Status 400. Body: {\"object\":\"error\",\"message\":\"Unexpected role 'user' after role 'tool'\",\"type\":\"invalid_request_message_order\",\"param\":null,\"code\":\"3230\"}\nTraceback (most recent call last):\n  File \"/app/backend/api/services/rag_service.py\", line 546, in retrieve_pdf\n    result = dag_pipeline.run(pipeline_input)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/pipeline/dag_pipeline.py\", line 156, in run\n    node_result = node(**arguments)\n                  ^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/models.py\", line 41, in __call__\n    return self.run(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/models.py\", line 65, in run\n    data = self._run(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/clients/client.py\", line 725, in _run\n    return self.client.invoke(**kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/cache/cache.py\", line 55, in wrapper\n    return func(self, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/clients/client.py\", line 130, in invoke\n    response = self._invoke(\n               ^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/clients/mistral/mistral_client.py\", line 168, in _invoke\n    response = self.client.chat.complete(**request_params)\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/mistralai/chat.py\", line 248, in complete\n    raise models.SDKError(\"API error occurred\", http_res, http_res_text)\nmistralai.models.sdkerror.SDKError: API error occurred: Status 400. Body: {\"object\":\"error\",\"message\":\"Unexpected role 'user' after role 'tool'\",\"type\":\"invalid_request_message_order\",\"param\":null,\"code\":\"3230\"}\n2025-12-04 16:05:49 [3923909] [ERROR] Error during document query: API error occurred: Status 400. Body: {\"object\":\"error\",\"message\":\"Unexpected role 'user' after role 'tool'\",\"type\":\"invalid_request_message_order\",\"param\":null,\"code\":\"3230\"}\nTraceback (most recent call last):\n  File \"/app/backend/api/views.py\", line 412, in query_documents\n    response = query_service.retrieve_pdf(query_text)\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/api/services/rag_service.py\", line 546, in retrieve_pdf\n    result = dag_pipeline.run(pipeline_input)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/pipeline/dag_pipeline.py\", line 156, in run\n    node_result = node(**arguments)\n                  ^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/models.py\", line 41, in __call__\n    return self.run(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/models.py\", line 65, in run\n    data = self._run(*args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/clients/client.py\", line 725, in _run\n    return self.client.invoke(**kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/cache/cache.py\", line 55, in wrapper\n    return func(self, *args, **kwargs)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/core/clients/client.py\", line 130, in invoke\n    response = self._invoke(\n               ^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/datapizza/clients/mistral/mistral_client.py\", line 168, in _invoke\n    response = self.client.chat.complete(**request_params)\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/app/backend/.venv/lib/python3.12/site-packages/mistralai/chat.py\", line 248, in complete\n    raise models.SDKError(\"API error occurred\", http_res, http_res_text)\nmistralai.models.sdkerror.SDKError: API error occurred: Status 400. Body: {\"object\":\"error\",\"message\":\"Unexpected role 'user' after role 'tool'\",\"type\":\"invalid_request_message_order\",\"param\":null,\"code\":\"3230\"}\nInternal Server Error: /api/query/\n\n\n```\n\n**Additional context**\nIn Mistral documentation there's an explicit call to the model to format the tool response:\nhttps://docs.mistral.ai/capabilities/function_calling#step-4\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/98/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/88",
      "id": 3615920673,
      "node_id": "I_kwDOPnuGX87XhpIh",
      "number": 88,
      "title": "Pyright warning/error \"Import not found\" when importing clients (built locally) in a new project",
      "user": {
        "login": "Graffioh",
        "id": 93008765,
        "node_id": "U_kgDOBYszfQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/93008765?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Graffioh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-12T10:24:32Z",
      "updated_at": "2025-11-13T09:25:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Description\n\nI wanted to try some changes by using my local-built datapizza-ai repository and importing `GoogleClient`, so I created a new uv project and copied [this example chatbot](https://docs.datapizza.ai/latest/Guides/Clients/chatbot/) from documentation. \n\nAn import error appeared: `Import \"datapizza.clients.google\" could not be resolved` and this happened also with other clients, even if:\n- I installed every package in my new project (datapizza-ai, datapizza-ai-clients-google, datapizza-ai-clients-openai etc...) as suggested\n- I configured pyright with a `pyrightconfig.json` file\n\n*Additional Note*: The code runs without errors, it’s just an IDE/editor import issue. Fixing it would help with navigation features like “jump to definition\" and similar.\n\n### Steps\n\nList of steps I followed while creating the project and investigating the error.\n\n- `uv init <project-name>`\n- `uv pip install -e <local-packages-path>` (so that I refer to the locally built repo)\n- Create `pyrightconfig.json`\n- `uv sync`\n- `uv run main.py` (this worked fine)\n\n## Fix\n\nAn `__init__.py` is needed (even if empty) in the parent folder of each `*_client.py` file, in the same level of clients/ dir, such that it can be found when importing externally.\n\n## Test\n\nAfter the fix, the import is correctly resolved in the IDE/editor",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/88/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        109
      ]
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/72",
      "id": 3570461287,
      "node_id": "I_kwDOPnuGX87U0Opn",
      "number": 72,
      "title": "Mistral OCR Support",
      "user": {
        "login": "thetombrider",
        "id": 48912889,
        "node_id": "MDQ6VXNlcjQ4OTEyODg5",
        "avatar_url": "https://avatars.githubusercontent.com/u/48912889?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thetombrider",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9204471514,
          "node_id": "LA_kwDOPnuGX88AAAACJKEW2g",
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-10-30T12:01:44Z",
      "updated_at": "2025-11-12T08:26:53Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Mistral OCR support for document parsing would be a nice addition 👍 \n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/72/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/45",
      "id": 3531809331,
      "node_id": "I_kwDOPnuGX87SgyIz",
      "number": 45,
      "title": "Add support for Graph RAG",
      "user": {
        "login": "filopedraz",
        "id": 29598954,
        "node_id": "MDQ6VXNlcjI5NTk4OTU0",
        "avatar_url": "https://avatars.githubusercontent.com/u/29598954?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/filopedraz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9204471514,
          "node_id": "LA_kwDOPnuGX88AAAACJKEW2g",
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-20T09:55:03Z",
      "updated_at": "2025-10-20T13:47:32Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Support for Graph RAG in order to handle more advanced pipelines.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/45/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/13",
      "id": 3512711827,
      "node_id": "I_kwDOPnuGX87RX7qT",
      "number": 13,
      "title": "[Feature Request] Add MCP and A2A Protocol Support",
      "user": {
        "login": "TommasoTerrin",
        "id": 38006450,
        "node_id": "MDQ6VXNlcjM4MDA2NDUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/38006450?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/TommasoTerrin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9204471514,
          "node_id": "LA_kwDOPnuGX88AAAACJKEW2g",
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-14T07:27:32Z",
      "updated_at": "2025-10-15T08:02:05Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\n## Problem\nThe library currently lacks native support for two recent protocols that have quickly become important in the AI agent space:\n\n**Model Context Protocol (MCP)**: Enables AI applications to securely connect with external data sources and tools \n**Agent2Agent Protocol (A2A**): Enables agents to communicate and coordinate across different platforms\n\nThis forces developers to implement custom integrations, reducing interoperability with the broader ecosystem.\n\n## Proposed Solution\nI personally find the approach used in Google's ADK library particularly well-designed. Here are the relevant modules for **reference**:\n* For MCP: \n    * https://google.github.io/adk-docs/mcp/\n    * https://github.com/modelcontextprotocol\n* For A2A: \n    * https://google.github.io/adk-docs/a2a/\n    * https://github.com/a2aproject/A2A\n\n\nHappy to contribute to the implementation if this aligns with the project roadmap!\n\n(PS: davvero un gran lavoro ragazzi, ho ottime aspettative per questo progetto 🍕 🇮🇹 🍀)\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/13/reactions",
        "total_count": 7,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/8",
      "id": 3510122804,
      "node_id": "I_kwDOPnuGX87RODk0",
      "number": 8,
      "title": "Relational VectorStore",
      "user": {
        "login": "19Alma98",
        "id": 177752957,
        "node_id": "U_kgDOCphLfQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/177752957?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/19Alma98",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9204471514,
          "node_id": "LA_kwDOPnuGX88AAAACJKEW2g",
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/labels/enhancement",
          "name": "enhancement",
          "color": "a2eeef",
          "default": true,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-10-13T13:39:25Z",
      "updated_at": "2025-12-12T14:41:11Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "One of the main challenges I faced while building a RAG system in an existing production environment is that most production databases are relational (e.g., PostgreSQL).\n\nIntroducing a new vector database like Qdrant can be difficult, since even if they are open-source, they add architectural and operational overhead.\nA solution, when Postgres is the database, would be to use the pgvector extension as the vector store.\n\nHowever, the current Vectorstore abstract class (https://github.com/datapizza-labs/datapizza-ai/blob/main/datapizza-ai-core/datapizza/core/vectorstore/vectorstore.py#L25)  seems optimized for standalone vector databases and not for relational backends. I mean, it only takes a collection_name, but a relational setup would typically require a table_name, a column_name for the embedding/vector field and a set of pre-configured queries to retrieve data.\nTherefore, adapting the interface for pgvector might not be straightforward.\n\nWould you consider implementing a PgVectorStore backend (or just adjusting the interface to better support relational vector stores)?.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/8/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": [
        109
      ]
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/2",
      "id": 3504210075,
      "node_id": "I_kwDOPnuGX87Q3gCb",
      "number": 2,
      "title": "data isolation strategy in DagPipeline - deepcopy TODO at line 124",
      "user": {
        "login": "AndreaBozzo",
        "id": 11338226,
        "node_id": "MDQ6VXNlcjExMzM4MjI2",
        "avatar_url": "https://avatars.githubusercontent.com/u/11338226?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AndreaBozzo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-10T19:11:39Z",
      "updated_at": "2025-10-10T19:11:39Z",
      "closed_at": null,
      "assignee": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\na bit of context:\nWhile implementing the TODO comment at line 124 in `dag_pipeline.py`, I identified design questions that warrant discussion before merging.\n\ncurrent behavior\n\nWhen multiple nodes in a DagPipeline depend on the same source node, they receive references to the same objects. If one node mutates the data, other nodes see those mutations, leading to non-deterministic behavior.\n\nthe TODO\n\n```python\n# dag_pipeline.py:124\nargs[edge.dst_key] = value  # TODO  deepcopy(value)\n```\n\nkey questions ( yes i asked Claude to format that xd )\n\n### 1. Design Intent\n- Was the TODO left intentionally for performance reasons?\n- Should nodes be expected to act as pure functions?\n- What is the intended design philosophy regarding data isolation?\n\n### 2. Performance Impact\n`deepcopy` has significant costs for:\n- Large embeddings (1536+ dimension vectors)\n- Document chunks with extensive metadata\n- LLM conversation history\n- Non-serializable objects (connections, file handles)\n\nShould this be:\n- Always enabled (safety over performance)?\n- Configurable per pipeline or connection?\n- Documented as user responsibility?\n\n### 3. Consistency\n\nCurrent state shows inconsistency:\n```python\n# Line 106: deepcopy used for initial input\nargs = deepcopy(_input.get(node_name, {}))\n\n# Line 125: TODO suggests deepcopy for inter-node data\nargs[edge.dst_key] = value  # TODO deepcopy(value)\n\n# Line 158: No deepcopy when storing results\npipeline_results[node_name] = node_result\n```\n\nShould `pipeline_results` storage also use deepcopy?\n\n### 4. Comparison with FunctionalPipeline\n\n`FunctionalPipeline` uses `copy.deepcopy` for parallel branches (line 307). Should `DagPipeline` follow the same pattern?\n\n## Implementation Ready\n\nBranch `fix/dag-pipeline-deepcopy-side-effects` contains:\n- Implementation of `deepcopy(value)` at line 125\n- Test case demonstrating the isolation issue\n- All existing tests pass\n\n## Alternative Approaches\n\n1. Document that nodes must not mutate inputs\n2. Use frozen/immutable data structures\n3. Implement copy-on-write semantics\n4. Add configuration flag for isolation strategy\n5. Selective copying based on type mutability\n\n## Request\n\nBefore submitting a PR, I would appreciate guidance on:\n- Whether this change aligns with the framework's design goals\n- Performance considerations for typical use cases\n- Whether additional changes (e.g., line 158) should be included\n- Preferred approach among alternatives\n\n## References\n\n- `datapizza-ai-core/datapizza/pipeline/dag_pipeline.py` (lines 100-131, 158)\n- `datapizza-ai-core/datapizza/pipeline/functional_pipeline.py` (line 307)\n- `datapizza-ai-core/datapizza/memory/memory.py` (line 120)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/2/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "pinned_comment": null,
      "linked_prs": []
    }
  ],
  "pulls": [
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/117",
      "id": 3352402147,
      "node_id": "PR_kwDOPnuGX87H0Zjj",
      "number": 117,
      "state": "open",
      "locked": false,
      "title": "feat: add dense embedder support for fastembed with tests",
      "user": {
        "login": "AlessioChen",
        "id": 18360913,
        "node_id": "MDQ6VXNlcjE4MzYwOTEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/18360913?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlessioChen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "# Summary\r\n\r\nThis pull request adds **dense embedding** support to the existing`FastEmbedder` implementation. Previously FastEmbedder focused on sparse embedding formats; with this change, it can now produce dense vectors as well, enabling a broader range of use-cases such as dense similarity search and dense retrieval workflows.\r\n\r\n# Motivation\r\n\r\nFastEmbedder previously supported sparse text embeddings (via FastEmbed) for memory-efficient similarity search. However, many retrieval and vector search workflows (e.g. dense RAG pipelines) require dense vectors. Adding dense embedding support increases flexibility and makes FastEmbedder a more versatile component within Datapizza-AI’s embedding ecosystem.\r\n\r\n# Tests\r\n\r\n- Basic tests verifying output dimensions.\r\n- Edge-cases for batch and single input handling.\r\n- Compatibility checks with vector stores (e.g. Qdrant) when dense vectors are used.\r\n",
      "created_at": "2026-03-04T08:52:18Z",
      "updated_at": "2026-03-04T09:06:56Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "909ed6686448727fde8843716c2f4eb68e5251c7",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "AlessioChen:feat/fast-dense-embedder",
        "ref": "feat/fast-dense-embedder",
        "sha": "df0e4125be71ce174c9abbab0f3b410bc48ab948",
        "user": {
          "login": "AlessioChen",
          "id": 18360913,
          "node_id": "MDQ6VXNlcjE4MzYwOTEz",
          "avatar_url": "https://avatars.githubusercontent.com/u/18360913?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlessioChen",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1172380055,
          "node_id": "R_kgDOReEZlw",
          "name": "datapizza-ai",
          "full_name": "AlessioChen/datapizza-ai",
          "private": false,
          "owner": {
            "login": "AlessioChen",
            "id": 18360913,
            "node_id": "MDQ6VXNlcjE4MzYwOTEz",
            "avatar_url": "https://avatars.githubusercontent.com/u/18360913?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/AlessioChen",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/AlessioChen/datapizza-ai",
          "created_at": "2026-03-04T08:40:58Z",
          "updated_at": "2026-03-04T08:40:58Z",
          "pushed_at": "2026-03-04T09:03:47Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 2279,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "1558ccf21ed57b50440f7f4ce46a6379eb934855",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/117"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/117"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/117"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/117/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/117/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/117/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/df0e4125be71ce174c9abbab0f3b410bc48ab948"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/114",
      "id": 3323797451,
      "node_id": "PR_kwDOPnuGX87GHR_L",
      "number": 114,
      "state": "open",
      "locked": false,
      "title": "docs: add security warnings for WebFetch and FileSystem",
      "user": {
        "login": "gbell27",
        "id": 33400885,
        "node_id": "MDQ6VXNlcjMzNDAwODg1",
        "avatar_url": "https://avatars.githubusercontent.com/u/33400885?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gbell27",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Added SSRF/path traversal warnings + mitigation examples to WebFetch/FileSystem docs. Documentation only.\r\n",
      "created_at": "2026-02-25T04:59:12Z",
      "updated_at": "2026-02-25T04:59:12Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "c57bf99954522723e5043c92842adeb5fad034a2",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "gbell27:feature/security-warnings",
        "ref": "feature/security-warnings",
        "sha": "281e297db7ad040687ca10f45b5ffcc3c46fafb4",
        "user": {
          "login": "gbell27",
          "id": 33400885,
          "node_id": "MDQ6VXNlcjMzNDAwODg1",
          "avatar_url": "https://avatars.githubusercontent.com/u/33400885?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/gbell27",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1166301287,
          "node_id": "R_kgDORYRYZw",
          "name": "datapizza-ai",
          "full_name": "gbell27/datapizza-ai",
          "private": false,
          "owner": {
            "login": "gbell27",
            "id": 33400885,
            "node_id": "MDQ6VXNlcjMzNDAwODg1",
            "avatar_url": "https://avatars.githubusercontent.com/u/33400885?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/gbell27",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/gbell27/datapizza-ai",
          "created_at": "2026-02-25T04:39:05Z",
          "updated_at": "2026-02-25T04:39:05Z",
          "pushed_at": "2026-02-25T04:57:03Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 2256,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "0e2b090fb95033167095a1e9c5ebb93a9d22c22e",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/114"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/114"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/114"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/114/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/114/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/114/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/281e297db7ad040687ca10f45b5ffcc3c46fafb4"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/109",
      "id": 3237984701,
      "node_id": "PR_kwDOPnuGX87A_7m9",
      "number": 109,
      "state": "open",
      "locked": false,
      "title": "fix: resolve Pyright 'Import not found' errors for namespace packages",
      "user": {
        "login": "ZiRoX7",
        "id": 95140231,
        "node_id": "U_kgDOBau5hw",
        "avatar_url": "https://avatars.githubusercontent.com/u/95140231?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ZiRoX7",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "  ## Summary\r\n  - Add `__init__.py` with `extend_path` to all namespace package directories\r\n  - Add `py.typed` marker files for PEP 561 type checking support\r\n  - Update `pyrightconfig.json` with `extraPaths` for monorepo development\r\n\r\n  ## Problem\r\n  When importing locally-built datapizza-ai clients in a new project, Pyright reports import resolution errors like \"Import\r\n  'datapizza.clients.google' could not be resolved\" despite correct installation.\r\n\r\n  ## Solution\r\n  This fixes IDE type checking errors when importing from distributed namespace packages (e.g., `datapizza.clients.google`) while       \r\n  maintaining full runtime compatibility.\r\n\r\n  Closes #88",
      "created_at": "2026-02-02T19:29:35Z",
      "updated_at": "2026-02-02T19:29:35Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "590d17a961299f0889c57854f1de5b41d3d151d9",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "ZiRoX7:fix/pyright-namespace-packages",
        "ref": "fix/pyright-namespace-packages",
        "sha": "8dc8ced010a546fd9c9af7a857e2d5e54b9e1d76",
        "user": {
          "login": "ZiRoX7",
          "id": 95140231,
          "node_id": "U_kgDOBau5hw",
          "avatar_url": "https://avatars.githubusercontent.com/u/95140231?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ZiRoX7",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1148273640,
          "node_id": "R_kgDORHFD6A",
          "name": "datapizza-ai",
          "full_name": "ZiRoX7/datapizza-ai",
          "private": false,
          "owner": {
            "login": "ZiRoX7",
            "id": 95140231,
            "node_id": "U_kgDOBau5hw",
            "avatar_url": "https://avatars.githubusercontent.com/u/95140231?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/ZiRoX7",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/ZiRoX7/datapizza-ai",
          "created_at": "2026-02-02T19:22:51Z",
          "updated_at": "2026-02-02T19:35:32Z",
          "pushed_at": "2026-02-02T20:27:35Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 2237,
          "stargazers_count": 1,
          "watchers_count": 1,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 1,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "499c7c160fcaf7853d108ded81c337edcfba96b0",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/109"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/109"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/109"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/109/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/109/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/109/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/8dc8ced010a546fd9c9af7a857e2d5e54b9e1d76"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": [
        8,
        88
      ]
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/104",
      "id": 3137413480,
      "node_id": "PR_kwDOPnuGX867ASFo",
      "number": 104,
      "state": "open",
      "locked": false,
      "title": "feat: enhance GoogleClient to include grounding and URL context metadata",
      "user": {
        "login": "rasphlat",
        "id": 30881307,
        "node_id": "MDQ6VXNlcjMwODgxMzA3",
        "avatar_url": "https://avatars.githubusercontent.com/u/30881307?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rasphlat",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Add `grounding_metadata` and `url_context_metadata` to Google Client Response\r\n\r\n### Summary\r\n\r\nThis PR exposes `grounding_metadata` and `url_context_metadata` from Google's API response as dynamic attributes on `ClientResponse` when using `invoke()` or `a_invoke()`. These metadata objects are only added when present and non-empty.\r\n\r\n### Motivation\r\n\r\nWhen using Google's grounding tools (Google Search, Google Maps, URL Context), the API returns rich metadata that enables building citation experiences, verifying sources, and understanding how the model grounded its response. Previously, this metadata was discarded.\r\n\r\n### Supported Tools\r\n\r\n#### 🔍 Google Search Grounding\r\n\r\nWhen using `google_search`, the `grounding_metadata` provides:\r\n- **`web_search_queries`**: The search queries the model executed\r\n- **`grounding_chunks`**: Web sources with URIs and titles\r\n- **`grounding_supports`**: Maps text segments to source citations (enables inline citations)\r\n- **`search_entry_point`**: HTML/CSS for rendering search suggestions\r\n\r\n[Documentation](https://ai.google.dev/gemini-api/docs/google-search)\r\n\r\n#### 🗺️ Google Maps Grounding\r\n\r\nWhen using `google_maps`, the `grounding_metadata` contains location-based grounding information from Google Maps data, enabling place-aware responses with verifiable sources.\r\n\r\n[Documentation](https://ai.google.dev/gemini-api/docs/maps-grounding)\r\n\r\n#### 🔗 URL Context Tool\r\n\r\nWhen using `url_context`, the `url_context_metadata` provides:\r\n- **`url_metadata`**: Array of retrieved URLs with their retrieval status (`URL_RETRIEVAL_STATUS_SUCCESS`, etc.)\r\n\r\nThis helps verify which URLs were successfully fetched and used to ground the response.\r\n\r\n[Documentation](https://ai.google.dev/gemini-api/docs/url-context)\r\n\r\n### Usage\r\n\r\n```python\r\nfrom google.genai import types\r\n\r\n# Example with Google Search\r\nresponse = client.invoke(\r\n    \"Who won Euro 2024?\",\r\n    tools=[{\"google_search\": types.GoogleSearch()}]\r\n)\r\n\r\n# Access grounding metadata if present\r\nif hasattr(response, \"grounding_metadata\"):\r\n    metadata = response.grounding_metadata\r\n    print(\"Search queries:\", metadata.web_search_queries)\r\n    print(\"Sources:\", metadata.grounding_chunks)\r\n    \r\n    # Build inline citations\r\n    for support in metadata.grounding_supports:\r\n        print(f\"Text: {support.segment.text}\")\r\n        print(f\"Source indices: {support.grounding_chunk_indices}\")\r\n\r\n# Example with URL Context\r\nif hasattr(response, \"url_context_metadata\"):\r\n    for url_info in response.url_context_metadata.url_metadata:\r\n        print(f\"URL: {url_info.retrieved_url}\")\r\n        print(f\"Status: {url_info.url_retrieval_status}\")\r\n```\r\n\r\n### Notes\r\n\r\n- Metadata objects are native Google types (`types.GroundingMetadata`, `types.UrlContextMetadata`)\r\n- Use `hasattr()` to check for presence before accessing\r\n- Only affects `invoke()` and `a_invoke()` methods\r\n",
      "created_at": "2025-12-30T17:38:33Z",
      "updated_at": "2025-12-30T17:38:33Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "478e81ada7679d29c5da5ba4f4465b2a20fbba38",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "rasphlat:feature/google-response-metadata",
        "ref": "feature/google-response-metadata",
        "sha": "e704c5add98d7ae96ca74b343a1cffbf33bc0ed4",
        "user": {
          "login": "rasphlat",
          "id": 30881307,
          "node_id": "MDQ6VXNlcjMwODgxMzA3",
          "avatar_url": "https://avatars.githubusercontent.com/u/30881307?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/rasphlat",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1125289558,
          "node_id": "R_kgDOQxKOVg",
          "name": "datapizza-ai",
          "full_name": "rasphlat/datapizza-ai",
          "private": false,
          "owner": {
            "login": "rasphlat",
            "id": 30881307,
            "node_id": "MDQ6VXNlcjMwODgxMzA3",
            "avatar_url": "https://avatars.githubusercontent.com/u/30881307?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/rasphlat",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/rasphlat/datapizza-ai",
          "created_at": "2025-12-30T13:13:37Z",
          "updated_at": "2026-01-05T15:33:11Z",
          "pushed_at": "2026-01-05T16:04:40Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 2211,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Python",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "7629329aa41872d165bca24af841ff6141a2ba45",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/104"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/104"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/104"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/104/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/104/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/104/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/e704c5add98d7ae96ca74b343a1cffbf33bc0ed4"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/89",
      "id": 3002263291,
      "node_id": "PR_kwDOPnuGX86y8ub7",
      "number": 89,
      "state": "open",
      "locked": false,
      "title": "Create __init__ files in clients directories to fix pyright import errors in external projects.",
      "user": {
        "login": "Graffioh",
        "id": 93008765,
        "node_id": "U_kgDOBYszfQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/93008765?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Graffioh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "PR to address this [Issue](https://github.com/datapizza-labs/datapizza-ai/issues/88).",
      "created_at": "2025-11-12T10:25:54Z",
      "updated_at": "2025-11-12T10:25:54Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "e34908d043db7f2ee429e3affb1c35b030a3bfe0",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "Graffioh:pyright-clients-namespace",
        "ref": "pyright-clients-namespace",
        "sha": "49febe3bc4b1a9b447cc63b7a2c00ed516b00dfc",
        "user": {
          "login": "Graffioh",
          "id": 93008765,
          "node_id": "U_kgDOBYszfQ",
          "avatar_url": "https://avatars.githubusercontent.com/u/93008765?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Graffioh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1092878450,
          "node_id": "R_kgDOQSQAcg",
          "name": "datapizza-ai",
          "full_name": "Graffioh/datapizza-ai",
          "private": false,
          "owner": {
            "login": "Graffioh",
            "id": 93008765,
            "node_id": "U_kgDOBYszfQ",
            "avatar_url": "https://avatars.githubusercontent.com/u/93008765?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Graffioh",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/Graffioh/datapizza-ai",
          "created_at": "2025-11-09T13:46:14Z",
          "updated_at": "2025-11-11T08:09:19Z",
          "pushed_at": "2025-11-14T11:25:51Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 2147,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Python",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "eb85abb38006070c1984f317b8245465775a6760",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/89"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/89"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/89"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/89/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/89/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/89/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/49febe3bc4b1a9b447cc63b7a2c00ed516b00dfc"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/66",
      "id": 2952855729,
      "node_id": "PR_kwDOPnuGX86wAQCx",
      "number": 66,
      "state": "open",
      "locked": false,
      "title": "Feat: Add support for Redis memory",
      "user": {
        "login": "micmancini16",
        "id": 16287943,
        "node_id": "MDQ6VXNlcjE2Mjg3OTQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/16287943?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/micmancini16",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This PR adds a submodule `datapizza-ai-memory-redis`,  a Redis-based memory to be used for persistent, long-term \r\napplications.\r\n\r\n\r\n## Installation\r\n\r\n```bash\r\n# Install the core framework\r\npip install datapizza-ai\r\n# Install the Redis Memory\r\npip install datapizza-ai-memory-redis\r\n```\r\n\r\n## Usage\r\n```python\r\nfrom datapizza.memory.redis import RedisMemory\r\n\r\n# Initialize RedisMemory with user_id and session_id\r\nmemory = RedisMemory(user_id=\"unique_id_for_user\", session_id=\"unique_id_for_chat_session\")\r\n\r\n# Can be used as other memories\r\nagent = Agent(\r\n    name=\"my_agent\", client=client, tools=[], memory=memory\r\n)\r\n\r\n# Fetch all session messages\r\nmessages = memory.memory\r\n\r\n# Print messages\r\nfor message in messages:\r\n    print(message)\r\n```",
      "created_at": "2025-10-27T22:20:38Z",
      "updated_at": "2025-10-28T07:24:19Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "5f10c5c5aa614ca714c0fc1748c0aebd860c3050",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "micmancini16:feat/redis-memory",
        "ref": "feat/redis-memory",
        "sha": "4cfa1546372681e74ad824e15f1d2bc5fc502bbc",
        "user": {
          "login": "micmancini16",
          "id": 16287943,
          "node_id": "MDQ6VXNlcjE2Mjg3OTQz",
          "avatar_url": "https://avatars.githubusercontent.com/u/16287943?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/micmancini16",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1082697609,
          "node_id": "R_kgDOQIiniQ",
          "name": "datapizza-ai",
          "full_name": "micmancini16/datapizza-ai",
          "private": false,
          "owner": {
            "login": "micmancini16",
            "id": 16287943,
            "node_id": "MDQ6VXNlcjE2Mjg3OTQz",
            "avatar_url": "https://avatars.githubusercontent.com/u/16287943?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/micmancini16",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/micmancini16/datapizza-ai",
          "created_at": "2025-10-24T16:18:05Z",
          "updated_at": "2025-10-24T16:18:05Z",
          "pushed_at": "2025-10-28T07:24:18Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 1802,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": null,
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "97fd1c540529354f3b0ffacc94d58db5f3aa5140",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/66"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/66"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/66"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/66/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/66/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/66/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/4cfa1546372681e74ad824e15f1d2bc5fc502bbc"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/41",
      "id": 2926991705,
      "node_id": "PR_kwDOPnuGX86udllZ",
      "number": 41,
      "state": "open",
      "locked": false,
      "title": "Telegram bot tool",
      "user": {
        "login": "gdacciaro",
        "id": 6198615,
        "node_id": "MDQ6VXNlcjYxOTg2MTU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6198615?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gdacciaro",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "### Summary\r\n\r\nAdd a Telegram Bot management tool for Datapizza AI to enable agents to interact with Telegram chats and channels via the official Bot API.\r\n\r\n### Features\r\n\r\nProvide convenient wrappers for common Telegram Bot API endpoints, exposed as Datapizza @tools:\r\n\r\n- send_message(chat_id, text, parse_mode=None, disable_web_page_preview=False)\r\n- send_photo(chat_id, photo, caption=None, parse_mode=None)\r\n- send_document(chat_id, document, caption=None, parse_mode=None)\r\n- edit_message_text(chat_id, message_id, text, parse_mode=None, disable_web_page_preview=False)\r\n- get_me()",
      "created_at": "2025-10-18T18:15:02Z",
      "updated_at": "2025-10-18T18:15:02Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "011abd113d106daee2916f0c787469bbd3965f32",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "gdacciaro:telegram_tool",
        "ref": "telegram_tool",
        "sha": "a36ae044312b7f6d822ae409c74a436154c8bfb4",
        "user": {
          "login": "gdacciaro",
          "id": 6198615,
          "node_id": "MDQ6VXNlcjYxOTg2MTU=",
          "avatar_url": "https://avatars.githubusercontent.com/u/6198615?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/gdacciaro",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1077798289,
          "node_id": "R_kgDOQD3lkQ",
          "name": "datapizza-ai",
          "full_name": "gdacciaro/datapizza-ai",
          "private": false,
          "owner": {
            "login": "gdacciaro",
            "id": 6198615,
            "node_id": "MDQ6VXNlcjYxOTg2MTU=",
            "avatar_url": "https://avatars.githubusercontent.com/u/6198615?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/gdacciaro",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/gdacciaro/datapizza-ai",
          "created_at": "2025-10-16T18:51:10Z",
          "updated_at": "2025-10-17T18:01:23Z",
          "pushed_at": "2025-10-18T18:12:57Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 1739,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Python",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "e180125817c2081cfc2e739582bceeaca5fbd170",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/41"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/41"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/41"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/41/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/41/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/41/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/a36ae044312b7f6d822ae409c74a436154c8bfb4"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/10",
      "id": 2910481328,
      "node_id": "PR_kwDOPnuGX86temuw",
      "number": 10,
      "state": "open",
      "locked": false,
      "title": "Ensure DAG pipeline isolates node inputs",
      "user": {
        "login": "robitec97",
        "id": 45318540,
        "node_id": "MDQ6VXNlcjQ1MzE4NTQw",
        "avatar_url": "https://avatars.githubusercontent.com/u/45318540?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/robitec97",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Hello,\r\nI've tried to fix a few things mentioned in your issue: https://github.com/datapizza-labs/datapizza-ai/issues/2\r\n\r\n- Ensured _get_args_for_node deep copies dependency values so DAG pipeline nodes receive isolated inputs rather than shared references.\r\n\r\n- Added a regression test confirming branches that share a source node get independent copies even when one consumer mutates its input.\r\n\r\nTesting\r\n\r\n-  pytest datapizza-ai-core/datapizza/pipeline/tests/test_graph_pipeline.py ",
      "created_at": "2025-10-13T14:39:18Z",
      "updated_at": "2025-10-15T10:25:13Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "30303e05c505cab03b28e9c02c2f8f885ff91f42",
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "robitec97:main",
        "ref": "main",
        "sha": "0d6e039a3c4b7689831df5dabb60943047b3995a",
        "user": {
          "login": "robitec97",
          "id": 45318540,
          "node_id": "MDQ6VXNlcjQ1MzE4NTQw",
          "avatar_url": "https://avatars.githubusercontent.com/u/45318540?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/robitec97",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1075456729,
          "node_id": "R_kgDOQBoq2Q",
          "name": "datapizza-ai",
          "full_name": "robitec97/datapizza-ai",
          "private": false,
          "owner": {
            "login": "robitec97",
            "id": 45318540,
            "node_id": "MDQ6VXNlcjQ1MzE4NTQw",
            "avatar_url": "https://avatars.githubusercontent.com/u/45318540?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/robitec97",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": true,
          "url": "https://api.github.com/repos/robitec97/datapizza-ai",
          "created_at": "2025-10-13T14:23:42Z",
          "updated_at": "2025-10-15T08:23:43Z",
          "pushed_at": "2025-10-15T09:38:35Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 1713,
          "stargazers_count": 0,
          "watchers_count": 0,
          "language": "Python",
          "has_issues": false,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 0,
          "archived": false,
          "disabled": false,
          "open_issues_count": 0,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {},
          "visibility": "public",
          "forks": 0,
          "open_issues": 0,
          "watchers": 0,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "datapizza-labs:main",
        "ref": "main",
        "sha": "20e8efa723cd26c2ad9534c4f3b0f6c3f292f1d9",
        "user": {
          "login": "datapizza-labs",
          "id": 229088968,
          "node_id": "O_kgDODaeeyA",
          "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/datapizza-labs",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 1048282719,
          "node_id": "R_kgDOPnuGXw",
          "name": "datapizza-ai",
          "full_name": "datapizza-labs/datapizza-ai",
          "private": false,
          "owner": {
            "login": "datapizza-labs",
            "id": 229088968,
            "node_id": "O_kgDODaeeyA",
            "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/datapizza-labs",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "Build reliable Gen AI solutions without overhead 🍕",
          "fork": false,
          "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
          "created_at": "2025-09-01T07:56:46Z",
          "updated_at": "2026-03-09T19:44:00Z",
          "pushed_at": "2026-03-05T15:40:26Z",
          "homepage": "http://docs.datapizza.ai/",
          "size": 3949,
          "stargazers_count": 2160,
          "watchers_count": 2160,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": true,
          "has_discussions": false,
          "forks_count": 133,
          "archived": false,
          "disabled": false,
          "open_issues_count": 19,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "has_pull_requests": true,
          "pull_request_creation_policy": "all",
          "topics": {
            "0": "agent",
            "1": "ai",
            "2": "genai",
            "3": "llm",
            "4": "python"
          },
          "visibility": "public",
          "forks": 133,
          "open_issues": 19,
          "watchers": 2160,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/10"
        },
        "html": {
          "href": "https://github.com/datapizza-labs/datapizza-ai/pull/10"
        },
        "issue": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/10"
        },
        "comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/issues/10/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/10/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/pulls/10/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/datapizza-labs/datapizza-ai/statuses/0d6e039a3c4b7689831df5dabb60943047b3995a"
        }
      },
      "author_association": "NONE",
      "auto_merge": null,
      "assignee": null,
      "active_lock_reason": null,
      "linked_issues": []
    }
  ],
  "discussions": [],
  "details": {
    "id": 1048282719,
    "node_id": "R_kgDOPnuGXw",
    "name": "datapizza-ai",
    "full_name": "datapizza-labs/datapizza-ai",
    "private": false,
    "owner": {
      "login": "datapizza-labs",
      "id": 229088968,
      "node_id": "O_kgDODaeeyA",
      "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/datapizza-labs",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "description": "Build reliable Gen AI solutions without overhead 🍕",
    "fork": false,
    "url": "https://api.github.com/repos/datapizza-labs/datapizza-ai",
    "created_at": "2025-09-01T07:56:46Z",
    "updated_at": "2026-03-09T19:44:00Z",
    "pushed_at": "2026-03-05T15:40:26Z",
    "homepage": "http://docs.datapizza.ai/",
    "size": 3949,
    "stargazers_count": 2160,
    "watchers_count": 2160,
    "language": "Python",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": false,
    "has_pages": true,
    "has_discussions": false,
    "forks_count": 133,
    "archived": false,
    "disabled": false,
    "open_issues_count": 19,
    "license": {
      "key": "mit",
      "name": "MIT License",
      "spdx_id": "MIT",
      "url": "https://api.github.com/licenses/mit",
      "node_id": "MDc6TGljZW5zZTEz"
    },
    "allow_forking": true,
    "is_template": false,
    "web_commit_signoff_required": false,
    "has_pull_requests": true,
    "pull_request_creation_policy": "all",
    "topics": {
      "0": "agent",
      "1": "ai",
      "2": "genai",
      "3": "llm",
      "4": "python"
    },
    "visibility": "public",
    "forks": 133,
    "open_issues": 19,
    "watchers": 2160,
    "default_branch": "main",
    "permissions": {
      "admin": false,
      "maintain": false,
      "push": false,
      "triage": false,
      "pull": true
    },
    "temp_clone_token": "",
    "custom_properties": {},
    "organization": {
      "login": "datapizza-labs",
      "id": 229088968,
      "node_id": "O_kgDODaeeyA",
      "avatar_url": "https://avatars.githubusercontent.com/u/229088968?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/datapizza-labs",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "network_count": 133,
    "subscribers_count": 16
  },
  "lastFetched": 1773098113178
}