File size: 3,225 Bytes
1d30ab4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated, List
import operator
from langchain_core.messages import BaseMessage, HumanMessage
from dotenv import load_dotenv
from sockets import socketio
import time

load_dotenv()

api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
    api_key = "YOUR_API_KEY_HERE"
os.environ["OPENAI_API_KEY"] = api_key

class AgentState(TypedDict):
    messages: Annotated[List[BaseMessage], operator.add]

def stream_message(step, message):
    for char in message:
        socketio.emit('stream', {'step': step, 'data': char})
        time.sleep(0.01)
    socketio.emit('stream_end', {'step': step})

def retrieve_job_offers(state):
    stream_message("Récupération des offres d'emploi", "Analyse des offres d'emploi pour le métier de responsable marketing...")
    return {"messages": [HumanMessage(content="Job offers retrieved")]}

def retrieve_job_stats(state):
    stream_message("Récupération des statistiques de l'emploi", "Analyse des statistiques de l'emploi pour le métier de responsable marketing...")
    return {"messages": [HumanMessage(content="Job stats retrieved")]}

def retrieve_job_description(state):
    stream_message("Récupération de la fiche métier", "Récupération de la fiche métier de responsable marketing depuis France Compétences...")
    return {"messages": [HumanMessage(content="Job description retrieved")]}

def generate_sector_rating(state):
    steps = [
        "Description du secteur : Le secteur du marketing est en pleine expansion...",
        "Description des OPCOs : Les principaux OPCOs sont l'OPCO Atlas...",
        "Description des missions : Le responsable marketing définit la stratégie marketing...",
        "Description des activités professionnelles : Cela inclut la gestion de campagnes...",
        "Description des compétences professionnelles : Maîtrise des outils d'analyse...",
        "Liste des 5 métiers les plus recrutés : 1. Responsable marketing...",
        "Les plus et les moins du métier : Avantages : missions variées...",
        "Tensions sur les recrutements : Forte tension sur les profils digitaux..."
    ]
    for step_content in steps:
        stream_message("Génération de la cotation du secteur", step_content)
    return {"messages": [HumanMessage(content="Sector rating generated")]}

workflow = StateGraph(AgentState)

workflow.add_node("retrieve_job_offers", retrieve_job_offers)
workflow.add_node("retrieve_job_stats", retrieve_job_stats)
workflow.add_node("retrieve_job_description", retrieve_job_description)
workflow.add_node("generate_sector_rating", generate_sector_rating)

workflow.set_entry_point("retrieve_job_offers")
workflow.add_edge("retrieve_job_offers", "retrieve_job_stats")
workflow.add_edge("retrieve_job_stats", "retrieve_job_description")
workflow.add_edge("retrieve_job_description", "generate_sector_rating")
workflow.add_edge("generate_sector_rating", END)

rac_graph_agent = workflow.compile()