Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
242 KiB
JSON
1 line
242 KiB
JSON
{"repo": "binome-dev/graphite", "files": {".github/workflows/ci.yaml": {"fc53b22de3e798e9ca28918456ae81bc01a3a874": {"t": 1785747013.4447055, "n": 25754, "h": "6e5c9f730cc8cdcf", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - tests_integration/**\n - uv.lock\n - pyproject.toml\n - .github/workflows/ci.yaml\n\nconcurrency:\n group: ci-${{ github.ref }}\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\n\njobs:\n code-quality:\n name: Code Quality Checks\n runs-on: ubuntu-latest\n timeout-minutes: 10\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run ruff linting\n run: uv run pre-commit run --all-files\n\n unit-tests:\n name: Unit Tests (Python ${{ matrix.python-version }})\n runs-on: ubuntu-latest\n timeout-minutes: 15\n strategy:\n fail-fast: false\n matrix:\n python-version: [\"3.11\", \"3.12\", \"3.13\"]\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ matrix.python-version }}\n run: uv python install ${{ matrix.python-version }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run unit tests\n run: uv run pytest tests/ -v --tb=short\n\n - name: Generate test summary\n if: always()\n run: |\n echo \"### Unit Test Results (Python ${{ matrix.python-version }})\" >> $GITHUB_STEP_SUMMARY\n echo \"Tests completed for Python ${{ matrix.python-version }}\" >> $GITHUB_STEP_SUMMARY\n\n # Integration tests running in parallel\n integration-agents:\n name: Integration - agents\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - agents\n run: |\n set +e\n output=$(uv run python tests_integration/agents/run_agents.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - agents\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - agents\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-embedding-assistant:\n name: Integration - embedding_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - embedding_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/embedding_assistant/run_embedding_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - embedding_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - embedding_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-function-assistant:\n name: Integration - function_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - function_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/function_assistant/run_function_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - function_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - function_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-function-call-assistant:\n name: Integration - function_call_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - function_call_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/function_call_assistant/run_function_call_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - function_call_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - function_call_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-hith-assistant:\n name: Integration - hith_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - hith_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/hith_assistant/run_hith_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - hith_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - hith_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-input-output-topics:\n name: Integration - input_output_topics\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - input_output_topics\n run: |\n set +e\n output=$(uv run python tests_integration/input_output_topics/run_input_output_topics.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - input_output_topics\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - input_output_topics\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-invoke-kwargs:\n name: Integration - invoke_kwargs\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - invoke_kwargs\n run: |\n set +e\n output=$(uv run python tests_integration/invoke_kwargs/run_invoke_kwargs.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - invoke_kwargs\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - invoke_kwargs\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-multimodal-assistant:\n name: Integration - multimodal_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - multimodal_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/multimodal_assistant/run_multimodal_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - multimodal_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - multimodal_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-rag-assistant:\n name: Integration - rag_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - rag_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/rag_assistant/run_rag_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - rag_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - rag_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-react-assistant:\n name: Integration - react_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - react_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/react_assistant/run_react_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - react_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - react_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-simple-llm-assistant:\n name: Integration - simple_llm_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - simple_llm_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/simple_llm_assistant/run_simple_llm_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - simple_llm_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - simple_llm_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-simple-stream-assistant:\n name: Integration - simple_stream_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - simple_stream_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/simple_stream_assistant/run_simple_stream_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - simple_stream_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - simple_stream_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n timeout-minutes: 5\n if: github.ref == 'refs/heads/main'\n needs:\n - code-quality\n - unit-tests\n - integration-agents\n - integration-embedding-assistant\n - integration-function-assistant\n - integration-function-call-assistant\n - integration-hith-assistant\n - integration-input-output-topics\n - integration-invoke-kwargs\n - integration-multimodal-assistant\n - integration-rag-assistant\n - integration-react-assistant\n - integration-simple-llm-assistant\n - integration-simple-stream-assistant\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Check PyPI Version\n id: remote-version\n run: |\n LATEST_VERSION=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n echo \"LATEST_VERSION=${LATEST_VERSION}\" >> $GITHUB_OUTPUT\n\n - name: Version Check Summary\n run: |\n echo \"### Version Information\" >> $GITHUB_STEP_SUMMARY\n echo \"- Package Version: ${{ steps.package-version.outputs.VERSION }}\" >> $GITHUB_STEP_SUMMARY\n echo \"- PyPI Version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\" >> $GITHUB_STEP_SUMMARY\n if [ \"${{ steps.package-version.outputs.VERSION }}\" != \"${{ steps.remote-version.outputs.LATEST_VERSION }}\" ]; then\n echo \"- Status: 🚀 New version will be published\" >> $GITHUB_STEP_SUMMARY\n else\n echo \"- Status: ✅ Versions match, no publish needed\" >> $GITHUB_STEP_SUMMARY\n fi\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n timeout-minutes: 10\n needs: version\n if: github.ref == 'refs/heads/main' && needs.version.outputs.package-version != needs.version.outputs.remote-version\n\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Build project\n run: uv build\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n - name: Publish Summary\n run: |\n echo \"### PyPI Publication\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Published version ${{ needs.version.outputs.package-version }} to PyPI\" >> $GITHUB_STEP_SUMMARY\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n timeout-minutes: 5\n needs:\n - publish_pypi\n - version\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n\n - name: Release Summary\n run: |\n echo \"### GitHub Release\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Created release for version ${{ needs.version.outputs.package-version }}\" >> $GITHUB_STEP_SUMMARY\n"}, "45f0089d377dbc6fcbf0476aa16628c0639d5b7f": {"t": 1785769827.2680607, "n": 25754, "h": "6e5c9f730cc8cdcf", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - tests_integration/**\n - uv.lock\n - pyproject.toml\n - .github/workflows/ci.yaml\n\nconcurrency:\n group: ci-${{ github.ref }}\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\n\njobs:\n code-quality:\n name: Code Quality Checks\n runs-on: ubuntu-latest\n timeout-minutes: 10\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run ruff linting\n run: uv run pre-commit run --all-files\n\n unit-tests:\n name: Unit Tests (Python ${{ matrix.python-version }})\n runs-on: ubuntu-latest\n timeout-minutes: 15\n strategy:\n fail-fast: false\n matrix:\n python-version: [\"3.11\", \"3.12\", \"3.13\"]\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ matrix.python-version }}\n run: uv python install ${{ matrix.python-version }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run unit tests\n run: uv run pytest tests/ -v --tb=short\n\n - name: Generate test summary\n if: always()\n run: |\n echo \"### Unit Test Results (Python ${{ matrix.python-version }})\" >> $GITHUB_STEP_SUMMARY\n echo \"Tests completed for Python ${{ matrix.python-version }}\" >> $GITHUB_STEP_SUMMARY\n\n # Integration tests running in parallel\n integration-agents:\n name: Integration - agents\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - agents\n run: |\n set +e\n output=$(uv run python tests_integration/agents/run_agents.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - agents\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - agents\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-embedding-assistant:\n name: Integration - embedding_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - embedding_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/embedding_assistant/run_embedding_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - embedding_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - embedding_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-function-assistant:\n name: Integration - function_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - function_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/function_assistant/run_function_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - function_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - function_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-function-call-assistant:\n name: Integration - function_call_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - function_call_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/function_call_assistant/run_function_call_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - function_call_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - function_call_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-hith-assistant:\n name: Integration - hith_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - hith_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/hith_assistant/run_hith_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - hith_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - hith_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-input-output-topics:\n name: Integration - input_output_topics\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - input_output_topics\n run: |\n set +e\n output=$(uv run python tests_integration/input_output_topics/run_input_output_topics.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - input_output_topics\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - input_output_topics\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-invoke-kwargs:\n name: Integration - invoke_kwargs\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - invoke_kwargs\n run: |\n set +e\n output=$(uv run python tests_integration/invoke_kwargs/run_invoke_kwargs.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - invoke_kwargs\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - invoke_kwargs\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-multimodal-assistant:\n name: Integration - multimodal_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - multimodal_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/multimodal_assistant/run_multimodal_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - multimodal_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - multimodal_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-rag-assistant:\n name: Integration - rag_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - rag_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/rag_assistant/run_rag_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - rag_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - rag_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-react-assistant:\n name: Integration - react_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - react_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/react_assistant/run_react_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - react_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - react_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-simple-llm-assistant:\n name: Integration - simple_llm_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - simple_llm_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/simple_llm_assistant/run_simple_llm_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - simple_llm_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - simple_llm_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-simple-stream-assistant:\n name: Integration - simple_stream_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - simple_stream_assistant\n run: |\n set +e\n output=$(uv run python tests_integration/simple_stream_assistant/run_simple_stream_assistant.py)\n status=$?\n set -e\n echo \"$output\"\n if [ \"$status\" -ne 0 ] || echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - simple_stream_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - simple_stream_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n timeout-minutes: 5\n if: github.ref == 'refs/heads/main'\n needs:\n - code-quality\n - unit-tests\n - integration-agents\n - integration-embedding-assistant\n - integration-function-assistant\n - integration-function-call-assistant\n - integration-hith-assistant\n - integration-input-output-topics\n - integration-invoke-kwargs\n - integration-multimodal-assistant\n - integration-rag-assistant\n - integration-react-assistant\n - integration-simple-llm-assistant\n - integration-simple-stream-assistant\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Check PyPI Version\n id: remote-version\n run: |\n LATEST_VERSION=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n echo \"LATEST_VERSION=${LATEST_VERSION}\" >> $GITHUB_OUTPUT\n\n - name: Version Check Summary\n run: |\n echo \"### Version Information\" >> $GITHUB_STEP_SUMMARY\n echo \"- Package Version: ${{ steps.package-version.outputs.VERSION }}\" >> $GITHUB_STEP_SUMMARY\n echo \"- PyPI Version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\" >> $GITHUB_STEP_SUMMARY\n if [ \"${{ steps.package-version.outputs.VERSION }}\" != \"${{ steps.remote-version.outputs.LATEST_VERSION }}\" ]; then\n echo \"- Status: 🚀 New version will be published\" >> $GITHUB_STEP_SUMMARY\n else\n echo \"- Status: ✅ Versions match, no publish needed\" >> $GITHUB_STEP_SUMMARY\n fi\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n timeout-minutes: 10\n needs: version\n if: github.ref == 'refs/heads/main' && needs.version.outputs.package-version != needs.version.outputs.remote-version\n\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Build project\n run: uv build\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n - name: Publish Summary\n run: |\n echo \"### PyPI Publication\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Published version ${{ needs.version.outputs.package-version }} to PyPI\" >> $GITHUB_STEP_SUMMARY\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n timeout-minutes: 5\n needs:\n - publish_pypi\n - version\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n\n - name: Release Summary\n run: |\n echo \"### GitHub Release\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Created release for version ${{ needs.version.outputs.package-version }}\" >> $GITHUB_STEP_SUMMARY\n"}, "e6e729b3c0af419b7f77d1c2cc367163b344a2e4": {"t": 1785769828.726885, "n": 25034, "h": "c9b8a31d28030a9b", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - tests_integration/**\n - uv.lock\n - pyproject.toml\n - .github/workflows/ci.yaml\n\nconcurrency:\n group: ci-${{ github.ref }}\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\n\njobs:\n code-quality:\n name: Code Quality Checks\n runs-on: ubuntu-latest\n timeout-minutes: 10\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run ruff linting\n run: uv run pre-commit run --all-files\n\n unit-tests:\n name: Unit Tests (Python ${{ matrix.python-version }})\n runs-on: ubuntu-latest\n timeout-minutes: 15\n strategy:\n fail-fast: false\n matrix:\n python-version: [\"3.11\", \"3.12\", \"3.13\"]\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ matrix.python-version }}\n run: uv python install ${{ matrix.python-version }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run unit tests\n run: uv run pytest tests/ -v --tb=short\n\n - name: Generate test summary\n if: always()\n run: |\n echo \"### Unit Test Results (Python ${{ matrix.python-version }})\" >> $GITHUB_STEP_SUMMARY\n echo \"Tests completed for Python ${{ matrix.python-version }}\" >> $GITHUB_STEP_SUMMARY\n\n # Integration tests running in parallel\n integration-agents:\n name: Integration - agents\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - agents\n run: |\n set -e\n output=$(uv run python tests_integration/agents/run_agents.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - agents\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - agents\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-embedding-assistant:\n name: Integration - embedding_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - embedding_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/embedding_assistant/run_embedding_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - embedding_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - embedding_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-function-assistant:\n name: Integration - function_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - function_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/function_assistant/run_function_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - function_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - function_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-function-call-assistant:\n name: Integration - function_call_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - function_call_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/function_call_assistant/run_function_call_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - function_call_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - function_call_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-hith-assistant:\n name: Integration - hith_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - hith_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/hith_assistant/run_hith_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - hith_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - hith_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-input-output-topics:\n name: Integration - input_output_topics\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - input_output_topics\n run: |\n set -e\n output=$(uv run python tests_integration/input_output_topics/run_input_output_topics.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - input_output_topics\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - input_output_topics\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-invoke-kwargs:\n name: Integration - invoke_kwargs\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - invoke_kwargs\n run: |\n set -e\n output=$(uv run python tests_integration/invoke_kwargs/run_invoke_kwargs.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - invoke_kwargs\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - invoke_kwargs\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-multimodal-assistant:\n name: Integration - multimodal_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - multimodal_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/multimodal_assistant/run_multimodal_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - multimodal_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - multimodal_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-rag-assistant:\n name: Integration - rag_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - rag_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/rag_assistant/run_rag_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - rag_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - rag_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-react-assistant:\n name: Integration - react_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - react_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/react_assistant/run_react_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - react_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - react_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-simple-llm-assistant:\n name: Integration - simple_llm_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - simple_llm_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/simple_llm_assistant/run_simple_llm_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - simple_llm_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - simple_llm_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n integration-simple-stream-assistant:\n name: Integration - simple_stream_assistant\n runs-on: ubuntu-latest\n timeout-minutes: 15\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Tests - simple_stream_assistant\n run: |\n set -e\n output=$(uv run python tests_integration/simple_stream_assistant/run_simple_stream_assistant.py)\n echo \"$output\"\n if echo \"$output\" | grep -q \"Failed:\"; then\n echo \"### Integration Test Results - simple_stream_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Tests failed!\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results - simple_stream_assistant\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n timeout-minutes: 5\n if: github.ref == 'refs/heads/main'\n needs:\n - code-quality\n - unit-tests\n - integration-agents\n - integration-embedding-assistant\n - integration-function-assistant\n - integration-function-call-assistant\n - integration-hith-assistant\n - integration-input-output-topics\n - integration-invoke-kwargs\n - integration-multimodal-assistant\n - integration-rag-assistant\n - integration-react-assistant\n - integration-simple-llm-assistant\n - integration-simple-stream-assistant\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Check PyPI Version\n id: remote-version\n run: |\n LATEST_VERSION=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n echo \"LATEST_VERSION=${LATEST_VERSION}\" >> $GITHUB_OUTPUT\n\n - name: Version Check Summary\n run: |\n echo \"### Version Information\" >> $GITHUB_STEP_SUMMARY\n echo \"- Package Version: ${{ steps.package-version.outputs.VERSION }}\" >> $GITHUB_STEP_SUMMARY\n echo \"- PyPI Version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\" >> $GITHUB_STEP_SUMMARY\n if [ \"${{ steps.package-version.outputs.VERSION }}\" != \"${{ steps.remote-version.outputs.LATEST_VERSION }}\" ]; then\n echo \"- Status: 🚀 New version will be published\" >> $GITHUB_STEP_SUMMARY\n else\n echo \"- Status: ✅ Versions match, no publish needed\" >> $GITHUB_STEP_SUMMARY\n fi\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n timeout-minutes: 10\n needs: version\n if: github.ref == 'refs/heads/main' && needs.version.outputs.package-version != needs.version.outputs.remote-version\n\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Build project\n run: uv build\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n - name: Publish Summary\n run: |\n echo \"### PyPI Publication\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Published version ${{ needs.version.outputs.package-version }} to PyPI\" >> $GITHUB_STEP_SUMMARY\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n timeout-minutes: 5\n needs:\n - publish_pypi\n - version\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n\n - name: Release Summary\n run: |\n echo \"### GitHub Release\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Created release for version ${{ needs.version.outputs.package-version }}\" >> $GITHUB_STEP_SUMMARY\n"}, "392b8ccb4f94cdbdf10f00d643b773ff296e2206": {"t": 1785769830.3279943, "n": 7394, "h": "6bde7f009a1b46d5", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - tests_integration/**\n - uv.lock\n - pyproject.toml\n - .github/workflows/ci.yaml\n\nconcurrency:\n group: ci-${{ github.ref }}\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\n\njobs:\n code-quality:\n name: Code Quality Checks\n runs-on: ubuntu-latest\n timeout-minutes: 10\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run ruff linting\n run: uv run pre-commit run --all-files\n\n unit-tests:\n name: Unit Tests (Python ${{ matrix.python-version }})\n runs-on: ubuntu-latest\n timeout-minutes: 15\n strategy:\n fail-fast: false\n matrix:\n python-version: [\"3.11\", \"3.12\", \"3.13\"]\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ matrix.python-version }}\n run: uv python install ${{ matrix.python-version }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run unit tests\n run: uv run pytest tests/ -v --tb=short\n\n - name: Generate test summary\n if: always()\n run: |\n echo \"### Unit Test Results (Python ${{ matrix.python-version }})\" >> $GITHUB_STEP_SUMMARY\n echo \"Tests completed for Python ${{ matrix.python-version }}\" >> $GITHUB_STEP_SUMMARY\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n timeout-minutes: 30\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n cache-dependency-glob: \"uv.lock\"\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Install dependencies\n run: uv sync --dev\n\n - name: Run Integration Test ALL\n run: |\n set -e\n output=$(uv run python tests_integration/run_all.py)\n echo \"$output\"\n\n # Check if there are any failed tests\n if echo \"$output\" | grep -q \"Failed scripts:\"; then\n echo \"### Integration Test Results\" >> $GITHUB_STEP_SUMMARY\n echo \"❌ Integration tests failed! Check the output above for details.\" >> $GITHUB_STEP_SUMMARY\n exit 1\n else\n echo \"### Integration Test Results\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ All integration tests passed!\" >> $GITHUB_STEP_SUMMARY\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n timeout-minutes: 5\n if: github.ref == 'refs/heads/main'\n needs:\n - code-quality\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Check PyPI Version\n id: remote-version\n run: |\n LATEST_VERSION=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n echo \"LATEST_VERSION=${LATEST_VERSION}\" >> $GITHUB_OUTPUT\n\n - name: Version Check Summary\n run: |\n echo \"### Version Information\" >> $GITHUB_STEP_SUMMARY\n echo \"- Package Version: ${{ steps.package-version.outputs.VERSION }}\" >> $GITHUB_STEP_SUMMARY\n echo \"- PyPI Version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\" >> $GITHUB_STEP_SUMMARY\n if [ \"${{ steps.package-version.outputs.VERSION }}\" != \"${{ steps.remote-version.outputs.LATEST_VERSION }}\" ]; then\n echo \"- Status: 🚀 New version will be published\" >> $GITHUB_STEP_SUMMARY\n else\n echo \"- Status: ✅ Versions match, no publish needed\" >> $GITHUB_STEP_SUMMARY\n fi\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n timeout-minutes: 10\n needs: version\n if: github.ref == 'refs/heads/main' && needs.version.outputs.package-version != needs.version.outputs.remote-version\n\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n enable-cache: true\n\n - name: Set up Python ${{ env.PYTHON_VERSION }}\n run: uv python install ${{ env.PYTHON_VERSION }}\n\n - name: Build project\n run: uv build\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n - name: Publish Summary\n run: |\n echo \"### PyPI Publication\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Published version ${{ needs.version.outputs.package-version }} to PyPI\" >> $GITHUB_STEP_SUMMARY\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n timeout-minutes: 5\n needs:\n - publish_pypi\n - version\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n\n - name: Release Summary\n run: |\n echo \"### GitHub Release\" >> $GITHUB_STEP_SUMMARY\n echo \"✅ Created release for version ${{ needs.version.outputs.package-version }}\" >> $GITHUB_STEP_SUMMARY\n"}, "2be216252721dad990c1d4e00fc8b6d27fd389da": {"t": 1785769831.969807, "n": 7602, "h": "9749f40a47250507", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - uv.lock\n - pyproject.toml\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync --dev\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n uv run python -m pytest --version\n\n - name: Run Tests\n run: uv run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync --dev\n\n - name: Run Integration Test ALL\n run: |\n set -e\n output=$(uv run python tests_integration/run_all.py)\n echo \"$output\"\n\n # Check if there are any failed tests\n if echo \"$output\" | grep -q \"Failed scripts:\"; then\n echo \"❌ Integration tests failed! Check the output above for details.\"\n exit 1\n else\n echo \"✅ All integration tests passed!\"\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync\n\n - name: Build project\n run: uv build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "06029bb908af506a61d5858d277c2266262273a3": {"t": 1785769833.5838442, "n": 7610, "h": "a003ae14896bb62e", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - uv.lock\n - pyproject.toml\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync --dev\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n uv run python -m pytest --version\n\n - name: Run Tests\n run: uv run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync --dev\n\n - name: Run Integration Test ALL\n run: |\n set -e\n output=$(uv run python tests_integration/run_all.py)\n echo \"$output\"\n \n # Check if there are any failed tests\n if echo \"$output\" | grep -q \"Failed scripts:\"; then\n echo \"❌ Integration tests failed! Check the output above for details.\"\n exit 1\n else\n echo \"✅ All integration tests passed!\"\n fi\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync\n\n - name: Build project\n run: uv build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "1f684de471c2222f5aa7aec437328e9b1bcb1452": {"t": 1785769834.9790237, "n": 7276, "h": "8a5515b170b591c7", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - grafi/**\n - tests/**\n - uv.lock\n - pyproject.toml\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync --dev\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n uv run python -m pytest --version\n\n - name: Run Tests\n run: uv run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync --dev\n\n - name: Run Integration Test ALL\n run: |\n uv run python tests_integration/run_all.py\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python and uv\n uses: astral-sh/setup-uv@v4\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(uv run python -c \"import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])\")\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-uv-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ env.PYTHON_VERSION }}-${{ hashFiles('**/uv.lock') }}\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-uv-dependencies.outputs.cache-hit != 'true'\n run: uv sync\n\n - name: Build project\n run: uv build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "1736ac48b42b46ece72bebb86b4bee2fcf47d47a": {"t": 1785769837.4318416, "n": 7899, "h": "0ffce2b671ac879c", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - garfi/**\n - tests/**\n - poetry.lock\n - poetry.toml\n - pyproject.toml\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Run Integration Test ALL\n run: |\n poetry run python tests_integration/run_all.py\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(poetry version --short)\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "fe4bcd431130bb6ce1fadbd1e1733b256212d6d3": {"t": 1785769838.619726, "n": 7890, "h": "7ed557655eb9075a", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n paths:\n - garfi/**\n - tests/**\n - poetry.lock\n - poetry.toml\n - pyproject.toml\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(poetry version --short)\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "12a669923326529e1617e3a50087d0822da80f09": {"t": 1785769840.3552947, "n": 7783, "h": "e97e4b2a656b4a47", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n env:\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\n TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }}\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(poetry version --short)\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "6197571cbe7d68185fefee946d5976a8fa24464e": {"t": 1785769841.5712173, "n": 8130, "h": "17231f2c90472728", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n env:\n OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}\n ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n \n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(poetry version --short)\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "565852e94f87fdb7bb6d9b07d9962b2deaffbab3": {"t": 1785769844.1985137, "n": 7885, "h": "103bafcc492f6950", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n \n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(poetry version --short)\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "2f50d3707b3ed1fd3a224b93082bf7c0301f2369": {"t": 1785769846.469167, "n": 7880, "h": "2a7f91ab3f14ac83", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Check if new version is different than PyPi remote\n id: check-version\n run: |\n remote_latest_version=$(curl -s https://pypi.org/pypi/grafi/json | jq -r .info.version)\n current_version=$(poetry version --short)\n if [ \"$remote_latest_version\" == \"$current_version\" ]; then\n echo \"No new version to publish.\"\n exit 0\n else\n echo \"New version available: $current_version\"\n fi\n\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "8102af127afb642412f3fa2b817cb886c547261c": {"t": 1785769848.3602734, "n": 7400, "h": "cfcdba14068c9dde", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n\n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs:\n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n\n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n\n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs:\n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "2688ba4aff9f0f79ee395767ea1cf4cf1f1e0984": {"t": 1785769849.555749, "n": 7432, "h": "18c74136da11acdb", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --without dev --no-interaction --no-root --sync\n \n - name: Install project\n run: |\n poetry install --without dev --no-interaction --sync\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main' \n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "5c63e906a43d4adb46d42e8da06a5510bccea631": {"t": 1785769851.014114, "n": 7389, "h": "99ce637a525b2325", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: write\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main' \n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "ddba662dd67c73e72f8195b9afc5d361b3d278f5": {"t": 1785769852.3585057, "n": 7388, "h": "1d8a569dbe5eb085", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: true\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main' \n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "1c4d99643a0836103da25408398533c5a4eb45f6": {"t": 1785769853.6570246, "n": 7389, "h": "4b39db8f3a55cc3c", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n remote-version: ${{ steps.remote-version.outputs.LATEST_VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n - name: Remote Check PyPI Version\n id: remote-version\n run: |\n echo \"LATEST_VERSION=$(pip index versions grafi 2>/dev/null | grep 'LATEST:' | awk '{print $2}')\" >> $GITHUB_OUTPUT\n\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main' && ( needs.version.outputs.package-version != needs.version.outputs.remote-version )\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main' \n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n skipIfReleaseExists: true\n"}, "c38ad31316d87661955e2800031fd71b30411408": {"t": 1785769854.8422022, "n": 6759, "h": "57927ecaac4d8266", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main'\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n - integration-tests\n\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ needs.version.outputs.package-version }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ needs.version.outputs.package-version }}\n"}, "bc97565f88fac0f4ba402be412dcc564e56202e0": {"t": 1785769856.2698512, "n": 6969, "h": "493835d0b26e34f2", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main'\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n - integration-tests\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Get Next Version\n id: semver\n uses: ietf-tools/semver-action@v1\n with:\n token: ${{ github.token }}\n branch: main\n fallbackTag: \"0.0.1\"\n noVersionBumpBehavior: patch\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ steps.semver.outputs.next }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ steps.semver.outputs.bump}}\n"}, "83abf3e1f121611e1ab74c8b635cd4b7a9797b0b": {"t": 1785769858.7291644, "n": 6903, "h": "c777281074fb1853", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main'\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Github Release\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Get Next Version\n id: semver\n uses: ietf-tools/semver-action@v1\n with:\n token: ${{ github.token }}\n branch: main\n fallbackTag: \"0.0.1\"\n noVersionBumpBehavior: patch\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ steps.semver.outputs.next }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ steps.semver.outputs.bump}}\n"}, "bad68ab32f20f88328f8a5b7502c493a8eb546ec": {"t": 1785769860.4884, "n": 6909, "h": "013d01f1257f4b3b", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main'\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Tag Version (SemVer)\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-actions[bot]\"\n git config --global user.email \"github-actions@github.com\"\n\n - name: Get Next Version\n id: semver\n uses: ietf-tools/semver-action@v1\n with:\n token: ${{ github.token }}\n branch: main\n fallbackTag: \"0.0.1\"\n noVersionBumpBehavior: patch\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ steps.semver.outputs.next }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ steps.semver.outputs.bump}}\n"}, "37a38ec01a7fad9c5de576d8b6514dc21da21cc0": {"t": 1785769862.199129, "n": 6878, "h": "1da7b5c8385fa300", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main'\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\n github_release:\n name: Tag Version (SemVer)\n runs-on: ubuntu-latest\n needs: \n - publish_pypi\n - version\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-a\n git config --global user.email \"github-\n\n - name: Get Next Version\n id: semver\n uses: ietf-tools/semver-action@v1\n with:\n token: ${{ github.token }}\n branch: main\n fallbackTag: \"0.0.1\"\n noVersionBumpBehavior: patch\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ steps.semver.outputs.next }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ steps.semver.outputs.bump}}\n"}, "90ef9f009dfc001537c33f2bad04f32b8134dc86": {"t": 1785769867.4538224, "n": 6788, "h": "1cfa46772b204024", "c": "name: Python CI/CD\n\non:\n push:\n branches:\n - \"**\"\n tags:\n - \"v*.*.*\"\n\n\nconcurrency:\n group: graphite-ci-pipeline\n cancel-in-progress: false\n\npermissions:\n contents: read\n id-token: write\n\nenv:\n PYTHON_VERSION: \"3.12\"\njobs:\n \n unit-tests:\n name: Run Unit Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n # ----------------------------------------------\n # load cached venv if cache exists\n # ----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n \n # - name: Install project\n # run: poetry install --no-interaction\n\n - name: Check Python and Pytest\n run: |\n python --version\n which python\n poetry env info\n poetry run python -m pytest --version\n\n - name: Run Tests\n run: poetry run pytest tests/\n\n integration-tests:\n name: Run Integration Tests\n runs-on: ubuntu-latest\n\n steps:\n - name: Check out the code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: abatilo/actions-poetry@v2\n\n - name: Configure AWS credentials\n uses: aws-actions/configure-aws-credentials@v4\n with:\n role-to-assume: \"arn:aws:iam::328524571810:role/gha_graphite_ci_ops\"\n aws-region: \"us-east-1\"\n\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction #--no-root\n\n - name: Get Secrets = OPEN API KEY\n id: secrets\n uses: aws-actions/aws-secretsmanager-get-secrets@v2\n with:\n secret-ids: |\n OPENAI_API_KEY, openai-api-key\n TAVILY_API_KEY, tavily-api-key\n\n - name: Run Integration Test ALL\n run: |\n poetry run python examples/run_all.py\n\n\n version:\n name: Get Package Version\n runs-on: ubuntu-latest\n if: github.ref == 'refs/heads/main'\n needs: \n - unit-tests\n - integration-tests\n\n outputs:\n package-version: ${{ steps.package-version.outputs.VERSION }}\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history for tagging\n\n - name: Get Package Version\n id: package-version\n run: |\n echo \"VERSION=$(poetry version --short)\" >> $GITHUB_OUTPUT\n \n\n \n\n publish_pypi:\n name: Publish to PyPI\n runs-on: ubuntu-latest\n needs: version\n if: github.ref == 'refs/heads/main'\n\n\n # Specifying a GitHub environment is optional, but strongly encouraged\n environment: production\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Set up Python\n id: setup-python\n uses: actions/setup-python@v5\n with:\n python-version: ${{ env.PYTHON_VERSION }}\n\n - name: Install Poetry\n uses: snok/install-poetry@v1\n\n #----------------------------------------------\n # load cached venv if cache exists\n #----------------------------------------------\n - name: Load cached venv\n id: cached-poetry-dependencies\n uses: actions/cache@v4\n with:\n path: .venv\n key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }}\n \n\n #----------------------------------------------\n # install dependencies if cache does not exist\n #----------------------------------------------\n - name: Install dependencies\n if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'\n run: poetry install --no-interaction --no-root\n \n - name: Install project\n run: |\n poetry install --no-interaction\n poetry build\n\n - name: mint API token\n id: mint-token\n run: |\n # retrieve the ambient OIDC token\n resp=$(curl -H \"Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN\" \\\n \"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi\")\n oidc_token=$(jq -r '.value' <<< \"${resp}\")\n\n # exchange the OIDC token for an API token\n resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d \"{\\\"token\\\": \\\"${oidc_token}\\\"}\")\n api_token=$(jq -r '.token' <<< \"${resp}\")\n\n # mask the newly minted API token, so that we don't accidentally leak it\n echo \"::add-mask::${api_token}\"\n\n # see the next step in the workflow for an example of using this step output\n echo \"api-token=${api_token}\" >> \"${GITHUB_OUTPUT}\"\n \n\n - name: Publish package distributions to PyPI\n uses: pypa/gh-action-pypi-publish@release/v1\n\ngithub_release:\n name: Tag Version (SemVer)\n runs-on: ubuntu-latest\n needs: test\n if: github.ref == 'refs/heads/main'\n\n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n with:\n fetch-depth: 0 # Ensure full history f\n\n - name: Set up Git user\n run: |\n git config --global user.name \"github-a\n git config --global user.email \"github-\n\n - name: Get Next Version\n id: semver\n uses: ietf-tools/semver-action@v1\n with:\n token: ${{ github.token }}\n branch: main\n fallbackTag: \"0.0.1\"\n noVersionBumpBehavior: patch\n\n - name: Create Release\n uses: ncipollo/release-action@v1.12.0\n with:\n allowUpdates: true\n draft: false\n makeLatest: true\n name: ${{ steps.semver.outputs.next }}\n body: Changelog Contents\n token: ${{ github.token }}\n tag: ${{ steps.semver.outputs.bump}}\n"}}, "tests_integration/function_call_assistant/simple_deepseek_function_call_assistant_example.py": {"fc53b22de3e798e9ca28918456ae81bc01a3a874": {"t": 1786068248.8224614, "n": 2805, "h": "5c99b0ab7e7f7e59", "c": "import asyncio\nimport os\nimport uuid\n\nfrom grafi.common.decorators.llm_function import llm_function\nfrom grafi.common.events.topic_events.publish_to_topic_event import PublishToTopicEvent\nfrom grafi.common.models.invoke_context import InvokeContext\nfrom grafi.common.models.message import Message\nfrom grafi.runtime import GrafiRuntime\nfrom grafi.runtime.execution_services import bind_services\nfrom grafi.tools.function_calls.function_call_tool import FunctionCallTool\nfrom tests_integration.function_call_assistant.simple_deepseek_function_call_assistant import (\n SimpleDeepseekFunctionCallAssistant,\n)\n\nruntime = GrafiRuntime()\nevent_store = runtime.services.event_store\n\napi_key = os.getenv(\"DEEPSEEK_API_KEY\", \"\")\n\n\nclass WeatherMock(FunctionCallTool):\n @llm_function\n def get_weather_mock(self, postcode: str) -> str:\n \"\"\"\n Function to get weather information for a given postcode.\n\n Args:\n postcode (str): The postcode for which to retrieve weather information.\n\n Returns:\n str: A string containing a weather report for the given postcode.\n \"\"\"\n return f\"The weather of {postcode} is bad now.\"\n\n\ndef get_invoke_context() -> InvokeContext:\n return InvokeContext(\n conversation_id=\"conversation_id\",\n invoke_id=uuid.uuid4().hex,\n assistant_request_id=uuid.uuid4().hex,\n )\n\n\nasync def test_simple_function_call_assistant() -> None:\n invoke_context = get_invoke_context()\n\n assistant = (\n SimpleDeepseekFunctionCallAssistant.builder()\n .name(\"SimpleDeepseekFunctionCallAssistant\")\n .api_key(api_key)\n .function_tool(WeatherMock(name=\"WeatherMock\"))\n .build()\n )\n\n # Test the run method\n input_data = [Message(role=\"user\", content=\"Hello, how's the weather in 12345?\")]\n\n outputs = []\n async for output in assistant.invoke(\n PublishToTopicEvent(\n invoke_context=invoke_context,\n data=input_data,\n ),\n is_sequential=True,\n ):\n outputs.append(output)\n\n assert outputs[0] is not None\n print(outputs)\n print(outputs[-1].data[0].content)\n assert \"12345\" in str(outputs[-1].data[0].content)\n assert \"bad\" in str(outputs[-1].data[0].content)\n\n print(len(await event_store.get_events()))\n assert len(await event_store.get_events()) >= 24\n\n # Test restore from finished requests\n\n input_data = [Message(role=\"user\", content=\"Hello, how's the weather in 12345?\")]\n async for output in assistant.invoke(\n PublishToTopicEvent(\n invoke_context=invoke_context,\n data=input_data,\n ),\n is_sequential=True,\n ):\n assert output == []\n\n\nwith bind_services(runtime.services):\n asyncio.run(test_simple_function_call_assistant())\n"}}}} |