MCPcopy Index your code
hub / github.com/docker/docker-agent / runHarnessAgent

Method runHarnessAgent

pkg/runtime/harness.go:23–212  ·  view source on GitHub ↗
(ctx context.Context, sess *session.Session, a *agent.Agent, baseExtra []chat.Message, events EventSink)

Source from the content-addressed store, hash-verified

21)
22
23func (r *LocalRuntime) runHarnessAgent(ctx context.Context, sess *session.Session, a *agent.Agent, baseExtra []chat.Message, events EventSink) string {
24 ctx, span := r.startSpan(ctx, "runtime.harness", trace.WithAttributes(traceAttributesForHarness(sess, a)...))
25 defer span.End()
26
27 provider, err := codingharness.NewProvider(a.Harness())
28 if err != nil {
29 msg := fmt.Sprintf("failed to configure harness: %v", err)
30 events.Emit(ErrorWithCodeForSession(sess.ID, ErrorCodeModelError, msg))
31 r.notifyError(ctx, a, sess.ID, msg)
32 span.RecordError(err)
33 span.SetStatus(codes.Error, "harness configuration error")
34 return turnEndReasonError
35 }
36
37 modelID := agentModelLabel(ctx, a)
38 events.Emit(AgentInfo(a.Name(), modelID, a.Description(), a.WelcomeMessage()))
39
40 endReason := turnEndReasonNormal
41 defer func() {
42 if ctx.Err() != nil && endReason == turnEndReasonNormal {
43 endReason = turnEndReasonCanceled
44 }
45 r.executeTurnEndHooks(context.WithoutCancel(ctx), sess, a, endReason, events)
46 }()
47
48 turnStartMsgs := r.executeTurnStartHooks(ctx, sess, a, events)
49 messages := sess.GetMessages(a, append(baseExtra, turnStartMsgs...)...)
50 stop, msg, rewritten := r.executeBeforeLLMCallHooks(ctx, sess, a, modelID, 1, messages)
51 if stop {
52 slog.WarnContext(ctx, "before_llm_call hook signalled run termination",
53 "agent", a.Name(), "session_id", sess.ID, "reason", msg)
54 r.emitHookDrivenShutdown(ctx, a, sess, msg, events)
55 endReason = turnEndReasonHookBlocked
56 return endReason
57 }
58 if rewritten != nil {
59 messages = rewritten
60 }
61 messages = r.applyBeforeLLMCallTransforms(ctx, sess, a, modelID, messages)
62
63 prompt := harnessPromptFromMessages(messages)
64 var streamed strings.Builder
65 var finalResult string
66 var usage *chat.Usage
67 var cost float64
68 toolCallSeq := 0
69 pendingToolCalls := make(map[string]harnessToolCall)
70 startToolCall := func(ev baseharness.Event) harnessToolCall {
71 toolCallSeq++
72 pending := newHarnessToolCall(toolCallSeq, ev, "")
73 pendingToolCalls[pending.key] = pending
74 events.Emit(PartialToolCall(pending.call, pending.definition, a.Name()))
75 return pending
76 }
77 emitToolCallDelta := func(ev baseharness.Event) {
78 if ev.ToolArgs == "" {
79 return
80 }

Callers 1

runStreamLoopMethod · 0.95

Calls 15

startSpanMethod · 0.95
notifyErrorMethod · 0.95
executeTurnEndHooksMethod · 0.95
executeTurnStartHooksMethod · 0.95
executeStopHooksMethod · 0.95
NewProviderFunction · 0.92
ResultErrorFunction · 0.92

Tested by

no test coverage detected