Commit
·
8349858
1
Parent(s):
916328a
"Modified Dockerfile for HF Deployement, Made changes to main graph and intermediate graph states"
Browse files- .gitignore +10 -3
- Dockerfile +23 -32
- README.md +10 -0
- docker-compose.yml +7 -3
- langgraph.json +4 -6
- src/job_writing_agent/__init__.py +36 -139
- src/job_writing_agent/agents/nodes.py +39 -48
- src/job_writing_agent/classes/__init__.py +16 -2
- src/job_writing_agent/nodes/research_workflow.py +1 -1
- src/job_writing_agent/tools/SearchTool.py +1 -1
- src/job_writing_agent/workflow.py +73 -23
- uv.lock +151 -127
.gitignore
CHANGED
|
@@ -35,7 +35,14 @@ __pycache__/
|
|
| 35 |
*.py[cod]
|
| 36 |
*.pyc
|
| 37 |
|
| 38 |
-
|
| 39 |
-
|
| 40 |
src/job_writing_agent.egg-info/*
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
*.py[cod]
|
| 36 |
*.pyc
|
| 37 |
|
| 38 |
+
.vscode/*
|
| 39 |
+
.cursor/*
|
| 40 |
src/job_writing_agent.egg-info/*
|
| 41 |
+
pyrightconfig.json
|
| 42 |
+
app_env/*
|
| 43 |
+
requirements.txt
|
| 44 |
+
.langgraph_api/*
|
| 45 |
+
.src/job_writing_agent/logs/*
|
| 46 |
+
docker-compose.override.example.yml
|
| 47 |
+
DOCKERFILE_EXPLANATION.md
|
| 48 |
+
DEPLOYMENT_GUIDE.md
|
Dockerfile
CHANGED
|
@@ -1,41 +1,32 @@
|
|
|
|
|
| 1 |
FROM langchain/langgraph-api:3.12
|
| 2 |
|
|
|
|
|
|
|
|
|
|
| 3 |
|
|
|
|
| 4 |
|
|
|
|
|
|
|
| 5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
-
|
| 10 |
-
ADD . /deps/job_writer
|
| 11 |
-
# -- End of local package . --
|
| 12 |
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
# -- Installing all local dependencies --
|
| 16 |
-
|
| 17 |
-
RUN for dep in /deps/*; do echo "Installing $dep"; if [ -d "$dep" ]; then echo "Installing $dep"; (cd "$dep" && PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e .); fi; done
|
| 18 |
-
|
| 19 |
-
# -- End of local dependencies install --
|
| 20 |
-
|
| 21 |
-
ENV LANGSERVE_GRAPHS='{"job_app_graph": "/deps/job_writer/src/job_writing_agent/workflow.py:job_app_graph", "research_workflow": "/deps/job_writer/src/job_writing_agent/nodes/research_workflow.py:research_workflow", "data_loading_workflow": "/deps/job_writer/src/job_writing_agent/nodes/initializing.py:data_loading_workflow"}'
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
# -- Ensure user deps didn't inadvertently overwrite langgraph-api
|
| 30 |
-
RUN mkdir -p /api/langgraph_api /api/langgraph_runtime /api/langgraph_license && touch /api/langgraph_api/__init__.py /api/langgraph_runtime/__init__.py /api/langgraph_license/__init__.py
|
| 31 |
-
RUN PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir --no-deps -e /api
|
| 32 |
-
# -- End of ensuring user deps didn't inadvertently overwrite langgraph-api --
|
| 33 |
-
# -- Removing build deps from the final image ~<:===~~~ --
|
| 34 |
-
RUN pip uninstall -y pip setuptools wheel
|
| 35 |
-
RUN rm -rf /usr/local/lib/python*/site-packages/pip* /usr/local/lib/python*/site-packages/setuptools* /usr/local/lib/python*/site-packages/wheel* && find /usr/local/bin -name "pip*" -delete || true
|
| 36 |
-
RUN rm -rf /usr/lib/python*/site-packages/pip* /usr/lib/python*/site-packages/setuptools* /usr/lib/python*/site-packages/wheel* && find /usr/bin -name "pip*" -delete || true
|
| 37 |
-
RUN uv pip uninstall --system pip setuptools wheel && rm /usr/bin/uv /usr/bin/uvx
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
WORKDIR /deps/job_writer
|
|
|
|
| 1 |
+
# syntax=docker/dockerfile:1.4
|
| 2 |
FROM langchain/langgraph-api:3.12
|
| 3 |
|
| 4 |
+
# HuggingFace Spaces requires port 7860
|
| 5 |
+
ENV PORT=7860
|
| 6 |
+
ENV LANGGRAPH_PORT=7860
|
| 7 |
|
| 8 |
+
ENV LANGSERVE_GRAPHS='{"job_app_graph": "/deps/job_writer/src/job_writing_agent/workflow.py:job_app_graph", "research_workflow": "/deps/job_writer/src/job_writing_agent/nodes/research_workflow.py:research_workflow", "data_loading_workflow": "/deps/job_writer/src/job_writing_agent/nodes/data_loading_workflow.py:data_loading_workflow"}'
|
| 9 |
|
| 10 |
+
COPY pyproject.toml langgraph.json /deps/job_writer/
|
| 11 |
+
COPY src/ /deps/job_writer/src/
|
| 12 |
|
| 13 |
+
RUN for dep in /deps/*; do \
|
| 14 |
+
if [ -d "$dep" ]; then \
|
| 15 |
+
echo "Installing $dep"; \
|
| 16 |
+
(cd "$dep" && PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir -c /api/constraints.txt -e .); \
|
| 17 |
+
fi; \
|
| 18 |
+
done
|
| 19 |
|
| 20 |
+
# Use cache mount for Playwright - browsers persist between builds!
|
| 21 |
+
RUN --mount=type=cache,target=/root/.cache/ms-playwright \
|
| 22 |
+
playwright install chromium && \
|
| 23 |
+
playwright install-deps
|
| 24 |
|
| 25 |
+
RUN mkdir -p /api/langgraph_api /api/langgraph_runtime /api/langgraph_license && \
|
| 26 |
+
touch /api/langgraph_api/__init__.py /api/langgraph_runtime/__init__.py /api/langgraph_license/__init__.py && \
|
| 27 |
+
PYTHONDONTWRITEBYTECODE=1 uv pip install --system --no-cache-dir --no-deps -e /api
|
| 28 |
|
| 29 |
+
WORKDIR /deps/job_writer
|
|
|
|
|
|
|
| 30 |
|
| 31 |
+
# Expose port for HuggingFace Spaces
|
| 32 |
+
EXPOSE 7860
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
# Job Writer Module
|
| 2 |
|
| 3 |
A modular, well-structured package for creating tailored job applications using LangChain and LangGraph with LangSmith observability.
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Job Application Writer
|
| 3 |
+
emoji: 📝
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
+
pinned: false
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
# Job Writer Module
|
| 12 |
|
| 13 |
A modular, well-structured package for creating tailored job applications using LangChain and LangGraph with LangSmith observability.
|
docker-compose.yml
CHANGED
|
@@ -39,10 +39,14 @@ services:
|
|
| 39 |
image: job-app-workflow:latest
|
| 40 |
container_name: job-app-agent
|
| 41 |
ports:
|
| 42 |
-
- "
|
| 43 |
environment:
|
| 44 |
-
-
|
| 45 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
depends_on:
|
| 47 |
redis:
|
| 48 |
condition: service_healthy
|
|
|
|
| 39 |
image: job-app-workflow:latest
|
| 40 |
container_name: job-app-agent
|
| 41 |
ports:
|
| 42 |
+
- "7860:7860"
|
| 43 |
environment:
|
| 44 |
+
- PORT=7860
|
| 45 |
+
- LANGGRAPH_PORT=7860
|
| 46 |
+
- REDIS_URI=redis://redis:6379
|
| 47 |
+
- DATABASE_URI=postgresql://postgres:postgres@postgres:5432/postgres
|
| 48 |
+
env_file:
|
| 49 |
+
- .docker_env
|
| 50 |
depends_on:
|
| 51 |
redis:
|
| 52 |
condition: service_healthy
|
langgraph.json
CHANGED
|
@@ -1,11 +1,9 @@
|
|
| 1 |
{
|
| 2 |
-
"dependencies": [
|
| 3 |
-
"."
|
| 4 |
-
],
|
| 5 |
"graphs": {
|
| 6 |
-
"job_app_graph": "
|
| 7 |
-
"research_workflow": "
|
| 8 |
-
"data_loading_workflow": "
|
| 9 |
},
|
| 10 |
"env": "./app_env",
|
| 11 |
"python_version": "3.12"
|
|
|
|
| 1 |
{
|
| 2 |
+
"dependencies": ["."],
|
|
|
|
|
|
|
| 3 |
"graphs": {
|
| 4 |
+
"job_app_graph": "src/job_writing_agent/workflow.py:job_app_graph",
|
| 5 |
+
"research_workflow": "src/job_writing_agent/nodes/research_workflow.py:research_workflow",
|
| 6 |
+
"data_loading_workflow": "src/job_writing_agent/nodes/data_loading_workflow.py:data_loading_workflow"
|
| 7 |
},
|
| 8 |
"env": "./app_env",
|
| 9 |
"python_version": "3.12"
|
src/job_writing_agent/__init__.py
CHANGED
|
@@ -8,7 +8,7 @@ using LangChain and LangGraph with LangSmith observability.
|
|
| 8 |
__version__ = "0.1.0"
|
| 9 |
|
| 10 |
import os
|
| 11 |
-
|
| 12 |
import logging
|
| 13 |
from pathlib import Path
|
| 14 |
from dotenv import load_dotenv
|
|
@@ -28,148 +28,20 @@ logger.info(
|
|
| 28 |
env_path = Path(__file__).parent / ".env"
|
| 29 |
|
| 30 |
|
| 31 |
-
def
|
| 32 |
-
if
|
| 33 |
-
|
| 34 |
-
logger.info(f"{var} set to {os.environ[var]}")
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
if env_path.exists():
|
| 38 |
-
logger.info("Loading environment variables from %s", env_path)
|
| 39 |
-
load_dotenv(dotenv_path=env_path, override=True)
|
| 40 |
-
else:
|
| 41 |
-
logger.warning(
|
| 42 |
-
".env file not found at %s. Using system environment variables.", env_path
|
| 43 |
-
)
|
| 44 |
-
|
| 45 |
-
# Check for critical environment variables
|
| 46 |
-
if not os.getenv("TAVILY_API_KEY"):
|
| 47 |
-
logger.warning(
|
| 48 |
-
"TAVILY_API_KEY environment variable is not set."
|
| 49 |
-
" Failed to get TAVILY_API_KEY at Path %s",
|
| 50 |
-
env_path,
|
| 51 |
-
)
|
| 52 |
-
_set_env("TAVILY_API_KEY")
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
if not os.getenv("GEMINI_API_KEY"):
|
| 56 |
-
logger.warning(
|
| 57 |
-
"GEMINI_API_KEY environment variable is not set. "
|
| 58 |
-
"Failed to get GEMINI_API_KEY at Path %s",
|
| 59 |
-
env_path,
|
| 60 |
-
)
|
| 61 |
-
_set_env("GEMINI_API_KEY")
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
if not os.getenv("PINECONE_API_KEY"):
|
| 65 |
-
logger.warning(
|
| 66 |
-
"PINECONE_API_KEY environment variable is not set."
|
| 67 |
-
" Failed to get PINECONE_API_KEY at Path %s",
|
| 68 |
-
env_path,
|
| 69 |
-
)
|
| 70 |
-
_set_env("PINECONE_API_KEY")
|
| 71 |
-
|
| 72 |
-
if not os.getenv("LANGFUSE_PUBLIC_KEY"):
|
| 73 |
-
logger.warning(
|
| 74 |
-
"LANGFUSE_PUBLIC_KEY environment variable is not set."
|
| 75 |
-
" Failed to get LANGFUSE_PUBLIC_KEY at Path %s",
|
| 76 |
-
env_path,
|
| 77 |
-
)
|
| 78 |
-
_set_env("LANGFUSE_PUBLIC_KEY")
|
| 79 |
-
|
| 80 |
-
if not os.getenv("LANGFUSE_SECRET_KEY"):
|
| 81 |
-
logger.warning(
|
| 82 |
-
"LANGFUSE_SECRET_KEY environment variable is not set."
|
| 83 |
-
" Failed to get LANGFUSE_SECRET_KEY at Path %s",
|
| 84 |
-
env_path,
|
| 85 |
-
)
|
| 86 |
-
_set_env("LANGFUSE_SECRET_KEY")
|
| 87 |
-
|
| 88 |
-
if not os.getenv("LANGSMITH_API_KEY"):
|
| 89 |
-
logger.warning(
|
| 90 |
-
"LANGSMITH_API_KEY environment variable is not set."
|
| 91 |
-
" Failed to get LANGSMITH_API_KEY at Path %s",
|
| 92 |
-
env_path,
|
| 93 |
-
)
|
| 94 |
-
_set_env("LANGSMITH_API_KEY")
|
| 95 |
-
|
| 96 |
-
if not os.getenv("OPENROUTER_API_KEY"):
|
| 97 |
-
logger.warning(
|
| 98 |
-
"OPENROUTER_API_KEY environment variable is not set."
|
| 99 |
-
" Failed to get OPENROUTER_API_KEY at Path %s",
|
| 100 |
-
env_path,
|
| 101 |
-
)
|
| 102 |
-
_set_env("OPENROUTER_API_KEY")
|
| 103 |
-
|
| 104 |
-
if not os.getenv("LANGSMITH_PROJECT"):
|
| 105 |
-
logger.warning(
|
| 106 |
-
"LANGSMITH_PROJECT environment variable is not set."
|
| 107 |
-
" Failed to get LANGSMITH_PROJECT at Path %s",
|
| 108 |
-
env_path,
|
| 109 |
-
)
|
| 110 |
-
_set_env("LANGSMITH_PROJECT")
|
| 111 |
-
|
| 112 |
-
if not os.getenv("LANGSMITH_ENDPOINT"):
|
| 113 |
-
logger.warning(
|
| 114 |
-
"LANGSMITH_ENDPOINT environment variable is not set."
|
| 115 |
-
" Failed to get LANGSMITH_ENDPOINT at Path %s",
|
| 116 |
-
env_path,
|
| 117 |
-
)
|
| 118 |
-
_set_env("LANGSMITH_ENDPOINT")
|
| 119 |
-
|
| 120 |
-
if not os.getenv("CEREBRAS_API_KEY"):
|
| 121 |
-
logger.warning(
|
| 122 |
-
"CEREBRAS_API_KEY environment variable is not set."
|
| 123 |
-
" Failed to get CEREBRAS_API_KEY at Path %s",
|
| 124 |
-
env_path,
|
| 125 |
-
)
|
| 126 |
-
_set_env("CEREBRAS_API_KEY")
|
| 127 |
-
|
| 128 |
-
os.environ["LANGSMITH_TRACING"] = "true"
|
| 129 |
-
|
| 130 |
-
__all__: list[str] = ["job_app_graph", "workflows/research_workflow"]
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
"""
|
| 134 |
-
Job Application Writer Package
|
| 135 |
-
|
| 136 |
-
A modular, well-structured package for creating tailored job applications
|
| 137 |
-
using LangChain and LangGraph with LangSmith observability.
|
| 138 |
-
"""
|
| 139 |
-
|
| 140 |
-
__version__ = "0.1.0"
|
| 141 |
-
|
| 142 |
-
import os
|
| 143 |
-
import getpass
|
| 144 |
-
import logging
|
| 145 |
-
from pathlib import Path
|
| 146 |
-
from dotenv import load_dotenv
|
| 147 |
-
|
| 148 |
-
logger = logging.getLogger(__name__)
|
| 149 |
-
logger.setLevel(logging.INFO)
|
| 150 |
-
log_dir = Path(__file__).parent / "logs"
|
| 151 |
-
log_dir.mkdir(exist_ok=True)
|
| 152 |
-
logger.addHandler(logging.FileHandler(log_dir / "job_writer.log", mode="a"))
|
| 153 |
-
logger.info(
|
| 154 |
-
"Logger initialized. Writing to %s", Path(__file__).parent / "job_writer.log"
|
| 155 |
-
)
|
| 156 |
-
|
| 157 |
-
env_path = Path(__file__).parent / ".env"
|
| 158 |
|
| 159 |
|
| 160 |
def _set_env(var: str):
|
|
|
|
| 161 |
if not os.environ.get(var):
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
if not os.getenv(key):
|
| 169 |
-
logger.warning(
|
| 170 |
-
f"{key} environment variable is not set. Failed to get {key} at Path {env_path}"
|
| 171 |
-
)
|
| 172 |
-
_set_env(key)
|
| 173 |
|
| 174 |
|
| 175 |
if env_path.exists():
|
|
@@ -181,14 +53,39 @@ else:
|
|
| 181 |
)
|
| 182 |
|
| 183 |
|
|
|
|
| 184 |
environment_key_array = [
|
| 185 |
"TAVILY_API_KEY",
|
| 186 |
"GEMINI_API_KEY",
|
| 187 |
"PINECONE_API_KEY",
|
| 188 |
"LANGFUSE_PUBLIC_KEY",
|
| 189 |
"LANGFUSE_SECRET_KEY",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
# Check for critical environment variables
|
| 192 |
load_environment_variables(environment_key_array)
|
| 193 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
__all__ = ["job_app_graph", "workflows/research_workflow"]
|
|
|
|
| 8 |
__version__ = "0.1.0"
|
| 9 |
|
| 10 |
import os
|
| 11 |
+
import sys
|
| 12 |
import logging
|
| 13 |
from pathlib import Path
|
| 14 |
from dotenv import load_dotenv
|
|
|
|
| 28 |
env_path = Path(__file__).parent / ".env"
|
| 29 |
|
| 30 |
|
| 31 |
+
def _is_interactive():
|
| 32 |
+
"""Check if we're running in an interactive environment."""
|
| 33 |
+
return sys.stdin.isatty()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
|
| 36 |
def _set_env(var: str):
|
| 37 |
+
"""Set environment variable - only prompt if running interactively."""
|
| 38 |
if not os.environ.get(var):
|
| 39 |
+
if _is_interactive():
|
| 40 |
+
from getpass import getpass
|
| 41 |
+
os.environ[var] = getpass(f"{var}: ")
|
| 42 |
+
logger.info(f"{var} set interactively")
|
| 43 |
+
else:
|
| 44 |
+
logger.warning(f"{var} is not set and running non-interactively. Skipping.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
|
| 47 |
if env_path.exists():
|
|
|
|
| 53 |
)
|
| 54 |
|
| 55 |
|
| 56 |
+
# List of environment variables to check
|
| 57 |
environment_key_array = [
|
| 58 |
"TAVILY_API_KEY",
|
| 59 |
"GEMINI_API_KEY",
|
| 60 |
"PINECONE_API_KEY",
|
| 61 |
"LANGFUSE_PUBLIC_KEY",
|
| 62 |
"LANGFUSE_SECRET_KEY",
|
| 63 |
+
"LANGSMITH_API_KEY",
|
| 64 |
+
"OPENROUTER_API_KEY",
|
| 65 |
+
"LANGSMITH_PROJECT",
|
| 66 |
+
"LANGSMITH_ENDPOINT",
|
| 67 |
+
"CEREBRAS_API_KEY",
|
| 68 |
]
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def load_environment_variables(key_array):
|
| 72 |
+
"""Load environment variables, warn if missing."""
|
| 73 |
+
missing_keys = []
|
| 74 |
+
for key in key_array:
|
| 75 |
+
if not os.getenv(key):
|
| 76 |
+
logger.warning(f"{key} environment variable is not set.")
|
| 77 |
+
missing_keys.append(key)
|
| 78 |
+
_set_env(key)
|
| 79 |
+
|
| 80 |
+
if missing_keys and not _is_interactive():
|
| 81 |
+
logger.warning(f"Missing environment variables (non-interactive mode): {missing_keys}")
|
| 82 |
+
|
| 83 |
+
|
| 84 |
# Check for critical environment variables
|
| 85 |
load_environment_variables(environment_key_array)
|
| 86 |
|
| 87 |
+
# Enable LangSmith tracing if API key is set
|
| 88 |
+
if os.getenv("LANGSMITH_API_KEY"):
|
| 89 |
+
os.environ["LANGSMITH_TRACING"] = "true"
|
| 90 |
+
|
| 91 |
__all__ = ["job_app_graph", "workflows/research_workflow"]
|
src/job_writing_agent/agents/nodes.py
CHANGED
|
@@ -8,13 +8,14 @@ writer workflow graph, each handling a specific step in the process.
|
|
| 8 |
# Standard library imports
|
| 9 |
import logging
|
| 10 |
from datetime import datetime
|
|
|
|
| 11 |
|
| 12 |
# Third-party imports
|
| 13 |
from langchain_core.messages import SystemMessage
|
| 14 |
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
|
| 15 |
|
| 16 |
# Local imports
|
| 17 |
-
from ..classes.classes import AppState,
|
| 18 |
from ..prompts.templates import (
|
| 19 |
BULLET_POINTS_PROMPT,
|
| 20 |
COVER_LETTER_PROMPT,
|
|
@@ -40,7 +41,7 @@ def create_draft(state: ResearchState) -> ResultState:
|
|
| 40 |
# Create LLM inside function (lazy initialization)
|
| 41 |
llm_provider = LLMFactory()
|
| 42 |
llm = llm_provider.create_langchain(
|
| 43 |
-
"
|
| 44 |
provider="openrouter",
|
| 45 |
temperature=0.3,
|
| 46 |
)
|
|
@@ -97,7 +98,6 @@ def create_draft(state: ResearchState) -> ResultState:
|
|
| 97 |
feedback="",
|
| 98 |
critique_feedback="",
|
| 99 |
current_node="create_draft",
|
| 100 |
-
company_research_data=company_background_information,
|
| 101 |
output_data={},
|
| 102 |
)
|
| 103 |
|
|
@@ -118,6 +118,7 @@ def critique_draft(state: ResultState) -> ResultState:
|
|
| 118 |
draft_content = str(state.get("draft", ""))
|
| 119 |
feedback = state.get("feedback", "")
|
| 120 |
output_data = state.get("output_data", "")
|
|
|
|
| 121 |
|
| 122 |
# Debug logging to verify values
|
| 123 |
logger.debug(f"Job description length: {len(job_description)}")
|
|
@@ -126,19 +127,12 @@ def critique_draft(state: ResultState) -> ResultState:
|
|
| 126 |
# Early return if required fields are missing
|
| 127 |
if not job_description or not draft_content:
|
| 128 |
logger.warning("Missing job_description or draft in state")
|
| 129 |
-
return ResultState(
|
| 130 |
-
draft=draft_content,
|
| 131 |
-
feedback=feedback,
|
| 132 |
-
critique_feedback="",
|
| 133 |
-
current_node="critique",
|
| 134 |
-
company_research_data=company_research_data,
|
| 135 |
-
output_data=output_data,
|
| 136 |
-
)
|
| 137 |
|
| 138 |
# Create LLM inside function (lazy initialization)
|
| 139 |
llm_provider = LLMFactory()
|
| 140 |
llm = llm_provider.create_langchain(
|
| 141 |
-
"
|
| 142 |
provider="openrouter",
|
| 143 |
temperature=0.3,
|
| 144 |
)
|
|
@@ -160,20 +154,20 @@ def critique_draft(state: ResultState) -> ResultState:
|
|
| 160 |
# Append HumanMessagePromptTemplate with variables (like line 97-124 in create_draft)
|
| 161 |
critique_context_message = HumanMessagePromptTemplate.from_template(
|
| 162 |
"""
|
| 163 |
-
|
| 164 |
-
|
| 165 |
|
| 166 |
-
|
| 167 |
-
|
| 168 |
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
|
| 175 |
-
|
| 176 |
-
|
| 177 |
input_variables=["job_description", "draft"],
|
| 178 |
)
|
| 179 |
|
|
@@ -204,12 +198,7 @@ def critique_draft(state: ResultState) -> ResultState:
|
|
| 204 |
|
| 205 |
# Store the critique - using validated variables from top of function
|
| 206 |
return ResultState(
|
| 207 |
-
|
| 208 |
-
feedback=feedback,
|
| 209 |
-
critique_feedback=critique_content,
|
| 210 |
-
current_node="critique",
|
| 211 |
-
company_research_data=company_research_data,
|
| 212 |
-
output_data=output_data,
|
| 213 |
)
|
| 214 |
|
| 215 |
except Exception as e:
|
|
@@ -223,8 +212,6 @@ def human_approval(state: ResultState) -> ResultState:
|
|
| 223 |
# Validate and extract all required state fields once
|
| 224 |
draft_content = state.get("draft", "")
|
| 225 |
critique_feedback_content = state.get("critique_feedback", "No critique available")
|
| 226 |
-
company_research_data = state.get("company_research_data", {})
|
| 227 |
-
output_data = state.get("output_data", "")
|
| 228 |
|
| 229 |
# Display draft and critique for review
|
| 230 |
print("\n" + "=" * 80)
|
|
@@ -236,25 +223,24 @@ def human_approval(state: ResultState) -> ResultState:
|
|
| 236 |
print("\nPlease provide your feedback (press Enter to continue with no changes):")
|
| 237 |
|
| 238 |
# In a real implementation, this would be handled by the UI
|
| 239 |
-
human_feedback =
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
critique_feedback=critique_feedback_content,
|
| 245 |
-
current_node="human_approval",
|
| 246 |
-
company_research_data=company_research_data,
|
| 247 |
-
output_data=output_data,
|
| 248 |
)
|
| 249 |
|
|
|
|
| 250 |
|
| 251 |
-
|
|
|
|
|
|
|
|
|
|
| 252 |
"""Incorporate feedback and finalize the document."""
|
| 253 |
# Validate and extract all required state fields once
|
| 254 |
draft_content = state.get("draft", "")
|
| 255 |
feedback_content = state.get("feedback", "")
|
| 256 |
critique_feedback_content = state.get("critique_feedback", "")
|
| 257 |
-
company_research_data = state.get("company_research_data", {})
|
| 258 |
|
| 259 |
if not draft_content:
|
| 260 |
logger.warning("Missing draft in state for finalization")
|
|
@@ -262,7 +248,7 @@ def finalize_document(state: ResultState) -> DataLoadState:
|
|
| 262 |
# Create LLM inside function (lazy initialization)
|
| 263 |
llm_provider = LLMFactory()
|
| 264 |
llm = llm_provider.create_langchain(
|
| 265 |
-
"
|
| 266 |
provider="openrouter",
|
| 267 |
temperature=0.3,
|
| 268 |
)
|
|
@@ -287,16 +273,21 @@ def finalize_document(state: ResultState) -> DataLoadState:
|
|
| 287 |
}
|
| 288 |
)
|
| 289 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 290 |
# Return final state using validated variables
|
| 291 |
-
return
|
| 292 |
draft=draft_content,
|
| 293 |
feedback=feedback_content,
|
| 294 |
critique_feedback=critique_feedback_content,
|
| 295 |
-
company_research_data=company_research_data,
|
| 296 |
current_node="finalize",
|
| 297 |
-
output_data=
|
| 298 |
-
|
| 299 |
-
|
|
|
|
|
|
|
| 300 |
)
|
| 301 |
|
| 302 |
|
|
|
|
| 8 |
# Standard library imports
|
| 9 |
import logging
|
| 10 |
from datetime import datetime
|
| 11 |
+
from langgraph.types import interrupt
|
| 12 |
|
| 13 |
# Third-party imports
|
| 14 |
from langchain_core.messages import SystemMessage
|
| 15 |
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
|
| 16 |
|
| 17 |
# Local imports
|
| 18 |
+
from ..classes.classes import AppState, ResearchState, ResultState
|
| 19 |
from ..prompts.templates import (
|
| 20 |
BULLET_POINTS_PROMPT,
|
| 21 |
COVER_LETTER_PROMPT,
|
|
|
|
| 41 |
# Create LLM inside function (lazy initialization)
|
| 42 |
llm_provider = LLMFactory()
|
| 43 |
llm = llm_provider.create_langchain(
|
| 44 |
+
"mistralai/devstral-2512:free",
|
| 45 |
provider="openrouter",
|
| 46 |
temperature=0.3,
|
| 47 |
)
|
|
|
|
| 98 |
feedback="",
|
| 99 |
critique_feedback="",
|
| 100 |
current_node="create_draft",
|
|
|
|
| 101 |
output_data={},
|
| 102 |
)
|
| 103 |
|
|
|
|
| 118 |
draft_content = str(state.get("draft", ""))
|
| 119 |
feedback = state.get("feedback", "")
|
| 120 |
output_data = state.get("output_data", "")
|
| 121 |
+
current_node = state.get("current_node", "")
|
| 122 |
|
| 123 |
# Debug logging to verify values
|
| 124 |
logger.debug(f"Job description length: {len(job_description)}")
|
|
|
|
| 127 |
# Early return if required fields are missing
|
| 128 |
if not job_description or not draft_content:
|
| 129 |
logger.warning("Missing job_description or draft in state")
|
| 130 |
+
return ResultState(**state, current_node=current_node)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
# Create LLM inside function (lazy initialization)
|
| 133 |
llm_provider = LLMFactory()
|
| 134 |
llm = llm_provider.create_langchain(
|
| 135 |
+
"mistralai/devstral-2512:free",
|
| 136 |
provider="openrouter",
|
| 137 |
temperature=0.3,
|
| 138 |
)
|
|
|
|
| 154 |
# Append HumanMessagePromptTemplate with variables (like line 97-124 in create_draft)
|
| 155 |
critique_context_message = HumanMessagePromptTemplate.from_template(
|
| 156 |
"""
|
| 157 |
+
# Job Description
|
| 158 |
+
{job_description}
|
| 159 |
|
| 160 |
+
# Current Draft
|
| 161 |
+
{draft}
|
| 162 |
|
| 163 |
+
Critique this draft and suggest specific improvements. Focus on:
|
| 164 |
+
1. How well it targets the job requirements
|
| 165 |
+
2. Professional tone and language
|
| 166 |
+
3. Clarity and impact
|
| 167 |
+
4. Grammar and style
|
| 168 |
|
| 169 |
+
Return your critique in a constructive, actionable format.
|
| 170 |
+
""",
|
| 171 |
input_variables=["job_description", "draft"],
|
| 172 |
)
|
| 173 |
|
|
|
|
| 198 |
|
| 199 |
# Store the critique - using validated variables from top of function
|
| 200 |
return ResultState(
|
| 201 |
+
**state, critique_feedback=critique_content, current_node=current_node
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
)
|
| 203 |
|
| 204 |
except Exception as e:
|
|
|
|
| 212 |
# Validate and extract all required state fields once
|
| 213 |
draft_content = state.get("draft", "")
|
| 214 |
critique_feedback_content = state.get("critique_feedback", "No critique available")
|
|
|
|
|
|
|
| 215 |
|
| 216 |
# Display draft and critique for review
|
| 217 |
print("\n" + "=" * 80)
|
|
|
|
| 223 |
print("\nPlease provide your feedback (press Enter to continue with no changes):")
|
| 224 |
|
| 225 |
# In a real implementation, this would be handled by the UI
|
| 226 |
+
human_feedback = interrupt(
|
| 227 |
+
{
|
| 228 |
+
"draft": draft_content,
|
| 229 |
+
"message": "Please review the draft and provide feedback (empty string to approve as-is)",
|
| 230 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 231 |
)
|
| 232 |
|
| 233 |
+
print(f"Human feedback: {human_feedback}")
|
| 234 |
|
| 235 |
+
return ResultState(**state, feedback=human_feedback, current_node="human_approval")
|
| 236 |
+
|
| 237 |
+
|
| 238 |
+
def finalize_document(state: ResultState) -> ResultState:
|
| 239 |
"""Incorporate feedback and finalize the document."""
|
| 240 |
# Validate and extract all required state fields once
|
| 241 |
draft_content = state.get("draft", "")
|
| 242 |
feedback_content = state.get("feedback", "")
|
| 243 |
critique_feedback_content = state.get("critique_feedback", "")
|
|
|
|
| 244 |
|
| 245 |
if not draft_content:
|
| 246 |
logger.warning("Missing draft in state for finalization")
|
|
|
|
| 248 |
# Create LLM inside function (lazy initialization)
|
| 249 |
llm_provider = LLMFactory()
|
| 250 |
llm = llm_provider.create_langchain(
|
| 251 |
+
"mistralai/devstral-2512:free",
|
| 252 |
provider="openrouter",
|
| 253 |
temperature=0.3,
|
| 254 |
)
|
|
|
|
| 273 |
}
|
| 274 |
)
|
| 275 |
|
| 276 |
+
print(
|
| 277 |
+
f"Final content: {final_content.content if hasattr(final_content, 'content') else final_content}"
|
| 278 |
+
)
|
| 279 |
+
|
| 280 |
# Return final state using validated variables
|
| 281 |
+
return ResultState(
|
| 282 |
draft=draft_content,
|
| 283 |
feedback=feedback_content,
|
| 284 |
critique_feedback=critique_feedback_content,
|
|
|
|
| 285 |
current_node="finalize",
|
| 286 |
+
output_data=(
|
| 287 |
+
final_content.content
|
| 288 |
+
if hasattr(final_content, "content")
|
| 289 |
+
else final_content
|
| 290 |
+
),
|
| 291 |
)
|
| 292 |
|
| 293 |
|
src/job_writing_agent/classes/__init__.py
CHANGED
|
@@ -1,3 +1,17 @@
|
|
| 1 |
-
from .classes import
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
-
__all__ = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .classes import (
|
| 2 |
+
AppState,
|
| 3 |
+
ResearchState,
|
| 4 |
+
DataLoadState,
|
| 5 |
+
ResultState,
|
| 6 |
+
FormField,
|
| 7 |
+
FormFieldsExtraction,
|
| 8 |
+
)
|
| 9 |
|
| 10 |
+
__all__ = [
|
| 11 |
+
"AppState",
|
| 12 |
+
"ResearchState",
|
| 13 |
+
"DataLoadState",
|
| 14 |
+
"ResultState",
|
| 15 |
+
"FormField",
|
| 16 |
+
"FormFieldsExtraction",
|
| 17 |
+
]
|
src/job_writing_agent/nodes/research_workflow.py
CHANGED
|
@@ -150,7 +150,7 @@ def company_research_data_summary(state: ResearchState) -> ResearchState:
|
|
| 150 |
|
| 151 |
llm_provider = LLMFactory()
|
| 152 |
llm = llm_provider.create_dspy(
|
| 153 |
-
model="
|
| 154 |
provider="openrouter",
|
| 155 |
temperature=0.3,
|
| 156 |
)
|
|
|
|
| 150 |
|
| 151 |
llm_provider = LLMFactory()
|
| 152 |
llm = llm_provider.create_dspy(
|
| 153 |
+
model="mistralai/devstral-2512:free",
|
| 154 |
provider="openrouter",
|
| 155 |
temperature=0.3,
|
| 156 |
)
|
src/job_writing_agent/tools/SearchTool.py
CHANGED
|
@@ -37,7 +37,7 @@ class TavilyResearchTool:
|
|
| 37 |
job_description,
|
| 38 |
company_name,
|
| 39 |
max_results=5,
|
| 40 |
-
model_name="
|
| 41 |
):
|
| 42 |
# Create LLM inside __init__ (lazy initialization)
|
| 43 |
llm_provider = LLMFactory()
|
|
|
|
| 37 |
job_description,
|
| 38 |
company_name,
|
| 39 |
max_results=5,
|
| 40 |
+
model_name="mistralai/devstral-2512:free",
|
| 41 |
):
|
| 42 |
# Create LLM inside __init__ (lazy initialization)
|
| 43 |
llm_provider = LLMFactory()
|
src/job_writing_agent/workflow.py
CHANGED
|
@@ -143,7 +143,7 @@ class JobWorkflow:
|
|
| 143 |
)
|
| 144 |
|
| 145 |
@cached_property
|
| 146 |
-
def job_app_graph(self) ->
|
| 147 |
"""
|
| 148 |
Build and configure the job application workflow graph.
|
| 149 |
|
|
@@ -197,7 +197,9 @@ class JobWorkflow:
|
|
| 197 |
agent_workflow_graph.add_edge("critique", "human_approval")
|
| 198 |
agent_workflow_graph.add_edge("human_approval", "finalize")
|
| 199 |
|
| 200 |
-
|
|
|
|
|
|
|
| 201 |
|
| 202 |
def _get_callbacks(self) -> list:
|
| 203 |
"""
|
|
@@ -258,7 +260,7 @@ class JobWorkflow:
|
|
| 258 |
in the "output_data" field, or None if execution fails.
|
| 259 |
"""
|
| 260 |
try:
|
| 261 |
-
compiled_graph = self.
|
| 262 |
except Exception as e:
|
| 263 |
logger.error("Error compiling graph: %s", e, exc_info=True)
|
| 264 |
return None
|
|
@@ -308,24 +310,72 @@ class JobWorkflow:
|
|
| 308 |
logger.error("Error running graph: %s", e, exc_info=True)
|
| 309 |
return None
|
| 310 |
|
| 311 |
-
@log_execution
|
| 312 |
-
@log_errors
|
| 313 |
-
def compile(self) -> CompiledStateGraph:
|
| 314 |
-
"""
|
| 315 |
-
Compile the workflow graph into an executable state machine.
|
| 316 |
|
| 317 |
-
|
| 318 |
-
-------
|
| 319 |
-
CompiledStateGraph
|
| 320 |
-
Compiled LangGraph state machine ready for execution.
|
| 321 |
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 329 |
|
| 330 |
|
| 331 |
def main():
|
|
@@ -336,12 +386,12 @@ def main():
|
|
| 336 |
content=args.content_type,
|
| 337 |
)
|
| 338 |
result = asyncio.run(workflow.run())
|
| 339 |
-
if result:
|
| 340 |
-
print_result(args.content_type, result
|
| 341 |
-
save_result(args.content_type, result
|
| 342 |
print("Workflow completed successfully.")
|
| 343 |
else:
|
| 344 |
-
print("Error running workflow.")
|
| 345 |
sys.exit(1)
|
| 346 |
|
| 347 |
|
|
|
|
| 143 |
)
|
| 144 |
|
| 145 |
@cached_property
|
| 146 |
+
def job_app_graph(self) -> CompiledStateGraph:
|
| 147 |
"""
|
| 148 |
Build and configure the job application workflow graph.
|
| 149 |
|
|
|
|
| 197 |
agent_workflow_graph.add_edge("critique", "human_approval")
|
| 198 |
agent_workflow_graph.add_edge("human_approval", "finalize")
|
| 199 |
|
| 200 |
+
job_app_graph = agent_workflow_graph.compile()
|
| 201 |
+
|
| 202 |
+
return job_app_graph
|
| 203 |
|
| 204 |
def _get_callbacks(self) -> list:
|
| 205 |
"""
|
|
|
|
| 260 |
in the "output_data" field, or None if execution fails.
|
| 261 |
"""
|
| 262 |
try:
|
| 263 |
+
compiled_graph = self.job_app_graph
|
| 264 |
except Exception as e:
|
| 265 |
logger.error("Error compiling graph: %s", e, exc_info=True)
|
| 266 |
return None
|
|
|
|
| 310 |
logger.error("Error running graph: %s", e, exc_info=True)
|
| 311 |
return None
|
| 312 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 313 |
|
| 314 |
+
# At the bottom of workflow.py, after the JobWorkflow class definition
|
|
|
|
|
|
|
|
|
|
| 315 |
|
| 316 |
+
|
| 317 |
+
def build_job_app_graph() -> CompiledStateGraph:
|
| 318 |
+
"""
|
| 319 |
+
Build and compile the job application workflow graph.
|
| 320 |
+
|
| 321 |
+
This function creates the graph structure independent of runtime inputs.
|
| 322 |
+
Actual runtime values (resume, job description) come from the state
|
| 323 |
+
passed during invocation.
|
| 324 |
+
"""
|
| 325 |
+
|
| 326 |
+
# Helper function for the adapter (since we can't use instance methods)
|
| 327 |
+
def dataload_to_research_adapter(state: DataLoadState) -> ResearchState:
|
| 328 |
+
logger.info("Adapter for converting DataLoadState to ResearchState")
|
| 329 |
+
return ResearchState(
|
| 330 |
+
company_research_data=state.get("company_research_data", {}),
|
| 331 |
+
attempted_search_queries=[],
|
| 332 |
+
current_node="",
|
| 333 |
+
content_category=state.get("content_category", ""),
|
| 334 |
+
messages=state.get("messages", []),
|
| 335 |
+
)
|
| 336 |
+
|
| 337 |
+
# Helper function for routing
|
| 338 |
+
def route_after_load(state: DataLoadState) -> str:
|
| 339 |
+
next_node = state.get("next_node", "research")
|
| 340 |
+
logger.info(f"Routing after load: {next_node}")
|
| 341 |
+
return next_node
|
| 342 |
+
|
| 343 |
+
# Build the graph
|
| 344 |
+
agent_workflow_graph = StateGraph(DataLoadState)
|
| 345 |
+
|
| 346 |
+
# Add nodes
|
| 347 |
+
agent_workflow_graph.add_node("load", data_loading_workflow)
|
| 348 |
+
agent_workflow_graph.add_node("to_research_adapter", dataload_to_research_adapter)
|
| 349 |
+
agent_workflow_graph.add_node("research", research_workflow)
|
| 350 |
+
agent_workflow_graph.add_node("create_draft", create_draft)
|
| 351 |
+
agent_workflow_graph.add_node("critique", critique_draft)
|
| 352 |
+
agent_workflow_graph.add_node("human_approval", human_approval)
|
| 353 |
+
agent_workflow_graph.add_node("finalize", finalize_document)
|
| 354 |
+
|
| 355 |
+
# Set entry and exit
|
| 356 |
+
agent_workflow_graph.set_entry_point("load")
|
| 357 |
+
agent_workflow_graph.set_finish_point("finalize")
|
| 358 |
+
|
| 359 |
+
# Add edges
|
| 360 |
+
agent_workflow_graph.add_conditional_edges(
|
| 361 |
+
"load",
|
| 362 |
+
route_after_load,
|
| 363 |
+
{
|
| 364 |
+
"load": "load",
|
| 365 |
+
"research": "to_research_adapter",
|
| 366 |
+
},
|
| 367 |
+
)
|
| 368 |
+
agent_workflow_graph.add_edge("to_research_adapter", "research")
|
| 369 |
+
agent_workflow_graph.add_edge("research", "create_draft")
|
| 370 |
+
agent_workflow_graph.add_edge("create_draft", "critique")
|
| 371 |
+
agent_workflow_graph.add_edge("critique", "human_approval")
|
| 372 |
+
agent_workflow_graph.add_edge("human_approval", "finalize")
|
| 373 |
+
|
| 374 |
+
return agent_workflow_graph.compile()
|
| 375 |
+
|
| 376 |
+
|
| 377 |
+
# Export at module level for LangGraph deployment
|
| 378 |
+
job_app_graph = build_job_app_graph()
|
| 379 |
|
| 380 |
|
| 381 |
def main():
|
|
|
|
| 386 |
content=args.content_type,
|
| 387 |
)
|
| 388 |
result = asyncio.run(workflow.run())
|
| 389 |
+
if result and hasattr(result, "output_data"):
|
| 390 |
+
print_result(args.content_type, result.get("output_data", ""))
|
| 391 |
+
save_result(args.content_type, result.get("output_data", ""))
|
| 392 |
print("Workflow completed successfully.")
|
| 393 |
else:
|
| 394 |
+
print("Error running workflow. No output data available.")
|
| 395 |
sys.exit(1)
|
| 396 |
|
| 397 |
|
uv.lock
CHANGED
|
@@ -1909,7 +1909,6 @@ dependencies = [
|
|
| 1909 |
{ name = "langfuse" },
|
| 1910 |
{ name = "langgraph" },
|
| 1911 |
{ name = "langgraph-api" },
|
| 1912 |
-
{ name = "langgraph-checkpoint" },
|
| 1913 |
{ name = "langgraph-cli" },
|
| 1914 |
{ name = "langgraph-prebuilt" },
|
| 1915 |
{ name = "langgraph-runtime-inmem" },
|
|
@@ -2149,20 +2148,19 @@ requires-dist = [
|
|
| 2149 |
{ name = "jsonschema-specifications", specifier = "==2025.9.1" },
|
| 2150 |
{ name = "justext", specifier = "==3.0.2" },
|
| 2151 |
{ name = "kiwisolver", specifier = "==1.4.9" },
|
| 2152 |
-
{ name = "langchain"
|
| 2153 |
-
{ name = "langchain-cerebras"
|
| 2154 |
-
{ name = "langchain-community"
|
| 2155 |
-
{ name = "langchain-core", specifier = "
|
| 2156 |
-
{ name = "langchain-ollama"
|
| 2157 |
-
{ name = "langchain-openai"
|
| 2158 |
-
{ name = "langchain-tavily"
|
| 2159 |
-
{ name = "langchain-text-splitters"
|
| 2160 |
{ name = "langfuse", specifier = "==3.6.1" },
|
| 2161 |
-
{ name = "langgraph"
|
| 2162 |
-
{ name = "langgraph-api"
|
| 2163 |
-
{ name = "langgraph-
|
| 2164 |
-
{ name = "langgraph-
|
| 2165 |
-
{ name = "langgraph-prebuilt", specifier = "==0.6.4" },
|
| 2166 |
{ name = "langgraph-runtime-inmem", specifier = "==0.14.1" },
|
| 2167 |
{ name = "langgraph-sdk", specifier = "==0.2.9" },
|
| 2168 |
{ name = "langsmith", specifier = "==0.4.32" },
|
|
@@ -2214,8 +2212,8 @@ requires-dist = [
|
|
| 2214 |
{ name = "opentelemetry-sdk", specifier = "==1.37.0" },
|
| 2215 |
{ name = "opentelemetry-semantic-conventions", specifier = "==0.58b0" },
|
| 2216 |
{ name = "optuna", specifier = "==4.5.0" },
|
| 2217 |
-
{ name = "orjson", specifier = "
|
| 2218 |
-
{ name = "ormsgpack", specifier = "
|
| 2219 |
{ name = "packaging", specifier = "==25.0" },
|
| 2220 |
{ name = "pandas", specifier = "==2.3.3" },
|
| 2221 |
{ name = "parse", specifier = "==1.20.2" },
|
|
@@ -2535,33 +2533,29 @@ wheels = [
|
|
| 2535 |
|
| 2536 |
[[package]]
|
| 2537 |
name = "langchain"
|
| 2538 |
-
version = "
|
| 2539 |
source = { registry = "https://pypi.org/simple" }
|
| 2540 |
dependencies = [
|
| 2541 |
{ name = "langchain-core" },
|
| 2542 |
-
{ name = "
|
| 2543 |
-
{ name = "langsmith" },
|
| 2544 |
{ name = "pydantic" },
|
| 2545 |
-
{ name = "pyyaml" },
|
| 2546 |
-
{ name = "requests" },
|
| 2547 |
-
{ name = "sqlalchemy" },
|
| 2548 |
]
|
| 2549 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2550 |
wheels = [
|
| 2551 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2552 |
]
|
| 2553 |
|
| 2554 |
[[package]]
|
| 2555 |
name = "langchain-cerebras"
|
| 2556 |
-
version = "0.
|
| 2557 |
source = { registry = "https://pypi.org/simple" }
|
| 2558 |
dependencies = [
|
| 2559 |
{ name = "langchain-core" },
|
| 2560 |
{ name = "langchain-openai" },
|
| 2561 |
]
|
| 2562 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2563 |
wheels = [
|
| 2564 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2565 |
]
|
| 2566 |
|
| 2567 |
[[package]]
|
|
@@ -2589,7 +2583,7 @@ wheels = [
|
|
| 2589 |
|
| 2590 |
[[package]]
|
| 2591 |
name = "langchain-core"
|
| 2592 |
-
version = "
|
| 2593 |
source = { registry = "https://pypi.org/simple" }
|
| 2594 |
dependencies = [
|
| 2595 |
{ name = "jsonpatch" },
|
|
@@ -2599,10 +2593,11 @@ dependencies = [
|
|
| 2599 |
{ name = "pyyaml" },
|
| 2600 |
{ name = "tenacity" },
|
| 2601 |
{ name = "typing-extensions" },
|
|
|
|
| 2602 |
]
|
| 2603 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2604 |
wheels = [
|
| 2605 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2606 |
]
|
| 2607 |
|
| 2608 |
[[package]]
|
|
@@ -2620,16 +2615,16 @@ wheels = [
|
|
| 2620 |
|
| 2621 |
[[package]]
|
| 2622 |
name = "langchain-openai"
|
| 2623 |
-
version = "
|
| 2624 |
source = { registry = "https://pypi.org/simple" }
|
| 2625 |
dependencies = [
|
| 2626 |
{ name = "langchain-core" },
|
| 2627 |
{ name = "openai" },
|
| 2628 |
{ name = "tiktoken" },
|
| 2629 |
]
|
| 2630 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2631 |
wheels = [
|
| 2632 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2633 |
]
|
| 2634 |
|
| 2635 |
[[package]]
|
|
@@ -2681,7 +2676,7 @@ wheels = [
|
|
| 2681 |
|
| 2682 |
[[package]]
|
| 2683 |
name = "langgraph"
|
| 2684 |
-
version = "0.
|
| 2685 |
source = { registry = "https://pypi.org/simple" }
|
| 2686 |
dependencies = [
|
| 2687 |
{ name = "langchain-core" },
|
|
@@ -2691,9 +2686,9 @@ dependencies = [
|
|
| 2691 |
{ name = "pydantic" },
|
| 2692 |
{ name = "xxhash" },
|
| 2693 |
]
|
| 2694 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2695 |
wheels = [
|
| 2696 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2697 |
]
|
| 2698 |
|
| 2699 |
[[package]]
|
|
@@ -2760,15 +2755,15 @@ wheels = [
|
|
| 2760 |
|
| 2761 |
[[package]]
|
| 2762 |
name = "langgraph-prebuilt"
|
| 2763 |
-
version = "0.
|
| 2764 |
source = { registry = "https://pypi.org/simple" }
|
| 2765 |
dependencies = [
|
| 2766 |
{ name = "langchain-core" },
|
| 2767 |
{ name = "langgraph-checkpoint" },
|
| 2768 |
]
|
| 2769 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 2770 |
wheels = [
|
| 2771 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 2772 |
]
|
| 2773 |
|
| 2774 |
[[package]]
|
|
@@ -3969,98 +3964,98 @@ wheels = [
|
|
| 3969 |
|
| 3970 |
[[package]]
|
| 3971 |
name = "orjson"
|
| 3972 |
-
version = "3.
|
| 3973 |
-
source = { registry = "https://pypi.org/simple" }
|
| 3974 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 3975 |
-
wheels = [
|
| 3976 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3977 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3978 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3979 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3980 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3981 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3982 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3983 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3984 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3985 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3986 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3987 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3988 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3989 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3990 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3991 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3992 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3993 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3994 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3995 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3996 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3997 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3998 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 3999 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4000 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4001 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4002 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4003 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4004 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4005 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4006 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4007 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4008 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4009 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4010 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4011 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4012 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4013 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4014 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4015 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4016 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4017 |
-
{ url = "https://files.pythonhosted.org/packages/8d/8b/bafb7f0afef9344754a3a0597a12442f1b85a048b82108ef2c956f53babd/orjson-3.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e44fbe4000bd321d9f3b648ae46e0196d21577cf66ae684a96ff90b1f7c93633", size = 135418 },
|
| 4018 |
-
{ url = "https://files.pythonhosted.org/packages/60/d4/bae8e4f26afb2c23bea69d2f6d566132584d1c3a5fe89ee8c17b718cab67/orjson-3.11.3-cp313-cp313-win32.whl", hash = "sha256:2039b7847ba3eec1f5886e75e6763a16e18c68a63efc4b029ddf994821e2e66b", size = 136216 },
|
| 4019 |
-
{ url = "https://files.pythonhosted.org/packages/88/76/224985d9f127e121c8cad882cea55f0ebe39f97925de040b75ccd4b33999/orjson-3.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:29be5ac4164aa8bdcba5fa0700a3c9c316b411d8ed9d39ef8a882541bd452fae", size = 131362 },
|
| 4020 |
-
{ url = "https://files.pythonhosted.org/packages/e2/cf/0dce7a0be94bd36d1346be5067ed65ded6adb795fdbe3abd234c8d576d01/orjson-3.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:18bd1435cb1f2857ceb59cfb7de6f92593ef7b831ccd1b9bfb28ca530e539dce", size = 125989 },
|
| 4021 |
-
{ url = "https://files.pythonhosted.org/packages/ef/77/d3b1fef1fc6aaeed4cbf3be2b480114035f4df8fa1a99d2dac1d40d6e924/orjson-3.11.3-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cf4b81227ec86935568c7edd78352a92e97af8da7bd70bdfdaa0d2e0011a1ab4", size = 238115 },
|
| 4022 |
-
{ url = "https://files.pythonhosted.org/packages/e4/6d/468d21d49bb12f900052edcfbf52c292022d0a323d7828dc6376e6319703/orjson-3.11.3-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:bc8bc85b81b6ac9fc4dae393a8c159b817f4c2c9dee5d12b773bddb3b95fc07e", size = 127493 },
|
| 4023 |
-
{ url = "https://files.pythonhosted.org/packages/67/46/1e2588700d354aacdf9e12cc2d98131fb8ac6f31ca65997bef3863edb8ff/orjson-3.11.3-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:88dcfc514cfd1b0de038443c7b3e6a9797ffb1b3674ef1fd14f701a13397f82d", size = 122998 },
|
| 4024 |
-
{ url = "https://files.pythonhosted.org/packages/3b/94/11137c9b6adb3779f1b34fd98be51608a14b430dbc02c6d41134fbba484c/orjson-3.11.3-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d61cd543d69715d5fc0a690c7c6f8dcc307bc23abef9738957981885f5f38229", size = 132915 },
|
| 4025 |
-
{ url = "https://files.pythonhosted.org/packages/10/61/dccedcf9e9bcaac09fdabe9eaee0311ca92115699500efbd31950d878833/orjson-3.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2b7b153ed90ababadbef5c3eb39549f9476890d339cf47af563aea7e07db2451", size = 130907 },
|
| 4026 |
-
{ url = "https://files.pythonhosted.org/packages/0e/fd/0e935539aa7b08b3ca0f817d73034f7eb506792aae5ecc3b7c6e679cdf5f/orjson-3.11.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7909ae2460f5f494fecbcd10613beafe40381fd0316e35d6acb5f3a05bfda167", size = 403852 },
|
| 4027 |
-
{ url = "https://files.pythonhosted.org/packages/4a/2b/50ae1a5505cd1043379132fdb2adb8a05f37b3e1ebffe94a5073321966fd/orjson-3.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2030c01cbf77bc67bee7eef1e7e31ecf28649353987775e3583062c752da0077", size = 146309 },
|
| 4028 |
-
{ url = "https://files.pythonhosted.org/packages/cd/1d/a473c158e380ef6f32753b5f39a69028b25ec5be331c2049a2201bde2e19/orjson-3.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a0169ebd1cbd94b26c7a7ad282cf5c2744fce054133f959e02eb5265deae1872", size = 135424 },
|
| 4029 |
-
{ url = "https://files.pythonhosted.org/packages/da/09/17d9d2b60592890ff7382e591aa1d9afb202a266b180c3d4049b1ec70e4a/orjson-3.11.3-cp314-cp314-win32.whl", hash = "sha256:0c6d7328c200c349e3a4c6d8c83e0a5ad029bdc2d417f234152bf34842d0fc8d", size = 136266 },
|
| 4030 |
-
{ url = "https://files.pythonhosted.org/packages/15/58/358f6846410a6b4958b74734727e582ed971e13d335d6c7ce3e47730493e/orjson-3.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:317bbe2c069bbc757b1a2e4105b64aacd3bc78279b66a6b9e51e846e4809f804", size = 131351 },
|
| 4031 |
-
{ url = "https://files.pythonhosted.org/packages/28/01/d6b274a0635be0468d4dbd9cafe80c47105937a0d42434e805e67cd2ed8b/orjson-3.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:e8f6a7a27d7b7bec81bd5924163e9af03d49bbb63013f107b48eb5d16db711bc", size = 125985 },
|
| 4032 |
]
|
| 4033 |
|
| 4034 |
[[package]]
|
| 4035 |
name = "ormsgpack"
|
| 4036 |
-
version = "1.
|
| 4037 |
-
source = { registry = "https://pypi.org/simple" }
|
| 4038 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 4039 |
-
wheels = [
|
| 4040 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4041 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4042 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4043 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4044 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4045 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4046 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4047 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4048 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4049 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4050 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4051 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4052 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4053 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4054 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4055 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4056 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4057 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4058 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4059 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4060 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4061 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4062 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4063 |
-
{ url = "https://files.pythonhosted.org/packages/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4064 |
]
|
| 4065 |
|
| 4066 |
[[package]]
|
|
@@ -5836,6 +5831,35 @@ wheels = [
|
|
| 5836 |
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 },
|
| 5837 |
]
|
| 5838 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5839 |
[[package]]
|
| 5840 |
name = "uvicorn"
|
| 5841 |
version = "0.37.0"
|
|
|
|
| 1909 |
{ name = "langfuse" },
|
| 1910 |
{ name = "langgraph" },
|
| 1911 |
{ name = "langgraph-api" },
|
|
|
|
| 1912 |
{ name = "langgraph-cli" },
|
| 1913 |
{ name = "langgraph-prebuilt" },
|
| 1914 |
{ name = "langgraph-runtime-inmem" },
|
|
|
|
| 2148 |
{ name = "jsonschema-specifications", specifier = "==2025.9.1" },
|
| 2149 |
{ name = "justext", specifier = "==3.0.2" },
|
| 2150 |
{ name = "kiwisolver", specifier = "==1.4.9" },
|
| 2151 |
+
{ name = "langchain" },
|
| 2152 |
+
{ name = "langchain-cerebras" },
|
| 2153 |
+
{ name = "langchain-community" },
|
| 2154 |
+
{ name = "langchain-core", specifier = ">=1.0.0" },
|
| 2155 |
+
{ name = "langchain-ollama" },
|
| 2156 |
+
{ name = "langchain-openai" },
|
| 2157 |
+
{ name = "langchain-tavily" },
|
| 2158 |
+
{ name = "langchain-text-splitters" },
|
| 2159 |
{ name = "langfuse", specifier = "==3.6.1" },
|
| 2160 |
+
{ name = "langgraph" },
|
| 2161 |
+
{ name = "langgraph-api" },
|
| 2162 |
+
{ name = "langgraph-cli" },
|
| 2163 |
+
{ name = "langgraph-prebuilt" },
|
|
|
|
| 2164 |
{ name = "langgraph-runtime-inmem", specifier = "==0.14.1" },
|
| 2165 |
{ name = "langgraph-sdk", specifier = "==0.2.9" },
|
| 2166 |
{ name = "langsmith", specifier = "==0.4.32" },
|
|
|
|
| 2212 |
{ name = "opentelemetry-sdk", specifier = "==1.37.0" },
|
| 2213 |
{ name = "opentelemetry-semantic-conventions", specifier = "==0.58b0" },
|
| 2214 |
{ name = "optuna", specifier = "==4.5.0" },
|
| 2215 |
+
{ name = "orjson", specifier = ">=3.9.7,<3.10.17" },
|
| 2216 |
+
{ name = "ormsgpack", specifier = ">=1.12.0" },
|
| 2217 |
{ name = "packaging", specifier = "==25.0" },
|
| 2218 |
{ name = "pandas", specifier = "==2.3.3" },
|
| 2219 |
{ name = "parse", specifier = "==1.20.2" },
|
|
|
|
| 2533 |
|
| 2534 |
[[package]]
|
| 2535 |
name = "langchain"
|
| 2536 |
+
version = "1.2.0"
|
| 2537 |
source = { registry = "https://pypi.org/simple" }
|
| 2538 |
dependencies = [
|
| 2539 |
{ name = "langchain-core" },
|
| 2540 |
+
{ name = "langgraph" },
|
|
|
|
| 2541 |
{ name = "pydantic" },
|
|
|
|
|
|
|
|
|
|
| 2542 |
]
|
| 2543 |
+
sdist = { url = "https://files.pythonhosted.org/packages/b1/12/3a74c22abdfddd877dfc2ee666d516f9132877fcd25eb4dd694835c59c79/langchain-1.2.0.tar.gz", hash = "sha256:a087d1e2b2969819e29a91a6d5f98302aafe31bd49ba377ecee3bf5a5dcfe14a", size = 536126 }
|
| 2544 |
wheels = [
|
| 2545 |
+
{ url = "https://files.pythonhosted.org/packages/23/00/4e3fa0d90f5a5c376ccb8ca983d0f0f7287783dfac48702e18f01d24673b/langchain-1.2.0-py3-none-any.whl", hash = "sha256:82f0d17aa4fbb11560b30e1e7d4aeb75e3ad71ce09b85c90ab208b181a24ffac", size = 102828 },
|
| 2546 |
]
|
| 2547 |
|
| 2548 |
[[package]]
|
| 2549 |
name = "langchain-cerebras"
|
| 2550 |
+
version = "0.8.2"
|
| 2551 |
source = { registry = "https://pypi.org/simple" }
|
| 2552 |
dependencies = [
|
| 2553 |
{ name = "langchain-core" },
|
| 2554 |
{ name = "langchain-openai" },
|
| 2555 |
]
|
| 2556 |
+
sdist = { url = "https://files.pythonhosted.org/packages/64/d8/76356d5361b3dd6e1febcc62cc83acc01a88f7fca43b836d4e3a72434a37/langchain_cerebras-0.8.2.tar.gz", hash = "sha256:1594f87d08955a141269d48527d9a636827f6cb60167c447d8c5969eeaa9c8c7", size = 11267 }
|
| 2557 |
wheels = [
|
| 2558 |
+
{ url = "https://files.pythonhosted.org/packages/fc/f9/239509fccf433f7cb34f8d2cf15885e4eda5e04f1f3110da295543fbaec5/langchain_cerebras-0.8.2-py3-none-any.whl", hash = "sha256:ca956bd8906e4760d903d3b9c614913488a87e44ee61522fafd66267dfb6582f", size = 9961 },
|
| 2559 |
]
|
| 2560 |
|
| 2561 |
[[package]]
|
|
|
|
| 2583 |
|
| 2584 |
[[package]]
|
| 2585 |
name = "langchain-core"
|
| 2586 |
+
version = "1.2.6"
|
| 2587 |
source = { registry = "https://pypi.org/simple" }
|
| 2588 |
dependencies = [
|
| 2589 |
{ name = "jsonpatch" },
|
|
|
|
| 2593 |
{ name = "pyyaml" },
|
| 2594 |
{ name = "tenacity" },
|
| 2595 |
{ name = "typing-extensions" },
|
| 2596 |
+
{ name = "uuid-utils" },
|
| 2597 |
]
|
| 2598 |
+
sdist = { url = "https://files.pythonhosted.org/packages/b9/ce/ba5ed5ea6df22965b2893c2ed28ebb456204962723d408904c4acfa5e942/langchain_core-1.2.6.tar.gz", hash = "sha256:b4e7841dd7f8690375aa07c54739178dc2c635147d475e0c2955bf82a1afa498", size = 833343 }
|
| 2599 |
wheels = [
|
| 2600 |
+
{ url = "https://files.pythonhosted.org/packages/6f/40/0655892c245d8fbe6bca6d673ab5927e5c3ab7be143de40b52289a0663bc/langchain_core-1.2.6-py3-none-any.whl", hash = "sha256:aa6ed954b4b1f4504937fe75fdf674317027e9a91ba7a97558b0de3dc8004e34", size = 489096 },
|
| 2601 |
]
|
| 2602 |
|
| 2603 |
[[package]]
|
|
|
|
| 2615 |
|
| 2616 |
[[package]]
|
| 2617 |
name = "langchain-openai"
|
| 2618 |
+
version = "1.1.6"
|
| 2619 |
source = { registry = "https://pypi.org/simple" }
|
| 2620 |
dependencies = [
|
| 2621 |
{ name = "langchain-core" },
|
| 2622 |
{ name = "openai" },
|
| 2623 |
{ name = "tiktoken" },
|
| 2624 |
]
|
| 2625 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ae/67/228dc28b4498ea16422577013b5bb4ba35a1b99f8be975d6747c7a9f7e6a/langchain_openai-1.1.6.tar.gz", hash = "sha256:e306612654330ae36fb6bbe36db91c98534312afade19e140c3061fe4208dac8", size = 1038310 }
|
| 2626 |
wheels = [
|
| 2627 |
+
{ url = "https://files.pythonhosted.org/packages/db/5b/1f6521df83c1a8e8d3f52351883b59683e179c0aa1bec75d0a77a394c9e7/langchain_openai-1.1.6-py3-none-any.whl", hash = "sha256:c42d04a67a85cee1d994afe400800d2b09ebf714721345f0b651eb06a02c3948", size = 84701 },
|
| 2628 |
]
|
| 2629 |
|
| 2630 |
[[package]]
|
|
|
|
| 2676 |
|
| 2677 |
[[package]]
|
| 2678 |
name = "langgraph"
|
| 2679 |
+
version = "1.0.4"
|
| 2680 |
source = { registry = "https://pypi.org/simple" }
|
| 2681 |
dependencies = [
|
| 2682 |
{ name = "langchain-core" },
|
|
|
|
| 2686 |
{ name = "pydantic" },
|
| 2687 |
{ name = "xxhash" },
|
| 2688 |
]
|
| 2689 |
+
sdist = { url = "https://files.pythonhosted.org/packages/d6/3c/af87902d300c1f467165558c8966d8b1e1f896dace271d3f35a410a5c26a/langgraph-1.0.4.tar.gz", hash = "sha256:86d08e25d7244340f59c5200fa69fdd11066aa999b3164b531e2a20036fac156", size = 484397 }
|
| 2690 |
wheels = [
|
| 2691 |
+
{ url = "https://files.pythonhosted.org/packages/14/52/4eb25a3f60399da34ba34adff1b3e324cf0d87eb7a08cebf1882a9b5e0d5/langgraph-1.0.4-py3-none-any.whl", hash = "sha256:b1a835ceb0a8d69b9db48075e1939e28b1ad70ee23fa3fa8f90149904778bacf", size = 157271 },
|
| 2692 |
]
|
| 2693 |
|
| 2694 |
[[package]]
|
|
|
|
| 2755 |
|
| 2756 |
[[package]]
|
| 2757 |
name = "langgraph-prebuilt"
|
| 2758 |
+
version = "1.0.5"
|
| 2759 |
source = { registry = "https://pypi.org/simple" }
|
| 2760 |
dependencies = [
|
| 2761 |
{ name = "langchain-core" },
|
| 2762 |
{ name = "langgraph-checkpoint" },
|
| 2763 |
]
|
| 2764 |
+
sdist = { url = "https://files.pythonhosted.org/packages/46/f9/54f8891b32159e4542236817aea2ee83de0de18bce28e9bdba08c7f93001/langgraph_prebuilt-1.0.5.tar.gz", hash = "sha256:85802675ad778cc7240fd02d47db1e0b59c0c86d8369447d77ce47623845db2d", size = 144453 }
|
| 2765 |
wheels = [
|
| 2766 |
+
{ url = "https://files.pythonhosted.org/packages/87/5e/aeba4a5b39fe6e874e0dd003a82da71c7153e671312671a8dacc5cb7c1af/langgraph_prebuilt-1.0.5-py3-none-any.whl", hash = "sha256:22369563e1848862ace53fbc11b027c28dd04a9ac39314633bb95f2a7e258496", size = 35072 },
|
| 2767 |
]
|
| 2768 |
|
| 2769 |
[[package]]
|
|
|
|
| 3964 |
|
| 3965 |
[[package]]
|
| 3966 |
name = "orjson"
|
| 3967 |
+
version = "3.10.16"
|
| 3968 |
+
source = { registry = "https://pypi.org/simple" }
|
| 3969 |
+
sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415 }
|
| 3970 |
+
wheels = [
|
| 3971 |
+
{ url = "https://files.pythonhosted.org/packages/97/29/43f91a5512b5d2535594438eb41c5357865fd5e64dec745d90a588820c75/orjson-3.10.16-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44fcbe1a1884f8bc9e2e863168b0f84230c3d634afe41c678637d2728ea8e739", size = 249180 },
|
| 3972 |
+
{ url = "https://files.pythonhosted.org/packages/0c/36/2a72d55e266473c19a86d97b7363bb8bf558ab450f75205689a287d5ce61/orjson-3.10.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78177bf0a9d0192e0b34c3d78bcff7fe21d1b5d84aeb5ebdfe0dbe637b885225", size = 138510 },
|
| 3973 |
+
{ url = "https://files.pythonhosted.org/packages/bb/ad/f86d6f55c1a68b57ff6ea7966bce5f4e5163f2e526ddb7db9fc3c2c8d1c4/orjson-3.10.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12824073a010a754bb27330cad21d6e9b98374f497f391b8707752b96f72e741", size = 132373 },
|
| 3974 |
+
{ url = "https://files.pythonhosted.org/packages/5e/8b/d18f2711493a809f3082a88fda89342bc8e16767743b909cd3c34989fba3/orjson-3.10.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd41007e56284e9867864aa2f29f3136bb1dd19a49ca43c0b4eda22a579cf53", size = 136773 },
|
| 3975 |
+
{ url = "https://files.pythonhosted.org/packages/a1/dc/ce025f002f8e0749e3f057c4d773a4d4de32b7b4c1fc5a50b429e7532586/orjson-3.10.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0877c4d35de639645de83666458ca1f12560d9fa7aa9b25d8bb8f52f61627d14", size = 138029 },
|
| 3976 |
+
{ url = "https://files.pythonhosted.org/packages/0e/1b/cf9df85852b91160029d9f26014230366a2b4deb8cc51fabe68e250a8c1a/orjson-3.10.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a09a539e9cc3beead3e7107093b4ac176d015bec64f811afb5965fce077a03c", size = 142677 },
|
| 3977 |
+
{ url = "https://files.pythonhosted.org/packages/92/18/5b1e1e995bffad49dc4311a0bdfd874bc6f135fd20f0e1f671adc2c9910e/orjson-3.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b98bc9b40610fec971d9a4d67bb2ed02eec0a8ae35f8ccd2086320c28526ca", size = 132800 },
|
| 3978 |
+
{ url = "https://files.pythonhosted.org/packages/d6/eb/467f25b580e942fcca1344adef40633b7f05ac44a65a63fc913f9a805d58/orjson-3.10.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce243f5a8739f3a18830bc62dc2e05b69a7545bafd3e3249f86668b2bcd8e50", size = 135451 },
|
| 3979 |
+
{ url = "https://files.pythonhosted.org/packages/8d/4b/9d10888038975cb375982e9339d9495bac382d5c976c500b8d6f2c8e2e4e/orjson-3.10.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:64792c0025bae049b3074c6abe0cf06f23c8e9f5a445f4bab31dc5ca23dbf9e1", size = 412358 },
|
| 3980 |
+
{ url = "https://files.pythonhosted.org/packages/3b/e2/cfbcfcc4fbe619e0ca9bdbbfccb2d62b540bbfe41e0ee77d44a628594f59/orjson-3.10.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea53f7e68eec718b8e17e942f7ca56c6bd43562eb19db3f22d90d75e13f0431d", size = 152772 },
|
| 3981 |
+
{ url = "https://files.pythonhosted.org/packages/b9/d6/627a1b00569be46173007c11dde3da4618c9bfe18409325b0e3e2a82fe29/orjson-3.10.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a741ba1a9488c92227711bde8c8c2b63d7d3816883268c808fbeada00400c164", size = 137225 },
|
| 3982 |
+
{ url = "https://files.pythonhosted.org/packages/0a/7b/a73c67b505021af845b9f05c7c848793258ea141fa2058b52dd9b067c2b4/orjson-3.10.16-cp311-cp311-win32.whl", hash = "sha256:c7ed2c61bb8226384c3fdf1fb01c51b47b03e3f4536c985078cccc2fd19f1619", size = 141733 },
|
| 3983 |
+
{ url = "https://files.pythonhosted.org/packages/f4/22/5e8217c48d68c0adbfb181e749d6a733761074e598b083c69a1383d18147/orjson-3.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:cd67d8b3e0e56222a2e7b7f7da9031e30ecd1fe251c023340b9f12caca85ab60", size = 133784 },
|
| 3984 |
+
{ url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325 },
|
| 3985 |
+
{ url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621 },
|
| 3986 |
+
{ url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270 },
|
| 3987 |
+
{ url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346 },
|
| 3988 |
+
{ url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845 },
|
| 3989 |
+
{ url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078 },
|
| 3990 |
+
{ url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712 },
|
| 3991 |
+
{ url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136 },
|
| 3992 |
+
{ url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258 },
|
| 3993 |
+
{ url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326 },
|
| 3994 |
+
{ url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800 },
|
| 3995 |
+
{ url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516 },
|
| 3996 |
+
{ url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759 },
|
| 3997 |
+
{ url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944 },
|
| 3998 |
+
{ url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289 },
|
| 3999 |
+
{ url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640 },
|
| 4000 |
+
{ url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286 },
|
| 4001 |
+
{ url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307 },
|
| 4002 |
+
{ url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739 },
|
| 4003 |
+
{ url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076 },
|
| 4004 |
+
{ url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643 },
|
| 4005 |
+
{ url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168 },
|
| 4006 |
+
{ url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271 },
|
| 4007 |
+
{ url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444 },
|
| 4008 |
+
{ url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737 },
|
| 4009 |
+
{ url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482 },
|
| 4010 |
+
{ url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714 },
|
| 4011 |
+
{ url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4012 |
]
|
| 4013 |
|
| 4014 |
[[package]]
|
| 4015 |
name = "ormsgpack"
|
| 4016 |
+
version = "1.12.1"
|
| 4017 |
+
source = { registry = "https://pypi.org/simple" }
|
| 4018 |
+
sdist = { url = "https://files.pythonhosted.org/packages/fe/96/34c40d621996c2f377a18decbd3c59f031dde73c3ba47d1e1e8f29a05aaa/ormsgpack-1.12.1.tar.gz", hash = "sha256:a3877fde1e4f27a39f92681a0aab6385af3a41d0c25375d33590ae20410ea2ac", size = 39476 }
|
| 4019 |
+
wheels = [
|
| 4020 |
+
{ url = "https://files.pythonhosted.org/packages/57/e2/f5b89365c8dc8025c27d31316038f1c103758ddbf87dc0fa8e3f78f66907/ormsgpack-1.12.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4038f59ae0e19dac5e5d9aae4ec17ff84a79e046342ee73ccdecf3547ecf0d34", size = 376180 },
|
| 4021 |
+
{ url = "https://files.pythonhosted.org/packages/ca/87/3f694e06f5e32c6d65066f53b4a025282a5072b6b336c17560b00e04606d/ormsgpack-1.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16c63b0c5a3eec467e4bb33a14dabba076b7d934dff62898297b5c0b5f7c3cb3", size = 202338 },
|
| 4022 |
+
{ url = "https://files.pythonhosted.org/packages/e5/f5/6d95d7b7c11f97a92522082fc7e5d1ab34537929f1e13f4c369f392f19d0/ormsgpack-1.12.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:74fd6a8e037eb310dda865298e8d122540af00fe5658ec18b97a1d34f4012e4d", size = 210720 },
|
| 4023 |
+
{ url = "https://files.pythonhosted.org/packages/2b/9d/9a49a2686f8b7165dcb2342b8554951263c30c0f0825f1fcc2d56e736a6b/ormsgpack-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58ad60308e233dd824a1859eabb5fe092e123e885eafa4ad5789322329c80fb5", size = 211264 },
|
| 4024 |
+
{ url = "https://files.pythonhosted.org/packages/02/31/2fdc36eaeca2182900b96fc7b19755f293283fe681750e3d295733d62f0e/ormsgpack-1.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:35127464c941c1219acbe1a220e48d55e7933373d12257202f4042f7044b4c90", size = 386081 },
|
| 4025 |
+
{ url = "https://files.pythonhosted.org/packages/f0/65/0a765432f08ae26b4013c6a9aed97be17a9ef85f1600948a474b518e27dd/ormsgpack-1.12.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c48d1c50794692d1e6e3f8c3bb65f5c3acfaae9347e506484a65d60b3d91fb50", size = 479572 },
|
| 4026 |
+
{ url = "https://files.pythonhosted.org/packages/4e/4f/f2f15ebef786ad71cea420bf8692448fbddf04d1bf3feaa68bd5ee3172e6/ormsgpack-1.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b512b2ad6feaaefdc26e05431ed2843e42483041e354e167c53401afaa83d919", size = 387862 },
|
| 4027 |
+
{ url = "https://files.pythonhosted.org/packages/15/eb/86fbef1d605fa91ecef077f93f9d0e34fc39b23475dfe3ffb92f6c8db28d/ormsgpack-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:93f30db95e101a9616323bfc50807ad00e7f6197cea2216d2d24af42afc77d88", size = 115900 },
|
| 4028 |
+
{ url = "https://files.pythonhosted.org/packages/5b/67/7ba1a46e6a6e263fc42a4fafc24afc1ab21a66116553cad670426f0bd9ef/ormsgpack-1.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:d75b5fa14f6abffce2c392ee03b4731199d8a964c81ee8645c4c79af0e80fd50", size = 109868 },
|
| 4029 |
+
{ url = "https://files.pythonhosted.org/packages/17/fe/ab9167ca037406b5703add24049cf3e18021a3b16133ea20615b1f160ea4/ormsgpack-1.12.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4d7fb0e1b6fbc701d75269f7405a4f79230a6ce0063fb1092e4f6577e312f86d", size = 376725 },
|
| 4030 |
+
{ url = "https://files.pythonhosted.org/packages/c7/ea/2820e65f506894c459b840d1091ae6e327fde3d5a3f3b002a11a1b9bdf7d/ormsgpack-1.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43a9353e2db5b024c91a47d864ef15eaa62d81824cfc7740fed4cef7db738694", size = 202466 },
|
| 4031 |
+
{ url = "https://files.pythonhosted.org/packages/45/8b/def01c13339c5bbec2ee1469ef53e7fadd66c8d775df974ee4def1572515/ormsgpack-1.12.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc8fe866b7706fc25af0adf1f600bc06ece5b15ca44e34641327198b821e5c3c", size = 210748 },
|
| 4032 |
+
{ url = "https://files.pythonhosted.org/packages/5d/d2/bf350c92f7f067dd9484499705f2d8366d8d9008a670e3d1d0add1908f85/ormsgpack-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813755b5f598a78242042e05dfd1ada4e769e94b98c9ab82554550f97ff4d641", size = 211510 },
|
| 4033 |
+
{ url = "https://files.pythonhosted.org/packages/74/92/9d689bcb95304a6da26c4d59439c350940c25d1b35f146d402ccc6344c51/ormsgpack-1.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8eea2a13536fae45d78f93f2cc846c9765c7160c85f19cfefecc20873c137cdd", size = 386237 },
|
| 4034 |
+
{ url = "https://files.pythonhosted.org/packages/17/fe/bd3107547f8b6129265dd957f40b9cd547d2445db2292aacb13335a7ea89/ormsgpack-1.12.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7a02ebda1a863cbc604740e76faca8eee1add322db2dcbe6cf32669fffdff65c", size = 479589 },
|
| 4035 |
+
{ url = "https://files.pythonhosted.org/packages/c1/7c/e8e5cc9edb967d44f6f85e9ebdad440b59af3fae00b137a4327dc5aed9bb/ormsgpack-1.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c0bd63897c439931cdf29348e5e6e8c330d529830e848d10767615c0f3d1b82", size = 388077 },
|
| 4036 |
+
{ url = "https://files.pythonhosted.org/packages/35/6b/5031797e43b58506f28a8760b26dc23f2620fb4f2200c4c1b3045603e67e/ormsgpack-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:362f2e812f8d7035dc25a009171e09d7cc97cb30d3c9e75a16aeae00ca3c1dcf", size = 116190 },
|
| 4037 |
+
{ url = "https://files.pythonhosted.org/packages/1e/fd/9f43ea6425e383a6b2dbfafebb06fd60e8d68c700ef715adfbcdb499f75d/ormsgpack-1.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:6190281e381db2ed0045052208f47a995ccf61eed48f1215ae3cce3fbccd59c5", size = 109990 },
|
| 4038 |
+
{ url = "https://files.pythonhosted.org/packages/11/42/f110dfe7cf23a52a82e23eb23d9a6a76ae495447d474686dfa758f3d71d6/ormsgpack-1.12.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9663d6b3ecc917c063d61a99169ce196a80f3852e541ae404206836749459279", size = 376746 },
|
| 4039 |
+
{ url = "https://files.pythonhosted.org/packages/11/76/b386e508a8ae207daec240201a81adb26467bf99b163560724e86bd9ff33/ormsgpack-1.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32e85cfbaf01a94a92520e7fe7851cfcfe21a5698299c28ab86194895f9b9233", size = 202489 },
|
| 4040 |
+
{ url = "https://files.pythonhosted.org/packages/ea/0e/5db7a63f387149024572daa3d9512fe8fb14bf4efa0722d6d491bed280e7/ormsgpack-1.12.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dabfd2c24b59c7c69870a5ecee480dfae914a42a0c2e7c9d971cf531e2ba471a", size = 210757 },
|
| 4041 |
+
{ url = "https://files.pythonhosted.org/packages/64/79/3a9899e57cb57430bd766fc1b4c9ad410cb2ba6070bc8cf6301e7d385768/ormsgpack-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51bbf2b64afeded34ccd8e25402e4bca038757913931fa0d693078d75563f6f9", size = 211518 },
|
| 4042 |
+
{ url = "https://files.pythonhosted.org/packages/d7/cd/4f41710ae9fe50d7fcbe476793b3c487746d0e1cc194cc0fee42ff6d989b/ormsgpack-1.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9959a71dde1bd0ced84af17facc06a8afada495a34e9cb1bad8e9b20d4c59cef", size = 386251 },
|
| 4043 |
+
{ url = "https://files.pythonhosted.org/packages/bf/54/ba0c97d6231b1f01daafaa520c8cce1e1b7fceaae6fdc1c763925874a7de/ormsgpack-1.12.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:e9be0e3b62d758f21f5b20e0e06b3a240ec546c4a327bf771f5825462aa74714", size = 479607 },
|
| 4044 |
+
{ url = "https://files.pythonhosted.org/packages/18/75/19a9a97a462776d525baf41cfb7072734528775f0a3d5fbfab3aa7756b9b/ormsgpack-1.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a29d49ab7fdd77ea787818e60cb4ef491708105b9c4c9b0f919201625eb036b5", size = 388062 },
|
| 4045 |
+
{ url = "https://files.pythonhosted.org/packages/a8/6a/ec26e3f44e9632ecd2f43638b7b37b500eaea5d79cab984ad0b94be14f82/ormsgpack-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:c418390b47a1d367e803f6c187f77e4d67c7ae07ba962e3a4a019001f4b0291a", size = 116195 },
|
| 4046 |
+
{ url = "https://files.pythonhosted.org/packages/7d/64/bfa5f4a34d0f15c6aba1b73e73f7441a66d635bd03249d334a4796b7a924/ormsgpack-1.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:cfa22c91cffc10a7fbd43729baff2de7d9c28cef2509085a704168ae31f02568", size = 109986 },
|
| 4047 |
+
{ url = "https://files.pythonhosted.org/packages/87/0e/78e5697164e3223b9b216c13e99f1acbc1ee9833490d68842b13da8ba883/ormsgpack-1.12.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b93c91efb1a70751a1902a5b43b27bd8fd38e0ca0365cf2cde2716423c15c3a6", size = 376758 },
|
| 4048 |
+
{ url = "https://files.pythonhosted.org/packages/2c/0e/3a3cbb64703263d7bbaed7effa3ce78cb9add360a60aa7c544d7df28b641/ormsgpack-1.12.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf0ea0389167b5fa8d2933dd3f33e887ec4ba68f89c25214d7eec4afd746d22", size = 202487 },
|
| 4049 |
+
{ url = "https://files.pythonhosted.org/packages/d7/2c/807ebe2b77995599bbb1dec8c3f450d5d7dddee14ce3e1e71dc60e2e2a74/ormsgpack-1.12.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4c29af837f35af3375070689e781161e7cf019eb2f7cd641734ae45cd001c0d", size = 210853 },
|
| 4050 |
+
{ url = "https://files.pythonhosted.org/packages/25/57/2cdfc354e3ad8e847628f511f4d238799d90e9e090941e50b9d5ba955ae2/ormsgpack-1.12.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336fc65aa0fe65896a3dabaae31e332a0a98b4a00ad7b0afde21a7505fd23ff3", size = 211545 },
|
| 4051 |
+
{ url = "https://files.pythonhosted.org/packages/76/1d/c6fda560e4a8ff865b3aec8a86f7c95ab53f4532193a6ae4ab9db35f85aa/ormsgpack-1.12.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:940f60aabfefe71dd6b82cb33f4ff10b2e7f5fcfa5f103cdb0a23b6aae4c713c", size = 386333 },
|
| 4052 |
+
{ url = "https://files.pythonhosted.org/packages/fc/3e/715081b36fceb8b497c68b87d384e1cc6d9c9c130ce3b435634d3d785b86/ormsgpack-1.12.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:596ad9e1b6d4c95595c54aaf49b1392609ca68f562ce06f4f74a5bc4053bcda4", size = 479701 },
|
| 4053 |
+
{ url = "https://files.pythonhosted.org/packages/6d/cf/01ad04def42b3970fc1a302c07f4b46339edf62ef9650247097260471f40/ormsgpack-1.12.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:575210e8fcbc7b0375026ba040a5eef223e9f66a4453d9623fc23282ae09c3c8", size = 388148 },
|
| 4054 |
+
{ url = "https://files.pythonhosted.org/packages/15/91/1fff2fc2b5943c740028f339154e7103c8f2edf1a881d9fbba2ce11c3b1d/ormsgpack-1.12.1-cp314-cp314-win_amd64.whl", hash = "sha256:647daa3718572280893456be44c60aea6690b7f2edc54c55648ee66e8f06550f", size = 116201 },
|
| 4055 |
+
{ url = "https://files.pythonhosted.org/packages/ed/66/142b542aed3f96002c7d1c33507ca6e1e0d0a42b9253ab27ef7ed5793bd9/ormsgpack-1.12.1-cp314-cp314-win_arm64.whl", hash = "sha256:a8b3ab762a6deaf1b6490ab46dda0c51528cf8037e0246c40875c6fe9e37b699", size = 110029 },
|
| 4056 |
+
{ url = "https://files.pythonhosted.org/packages/38/b3/ef4494438c90359e1547eaed3c5ec46e2c431d59a3de2af4e70ebd594c49/ormsgpack-1.12.1-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:12087214e436c1f6c28491949571abea759a63111908c4f7266586d78144d7a8", size = 376777 },
|
| 4057 |
+
{ url = "https://files.pythonhosted.org/packages/05/a0/1149a7163f8b0dfbc64bf9099b6f16d102ad3b03bcc11afee198d751da2d/ormsgpack-1.12.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6d54c14cf86ef13f10ccade94d1e7de146aa9b17d371e18b16e95f329393b7", size = 202490 },
|
| 4058 |
+
{ url = "https://files.pythonhosted.org/packages/68/82/f2ec5e758d6a7106645cca9bb7137d98bce5d363789fa94075be6572057c/ormsgpack-1.12.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f3584d07882b7ea2a1a589f795a3af97fe4c2932b739408e6d1d9d286cad862", size = 211733 },
|
| 4059 |
]
|
| 4060 |
|
| 4061 |
[[package]]
|
|
|
|
| 5831 |
{ url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 },
|
| 5832 |
]
|
| 5833 |
|
| 5834 |
+
[[package]]
|
| 5835 |
+
name = "uuid-utils"
|
| 5836 |
+
version = "0.12.0"
|
| 5837 |
+
source = { registry = "https://pypi.org/simple" }
|
| 5838 |
+
sdist = { url = "https://files.pythonhosted.org/packages/0b/0e/512fb221e4970c2f75ca9dae412d320b7d9ddc9f2b15e04ea8e44710396c/uuid_utils-0.12.0.tar.gz", hash = "sha256:252bd3d311b5d6b7f5dfce7a5857e27bb4458f222586bb439463231e5a9cbd64", size = 20889 }
|
| 5839 |
+
wheels = [
|
| 5840 |
+
{ url = "https://files.pythonhosted.org/packages/8a/43/de5cd49a57b6293b911b6a9a62fc03e55db9f964da7d5882d9edbee1e9d2/uuid_utils-0.12.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3b9b30707659292f207b98f294b0e081f6d77e1fbc760ba5b41331a39045f514", size = 603197 },
|
| 5841 |
+
{ url = "https://files.pythonhosted.org/packages/02/fa/5fd1d8c9234e44f0c223910808cde0de43bb69f7df1349e49b1afa7f2baa/uuid_utils-0.12.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:add3d820c7ec14ed37317375bea30249699c5d08ff4ae4dbee9fc9bce3bfbf65", size = 305168 },
|
| 5842 |
+
{ url = "https://files.pythonhosted.org/packages/c8/c6/8633ac9942bf9dc97a897b5154e5dcffa58816ec4dd780b3b12b559ff05c/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8fce83ecb3b16af29c7809669056c4b6e7cc912cab8c6d07361645de12dd79", size = 340580 },
|
| 5843 |
+
{ url = "https://files.pythonhosted.org/packages/f3/88/8a61307b04b4da1c576373003e6d857a04dade52ab035151d62cb84d5cb5/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec921769afcb905035d785582b0791d02304a7850fbd6ce924c1a8976380dfc6", size = 346771 },
|
| 5844 |
+
{ url = "https://files.pythonhosted.org/packages/1c/fb/aab2dcf94b991e62aa167457c7825b9b01055b884b888af926562864398c/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f3b060330f5899a92d5c723547dc6a95adef42433e9748f14c66859a7396664", size = 474781 },
|
| 5845 |
+
{ url = "https://files.pythonhosted.org/packages/5a/7a/dbd5e49c91d6c86dba57158bbfa0e559e1ddf377bb46dcfd58aea4f0d567/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:908dfef7f0bfcf98d406e5dc570c25d2f2473e49b376de41792b6e96c1d5d291", size = 343685 },
|
| 5846 |
+
{ url = "https://files.pythonhosted.org/packages/1a/19/8c4b1d9f450159733b8be421a4e1fb03533709b80ed3546800102d085572/uuid_utils-0.12.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c6a24148926bd0ca63e8a2dabf4cc9dc329a62325b3ad6578ecd60fbf926506", size = 366482 },
|
| 5847 |
+
{ url = "https://files.pythonhosted.org/packages/82/43/c79a6e45687647f80a159c8ba34346f287b065452cc419d07d2212d38420/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:64a91e632669f059ef605f1771d28490b1d310c26198e46f754e8846dddf12f4", size = 523132 },
|
| 5848 |
+
{ url = "https://files.pythonhosted.org/packages/5a/a2/b2d75a621260a40c438aa88593827dfea596d18316520a99e839f7a5fb9d/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:93c082212470bb4603ca3975916c205a9d7ef1443c0acde8fbd1e0f5b36673c7", size = 614218 },
|
| 5849 |
+
{ url = "https://files.pythonhosted.org/packages/13/6b/ba071101626edd5a6dabf8525c9a1537ff3d885dbc210540574a03901fef/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:431b1fb7283ba974811b22abd365f2726f8f821ab33f0f715be389640e18d039", size = 546241 },
|
| 5850 |
+
{ url = "https://files.pythonhosted.org/packages/01/12/9a942b81c0923268e6d85bf98d8f0a61fcbcd5e432fef94fdf4ce2ef8748/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd7838c40149100299fa37cbd8bab5ee382372e8e65a148002a37d380df7c8", size = 511842 },
|
| 5851 |
+
{ url = "https://files.pythonhosted.org/packages/a9/a7/c326f5163dd48b79368b87d8a05f5da4668dd228a3f5ca9d79d5fee2fc40/uuid_utils-0.12.0-cp39-abi3-win32.whl", hash = "sha256:487f17c0fee6cbc1d8b90fe811874174a9b1b5683bf2251549e302906a50fed3", size = 179088 },
|
| 5852 |
+
{ url = "https://files.pythonhosted.org/packages/38/92/41c8734dd97213ee1d5ae435cf4499705dc4f2751e3b957fd12376f61784/uuid_utils-0.12.0-cp39-abi3-win_amd64.whl", hash = "sha256:9598e7c9da40357ae8fffc5d6938b1a7017f09a1acbcc95e14af8c65d48c655a", size = 183003 },
|
| 5853 |
+
{ url = "https://files.pythonhosted.org/packages/c9/f9/52ab0359618987331a1f739af837d26168a4b16281c9c3ab46519940c628/uuid_utils-0.12.0-cp39-abi3-win_arm64.whl", hash = "sha256:c9bea7c5b2aa6f57937ebebeee4d4ef2baad10f86f1b97b58a3f6f34c14b4e84", size = 182975 },
|
| 5854 |
+
{ url = "https://files.pythonhosted.org/packages/ef/f7/6c55b7722cede3b424df02ed5cddb25c19543abda2f95fa4cfc34a892ae5/uuid_utils-0.12.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e2209d361f2996966ab7114f49919eb6aaeabc6041672abbbbf4fdbb8ec1acc0", size = 593065 },
|
| 5855 |
+
{ url = "https://files.pythonhosted.org/packages/b8/40/ce5fe8e9137dbd5570e0016c2584fca43ad81b11a1cef809a1a1b4952ab7/uuid_utils-0.12.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d9636bcdbd6cfcad2b549c352b669412d0d1eb09be72044a2f13e498974863cd", size = 300047 },
|
| 5856 |
+
{ url = "https://files.pythonhosted.org/packages/fb/9b/31c5d0736d7b118f302c50214e581f40e904305d8872eb0f0c921d50e138/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cd8543a3419251fb78e703ce3b15fdfafe1b7c542cf40caf0775e01db7e7674", size = 335165 },
|
| 5857 |
+
{ url = "https://files.pythonhosted.org/packages/f6/5c/d80b4d08691c9d7446d0ad58fd41503081a662cfd2c7640faf68c64d8098/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e98db2d8977c052cb307ae1cb5cc37a21715e8d415dbc65863b039397495a013", size = 341437 },
|
| 5858 |
+
{ url = "https://files.pythonhosted.org/packages/f6/b3/9dccdc6f3c22f6ef5bd381ae559173f8a1ae185ae89ed1f39f499d9d8b02/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8f2bdf5e4ffeb259ef6d15edae92aed60a1d6f07cbfab465d836f6b12b48da8", size = 469123 },
|
| 5859 |
+
{ url = "https://files.pythonhosted.org/packages/fd/90/6c35ef65fbc49f8189729839b793a4a74a7dd8c5aa5eb56caa93f8c97732/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c3ec53c0cb15e1835870c139317cc5ec06e35aa22843e3ed7d9c74f23f23898", size = 335892 },
|
| 5860 |
+
{ url = "https://files.pythonhosted.org/packages/6b/c7/e3f3ce05c5af2bf86a0938d22165affe635f4dcbfd5687b1dacc042d3e0e/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84e5c0eba209356f7f389946a3a47b2cc2effd711b3fc7c7f155ad9f7d45e8a3", size = 360693 },
|
| 5861 |
+
]
|
| 5862 |
+
|
| 5863 |
[[package]]
|
| 5864 |
name = "uvicorn"
|
| 5865 |
version = "0.37.0"
|