traceApi.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import { request } from "./client";
  2. import type { TraceDetailResponse, TraceListResponse } from "../types/trace";
  3. import type { KnowledgeLogEntry, FeedbackAction } from "../types/goal";
  4. export interface KnowledgeFeedbackListItem {
  5. knowledge_id: string;
  6. action: FeedbackAction;
  7. eval_status?: string;
  8. feedback_text?: string;
  9. source: {
  10. trace_id: string;
  11. goal_id?: string;
  12. sequence?: number;
  13. feedback_by: string;
  14. feedback_at: string;
  15. };
  16. }
  17. export type ToolApprovalDecision = "approve" | "reject";
  18. export interface ToolApprovalCallV1 {
  19. tool_call_id: string;
  20. tool_name: string;
  21. original_arguments: Record<string, unknown>;
  22. effective_arguments: Record<string, unknown>;
  23. argument_hash: string;
  24. editable_params: string[];
  25. requires_confirmation: boolean;
  26. decision: "pending" | "approved" | "rejected" | "auto_approved";
  27. execution_status:
  28. | "not_started"
  29. | "executing"
  30. | "executed"
  31. | "rejected"
  32. | "execution_unknown";
  33. result_message_id: string | null;
  34. decided_at: string | null;
  35. }
  36. export interface ToolApprovalBatchV1 {
  37. schema_version: 1;
  38. batch_id: string;
  39. trace_id: string;
  40. assistant_message_id: string;
  41. assistant_sequence: number;
  42. status:
  43. | "pending"
  44. | "decided"
  45. | "executing"
  46. | "recoverable_candidate_command"
  47. | "completed"
  48. | "cancelled"
  49. | "execution_unknown";
  50. calls: ToolApprovalCallV1[];
  51. created_at: string;
  52. updated_at: string;
  53. }
  54. export interface ToolApprovalDecisionInput {
  55. tool_call_id: string;
  56. decision: ToolApprovalDecision;
  57. edited_arguments?: Record<string, unknown>;
  58. }
  59. export const traceApi = {
  60. fetchTraces(params?: { status?: string; mode?: string; limit?: number }) {
  61. const query = new URLSearchParams();
  62. if (params?.status) query.set("status", params.status);
  63. if (params?.mode) query.set("mode", params.mode);
  64. if (typeof params?.limit === "number") query.set("limit", String(params.limit));
  65. const suffix = query.toString() ? `?${query.toString()}` : "";
  66. return request<TraceListResponse>(`/api/traces${suffix}`);
  67. },
  68. fetchTraceDetail(traceId: string) {
  69. return request<TraceDetailResponse>(`/api/traces/${traceId}`);
  70. },
  71. createTrace(data: {
  72. messages: Array<{ role: "system" | "user" | "assistant" | "tool"; content: unknown }>;
  73. model?: string;
  74. temperature?: number;
  75. max_iterations?: number;
  76. tools?: string[] | null;
  77. name?: string;
  78. uid?: string;
  79. project_name?: string;
  80. }) {
  81. return request<{ trace_id: string }>("/api/traces", {
  82. method: "POST",
  83. data,
  84. });
  85. },
  86. runTrace(
  87. traceId: string,
  88. data?: {
  89. messages?: Array<{ role: "system" | "user" | "assistant" | "tool"; content: unknown }>;
  90. after_message_id?: string | null;
  91. },
  92. ) {
  93. return request<void>(`/api/traces/${traceId}/run`, {
  94. method: "POST",
  95. data,
  96. });
  97. },
  98. stopTrace(traceId: string) {
  99. return request<void>(`/api/traces/${traceId}/stop`, {
  100. method: "POST",
  101. });
  102. },
  103. fetchPendingToolApproval(traceId: string) {
  104. return request<{ trace_id: string; batch: ToolApprovalBatchV1 | null }>(
  105. `/api/traces/${encodeURIComponent(traceId)}/tool-approvals/pending`,
  106. );
  107. },
  108. decideToolApproval(
  109. traceId: string,
  110. batchId: string,
  111. decisions: ToolApprovalDecisionInput[],
  112. ) {
  113. return request<{ trace_id: string; status: string; message: string }>(
  114. `/api/traces/${encodeURIComponent(traceId)}/tool-approvals/${encodeURIComponent(batchId)}`,
  115. {
  116. method: "POST",
  117. data: { decisions },
  118. },
  119. );
  120. },
  121. compactTrace(traceId: string) {
  122. return request<{ previous_count: number; new_count: number; message: string }>(`/api/traces/${traceId}/compact`, {
  123. method: "POST",
  124. });
  125. },
  126. reflectTrace(traceId: string, data: { focus?: string | null } = {}) {
  127. return request<{ trace_id: string; reflection: string }>(`/api/traces/${traceId}/reflect`, {
  128. method: "POST",
  129. data,
  130. });
  131. },
  132. getExperiences() {
  133. return request<string>("/api/experiences");
  134. },
  135. fetchExamples() {
  136. return request<{ projects: Array<{ name: string; path: string; has_prompt: boolean }> }>("/api/examples");
  137. },
  138. fetchExamplePrompt(projectName: string) {
  139. return request<{
  140. system_prompt: string;
  141. user_prompt: string;
  142. model?: string;
  143. temperature?: number;
  144. }>(`/api/examples/${projectName}/prompt`);
  145. },
  146. uploadTraces(file: File) {
  147. const formData = new FormData();
  148. formData.append("file", file);
  149. return request<{
  150. success: boolean;
  151. message: string;
  152. imported_traces: string[];
  153. failed_traces: Array<{ trace_id: string; reason: string }>;
  154. }>("/api/traces/upload", {
  155. method: "POST",
  156. data: formData,
  157. });
  158. },
  159. fetchKnowledgeLog(traceId: string) {
  160. return request<{ trace_id: string; entries: KnowledgeLogEntry[] }>(
  161. `/api/traces/${traceId}/knowledge_log`
  162. );
  163. },
  164. submitKnowledgeFeedback(
  165. traceId: string,
  166. data: { feedback_list: KnowledgeFeedbackListItem[] }
  167. ) {
  168. return request<{ status: string; updated: number }>(
  169. `/api/traces/${traceId}/knowledge_feedback`,
  170. { method: "POST", data }
  171. );
  172. },
  173. };