## Azure Resources Created - ACR: socsocacr.azurecr.io (Operation, southeastasia) - Container App Environment: soc-cae (Operation, southeastasia) - Container App: soc-langgraph (Operation, southeastasia, port 2024) - Scale: 0-2 replicas, 0.5 vCPU / 1GB - Registry: socsocacr.azurecr.io (system-assigned managed identity) - OIDC: oidc-msi-8ac6 granted Contributor on Operation resource group ## What's included - Full langgraphjs-gen-ui-examples codebase under langgraph/ - Dockerfile: node:20-slim + pnpm, exposes port 2024 - .dockerignore, .gitignore - GitHub Actions: .github/workflows/deploy-langgraph.yml - Trigger: push to main, paths langgraph/** - Uses az acr build (cloud build, no local Docker needed) - Deploys to soc-langgraph Container App Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import {
|
|
END,
|
|
LangGraphRunnableConfig,
|
|
START,
|
|
StateGraph,
|
|
} from "@langchain/langgraph";
|
|
import { OpenCodeAnnotation, OpenCodeState } from "./types";
|
|
import { planner } from "./nodes/planner";
|
|
import {
|
|
executor,
|
|
SUCCESSFULLY_COMPLETED_STEPS_CONTENT,
|
|
} from "./nodes/executor";
|
|
import { AIMessage } from "@langchain/langgraph-sdk";
|
|
|
|
function conditionallyEnd(
|
|
state: OpenCodeState,
|
|
config: LangGraphRunnableConfig,
|
|
): typeof END | "planner" {
|
|
const fullWriteAccess = !!config.configurable?.permissions?.full_write_access;
|
|
const lastAiMessage = state.messages.findLast(
|
|
(m) => m.getType() === "ai",
|
|
) as unknown as AIMessage;
|
|
|
|
// If the user did not grant full write access, or the last AI message is the success message, end
|
|
// otherwise, loop back to the start.
|
|
if (
|
|
(typeof lastAiMessage.content === "string" &&
|
|
lastAiMessage.content === SUCCESSFULLY_COMPLETED_STEPS_CONTENT) ||
|
|
!fullWriteAccess
|
|
) {
|
|
return END;
|
|
}
|
|
|
|
return "planner";
|
|
}
|
|
|
|
const workflow = new StateGraph(OpenCodeAnnotation)
|
|
.addNode("planner", planner)
|
|
.addNode("executor", executor)
|
|
.addEdge(START, "planner")
|
|
.addEdge("planner", "executor")
|
|
.addConditionalEdges("executor", conditionallyEnd, ["planner", END]);
|
|
|
|
export const graph = workflow.compile();
|
|
graph.name = "Open Code Graph";
|